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.
- package/README.md +3 -9
- package/lib/browser/index.js +160 -62
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/index.mjs +160 -62
- package/lib/browser/index.mjs.map +1 -1
- package/lib/core/handlers/WebSocketHandler.js +1 -2
- package/lib/core/handlers/WebSocketHandler.js.map +1 -1
- package/lib/core/handlers/WebSocketHandler.mjs +1 -2
- package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
- package/lib/core/utils/internal/Disposable.d.mts +2 -2
- package/lib/core/utils/internal/Disposable.d.ts +2 -2
- package/lib/core/utils/internal/Disposable.js +5 -2
- package/lib/core/utils/internal/Disposable.js.map +1 -1
- package/lib/core/utils/internal/Disposable.mjs +5 -2
- package/lib/core/utils/internal/Disposable.mjs.map +1 -1
- package/lib/core/utils/internal/devUtils.d.mts +10 -1
- package/lib/core/utils/internal/devUtils.d.ts +10 -1
- package/lib/core/utils/internal/devUtils.js +7 -0
- package/lib/core/utils/internal/devUtils.js.map +1 -1
- package/lib/core/utils/internal/devUtils.mjs +7 -0
- package/lib/core/utils/internal/devUtils.mjs.map +1 -1
- package/lib/core/utils/matching/normalizePath.d.mts +1 -0
- package/lib/core/utils/matching/normalizePath.d.ts +1 -0
- package/lib/core/utils/matching/normalizePath.js.map +1 -1
- package/lib/core/utils/matching/normalizePath.mjs.map +1 -1
- package/lib/core/utils/request/onUnhandledRequest.js +3 -3
- package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
- package/lib/core/utils/request/onUnhandledRequest.mjs +4 -4
- package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
- package/lib/core/utils/url/cleanUrl.d.mts +2 -1
- package/lib/core/utils/url/cleanUrl.d.ts +2 -1
- package/lib/core/utils/url/cleanUrl.js +3 -0
- package/lib/core/utils/url/cleanUrl.js.map +1 -1
- package/lib/core/utils/url/cleanUrl.mjs +3 -0
- package/lib/core/utils/url/cleanUrl.mjs.map +1 -1
- package/lib/core/ws/WebSocketClientManager.d.mts +9 -15
- package/lib/core/ws/WebSocketClientManager.d.ts +9 -15
- package/lib/core/ws/WebSocketClientManager.js +73 -34
- package/lib/core/ws/WebSocketClientManager.js.map +1 -1
- package/lib/core/ws/WebSocketClientManager.mjs +73 -34
- package/lib/core/ws/WebSocketClientManager.mjs.map +1 -1
- package/lib/core/ws.js +4 -2
- package/lib/core/ws.js.map +1 -1
- package/lib/core/ws.mjs +4 -2
- package/lib/core/ws.mjs.map +1 -1
- package/lib/iife/index.js +278 -113
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.js +5 -0
- package/lib/native/index.js.map +1 -1
- package/lib/native/index.mjs +6 -1
- package/lib/native/index.mjs.map +1 -1
- package/lib/node/index.js +5 -0
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +6 -1
- package/lib/node/index.mjs.map +1 -1
- package/package.json +17 -5
- package/src/browser/setupWorker/start/createStartHandler.ts +6 -0
- package/src/browser/setupWorker/stop/createStop.ts +4 -0
- package/src/core/handlers/WebSocketHandler.ts +1 -2
- package/src/core/utils/internal/Disposable.ts +6 -3
- package/src/core/utils/internal/devUtils.test.ts +21 -0
- package/src/core/utils/internal/devUtils.ts +13 -0
- package/src/core/utils/matching/matchRequestUrl.test.ts +11 -0
- package/src/core/utils/matching/normalizePath.test.ts +7 -1
- package/src/core/utils/matching/normalizePath.ts +1 -0
- package/src/core/utils/request/onUnhandledRequest.test.ts +30 -4
- package/src/core/utils/request/onUnhandledRequest.ts +4 -4
- package/src/core/utils/url/cleanUrl.test.ts +8 -3
- package/src/core/utils/url/cleanUrl.ts +9 -1
- package/src/core/utils/url/getAbsoluteUrl.node.test.ts +3 -3
- package/src/core/utils/url/getAbsoluteUrl.test.ts +5 -5
- package/src/core/utils/url/isAbsoluteUrl.test.ts +7 -7
- package/src/core/ws/WebSocketClientManager.test.ts +43 -45
- package/src/core/ws/WebSocketClientManager.ts +107 -44
- package/src/core/ws.ts +4 -2
- package/src/node/SetupServerCommonApi.ts +7 -1
package/lib/browser/index.mjs
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
400
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
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
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
1479
|
+
if (isResponseError(mockedResponse)) {
|
|
1398
1480
|
this.logger.info(
|
|
1399
1481
|
"received a network error response, rejecting the request promise..."
|
|
1400
1482
|
);
|
|
1401
|
-
|
|
1483
|
+
errorWith(createNetworkError(mockedResponse));
|
|
1484
|
+
} else {
|
|
1485
|
+
respondWith(mockedResponse);
|
|
1402
1486
|
}
|
|
1403
|
-
|
|
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
|
-
|
|
1421
|
-
this.
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
2215
|
+
if (isResponseError(mockedResponse)) {
|
|
2118
2216
|
this.logger.info(
|
|
2119
2217
|
"received a network error response, rejecting the request promise..."
|
|
2120
2218
|
);
|