diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml new file mode 100644 index 000000000..e2b429210 --- /dev/null +++ b/.github/workflows/smoke-test.yml @@ -0,0 +1,34 @@ +name: smoke-test + +on: + # Always run smoke tests upon a successful + # "ci" job completion on "main". + workflow_run: + workflows: ['ci'] + branches: [main] + types: [completed] + workflow_dispatch: + +jobs: + examples: + if: ${{ (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') || github.event_name == 'workflow_dispatch' }} + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Set up PNPM + uses: pnpm/action-setup@v2 + with: + version: 7.12 + + - name: Install dependencies + run: pnpm install + + - name: Test examples + run: ./config/scripts/smoke-test.sh diff --git a/.gitignore b/.gitignore index f8458255a..db26fa845 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,8 @@ stats.html msw-*.tgz .husky/_ .env -**/test-results \ No newline at end of file +**/test-results + +# Smoke test temporary files. +/package.json.copy +/examples \ No newline at end of file diff --git a/config/scripts/smoke-test.sh b/config/scripts/smoke-test.sh new file mode 100755 index 000000000..f3b2650ab --- /dev/null +++ b/config/scripts/smoke-test.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -e + +COMMIT_HASH=$(git rev-parse HEAD) +MSW_VERSION="0.0.0-$COMMIT_HASH" +echo "Latest commit: $COMMIT_HASH" +echo "In-progress MSW version: $MSW_VERSION" + +PKG_JSON_COPY="package.json.copy" +cp package.json $PKG_JSON_COPY + +pnpm version $MSW_VERSION --no-git-tag-version --allow-same-version + +echo "" +echo "Packing MSW..." +pnpm pack + +EXAMPLES_REPO=https://github.com/mswjs/examples.git +EXAMPLES_DIR=./examples +echo "" +echo "Cloning the examples from "$EXAMPLES_REPO"..." + +if [[ -d "$EXAMPLES_DIR" ]]; then + echo "Examples already cloned, skipping..." +else + git clone $EXAMPLES_REPO $EXAMPLES_DIR +fi + +echo "" +echo "Installing dependencies..." +cd $EXAMPLES_DIR +pnpm install + +echo "" +echo "Linking MSW..." +pnpm add msw --filter="with-*" file:../../../msw-$MSW_VERSION.tgz +pnpm ls msw + +echo "" +echo "Running tests..." +CI=1 pnpm test ; (cd ../ && mv $PKG_JSON_COPY ./package.json) diff --git a/src/browser/setupWorker/start/createRequestListener.ts b/src/browser/setupWorker/start/createRequestListener.ts index 415094b36..494f31fa1 100644 --- a/src/browser/setupWorker/start/createRequestListener.ts +++ b/src/browser/setupWorker/start/createRequestListener.ts @@ -54,21 +54,31 @@ export const createRequestListener = ( * Check that the browser supports that before sending it to the worker. */ if (context.supports.readableStreamTransfer) { - const responseStream = response.body + const responseStreamOrNull = response.body + messageChannel.postMessage( 'MOCK_RESPONSE', { ...responseInit, - body: responseStream, + body: responseStreamOrNull, }, - responseStream ? [responseStream] : undefined, + responseStreamOrNull ? [responseStreamOrNull] : undefined, ) } else { - // As a fallback, send the response body buffer to the worker. - const responseBuffer = await responseClone.arrayBuffer() + /** + * @note If we are here, this means the current environment doesn't + * support "ReadableStream" as transferable. In that case, + * attempt to read the non-empty response body as ArrayBuffer, if it's not empty. + * @see https://github.com/mswjs/msw/issues/1827 + */ + const responseBufferOrNull = + response.body === null + ? null + : await responseClone.arrayBuffer() + messageChannel.postMessage('MOCK_RESPONSE', { ...responseInit, - body: responseBuffer, + body: responseBufferOrNull, }) }