msw 2.3.0-ws.rc-6 → 2.3.0-ws.rc-7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +3 -9
  2. package/lib/browser/index.js +160 -64
  3. package/lib/browser/index.js.map +1 -1
  4. package/lib/browser/index.mjs +160 -64
  5. package/lib/browser/index.mjs.map +1 -1
  6. package/lib/core/handlers/WebSocketHandler.js +1 -2
  7. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  8. package/lib/core/handlers/WebSocketHandler.mjs +1 -2
  9. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  10. package/lib/core/utils/internal/Disposable.d.mts +2 -2
  11. package/lib/core/utils/internal/Disposable.d.ts +2 -2
  12. package/lib/core/utils/internal/Disposable.js +5 -2
  13. package/lib/core/utils/internal/Disposable.js.map +1 -1
  14. package/lib/core/utils/internal/Disposable.mjs +5 -2
  15. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  16. package/lib/core/utils/internal/devUtils.d.mts +10 -1
  17. package/lib/core/utils/internal/devUtils.d.ts +10 -1
  18. package/lib/core/utils/internal/devUtils.js +7 -0
  19. package/lib/core/utils/internal/devUtils.js.map +1 -1
  20. package/lib/core/utils/internal/devUtils.mjs +7 -0
  21. package/lib/core/utils/internal/devUtils.mjs.map +1 -1
  22. package/lib/core/utils/matching/normalizePath.d.mts +1 -0
  23. package/lib/core/utils/matching/normalizePath.d.ts +1 -0
  24. package/lib/core/utils/matching/normalizePath.js.map +1 -1
  25. package/lib/core/utils/matching/normalizePath.mjs.map +1 -1
  26. package/lib/core/utils/request/onUnhandledRequest.js +3 -3
  27. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  28. package/lib/core/utils/request/onUnhandledRequest.mjs +4 -4
  29. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  30. package/lib/core/utils/url/cleanUrl.d.mts +2 -1
  31. package/lib/core/utils/url/cleanUrl.d.ts +2 -1
  32. package/lib/core/utils/url/cleanUrl.js +3 -0
  33. package/lib/core/utils/url/cleanUrl.js.map +1 -1
  34. package/lib/core/utils/url/cleanUrl.mjs +3 -0
  35. package/lib/core/utils/url/cleanUrl.mjs.map +1 -1
  36. package/lib/core/ws/WebSocketClientManager.js.map +1 -1
  37. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -1
  38. package/lib/iife/index.js +204 -79
  39. package/lib/iife/index.js.map +1 -1
  40. package/lib/mockServiceWorker.js +1 -1
  41. package/lib/native/index.js +5 -0
  42. package/lib/native/index.js.map +1 -1
  43. package/lib/native/index.mjs +6 -1
  44. package/lib/native/index.mjs.map +1 -1
  45. package/lib/node/index.js +5 -0
  46. package/lib/node/index.js.map +1 -1
  47. package/lib/node/index.mjs +6 -1
  48. package/lib/node/index.mjs.map +1 -1
  49. package/package.json +17 -5
  50. package/src/browser/setupWorker/start/createStartHandler.ts +6 -0
  51. package/src/core/handlers/WebSocketHandler.ts +1 -2
  52. package/src/core/utils/internal/Disposable.ts +6 -3
  53. package/src/core/utils/internal/devUtils.test.ts +21 -0
  54. package/src/core/utils/internal/devUtils.ts +13 -0
  55. package/src/core/utils/matching/matchRequestUrl.test.ts +11 -0
  56. package/src/core/utils/matching/normalizePath.test.ts +7 -1
  57. package/src/core/utils/matching/normalizePath.ts +1 -0
  58. package/src/core/utils/request/onUnhandledRequest.test.ts +30 -4
  59. package/src/core/utils/request/onUnhandledRequest.ts +4 -4
  60. package/src/core/utils/url/cleanUrl.test.ts +8 -3
  61. package/src/core/utils/url/cleanUrl.ts +9 -1
  62. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +3 -3
  63. package/src/core/utils/url/getAbsoluteUrl.test.ts +5 -5
  64. package/src/core/utils/url/isAbsoluteUrl.test.ts +7 -7
  65. package/src/core/ws/WebSocketClientManager.ts +1 -2
  66. package/src/node/SetupServerCommonApi.ts +7 -1
