11'use strict' ;
22
3- class AsyncEventEmitter {
3+ class AsyncEmitter {
44 constructor ( ) {
55 this . events = new Map ( ) ;
66 this . wrappers = new Map ( ) ;
@@ -16,12 +16,18 @@ class AsyncEventEmitter {
1616 }
1717
1818 once ( name , fn ) {
19+ if ( fn === undefined ) {
20+ return new Promise ( resolve => {
21+ this . once ( name , resolve ) ;
22+ } ) ;
23+ }
1924 const wrapper = ( ...args ) => {
2025 this . remove ( name , wrapper ) ;
2126 return fn ( ...args ) ;
2227 } ;
2328 this . wrappers . set ( fn , wrapper ) ;
2429 this . on ( name , wrapper ) ;
30+ return undefined ;
2531 }
2632
2733 async emit ( name , ...args ) {
@@ -33,17 +39,31 @@ class AsyncEventEmitter {
3339 }
3440
3541 remove ( name , fn ) {
36- const event = this . events . get ( name ) ;
42+ const { events, wrappers } = this ;
43+ const event = events . get ( name ) ;
3744 if ( ! event ) return ;
3845 if ( event . has ( fn ) ) event . delete ( fn ) ;
39- const wrapper = this . wrappers . get ( fn ) ;
40- if ( wrapper ) event . delete ( wrapper ) ;
41- if ( event . size === 0 ) this . events . delete ( name ) ;
46+ const wrapper = wrappers . get ( fn ) ;
47+ if ( wrapper ) {
48+ wrappers . delete ( fn ) ;
49+ event . delete ( wrapper ) ;
50+ }
51+ if ( event . size === 0 ) events . delete ( name ) ;
4252 }
4353
4454 clear ( name ) {
45- if ( name ) this . events . delete ( name ) ;
46- else this . events . clear ( ) ;
55+ const { events, wrappers } = this ;
56+ if ( ! name ) {
57+ events . clear ( ) ;
58+ wrappers . clear ( ) ;
59+ return ;
60+ }
61+ const event = events . get ( name ) ;
62+ if ( ! event ) return ;
63+ for ( const [ fn , wrapper ] of wrappers . entries ( ) ) {
64+ if ( event . has ( wrapper ) ) wrappers . delete ( fn ) ;
65+ }
66+ events . delete ( name ) ;
4767 }
4868
4969 count ( name ) {
@@ -63,7 +83,7 @@ class AsyncEventEmitter {
6383
6484// Usage
6585
66- const ee = new AsyncEventEmitter ( ) ;
86+ const ee = new AsyncEmitter ( ) ;
6787
6888( async ( ) => {
6989
0 commit comments