msw 2.3.0-ws.rc-5 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/cli/init.js +0 -0
  2. package/config/scripts/postinstall.js +0 -0
  3. package/lib/browser/index.d.mts +6 -7
  4. package/lib/browser/index.d.ts +6 -7
  5. package/lib/browser/index.js +156 -81
  6. package/lib/browser/index.js.map +1 -1
  7. package/lib/browser/index.mjs +156 -81
  8. package/lib/browser/index.mjs.map +1 -1
  9. package/lib/core/{GraphQLHandler-DGyzNtRQ.d.ts → GraphQLHandler-COiPfZ8k.d.ts} +1 -1
  10. package/lib/core/{GraphQLHandler-CzcXr7At.d.mts → GraphQLHandler-Dq_WRbKe.d.mts} +1 -1
  11. package/lib/core/{HttpResponse-BOzDwzB6.d.ts → HttpResponse-B07UKAkU.d.ts} +2 -2
  12. package/lib/core/{HttpResponse-CSyJ1cbO.d.mts → HttpResponse-C7niBMwb.d.mts} +2 -2
  13. package/lib/core/HttpResponse.d.mts +1 -1
  14. package/lib/core/HttpResponse.d.ts +1 -1
  15. package/lib/core/SetupApi.d.mts +12 -15
  16. package/lib/core/SetupApi.d.ts +12 -15
  17. package/lib/core/SetupApi.js +1 -3
  18. package/lib/core/SetupApi.js.map +1 -1
  19. package/lib/core/SetupApi.mjs +1 -3
  20. package/lib/core/SetupApi.mjs.map +1 -1
  21. package/lib/core/getResponse.d.mts +1 -1
  22. package/lib/core/getResponse.d.ts +1 -1
  23. package/lib/core/graphql.d.mts +2 -2
  24. package/lib/core/graphql.d.ts +2 -2
  25. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  26. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  27. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  28. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  29. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  30. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  31. package/lib/core/http.d.mts +1 -1
  32. package/lib/core/http.d.ts +1 -1
  33. package/lib/core/index.d.mts +2 -5
  34. package/lib/core/index.d.ts +2 -5
  35. package/lib/core/index.js +1 -5
  36. package/lib/core/index.js.map +1 -1
  37. package/lib/core/index.mjs +1 -7
  38. package/lib/core/index.mjs.map +1 -1
  39. package/lib/core/passthrough.d.mts +1 -1
  40. package/lib/core/passthrough.d.ts +1 -1
  41. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  42. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  43. package/lib/core/utils/executeHandlers.d.mts +1 -1
  44. package/lib/core/utils/executeHandlers.d.ts +1 -1
  45. package/lib/core/utils/executeHandlers.js +0 -4
  46. package/lib/core/utils/executeHandlers.js.map +1 -1
  47. package/lib/core/utils/executeHandlers.mjs +0 -6
  48. package/lib/core/utils/executeHandlers.mjs.map +1 -1
  49. package/lib/core/utils/handleRequest.d.mts +2 -2
  50. package/lib/core/utils/handleRequest.d.ts +2 -2
  51. package/lib/core/utils/handleRequest.js.map +1 -1
  52. package/lib/core/utils/handleRequest.mjs.map +1 -1
  53. package/lib/core/utils/internal/Disposable.d.mts +2 -2
  54. package/lib/core/utils/internal/Disposable.d.ts +2 -2
  55. package/lib/core/utils/internal/Disposable.js +5 -2
  56. package/lib/core/utils/internal/Disposable.js.map +1 -1
  57. package/lib/core/utils/internal/Disposable.mjs +5 -2
  58. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  59. package/lib/core/utils/internal/devUtils.d.mts +10 -1
  60. package/lib/core/utils/internal/devUtils.d.ts +10 -1
  61. package/lib/core/utils/internal/devUtils.js +7 -0
  62. package/lib/core/utils/internal/devUtils.js.map +1 -1
  63. package/lib/core/utils/internal/devUtils.mjs +7 -0
  64. package/lib/core/utils/internal/devUtils.mjs.map +1 -1
  65. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  66. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  67. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  68. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  69. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  70. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  71. package/lib/core/utils/logging/getTimestamp.d.mts +1 -4
  72. package/lib/core/utils/logging/getTimestamp.d.ts +1 -4
  73. package/lib/core/utils/logging/getTimestamp.js +2 -6
  74. package/lib/core/utils/logging/getTimestamp.js.map +1 -1
  75. package/lib/core/utils/logging/getTimestamp.mjs +2 -6
  76. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
  77. package/lib/core/utils/matching/matchRequestUrl.d.mts +1 -2
  78. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -2
  79. package/lib/core/utils/matching/matchRequestUrl.js +0 -4
  80. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
  81. package/lib/core/utils/matching/matchRequestUrl.mjs +0 -4
  82. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
  83. package/lib/core/utils/request/onUnhandledRequest.js +3 -3
  84. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  85. package/lib/core/utils/request/onUnhandledRequest.mjs +4 -4
  86. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  87. package/lib/iife/index.js +177 -1063
  88. package/lib/iife/index.js.map +1 -1
  89. package/lib/mockServiceWorker.js +1 -1
  90. package/lib/native/index.d.mts +5 -6
  91. package/lib/native/index.d.ts +5 -6
  92. package/lib/native/index.js +5 -13
  93. package/lib/native/index.js.map +1 -1
  94. package/lib/native/index.mjs +6 -14
  95. package/lib/native/index.mjs.map +1 -1
  96. package/lib/node/index.d.mts +7 -8
  97. package/lib/node/index.d.ts +7 -8
  98. package/lib/node/index.js +5 -13
  99. package/lib/node/index.js.map +1 -1
  100. package/lib/node/index.mjs +6 -14
  101. package/lib/node/index.mjs.map +1 -1
  102. package/package.json +36 -29
  103. package/src/browser/setupWorker/glossary.ts +10 -10
  104. package/src/browser/setupWorker/setupWorker.ts +3 -34
  105. package/src/core/SetupApi.ts +20 -28
  106. package/src/core/index.ts +1 -8
  107. package/src/core/utils/executeHandlers.ts +2 -6
  108. package/src/core/utils/handleRequest.ts +2 -1
  109. package/src/core/utils/internal/Disposable.ts +6 -3
  110. package/src/core/utils/internal/devUtils.test.ts +21 -0
  111. package/src/core/utils/internal/devUtils.ts +13 -0
  112. package/src/core/utils/logging/getTimestamp.test.ts +6 -20
  113. package/src/core/utils/logging/getTimestamp.ts +6 -11
  114. package/src/core/utils/matching/matchRequestUrl.test.ts +0 -44
  115. package/src/core/utils/matching/matchRequestUrl.ts +0 -4
  116. package/src/core/utils/request/onUnhandledRequest.test.ts +30 -4
  117. package/src/core/utils/request/onUnhandledRequest.ts +4 -4
  118. package/src/node/SetupServerApi.ts +7 -8
  119. package/src/node/SetupServerCommonApi.ts +8 -15
  120. package/src/node/glossary.ts +7 -5
  121. package/src/node/setupServer.ts +1 -2
  122. package/lib/core/handlers/WebSocketHandler.d.mts +0 -32
  123. package/lib/core/handlers/WebSocketHandler.d.ts +0 -32
  124. package/lib/core/handlers/WebSocketHandler.js +0 -62
  125. package/lib/core/handlers/WebSocketHandler.js.map +0 -1
  126. package/lib/core/handlers/WebSocketHandler.mjs +0 -44
  127. package/lib/core/handlers/WebSocketHandler.mjs.map +0 -1
  128. package/lib/core/ws/WebSocketClientManager.d.mts +0 -64
  129. package/lib/core/ws/WebSocketClientManager.d.ts +0 -64
  130. package/lib/core/ws/WebSocketClientManager.js +0 -123
  131. package/lib/core/ws/WebSocketClientManager.js.map +0 -1
  132. package/lib/core/ws/WebSocketClientManager.mjs +0 -103
  133. package/lib/core/ws/WebSocketClientManager.mjs.map +0 -1
  134. package/lib/core/ws/handleWebSocketEvent.d.mts +0 -16
  135. package/lib/core/ws/handleWebSocketEvent.d.ts +0 -16
  136. package/lib/core/ws/handleWebSocketEvent.js +0 -56
  137. package/lib/core/ws/handleWebSocketEvent.js.map +0 -1
  138. package/lib/core/ws/handleWebSocketEvent.mjs +0 -36
  139. package/lib/core/ws/handleWebSocketEvent.mjs.map +0 -1
  140. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +0 -34
  141. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +0 -34
  142. package/lib/core/ws/utils/attachWebSocketLogger.js +0 -217
  143. package/lib/core/ws/utils/attachWebSocketLogger.js.map +0 -1
  144. package/lib/core/ws/utils/attachWebSocketLogger.mjs +0 -197
  145. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +0 -1
  146. package/lib/core/ws/utils/getMessageLength.d.mts +0 -11
  147. package/lib/core/ws/utils/getMessageLength.d.ts +0 -11
  148. package/lib/core/ws/utils/getMessageLength.js +0 -33
  149. package/lib/core/ws/utils/getMessageLength.js.map +0 -1
  150. package/lib/core/ws/utils/getMessageLength.mjs +0 -13
  151. package/lib/core/ws/utils/getMessageLength.mjs.map +0 -1
  152. package/lib/core/ws/utils/getPublicData.d.mts +0 -5
  153. package/lib/core/ws/utils/getPublicData.d.ts +0 -5
  154. package/lib/core/ws/utils/getPublicData.js +0 -36
  155. package/lib/core/ws/utils/getPublicData.js.map +0 -1
  156. package/lib/core/ws/utils/getPublicData.mjs +0 -16
  157. package/lib/core/ws/utils/getPublicData.mjs.map +0 -1
  158. package/lib/core/ws/utils/truncateMessage.d.mts +0 -3
  159. package/lib/core/ws/utils/truncateMessage.d.ts +0 -3
  160. package/lib/core/ws/utils/truncateMessage.js +0 -31
  161. package/lib/core/ws/utils/truncateMessage.js.map +0 -1
  162. package/lib/core/ws/utils/truncateMessage.mjs +0 -11
  163. package/lib/core/ws/utils/truncateMessage.mjs.map +0 -1
  164. package/lib/core/ws/webSocketInterceptor.d.mts +0 -5
  165. package/lib/core/ws/webSocketInterceptor.d.ts +0 -5
  166. package/lib/core/ws/webSocketInterceptor.js +0 -26
  167. package/lib/core/ws/webSocketInterceptor.js.map +0 -1
  168. package/lib/core/ws/webSocketInterceptor.mjs +0 -6
  169. package/lib/core/ws/webSocketInterceptor.mjs.map +0 -1
  170. package/lib/core/ws.d.mts +0 -49
  171. package/lib/core/ws.d.ts +0 -49
  172. package/lib/core/ws.js +0 -63
  173. package/lib/core/ws.js.map +0 -1
  174. package/lib/core/ws.mjs +0 -46
  175. package/lib/core/ws.mjs.map +0 -1
  176. package/src/core/handlers/WebSocketHandler.ts +0 -71
  177. package/src/core/ws/WebSocketClientManager.test.ts +0 -159
  178. package/src/core/ws/WebSocketClientManager.ts +0 -170
  179. package/src/core/ws/handleWebSocketEvent.ts +0 -56
  180. package/src/core/ws/utils/attachWebSocketLogger.ts +0 -269
  181. package/src/core/ws/utils/getMessageLength.test.ts +0 -16
  182. package/src/core/ws/utils/getMessageLength.ts +0 -19
  183. package/src/core/ws/utils/getPublicData.test.ts +0 -38
  184. package/src/core/ws/utils/getPublicData.ts +0 -17
  185. package/src/core/ws/utils/truncateMessage.test.ts +0 -12
  186. package/src/core/ws/utils/truncateMessage.ts +0 -9
  187. package/src/core/ws/webSocketInterceptor.ts +0 -3
  188. package/src/core/ws.test.ts +0 -23
  189. package/src/core/ws.ts +0 -122
