Skip to content

Commit 484bc76

Browse files
committed
add method to disconnect process; auto disconnect; close #3
1 parent 1d05129 commit 484bc76

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

src/__test__/subProcessIPCLoopback.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export default class subProcessIPCLoopback {
33
private readonly originalProcessOn;
44
private subProcessListener?: NodeJS.MessageListener;
55
private mainProcessListener?: NodeJS.MessageListener;
6+
private destroyListener?: NodeJS.ExitListener;
67

78
constructor() {
89
this.originalProcessSend = process.send
@@ -27,8 +28,15 @@ export default class subProcessIPCLoopback {
2728
this.mainProcessListener(message, process.send)
2829
}
2930

30-
public on(event: 'message', listener: NodeJS.MessageListener): this {
31-
this.subProcessListener = listener
31+
public on(event: 'message' | 'close', listener: NodeJS.MessageListener | NodeJS.ExitListener): this {
32+
switch (event) {
33+
case "message":
34+
this.subProcessListener = listener as NodeJS.MessageListener
35+
break
36+
case 'close':
37+
this.destroyListener = listener as NodeJS.ExitListener
38+
break
39+
}
3240
return this
3341
}
3442

@@ -37,5 +45,7 @@ export default class subProcessIPCLoopback {
3745
process.on = this.originalProcessOn
3846
this.mainProcessListener = undefined
3947
this.subProcessListener = undefined
48+
if (this.destroyListener)
49+
this.destroyListener(0)
4050
}
4151
}

src/main.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {ChildProcess} from 'child_process'
22
import initChild from './init-child.js'
33
import IPOSMessaging, {iposMessagingMessage, iposMessagingType} from './messaging.js'
44
import intercept from './intercept.js'
5-
import {classes, deSerialize, SerializableType, SerializedType} from "./serialize";
5+
import {classes, deSerialize, SerializableType, SerializedType} from './serialize.js'
66

77
export default class IPOS {
88
private readonly fields: Map<string, any>
@@ -154,6 +154,9 @@ export default class IPOS {
154154
if (!process.send)
155155
throw new Error(`Process must have an ipc channel. Activate by passing "stdio: [<stdin>, <stdout>, <stderr>, 'ipc']" as an option.`)
156156
const messaging = new IPOSMessaging(process)
157+
process.on('close', () => {
158+
this.removeProcess(process)
159+
})
157160

158161
let registered = false, resolve: Function
159162
const promise: Promise<void> = new Promise(res => resolve = res)
@@ -173,6 +176,14 @@ export default class IPOS {
173176
return promise
174177
}
175178

179+
public removeProcess(process: ChildProcess): boolean {
180+
const messaging = this.processMessagingMap.get(process)
181+
if (!messaging) return false
182+
messaging.destroy()
183+
this.processMessagingMap.delete(process)
184+
return true
185+
}
186+
176187
private syncProcess(process: ChildProcess): Promise<void> {
177188
let resolve: Function
178189
const promise: Promise<void> = new Promise(res => resolve = res)

src/messaging.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,9 @@ export default class IPOSMessaging {
9292
listenForAll(callback: iposMessagingCallback) {
9393
this.listenForType('any', callback)
9494
}
95+
96+
destroy() {
97+
this.listeners.clear()
98+
this.nonIPOSListeners.clear()
99+
}
95100
}

0 commit comments

Comments
 (0)