diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index c767d36a7976a..4e3a0c3f3c5c9 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -680,6 +680,8 @@ export class ChannelClient implements IChannelClient, IDisposable { const emitter = new Emitter({ onWillAddFirstListener: () => { + const handler: IHandler = (res: IRawResponse) => emitter.fire((res as IRawEventFireResponse).data); + this.handlers.set(id, handler); const doRequest = () => { this.activeRequests.add(emitter); this.sendRequest(request); @@ -706,9 +708,6 @@ export class ChannelClient implements IChannelClient, IDisposable { } }); - const handler: IHandler = (res: IRawResponse) => emitter.fire((res as IRawEventFireResponse).data); - this.handlers.set(id, handler); - return emitter.event; } diff --git a/src/vs/base/parts/ipc/test/common/ipc.test.ts b/src/vs/base/parts/ipc/test/common/ipc.test.ts index 47a88f12ab13e..90140a90c735a 100644 --- a/src/vs/base/parts/ipc/test/common/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/common/ipc.test.ts @@ -320,6 +320,27 @@ suite('Base IPC', function () { assert.deepStrictEqual(messages, ['hello', 'world']); }); + test('listen to events (resubscribe)', async function () { + const onPong = ipcService.onPong; + const messages: string[] = []; + + const disposable1 = onPong(msg => messages.push(msg)); + await timeout(0); + assert.deepStrictEqual(messages, []); + service.ping('hello'); + await timeout(0); + assert.deepStrictEqual(messages, ['hello']); + disposable1.dispose(); + + const disposable2 = onPong(msg => (messages as string[]).push(msg)); + await timeout(0); + assert.deepStrictEqual(messages, ['hello']); + service.ping('world'); + await timeout(0); + assert.deepStrictEqual(messages, ['hello', 'world']); + disposable2.dispose(); + }); + test('buffers in arrays', async function () { const r = await ipcService.buffersLength([VSBuffer.alloc(2), VSBuffer.alloc(3)]); return assert.strictEqual(r, 5); @@ -443,6 +464,27 @@ suite('Base IPC', function () { assert.deepStrictEqual(messages, ['hello', 'world']); }); + test('listen to events (resubscribe)', async function () { + const onPong = ipcService.onPong; + const messages: string[] = []; + + const disposable1 = onPong(msg => messages.push(msg)); + await timeout(0); + assert.deepStrictEqual(messages, []); + service.ping('hello'); + await timeout(0); + assert.deepStrictEqual(messages, ['hello']); + disposable1.dispose(); + + const disposable2 = onPong(msg => (messages as string[]).push(msg)); + await timeout(0); + assert.deepStrictEqual(messages, ['hello']); + service.ping('world'); + await timeout(0); + assert.deepStrictEqual(messages, ['hello', 'world']); + disposable2.dispose(); + }); + test('marshalling uri', async function () { const uri = URI.file('foobar'); const r = await ipcService.marshall(uri);