Skip to content

Commit df6e728

Browse files
fix ipc listener logic
1 parent 9c91b5f commit df6e728

3 files changed

Lines changed: 37 additions & 9 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ollieos",
3-
"version": "1.3.3",
3+
"version": "1.3.4",
44
"description": "",
55
"private": true,
66
"main": "server.js",

src/processes.ts

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2122
interface 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

Comments
 (0)