1616 */
1717import { EventEmitter } from 'events' ;
1818
19- import type { EventMap , TypedEmitter } from './utils/TypedEmitter.js' ;
19+ import { EventKey , EventListener , EventMap , TypedEmitter } from './utils/TypedEmitter.js' ;
20+
21+ /**
22+ * @internal
23+ */
24+ interface PromisifyEmitter < EM extends EventMap > {
25+ on < K extends EventKey < EM > > ( eventName : K , fn : EM [ K ] ) : void ;
26+ }
2027
2128/**
2229 * @internal
2330 */
2431type PromisifyFunc < T , EM extends EventMap > = (
25- emitter : StreamablePromise < T , EM > ,
32+ emitter : PromisifyEmitter < EM > ,
2633 resolve : ( result : T ) => void ,
2734 reject : ( err : Error ) => void
2835) => void ;
@@ -38,26 +45,41 @@ export class StreamablePromise<T, EM extends EventMap>
3845 implements Promise < T >
3946{
4047 private _promise : Promise < T > | null = null ;
41- private _promiseifyFn : PromisifyFunc < T , EM > ;
48+ private _promiseOns : [ string | symbol , EventListener < any [ ] > ] [ ] ;
4249
4350 /**
4451 * @internal
4552 */
4653 constructor ( promisefyFn : PromisifyFunc < T , EM > ) {
4754 super ( ) ;
4855
49- this . _promiseifyFn = promisefyFn ;
56+ this . _promiseOns = [ ] ;
57+ this . _promise = new Promise ( ( resolve , reject ) => {
58+ promisefyFn (
59+ {
60+ on : < T extends EventKey < EM > > ( eventName : T , listener : EM [ T ] ) => {
61+ this . _promiseOns . push ( [ eventName , listener ] ) ;
62+ void super . on ( eventName , listener ) ;
63+ } ,
64+ } ,
65+ resolve ,
66+ reject
67+ ) ;
68+ } ) ;
5069 }
5170
5271 private get promise ( ) : Promise < T > {
5372 if ( ! this . _promise ) {
54- this . _promise = new Promise ( ( resolve , reject ) =>
55- this . _promiseifyFn ( this , resolve , reject )
56- ) ;
73+ throw new Error ( 'Cannot await a promise that is already registered for events' ) ;
5774 }
5875 return this . _promise ;
5976 }
6077
78+ private _depromisify ( ) {
79+ this . _promiseOns . forEach ( ( e ) => void this . off ( ...( e as [ never , never ] ) ) ) ;
80+ this . _promise = null ;
81+ }
82+
6183 then < TResult1 = T , TResult2 = never > (
6284 onfulfilled ?: ( ( value : T ) => TResult1 | PromiseLike < TResult1 > ) | undefined | null ,
6385 onrejected ?: ( ( reason : any ) => TResult2 | PromiseLike < TResult2 > ) | undefined | null
@@ -75,6 +97,16 @@ export class StreamablePromise<T, EM extends EventMap>
7597 return this . promise . finally ( onfinally ) ;
7698 }
7799
100+ override addListener < T extends EventKey < EM > > ( eventName : T , listener : EM [ T ] ) : this {
101+ this . _depromisify ( ) ;
102+ return super . on ( eventName , listener ) ;
103+ }
104+
105+ override on < T extends EventKey < EM > > ( eventName : T , listener : EM [ T ] ) : this {
106+ this . _depromisify ( ) ;
107+ return super . on ( eventName , listener ) ;
108+ }
109+
78110 /**
79111 * @internal
80112 */
0 commit comments