Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
dispatcher.js66 linesDownload Raw Back to dispatcher
1'use strict'
2const EventEmitter = require('node:events')
3
4class Dispatcher extends EventEmitter {
5  dispatch () {
6    throw new Error('not implemented')
7  }
8
9  close () {
10    throw new Error('not implemented')
11  }
12
13  destroy () {
14    throw new Error('not implemented')
15  }
16
17  compose (...args) {
18    // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...
19    const interceptors = Array.isArray(args[0]) ? args[0] : args
20    let dispatch = this.dispatch.bind(this)
21
22    for (const interceptor of interceptors) {
23      if (interceptor == null) {
24        continue
25      }
26
27      if (typeof interceptor !== 'function') {
28        throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)
29      }
30
31      dispatch = interceptor(dispatch)
32
33      if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {
34        throw new TypeError('invalid interceptor')
35      }
36    }
37
38    return new ComposedDispatcher(this, dispatch)
39  }
40}
41
42class ComposedDispatcher extends Dispatcher {
43  #dispatcher = null
44  #dispatch = null
45
46  constructor (dispatcher, dispatch) {
47    super()
48    this.#dispatcher = dispatcher
49    this.#dispatch = dispatch
50  }
51
52  dispatch (...args) {
53    this.#dispatch(...args)
54  }
55
56  close (...args) {
57    return this.#dispatcher.close(...args)
58  }
59
60  destroy (...args) {
61    return this.#dispatcher.destroy(...args)
62  }
63}
64
65module.exports = Dispatcher
66 
codekingpro/portable-devtools · Team Ai