@@ -97,6 +97,7 @@ function isNodeProcess() {
97
97
 
98
98
  // src/browser/setupWorker/start/createStartHandler.ts
99
99
  import { devUtils as devUtils7 } from '../core/utils/internal/devUtils.mjs';
100
+ import { MSW_WEBSOCKET_CLIENTS_KEY } from '../core/ws/WebSocketClientManager.mjs';
100
101
 
101
102
  // node_modules/.pnpm/@open-draft+until@2.1.0/node_modules/@open-draft/until/lib/index.mjs
102
103
  var until = async (promise) => {
@@ -370,7 +371,7 @@ You can also automate this process and make the worker script update automatical
370
371
  }
371
372
  }
372
373
 
373
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-UJZOJSMP.mjs
374
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
374
375
  var encoder = new TextEncoder();
375
376
  function encodeBuffer(text) {
376
377
  return encoder.encode(text);
@@ -385,6 +386,17 @@ function toArrayBuffer(array) {
385
386
  array.byteOffset + array.byteLength
386
387
  );
387
388
  }
389
+
390
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OMISYKWR.mjs
391
+ var IS_PATCHED_MODULE = Symbol("isPatchedModule");
392
+ function isPropertyAccessible(obj, key) {
393
+ try {
394
+ obj[key];
395
+ return true;
396
+ } catch (e) {
397
+ return false;
398
+ }
399
+ }
388
400
  var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
389
401
  101,
390
402
  103,
@@ -395,9 +407,27 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
395
407
  function isResponseWithoutBody(status) {
396
408
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
397
409
  }
398
-
399
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-HAGW22AN.mjs
400
- var IS_PATCHED_MODULE = Symbol("isPatchedModule");
410
+ function createServerErrorResponse(body) {
411
+ return new Response(
412
+ JSON.stringify(
413
+ body instanceof Error ? {
414
+ name: body.name,
415
+ message: body.message,
416
+ stack: body.stack
417
+ } : body
418
+ ),
419
+ {
420
+ status: 500,
421
+ statusText: "Unhandled Exception",
422
+ headers: {
423
+ "Content-Type": "application/json"
424
+ }
425
+ }
426
+ );
427
+ }
428
+ function isResponseError(response) {
429
+ return isPropertyAccessible(response, "type") && response.type === "error";
430
+ }
401
431
 
402
432
  // node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
403
433
  var __defProp = Object.defineProperty;
