basant307/AI_Governance_Project
048
1import { EventMap, Listener } from 'strict-event-emitter'2import { Interceptor, ExtractEventNames } from './Interceptor'3 4export interface BatchInterceptorOptions<5 InterceptorList extends ReadonlyArray<Interceptor<any>>6> {7 name: string8 interceptors: InterceptorList9}10 11export type ExtractEventMapType<12 InterceptorList extends ReadonlyArray<Interceptor<any>>13> = InterceptorList extends ReadonlyArray<infer InterceptorType>14 ? InterceptorType extends Interceptor<infer EventMap>15 ? EventMap16 : never17 : never18 19/**20 * A batch interceptor that exposes a single interface21 * to apply and operate with multiple interceptors at once.22 */23export class BatchInterceptor<24 InterceptorList extends ReadonlyArray<Interceptor<any>>,25 Events extends EventMap = ExtractEventMapType<InterceptorList>26> extends Interceptor<Events> {27 static symbol: symbol28 29 private interceptors: InterceptorList30 31 constructor(options: BatchInterceptorOptions<InterceptorList>) {32 BatchInterceptor.symbol = Symbol(options.name)33 super(BatchInterceptor.symbol)34 this.interceptors = options.interceptors35 }36 37 protected setup() {38 const logger = this.logger.extend('setup')39 40 logger.info('applying all %d interceptors...', this.interceptors.length)41 42 for (const interceptor of this.interceptors) {43 logger.info('applying "%s" interceptor...', interceptor.constructor.name)44 interceptor.apply()45 46 logger.info('adding interceptor dispose subscription')47 this.subscriptions.push(() => interceptor.dispose())48 }49 }50 51 public on<EventName extends ExtractEventNames<Events>>(52 event: EventName,53 listener: Listener<Events[EventName]>54 ): this {55 // Instead of adding a listener to the batch interceptor,56 // propagate the listener to each of the individual interceptors.57 for (const interceptor of this.interceptors) {58 interceptor.on(event, listener)59 }60 61 return this62 }63 64 public once<EventName extends ExtractEventNames<Events>>(65 event: EventName,66 listener: Listener<Events[EventName]>67 ): this {68 for (const interceptor of this.interceptors) {69 interceptor.once(event, listener)70 }71 72 return this73 }74 75 public off<EventName extends ExtractEventNames<Events>>(76 event: EventName,77 listener: Listener<Events[EventName]>78 ): this {79 for (const interceptor of this.interceptors) {80 interceptor.off(event, listener)81 }82 83 return this84 }85 86 public removeAllListeners<EventName extends ExtractEventNames<Events>>(87 event?: EventName | undefined88 ): this {89 for (const interceptors of this.interceptors) {90 interceptors.removeAllListeners(event)91 }92 93 return this94 }95}96 