msw 2.3.0-ws.rc-5 → 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 (77) hide show
  1. package/README.md +3 -9
  2. package/lib/browser/index.js +160 -62
  3. package/lib/browser/index.js.map +1 -1
  4. package/lib/browser/index.mjs +160 -62
  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.d.mts +9 -15
  37. package/lib/core/ws/WebSocketClientManager.d.ts +9 -15
  38. package/lib/core/ws/WebSocketClientManager.js +73 -34
  39. package/lib/core/ws/WebSocketClientManager.js.map +1 -1
  40. package/lib/core/ws/WebSocketClientManager.mjs +73 -34
  41. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -1
  42. package/lib/core/ws.js +4 -2
  43. package/lib/core/ws.js.map +1 -1
  44. package/lib/core/ws.mjs +4 -2
  45. package/lib/core/ws.mjs.map +1 -1
  46. package/lib/iife/index.js +278 -113
  47. package/lib/iife/index.js.map +1 -1
  48. package/lib/mockServiceWorker.js +1 -1
  49. package/lib/native/index.js +5 -0
  50. package/lib/native/index.js.map +1 -1
  51. package/lib/native/index.mjs +6 -1
  52. package/lib/native/index.mjs.map +1 -1
  53. package/lib/node/index.js +5 -0
  54. package/lib/node/index.js.map +1 -1
  55. package/lib/node/index.mjs +6 -1
  56. package/lib/node/index.mjs.map +1 -1
  57. package/package.json +17 -5
  58. package/src/browser/setupWorker/start/createStartHandler.ts +6 -0
  59. package/src/browser/setupWorker/stop/createStop.ts +4 -0
  60. package/src/core/handlers/WebSocketHandler.ts +1 -2
  61. package/src/core/utils/internal/Disposable.ts +6 -3
  62. package/src/core/utils/internal/devUtils.test.ts +21 -0
  63. package/src/core/utils/internal/devUtils.ts +13 -0
  64. package/src/core/utils/matching/matchRequestUrl.test.ts +11 -0
  65. package/src/core/utils/matching/normalizePath.test.ts +7 -1
  66. package/src/core/utils/matching/normalizePath.ts +1 -0
  67. package/src/core/utils/request/onUnhandledRequest.test.ts +30 -4
  68. package/src/core/utils/request/onUnhandledRequest.ts +4 -4
  69. package/src/core/utils/url/cleanUrl.test.ts +8 -3
  70. package/src/core/utils/url/cleanUrl.ts +9 -1
  71. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +3 -3
  72. package/src/core/utils/url/getAbsoluteUrl.test.ts +5 -5
  73. package/src/core/utils/url/isAbsoluteUrl.test.ts +7 -7
  74. package/src/core/ws/WebSocketClientManager.test.ts +43 -45
  75. package/src/core/ws/WebSocketClientManager.ts +107 -44
  76. package/src/core/ws.ts +4 -2
  77. 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,6 +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';
1192
+ import { MSW_WEBSOCKET_CLIENTS_KEY as MSW_WEBSOCKET_CLIENTS_KEY2 } from '../core/ws/WebSocketClientManager.mjs';
1161
1193
 
1162
1194
  // src/browser/setupWorker/stop/utils/printStopMessage.ts
1163
1195
  import { devUtils as devUtils8 } from '../core/utils/internal/devUtils.mjs';
@@ -1183,6 +1215,7 @@ var createStop = (context) => {
1183
1215
  context.workerChannel.send("MOCK_DEACTIVATE");
1184
1216
  context.isMockingEnabled = false;
1185
1217
  window.clearInterval(context.keepAliveInterval);
1218
+ localStorage.removeItem(MSW_WEBSOCKET_CLIENTS_KEY2);
1186
1219
  printStopMessage({ quiet: context.startOptions?.quiet });
1187
1220
  };
1188
1221
  };
@@ -1268,7 +1301,7 @@ var DeferredPromise = class extends Promise {
1268
1301
  }
1269
1302
  };
1270
1303
 
