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.js
CHANGED
|
@@ -397,7 +397,7 @@ You can also automate this process and make the worker script update automatical
|
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
399
|
|
|
400
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
400
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
|
|
401
401
|
var encoder = new TextEncoder();
|
|
402
402
|
function encodeBuffer(text) {
|
|
403
403
|
return encoder.encode(text);
|
|
@@ -413,7 +413,7 @@ function toArrayBuffer(array) {
|
|
|
413
413
|
);
|
|
414
414
|
}
|
|
415
415
|
|
|
416
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
416
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-XVPRNJO7.mjs
|
|
417
417
|
var IS_PATCHED_MODULE = Symbol("isPatchedModule");
|
|
418
418
|
function isPropertyAccessible(obj, key) {
|
|
419
419
|
try {
|
|
@@ -430,6 +430,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
|
|
|
430
430
|
205,
|
|
431
431
|
304
|
|
432
432
|
]);
|
|
433
|
+
var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
|
|
434
|
+
301,
|
|
435
|
+
302,
|
|
436
|
+
303,
|
|
437
|
+
307,
|
|
438
|
+
308
|
|
439
|
+
]);
|
|
433
440
|
function isResponseWithoutBody(status) {
|
|
434
441
|
return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
|
|
435
442
|
}
|
|
@@ -455,6 +462,90 @@ function isResponseError(response) {
|
|
|
455
462
|
return isPropertyAccessible(response, "type") && response.type === "error";
|
|
456
463
|
}
|
|
457
464
|
|
|
465
|
+
// node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
|
|
466
|
+
var POSITIONALS_EXP2 = /(%?)(%([sdijo]))/g;
|
|
467
|
+
function serializePositional2(positional, flag) {
|
|
468
|
+
switch (flag) {
|
|
469
|
+
case "s":
|
|
470
|
+
return positional;
|
|
471
|
+
case "d":
|
|
472
|
+
case "i":
|
|
473
|
+
return Number(positional);
|
|
474
|
+
case "j":
|
|
475
|
+
return JSON.stringify(positional);
|
|
476
|
+
case "o": {
|
|
477
|
+
if (typeof positional === "string") {
|
|
478
|
+
return positional;
|
|
479
|
+
}
|
|
480
|
+
const json = JSON.stringify(positional);
|
|
481
|
+
if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
|
|
482
|
+
return positional;
|
|
483
|
+
}
|
|
484
|
+
return json;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
function format2(message, ...positionals) {
|
|
489
|
+
if (positionals.length === 0) {
|
|
490
|
+
return message;
|
|
491
|
+
}
|
|
492
|
+
let positionalIndex = 0;
|
|
493
|
+
let formattedMessage = message.replace(
|
|
494
|
+
POSITIONALS_EXP2,
|
|
495
|
+
(match, isEscaped, _, flag) => {
|
|
496
|
+
const positional = positionals[positionalIndex];
|
|
497
|
+
const value = serializePositional2(positional, flag);
|
|
498
|
+
if (!isEscaped) {
|
|
499
|
+
positionalIndex++;
|
|
500
|
+
return value;
|
|
501
|
+
}
|
|
502
|
+
return match;
|
|
503
|
+
}
|
|
504
|
+
);
|
|
505
|
+
if (positionalIndex < positionals.length) {
|
|
506
|
+
formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
|
|
507
|
+
}
|
|
508
|
+
formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
|
|
509
|
+
return formattedMessage;
|
|
510
|
+
}
|
|
511
|
+
var STACK_FRAMES_TO_IGNORE2 = 2;
|
|
512
|
+
function cleanErrorStack2(error2) {
|
|
513
|
+
if (!error2.stack) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
const nextStack = error2.stack.split("\n");
|
|
517
|
+
nextStack.splice(1, STACK_FRAMES_TO_IGNORE2);
|
|
518
|
+
error2.stack = nextStack.join("\n");
|
|
519
|
+
}
|
|
520
|
+
var InvariantError2 = class extends Error {
|
|
521
|
+
constructor(message, ...positionals) {
|
|
522
|
+
super(message);
|
|
523
|
+
this.message = message;
|
|
524
|
+
this.name = "Invariant Violation";
|
|
525
|
+
this.message = format2(message, ...positionals);
|
|
526
|
+
cleanErrorStack2(this);
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
var invariant2 = (predicate, message, ...positionals) => {
|
|
530
|
+
if (!predicate) {
|
|
531
|
+
throw new InvariantError2(message, ...positionals);
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
invariant2.as = (ErrorConstructor, predicate, message, ...positionals) => {
|
|
535
|
+
if (!predicate) {
|
|
536
|
+
const formatMessage = positionals.length === 0 ? message : format2(message, ...positionals);
|
|
537
|
+
let error2;
|
|
538
|
+
try {
|
|
539
|
+
error2 = Reflect.construct(ErrorConstructor, [
|
|
540
|
+
formatMessage
|
|
541
|
+
]);
|
|
542
|
+
} catch (err) {
|
|
543
|
+
error2 = ErrorConstructor(formatMessage);
|
|
544
|
+
}
|
|
545
|
+
throw error2;
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
|
|
458
549
|
// node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
|
|
459
550
|
var __defProp2 = Object.defineProperty;
|
|
460
551
|
var __export2 = (target, all) => {
|
|
@@ -683,21 +774,21 @@ var PerformanceEntry = class {
|
|
|
683
774
|
var noop = () => void 0;
|
|
684
775
|
function log(message, ...positionals) {
|
|
685
776
|
if (IS_NODE) {
|
|
686
|
-
process.stdout.write(
|
|
777
|
+
process.stdout.write(format2(message, ...positionals) + "\n");
|
|
687
778
|
return;
|
|
688
779
|
}
|
|
689
780
|
console.log(message, ...positionals);
|
|
690
781
|
}
|
|
691
782
|
function warn(message, ...positionals) {
|
|
692
783
|
if (IS_NODE) {
|
|
693
|
-
process.stderr.write(
|
|
784
|
+
process.stderr.write(format2(message, ...positionals) + "\n");
|
|
694
785
|
return;
|
|
695
786
|
}
|
|
696
787
|
console.warn(message, ...positionals);
|
|
697
788
|
}
|
|
698
789
|
function error(message, ...positionals) {
|
|
699
790
|
if (IS_NODE) {
|
|
700
|
-
process.stderr.write(
|
|
791
|
+
process.stderr.write(format2(message, ...positionals) + "\n");
|
|
701
792
|
return;
|
|
702
793
|
}
|
|
703
794
|
console.error(message, ...positionals);
|
|
@@ -892,7 +983,7 @@ var _Emitter = class {
|
|
|
892
983
|
var Emitter = _Emitter;
|
|
893
984
|
Emitter.defaultMaxListeners = 10;
|
|
894
985
|
|
|
895
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
986
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
|
|
896
987
|
var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
|
|
897
988
|
function getGlobalSymbol(symbol) {
|
|
898
989
|
return (
|
|
@@ -1040,7 +1131,7 @@ function createRequestId() {
|
|
|
1040
1131
|
return Math.random().toString(16).slice(2);
|
|
1041
1132
|
}
|
|
1042
1133
|
|
|
1043
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1134
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
|
|
1044
1135
|
var BatchInterceptor = class extends Interceptor {
|
|
1045
1136
|
constructor(options) {
|
|
1046
1137
|
BatchInterceptor.symbol = Symbol(options.name);
|
|
@@ -1324,34 +1415,58 @@ var DeferredPromise = class extends Promise {
|
|
|
1324
1415
|
}
|
|
1325
1416
|
};
|
|
1326
1417
|
|
|
1327
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1418
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
|
|
1419
|
+
var InterceptorError = class extends Error {
|
|
1420
|
+
constructor(message) {
|
|
1421
|
+
super(message);
|
|
1422
|
+
this.name = "InterceptorError";
|
|
1423
|
+
Object.setPrototypeOf(this, InterceptorError.prototype);
|
|
1424
|
+
}
|
|
1425
|
+
};
|
|
1426
|
+
var kRequestHandled = Symbol("kRequestHandled");
|
|
1427
|
+
var kResponsePromise = Symbol("kResponsePromise");
|
|
1328
1428
|
var RequestController = class {
|
|
1329
1429
|
constructor(request) {
|
|
1330
1430
|
this.request = request;
|
|
1331
|
-
this
|
|
1431
|
+
this[kRequestHandled] = false;
|
|
1432
|
+
this[kResponsePromise] = new DeferredPromise();
|
|
1332
1433
|
}
|
|
1434
|
+
/**
|
|
1435
|
+
* Respond to this request with the given `Response` instance.
|
|
1436
|
+
* @example
|
|
1437
|
+
* controller.respondWith(new Response())
|
|
1438
|
+
* controller.respondWith(Response.json({ id }))
|
|
1439
|
+
* controller.respondWith(Response.error())
|
|
1440
|
+
*/
|
|
1333
1441
|
respondWith(response) {
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1442
|
+
invariant2.as(
|
|
1443
|
+
InterceptorError,
|
|
1444
|
+
!this[kRequestHandled],
|
|
1445
|
+
'Failed to respond to the "%s %s" request: the "request" event has already been handled.',
|
|
1337
1446
|
this.request.method,
|
|
1338
1447
|
this.request.url
|
|
1339
1448
|
);
|
|
1340
|
-
this
|
|
1449
|
+
this[kRequestHandled] = true;
|
|
1450
|
+
this[kResponsePromise].resolve(response);
|
|
1451
|
+
}
|
|
1452
|
+
/**
|
|
1453
|
+
* Error this request with the given error.
|
|
1454
|
+
* @example
|
|
1455
|
+
* controller.errorWith()
|
|
1456
|
+
* controller.errorWith(new Error('Oops!'))
|
|
1457
|
+
*/
|
|
1458
|
+
errorWith(error2) {
|
|
1459
|
+
invariant2.as(
|
|
1460
|
+
InterceptorError,
|
|
1461
|
+
!this[kRequestHandled],
|
|
1462
|
+
'Failed to error the "%s %s" request: the "request" event has already been handled.',
|
|
1463
|
+
this.request.method,
|
|
1464
|
+
this.request.url
|
|
1465
|
+
);
|
|
1466
|
+
this[kRequestHandled] = true;
|
|
1467
|
+
this[kResponsePromise].resolve(error2);
|
|
1341
1468
|
}
|
|
1342
1469
|
};
|
|
1343
|
-
function toInteractiveRequest(request) {
|
|
1344
|
-
const requestController = new RequestController(request);
|
|
1345
|
-
Reflect.set(
|
|
1346
|
-
request,
|
|
1347
|
-
"respondWith",
|
|
1348
|
-
requestController.respondWith.bind(requestController)
|
|
1349
|
-
);
|
|
1350
|
-
return {
|
|
1351
|
-
interactiveRequest: request,
|
|
1352
|
-
requestController
|
|
1353
|
-
};
|
|
1354
|
-
}
|
|
1355
1470
|
async function emitAsync(emitter, eventName, ...data) {
|
|
1356
1471
|
const listners = emitter.listeners(eventName);
|
|
1357
1472
|
if (listners.length === 0) {
|
|
@@ -1361,8 +1476,114 @@ async function emitAsync(emitter, eventName, ...data) {
|
|
|
1361
1476
|
await listener.apply(emitter, data);
|
|
1362
1477
|
}
|
|
1363
1478
|
}
|
|
1479
|
+
function isNodeLikeError(error2) {
|
|
1480
|
+
if (error2 == null) {
|
|
1481
|
+
return false;
|
|
1482
|
+
}
|
|
1483
|
+
if (!(error2 instanceof Error)) {
|
|
1484
|
+
return false;
|
|
1485
|
+
}
|
|
1486
|
+
return "code" in error2 && "errno" in error2;
|
|
1487
|
+
}
|
|
1488
|
+
async function handleRequest2(options) {
|
|
1489
|
+
const handleResponse = async (response) => {
|
|
1490
|
+
if (response instanceof Error) {
|
|
1491
|
+
options.onError(response);
|
|
1492
|
+
} else if (isResponseError(response)) {
|
|
1493
|
+
options.onRequestError(response);
|
|
1494
|
+
} else {
|
|
1495
|
+
await options.onResponse(response);
|
|
1496
|
+
}
|
|
1497
|
+
return true;
|
|
1498
|
+
};
|
|
1499
|
+
const handleResponseError = async (error2) => {
|
|
1500
|
+
if (error2 instanceof InterceptorError) {
|
|
1501
|
+
throw result.error;
|
|
1502
|
+
}
|
|
1503
|
+
if (isNodeLikeError(error2)) {
|
|
1504
|
+
options.onError(error2);
|
|
1505
|
+
return true;
|
|
1506
|
+
}
|
|
1507
|
+
if (error2 instanceof Response) {
|
|
1508
|
+
return await handleResponse(error2);
|
|
1509
|
+
}
|
|
1510
|
+
return false;
|
|
1511
|
+
};
|
|
1512
|
+
options.emitter.once("request", ({ requestId: pendingRequestId }) => {
|
|
1513
|
+
if (pendingRequestId !== options.requestId) {
|
|
1514
|
+
return;
|
|
1515
|
+
}
|
|
1516
|
+
if (options.controller[kResponsePromise].state === "pending") {
|
|
1517
|
+
options.controller[kResponsePromise].resolve(void 0);
|
|
1518
|
+
}
|
|
1519
|
+
});
|
|
1520
|
+
const requestAbortPromise = new DeferredPromise();
|
|
1521
|
+
if (options.request.signal) {
|
|
1522
|
+
options.request.signal.addEventListener(
|
|
1523
|
+
"abort",
|
|
1524
|
+
() => {
|
|
1525
|
+
requestAbortPromise.reject(options.request.signal.reason);
|
|
1526
|
+
},
|
|
1527
|
+
{ once: true }
|
|
1528
|
+
);
|
|
1529
|
+
}
|
|
1530
|
+
const result = await until(async () => {
|
|
1531
|
+
const requestListtenersPromise = emitAsync(options.emitter, "request", {
|
|
1532
|
+
requestId: options.requestId,
|
|
1533
|
+
request: options.request,
|
|
1534
|
+
controller: options.controller
|
|
1535
|
+
});
|
|
1536
|
+
await Promise.race([
|
|
1537
|
+
// Short-circuit the request handling promise if the request gets aborted.
|
|
1538
|
+
requestAbortPromise,
|
|
1539
|
+
requestListtenersPromise,
|
|
1540
|
+
options.controller[kResponsePromise]
|
|
1541
|
+
]);
|
|
1542
|
+
const mockedResponse = await options.controller[kResponsePromise];
|
|
1543
|
+
return mockedResponse;
|
|
1544
|
+
});
|
|
1545
|
+
if (requestAbortPromise.state === "rejected") {
|
|
1546
|
+
options.onError(requestAbortPromise.rejectionReason);
|
|
1547
|
+
return true;
|
|
1548
|
+
}
|
|
1549
|
+
if (result.error) {
|
|
1550
|
+
if (await handleResponseError(result.error)) {
|
|
1551
|
+
return true;
|
|
1552
|
+
}
|
|
1553
|
+
if (options.emitter.listenerCount("unhandledException") > 0) {
|
|
1554
|
+
const unhandledExceptionController = new RequestController(
|
|
1555
|
+
options.request
|
|
1556
|
+
);
|
|
1557
|
+
await emitAsync(options.emitter, "unhandledException", {
|
|
1558
|
+
error: result.error,
|
|
1559
|
+
request: options.request,
|
|
1560
|
+
requestId: options.requestId,
|
|
1561
|
+
controller: unhandledExceptionController
|
|
1562
|
+
}).then(() => {
|
|
1563
|
+
if (unhandledExceptionController[kResponsePromise].state === "pending") {
|
|
1564
|
+
unhandledExceptionController[kResponsePromise].resolve(void 0);
|
|
1565
|
+
}
|
|
1566
|
+
});
|
|
1567
|
+
const nextResult = await until(
|
|
1568
|
+
() => unhandledExceptionController[kResponsePromise]
|
|
1569
|
+
);
|
|
1570
|
+
if (nextResult.error) {
|
|
1571
|
+
return handleResponseError(nextResult.error);
|
|
1572
|
+
}
|
|
1573
|
+
if (nextResult.data) {
|
|
1574
|
+
return handleResponse(nextResult.data);
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
options.onResponse(createServerErrorResponse(result.error));
|
|
1578
|
+
return true;
|
|
1579
|
+
}
|
|
1580
|
+
if (result.data) {
|
|
1581
|
+
return handleResponse(result.data);
|
|
1582
|
+
}
|
|
1583
|
+
return false;
|
|
1584
|
+
}
|
|
1364
1585
|
|
|
1365
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1586
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-DZCGGRSJ.mjs
|
|
1366
1587
|
function canParseUrl(url) {
|
|
1367
1588
|
try {
|
|
1368
1589
|
new URL(url);
|
|
@@ -1371,6 +1592,72 @@ function canParseUrl(url) {
|
|
|
1371
1592
|
return false;
|
|
1372
1593
|
}
|
|
1373
1594
|
}
|
|
1595
|
+
function createNetworkError(cause) {
|
|
1596
|
+
return Object.assign(new TypeError("Failed to fetch"), {
|
|
1597
|
+
cause
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
var REQUEST_BODY_HEADERS = [
|
|
1601
|
+
"content-encoding",
|
|
1602
|
+
"content-language",
|
|
1603
|
+
"content-location",
|
|
1604
|
+
"content-type",
|
|
1605
|
+
"content-length"
|
|
1606
|
+
];
|
|
1607
|
+
var kRedirectCount = Symbol("kRedirectCount");
|
|
1608
|
+
async function followFetchRedirect(request, response) {
|
|
1609
|
+
if (response.status !== 303 && request.body != null) {
|
|
1610
|
+
return Promise.reject(createNetworkError());
|
|
1611
|
+
}
|
|
1612
|
+
const requestUrl = new URL(request.url);
|
|
1613
|
+
let locationUrl;
|
|
1614
|
+
try {
|
|
1615
|
+
locationUrl = new URL(response.headers.get("location"));
|
|
1616
|
+
} catch (error2) {
|
|
1617
|
+
return Promise.reject(createNetworkError(error2));
|
|
1618
|
+
}
|
|
1619
|
+
if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
|
|
1620
|
+
return Promise.reject(
|
|
1621
|
+
createNetworkError("URL scheme must be a HTTP(S) scheme")
|
|
1622
|
+
);
|
|
1623
|
+
}
|
|
1624
|
+
if (Reflect.get(request, kRedirectCount) > 20) {
|
|
1625
|
+
return Promise.reject(createNetworkError("redirect count exceeded"));
|
|
1626
|
+
}
|
|
1627
|
+
Object.defineProperty(request, kRedirectCount, {
|
|
1628
|
+
value: (Reflect.get(request, kRedirectCount) || 0) + 1
|
|
1629
|
+
});
|
|
1630
|
+
if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
|
|
1631
|
+
return Promise.reject(
|
|
1632
|
+
createNetworkError('cross origin not allowed for request mode "cors"')
|
|
1633
|
+
);
|
|
1634
|
+
}
|
|
1635
|
+
const requestInit = {};
|
|
1636
|
+
if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
|
|
1637
|
+
requestInit.method = "GET";
|
|
1638
|
+
requestInit.body = null;
|
|
1639
|
+
REQUEST_BODY_HEADERS.forEach((headerName) => {
|
|
1640
|
+
request.headers.delete(headerName);
|
|
1641
|
+
});
|
|
1642
|
+
}
|
|
1643
|
+
if (!sameOrigin(requestUrl, locationUrl)) {
|
|
1644
|
+
request.headers.delete("authorization");
|
|
1645
|
+
request.headers.delete("proxy-authorization");
|
|
1646
|
+
request.headers.delete("cookie");
|
|
1647
|
+
request.headers.delete("host");
|
|
1648
|
+
}
|
|
1649
|
+
requestInit.headers = request.headers;
|
|
1650
|
+
return fetch(new Request(locationUrl, requestInit));
|
|
1651
|
+
}
|
|
1652
|
+
function sameOrigin(left, right) {
|
|
1653
|
+
if (left.origin === right.origin && left.origin === "null") {
|
|
1654
|
+
return true;
|
|
1655
|
+
}
|
|
1656
|
+
if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
|
|
1657
|
+
return true;
|
|
1658
|
+
}
|
|
1659
|
+
return false;
|
|
1660
|
+
}
|
|
1374
1661
|
var _FetchInterceptor = class extends Interceptor {
|
|
1375
1662
|
constructor() {
|
|
1376
1663
|
super(_FetchInterceptor.symbol);
|
|
@@ -1380,136 +1667,84 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1380
1667
|
}
|
|
1381
1668
|
async setup() {
|
|
1382
1669
|
const pureFetch = globalThis.fetch;
|
|
1383
|
-
|
|
1670
|
+
invariant2(
|
|
1384
1671
|
!pureFetch[IS_PATCHED_MODULE],
|
|
1385
1672
|
'Failed to patch the "fetch" module: already patched.'
|
|
1386
1673
|
);
|
|
1387
1674
|
globalThis.fetch = async (input, init) => {
|
|
1388
|
-
var _a;
|
|
1389
1675
|
const requestId = createRequestId();
|
|
1390
1676
|
const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
|
|
1391
1677
|
const request = new Request(resolvedInput, init);
|
|
1678
|
+
const responsePromise = new DeferredPromise();
|
|
1679
|
+
const controller = new RequestController(request);
|
|
1392
1680
|
this.logger.info("[%s] %s", request.method, request.url);
|
|
1393
|
-
|
|
1681
|
+
this.logger.info("awaiting for the mocked response...");
|
|
1394
1682
|
this.logger.info(
|
|
1395
|
-
'emitting the "request" event for %
|
|
1683
|
+
'emitting the "request" event for %s listener(s)...',
|
|
1396
1684
|
this.emitter.listenerCount("request")
|
|
1397
1685
|
);
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
this.logger.info("awaiting for the mocked response...");
|
|
1407
|
-
const signal = interactiveRequest.signal;
|
|
1408
|
-
const requestAborted = new DeferredPromise();
|
|
1409
|
-
if (signal) {
|
|
1410
|
-
signal.addEventListener(
|
|
1411
|
-
"abort",
|
|
1412
|
-
() => {
|
|
1413
|
-
requestAborted.reject(signal.reason);
|
|
1414
|
-
},
|
|
1415
|
-
{ once: true }
|
|
1416
|
-
);
|
|
1417
|
-
}
|
|
1418
|
-
const responsePromise = new DeferredPromise();
|
|
1419
|
-
const respondWith = (response) => {
|
|
1420
|
-
this.logger.info("responding with a mock response:", response);
|
|
1421
|
-
if (this.emitter.listenerCount("response") > 0) {
|
|
1422
|
-
this.logger.info('emitting the "response" event...');
|
|
1423
|
-
const responseClone = response.clone();
|
|
1424
|
-
this.emitter.emit("response", {
|
|
1425
|
-
response: responseClone,
|
|
1426
|
-
isMockedResponse: true,
|
|
1427
|
-
request: interactiveRequest,
|
|
1428
|
-
requestId
|
|
1429
|
-
});
|
|
1430
|
-
}
|
|
1431
|
-
Object.defineProperty(response, "url", {
|
|
1432
|
-
writable: false,
|
|
1433
|
-
enumerable: true,
|
|
1434
|
-
configurable: false,
|
|
1435
|
-
value: request.url
|
|
1436
|
-
});
|
|
1437
|
-
responsePromise.resolve(response);
|
|
1438
|
-
};
|
|
1439
|
-
const errorWith = (reason) => {
|
|
1440
|
-
responsePromise.reject(reason);
|
|
1441
|
-
};
|
|
1442
|
-
const resolverResult = await until(
|
|
1443
|
-
async () => {
|
|
1444
|
-
const listenersFinished = emitAsync(this.emitter, "request", {
|
|
1445
|
-
request: interactiveRequest,
|
|
1446
|
-
requestId
|
|
1686
|
+
const isRequestHandled = await handleRequest2({
|
|
1687
|
+
request,
|
|
1688
|
+
requestId,
|
|
1689
|
+
emitter: this.emitter,
|
|
1690
|
+
controller,
|
|
1691
|
+
onResponse: async (response) => {
|
|
1692
|
+
this.logger.info("received mocked response!", {
|
|
1693
|
+
response
|
|
1447
1694
|
});
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
this.logger.info(
|
|
1464
|
-
"request has been aborted:",
|
|
1465
|
-
requestAborted.rejectionReason
|
|
1466
|
-
);
|
|
1467
|
-
responsePromise.reject(requestAborted.rejectionReason);
|
|
1468
|
-
return responsePromise;
|
|
1469
|
-
}
|
|
1470
|
-
if (resolverResult.error) {
|
|
1471
|
-
this.logger.info(
|
|
1472
|
-
"request listerner threw an error:",
|
|
1473
|
-
resolverResult.error
|
|
1474
|
-
);
|
|
1475
|
-
if (resolverResult.error instanceof Response) {
|
|
1476
|
-
if (isResponseError(resolverResult.error)) {
|
|
1477
|
-
errorWith(createNetworkError(resolverResult.error));
|
|
1478
|
-
} else {
|
|
1479
|
-
respondWith(resolverResult.error);
|
|
1480
|
-
}
|
|
1481
|
-
}
|
|
1482
|
-
if (this.emitter.listenerCount("unhandledException") > 0) {
|
|
1483
|
-
await emitAsync(this.emitter, "unhandledException", {
|
|
1484
|
-
error: resolverResult.error,
|
|
1485
|
-
request,
|
|
1486
|
-
requestId,
|
|
1487
|
-
controller: {
|
|
1488
|
-
respondWith,
|
|
1489
|
-
errorWith
|
|
1695
|
+
if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
|
|
1696
|
+
if (request.redirect === "error") {
|
|
1697
|
+
responsePromise.reject(createNetworkError("unexpected redirect"));
|
|
1698
|
+
return;
|
|
1699
|
+
}
|
|
1700
|
+
if (request.redirect === "follow") {
|
|
1701
|
+
followFetchRedirect(request, response).then(
|
|
1702
|
+
(response2) => {
|
|
1703
|
+
responsePromise.resolve(response2);
|
|
1704
|
+
},
|
|
1705
|
+
(reason) => {
|
|
1706
|
+
responsePromise.reject(reason);
|
|
1707
|
+
}
|
|
1708
|
+
);
|
|
1709
|
+
return;
|
|
1490
1710
|
}
|
|
1491
|
-
});
|
|
1492
|
-
if (responsePromise.state !== "pending") {
|
|
1493
|
-
return responsePromise;
|
|
1494
1711
|
}
|
|
1712
|
+
if (this.emitter.listenerCount("response") > 0) {
|
|
1713
|
+
this.logger.info('emitting the "response" event...');
|
|
1714
|
+
await emitAsync(this.emitter, "response", {
|
|
1715
|
+
// Clone the mocked response for the "response" event listener.
|
|
1716
|
+
// This way, the listener can read the response and not lock its body
|
|
1717
|
+
// for the actual fetch consumer.
|
|
1718
|
+
response: response.clone(),
|
|
1719
|
+
isMockedResponse: true,
|
|
1720
|
+
request,
|
|
1721
|
+
requestId
|
|
1722
|
+
});
|
|
1723
|
+
}
|
|
1724
|
+
Object.defineProperty(response, "url", {
|
|
1725
|
+
writable: false,
|
|
1726
|
+
enumerable: true,
|
|
1727
|
+
configurable: false,
|
|
1728
|
+
value: request.url
|
|
1729
|
+
});
|
|
1730
|
+
responsePromise.resolve(response);
|
|
1731
|
+
},
|
|
1732
|
+
onRequestError: (response) => {
|
|
1733
|
+
this.logger.info("request has errored!", { response });
|
|
1734
|
+
responsePromise.reject(createNetworkError(response));
|
|
1735
|
+
},
|
|
1736
|
+
onError: (error2) => {
|
|
1737
|
+
this.logger.info("request has been aborted!", { error: error2 });
|
|
1738
|
+
responsePromise.reject(error2);
|
|
1495
1739
|
}
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
const mockedResponse = resolverResult.data;
|
|
1500
|
-
if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
|
|
1501
|
-
this.logger.info("received mocked response:", mockedResponse);
|
|
1502
|
-
if (isResponseError(mockedResponse)) {
|
|
1503
|
-
this.logger.info(
|
|
1504
|
-
"received a network error response, rejecting the request promise..."
|
|
1505
|
-
);
|
|
1506
|
-
errorWith(createNetworkError(mockedResponse));
|
|
1507
|
-
} else {
|
|
1508
|
-
respondWith(mockedResponse);
|
|
1509
|
-
}
|
|
1740
|
+
});
|
|
1741
|
+
if (isRequestHandled) {
|
|
1742
|
+
this.logger.info("request has been handled, returning mock promise...");
|
|
1510
1743
|
return responsePromise;
|
|
1511
1744
|
}
|
|
1512
|
-
this.logger.info(
|
|
1745
|
+
this.logger.info(
|
|
1746
|
+
"no mocked response received, performing request as-is..."
|
|
1747
|
+
);
|
|
1513
1748
|
return pureFetch(request).then((response) => {
|
|
1514
1749
|
this.logger.info("original fetch performed", response);
|
|
1515
1750
|
if (this.emitter.listenerCount("response") > 0) {
|
|
@@ -1518,7 +1753,7 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1518
1753
|
this.emitter.emit("response", {
|
|
1519
1754
|
response: responseClone,
|
|
1520
1755
|
isMockedResponse: false,
|
|
1521
|
-
request
|
|
1756
|
+
request,
|
|
1522
1757
|
requestId
|
|
1523
1758
|
});
|
|
1524
1759
|
}
|
|
@@ -1544,13 +1779,8 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
1544
1779
|
};
|
|
1545
1780
|
var FetchInterceptor = _FetchInterceptor;
|
|
1546
1781
|
FetchInterceptor.symbol = Symbol("fetch");
|
|
1547
|
-
function createNetworkError(cause) {
|
|
1548
|
-
return Object.assign(new TypeError("Failed to fetch"), {
|
|
1549
|
-
cause
|
|
1550
|
-
});
|
|
1551
|
-
}
|
|
1552
1782
|
|
|
1553
|
-
// node_modules/.pnpm/@mswjs+interceptors@0.
|
|
1783
|
+
// node_modules/.pnpm/@mswjs+interceptors@0.35.0/node_modules/@mswjs/interceptors/lib/browser/chunk-PRBA3ES4.mjs
|
|
1554
1784
|
function concatArrayBuffer(left, right) {
|
|
1555
1785
|
const result = new Uint8Array(left.byteLength + right.byteLength);
|
|
1556
1786
|
result.set(left, 0);
|
|
@@ -1559,10 +1789,10 @@ function concatArrayBuffer(left, right) {
|
|
|
1559
1789
|
}
|
|
1560
1790
|
var EventPolyfill = class {
|
|
1561
1791
|
constructor(type, options) {
|
|
1562
|
-
this.AT_TARGET = 0;
|
|
1563
|
-
this.BUBBLING_PHASE = 0;
|
|
1564
|
-
this.CAPTURING_PHASE = 0;
|
|
1565
1792
|
this.NONE = 0;
|
|
1793
|
+
this.CAPTURING_PHASE = 1;
|
|
1794
|
+
this.AT_TARGET = 2;
|
|
1795
|
+
this.BUBBLING_PHASE = 3;
|
|
1566
1796
|
this.type = "";
|
|
1567
1797
|
this.srcElement = null;
|
|
1568
1798
|
this.currentTarget = null;
|
|
@@ -1735,15 +1965,26 @@ function createHeadersFromXMLHttpReqestHeaders(headersString) {
|
|
|
1735
1965
|
}
|
|
1736
1966
|
return headers;
|
|
1737
1967
|
}
|
|
1738
|
-
|
|
1968
|
+
async function getBodyByteLength(input) {
|
|
1969
|
+
const explicitContentLength = input.headers.get("content-length");
|
|
1970
|
+
if (explicitContentLength != null && explicitContentLength !== "") {
|
|
1971
|
+
return Number(explicitContentLength);
|
|
1972
|
+
}
|
|
1973
|
+
const buffer = await input.arrayBuffer();
|
|
1974
|
+
return buffer.byteLength;
|
|
1975
|
+
}
|
|
1976
|
+
var kIsRequestHandled = Symbol("kIsRequestHandled");
|
|
1739
1977
|
var IS_NODE2 = isNodeProcess();
|
|
1978
|
+
var kFetchRequest = Symbol("kFetchRequest");
|
|
1740
1979
|
var XMLHttpRequestController = class {
|
|
1741
1980
|
constructor(initialRequest, logger) {
|
|
1742
1981
|
this.initialRequest = initialRequest;
|
|
1743
1982
|
this.logger = logger;
|
|
1744
1983
|
this.method = "GET";
|
|
1745
1984
|
this.url = null;
|
|
1985
|
+
this[kIsRequestHandled] = false;
|
|
1746
1986
|
this.events = /* @__PURE__ */ new Map();
|
|
1987
|
+
this.uploadEvents = /* @__PURE__ */ new Map();
|
|
1747
1988
|
this.requestId = createRequestId();
|
|
1748
1989
|
this.requestHeaders = new Headers();
|
|
1749
1990
|
this.responseBuffer = new Uint8Array();
|
|
@@ -1792,9 +2033,6 @@ var XMLHttpRequestController = class {
|
|
|
1792
2033
|
}
|
|
1793
2034
|
case "send": {
|
|
1794
2035
|
const [body] = args;
|
|
1795
|
-
if (body != null) {
|
|
1796
|
-
this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
|
1797
|
-
}
|
|
1798
2036
|
this.request.addEventListener("load", () => {
|
|
1799
2037
|
if (typeof this.onResponse !== "undefined") {
|
|
1800
2038
|
const fetchResponse = createResponse(
|
|
@@ -1808,19 +2046,21 @@ var XMLHttpRequestController = class {
|
|
|
1808
2046
|
);
|
|
1809
2047
|
this.onResponse.call(this, {
|
|
1810
2048
|
response: fetchResponse,
|
|
1811
|
-
isMockedResponse:
|
|
2049
|
+
isMockedResponse: this[kIsRequestHandled],
|
|
1812
2050
|
request: fetchRequest,
|
|
1813
2051
|
requestId: this.requestId
|
|
1814
2052
|
});
|
|
1815
2053
|
}
|
|
1816
2054
|
});
|
|
1817
|
-
const
|
|
2055
|
+
const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
|
|
2056
|
+
const fetchRequest = this.toFetchApiRequest(requestBody);
|
|
2057
|
+
this[kFetchRequest] = fetchRequest;
|
|
1818
2058
|
const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
|
|
1819
2059
|
request: fetchRequest,
|
|
1820
2060
|
requestId: this.requestId
|
|
1821
2061
|
})) || Promise.resolve();
|
|
1822
2062
|
onceRequestSettled.finally(() => {
|
|
1823
|
-
if (this
|
|
2063
|
+
if (!this[kIsRequestHandled]) {
|
|
1824
2064
|
this.logger.info(
|
|
1825
2065
|
"request callback settled but request has not been handled (readystate %d), performing as-is...",
|
|
1826
2066
|
this.request.readyState
|
|
@@ -1842,6 +2082,39 @@ var XMLHttpRequestController = class {
|
|
|
1842
2082
|
}
|
|
1843
2083
|
}
|
|
1844
2084
|
});
|
|
2085
|
+
define(
|
|
2086
|
+
this.request,
|
|
2087
|
+
"upload",
|
|
2088
|
+
createProxy(this.request.upload, {
|
|
2089
|
+
setProperty: ([propertyName, nextValue], invoke) => {
|
|
2090
|
+
switch (propertyName) {
|
|
2091
|
+
case "onloadstart":
|
|
2092
|
+
case "onprogress":
|
|
2093
|
+
case "onaboart":
|
|
2094
|
+
case "onerror":
|
|
2095
|
+
case "onload":
|
|
2096
|
+
case "ontimeout":
|
|
2097
|
+
case "onloadend": {
|
|
2098
|
+
const eventName = propertyName.slice(
|
|
2099
|
+
2
|
|
2100
|
+
);
|
|
2101
|
+
this.registerUploadEvent(eventName, nextValue);
|
|
2102
|
+
}
|
|
2103
|
+
}
|
|
2104
|
+
return invoke();
|
|
2105
|
+
},
|
|
2106
|
+
methodCall: ([methodName, args], invoke) => {
|
|
2107
|
+
switch (methodName) {
|
|
2108
|
+
case "addEventListener": {
|
|
2109
|
+
const [eventName, listener] = args;
|
|
2110
|
+
this.registerUploadEvent(eventName, listener);
|
|
2111
|
+
this.logger.info("upload.addEventListener", eventName, listener);
|
|
2112
|
+
return invoke();
|
|
2113
|
+
}
|
|
2114
|
+
}
|
|
2115
|
+
}
|
|
2116
|
+
})
|
|
2117
|
+
);
|
|
1845
2118
|
}
|
|
1846
2119
|
registerEvent(eventName, listener) {
|
|
1847
2120
|
const prevEvents = this.events.get(eventName) || [];
|
|
@@ -1849,17 +2122,44 @@ var XMLHttpRequestController = class {
|
|
|
1849
2122
|
this.events.set(eventName, nextEvents);
|
|
1850
2123
|
this.logger.info('registered event "%s"', eventName, listener);
|
|
1851
2124
|
}
|
|
2125
|
+
registerUploadEvent(eventName, listener) {
|
|
2126
|
+
const prevEvents = this.uploadEvents.get(eventName) || [];
|
|
2127
|
+
const nextEvents = prevEvents.concat(listener);
|
|
2128
|
+
this.uploadEvents.set(eventName, nextEvents);
|
|
2129
|
+
this.logger.info('registered upload event "%s"', eventName, listener);
|
|
2130
|
+
}
|
|
1852
2131
|
/**
|
|
1853
2132
|
* Responds to the current request with the given
|
|
1854
2133
|
* Fetch API `Response` instance.
|
|
1855
2134
|
*/
|
|
1856
|
-
respondWith(response) {
|
|
2135
|
+
async respondWith(response) {
|
|
2136
|
+
this[kIsRequestHandled] = true;
|
|
2137
|
+
if (this[kFetchRequest]) {
|
|
2138
|
+
const totalRequestBodyLength = await getBodyByteLength(
|
|
2139
|
+
this[kFetchRequest].clone()
|
|
2140
|
+
);
|
|
2141
|
+
this.trigger("loadstart", this.request.upload, {
|
|
2142
|
+
loaded: 0,
|
|
2143
|
+
total: totalRequestBodyLength
|
|
2144
|
+
});
|
|
2145
|
+
this.trigger("progress", this.request.upload, {
|
|
2146
|
+
loaded: totalRequestBodyLength,
|
|
2147
|
+
total: totalRequestBodyLength
|
|
2148
|
+
});
|
|
2149
|
+
this.trigger("load", this.request.upload, {
|
|
2150
|
+
loaded: totalRequestBodyLength,
|
|
2151
|
+
total: totalRequestBodyLength
|
|
2152
|
+
});
|
|
2153
|
+
this.trigger("loadend", this.request.upload, {
|
|
2154
|
+
loaded: totalRequestBodyLength,
|
|
2155
|
+
total: totalRequestBodyLength
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
1857
2158
|
this.logger.info(
|
|
1858
2159
|
"responding with a mocked response: %d %s",
|
|
1859
2160
|
response.status,
|
|
1860
2161
|
response.statusText
|
|
1861
2162
|
);
|
|
1862
|
-
define(this.request, IS_MOCKED_RESPONSE, true);
|
|
1863
2163
|
define(this.request, "status", response.status);
|
|
1864
2164
|
define(this.request, "statusText", response.statusText);
|
|
1865
2165
|
define(this.request, "responseURL", this.url.href);
|
|
@@ -1914,14 +2214,9 @@ var XMLHttpRequestController = class {
|
|
|
1914
2214
|
get: () => this.responseXML
|
|
1915
2215
|
}
|
|
1916
2216
|
});
|
|
1917
|
-
const totalResponseBodyLength =
|
|
1918
|
-
/**
|
|
1919
|
-
* @todo Infer the response body length from the response body.
|
|
1920
|
-
*/
|
|
1921
|
-
void 0
|
|
1922
|
-
);
|
|
2217
|
+
const totalResponseBodyLength = await getBodyByteLength(response.clone());
|
|
1923
2218
|
this.logger.info("calculated response body length", totalResponseBodyLength);
|
|
1924
|
-
this.trigger("loadstart", {
|
|
2219
|
+
this.trigger("loadstart", this.request, {
|
|
1925
2220
|
loaded: 0,
|
|
1926
2221
|
total: totalResponseBodyLength
|
|
1927
2222
|
});
|
|
@@ -1930,11 +2225,11 @@ var XMLHttpRequestController = class {
|
|
|
1930
2225
|
const finalizeResponse = () => {
|
|
1931
2226
|
this.logger.info("finalizing the mocked response...");
|
|
1932
2227
|
this.setReadyState(this.request.DONE);
|
|
1933
|
-
this.trigger("load", {
|
|
2228
|
+
this.trigger("load", this.request, {
|
|
1934
2229
|
loaded: this.responseBuffer.byteLength,
|
|
1935
2230
|
total: totalResponseBodyLength
|
|
1936
2231
|
});
|
|
1937
|
-
this.trigger("loadend", {
|
|
2232
|
+
this.trigger("loadend", this.request, {
|
|
1938
2233
|
loaded: this.responseBuffer.byteLength,
|
|
1939
2234
|
total: totalResponseBodyLength
|
|
1940
2235
|
});
|
|
@@ -1952,7 +2247,7 @@ var XMLHttpRequestController = class {
|
|
|
1952
2247
|
if (value) {
|
|
1953
2248
|
this.logger.info("read response body chunk:", value);
|
|
1954
2249
|
this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
|
|
1955
|
-
this.trigger("progress", {
|
|
2250
|
+
this.trigger("progress", this.request, {
|
|
1956
2251
|
loaded: this.responseBuffer.byteLength,
|
|
1957
2252
|
total: totalResponseBodyLength
|
|
1958
2253
|
});
|
|
@@ -2010,7 +2305,7 @@ var XMLHttpRequestController = class {
|
|
|
2010
2305
|
}
|
|
2011
2306
|
}
|
|
2012
2307
|
get responseText() {
|
|
2013
|
-
|
|
2308
|
+
invariant2(
|
|
2014
2309
|
this.request.responseType === "" || this.request.responseType === "text",
|
|
2015
2310
|
"InvalidStateError: The object is in invalid state."
|
|
2016
2311
|
);
|
|
@@ -2022,7 +2317,7 @@ var XMLHttpRequestController = class {
|
|
|
2022
2317
|
return responseText;
|
|
2023
2318
|
}
|
|
2024
2319
|
get responseXML() {
|
|
2025
|
-
|
|
2320
|
+
invariant2(
|
|
2026
2321
|
this.request.responseType === "" || this.request.responseType === "document",
|
|
2027
2322
|
"InvalidStateError: The object is in invalid state."
|
|
2028
2323
|
);
|
|
@@ -2045,10 +2340,11 @@ var XMLHttpRequestController = class {
|
|
|
2045
2340
|
return null;
|
|
2046
2341
|
}
|
|
2047
2342
|
errorWith(error2) {
|
|
2343
|
+
this[kIsRequestHandled] = true;
|
|
2048
2344
|
this.logger.info("responding with an error");
|
|
2049
2345
|
this.setReadyState(this.request.DONE);
|
|
2050
|
-
this.trigger("error");
|
|
2051
|
-
this.trigger("loadend");
|
|
2346
|
+
this.trigger("error", this.request);
|
|
2347
|
+
this.trigger("loadend", this.request);
|
|
2052
2348
|
}
|
|
2053
2349
|
/**
|
|
2054
2350
|
* Transitions this request's `readyState` to the given one.
|
|
@@ -2067,36 +2363,38 @@ var XMLHttpRequestController = class {
|
|
|
2067
2363
|
this.logger.info("set readyState to: %d", nextReadyState);
|
|
2068
2364
|
if (nextReadyState !== this.request.UNSENT) {
|
|
2069
2365
|
this.logger.info('triggerring "readystatechange" event...');
|
|
2070
|
-
this.trigger("readystatechange");
|
|
2366
|
+
this.trigger("readystatechange", this.request);
|
|
2071
2367
|
}
|
|
2072
2368
|
}
|
|
2073
2369
|
/**
|
|
2074
2370
|
* Triggers given event on the `XMLHttpRequest` instance.
|
|
2075
2371
|
*/
|
|
2076
|
-
trigger(eventName, options) {
|
|
2077
|
-
const callback =
|
|
2078
|
-
const event = createEvent(
|
|
2372
|
+
trigger(eventName, target, options) {
|
|
2373
|
+
const callback = target[`on${eventName}`];
|
|
2374
|
+
const event = createEvent(target, eventName, options);
|
|
2079
2375
|
this.logger.info('trigger "%s"', eventName, options || "");
|
|
2080
2376
|
if (typeof callback === "function") {
|
|
2081
2377
|
this.logger.info('found a direct "%s" callback, calling...', eventName);
|
|
2082
|
-
callback.call(
|
|
2378
|
+
callback.call(target, event);
|
|
2083
2379
|
}
|
|
2084
|
-
|
|
2380
|
+
const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
|
|
2381
|
+
for (const [registeredEventName, listeners] of events) {
|
|
2085
2382
|
if (registeredEventName === eventName) {
|
|
2086
2383
|
this.logger.info(
|
|
2087
2384
|
'found %d listener(s) for "%s" event, calling...',
|
|
2088
2385
|
listeners.length,
|
|
2089
2386
|
eventName
|
|
2090
2387
|
);
|
|
2091
|
-
listeners.forEach((listener) => listener.call(
|
|
2388
|
+
listeners.forEach((listener) => listener.call(target, event));
|
|
2092
2389
|
}
|
|
2093
2390
|
}
|
|
2094
2391
|
}
|
|
2095
2392
|
/**
|
|
2096
2393
|
* Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
|
|
2097
2394
|
*/
|
|
2098
|
-
toFetchApiRequest() {
|
|
2395
|
+
toFetchApiRequest(body) {
|
|
2099
2396
|
this.logger.info("converting request to a Fetch API Request...");
|
|
2397
|
+
const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
|
|
2100
2398
|
const fetchRequest = new Request(this.url.href, {
|
|
2101
2399
|
method: this.method,
|
|
2102
2400
|
headers: this.requestHeaders,
|
|
@@ -2104,7 +2402,7 @@ var XMLHttpRequestController = class {
|
|
|
2104
2402
|
* @see https://xhr.spec.whatwg.org/#cross-origin-credentials
|
|
2105
2403
|
*/
|
|
2106
2404
|
credentials: this.request.withCredentials ? "include" : "same-origin",
|
|
2107
|
-
body: ["GET", "HEAD"].includes(this.method) ? null :
|
|
2405
|
+
body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
|
|
2108
2406
|
});
|
|
2109
2407
|
const proxyHeaders = createProxy(fetchRequest.headers, {
|
|
2110
2408
|
methodCall: ([methodName, args], invoke) => {
|
|
@@ -2172,81 +2470,35 @@ function createXMLHttpRequestProxy({
|
|
|
2172
2470
|
logger
|
|
2173
2471
|
);
|
|
2174
2472
|
xhrRequestController.onRequest = async function({ request, requestId }) {
|
|
2175
|
-
const
|
|
2473
|
+
const controller = new RequestController(request);
|
|
2176
2474
|
this.logger.info("awaiting mocked response...");
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
)
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
this.logger.info("event.respondWith called with:", mockedResponse2);
|
|
2197
|
-
return mockedResponse2;
|
|
2198
|
-
});
|
|
2199
|
-
if (resolverResult.error) {
|
|
2200
|
-
this.logger.info(
|
|
2201
|
-
"request listener threw an exception, aborting request...",
|
|
2202
|
-
resolverResult.error
|
|
2203
|
-
);
|
|
2204
|
-
if (resolverResult.error instanceof Response) {
|
|
2205
|
-
if (isResponseError(resolverResult.error)) {
|
|
2206
|
-
xhrRequestController.errorWith(new TypeError("Network error"));
|
|
2207
|
-
} else {
|
|
2208
|
-
this.respondWith(resolverResult.error);
|
|
2209
|
-
}
|
|
2210
|
-
return;
|
|
2211
|
-
}
|
|
2212
|
-
if (emitter.listenerCount("unhandledException") > 0) {
|
|
2213
|
-
await emitAsync(emitter, "unhandledException", {
|
|
2214
|
-
error: resolverResult.error,
|
|
2215
|
-
request,
|
|
2216
|
-
requestId,
|
|
2217
|
-
controller: {
|
|
2218
|
-
respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
|
|
2219
|
-
errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
|
|
2220
|
-
}
|
|
2221
|
-
});
|
|
2222
|
-
if (originalRequest.readyState > XMLHttpRequest.OPENED) {
|
|
2223
|
-
return;
|
|
2475
|
+
this.logger.info(
|
|
2476
|
+
'emitting the "request" event for %s listener(s)...',
|
|
2477
|
+
emitter.listenerCount("request")
|
|
2478
|
+
);
|
|
2479
|
+
const isRequestHandled = await handleRequest2({
|
|
2480
|
+
request,
|
|
2481
|
+
requestId,
|
|
2482
|
+
controller,
|
|
2483
|
+
emitter,
|
|
2484
|
+
onResponse: async (response) => {
|
|
2485
|
+
await this.respondWith(response);
|
|
2486
|
+
},
|
|
2487
|
+
onRequestError: () => {
|
|
2488
|
+
this.errorWith(new TypeError("Network error"));
|
|
2489
|
+
},
|
|
2490
|
+
onError: (error2) => {
|
|
2491
|
+
this.logger.info("request errored!", { error: error2 });
|
|
2492
|
+
if (error2 instanceof Error) {
|
|
2493
|
+
this.errorWith(error2);
|
|
2224
2494
|
}
|
|
2225
2495
|
}
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
);
|
|
2229
|
-
return;
|
|
2230
|
-
}
|
|
2231
|
-
const mockedResponse = resolverResult.data;
|
|
2232
|
-
if (typeof mockedResponse !== "undefined") {
|
|
2496
|
+
});
|
|
2497
|
+
if (!isRequestHandled) {
|
|
2233
2498
|
this.logger.info(
|
|
2234
|
-
"
|
|
2235
|
-
mockedResponse.status,
|
|
2236
|
-
mockedResponse.statusText
|
|
2499
|
+
"no mocked response received, performing request as-is..."
|
|
2237
2500
|
);
|
|
2238
|
-
if (isResponseError(mockedResponse)) {
|
|
2239
|
-
this.logger.info(
|
|
2240
|
-
"received a network error response, rejecting the request promise..."
|
|
2241
|
-
);
|
|
2242
|
-
xhrRequestController.errorWith(new TypeError("Network error"));
|
|
2243
|
-
return;
|
|
2244
|
-
}
|
|
2245
|
-
return xhrRequestController.respondWith(mockedResponse);
|
|
2246
2501
|
}
|
|
2247
|
-
this.logger.info(
|
|
2248
|
-
"no mocked response received, performing request as-is..."
|
|
2249
|
-
);
|
|
2250
2502
|
};
|
|
2251
2503
|
xhrRequestController.onResponse = async function({
|
|
2252
2504
|
response,
|
|
@@ -2281,7 +2533,7 @@ var _XMLHttpRequestInterceptor = class extends Interceptor {
|
|
|
2281
2533
|
const logger = this.logger.extend("setup");
|
|
2282
2534
|
logger.info('patching "XMLHttpRequest" module...');
|
|
2283
2535
|
const PureXMLHttpRequest = globalThis.XMLHttpRequest;
|
|
2284
|
-
|
|
2536
|
+
invariant2(
|
|
2285
2537
|
!PureXMLHttpRequest[IS_PATCHED_MODULE],
|
|
2286
2538
|
'Failed to patch the "XMLHttpRequest" module: already patched.'
|
|
2287
2539
|
);
|
|
@@ -2320,7 +2572,7 @@ function createFallbackRequestListener(context, options) {
|
|
|
2320
2572
|
name: "fallback",
|
|
2321
2573
|
interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()]
|
|
2322
2574
|
});
|
|
2323
|
-
interceptor.on("request", async ({ request, requestId }) => {
|
|
2575
|
+
interceptor.on("request", async ({ request, requestId, controller }) => {
|
|
2324
2576
|
const requestCloneForLogs = request.clone();
|
|
2325
2577
|
const response = await (0, import_handleRequest2.handleRequest)(
|
|
2326
2578
|
request,
|
|
@@ -2343,7 +2595,7 @@ function createFallbackRequestListener(context, options) {
|
|
|
2343
2595
|
}
|
|
2344
2596
|
);
|
|
2345
2597
|
if (response) {
|
|
2346
|
-
|
|
2598
|
+
controller.respondWith(response);
|
|
2347
2599
|
}
|
|
2348
2600
|
});
|
|
2349
2601
|
interceptor.on(
|