From 670dda7b97f6430418d6faf09698f9a1bca5cf07 Mon Sep 17 00:00:00 2001 From: Igor Bari Date: Mon, 7 Nov 2022 13:22:42 +0100 Subject: [PATCH] feat: do not interfere with shared workers (#1448) * feat: add support for shared workers * test: touch-up shared worker test * test: rename the shared worker test Co-authored-by: Artem Zakharchenko --- src/mockServiceWorker.js | 2 +- .../shared-worker/shared-worker.mocks.ts | 5 +++ .../shared-worker/shared-worker.test.ts | 33 +++++++++++++++++++ .../scenarios/shared-worker/worker.js | 7 ++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts create mode 100644 test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.test.ts create mode 100644 test/msw-api/setup-worker/scenarios/shared-worker/worker.js diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index 7e32315ca..dabd1abe0 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -174,7 +174,7 @@ async function handleRequest(event, requestId) { async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) - if (client.frameType === 'top-level') { + if (client?.frameType === 'top-level') { return client } diff --git a/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts b/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts new file mode 100644 index 000000000..3294691f7 --- /dev/null +++ b/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.mocks.ts @@ -0,0 +1,5 @@ +import { setupWorker } from 'msw' + +const worker = setupWorker() + +worker.start() diff --git a/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.test.ts b/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.test.ts new file mode 100644 index 000000000..8ba69997a --- /dev/null +++ b/test/msw-api/setup-worker/scenarios/shared-worker/shared-worker.test.ts @@ -0,0 +1,33 @@ +import * as path from 'path' +import { pageWith } from 'page-with' +import { waitFor } from '../../../../support/waitFor' + +function createRuntime() { + return pageWith({ + example: path.resolve(__dirname, 'shared-worker.mocks.ts'), + contentBase: path.resolve(__dirname), + }) +} + +test('does not interfere with a shared worker', async () => { + const { page, consoleSpy } = await createRuntime() + + await page.evaluate(() => { + const worker = new SharedWorker('/worker.js') + + worker.addEventListener('error', () => + console.error('There is an error with worker'), + ) + + worker.port.onmessage = (event) => { + console.log(event.data) + } + + worker.port.postMessage('john') + }) + + await waitFor(() => { + expect(consoleSpy.get('error')).toBeUndefined() + expect(consoleSpy.get('log')).toContain('hello, john') + }) +}) diff --git a/test/msw-api/setup-worker/scenarios/shared-worker/worker.js b/test/msw-api/setup-worker/scenarios/shared-worker/worker.js new file mode 100644 index 000000000..79f033ab4 --- /dev/null +++ b/test/msw-api/setup-worker/scenarios/shared-worker/worker.js @@ -0,0 +1,7 @@ +onconnect = (event) => { + const port = event.ports[0] + + port.onmessage = (event) => { + port.postMessage(`hello, ${event.data}`) + } +}