1271
- // 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
1272
1305
  var RequestController = class {
1273
1306
  constructor(request) {
1274
1307
  this.request = request;
@@ -1306,15 +1339,7 @@ async function emitAsync(emitter, eventName, ...data) {
1306
1339
  }
1307
1340
  }
1308
1341
 
1309
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-3FNUI33J.mjs
1310
- function isPropertyAccessible(obj, key) {
1311
- try {
1312
- obj[key];
1313
- return true;
1314
- } catch (e) {
1315
- return false;
1316
- }
1317
- }
1342
+ // node_modules/.pnpm/@mswjs+interceptors@0.30.0/node_modules/@mswjs/interceptors/lib/browser/chunk-MAEPOYB6.mjs
1318
1343
  function canParseUrl(url) {
1319
1344
  try {
1320
1345
  new URL(url);
@@ -1367,64 +1392,113 @@ var _FetchInterceptor = class extends Interceptor {
1367
1392
  { once: true }
1368
1393
  );
1369
1394
  }
1370
- const resolverResult = await until(async () => {
1371
- const listenersFinished = emitAsync(this.emitter, "request", {
1372
- request: interactiveRequest,
1373
- 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
1374
1413
  });
1375
- await Promise.race([
1376
- requestAborted,
1377
- // Put the listeners invocation Promise in the same race condition
1378
- // with the request abort Promise because otherwise awaiting the listeners
1379
- // would always yield some response (or undefined).
1380
- listenersFinished,
1381
- requestController.responsePromise
1382
- ]);
1383
- this.logger.info("all request listeners have been resolved!");
1384
- const mockedResponse2 = await requestController.responsePromise;
1385
- this.logger.info("event.respondWith called with:", mockedResponse2);
1386
- return mockedResponse2;
1387
- });
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
+ );
1388
1439
  if (requestAborted.state === "rejected") {
1389
- 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;
1390
1446
  }
1391
1447
  if (resolverResult.error) {
1392
- 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;
1393
1475
  }
1394
1476
  const mockedResponse = resolverResult.data;
1395
1477
  if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
1396
1478
  this.logger.info("received mocked response:", mockedResponse);
1397
- if (isPropertyAccessible(mockedResponse, "type") && mockedResponse.type === "error") {
1479
+ if (isResponseError(mockedResponse)) {
1398
1480
  this.logger.info(
1399
1481
  "received a network error response, rejecting the request promise..."
1400
1482
  );
1401
- return Promise.reject(createNetworkError(mockedResponse));
1483
+ errorWith(createNetworkError(mockedResponse));
1484
+ } else {
1485
+ respondWith(mockedResponse);
1402
1486
  }
1403
- const responseClone = mockedResponse.clone();
1404
- this.emitter.emit("response", {
1405
- response: responseClone,
1406
- isMockedResponse: true,
1407
- request: interactiveRequest,
1408
- requestId
1409
- });
1410
- Object.defineProperty(mockedResponse, "url", {
1411
- writable: false,
1412
- enumerable: true,
1413
- configurable: false,
1414
- value: request.url
1415
- });
1416
- return mockedResponse;
1487
+ return responsePromise;
1417
1488
  }
1418
1489
  this.logger.info("no mocked response received!");
1419
1490
  return pureFetch(request).then((response) => {
1420
- const responseClone = response.clone();
1421
- this.logger.info("original fetch performed", responseClone);
1422
- this.emitter.emit("response", {
1423
- response: responseClone,
1424
- isMockedResponse: false,
1425
- request: interactiveRequest,
1426
- requestId
1427
- });
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
+ }
1428
1502
  return response;
1429
1503
  });
1430
1504
  };
@@ -1453,7 +1527,7 @@ function createNetworkError(cause) {
1453
1527
  });
1454
1528
  }
1455
1529
 
1456
- // 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
1457
1531
  function concatArrayBuffer(left, right) {
1458
1532
  const result = new Uint8Array(left.byteLength + right.byteLength);
1459
1533
  result.set(left, 0);
@@ -2104,7 +2178,31 @@ function createXMLHttpRequestProxy({
2104
2178
  "request listener threw an exception, aborting request...",
2105
2179
  resolverResult.error
2106
2180
  );
2107
- 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
+ );
2108
2206
  return;
2109
2207
  }
2110
2208
  const mockedResponse = resolverResult.data;
@@ -2114,7 +2212,7 @@ function createXMLHttpRequestProxy({
2114
2212
  mockedResponse.status,
2115
2213
  mockedResponse.statusText
2116
2214
  );
2117
- if (mockedResponse.type === "error") {
2215
+ if (isResponseError(mockedResponse)) {
2118
2216
  this.logger.info(
2119
2217
  "received a network error response, rejecting the request promise..."
2120
2218
  );