@@ -836,7 +866,7 @@ var _Emitter = class {
836
866
  var Emitter = _Emitter;
837
867
  Emitter.defaultMaxListeners = 10;
838
868
 
839
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
869
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
840
870
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
841
871
  function getGlobalSymbol(symbol) {
842
872
  return (
@@ -984,7 +1014,7 @@ function createRequestId() {
984
1014
  return Math.random().toString(16).slice(2);
985
1015
  }
986
1016
 
987
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1017
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
988
1018
  var BatchInterceptor = class extends Interceptor {
989
1019
  constructor(options) {
990
1020
  BatchInterceptor.symbol = Symbol(options.name);
@@ -1120,6 +1150,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
1120
1150
  context.workerChannel.send("CLIENT_CLOSED");
1121
1151
  }
1122
1152
  window.clearInterval(context.keepAliveInterval);
1153
+ localStorage.removeItem(MSW_WEBSOCKET_CLIENTS_KEY);
1123
1154
  });
1124
1155
  await checkWorkerIntegrity(context).catch((error2) => {
1125
1156
  devUtils7.error(
@@ -1158,7 +1189,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
1158
1189
 
1159
1190
  // src/browser/setupWorker/stop/createStop.ts
1160
1191
  import { devUtils as devUtils9 } from '../core/utils/internal/devUtils.mjs';
1161
- import { MSW_WEBSOCKET_CLIENTS_KEY } from '../core/ws/WebSocketClientManager.mjs';
1192
+ import { MSW_WEBSOCKET_CLIENTS_KEY as MSW_WEBSOCKET_CLIENTS_KEY2 } from '../core/ws/WebSocketClientManager.mjs';
1162
1193
 
1163
1194
  // src/browser/setupWorker/stop/utils/printStopMessage.ts
1164
1195
  import { devUtils as devUtils8 } from '../core/utils/internal/devUtils.mjs';
@@ -1184,7 +1215,7 @@ var createStop = (context) => {
1184
1215
  context.workerChannel.send("MOCK_DEACTIVATE");
1185
1216
  context.isMockingEnabled = false;
1186
1217
  window.clearInterval(context.keepAliveInterval);
1187
- localStorage.removeItem(MSW_WEBSOCKET_CLIENTS_KEY);
1218
+ localStorage.removeItem(MSW_WEBSOCKET_CLIENTS_KEY2);
1188
1219
  printStopMessage({ quiet: context.startOptions?.quiet });
1189
1220
  };
1190
1221
  };
@@ -1270,7 +1301,7 @@ var DeferredPromise = class extends Promise {
1270
1301
  }
1271
1302
  };
1272
1303
 
1273
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
1304
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
1274
1305
  var RequestController = class {
1275
1306
  constructor(request) {
1276
1307
  this.request = request;
@@ -1308,15 +1339,7 @@ async function emitAsync(emitter, eventName, ...data) {
1308
1339
  }
1309
1340
  }
1310
1341
 
1311
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-3FNUI33J.mjs
1312
- function isPropertyAccessible(obj, key) {
1313
- try {
1314
- obj[key];
1315
- return true;
1316
- } catch (e) {
1317
- return false;
1318
- }
1319
- }
1342
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-MAEPOYB6.mjs
1320
1343
  function canParseUrl(url) {
1321
1344
  try {
1322
1345
  new URL(url);
@@ -1369,64 +1392,113 @@ var _FetchInterceptor = class extends Interceptor {
1369
1392
  { once: true }
1370
1393
  );
1371
1394
  }
1372
- const resolverResult = await until(async () => {
1373
- const listenersFinished = emitAsync(this.emitter, "request", {
1374
- request: interactiveRequest,
1375
- requestId
1395
+ const responsePromise = new DeferredPromise();
1396
+ const respondWith = (response) => {
1397
+ this.logger.info("responding with a mock response:", response);
1398
+ if (this.emitter.listenerCount("response") > 0) {
1399
+ this.logger.info('emitting the "response" event...');
1400
+ const responseClone = response.clone();
1401
+ this.emitter.emit("response", {
1402
+ response: responseClone,
1403
+ isMockedResponse: true,
1404
+ request: interactiveRequest,
1405
+ requestId
1406
+ });
1407
+ }
1408
+ Object.defineProperty(response, "url", {
1409
+ writable: false,
1410
+ enumerable: true,
1411
+ configurable: false,
1412
+ value: request.url
1376
1413
  });
1377
- await Promise.race([
1378
- requestAborted,
1379
- // Put the listeners invocation Promise in the same race condition
1380
- // with the request abort Promise because otherwise awaiting the listeners
1381
- // would always yield some response (or undefined).
1382
- listenersFinished,
1383
- requestController.responsePromise
1384
- ]);
1385
- this.logger.info("all request listeners have been resolved!");
1386
- const mockedResponse2 = await requestController.responsePromise;
1387
- this.logger.info("event.respondWith called with:", mockedResponse2);
1388
- return mockedResponse2;
1389
- });
1414
+ responsePromise.resolve(response);
1415
+ };
1416
+ const errorWith = (reason) => {
1417
+ responsePromise.reject(reason);
1418
+ };
1419
+ const resolverResult = await until(
1420
+ async () => {
1421
+ const listenersFinished = emitAsync(this.emitter, "request", {
1422
+ request: interactiveRequest,
1423
+ requestId
1424
+ });
1425
+ await Promise.race([
1426
+ requestAborted,
1427
+ // Put the listeners invocation Promise in the same race condition
1428
+ // with the request abort Promise because otherwise awaiting the listeners
1429
+ // would always yield some response (or undefined).
1430
+ listenersFinished,
1431
+ requestController.responsePromise
1432
+ ]);
1433
+ this.logger.info("all request listeners have been resolved!");
1434
+ const mockedResponse2 = await requestController.responsePromise;
1435
+ this.logger.info("event.respondWith called with:", mockedResponse2);
1436
+ return mockedResponse2;
1437
+ }
1438
+ );
1390
1439
  if (requestAborted.state === "rejected") {
1391
- return Promise.reject(requestAborted.rejectionReason);
1440
+ this.logger.info(
1441
+ "request has been aborted:",
1442
+ requestAborted.rejectionReason
1443
+ );
1444
+ responsePromise.reject(requestAborted.rejectionReason);
1445
+ return responsePromise;
1392
1446
  }
1393
1447
  if (resolverResult.error) {
1394
- return Promise.reject(createNetworkError(resolverResult.error));
1448
+ this.logger.info(
1449
+ "request listerner threw an error:",
1450
+ resolverResult.error
1451
+ );
1452
+ if (resolverResult.error instanceof Response) {
1453
+ if (isResponseError(resolverResult.error)) {
1454
+ errorWith(createNetworkError(resolverResult.error));
1455
+ } else {
1456
+ respondWith(resolverResult.error);
1457
+ }
1458
+ }
1459
+ if (this.emitter.listenerCount("unhandledException") > 0) {
1460
+ await emitAsync(this.emitter, "unhandledException", {
1461
+ error: resolverResult.error,
1462
+ request,
1463
+ requestId,
1464
+ controller: {
1465
+ respondWith,
1466
+ errorWith
1467
+ }
1468
+ });
1469
+ if (responsePromise.state !== "pending") {
1470
+ return responsePromise;
1471
+ }
1472
+ }
1473
+ respondWith(createServerErrorResponse(resolverResult.error));
1474
+ return responsePromise;
1395
1475
  }
1396
1476
  const mockedResponse = resolverResult.data;
1397
1477
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
1398
1478
  this.logger.info("received mocked response:", mockedResponse);
1399
- if (isPropertyAccessible(mockedResponse, "type") && mockedResponse.type === "error") {
1479
+ if (isResponseError(mockedResponse)) {
1400
1480
  this.logger.info(
1401
1481
  "received a network error response, rejecting the request promise..."
1402
1482
  );
1403
- return Promise.reject(createNetworkError(mockedResponse));
1483
+ errorWith(createNetworkError(mockedResponse));
1484
+ } else {
1485
+ respondWith(mockedResponse);
1404
1486
  }
1405
- const responseClone = mockedResponse.clone();
1406
- this.emitter.emit("response", {
1407
- response: responseClone,
1408
- isMockedResponse: true,
1409
- request: interactiveRequest,
1410
- requestId
1411
- });
1412
- Object.defineProperty(mockedResponse, "url", {
1413
- writable: false,
1414
- enumerable: true,
1415
- configurable: false,
1416
- value: request.url
1417
- });
1418
- return mockedResponse;
1487
+ return responsePromise;
1419
1488
  }
1420
1489
  this.logger.info("no mocked response received!");
1421
1490
  return pureFetch(request).then((response) => {
1422
- const responseClone = response.clone();
1423
- this.logger.info("original fetch performed", responseClone);
1424
- this.emitter.emit("response", {
1425
- response: responseClone,
1426
- isMockedResponse: false,
1427
- request: interactiveRequest,
1428
- requestId
1429
- });
1491
+ this.logger.info("original fetch performed", response);
1492
+ if (this.emitter.listenerCount("response") > 0) {
1493
+ this.logger.info('emitting the "response" event...');
1494
+ const responseClone = response.clone();
1495
+ this.emitter.emit("response", {
1496
+ response: responseClone,
1497
+ isMockedResponse: false,
1498
+ request: interactiveRequest,
1499
+ requestId
1500
+ });
1501
+ }
1430
1502
  return response;
1431
1503
  });
1432
1504
  };
@@ -1455,7 +1527,7 @@ function createNetworkError(cause) {
1455
1527
  });
1456
1528
  }
1457
1529
 
1458
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-VYFS2IF2.mjs
1530
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-732REFPX.mjs
1459
1531
  function concatArrayBuffer(left, right) {
1460
1532
  const result = new Uint8Array(left.byteLength + right.byteLength);
1461
1533
  result.set(left, 0);
@@ -2106,7 +2178,31 @@ function createXMLHttpRequestProxy({
2106
2178
  "request listener threw an exception, aborting request...",
2107
2179
  resolverResult.error
2108
2180
  );
2109
- xhrRequestController.errorWith(resolverResult.error);
2181
+ if (resolverResult.error instanceof Response) {
2182
+ if (isResponseError(resolverResult.error)) {
2183
+ xhrRequestController.errorWith(new TypeError("Network error"));
2184
+ } else {
2185
+ this.respondWith(resolverResult.error);
2186
+ }
2187
+ return;
2188
+ }
2189
+ if (emitter.listenerCount("unhandledException") > 0) {
2190
+ await emitAsync(emitter, "unhandledException", {
2191
+ error: resolverResult.error,
2192
+ request,
2193
+ requestId,
2194
+ controller: {
2195
+ respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
2196
+ errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
2197
+ }
2198
+ });
2199
+ if (originalRequest.readyState > XMLHttpRequest.OPENED) {
2200
+ return;
2201
+ }
2202
+ }
2203
+ xhrRequestController.respondWith(
2204
+ createServerErrorResponse(resolverResult.error)
2205
+ );
2110
2206
  return;
2111
2207
  }
2112
2208
  const mockedResponse = resolverResult.data;
@@ -2116,7 +2212,7 @@ function createXMLHttpRequestProxy({
2116
2212
  mockedResponse.status,
2117
2213
  mockedResponse.statusText
2118
2214
  );
2119
- if (mockedResponse.type === "error") {
2215
+ if (isResponseError(mockedResponse)) {
2120
2216
  this.logger.info(
2121
2217
  "received a network error response, rejecting the request promise..."
2122
2218
  );