package/lib/iife/index.js CHANGED
@@ -32,7 +32,6 @@ var MockServiceWorker = (() => {
32
32
  SET_TIMEOUT_MAX_ALLOWED_INT: () => SET_TIMEOUT_MAX_ALLOWED_INT,
33
33
  SetupApi: () => SetupApi,
34
34
  SetupWorkerApi: () => SetupWorkerApi,
35
- WebSocketHandler: () => WebSocketHandler,
36
35
  bypass: () => bypass,
37
36
  cleanUrl: () => cleanUrl,
38
37
  delay: () => delay,
@@ -42,8 +41,7 @@ var MockServiceWorker = (() => {
42
41
  http: () => http,
43
42
  matchRequestUrl: () => matchRequestUrl,
44
43
  passthrough: () => passthrough,
45
- setupWorker: () => setupWorker,
46
- ws: () => ws
44
+ setupWorker: () => setupWorker
47
45
  });
48
46
 
49
47
  // node_modules/.pnpm/outvariant@1.4.2/node_modules/outvariant/lib/index.mjs
@@ -145,6 +143,12 @@ var MockServiceWorker = (() => {
145
143
  warn,
146
144
  error
147
145
  };
146
+ var InternalError = class extends Error {
147
+ constructor(message3) {
148
+ super(message3);
149
+ this.name = "InternalError";
150
+ }
151
+ };
148
152
 
149
153
  // src/core/utils/internal/checkGlobals.ts
150
154
  function checkGlobals() {
@@ -345,8 +349,11 @@ var MockServiceWorker = (() => {
345
349
  // src/core/utils/internal/Disposable.ts
346
350
  var Disposable = class {
347
351
  subscriptions = [];
348
- async dispose() {
349
- await Promise.all(this.subscriptions.map((subscription) => subscription()));
352
+ dispose() {
353
+ let subscription;
354
+ while (subscription = this.subscriptions.shift()) {
355
+ subscription();
356
+ }
350
357
  }
351
358
  };
352
359
 
@@ -404,9 +411,7 @@ var MockServiceWorker = (() => {
404
411
  }
405
412
  restoreHandlers() {
406
413
  this.handlersController.currentHandlers().forEach((handler) => {
407
- if ("isUsed" in handler) {
408
- handler.isUsed = false;
409
- }
414
+ handler.isUsed = false;
410
415
  });
411
416
  }
412
417
  resetHandlers(...nextHandlers) {
@@ -627,13 +632,9 @@ var MockServiceWorker = (() => {
627
632
  }
628
633
 
629
634
  // src/core/utils/logging/getTimestamp.ts
630
- function getTimestamp(options) {
635
+ function getTimestamp() {
631
636
  const now = /* @__PURE__ */ new Date();
632
- const timestamp = `${now.getHours().toString().padStart(2, "0")}:${now.getMinutes().toString().padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}`;
633
- if (options?.milliseconds) {
634
- return `${timestamp}.${now.getMilliseconds().toString().padStart(3, "0")}`;
635
- }
636
- return timestamp;
637
+ return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
637
638
  }
638
639
 
639
640
  // src/core/utils/logging/serializeRequest.ts
@@ -1129,7 +1130,7 @@ var MockServiceWorker = (() => {
1129
1130
  return stringToRegexp(path, keys, options);
1130
1131
  }
1131
1132
 
1132
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-UJZOJSMP.mjs
1133
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-6HYIRFX2.mjs
1133
1134
  var encoder = new TextEncoder();
1134
1135
  function encodeBuffer(text) {
1135
1136
  return encoder.encode(text);
@@ -1144,6 +1145,17 @@ var MockServiceWorker = (() => {
1144
1145
  array.byteOffset + array.byteLength
1145
1146
  );
1146
1147
  }
1148
+
1149
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OMISYKWR.mjs
1150
+ var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1151
+ function isPropertyAccessible(obj, key) {
1152
+ try {
1153
+ obj[key];
1154
+ return true;
1155
+ } catch (e) {
1156
+ return false;
1157
+ }
1158
+ }
1147
1159
  var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
1148
1160
  101,
1149
1161
  103,
@@ -1154,9 +1166,27 @@ var MockServiceWorker = (() => {
1154
1166
  function isResponseWithoutBody(status) {
1155
1167
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
1156
1168
  }
1157
-
1158
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-HAGW22AN.mjs
1159
- var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1169
+ function createServerErrorResponse(body) {
1170
+ return new Response(
1171
+ JSON.stringify(
1172
+ body instanceof Error ? {
1173
+ name: body.name,
1174
+ message: body.message,
1175
+ stack: body.stack
1176
+ } : body
1177
+ ),
1178
+ {
1179
+ status: 500,
1180
+ statusText: "Unhandled Exception",
1181
+ headers: {
1182
+ "Content-Type": "application/json"
1183
+ }
1184
+ }
1185
+ );
1186
+ }
1187
+ function isResponseError(response) {
1188
+ return isPropertyAccessible(response, "type") && response.type === "error";
1189
+ }
1160
1190
 
1161
1191
  // node_modules/.pnpm/is-node-process@1.2.0/node_modules/is-node-process/lib/index.mjs
1162
1192
  function isNodeProcess() {
@@ -1445,7 +1475,7 @@ var MockServiceWorker = (() => {
1445
1475
  return message3.toString();
1446
1476
  }
1447
1477
 
1448
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
1478
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
1449
1479
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
1450
1480
  function getGlobalSymbol(symbol) {
1451
1481
  return (
@@ -1593,7 +1623,7 @@ var MockServiceWorker = (() => {
1593
1623
  return Math.random().toString(16).slice(2);
1594
1624
  }
1595
1625
 
1596
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1626
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1597
1627
  var BatchInterceptor = class extends Interceptor {
1598
1628
  constructor(options) {
1599
1629
  BatchInterceptor.symbol = Symbol(options.name);
@@ -1701,9 +1731,6 @@ var MockServiceWorker = (() => {
1701
1731
  params
1702
1732
  };
1703
1733
  }
1704
- function isPath(value) {
1705
- return typeof value === "string" || value instanceof RegExp;
1706
- }
1707
1734
 
1708
1735
  // src/core/utils/request/toPublicUrl.ts
1709
1736
  function toPublicUrl(url) {
@@ -2087,7 +2114,7 @@ var MockServiceWorker = (() => {
2087
2114
  return false;
2088
2115
  }
2089
2116
  }
2090
- function isPropertyAccessible(object, method) {
2117
+ function isPropertyAccessible2(object, method) {
2091
2118
  try {
2092
2119
  object[method];
2093
2120
  return true;
@@ -2100,7 +2127,7 @@ var MockServiceWorker = (() => {
2100
2127
  this.store = /* @__PURE__ */ new Map();
2101
2128
  }
2102
2129
  add(request, response) {
2103
- if (isPropertyAccessible(request, "credentials") && request.credentials === "omit") {
2130
+ if (isPropertyAccessible2(request, "credentials") && request.credentials === "omit") {
2104
2131
  return;
2105
2132
  }
2106
2133
  const requestUrl = new URL(request.url);
@@ -2125,7 +2152,7 @@ var MockServiceWorker = (() => {
2125
2152
  this.deleteExpiredCookies();
2126
2153
  const requestUrl = new URL(request.url);
2127
2154
  const originCookies = this.store.get(requestUrl.origin) || /* @__PURE__ */ new Map();
2128
- if (!isPropertyAccessible(request, "credentials")) {
2155
+ if (!isPropertyAccessible2(request, "credentials")) {
2129
2156
  return originCookies;
2130
2157
  }
2131
2158
  switch (request.credentials) {
@@ -5626,176 +5653,6 @@ Consider naming this operation or using "graphql.operation()" request handler to
5626
5653
  link: createGraphQLLink
5627
5654
  };
5628
5655
 
5629
- // src/core/handlers/WebSocketHandler.ts
5630
- var kEmitter = Symbol("kEmitter");
5631
- var kDispatchEvent = Symbol("kDispatchEvent");
5632
- var kSender = Symbol("kSender");
5633
- var WebSocketHandler = class {
5634
- constructor(url) {
5635
- this.url = url;
5636
- this[kEmitter] = new Emitter();
5637
- this.callFrame = getCallFrame(new Error());
5638
- }
5639
- callFrame;
5640
- [kEmitter];
5641
- parse(args) {
5642
- const connection = args.event.data;
5643
- const match2 = matchRequestUrl(connection.client.url, this.url);
5644
- return {
5645
- match: match2
5646
- };
5647
- }
5648
- predicate(args) {
5649
- return args.parsedResult.match.matches;
5650
- }
5651
- async [kDispatchEvent](event) {
5652
- const parsedResult = this.parse({ event });
5653
- const connection = event.data;
5654
- const resolvedConnection = {
5655
- client: connection.client,
5656
- server: connection.server,
5657
- params: parsedResult.match.params || {}
5658
- };
5659
- this[kEmitter].emit("connection", resolvedConnection);
5660
- }
5661
- };
5662
-
5663
- // src/core/ws/WebSocketClientManager.ts
5664
- var kAddByClientId = Symbol("kAddByClientId");
5665
- var WebSocketClientManager = class {
5666
- constructor(channel) {
5667
- this.channel = channel;
5668
- this.clients = /* @__PURE__ */ new Set();
5669
- this.channel.addEventListener("message", (message3) => {
5670
- const { type, payload } = message3.data;
5671
- switch (type) {
5672
- case "connection:open": {
5673
- this.onRemoteConnection(payload.clientId, new URL(payload.url));
5674
- break;
5675
- }
5676
- }
5677
- });
5678
- }
5679
- /**
5680
- * All active WebSocket client connections.
5681
- */
5682
- clients;
5683
- /**
5684
- * Adds the given `WebSocket` client connection to the set
5685
- * of all connections. The given connection is always the complete
5686
- * connection object because `addConnection()` is called only
5687
- * for the opened connections in the same runtime.
5688
- */
5689
- addConnection(client) {
5690
- this.clients.add(client);
5691
- this.channel.postMessage({
5692
- type: "connection:open",
5693
- payload: {
5694
- clientId: client.id,
5695
- url: client.url.toString()
5696
- }
5697
- });
5698
- const handleExtraneousMessage = (message3) => {
5699
- const { type, payload } = message3.data;
5700
- if (typeof payload === "object" && "clientId" in payload && payload.clientId !== client.id) {
5701
- return;
5702
- }
5703
- switch (type) {
5704
- case "extraneous:send": {
5705
- client.send(payload.data);
5706
- break;
5707
- }
5708
- case "extraneous:close": {
5709
- client.close(payload.code, payload.reason);
5710
- break;
5711
- }
5712
- }
5713
- };
5714
- const abortController = new AbortController();
5715
- this.channel.addEventListener("message", handleExtraneousMessage, {
5716
- signal: abortController.signal
5717
- });
5718
- client.addEventListener("close", () => abortController.abort(), {
5719
- once: true
5720
- });
5721
- }
5722
- /**
5723
- * Adds a client connection wrapper to operate with
5724
- * WebSocket client connections in other runtimes.
5725
- */
5726
- onRemoteConnection(id, url) {
5727
- this.clients.add(
5728
- // Create a connection-compatible instance that can
5729
- // operate with this client from a different runtime
5730
- // using the BroadcastChannel messages.
5731
- new WebSocketRemoteClientConnection(id, url, this.channel)
5732
- );
5733
- }
5734
- };
5735
- var WebSocketRemoteClientConnection = class {
5736
- constructor(id, url, channel) {
5737
- this.id = id;
5738
- this.url = url;
5739
- this.channel = channel;
5740
- }
5741
- send(data) {
5742
- this.channel.postMessage({
5743
- type: "extraneous:send",
5744
- payload: {
5745
- clientId: this.id,
5746
- data
5747
- }
5748
- });
5749
- }
5750
- close(code, reason) {
5751
- this.channel.postMessage({
5752
- type: "extraneous:close",
5753
- payload: {
5754
- clientId: this.id,
5755
- code,
5756
- reason
5757
- }
5758
- });
5759
- }
5760
- };
5761
-
5762
- // src/core/ws.ts
5763
- var wsBroadcastChannel = new BroadcastChannel("msw:ws-client-manager");
5764
- function createWebSocketLinkHandler(url) {
5765
- invariant(url, "Expected a WebSocket server URL but got undefined");
5766
- invariant(
5767
- isPath(url),
5768
- "Expected a WebSocket server URL to be a valid path but got %s",
5769
- typeof url
5770
- );
5771
- const clientManager = new WebSocketClientManager(wsBroadcastChannel);
5772
- return {
5773
- clients: clientManager.clients,
5774
- on(event, listener) {
5775
- const handler = new WebSocketHandler(url);
5776
- handler[kEmitter].on("connection", ({ client }) => {
5777
- clientManager.addConnection(client);
5778
- });
5779
- handler[kEmitter].on(event, listener);
5780
- return handler;
5781
- },
5782
- broadcast(data) {
5783
- this.broadcastExcept([], data);
5784
- },
5785
- broadcastExcept(clients, data) {
5786
- const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
5787
- clientManager.clients.forEach((otherClient) => {
5788
- if (!ignoreClients.includes(otherClient.id)) {
5789
- otherClient.send(data);
5790
- }
5791
- });
5792
- }
5793
- };
5794
- }
5795
- var ws = {
5796
- link: createWebSocketLinkHandler
5797
- };
5798
-
5799
5656
  // node_modules/.pnpm/@open-draft+until@2.1.0/node_modules/@open-draft/until/lib/index.mjs
5800
5657
  var until = async (promise) => {
5801
5658
  try {
@@ -5818,9 +5675,6 @@ Consider naming this operation or using "graphql.operation()" request handler to
5818
5675
  let matchingHandler = null;
5819
5676
  let result = null;
5820
5677
  for (const handler of handlers) {
5821
- if (!(handler instanceof RequestHandler)) {
5822
- continue;
5823
- }
5824
5678
  result = await handler.run({ request, requestId, resolutionContext });
5825
5679
  if (result !== null) {
5826
5680
  matchingHandler = handler;
@@ -5842,7 +5696,7 @@ Consider naming this operation or using "graphql.operation()" request handler to
5842
5696
  // src/core/utils/request/onUnhandledRequest.ts
5843
5697
  async function onUnhandledRequest(request, strategy = "warn") {
5844
5698
  const url = new URL(request.url);
5845
- const publicUrl = toPublicUrl(url);
5699
+ const publicUrl = toPublicUrl(url) + url.search;
5846
5700
  const unhandledRequestMessage = `intercepted a request without a matching request handler:
5847
5701
 
5848
5702
  \u2022 ${request.method} ${publicUrl}
@@ -5853,7 +5707,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks`;
5853
5707
  switch (strategy2) {
5854
5708
  case "error": {
5855
5709
  devUtils.error("Error: %s", unhandledRequestMessage);
5856
- throw new Error(
5710
+ throw new InternalError(
5857
5711
  devUtils.formatMessage(
5858
5712
  'Cannot bypass a request when using the "error" strategy for the "onUnhandledRequest" option.'
5859
5713
  )
@@ -5866,7 +5720,7 @@ Read more: https://mswjs.io/docs/getting-started/mocks`;
5866
5720
  case "bypass":
5867
5721
  break;
5868
5722
  default:
5869
- throw new Error(
5723
+ throw new InternalError(
5870
5724
  devUtils.formatMessage(
5871
5725
  'Failed to react to an unhandled request: unknown strategy "%s". Please provide one of the supported strategies ("bypass", "warn", "error") or a custom callback function as the value of the "onUnhandledRequest" option.',
5872
5726
  strategy2
@@ -6674,7 +6528,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
6674
6528
  }
6675
6529
  };
6676
6530
 
6677
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
6531
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
6678
6532
  var RequestController = class {
6679
6533
  constructor(request) {
6680
6534
  this.request = request;
@@ -6712,15 +6566,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
6712
6566
  }
6713
6567
  }
6714
6568
 
6715
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-3FNUI33J.mjs
6716
- function isPropertyAccessible2(obj, key) {
6717
- try {
6718
- obj[key];
6719
- return true;
6720
- } catch (e) {
6721
- return false;
6722
- }
6723
- }
6569
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-MAEPOYB6.mjs
6724
6570
  function canParseUrl(url) {
6725
6571
  try {
6726
6572
  new URL(url);
@@ -6773,64 +6619,113 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
6773
6619
  { once: true }
6774
6620
  );
6775
6621
  }
6776
- const resolverResult = await until(async () => {
6777
- const listenersFinished = emitAsync(this.emitter, "request", {
6778
- request: interactiveRequest,
6779
- requestId
6622
+ const responsePromise = new DeferredPromise();
6623
+ const respondWith = (response) => {
6624
+ this.logger.info("responding with a mock response:", response);
6625
+ if (this.emitter.listenerCount("response") > 0) {
6626
+ this.logger.info('emitting the "response" event...');
6627
+ const responseClone = response.clone();
6628
+ this.emitter.emit("response", {
6629
+ response: responseClone,
6630
+ isMockedResponse: true,
6631
+ request: interactiveRequest,
6632
+ requestId
6633
+ });
6634
+ }
6635
+ Object.defineProperty(response, "url", {
6636
+ writable: false,
6637
+ enumerable: true,
6638
+ configurable: false,
6639
+ value: request.url
6780
6640
  });
6781
- await Promise.race([
6782
- requestAborted,
6783
- // Put the listeners invocation Promise in the same race condition
6784
- // with the request abort Promise because otherwise awaiting the listeners
6785
- // would always yield some response (or undefined).
6786
- listenersFinished,
6787
- requestController.responsePromise
6788
- ]);
6789
- this.logger.info("all request listeners have been resolved!");
6790
- const mockedResponse2 = await requestController.responsePromise;
6791
- this.logger.info("event.respondWith called with:", mockedResponse2);
6792
- return mockedResponse2;
6793
- });
6641
+ responsePromise.resolve(response);
6642
+ };
6643
+ const errorWith = (reason) => {
6644
+ responsePromise.reject(reason);
6645
+ };
6646
+ const resolverResult = await until(
6647
+ async () => {
6648
+ const listenersFinished = emitAsync(this.emitter, "request", {
6649
+ request: interactiveRequest,
6650
+ requestId
6651
+ });
6652
+ await Promise.race([
6653
+ requestAborted,
6654
+ // Put the listeners invocation Promise in the same race condition
6655
+ // with the request abort Promise because otherwise awaiting the listeners
6656
+ // would always yield some response (or undefined).
6657
+ listenersFinished,
6658
+ requestController.responsePromise
6659
+ ]);
6660
+ this.logger.info("all request listeners have been resolved!");
6661
+ const mockedResponse2 = await requestController.responsePromise;
6662
+ this.logger.info("event.respondWith called with:", mockedResponse2);
6663
+ return mockedResponse2;
6664
+ }
6665
+ );
6794
6666
  if (requestAborted.state === "rejected") {
6795
- return Promise.reject(requestAborted.rejectionReason);
6667
+ this.logger.info(
6668
+ "request has been aborted:",
6669
+ requestAborted.rejectionReason
6670
+ );
6671
+ responsePromise.reject(requestAborted.rejectionReason);
6672
+ return responsePromise;
6796
6673
  }
6797
6674
  if (resolverResult.error) {
6798
- return Promise.reject(createNetworkError(resolverResult.error));
6675
+ this.logger.info(
6676
+ "request listerner threw an error:",
6677
+ resolverResult.error
6678
+ );
6679
+ if (resolverResult.error instanceof Response) {
6680
+ if (isResponseError(resolverResult.error)) {
6681
+ errorWith(createNetworkError(resolverResult.error));
6682
+ } else {
6683
+ respondWith(resolverResult.error);
6684
+ }
6685
+ }
6686
+ if (this.emitter.listenerCount("unhandledException") > 0) {
6687
+ await emitAsync(this.emitter, "unhandledException", {
6688
+ error: resolverResult.error,
6689
+ request,
6690
+ requestId,
6691
+ controller: {
6692
+ respondWith,
6693
+ errorWith
6694
+ }
6695
+ });
6696
+ if (responsePromise.state !== "pending") {
6697
+ return responsePromise;
6698
+ }
6699
+ }
6700
+ respondWith(createServerErrorResponse(resolverResult.error));
6701
+ return responsePromise;
6799
6702
  }
6800
6703
  const mockedResponse = resolverResult.data;
6801
6704
  if (mockedResponse && !((_a2 = request.signal) == null ? void 0 : _a2.aborted)) {
6802
6705
  this.logger.info("received mocked response:", mockedResponse);
6803
- if (isPropertyAccessible2(mockedResponse, "type") && mockedResponse.type === "error") {
6706
+ if (isResponseError(mockedResponse)) {
6804
6707
  this.logger.info(
6805
6708
  "received a network error response, rejecting the request promise..."
6806
6709
  );
6807
- return Promise.reject(createNetworkError(mockedResponse));
6710
+ errorWith(createNetworkError(mockedResponse));
6711
+ } else {
6712
+ respondWith(mockedResponse);
6808
6713
  }
6809
- const responseClone = mockedResponse.clone();
6810
- this.emitter.emit("response", {
6811
- response: responseClone,
6812
- isMockedResponse: true,
6813
- request: interactiveRequest,
6814
- requestId
6815
- });
6816
- Object.defineProperty(mockedResponse, "url", {
6817
- writable: false,
6818
- enumerable: true,
6819
- configurable: false,
6820
- value: request.url
6821
- });
6822
- return mockedResponse;
6714
+ return responsePromise;
6823
6715
  }
6824
6716
  this.logger.info("no mocked response received!");
6825
6717
  return pureFetch(request).then((response) => {
6826
- const responseClone = response.clone();
6827
- this.logger.info("original fetch performed", responseClone);
6828
- this.emitter.emit("response", {
6829
- response: responseClone,
6830
- isMockedResponse: false,
6831
- request: interactiveRequest,
6832
- requestId
6833
- });
6718
+ this.logger.info("original fetch performed", response);
6719
+ if (this.emitter.listenerCount("response") > 0) {
6720
+ this.logger.info('emitting the "response" event...');
6721
+ const responseClone = response.clone();
6722
+ this.emitter.emit("response", {
6723
+ response: responseClone,
6724
+ isMockedResponse: false,
6725
+ request: interactiveRequest,
6726
+ requestId
6727
+ });
6728
+ }
6834
6729
  return response;
6835
6730
  });
6836
6731
  };
@@ -6859,7 +6754,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
6859
6754
  });
6860
6755
  }
6861
6756
 
6862
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/chunk-VYFS2IF2.mjs
6757
+ // node_modules/.pnpm/@mswjs+interceptors@0.29.0/node_modules/@mswjs/interceptors/lib/browser/chunk-732REFPX.mjs
6863
6758
  function concatArrayBuffer(left, right) {
6864
6759
  const result = new Uint8Array(left.byteLength + right.byteLength);
6865
6760
  result.set(left, 0);
@@ -7510,7 +7405,31 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
7510
7405
  "request listener threw an exception, aborting request...",
7511
7406
  resolverResult.error
7512
7407
  );
7513
- xhrRequestController.errorWith(resolverResult.error);
7408
+ if (resolverResult.error instanceof Response) {
7409
+ if (isResponseError(resolverResult.error)) {
7410
+ xhrRequestController.errorWith(new TypeError("Network error"));
7411
+ } else {
7412
+ this.respondWith(resolverResult.error);
7413
+ }
7414
+ return;
7415
+ }
7416
+ if (emitter.listenerCount("unhandledException") > 0) {
7417
+ await emitAsync(emitter, "unhandledException", {
7418
+ error: resolverResult.error,
7419
+ request,
7420
+ requestId,
7421
+ controller: {
7422
+ respondWith: xhrRequestController.respondWith.bind(xhrRequestController),
7423
+ errorWith: xhrRequestController.errorWith.bind(xhrRequestController)
7424
+ }
7425
+ });
7426
+ if (originalRequest.readyState > XMLHttpRequest.OPENED) {
7427
+ return;
7428
+ }
7429
+ }
7430
+ xhrRequestController.respondWith(
7431
+ createServerErrorResponse(resolverResult.error)
7432
+ );
7514
7433
  return;
7515
7434
  }
7516
7435
  const mockedResponse = resolverResult.data;
@@ -7520,7 +7439,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
7520
7439
  mockedResponse.status,
7521
7440
  mockedResponse.statusText
7522
7441
  );
7523
- if (mockedResponse.type === "error") {
7442
+ if (isResponseError(mockedResponse)) {
7524
7443
  this.logger.info(
7525
7444
  "received a network error response, rejecting the request promise..."
7526
7445
  );
@@ -7684,795 +7603,6 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
7684
7603
  }
7685
7604
  }
7686
7605
 
7687
- // node_modules/.pnpm/@mswjs+interceptors@0.27.1/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
7688
- function bindEvent(target, event) {
7689
- Object.defineProperties(event, {
7690
- target: {
7691
- value: target,
7692
- enumerable: true,
7693
- writable: true
7694
- },
7695
- currentTarget: {
7696
- value: target,
7697
- enumerable: true,
7698
- writable: true
7699
- }
7700
- });
7701
- return event;
7702
- }
7703
- var kCancelable = Symbol("kCancelable");
7704
- var kDefaultPrevented = Symbol("kDefaultPrevented");
7705
- var CancelableMessageEvent = class extends MessageEvent {
7706
- constructor(type, init) {
7707
- super(type, init);
7708
- this[kCancelable] = !!init.cancelable;
7709
- this[kDefaultPrevented] = false;
7710
- }
7711
- get cancelable() {
7712
- return this[kCancelable];
7713
- }
7714
- set cancelable(nextCancelable) {
7715
- this[kCancelable] = nextCancelable;
7716
- }
7717
- get defaultPrevented() {
7718
- return this[kDefaultPrevented];
7719
- }
7720
- set defaultPrevented(nextDefaultPrevented) {
7721
- this[kDefaultPrevented] = nextDefaultPrevented;
7722
- }
7723
- preventDefault() {
7724
- if (this.cancelable && !this[kDefaultPrevented]) {
7725
- this[kDefaultPrevented] = true;
7726
- }
7727
- }
7728
- };
7729
- var CloseEvent = class extends Event {
7730
- constructor(type, init = {}) {
7731
- super(type, init);
7732
- this.code = init.code === void 0 ? 0 : init.code;
7733
- this.reason = init.reason === void 0 ? "" : init.reason;
7734
- this.wasClean = init.wasClean === void 0 ? false : init.wasClean;
7735
- }
7736
- };
7737
- var kEmitter2 = Symbol("kEmitter");
7738
- var WebSocketClientConnection = class {
7739
- constructor(socket, transport) {
7740
- this.socket = socket;
7741
- this.transport = transport;
7742
- this.id = createRequestId();
7743
- this.url = new URL(socket.url);
7744
- this[kEmitter2] = new EventTarget();
7745
- this.transport.addEventListener("outgoing", (event) => {
7746
- const message3 = bindEvent(
7747
- this.socket,
7748
- new CancelableMessageEvent("message", {
7749
- data: event.data,
7750
- origin: event.origin,
7751
- cancelable: true
7752
- })
7753
- );
7754
- this[kEmitter2].dispatchEvent(message3);
7755
- if (message3.defaultPrevented) {
7756
- event.preventDefault();
7757
- }
7758
- });
7759
- this.transport.addEventListener("close", (event) => {
7760
- this[kEmitter2].dispatchEvent(
7761
- bindEvent(this.socket, new CloseEvent("close", event))
7762
- );
7763
- });
7764
- }
7765
- /**
7766
- * Listen for the outgoing events from the connected WebSocket client.
7767
- */
7768
- addEventListener(type, listener, options) {
7769
- this[kEmitter2].addEventListener(type, listener, options);
7770
- }
7771
- /**
7772
- * Removes the listener for the given event.
7773
- */
7774
- removeEventListener(event, listener, options) {
7775
- this[kEmitter2].removeEventListener(
7776
- event,
7777
- listener,
7778
- options
7779
- );
7780
- }
7781
- /**
7782
- * Send data to the connected client.
7783
- */
7784
- send(data) {
7785
- this.transport.send(data);
7786
- }
7787
- /**
7788
- * Close the WebSocket connection.
7789
- * @param {number} code A status code (see https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1).
7790
- * @param {string} reason A custom connection close reason.
7791
- */
7792
- close(code, reason) {
7793
- this.transport.close(code, reason);
7794
- }
7795
- };
7796
- var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range";
7797
- var kOnSend = Symbol("kOnSend");
7798
- var kClose = Symbol("kClose");
7799
- var WebSocketOverride = class extends EventTarget {
7800
- constructor(url, protocols) {
7801
- super();
7802
- this.CONNECTING = 0;
7803
- this.OPEN = 1;
7804
- this.CLOSING = 2;
7805
- this.CLOSED = 3;
7806
- this._onopen = null;
7807
- this._onmessage = null;
7808
- this._onerror = null;
7809
- this._onclose = null;
7810
- this.url = url.toString();
7811
- this.protocol = "";
7812
- this.extensions = "";
7813
- this.binaryType = "blob";
7814
- this.readyState = this.CONNECTING;
7815
- this.bufferedAmount = 0;
7816
- Reflect.set(this, "readyState", this.CONNECTING);
7817
- queueMicrotask(() => {
7818
- Reflect.set(this, "readyState", this.OPEN);
7819
- this.protocol = protocols ? protocols[0] : "ws";
7820
- this.dispatchEvent(bindEvent(this, new Event("open")));
7821
- });
7822
- }
7823
- set onopen(listener) {
7824
- this.removeEventListener("open", this._onopen);
7825
- this._onopen = listener;
7826
- if (listener !== null) {
7827
- this.addEventListener("open", listener);
7828
- }
7829
- }
7830
- get onopen() {
7831
- return this._onopen;
7832
- }
7833
- set onmessage(listener) {
7834
- this.removeEventListener(
7835
- "message",
7836
- this._onmessage
7837
- );
7838
- this._onmessage = listener;
7839
- if (listener !== null) {
7840
- this.addEventListener("message", listener);
7841
- }
7842
- }
7843
- get onmessage() {
7844
- return this._onmessage;
7845
- }
7846
- set onerror(listener) {
7847
- this.removeEventListener("error", this._onerror);
7848
- this._onerror = listener;
7849
- if (listener !== null) {
7850
- this.addEventListener("error", listener);
7851
- }
7852
- }
7853
- get onerror() {
7854
- return this._onerror;
7855
- }
7856
- set onclose(listener) {
7857
- this.removeEventListener("close", this._onclose);
7858
- this._onclose = listener;
7859
- if (listener !== null) {
7860
- this.addEventListener("close", listener);
7861
- }
7862
- }
7863
- get onclose() {
7864
- return this._onclose;
7865
- }
7866
- /**
7867
- * @see https://websockets.spec.whatwg.org/#ref-for-dom-websocket-send%E2%91%A0
7868
- */
7869
- send(data) {
7870
- if (this.readyState === this.CONNECTING) {
7871
- this.close();
7872
- throw new DOMException("InvalidStateError");
7873
- }
7874
- if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {
7875
- return;
7876
- }
7877
- this.bufferedAmount += getDataSize(data);
7878
- queueMicrotask(() => {
7879
- var _a2;
7880
- this.bufferedAmount = 0;
7881
- (_a2 = this[kOnSend]) == null ? void 0 : _a2.call(this, data);
7882
- });
7883
- }
7884
- close(code = 1e3, reason) {
7885
- invariant(code, WEBSOCKET_CLOSE_CODE_RANGE_ERROR);
7886
- invariant(
7887
- code === 1e3 || code >= 3e3 && code <= 4999,
7888
- WEBSOCKET_CLOSE_CODE_RANGE_ERROR
7889
- );
7890
- if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {
7891
- return;
7892
- }
7893
- this[kClose](code, reason);
7894
- }
7895
- [(kOnSend, kClose)](code = 1e3, reason) {
7896
- this.readyState = this.CLOSING;
7897
- queueMicrotask(() => {
7898
- this.readyState = this.CLOSED;
7899
- if (code > 1e3 && code <= 1015) {
7900
- this.dispatchEvent(bindEvent(this, new Event("error")));
7901
- }
7902
- this.dispatchEvent(
7903
- bindEvent(
7904
- this,
7905
- new CloseEvent("close", {
7906
- code,
7907
- reason,
7908
- wasClean: code === 1e3
7909
- })
7910
- )
7911
- );
7912
- this._onopen = null;
7913
- this._onmessage = null;
7914
- this._onerror = null;
7915
- this._onclose = null;
7916
- });
7917
- }
7918
- addEventListener(type, listener, options) {
7919
- return super.addEventListener(
7920
- type,
7921
- listener,
7922
- options
7923
- );
7924
- }
7925
- removeEventListener(type, callback, options) {
7926
- return super.removeEventListener(type, callback, options);
7927
- }
7928
- };
7929
- WebSocketOverride.CONNECTING = 0;
7930
- WebSocketOverride.OPEN = 1;
7931
- WebSocketOverride.CLOSING = 2;
7932
- WebSocketOverride.CLOSED = 3;
7933
- function getDataSize(data) {
7934
- if (typeof data === "string") {
7935
- return data.length;
7936
- }
7937
- if (data instanceof Blob) {
7938
- return data.size;
7939
- }
7940
- return data.byteLength;
7941
- }
7942
- var kEmitter22 = Symbol("kEmitter");
7943
- var WebSocketServerConnection = class {
7944
- constructor(socket, transport, createConnection) {
7945
- this.socket = socket;
7946
- this.transport = transport;
7947
- this.createConnection = createConnection;
7948
- this[kEmitter22] = new EventTarget();
7949
- this.mockCloseController = new AbortController();
7950
- this.transport.addEventListener("outgoing", (event) => {
7951
- if (this.readyState === -1) {
7952
- return;
7953
- }
7954
- queueMicrotask(() => {
7955
- if (!event.defaultPrevented) {
7956
- this.send(event.data);
7957
- }
7958
- });
7959
- });
7960
- this.transport.addEventListener(
7961
- "incoming",
7962
- this.handleIncomingMessage.bind(this)
7963
- );
7964
- }
7965
- /**
7966
- * Server ready state.
7967
- * Proxies the ready state of the original WebSocket instance,
7968
- * if set. If the original connection hasn't been established,
7969
- * defaults to `-1`.
7970
- */
7971
- get readyState() {
7972
- if (this.realWebSocket) {
7973
- return this.realWebSocket.readyState;
7974
- }
7975
- return -1;
7976
- }
7977
- /**
7978
- * Open connection to the original WebSocket server.
7979
- */
7980
- connect() {
7981
- invariant(
7982
- !this.realWebSocket || this.realWebSocket.readyState !== WebSocket.OPEN,
7983
- 'Failed to call "connect()" on the original WebSocket instance: the connection already open'
7984
- );
7985
- const realWebSocket = this.createConnection();
7986
- realWebSocket.binaryType = this.socket.binaryType;
7987
- realWebSocket.addEventListener(
7988
- "open",
7989
- (event) => {
7990
- this[kEmitter22].dispatchEvent(
7991
- bindEvent(this.realWebSocket, new Event("open", event))
7992
- );
7993
- },
7994
- { once: true }
7995
- );
7996
- realWebSocket.addEventListener("message", (event) => {
7997
- this.transport.dispatchEvent(
7998
- bindEvent(
7999
- this.realWebSocket,
8000
- new MessageEvent("incoming", {
8001
- data: event.data,
8002
- origin: event.origin
8003
- })
8004
- )
8005
- );
8006
- });
8007
- this.socket.addEventListener("close", this.handleMockClose.bind(this), {
8008
- signal: this.mockCloseController.signal
8009
- });
8010
- realWebSocket.addEventListener("close", this.handleRealClose.bind(this));
8011
- realWebSocket.addEventListener("error", () => {
8012
- this.socket.dispatchEvent(bindEvent(this.socket, new Event("error")));
8013
- });
8014
- this.realWebSocket = realWebSocket;
8015
- }
8016
- /**
8017
- * Listen for the incoming events from the original WebSocket server.
8018
- */
8019
- addEventListener(event, listener, options) {
8020
- this[kEmitter22].addEventListener(
8021
- event,
8022
- listener.bind(this.realWebSocket),
8023
- options
8024
- );
8025
- }
8026
- /**
8027
- * Remove the listener for the given event.
8028
- */
8029
- removeEventListener(event, listener, options) {
8030
- this[kEmitter22].removeEventListener(
8031
- event,
8032
- listener,
8033
- options
8034
- );
8035
- }
8036
- /**
8037
- * Send data to the original WebSocket server.
8038
- * @example
8039
- * server.send('hello')
8040
- * server.send(new Blob(['hello']))
8041
- * server.send(new TextEncoder().encode('hello'))
8042
- */
8043
- send(data) {
8044
- const { realWebSocket } = this;
8045
- invariant(
8046
- realWebSocket,
8047
- 'Failed to call "server.send()" for "%s": the connection is not open. Did you forget to call "server.connect()"?',
8048
- this.socket.url
8049
- );
8050
- if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
8051
- return;
8052
- }
8053
- if (realWebSocket.readyState === WebSocket.CONNECTING) {
8054
- realWebSocket.addEventListener(
8055
- "open",
8056
- () => {
8057
- realWebSocket.send(data);
8058
- },
8059
- { once: true }
8060
- );
8061
- return;
8062
- }
8063
- realWebSocket.send(data);
8064
- }
8065
- /**
8066
- * Close the actual server connection.
8067
- */
8068
- close() {
8069
- const { realWebSocket } = this;
8070
- invariant(
8071
- realWebSocket,
8072
- 'Failed to close server connection for "%s": the connection is not open. Did you forget to call "server.connect()"?',
8073
- this.socket.url
8074
- );
8075
- realWebSocket.removeEventListener("close", this.handleRealClose);
8076
- if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
8077
- return;
8078
- }
8079
- realWebSocket.close();
8080
- queueMicrotask(() => {
8081
- this[kEmitter22].dispatchEvent(
8082
- bindEvent(this.realWebSocket, new CloseEvent("close"))
8083
- );
8084
- });
8085
- }
8086
- handleIncomingMessage(event) {
8087
- const messageEvent = bindEvent(
8088
- event.target,
8089
- new CancelableMessageEvent("message", {
8090
- data: event.data,
8091
- origin: event.origin,
8092
- cancelable: true
8093
- })
8094
- );
8095
- this[kEmitter22].dispatchEvent(messageEvent);
8096
- if (!messageEvent.defaultPrevented) {
8097
- this.socket.dispatchEvent(
8098
- bindEvent(
8099
- /**
8100
- * @note Bind the forwarded original server events
8101
- * to the mock WebSocket instance so it would
8102
- * dispatch them straight away.
8103
- */
8104
- this.socket,
8105
- // Clone the message event again to prevent
8106
- // the "already being dispatched" exception.
8107
- new MessageEvent("message", {
8108
- data: event.data,
8109
- origin: event.origin
8110
- })
8111
- )
8112
- );
8113
- }
8114
- }
8115
- handleMockClose(_event) {
8116
- if (this.realWebSocket) {
8117
- this.realWebSocket.close();
8118
- }
8119
- }
8120
- handleRealClose(event) {
8121
- this.mockCloseController.abort();
8122
- const closeEvent = bindEvent(
8123
- this.realWebSocket,
8124
- new CloseEvent("close", event)
8125
- );
8126
- this[kEmitter22].dispatchEvent(closeEvent);
8127
- if (!closeEvent.defaultPrevented) {
8128
- this.socket[kClose](event.code, event.reason);
8129
- }
8130
- }
8131
- };
8132
- var WebSocketClassTransport = class extends EventTarget {
8133
- constructor(socket) {
8134
- super();
8135
- this.socket = socket;
8136
- this.socket.addEventListener("close", (event) => {
8137
- this.dispatchEvent(bindEvent(this.socket, new CloseEvent("close", event)));
8138
- });
8139
- this.socket[kOnSend] = (data) => {
8140
- this.dispatchEvent(
8141
- bindEvent(
8142
- this.socket,
8143
- // Dispatch this as cancelable because "client" connection
8144
- // re-creates this message event (cannot dispatch the same event).
8145
- new CancelableMessageEvent("outgoing", {
8146
- data,
8147
- origin: this.socket.url,
8148
- cancelable: true
8149
- })
8150
- )
8151
- );
8152
- };
8153
- }
8154
- addEventListener(type, callback, options) {
8155
- return super.addEventListener(type, callback, options);
8156
- }
8157
- dispatchEvent(event) {
8158
- return super.dispatchEvent(event);
8159
- }
8160
- send(data) {
8161
- queueMicrotask(() => {
8162
- this.socket.dispatchEvent(
8163
- bindEvent(
8164
- /**
8165
- * @note Setting this event's "target" to the
8166
- * WebSocket override instance is important.
8167
- * This way it can tell apart original incoming events
8168
- * (must be forwarded to the transport) from the
8169
- * mocked message events like the one below
8170
- * (must be dispatched on the client instance).
8171
- */
8172
- this.socket,
8173
- new MessageEvent("message", {
8174
- data,
8175
- origin: this.socket.url
8176
- })
8177
- )
8178
- );
8179
- });
8180
- }
8181
- close(code, reason) {
8182
- this.socket[kClose](code, reason);
8183
- }
8184
- };
8185
- var _WebSocketInterceptor = class extends Interceptor {
8186
- constructor() {
8187
- super(_WebSocketInterceptor.symbol);
8188
- }
8189
- checkEnvironment() {
8190
- return typeof globalThis.WebSocket !== "undefined";
8191
- }
8192
- setup() {
8193
- const originalWebSocket = globalThis.WebSocket;
8194
- const webSocketProxy = new Proxy(globalThis.WebSocket, {
8195
- construct: (target, args, newTarget) => {
8196
- const [url, protocols] = args;
8197
- const createConnection = () => {
8198
- return Reflect.construct(target, args, newTarget);
8199
- };
8200
- const socket = new WebSocketOverride(url, protocols);
8201
- const transport = new WebSocketClassTransport(socket);
8202
- queueMicrotask(() => {
8203
- this.emitter.emit("connection", {
8204
- client: new WebSocketClientConnection(socket, transport),
8205
- server: new WebSocketServerConnection(
8206
- socket,
8207
- transport,
8208
- createConnection
8209
- )
8210
- });
8211
- });
8212
- return socket;
8213
- }
8214
- });
8215
- globalThis.WebSocket = webSocketProxy;
8216
- this.subscriptions.push(() => {
8217
- globalThis.WebSocket = originalWebSocket;
8218
- });
8219
- }
8220
- };
8221
- var WebSocketInterceptor = _WebSocketInterceptor;
8222
- WebSocketInterceptor.symbol = Symbol("websocket");
8223
-
8224
- // src/core/ws/webSocketInterceptor.ts
8225
- var webSocketInterceptor = new WebSocketInterceptor();
8226
-
8227
- // src/core/ws/handleWebSocketEvent.ts
8228
- function handleWebSocketEvent(options) {
8229
- webSocketInterceptor.on("connection", (connection) => {
8230
- const handlers = options.getHandlers();
8231
- const connectionEvent = new MessageEvent("connection", {
8232
- data: connection
8233
- });
8234
- const matchingHandlers = handlers.filter(
8235
- (handler) => {
8236
- if (handler instanceof WebSocketHandler) {
8237
- return handler.predicate({
8238
- event: connectionEvent,
8239
- parsedResult: handler.parse({
8240
- event: connectionEvent
8241
- })
8242
- });
8243
- }
8244
- return false;
8245
- }
8246
- );
8247
- if (matchingHandlers.length > 0) {
8248
- options?.onMockedConnection(connection);
8249
- for (const handler of matchingHandlers) {
8250
- handler[kDispatchEvent](connectionEvent);
8251
- }
8252
- } else {
8253
- options?.onPassthroughConnection(connection);
8254
- connection.server.connect();
8255
- }
8256
- });
8257
- }
8258
-
8259
- // src/core/ws/utils/getMessageLength.ts
8260
- function getMessageLength(data) {
8261
- if (data instanceof Blob) {
8262
- return data.size;
8263
- }
8264
- if (data instanceof ArrayBuffer) {
8265
- return data.byteLength;
8266
- }
8267
- return new Blob([data]).size;
8268
- }
8269
-
8270
- // src/core/ws/utils/truncateMessage.ts
8271
- var MAX_LENGTH = 24;
8272
- function truncateMessage(message3) {
8273
- if (message3.length <= MAX_LENGTH) {
8274
- return message3;
8275
- }
8276
- return `${message3.slice(0, MAX_LENGTH)}\u2026`;
8277
- }
8278
-
8279
- // src/core/ws/utils/getPublicData.ts
8280
- async function getPublicData(data) {
8281
- if (data instanceof Blob) {
8282
- const text = await data.text();
8283
- return `Blob(${truncateMessage(text)})`;
8284
- }
8285
- if (typeof data === "object" && "byteLength" in data) {
8286
- const text = new TextDecoder().decode(data);
8287
- return `ArrayBuffer(${truncateMessage(text)})`;
8288
- }
8289
- return truncateMessage(data);
8290
- }
8291
-
8292
- // src/core/ws/utils/attachWebSocketLogger.ts
8293
- var colors = {
8294
- blue: "#3b82f6",
8295
- green: "#22c55e",
8296
- red: "#ef4444",
8297
- orange: "#ff6a33"
8298
- };
8299
- function attachWebSocketLogger(connection) {
8300
- const { client, server } = connection;
8301
- logConnectionOpen(client);
8302
- client.addEventListener("message", (event) => {
8303
- logOutgoingClientMessage(event);
8304
- });
8305
- client.addEventListener("close", (event) => {
8306
- logConnectionClose(event);
8307
- });
8308
- client.socket.addEventListener("message", (event) => {
8309
- logIncomingClientMessage(event);
8310
- });
8311
- client.socket.addEventListener("error", (event) => {
8312
- logClientError(event);
8313
- });
8314
- client.send = new Proxy(client.send, {
8315
- apply(target, thisArg, args) {
8316
- const [data] = args;
8317
- const messageEvent = new MessageEvent("message", { data });
8318
- Object.defineProperties(messageEvent, {
8319
- currentTarget: {
8320
- enumerable: true,
8321
- writable: false,
8322
- value: client.socket
8323
- },
8324
- target: {
8325
- enumerable: true,
8326
- writable: false,
8327
- value: client.socket
8328
- }
8329
- });
8330
- logIncomingMockedClientMessage(messageEvent);
8331
- return Reflect.apply(target, thisArg, args);
8332
- }
8333
- });
8334
- server.addEventListener(
8335
- "open",
8336
- () => {
8337
- server.addEventListener("message", (event) => {
8338
- logIncomingServerMessage(event);
8339
- });
8340
- },
8341
- { once: true }
8342
- );
8343
- server.send = new Proxy(server.send, {
8344
- apply(target, thisArg, args) {
8345
- const [data] = args;
8346
- const messageEvent = new MessageEvent("message", { data });
8347
- Object.defineProperties(messageEvent, {
8348
- currentTarget: {
8349
- enumerable: true,
8350
- writable: false,
8351
- value: server["realWebSocket"]
8352
- },
8353
- target: {
8354
- enumerable: true,
8355
- writable: false,
8356
- value: server["realWebSocket"]
8357
- }
8358
- });
8359
- logOutgoingMockedClientMessage(messageEvent);
8360
- return Reflect.apply(target, thisArg, args);
8361
- }
8362
- });
8363
- }
8364
- function logConnectionOpen(client) {
8365
- const publicUrl = toPublicUrl(client.url);
8366
- console.groupCollapsed(
8367
- devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
8368
- `color:${colors.blue}`,
8369
- "color:inherit"
8370
- );
8371
- console.log("Client:", client.socket);
8372
- console.groupEnd();
8373
- }
8374
- async function logOutgoingClientMessage(event) {
8375
- const byteLength = getMessageLength(event.data);
8376
- const publicData = await getPublicData(event.data);
8377
- console.groupCollapsed(
8378
- devUtils.formatMessage(
8379
- `${getTimestamp({ milliseconds: true })} %c\u2191%c ${publicData} %c${byteLength}%c`
8380
- ),
8381
- `color:${colors.green}`,
8382
- "color:inherit",
8383
- "color:gray;font-weight:normal",
8384
- "color:inherit;font-weight:inherit"
8385
- );
8386
- console.log(event);
8387
- console.groupEnd();
8388
- }
8389
- async function logOutgoingMockedClientMessage(event) {
8390
- const byteLength = getMessageLength(event.data);
8391
- const publicData = await getPublicData(event.data);
8392
- console.groupCollapsed(
8393
- devUtils.formatMessage(
8394
- `${getTimestamp({ milliseconds: true })} %c\u21E1%c ${publicData} %c${byteLength}%c`
8395
- ),
8396
- `color:${colors.orange}`,
8397
- "color:inherit",
8398
- "color:gray;font-weight:normal",
8399
- "color:inherit;font-weight:inherit"
8400
- );
8401
- console.log(event);
8402
- console.groupEnd();
8403
- }
8404
- async function logIncomingClientMessage(event) {
8405
- const byteLength = getMessageLength(event.data);
8406
- const publicData = await getPublicData(event.data);
8407
- console.groupCollapsed(
8408
- devUtils.formatMessage(
8409
- `${getTimestamp({ milliseconds: true })} %c\u2193%c ${publicData} %c${byteLength}%c`
8410
- ),
8411
- `color:${colors.red}`,
8412
- "color:inherit",
8413
- "color:gray;font-weight:normal",
8414
- "color:inherit;font-weight:inherit"
8415
- );
8416
- console.log(event);
8417
- console.groupEnd();
8418
- }
8419
- async function logIncomingMockedClientMessage(event) {
8420
- const byteLength = getMessageLength(event.data);
8421
- const publicData = await getPublicData(event.data);
8422
- console.groupCollapsed(
8423
- devUtils.formatMessage(
8424
- `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
8425
- ),
8426
- `color:${colors.orange}`,
8427
- "color:inherit",
8428
- "color:gray;font-weight:normal",
8429
- "color:inherit;font-weight:inherit"
8430
- );
8431
- console.log(event);
8432
- console.groupEnd();
8433
- }
8434
- function logConnectionClose(event) {
8435
- const target = event.target;
8436
- const publicUrl = toPublicUrl(target.url);
8437
- console.groupCollapsed(
8438
- devUtils.formatMessage(
8439
- `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
8440
- ),
8441
- `color:${colors.blue}`,
8442
- "color:inherit"
8443
- );
8444
- console.log(event);
8445
- console.groupEnd();
8446
- }
8447
- async function logIncomingServerMessage(event) {
8448
- const byteLength = getMessageLength(event.data);
8449
- const publicData = await getPublicData(event.data);
8450
- console.groupCollapsed(
8451
- devUtils.formatMessage(
8452
- `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
8453
- ),
8454
- `color:${colors.green}`,
8455
- "color:inherit",
8456
- "color:gray;font-weight:normal",
8457
- "color:inherit;font-weight:inherit"
8458
- );
8459
- console.log(event);
8460
- console.groupEnd();
8461
- }
8462
- function logClientError(event) {
8463
- const socket = event.target;
8464
- const publicUrl = toPublicUrl(socket.url);
8465
- console.groupCollapsed(
8466
- devUtils.formatMessage(
8467
- `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
8468
- ),
8469
- `color:${colors.blue}`,
8470
- "color:inherit"
8471
- );
8472
- console.log(event);
8473
- console.groupEnd();
8474
- }
8475
-
8476
7606
  // src/browser/setupWorker/setupWorker.ts
8477
7607
  var SetupWorkerApi = class extends SetupApi {
8478
7608
  context;
@@ -8589,22 +7719,6 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
8589
7719
  DEFAULT_START_OPTIONS,
8590
7720
  options
8591
7721
  );
8592
- handleWebSocketEvent({
8593
- getHandlers: () => {
8594
- return this.handlersController.currentHandlers();
8595
- },
8596
- onMockedConnection: (connection) => {
8597
- if (!this.context.startOptions.quiet) {
8598
- attachWebSocketLogger(connection);
8599
- }
8600
- },
8601
- onPassthroughConnection() {
8602
- }
8603
- });
8604
- webSocketInterceptor.apply();
8605
- this.subscriptions.push(() => {
8606
- webSocketInterceptor.dispose();
8607
- });
8608
7722
  return await this.startHandler(this.context.startOptions, options);
8609
7723
  }
8610
7724
  stop() {