@@ -19,6 +19,18 @@ const CONSTANTS = {
1919
2020export { emit , CONSTANTS } ;
2121
22+ class EventListener {
23+ constructor ( type , listener , callkeep ) {
24+ this . _type = type ;
25+ this . _listener = listener ;
26+ this . _callkeep = callkeep ;
27+ }
28+
29+ remove = ( ) => {
30+ this . _callkeep . removeEventListener ( this . _type , this . _listener ) ;
31+ } ;
32+ }
33+
2234class RNCallKeep {
2335 constructor ( ) {
2436 this . _callkeepEventHandlers = new Map ( ) ;
@@ -27,17 +39,32 @@ class RNCallKeep {
2739 addEventListener = ( type , handler ) => {
2840 const listener = listeners [ type ] ( handler ) ;
2941
30- this . _callkeepEventHandlers . set ( type , listener ) ;
42+ const listenerSet = this . _callkeepEventHandlers . get ( type ) ?? new Set ( ) ;
43+ listenerSet . add ( listener ) ;
44+
45+ this . _callkeepEventHandlers . set ( type , listenerSet ) ;
46+
47+ return new EventListener ( type , listener , this ) ;
3148 } ;
3249
33- removeEventListener = ( type ) => {
34- const listener = this . _callkeepEventHandlers . get ( type ) ;
35- if ( ! listener ) {
50+ removeEventListener = ( type , listener = undefined ) => {
51+ const listenerSet = this . _callkeepEventHandlers . get ( type ) ;
52+ if ( ! listenerSet ) {
3653 return ;
3754 }
3855
39- listener . remove ( ) ;
40- this . _callkeepEventHandlers . delete ( type ) ;
56+ if ( listener ) {
57+ listenerSet . delete ( listener ) ;
58+ listener . remove ( ) ;
59+ if ( listenerSet . size <= 0 ) {
60+ this . _callkeepEventHandlers . delete ( type ) ;
61+ }
62+ } else {
63+ listenerSet . forEach ( ( listener ) => {
64+ listener . remove ( ) ;
65+ } ) ;
66+ this . _callkeepEventHandlers . delete ( type ) ;
67+ }
4168 } ;
4269
4370 setup = async ( options ) => {
0 commit comments