1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 'use strict'
- const EventEmitter = require('node:events')
- class Dispatcher extends EventEmitter {
- dispatch () {
- throw new Error('not implemented')
- }
- close () {
- throw new Error('not implemented')
- }
- destroy () {
- throw new Error('not implemented')
- }
- compose (...args) {
- // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...
- const interceptors = Array.isArray(args[0]) ? args[0] : args
- let dispatch = this.dispatch.bind(this)
- for (const interceptor of interceptors) {
- if (interceptor == null) {
- continue
- }
- if (typeof interceptor !== 'function') {
- throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)
- }
- dispatch = interceptor(dispatch)
- if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {
- throw new TypeError('invalid interceptor')
- }
- }
- return new ComposedDispatcher(this, dispatch)
- }
- }
- class ComposedDispatcher extends Dispatcher {
- #dispatcher = null
- #dispatch = null
- constructor (dispatcher, dispatch) {
- super()
- this.#dispatcher = dispatcher
- this.#dispatch = dispatch
- }
- dispatch (...args) {
- this.#dispatch(...args)
- }
- close (...args) {
- return this.#dispatcher.close(...args)
- }
- destroy (...args) {
- return this.#dispatcher.destroy(...args)
- }
- }
- module.exports = Dispatcher
|