dispatcher.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict'
  2. const EventEmitter = require('node:events')
  3. const WrapHandler = require('../handler/wrap-handler')
  4. const wrapInterceptor = (dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler))
  5. class Dispatcher extends EventEmitter {
  6. dispatch () {
  7. throw new Error('not implemented')
  8. }
  9. close () {
  10. throw new Error('not implemented')
  11. }
  12. destroy () {
  13. throw new Error('not implemented')
  14. }
  15. compose (...args) {
  16. // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...
  17. const interceptors = Array.isArray(args[0]) ? args[0] : args
  18. let dispatch = this.dispatch.bind(this)
  19. for (const interceptor of interceptors) {
  20. if (interceptor == null) {
  21. continue
  22. }
  23. if (typeof interceptor !== 'function') {
  24. throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)
  25. }
  26. dispatch = interceptor(dispatch)
  27. dispatch = wrapInterceptor(dispatch)
  28. if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {
  29. throw new TypeError('invalid interceptor')
  30. }
  31. }
  32. return new Proxy(this, {
  33. get: (target, key) => key === 'dispatch' ? dispatch : target[key]
  34. })
  35. }
  36. }
  37. module.exports = Dispatcher