diff --git a/packages/extension/src/iframe-manager.test.ts b/packages/extension/src/iframe-manager.test.ts index 45bb5b191..146c45799 100644 --- a/packages/extension/src/iframe-manager.test.ts +++ b/packages/extension/src/iframe-manager.test.ts @@ -129,7 +129,7 @@ describe('IframeManager', () => { expect(removeSpy).not.toHaveBeenCalled(); }); - it('warns of unresolved messages', async () => { + it('rejects unresolved messages', async () => { const id = 'foo'; const messageCount = 7; const awaitCount = 2; @@ -137,23 +137,10 @@ describe('IframeManager', () => { vi.mocked(snapsUtils.createWindow).mockImplementationOnce(vi.fn()); const manager = new IframeManager(); - vi.spyOn(manager, 'sendMessage').mockImplementationOnce(vi.fn()); const { port1, port2 } = new MessageChannel(); - - await manager.create({ id, getPort: makeGetPort(port1) }); - - const warnSpy = vi.spyOn(console, 'warn'); - - const messagePromises = Array(messageCount) - .fill(0) - .map(async (_, i) => - manager.sendMessage(id, { type: Command.Evaluate, data: `${i}+1` }), - ); - - // resolve the first `awaitCount` promises - for (let i = 0; i < awaitCount; i++) { + const postMessage = (i: number): void => { port2.postMessage({ done: false, value: { @@ -167,15 +154,29 @@ describe('IframeManager', () => { }, }, }); + }; + + await manager.create({ id, getPort: makeGetPort(port1) }); + + const messagePromises = Array(messageCount) + .fill(0) + .map(async (_, i) => + manager.sendMessage(id, { type: Command.Evaluate, data: `${i}+1` }), + ); + + // resolve the first `awaitCount` promises + for (let i = 0; i < awaitCount; i++) { + postMessage(i); await messagePromises[i]; } await manager.delete(id); - expect(warnSpy).toHaveBeenCalledTimes(messageCount - awaitCount); - // This test assumes messageIds begin at 1, not 0 - expect(warnSpy).toHaveBeenLastCalledWith( - `Unhandled orphaned message: ${id}-${messageCount}`, - ); + + // reject the rest of the promises + for (let i = awaitCount; i < messageCount; i++) { + postMessage(i); + await expect(messagePromises[i]).rejects.toThrow('Vat was deleted'); + } }); }); diff --git a/packages/extension/src/iframe-manager.ts b/packages/extension/src/iframe-manager.ts index abd994263..0adea2c18 100644 --- a/packages/extension/src/iframe-manager.ts +++ b/packages/extension/src/iframe-manager.ts @@ -98,9 +98,11 @@ export class IframeManager { } const closeP = vat.streams.return(); - // TODO: Handle orphaned messages - for (const [messageId] of vat.unresolvedMessages) { - console.warn(`Unhandled orphaned message: ${messageId}`); + + // Handle orphaned messages + for (const [messageId, promiseCallback] of vat.unresolvedMessages) { + promiseCallback?.reject(new Error('Vat was deleted')); + vat.unresolvedMessages.delete(messageId); } this.#vats.delete(id);