You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.8 KiB
73 lines
1.8 KiB
import { EventEmitter } from 'events';
|
|
import { AsyncResource } from 'async_hooks';
|
|
|
|
const kEventEmitter = Symbol('kEventEmitter');
|
|
const kAsyncResource = Symbol('kAsyncResource');
|
|
|
|
type EventEmitterOptions = typeof EventEmitter extends {
|
|
new (options?: infer T) : EventEmitter;
|
|
} ? T : never;
|
|
|
|
type AsyncResourceOptions = typeof AsyncResource extends {
|
|
new (name : string, options?: infer T) : AsyncResource;
|
|
} ? T : never;
|
|
|
|
type Options = EventEmitterOptions & AsyncResourceOptions & {
|
|
name?: string;
|
|
};
|
|
|
|
class EventEmitterReferencingAsyncResource extends AsyncResource {
|
|
[kEventEmitter] : EventEmitter;
|
|
|
|
constructor (ee: EventEmitter, type: string, options?: AsyncResourceOptions) {
|
|
super(type, options);
|
|
this[kEventEmitter] = ee;
|
|
}
|
|
|
|
get eventEmitter () : EventEmitter {
|
|
return this[kEventEmitter];
|
|
}
|
|
}
|
|
|
|
class EventEmitterAsyncResource extends EventEmitter {
|
|
[kAsyncResource] : EventEmitterReferencingAsyncResource;
|
|
|
|
constructor (options?: Options | string) {
|
|
let name;
|
|
if (typeof options === 'string') {
|
|
name = options;
|
|
options = undefined;
|
|
} else {
|
|
name = options?.name || new.target.name;
|
|
}
|
|
super(options);
|
|
|
|
this[kAsyncResource] =
|
|
new EventEmitterReferencingAsyncResource(this, name, options);
|
|
}
|
|
|
|
emit (event: string | symbol, ...args: any[]) : boolean {
|
|
return this.asyncResource.runInAsyncScope(
|
|
super.emit, this, event, ...args);
|
|
}
|
|
|
|
emitDestroy () : void {
|
|
this.asyncResource.emitDestroy();
|
|
}
|
|
|
|
asyncId () : number {
|
|
return this.asyncResource.asyncId();
|
|
}
|
|
|
|
triggerAsyncId () : number {
|
|
return this.asyncResource.triggerAsyncId();
|
|
}
|
|
|
|
get asyncResource () : EventEmitterReferencingAsyncResource {
|
|
return this[kAsyncResource];
|
|
}
|
|
|
|
static get EventEmitterAsyncResource () { return EventEmitterAsyncResource; }
|
|
}
|
|
|
|
export = EventEmitterAsyncResource;
|