From d599be590dc2b64c18b31dd92a47881b1154652d Mon Sep 17 00:00:00 2001 From: Gustavo Henke Date: Sat, 22 Feb 2025 13:54:38 +1100 Subject: [PATCH] fix: don't throw when there are no commands --- src/completion-listener.spec.ts | 5 +++++ src/completion-listener.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/completion-listener.spec.ts b/src/completion-listener.spec.ts index 6e865195..605c5d58 100644 --- a/src/completion-listener.spec.ts +++ b/src/completion-listener.spec.ts @@ -32,6 +32,11 @@ const emitFakeCloseEvent = (command: FakeCommand, event?: Partial) = const flushPromises = () => new Promise((resolve) => setTimeout(resolve, 0)); describe('listen', () => { + it('resolves when there are no commands', async () => { + const result = createController().listen([]); + await expect(result).resolves.toHaveLength(0); + }); + it('completes only when commands emit a close event, returns close event', async () => { const abortCtrl = new AbortController(); const result = createController('all').listen(commands, abortCtrl.signal); diff --git a/src/completion-listener.ts b/src/completion-listener.ts index eea8cfe6..4d84e83d 100644 --- a/src/completion-listener.ts +++ b/src/completion-listener.ts @@ -93,6 +93,10 @@ export class CompletionListener { * Commands that didn't spawn are filtered out. */ listen(commands: Command[], abortSignal?: AbortSignal): Promise { + if (!commands.length) { + return Promise.resolve([]); + } + const abort = abortSignal && Rx.fromEvent(abortSignal, 'abort', { once: true }).pipe( @@ -112,6 +116,7 @@ export class CompletionListener { Rx.race(command.close, abort.pipe(filter(() => command.state === 'stopped'))) : command.close, ); + return Rx.lastValueFrom( Rx.combineLatest(closeStreams).pipe( filter(() => commands.every((command) => command.state !== 'started')),