msw 2.4.2 → 2.4.4
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/lib/browser/index.js +505 -253
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/index.mjs +507 -255
- package/lib/browser/index.mjs.map +1 -1
- package/lib/iife/index.js +1001 -538
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.js +15 -12
- package/lib/native/index.js.map +1 -1
- package/lib/native/index.mjs +15 -12
- package/lib/native/index.mjs.map +1 -1
- package/lib/node/index.js +15 -12
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +15 -12
- package/lib/node/index.mjs.map +1 -1
- package/package.json +3 -7
- package/src/browser/setupWorker/start/createFallbackRequestListener.ts +2 -2
- package/src/node/SetupServerCommonApi.ts +17 -14
package/lib/browser/index.mjs
CHANGED
|
@@ -370,7 +370,7 @@ You can also automate this process and make the worker script update automatical
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
373
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
|
|
374
374
|
var encoder = new TextEncoder();
|
|
375
375
|
function encodeBuffer(text) {
|
|
376
376
|
return encoder.encode(text);
|
|
@@ -386,7 +386,7 @@ function toArrayBuffer(array) {
|
|
|
386
386
|
);
|
|
387
387
|
}
|
|
388
388
|
|
|
389
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
389
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-XVPRNJO7.mjs
|
|
390
390
|
var IS_PATCHED_MODULE = Symbol("isPatchedModule");
|
|
391
391
|
function isPropertyAccessible(obj, key) {
|
|
392
392
|
try {
|
|
@@ -403,6 +403,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
|
|
|
403
403
|
205,
|
|
404
404
|
304
|
|
405
405
|
]);
|
|
406
|
+
var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
|
|
407
|
+
301,
|
|
408
|
+
302,
|
|
409
|
+
303,
|
|
410
|
+
307,
|
|
411
|
+
308
|
|
412
|
+
]);
|
|
406
413
|
function isResponseWithoutBody(status) {
|
|
407
414
|
return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
|
|
408
415
|
}
|
|
@@ -428,6 +435,90 @@ function isResponseError(response) {
|
|
|
428
435
|
return isPropertyAccessible(response, "type") && response.type === "error";
|
|
429
436
|
}
|
|
430
437
|
|
|
438
|
+
// node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
|
|
439
|
+
var POSITIONALS_EXP2 = /(%?)(%([sdijo]))/g;
|
|
440
|
+
function serializePositional2(positional, flag) {
|
|
441
|
+
switch (flag) {
|
|
442
|
+
case "s":
|
|
443
|
+
return positional;
|
|
444
|
+
case "d":
|
|
445
|
+
case "i":
|
|
446
|
+
return Number(positional);
|
|
447
|
+
case "j":
|
|
448
|
+
return JSON.stringify(positional);
|
|
449
|
+
case "o": {
|
|
450
|
+
if (typeof positional === "string") {
|
|
451
|
+
return positional;
|
|
452
|
+
}
|
|
453
|
+
const json = JSON.stringify(positional);
|
|
454
|
+
if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
|
|
455
|
+
return positional;
|
|
456
|
+
}
|
|
457
|
+
return json;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
function format2(message, ...positionals) {
|
|
462
|
+
if (positionals.length === 0) {
|
|
463
|
+
return message;
|
|
464
|
+
}
|
|
465
|
+
let positionalIndex = 0;
|
|
466
|
+
let formattedMessage = message.replace(
|
|
467
|
+
POSITIONALS_EXP2,
|
|
468
|
+
(match, isEscaped, _, flag) => {
|
|
469
|
+
const positional = positionals[positionalIndex];
|
|
470
|
+
const value = serializePositional2(positional, flag);
|
|
471
|
+
if (!isEscaped) {
|
|
472
|
+
positionalIndex++;
|
|
473
|
+
return value;
|
|
474
|
+
}
|
|
475
|
+
return match;
|
|
476
|
+
}
|
|
477
|
+
);
|
|
478
|
+
if (positionalIndex < positionals.length) {
|
|
479
|
+
formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
|
|
480
|
+
}
|
|
481
|
+
formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
|
|
482
|
+
return formattedMessage;
|
|
483
|
+
}
|
|
484
|
+
var STACK_FRAMES_TO_IGNORE2 = 2;
|
|
485
|
+
function cleanErrorStack2(error2) {
|
|
486
|
+
if (!error2.stack) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
const nextStack = error2.stack.split("\n");
|
|
490
|
+
nextStack.splice(1, STACK_FRAMES_TO_IGNORE2);
|
|
491
|
+
error2.stack = nextStack.join("\n");
|
|
492
|
+
}
|
|
493
|
+
var InvariantError2 = class extends Error {
|
|
494
|
+
constructor(message, ...positionals) {
|
|
495
|
+
super(message);
|
|
496
|
+
this.message = message;
|
|
497
|
+
this.name = "Invariant Violation";
|
|
498
|
+
this.message = format2(message, ...positionals);
|
|
499
|
+
cleanErrorStack2(this);
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
var invariant2 = (predicate, message, ...positionals) => {
|
|
503
|
+
if (!predicate) {
|
|
504
|
+
throw new InvariantError2(message, ...positionals);
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
invariant2.as = (ErrorConstructor, predicate, message, ...positionals) => {
|
|
508
|
+
if (!predicate) {
|
|
509
|
+
const formatMessage = positionals.length === 0 ? message : format2(message, ...positionals);
|
|
510
|
+
let error2;
|
|
511
|
+
try {
|
|
512
|
+
error2 = Reflect.construct(ErrorConstructor, [
|
|
513
|
+
formatMessage
|
|
514
|
+
]);
|
|
515
|
+
} catch (err) {
|
|
516
|
+
error2 = ErrorConstructor(formatMessage);
|
|
517
|
+
}
|
|
518
|
+
throw error2;
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
|
|
431
522
|
// node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
|
|
432
523
|
var __defProp = Object.defineProperty;
|
|
433
524
|
var __export = (target, all) => {
|
|
@@ -656,21 +747,21 @@ var PerformanceEntry = class {
|
|
|
656
747
|
var noop = () => void 0;
|
|
657
748
|
function log(message, ...positionals) {
|
|
658
749
|
if (IS_NODE) {
|
|
659
|
-
process.stdout.write(
|
|
750
|
+
process.stdout.write(format2(message, ...positionals) + "\n");
|
|
660
751
|
return;
|
|
661
752
|
}
|
|
662
753
|
console.log(message, ...positionals);
|
|
663
754
|
}
|
|
664
755
|
function warn(message, ...positionals) {
|
|
665
756
|
if (IS_NODE) {
|
|
666
|
-
process.stderr.write(
|
|
757
|
+
process.stderr.write(format2(message, ...positionals) + "\n");
|
|
667
758
|
return;
|
|
668
759
|
}
|
|
669
760
|
console.warn(message, ...positionals);
|
|
670
761
|
}
|
|
671
762
|
function error(message, ...positionals) {
|
|
672
763
|
if (IS_NODE) {
|
|
673
|
-
process.stderr.write(
|
|
764
|
+
process.stderr.write(format2(message, ...positionals) + "\n");
|
|
674
765
|
return;
|
|
675
766
|
}
|
|
676
767
|
console.error(message, ...positionals);
|
|
@@ -865,7 +956,7 @@ var _Emitter = class {
|
|
|
865
956
|
var Emitter = _Emitter;
|
|
866
957
|
Emitter.defaultMaxListeners = 10;
|
|
867
958
|
|
|
868
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
959
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
|
|
869
960
|
var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
|
|
870
961
|
function getGlobalSymbol(symbol) {
|
|
871
962
|
return (
|
|
@@ -1013,7 +1104,7 @@ function createRequestId() {
|
|
|
1013
1104
|
return Math.random().toString(16).slice(2);
|
|
1014
1105
|
}
|
|
1015
1106
|
|
|
1016
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1107
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
|
|
1017
1108
|
var BatchInterceptor = class extends Interceptor {
|
|
1018
1109
|
constructor(options) {
|
|
1019
1110
|
BatchInterceptor.symbol = Symbol(options.name);
|
|
@@ -1297,34 +1388,58 @@ var DeferredPromise = class extends Promise {
|
|
|
1297
1388
|
}
|
|
1298
1389
|
};
|
|
1299
1390
|
|
|
1300
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1391
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
|
|
1392
|
+
var InterceptorError = class extends Error {
|
|
1393
|
+
constructor(message) {
|
|
1394
|
+
super(message);
|
|
1395
|
+
this.name = "InterceptorError";
|
|
1396
|
+
Object.setPrototypeOf(this, InterceptorError.prototype);
|
|
1397
|
+
}
|
|
1398
|
+
};
|
|
1399
|
+
var kRequestHandled = Symbol("kRequestHandled");
|
|
1400
|
+
var kResponsePromise = Symbol("kResponsePromise");
|
|
1301
1401
|
var RequestController = class {
|
|
1302
1402
|
constructor(request) {
|
|
1303
1403
|
this.request = request;
|
|
1304
|
-
this
|
|
1404
|
+
this[kRequestHandled] = false;
|
|
1405
|
+
this[kResponsePromise] = new DeferredPromise();
|
|
1305
1406
|
}
|
|
1407
|
+
/**
|
|
1408
|
+
* Respond to this request with the given `Response` instance.
|
|
1409
|
+
* @example
|
|
1410
|
+
* controller.respondWith(new Response())
|
|
1411
|
+
* controller.respondWith(Response.json({ id }))
|
|
1412
|
+
* controller.respondWith(Response.error())
|
|
1413
|
+
*/
|
|
1306
1414
|
respondWith(response) {
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1415
|
+
invariant2.as(
|
|
1416
|
+
InterceptorError,
|
|
1417
|
+
!this[kRequestHandled],
|
|
1418
|
+
'Failed to respond to the "%s %s" request: the "request" event has already been handled.',
|
|
1310
1419
|
this.request.method,
|
|
1311
1420
|
this.request.url
|
|
1312
1421
|
);
|
|
1313
|
-
this
|
|
1422
|
+
this[kRequestHandled] = true;
|
|
1423
|
+
this[kResponsePromise].resolve(response);
|
|
1424
|
+
}
|
|
1425
|
+
/**
|
|
1426
|
+
* Error this request with the given error.
|
|
1427
|
+
* @example
|
|
1428
|
+
* controller.errorWith()
|
|
1429
|
+
* controller.errorWith(new Error('Oops!'))
|
|
1430
|
+
*/
|
|
1431
|
+
errorWith(error2) {
|
|
1432
|
+
invariant2.as(
|
|
1433
|
+
InterceptorError,
|
|
1434
|
+
!this[kRequestHandled],
|
|
1435
|
+
'Failed to error the "%s %s" request: the "request" event has already been handled.',
|
|
1436
|
+
this.request.method,
|
|
1437
|
+
this.request.url
|
|
1438
|
+
);
|
|
1439
|
+
this[kRequestHandled] = true;
|
|
1440
|
+
this[kResponsePromise].resolve(error2);
|
|
1314
1441
|
}
|
|
1315
1442
|
};
|
|
1316
|
-
function toInteractiveRequest(request) {
|
|
1317
|
-
const requestController = new RequestController(request);
|
|
1318
|
-
Reflect.set(
|
|
1319
|
-
request,
|
|
1320
|
-
"respondWith",
|
|
1321
|
-
requestController.respondWith.bind(requestController)
|
|
1322
|
-
);
|
|
1323
|
-
return {
|
|
1324
|
-
interactiveRequest: request,
|
|
1325
|
-
requestController
|
|
1326
|
-
};
|
|
1327
|
-
}
|
|
1328
1443
|
async function emitAsync(emitter, eventName, ...data) {
|
|
1329
1444
|
const listners = emitter.listeners(eventName);
|
|
1330
1445
|
if (listners.length === 0) {
|
|
@@ -1334,8 +1449,114 @@ async function emitAsync(emitter, eventName, ...data) {
|
|
|
1334
1449
|
await listener.apply(emitter, data);
|
|
1335
1450
|
}
|
|
1336
1451
|
}
|
|
1452
|
+
function isNodeLikeError(error2) {
|
|
1453
|
+
if (error2 == null) {
|
|
1454
|
+
return false;
|
|
1455
|
+
}
|
|
1456
|
+
if (!(error2 instanceof Error)) {
|
|
1457
|
+
return false;
|
|
1458
|
+
}
|
|
1459
|
+
return "code" in error2 && "errno" in error2;
|
|
1460
|
+
}
|
|
1461
|
+
async function handleRequest2(options) {
|
|
1462
|
+
const handleResponse = async (response) => {
|
|
1463
|
+
if (response instanceof Error) {
|
|
1464
|
+
options.onError(response);
|
|
1465
|
+
} else if (isResponseError(response)) {
|
|
1466
|
+
options.onRequestError(response);
|
|
1467
|
+
} else {
|
|
1468
|
+
await options.onResponse(response);
|
|
1469
|
+
}
|
|
1470
|
+
return true;
|
|
1471
|
+
};
|
|
1472
|
+
const handleResponseError = async (error2) => {
|
|
1473
|
+
if (error2 instanceof InterceptorError) {
|
|
1474
|
+
throw result.error;
|
|
1475
|
+
}
|
|
1476
|
+
if (isNodeLikeError(error2)) {
|
|
1477
|
+
options.onError(error2);
|
|
1478
|
+
return true;
|
|
1479
|
+
}
|
|
1480
|
+
if (error2 instanceof Response) {
|
|
1481
|
+
return await handleResponse(error2);
|
|
1482
|
+
}
|
|
1483
|
+
return false;
|
|
1484
|
+
};
|
|
1485
|
+
options.emitter.once("request", ({ requestId: pendingRequestId }) => {
|
|
1486
|
+
if (pendingRequestId !== options.requestId) {
|
|
1487
|
+
return;
|
|
1488
|
+
}
|
|
1489
|
+
if (options.controller[kResponsePromise].state === "pending") {
|
|
1490
|
+
options.controller[kResponsePromise].resolve(void 0);
|
|
1491
|
+
}
|
|
1492
|
+
});
|
|
1493
|
+
const requestAbortPromise = new DeferredPromise();
|
|
1494
|
+
if (options.request.signal) {
|
|
1495
|
+
options.request.signal.addEventListener(
|
|
1496
|
+
"abort",
|
|
1497
|
+
() => {
|
|
1498
|
+
requestAbortPromise.reject(options.request.signal.reason);
|
|
1499
|
+
},
|
|
1500
|
+
{ once: true }
|
|
1501
|
+
);
|
|
1502
|
+
}
|
|
1503
|
+
const result = await until(async () => {
|
|
1504
|
+
const requestListtenersPromise = emitAsync(options.emitter, "request", {
|
|
1505
|
+
requestId: options.requestId,
|
|
1506
|
+
request: options.request,
|
|
1507
|
+
controller: options.controller
|
|
1508
|
+
});
|
|
1509
|
+
await Promise.race([
|
|
1510
|
+
// Short-circuit the request handling promise if the request gets aborted.
|
|
1511
|
+
requestAbortPromise,
|
|
1512
|
+
requestListtenersPromise,
|
|
1513
|
+
options.controller[kResponsePromise]
|
|
1514
|
+
]);
|
|
1515
|
+
const mockedResponse = await options.controller[kResponsePromise];
|
|
1516
|
+
return mockedResponse;
|
|
1517
|
+
});
|
|
1518
|
+
if (requestAbortPromise.state === "rejected") {
|
|
1519
|
+
options.onError(requestAbortPromise.rejectionReason);
|
|
1520
|
+
return true;
|
|
1521
|
+
}
|
|
1522
|
+
if (result.error) {
|
|
1523
|
+
if (await handleResponseError(result.error)) {
|
|
1524
|
+
return true;
|
|
1525
|
+
}
|
|
1526
|
+
if (options.emitter.listenerCount("unhandledException") > 0) {
|
|
1527
|
+
const unhandledExceptionController = new RequestController(
|
|
1528
|
+
options.request
|
|
1529
|
+
);
|
|
1530
|
+
await emitAsync(options.emitter, "unhandledException", {
|
|
1531
|
+
error: result.error,
|
|
1532
|
+
request: options.request,
|
|
1533
|
+
requestId: options.requestId,
|
|
1534
|
+
controller: unhandledExceptionController
|
|
1535
|
+
}).then(() => {
|
|
1536
|
+
if (unhandledExceptionController[kResponsePromise].state === "pending") {
|
|
1537
|
+
unhandledExceptionController[kResponsePromise].resolve(void 0);
|
|
1538
|
+
}
|
|
1539
|
+
});
|
|
1540
|
+
const nextResult = await until(
|
|
1541
|
+
() => unhandledExceptionController[kResponsePromise]
|
|
1542
|
+
);
|
|
1543
|
+
if (nextResult.error) {
|
|
1544
|
+
return handleResponseError(nextResult.error);
|
|
1545
|
+
}
|
|
1546
|
+
if (nextResult.data) {
|
|
1547
|
+
return handleResponse(nextResult.data);
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
options.onResponse(createServerErrorResponse(result.error));
|
|
1551
|
+
return true;
|
|
1552
|
+
}
|
|
1553
|
+
if (result.data) {
|
|
1554
|
+
return handleResponse(result.data);
|
|
1555
|
+
}
|
|
1556
|
+
return false;
|
|
1557
|
+
}
|
|
1337
1558
|
|
|
1338
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1559
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-DZCGGRSJ.mjs
|
|
1339
1560
|
function canParseUrl(url) {
|
|
1340
1561
|
try {
|
|
1341
1562
|
new URL(url);
|
|
@@ -1344,6 +1565,72 @@ function canParseUrl(url) {
|
|
|
1344
1565
|
return false;
|
|
1345
1566
|
}
|
|
1346
1567
|
}
|
|
1568
|
+
function createNetworkError(cause) {
|
|
1569
|
+
return Object.assign(new TypeError("Failed to fetch"), {
|
|
1570
|
+
cause
|
|
1571
|
+
});
|
|
1572
|
+
}
|
|
1573
|
+
var REQUEST_BODY_HEADERS = [
|
|
1574
|
+
"content-encoding",
|
|
1575
|
+
"content-language",
|
|
1576
|
+
"content-location",
|
|
1577
|
+
"content-type",
|
|
1578
|
+
"content-length"
|
|
1579
|
+
];
|
|
1580
|
+
var kRedirectCount = Symbol("kRedirectCount");
|
|
1581
|
+
async function followFetchRedirect(request, response) {
|
|
1582
|
+
if (response.status !== 303 && request.body != null) {
|
|
1583
|
+
return Promise.reject(createNetworkError());
|
|
1584
|
+
}
|
|
1585
|
+
const requestUrl = new URL(request.url);
|
|
1586
|
+
let locationUrl;
|
|
1587
|
+
try {
|
|
1588
|
+
locationUrl = new URL(response.headers.get("location"));
|
|
1589
|
+
} catch (error2) {
|
|
1590
|
+
return Promise.reject(createNetworkError(error2));
|
|
1591
|
+
}
|
|
1592
|
+
if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
|
|
1593
|
+
return Promise.reject(
|
|
1594
|
+
createNetworkError("URL scheme must be a HTTP(S) scheme")
|
|
1595
|
+
);
|
|
1596
|
+
}
|
|
1597
|
+
if (Reflect.get(request, kRedirectCount) > 20) {
|
|
1598
|
+
return Promise.reject(createNetworkError("redirect count exceeded"));
|
|
1599
|
+
}
|
|
1600
|
+
Object.defineProperty(request, kRedirectCount, {
|
|
1601
|
+
value: (Reflect.get(request, kRedirectCount) || 0) + 1
|
|
1602
|
+
});
|
|
1603
|
+
if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
|
|
1604
|
+
return Promise.reject(
|
|
1605
|
+
createNetworkError('cross origin not allowed for request mode "cors"')
|
|
1606
|
+
);
|
|
1607
|
+
}
|
|
1608
|
+
const requestInit = {};
|
|
1609
|
+
if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
|
|
1610
|
+
requestInit.method = "GET";
|
|
1611
|
+
requestInit.body = null;
|
|
1612
|
+
REQUEST_BODY_HEADERS.forEach((headerName) => {
|
|
1613
|
+
request.headers.delete(headerName);
|
|
1614
|
+
});
|
|
1615
|
+
}
|
|
1616
|
+
if (!sameOrigin(requestUrl, locationUrl)) {
|
|
1617
|
+
request.headers.delete("authorization");
|
|
1618
|
+
request.headers.delete("proxy-authorization");
|
|
1619
|
+
request.headers.delete("cookie");
|
|
1620
|
+
request.headers.delete("host");
|
|
1621
|
+
}
|
|
1622
|
+
requestInit.headers = request.headers;
|
|
1623
|
+
return fetch(new Request(locationUrl, requestInit));
|
|
1624
|
+
}
|
|
1625
|
+
function sameOrigin(left, right) {
|
|
1626
|
+
if (left.origin === right.origin && left.origin === "null") {
|
|
1627
|
+
return true;
|
|
1628
|
+
}
|
|
1629
|
+
if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
|
|
1630
|
+
return true;
|
|
1631
|
+
}
|
|
1632
|
+
return false;
|
|
1633
|
+
}
|
|
1347
1634
|
var _FetchInterceptor = class extends Interceptor {
|
|
1348
1635
|
constructor() {
|
|
1349
1636
|
super(_FetchInterceptor.symbol);
|
|
@@ -1353,136 +1640,84 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1353
1640
|
}
|
|
1354
1641
|
async setup() {
|
|
1355
1642
|
const pureFetch = globalThis.fetch;
|
|
1356
|
-
|
|
1643
|
+
invariant2(
|
|
1357
1644
|
!pureFetch[IS_PATCHED_MODULE],
|
|
1358
1645
|
'Failed to patch the "fetch" module: already patched.'
|
|
1359
1646
|
);
|
|
1360
1647
|
globalThis.fetch = async (input, init) => {
|
|
1361
|
-
var _a;
|
|
1362
1648
|
const requestId = createRequestId();
|
|
1363
1649
|
const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
|
|
1364
1650
|
const request = new Request(resolvedInput, init);
|
|
1651
|
+
const responsePromise = new DeferredPromise();
|
|
1652
|
+
const controller = new RequestController(request);
|
|
1365
1653
|
this.logger.info("[%s] %s", request.method, request.url);
|
|
1366
|
-
|
|
1654
|
+
this.logger.info("awaiting for the mocked response...");
|
|
1367
1655
|
this.logger.info(
|
|
1368
|
-
'emitting the "request" event for %
|
|
1656
|
+
'emitting the "request" event for %s listener(s)...',
|
|
1369
1657
|
this.emitter.listenerCount("request")
|
|
1370
1658
|
);
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
this.logger.info("awaiting for the mocked response...");
|
|
1380
|
-
const signal = interactiveRequest.signal;
|
|
1381
|
-
const requestAborted = new DeferredPromise();
|
|
1382
|
-
if (signal) {
|
|
1383
|
-
signal.addEventListener(
|
|
1384
|
-
"abort",
|
|
1385
|
-
() => {
|
|
1386
|
-
requestAborted.reject(signal.reason);
|
|
1387
|
-
},
|
|
1388
|
-
{ once: true }
|
|
1389
|
-
);
|
|
1390
|
-
}
|
|
1391
|
-
const responsePromise = new DeferredPromise();
|
|
1392
|
-
const respondWith = (response) => {
|
|
1393
|
-
this.logger.info("responding with a mock response:", response);
|
|
1394
|
-
if (this.emitter.listenerCount("response") > 0) {
|
|
1395
|
-
this.logger.info('emitting the "response" event...');
|
|
1396
|
-
const responseClone = response.clone();
|
|
1397
|
-
this.emitter.emit("response", {
|
|
1398
|
-
response: responseClone,
|
|
1399
|
-
isMockedResponse: true,
|
|
1400
|
-
request: interactiveRequest,
|
|
1401
|
-
requestId
|
|
1402
|
-
});
|
|
1403
|
-
}
|
|
1404
|
-
Object.defineProperty(response, "url", {
|
|
1405
|
-
writable: false,
|
|
1406
|
-
enumerable: true,
|
|
1407
|
-
configurable: false,
|
|
1408
|
-
value: request.url
|
|
1409
|
-
});
|
|
1410
|
-
responsePromise.resolve(response);
|
|
1411
|
-
};
|
|
1412
|
-
const errorWith = (reason) => {
|
|
1413
|
-
responsePromise.reject(reason);
|
|
1414
|
-
};
|
|
1415
|
-
const resolverResult = await until(
|
|
1416
|
-
async () => {
|
|
1417
|
-
const listenersFinished = emitAsync(this.emitter, "request", {
|
|
1418
|
-
request: interactiveRequest,
|
|
1419
|
-
requestId
|
|
1659
|
+
const isRequestHandled = await handleRequest2({
|
|
1660
|
+
request,
|
|
1661
|
+
requestId,
|
|
1662
|
+
emitter: this.emitter,
|
|
1663
|
+
controller,
|
|
1664
|
+
onResponse: async (response) => {
|
|
1665
|
+
this.logger.info("received mocked response!", {
|
|
1666
|
+
response
|
|
1420
1667
|
});
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
this.logger.info(
|
|
1437
|
-
"request has been aborted:",
|
|
1438
|
-
requestAborted.rejectionReason
|
|
1439
|
-
);
|
|
1440
|
-
responsePromise.reject(requestAborted.rejectionReason);
|
|
1441
|
-
return responsePromise;
|
|
1442
|
-
}
|
|
1443
|
-
if (resolverResult.error) {
|
|
1444
|
-
this.logger.info(
|
|
1445
|
-
"request listerner threw an error:",
|
|
1446
|
-
resolverResult.error
|
|
1447
|
-
);
|
|
1448
|
-
if (resolverResult.error instanceof Response) {
|
|
1449
|
-
if (isResponseError(resolverResult.error)) {
|
|
1450
|
-
errorWith(createNetworkError(resolverResult.error));
|
|
1451
|
-
} else {
|
|
1452
|
-
respondWith(resolverResult.error);
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
if (this.emitter.listenerCount("unhandledException") > 0) {
|
|
1456
|
-
await emitAsync(this.emitter, "unhandledException", {
|
|
1457
|
-
error: resolverResult.error,
|
|
1458
|
-
request,
|
|
1459
|
-
requestId,
|
|
1460
|
-
controller: {
|
|
1461
|
-
respondWith,
|
|
1462
|
-
errorWith
|
|
1668
|
+
if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
|
|
1669
|
+
if (request.redirect === "error") {
|
|
1670
|
+
responsePromise.reject(createNetworkError("unexpected redirect"));
|
|
1671
|
+
return;
|
|
1672
|
+
}
|
|
1673
|
+
if (request.redirect === "follow") {
|
|
1674
|
+
followFetchRedirect(request, response).then(
|
|
1675
|
+
(response2) => {
|
|
1676
|
+
responsePromise.resolve(response2);
|
|
1677
|
+
},
|
|
1678
|
+
(reason) => {
|
|
1679
|
+
responsePromise.reject(reason);
|
|
1680
|
+
}
|
|
1681
|
+
);
|
|
1682
|
+
return;
|
|
1463
1683
|
}
|
|
1464
|
-
});
|
|
1465
|
-
if (responsePromise.state !== "pending") {
|
|
1466
|
-
return responsePromise;
|
|
1467
1684
|
}
|
|
1685
|
+
if (this.emitter.listenerCount("response") > 0) {
|
|
1686
|
+
this.logger.info('emitting the "response" event...');
|
|
1687
|
+
await emitAsync(this.emitter, "response", {
|
|
1688
|
+
// Clone the mocked response for the "response" event listener.
|
|
1689
|
+
// This way, the listener can read the response and not lock its body
|
|
1690
|
+
// for the actual fetch consumer.
|
|
1691
|
+
response: response.clone(),
|
|
1692
|
+
isMockedResponse: true,
|
|
1693
|
+
request,
|
|
1694
|
+
requestId
|
|
1695
|
+
});
|
|
1696
|
+
}
|
|
1697
|
+
Object.defineProperty(response, "url", {
|
|
1698
|
+
writable: false,
|
|
1699
|
+
enumerable: true,
|
|
1700
|
+
configurable: false,
|
|
1701
|
+
value: request.url
|
|
1702
|
+
});
|
|
1703
|
+
responsePromise.resolve(response);
|
|
1704
|
+
},
|
|
1705
|
+
onRequestError: (response) => {
|
|
1706
|
+
this.logger.info("request has errored!", { response });
|
|
1707
|
+
responsePromise.reject(createNetworkError(response));
|
|
1708
|
+
},
|
|
1709
|
+
onError: (error2) => {
|
|
1710
|
+
this.logger.info("request has been aborted!", { error: error2 });
|
|
1711
|
+
responsePromise.reject(error2);
|
|
1468
1712
|
}
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
const mockedResponse = resolverResult.data;
|
|
1473
|
-
if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
|
|
1474
|
-
this.logger.info("received mocked response:", mockedResponse);
|
|
1475
|
-
if (isResponseError(mockedResponse)) {
|
|
1476
|
-
this.logger.info(
|
|
1477
|
-
"received a network error response, rejecting the request promise..."
|
|
1478
|
-
);
|
|
1479
|
-
errorWith(createNetworkError(mockedResponse));
|
|
1480
|
-
} else {
|
|
1481
|
-
respondWith(mockedResponse);
|
|
1482
|
-
}
|
|
1713
|
+
});
|
|
1714
|
+
if (isRequestHandled) {
|
|
1715
|
+
this.logger.info("request has been handled, returning mock promise...");
|
|
1483
1716
|
return responsePromise;
|
|
1484
1717
|
}
|
|
1485
|
-
this.logger.info(
|
|
1718
|
+
this.logger.info(
|
|
1719
|
+
"no mocked response received, performing request as-is..."
|
|
1720
|
+
);
|
|
1486
1721
|
return pureFetch(request).then((response) => {
|
|
1487
1722
|
this.logger.info("original fetch performed", response);
|
|
1488
1723
|
if (this.emitter.listenerCount("response") > 0) {
|
|
@@ -1491,7 +1726,7 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1491
1726
|
this.emitter.emit("response", {
|
|
1492
1727
|
response: responseClone,
|
|
1493
1728
|
isMockedResponse: false,
|
|
1494
|
-
request
|
|
1729
|
+
request,
|
|
1495
1730
|
requestId
|
|
1496
1731
|
});
|
|
1497
1732
|
}
|
|
@@ -1517,13 +1752,8 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1517
1752
|
};
|
|
1518
1753
|
var FetchInterceptor = _FetchInterceptor;
|
|
1519
1754
|
FetchInterceptor.symbol = Symbol("fetch");
|
|
1520
|
-
function createNetworkError(cause) {
|
|
1521
|
-
return Object.assign(new TypeError("Failed to fetch"), {
|
|
1522
|
-
cause
|
|
1523
|
-
});
|
|
1524
|
-
}
|
|
1525
1755
|
|
|
1526
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1756
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-PRBA3ES4.mjs
|
|
1527
1757
|
function concatArrayBuffer(left, right) {
|
|
1528
1758
|
const result = new Uint8Array(left.byteLength + right.byteLength);
|
|
1529
1759
|
result.set(left, 0);
|
|
@@ -1532,10 +1762,10 @@ function concatArrayBuffer(left, right) {
|
|
|
1532
1762
|
}
|
|
1533
1763
|
var EventPolyfill = class {
|
|
1534
1764
|
constructor(type, options) {
|
|
1535
|
-
this.AT_TARGET = 0;
|
|
1536
|
-
this.BUBBLING_PHASE = 0;
|
|
1537
|
-
this.CAPTURING_PHASE = 0;
|
|
1538
1765
|
this.NONE = 0;
|
|
1766
|
+
this.CAPTURING_PHASE = 1;
|
|
1767
|
+
this.AT_TARGET = 2;
|
|
1768
|
+
this.BUBBLING_PHASE = 3;
|
|
1539
1769
|
this.type = "";
|
|
1540
1770
|
this.srcElement = null;
|
|
1541
1771
|
this.currentTarget = null;
|
|
@@ -1708,15 +1938,26 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
|
|
|
1708
1938
|
}
|
|
1709
1939
|
return headers;
|
|
1710
1940
|
}
|
|
1711
|
-
|
|
1941
|
+
async function getBodyByteLength(input) {
|
|
1942
|
+
const explicitContentLength = input.headers.get("content-length");
|
|
1943
|
+
if (explicitContentLength != null && explicitContentLength !== "") {
|
|
1944
|
+
return Number(explicitContentLength);
|
|
1945
|
+
}
|
|
1946
|
+
const buffer = await input.arrayBuffer();
|
|
1947
|
+
return buffer.byteLength;
|
|
1948
|
+
}
|
|
1949
|
+
var kIsRequestHandled = Symbol("kIsRequestHandled");
|
|
1712
1950
|
var IS_NODE2 = isNodeProcess();
|
|
1951
|
+
var kFetchRequest = Symbol("kFetchRequest");
|
|
1713
1952
|
var XMLHttpRequestController = class {
|
|
1714
1953
|
constructor(initialRequest, logger) {
|
|
1715
1954
|
this.initialRequest = initialRequest;
|
|
1716
1955
|
this.logger = logger;
|
|
1717
1956
|
this.method = "GET";
|
|
1718
1957
|
this.url = null;
|
|
1958
|
+
this[kIsRequestHandled] = false;
|
|
1719
1959
|
this.events = /* @__PURE__ */ new Map();
|
|
1960
|
+
this.uploadEvents = /* @__PURE__ */ new Map();
|
|
1720
1961
|
this.requestId = createRequestId();
|
|
1721
1962
|
this.requestHeaders = new Headers();
|
|
1722
1963
|
this.responseBuffer = new Uint8Array();
|
|
@@ -1765,9 +2006,6 @@ var XMLHttpRequestController = class {
|
|
|
1765
2006
|
}
|
|
1766
2007
|
case "send": {
|
|
1767
2008
|
const [body] = args;
|
|
1768
|
-
if (body != null) {
|
|
1769
|
-
this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
|
1770
|
-
}
|
|
1771
2009
|
this.request.addEventListener("load", () => {
|
|
1772
2010
|
if (typeof this.onResponse !== "undefined") {
|
|
1773
2011
|
const fetchResponse = createResponse(
|
|
@@ -1781,19 +2019,21 @@ var XMLHttpRequestController = class {
|
|
|
1781
2019
|
);
|
|
1782
2020
|
this.onResponse.call(this, {
|
|
1783
2021
|
response: fetchResponse,
|
|
1784
|
-
isMockedResponse:
|
|
2022
|
+
isMockedResponse: this[kIsRequestHandled],
|
|
1785
2023
|
request: fetchRequest,
|
|
1786
2024
|
requestId: this.requestId
|
|
1787
2025
|
});
|
|
1788
2026
|
}
|
|
1789
2027
|
});
|
|
1790
|
-
const
|
|
2028
|
+
const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
|
2029
|
+
const fetchRequest = this.toFetchApiRequest(requestBody);
|
|
2030
|
+
this[kFetchRequest] = fetchRequest;
|
|
1791
2031
|
const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
|
|
1792
2032
|
request: fetchRequest,
|
|
1793
2033
|
requestId: this.requestId
|
|
1794
2034
|
})) || Promise.resolve();
|
|
1795
2035
|
onceRequestSettled.finally(() => {
|
|
1796
|
-
if (this
|
|
2036
|
+
if (!this[kIsRequestHandled]) {
|
|
1797
2037
|
this.logger.info(
|
|
1798
2038
|
"request callback settled but request has not been handled (readystate %d), performing as-is...",
|
|
1799
2039
|
this.request.readyState
|
|
@@ -1815,6 +2055,39 @@ var XMLHttpRequestController = class {
|
|
|
1815
2055
|
}
|
|
1816
2056
|
}
|
|
1817
2057
|
});
|
|
2058
|
+
define(
|
|
2059
|
+
this.request,
|
|
2060
|
+
"upload",
|
|
2061
|
+
createProxy(this.request.upload, {
|
|
2062
|
+
setProperty: ([propertyName, nextValue], invoke) => {
|
|
2063
|
+
switch (propertyName) {
|
|
2064
|
+
case "onloadstart":
|
|
2065
|
+
case "onprogress":
|
|
2066
|
+
case "onaboart":
|
|
2067
|
+
case "onerror":
|
|
2068
|
+
case "onload":
|
|
2069
|
+
case "ontimeout":
|
|
2070
|
+
case "onloadend": {
|
|
2071
|
+
const eventName = propertyName.slice(
|
|
2072
|
+
2
|
|
2073
|
+
);
|
|
2074
|
+
this.registerUploadEvent(eventName, nextValue);
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
return invoke();
|
|
2078
|
+
},
|
|
2079
|
+
methodCall: ([methodName, args], invoke) => {
|
|
2080
|
+
switch (methodName) {
|
|
2081
|
+
case "addEventListener": {
|
|
2082
|
+
const [eventName, listener] = args;
|
|
2083
|
+
this.registerUploadEvent(eventName, listener);
|
|
2084
|
+
this.logger.info("upload.addEventListener", eventName, listener);
|
|
2085
|
+
return invoke();
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
})
|
|
2090
|
+
);
|
|
1818
2091
|
}
|
|
1819
2092
|
registerEvent(eventName, listener) {
|
|
1820
2093
|
const prevEvents = this.events.get(eventName) || [];
|
|
@@ -1822,17 +2095,44 @@ var XMLHttpRequestController = class {
|
|
|
1822
2095
|
this.events.set(eventName, nextEvents);
|
|
1823
2096
|
this.logger.info('registered event "%s"', eventName, listener);
|
|
1824
2097
|
}
|
|
2098
|
+
registerUploadEvent(eventName, listener) {
|
|
2099
|
+
const prevEvents = this.uploadEvents.get(eventName) || [];
|
|
2100
|
+
const nextEvents = prevEvents.concat(listener);
|
|
2101
|
+
this.uploadEvents.set(eventName, nextEvents);
|
|
2102
|
+
this.logger.info('registered upload event "%s"', eventName, listener);
|
|
2103
|
+
}
|
|
1825
2104
|
/**
|
|
1826
2105
|
* Responds to the current request with the given
|
|
1827
2106
|
* Fetch API `Response` instance.
|
|
1828
2107
|
*/
|
|
1829
|
-
respondWith(response) {
|
|
2108
|
+
async respondWith(response) {
|
|
2109
|
+
this[kIsRequestHandled] = true;
|
|
2110
|
+
if (this[kFetchRequest]) {
|
|
2111
|
+
const totalRequestBodyLength = await getBodyByteLength(
|
|
2112
|
+
this[kFetchRequest].clone()
|
|
2113
|
+
);
|
|
2114
|
+
this.trigger("loadstart", this.request.upload, {
|
|
2115
|
+
loaded: 0,
|
|
2116
|
+
total: totalRequestBodyLength
|
|
2117
|
+
});
|
|
2118
|
+
this.trigger("progress", this.request.upload, {
|
|
2119
|
+
loaded: totalRequestBodyLength,
|
|
2120
|
+
total: totalRequestBodyLength
|
|
2121
|
+
});
|
|
2122
|
+
this.trigger("load", this.request.upload, {
|
|
2123
|
+
loaded: totalRequestBodyLength,
|
|
2124
|
+
total: totalRequestBodyLength
|
|
2125
|
+
});
|
|
2126
|
+
this.trigger("loadend", this.request.upload, {
|
|
2127
|
+
loaded: totalRequestBodyLength,
|
|
2128
|
+
total: totalRequestBodyLength
|
|
2129
|
+
});
|
|
2130
|
+
}
|
|
1830
2131
|
this.logger.info(
|
|
1831
2132
|
"responding with a mocked response: %d %s",
|
|
1832
2133
|
response.status,
|
|
1833
2134
|
response.statusText
|
|
1834
2135
|
);
|
|
1835
|
-
define(this.request, IS_MOCKED_RESPONSE, true);
|
|
1836
2136
|
define(this.request, "status", response.status);
|
|
1837
2137
|
define(this.request, "statusText", response.statusText);
|
|
1838
2138
|
define(this.request, "responseURL", this.url.href);
|
|
@@ -1887,14 +2187,9 @@ var XMLHttpRequestController = class {
|
|
|
1887
2187
|
get: () => this.responseXML
|
|
1888
2188
|
}
|
|
1889
2189
|
});
|
|
1890
|
-
const totalResponseBodyLength =
|
|
1891
|
-
/**
|
|
1892
|
-
* @todo Infer the response body length from the response body.
|
|
1893
|
-
*/
|
|
1894
|
-
void 0
|
|
1895
|
-
);
|
|
2190
|
+
const totalResponseBodyLength = await getBodyByteLength(response.clone());
|
|
1896
2191
|
this.logger.info("calculated response body length", totalResponseBodyLength);
|
|
1897
|
-
this.trigger("loadstart", {
|
|
2192
|
+
this.trigger("loadstart", this.request, {
|
|
1898
2193
|
loaded: 0,
|
|
1899
2194
|
total: totalResponseBodyLength
|
|
1900
2195
|
});
|
|
@@ -1903,11 +2198,11 @@ var XMLHttpRequestController = class {
|
|
|
1903
2198
|
const finalizeResponse = () => {
|
|
1904
2199
|
this.logger.info("finalizing the mocked response...");
|
|
1905
2200
|
this.setReadyState(this.request.DONE);
|
|
1906
|
-
this.trigger("load", {
|
|
2201
|
+
this.trigger("load", this.request, {
|
|
1907
2202
|
loaded: this.responseBuffer.byteLength,
|
|
1908
2203
|
total: totalResponseBodyLength
|
|
1909
2204
|
});
|
|
1910
|
-
this.trigger("loadend", {
|
|
2205
|
+
this.trigger("loadend", this.request, {
|
|
1911
2206
|
loaded: this.responseBuffer.byteLength,
|
|
1912
2207
|
total: totalResponseBodyLength
|
|
1913
2208
|
});
|
|
@@ -1925,7 +2220,7 @@ var XMLHttpRequestController = class {
|
|
|
1925
2220
|
if (value) {
|
|
1926
2221
|
this.logger.info("read response body chunk:", value);
|
|
1927
2222
|
this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
|
|
1928
|
-
this.trigger("progress", {
|
|
2223
|
+
this.trigger("progress", this.request, {
|
|
1929
2224
|
loaded: this.responseBuffer.byteLength,
|
|
1930
2225
|
total: totalResponseBodyLength
|
|
1931
2226
|
});
|
|
@@ -1983,7 +2278,7 @@ var XMLHttpRequestController = class {
|
|
|
1983
2278
|
}
|
|
1984
2279
|
}
|
|
1985
2280
|
get responseText() {
|
|
1986
|
-
|
|
2281
|
+
invariant2(
|
|
1987
2282
|
this.request.responseType === "" || this.request.responseType === "text",
|
|
1988
2283
|
"InvalidStateError: The object is in invalid state."
|
|
1989
2284
|
);
|
|
@@ -1995,7 +2290,7 @@ var XMLHttpRequestController = class {
|
|
|
1995
2290
|
return responseText;
|
|
1996
2291
|
}
|
|
1997
2292
|
get responseXML() {
|
|
1998
|
-
|
|
2293
|
+
invariant2(
|
|
1999
2294
|
this.request.responseType === "" || this.request.responseType === "document",
|
|
2000
2295
|
"InvalidStateError: The object is in invalid state."
|
|
2001
2296
|
);
|
|
@@ -2018,10 +2313,11 @@ var XMLHttpRequestController = class {
|
|
|
2018
2313
|
return null;
|
|
2019
2314
|
}
|
|
2020
2315
|
errorWith(error2) {
|
|
2316
|
+
this[kIsRequestHandled] = true;
|
|
2021
2317
|
this.logger.info("responding with an error");
|
|
2022
2318
|
this.setReadyState(this.request.DONE);
|
|
2023
|
-
this.trigger("error");
|
|
2024
|
-
this.trigger("loadend");
|
|
2319
|
+
this.trigger("error", this.request);
|
|
2320
|
+
this.trigger("loadend", this.request);
|
|
2025
2321
|
}
|
|
2026
2322
|
/**
|
|
2027
2323
|
* Transitions this request's `readyState` to the given one.
|
|
@@ -2040,36 +2336,38 @@ var XMLHttpRequestController = class {
|
|
|
2040
2336
|
this.logger.info("set readyState to: %d", nextReadyState);
|
|
2041
2337
|
if (nextReadyState !== this.request.UNSENT) {
|
|
2042
2338
|
this.logger.info('triggerring "readystatechange" event...');
|
|
2043
|
-
this.trigger("readystatechange");
|
|
2339
|
+
this.trigger("readystatechange", this.request);
|
|
2044
2340
|
}
|
|
2045
2341
|
}
|
|
2046
2342
|
/**
|
|
2047
2343
|
* Triggers given event on the `XMLHttpRequest` instance.
|
|
2048
2344
|
*/
|
|
2049
|
-
trigger(eventName, options) {
|
|
2050
|
-
const callback =
|
|
2051
|
-
const event = createEvent(
|
|
2345
|
+
trigger(eventName, target, options) {
|
|
2346
|
+
const callback = target[`on${eventName}`];
|
|
2347
|
+
const event = createEvent(target, eventName, options);
|
|
2052
2348
|
this.logger.info('trigger "%s"', eventName, options || "");
|
|
2053
2349
|
if (typeof callback === "function") {
|
|
2054
2350
|
this.logger.info('found a direct "%s" callback, calling...', eventName);
|
|
2055
|
-
callback.call(
|
|
2351
|
+
callback.call(target, event);
|
|
2056
2352
|
}
|
|
2057
|
-
|
|
2353
|
+
const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
|
|
2354
|
+
for (const [registeredEventName, listeners] of events) {
|
|
2058
2355
|
if (registeredEventName === eventName) {
|
|
2059
2356
|
this.logger.info(
|
|
2060
2357
|
'found %d listener(s) for "%s" event, calling...',
|
|
2061
2358
|
listeners.length,
|
|
2062
2359
|
eventName
|
|
2063
2360
|
);
|
|
2064
|
-
listeners.forEach((listener) => listener.call(
|
|
2361
|
+
listeners.forEach((listener) => listener.call(target, event));
|
|
2065
2362
|
}
|
|
2066
2363
|
}
|
|
2067
2364
|
}
|
|
2068
2365
|
/**
|
|
2069
2366
|
* Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
|
|
2070
2367
|
*/
|
|
2071
|
-
toFetchApiRequest() {
|
|
2368
|
+
toFetchApiRequest(body) {
|
|
2072
2369
|
this.logger.info("converting request to a Fetch API Request...");
|
|
2370
|
+
const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
|
|
2073
2371
|
const fetchRequest = new Request(this.url.href, {
|
|
2074
2372
|
method: this.method,
|
|
2075
2373
|
headers: this.requestHeaders,
|
|
@@ -2077,7 +2375,7 @@ var XMLHttpRequestController = class {
|
|
|
2077
2375
|
* @see https://xhr.spec.whatwg.org/#cross-origin-credentials
|
|
2078
2376
|
*/
|
|
2079
2377
|
credentials: this.request.withCredentials ? "include" : "same-origin",
|
|
2080
|
-
body: ["GET", "HEAD"].includes(this.method) ? null :
|
|
2378
|
+
body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
|
|
2081
2379
|
});
|
|
2082
2380
|
const proxyHeaders = createProxy(fetchRequest.headers, {
|
|
2083
2381
|
methodCall: ([methodName, args], invoke) => {
|
|
@@ -2145,81 +2443,35 @@ function createXMLHttpRequestProxy({
|
|
|
2145
2443
|
logger
|
|
2146
2444
|
);
|
|
2147
2445
|
xhrRequestController.onRequest = async function({ request, requestId }) {
|
|
2148
|
-
const
|
|
2446
|
+
const controller = new RequestController(request);
|
|
2149
2447
|
this.logger.info("awaiting mocked response...");
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
)
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
this.logger.info("event.respondWith called with:", mockedResponse2);
|
|
2170
|
-
return mockedResponse2;
|
|
2171
|
-
});
|
|
2172
|
-
if (resolverResult.error) {
|
|
2173
|
-
this.logger.info(
|
|
2174
|
-
"request listener threw an exception, aborting request...",
|
|
2175
|
-
resolverResult.error
|
|
2176
|
-
);
|
|
2177
|
-
if (resolverResult.error instanceof Response) {
|
|
2178
|
-
if (isResponseError(resolverResult.error)) {
|
|
2179
|
-
xhrRequestController.errorWith(new TypeError("Network error"));
|
|
2180
|
-
} else {
|
|
2181
|
-
this.respondWith(resolverResult.error);
|
|
2182
|
-
}
|
|
2183
|
-
return;
|
|
2184
|
-
}
|
|
2185
|
-
if (emitter.listenerCount("unhandledException") > 0) {
|
|
2186
|
-
await emitAsync(emitter, "unhandledException", {
|
|
2187
|
-
error: resolverResult.error,
|
|
2188
|
-
request,
|
|
2189
|
-
requestId,
|
|
2190
|
-
controller: {
|
|
2191
|
-
respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
|
|
2192
|
-
errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
|
|
2193
|
-
}
|
|
2194
|
-
});
|
|
2195
|
-
if (originalRequest.readyState > XMLHttpRequest.OPENED) {
|
|
2196
|
-
return;
|
|
2448
|
+
this.logger.info(
|
|
2449
|
+
'emitting the "request" event for %s listener(s)...',
|
|
2450
|
+
emitter.listenerCount("request")
|
|
2451
|
+
);
|
|
2452
|
+
const isRequestHandled = await handleRequest2({
|
|
2453
|
+
request,
|
|
2454
|
+
requestId,
|
|
2455
|
+
controller,
|
|
2456
|
+
emitter,
|
|
2457
|
+
onResponse: async (response) => {
|
|
2458
|
+
await this.respondWith(response);
|
|
2459
|
+
},
|
|
2460
|
+
onRequestError: () => {
|
|
2461
|
+
this.errorWith(new TypeError("Network error"));
|
|
2462
|
+
},
|
|
2463
|
+
onError: (error2) => {
|
|
2464
|
+
this.logger.info("request errored!", { error: error2 });
|
|
2465
|
+
if (error2 instanceof Error) {
|
|
2466
|
+
this.errorWith(error2);
|
|
2197
2467
|
}
|
|
2198
2468
|
}
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
);
|
|
2202
|
-
return;
|
|
2203
|
-
}
|
|
2204
|
-
const mockedResponse = resolverResult.data;
|
|
2205
|
-
if (typeof mockedResponse !== "undefined") {
|
|
2469
|
+
});
|
|
2470
|
+
if (!isRequestHandled) {
|
|
2206
2471
|
this.logger.info(
|
|
2207
|
-
"
|
|
2208
|
-
mockedResponse.status,
|
|
2209
|
-
mockedResponse.statusText
|
|
2472
|
+
"no mocked response received, performing request as-is..."
|
|
2210
2473
|
);
|
|
2211
|
-
if (isResponseError(mockedResponse)) {
|
|
2212
|
-
this.logger.info(
|
|
2213
|
-
"received a network error response, rejecting the request promise..."
|
|
2214
|
-
);
|
|
2215
|
-
xhrRequestController.errorWith(new TypeError("Network error"));
|
|
2216
|
-
return;
|
|
2217
|
-
}
|
|
2218
|
-
return xhrRequestController.respondWith(mockedResponse);
|
|
2219
2474
|
}
|
|
2220
|
-
this.logger.info(
|
|
2221
|
-
"no mocked response received, performing request as-is..."
|
|
2222
|
-
);
|
|
2223
2475
|
};
|
|
2224
2476
|
xhrRequestController.onResponse = async function({
|
|
2225
2477
|
response,
|
|
@@ -2254,7 +2506,7 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
|
|
|
2254
2506
|
const logger = this.logger.extend("setup");
|
|
2255
2507
|
logger.info('patching "XMLHttpRequest" module...');
|
|
2256
2508
|
const PureXMLHttpRequest = globalThis.XMLHttpRequest;
|
|
2257
|
-
|
|
2509
|
+
invariant2(
|
|
2258
2510
|
!PureXMLHttpRequest[IS_PATCHED_MODULE],
|
|
2259
2511
|
'Failed to patch the "XMLHttpRequest" module: already patched.'
|
|
2260
2512
|
);
|
|
@@ -2287,15 +2539,15 @@ var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor;
|
|
|
2287
2539
|
XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
|
|
2288
2540
|
|
|
2289
2541
|
// src/browser/setupWorker/start/createFallbackRequestListener.ts
|
|
2290
|
-
import { handleRequest as
|
|
2542
|
+
import { handleRequest as handleRequest3 } from '../core/utils/handleRequest.mjs';
|
|
2291
2543
|
function createFallbackRequestListener(context, options) {
|
|
2292
2544
|
const interceptor = new BatchInterceptor({
|
|
2293
2545
|
name: "fallback",
|
|
2294
2546
|
interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()]
|
|
2295
2547
|
});
|
|
2296
|
-
interceptor.on("request", async ({ request, requestId }) => {
|
|
2548
|
+
interceptor.on("request", async ({ request, requestId, controller }) => {
|
|
2297
2549
|
const requestCloneForLogs = request.clone();
|
|
2298
|
-
const response = await
|
|
2550
|
+
const response = await handleRequest3(
|
|
2299
2551
|
request,
|
|
2300
2552
|
requestId,
|
|
2301
2553
|
context.getRequestHandlers(),
|
|
@@ -2316,7 +2568,7 @@ function createFallbackRequestListener(context, options) {
|
|
|
2316
2568
|
}
|
|
2317
2569
|
);
|
|
2318
2570
|
if (response) {
|
|
2319
|
-
|
|
2571
|
+
controller.respondWith(response);
|
|
2320
2572
|
}
|
|
2321
2573
|
});
|
|
2322
2574
|
interceptor.on(
|