Procházet zdrojové kódy

fix(subprocess): await control endpoint closure during disposal

Tianyi Cui před 6 dny
rodič
revize
562e7f364e

+ 4 - 1
packages/subprocess/subprocess-local/src/index.ts

@@ -113,7 +113,10 @@ export class LocalSubprocessRuntime extends SubprocessRuntime {
       pending.push(terminal.terminate().then(() => { this.terminals.delete(terminal) }))
     }
     const outcomes = await Promise.allSettled(pending)
-    for (const control of this.controlChannels) control.destroy()
+    await Promise.all([...this.controlChannels].map(control => new Promise<void>((resolveClose) => {
+      control.once('close', () => { resolveClose() })
+      control.destroy()
+    })))
     this.controlChannels.clear()
     const failures: unknown[] = []
     for (const outcome of outcomes) {

+ 1 - 0
packages/subprocess/subprocess-local/tests/control.spec.ts

@@ -46,6 +46,7 @@ describe('managed subprocess control pipe', () => {
     expect(await handle.waitForExit(AbortSignal.timeout(10_000))).toBe(true)
     await ctx.fiber.dispose()
     expect(channel.destroyed).toBe(true)
+    expect(channel.closed).toBe(true)
   }, 15_000)
 
   it('closes the caller endpoint when service disposal terminates an active program', async () => {