@@ -15,7 +15,8 @@ interface IPCChannel {
1515 initiator_to_peer_queue : IPCMessage [ ] ;
1616 peer_to_initiator_queue : IPCMessage [ ] ;
1717
18- listeners : Set < ( msg : IPCMessage ) => void > ;
18+ // pid -> set of listeners
19+ listeners : Map < number , Set < ( msg : IPCMessage ) => void > > ;
1920}
2021
2122interface IPCService {
@@ -99,7 +100,7 @@ export class IPCManager {
99100 initiator_to_peer_queue : [ ] ,
100101 peer_to_initiator_queue : [ ] ,
101102
102- listeners : new Set ( ) ,
103+ listeners : new Map ( ) ,
103104 } ) ;
104105
105106 // notify service of new connection
@@ -123,7 +124,30 @@ export class IPCManager {
123124 return false ;
124125 }
125126
126- channel . listeners . add ( listener ) ;
127+ if ( ! channel . listeners . has ( listening_pid ) ) {
128+ channel . listeners . set ( listening_pid , new Set ( ) ) ;
129+ }
130+
131+ channel . listeners . get ( listening_pid ) ! . add ( listener ) ;
132+ return true ;
133+ }
134+
135+ channel_unlisten ( channel_id : number , listening_pid : number , listener : ( msg : IPCMessage ) => void ) : boolean {
136+ const channel = this . _channels . get ( channel_id ) ;
137+ if ( ! channel ) {
138+ return false ;
139+ }
140+
141+ if ( channel . initiator !== listening_pid && channel . peer !== listening_pid ) {
142+ return false ;
143+ }
144+
145+ const listeners = channel . listeners . get ( listening_pid ) ;
146+ if ( ! listeners ) {
147+ return false ;
148+ }
149+
150+ listeners . delete ( listener ) ;
127151 return true ;
128152 }
129153
@@ -154,9 +178,13 @@ export class IPCManager {
154178 return false ;
155179 }
156180
157- // notify listeners
158- for ( const listener of channel . listeners ) {
159- listener ( msg ) ;
181+ // notify listeners on the receiving end
182+ const to_pid = msg . to ;
183+ const listeners = channel . listeners . get ( to_pid ) ;
184+ if ( listeners ) {
185+ for ( const listener of listeners ) {
186+ listener ( msg ) ;
187+ }
160188 }
161189
162190 return true ;
0 commit comments