msw 2.5.2 → 2.6.1
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.d.mts +7 -6
- package/lib/browser/index.d.ts +7 -6
- package/lib/browser/index.js +28 -2
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/index.mjs +28 -2
- package/lib/browser/index.mjs.map +1 -1
- package/lib/core/{GraphQLHandler-ClMB0BOy.d.mts → GraphQLHandler-B6uni-E_.d.mts} +1 -1
- package/lib/core/{GraphQLHandler-D6mLMXGZ.d.ts → GraphQLHandler-Cjm7JNGi.d.ts} +1 -1
- package/lib/core/{HttpResponse-vn-Pb4Bi.d.mts → HttpResponse-63H9vVoL.d.mts} +1 -0
- package/lib/core/{HttpResponse-DaYkf3ml.d.ts → HttpResponse-DzhqZzTK.d.ts} +1 -0
- package/lib/core/HttpResponse.d.mts +1 -1
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/SetupApi.d.mts +15 -12
- package/lib/core/SetupApi.d.ts +15 -12
- package/lib/core/SetupApi.js +3 -1
- package/lib/core/SetupApi.js.map +1 -1
- package/lib/core/SetupApi.mjs +3 -1
- package/lib/core/SetupApi.mjs.map +1 -1
- package/lib/core/getResponse.d.mts +1 -1
- package/lib/core/getResponse.d.ts +1 -1
- package/lib/core/graphql.d.mts +2 -2
- package/lib/core/graphql.d.ts +2 -2
- package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
- package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
- package/lib/core/handlers/HttpHandler.d.mts +1 -1
- package/lib/core/handlers/HttpHandler.d.ts +1 -1
- package/lib/core/handlers/RequestHandler.d.mts +1 -1
- package/lib/core/handlers/RequestHandler.d.ts +1 -1
- package/lib/core/handlers/RequestHandler.js +2 -0
- package/lib/core/handlers/RequestHandler.js.map +1 -1
- package/lib/core/handlers/RequestHandler.mjs +2 -0
- package/lib/core/handlers/RequestHandler.mjs.map +1 -1
- package/lib/core/handlers/WebSocketHandler.d.mts +34 -0
- package/lib/core/handlers/WebSocketHandler.d.ts +34 -0
- package/lib/core/handlers/WebSocketHandler.js +122 -0
- package/lib/core/handlers/WebSocketHandler.js.map +1 -0
- package/lib/core/handlers/WebSocketHandler.mjs +104 -0
- package/lib/core/handlers/WebSocketHandler.mjs.map +1 -0
- package/lib/core/handlers/common.d.mts +3 -0
- package/lib/core/handlers/common.d.ts +3 -0
- package/lib/core/handlers/common.js +17 -0
- package/lib/core/handlers/common.js.map +1 -0
- package/lib/core/handlers/common.mjs +1 -0
- package/lib/core/handlers/common.mjs.map +1 -0
- package/lib/core/http.d.mts +1 -1
- package/lib/core/http.d.ts +1 -1
- package/lib/core/index.d.mts +5 -2
- package/lib/core/index.d.ts +5 -2
- package/lib/core/index.js +5 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/index.mjs +7 -1
- package/lib/core/index.mjs.map +1 -1
- package/lib/core/passthrough.d.mts +1 -1
- package/lib/core/passthrough.d.ts +1 -1
- package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
- package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
- package/lib/core/utils/executeHandlers.d.mts +1 -1
- package/lib/core/utils/executeHandlers.d.ts +1 -1
- package/lib/core/utils/executeHandlers.js.map +1 -1
- package/lib/core/utils/executeHandlers.mjs.map +1 -1
- package/lib/core/utils/handleRequest.d.mts +2 -2
- package/lib/core/utils/handleRequest.d.ts +2 -2
- package/lib/core/utils/handleRequest.js.map +1 -1
- package/lib/core/utils/handleRequest.mjs.map +1 -1
- package/lib/core/utils/internal/isHandlerKind.d.mts +17 -0
- package/lib/core/utils/internal/isHandlerKind.d.ts +17 -0
- package/lib/core/utils/internal/isHandlerKind.js +29 -0
- package/lib/core/utils/internal/isHandlerKind.js.map +1 -0
- package/lib/core/utils/internal/isHandlerKind.mjs +9 -0
- package/lib/core/utils/internal/isHandlerKind.mjs.map +1 -0
- package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
- package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
- package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
- package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
- package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
- package/lib/core/utils/logging/getTimestamp.d.mts +4 -1
- package/lib/core/utils/logging/getTimestamp.d.ts +4 -1
- package/lib/core/utils/logging/getTimestamp.js +6 -2
- package/lib/core/utils/logging/getTimestamp.js.map +1 -1
- package/lib/core/utils/logging/getTimestamp.mjs +6 -2
- package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
- package/lib/core/utils/matching/matchRequestUrl.d.mts +2 -1
- package/lib/core/utils/matching/matchRequestUrl.d.ts +2 -1
- package/lib/core/utils/matching/matchRequestUrl.js +4 -0
- package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
- package/lib/core/utils/matching/matchRequestUrl.mjs +4 -0
- package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
- package/lib/core/ws/WebSocketClientManager.d.mts +63 -0
- package/lib/core/ws/WebSocketClientManager.d.ts +63 -0
- package/lib/core/ws/WebSocketClientManager.js +149 -0
- package/lib/core/ws/WebSocketClientManager.js.map +1 -0
- package/lib/core/ws/WebSocketClientManager.mjs +129 -0
- package/lib/core/ws/WebSocketClientManager.mjs.map +1 -0
- package/lib/core/ws/WebSocketClientStore.d.mts +13 -0
- package/lib/core/ws/WebSocketClientStore.d.ts +13 -0
- package/lib/core/ws/WebSocketClientStore.js +26 -0
- package/lib/core/ws/WebSocketClientStore.js.map +1 -0
- package/lib/core/ws/WebSocketClientStore.mjs +6 -0
- package/lib/core/ws/WebSocketClientStore.mjs.map +1 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.d.mts +15 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.d.ts +15 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.js +130 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.js.map +1 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.mjs +110 -0
- package/lib/core/ws/WebSocketIndexedDBClientStore.mjs.map +1 -0
- package/lib/core/ws/WebSocketMemoryClientStore.d.mts +13 -0
- package/lib/core/ws/WebSocketMemoryClientStore.d.ts +13 -0
- package/lib/core/ws/WebSocketMemoryClientStore.js +41 -0
- package/lib/core/ws/WebSocketMemoryClientStore.js.map +1 -0
- package/lib/core/ws/WebSocketMemoryClientStore.mjs +21 -0
- package/lib/core/ws/WebSocketMemoryClientStore.mjs.map +1 -0
- package/lib/core/ws/handleWebSocketEvent.d.mts +19 -0
- package/lib/core/ws/handleWebSocketEvent.d.ts +19 -0
- package/lib/core/ws/handleWebSocketEvent.js +74 -0
- package/lib/core/ws/handleWebSocketEvent.js.map +1 -0
- package/lib/core/ws/handleWebSocketEvent.mjs +56 -0
- package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -0
- package/lib/core/ws/utils/attachWebSocketLogger.d.mts +12 -0
- package/lib/core/ws/utils/attachWebSocketLogger.d.ts +12 -0
- package/lib/core/ws/utils/attachWebSocketLogger.js +198 -0
- package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -0
- package/lib/core/ws/utils/attachWebSocketLogger.mjs +178 -0
- package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -0
- package/lib/core/ws/utils/getMessageLength.d.mts +11 -0
- package/lib/core/ws/utils/getMessageLength.d.ts +11 -0
- package/lib/core/ws/utils/getMessageLength.js +33 -0
- package/lib/core/ws/utils/getMessageLength.js.map +1 -0
- package/lib/core/ws/utils/getMessageLength.mjs +13 -0
- package/lib/core/ws/utils/getMessageLength.mjs.map +1 -0
- package/lib/core/ws/utils/getPublicData.d.mts +5 -0
- package/lib/core/ws/utils/getPublicData.d.ts +5 -0
- package/lib/core/ws/utils/getPublicData.js +36 -0
- package/lib/core/ws/utils/getPublicData.js.map +1 -0
- package/lib/core/ws/utils/getPublicData.mjs +16 -0
- package/lib/core/ws/utils/getPublicData.mjs.map +1 -0
- package/lib/core/ws/utils/truncateMessage.d.mts +3 -0
- package/lib/core/ws/utils/truncateMessage.d.ts +3 -0
- package/lib/core/ws/utils/truncateMessage.js +31 -0
- package/lib/core/ws/utils/truncateMessage.js.map +1 -0
- package/lib/core/ws/utils/truncateMessage.mjs +11 -0
- package/lib/core/ws/utils/truncateMessage.mjs.map +1 -0
- package/lib/core/ws/webSocketInterceptor.d.mts +5 -0
- package/lib/core/ws/webSocketInterceptor.d.ts +5 -0
- package/lib/core/ws/webSocketInterceptor.js +26 -0
- package/lib/core/ws/webSocketInterceptor.js.map +1 -0
- package/lib/core/ws/webSocketInterceptor.mjs +6 -0
- package/lib/core/ws/webSocketInterceptor.mjs.map +1 -0
- package/lib/core/ws.d.mts +75 -0
- package/lib/core/ws.d.ts +75 -0
- package/lib/core/ws.js +71 -0
- package/lib/core/ws.js.map +1 -0
- package/lib/core/ws.mjs +54 -0
- package/lib/core/ws.mjs.map +1 -0
- package/lib/iife/index.js +1420 -86
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.d.mts +6 -5
- package/lib/native/index.d.ts +6 -5
- package/lib/native/index.js +19 -4
- package/lib/native/index.js.map +1 -1
- package/lib/native/index.mjs +19 -4
- package/lib/native/index.mjs.map +1 -1
- package/lib/node/index.d.mts +8 -7
- package/lib/node/index.d.ts +8 -7
- package/lib/node/index.js +19 -4
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +19 -4
- package/lib/node/index.mjs.map +1 -1
- package/package.json +10 -1
- package/src/browser/setupWorker/glossary.ts +10 -10
- package/src/browser/setupWorker/setupWorker.ts +32 -3
- package/src/browser/setupWorker/start/createFallbackRequestListener.ts +2 -1
- package/src/browser/setupWorker/start/createRequestListener.ts +2 -1
- package/src/browser/setupWorker/start/createStartHandler.ts +5 -0
- package/src/browser/setupWorker/stop/createStop.ts +6 -0
- package/src/core/SetupApi.ts +28 -20
- package/src/core/handlers/RequestHandler.ts +4 -0
- package/src/core/handlers/WebSocketHandler.ts +146 -0
- package/src/core/handlers/common.ts +1 -0
- package/src/core/index.ts +11 -1
- package/src/core/utils/executeHandlers.ts +1 -1
- package/src/core/utils/handleRequest.ts +1 -1
- package/src/core/utils/internal/isHandlerKind.test.ts +64 -0
- package/src/core/utils/internal/isHandlerKind.ts +21 -0
- package/src/core/utils/logging/getTimestamp.test.ts +20 -6
- package/src/core/utils/logging/getTimestamp.ts +11 -6
- package/src/core/utils/matching/matchRequestUrl.test.ts +44 -0
- package/src/core/utils/matching/matchRequestUrl.ts +4 -0
- package/src/core/ws/WebSocketClientManager.test.ts +164 -0
- package/src/core/ws/WebSocketClientManager.ts +211 -0
- package/src/core/ws/WebSocketClientStore.ts +14 -0
- package/src/core/ws/WebSocketIndexedDBClientStore.ts +145 -0
- package/src/core/ws/WebSocketMemoryClientStore.ts +27 -0
- package/src/core/ws/handleWebSocketEvent.ts +83 -0
- package/src/core/ws/utils/attachWebSocketLogger.ts +259 -0
- package/src/core/ws/utils/getMessageLength.test.ts +16 -0
- package/src/core/ws/utils/getMessageLength.ts +19 -0
- package/src/core/ws/utils/getPublicData.test.ts +38 -0
- package/src/core/ws/utils/getPublicData.ts +17 -0
- package/src/core/ws/utils/truncateMessage.test.ts +12 -0
- package/src/core/ws/utils/truncateMessage.ts +9 -0
- package/src/core/ws/webSocketInterceptor.ts +3 -0
- package/src/core/ws.test.ts +23 -0
- package/src/core/ws.ts +166 -0
- package/src/node/SetupServerApi.ts +8 -7
- package/src/node/SetupServerCommonApi.ts +25 -5
- package/src/node/glossary.ts +5 -7
- package/src/node/setupServer.ts +2 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WebSocketConnectionData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket';
|
|
2
|
+
import { R as RequestHandler } from '../HttpResponse-DzhqZzTK.js';
|
|
3
|
+
import { WebSocketHandler } from '../handlers/WebSocketHandler.js';
|
|
4
|
+
import { UnhandledRequestStrategy } from '../utils/request/onUnhandledRequest.js';
|
|
5
|
+
import '../utils/internal/isIterable.js';
|
|
6
|
+
import '../typeUtils.js';
|
|
7
|
+
import 'strict-event-emitter';
|
|
8
|
+
import '@mswjs/interceptors/WebSocket';
|
|
9
|
+
import '../utils/matching/matchRequestUrl.js';
|
|
10
|
+
|
|
11
|
+
interface HandleWebSocketEventOptions {
|
|
12
|
+
getUnhandledRequestStrategy: () => UnhandledRequestStrategy;
|
|
13
|
+
getHandlers: () => Array<RequestHandler | WebSocketHandler>;
|
|
14
|
+
onMockedConnection: (connection: WebSocketConnectionData) => void;
|
|
15
|
+
onPassthroughConnection: (onnection: WebSocketConnectionData) => void;
|
|
16
|
+
}
|
|
17
|
+
declare function handleWebSocketEvent(options: HandleWebSocketEventOptions): void;
|
|
18
|
+
|
|
19
|
+
export { handleWebSocketEvent };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var handleWebSocketEvent_exports = {};
|
|
20
|
+
__export(handleWebSocketEvent_exports, {
|
|
21
|
+
handleWebSocketEvent: () => handleWebSocketEvent
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(handleWebSocketEvent_exports);
|
|
24
|
+
var import_WebSocketHandler = require("../handlers/WebSocketHandler.js");
|
|
25
|
+
var import_webSocketInterceptor = require("./webSocketInterceptor.js");
|
|
26
|
+
var import_onUnhandledRequest = require("../utils/request/onUnhandledRequest.js");
|
|
27
|
+
var import_isHandlerKind = require("../utils/internal/isHandlerKind.js");
|
|
28
|
+
function handleWebSocketEvent(options) {
|
|
29
|
+
import_webSocketInterceptor.webSocketInterceptor.on("connection", async (connection) => {
|
|
30
|
+
const handlers = options.getHandlers();
|
|
31
|
+
const connectionEvent = new MessageEvent("connection", {
|
|
32
|
+
data: connection
|
|
33
|
+
});
|
|
34
|
+
const matchingHandlers = [];
|
|
35
|
+
for (const handler of handlers) {
|
|
36
|
+
if ((0, import_isHandlerKind.isHandlerKind)("EventHandler")(handler) && handler.predicate({
|
|
37
|
+
event: connectionEvent,
|
|
38
|
+
parsedResult: handler.parse({
|
|
39
|
+
event: connectionEvent
|
|
40
|
+
})
|
|
41
|
+
})) {
|
|
42
|
+
matchingHandlers.push(handler);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (matchingHandlers.length > 0) {
|
|
46
|
+
options?.onMockedConnection(connection);
|
|
47
|
+
for (const handler of matchingHandlers) {
|
|
48
|
+
handler[import_WebSocketHandler.kDispatchEvent](connectionEvent);
|
|
49
|
+
}
|
|
50
|
+
} else {
|
|
51
|
+
const request = new Request(connection.client.url, {
|
|
52
|
+
headers: {
|
|
53
|
+
upgrade: "websocket",
|
|
54
|
+
connection: "upgrade"
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
await (0, import_onUnhandledRequest.onUnhandledRequest)(
|
|
58
|
+
request,
|
|
59
|
+
options.getUnhandledRequestStrategy()
|
|
60
|
+
).catch((error) => {
|
|
61
|
+
const errorEvent = new Event("error");
|
|
62
|
+
Object.defineProperty(errorEvent, "cause", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
configurable: false,
|
|
65
|
+
value: error
|
|
66
|
+
});
|
|
67
|
+
connection.client.socket.dispatchEvent(errorEvent);
|
|
68
|
+
});
|
|
69
|
+
options?.onPassthroughConnection(connection);
|
|
70
|
+
connection.server.connect();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=handleWebSocketEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/ws/handleWebSocketEvent.ts"],"sourcesContent":["import type { WebSocketConnectionData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket'\nimport { RequestHandler } from '../handlers/RequestHandler'\nimport { WebSocketHandler, kDispatchEvent } from '../handlers/WebSocketHandler'\nimport { webSocketInterceptor } from './webSocketInterceptor'\nimport {\n onUnhandledRequest,\n UnhandledRequestStrategy,\n} from '../utils/request/onUnhandledRequest'\nimport { isHandlerKind } from '../utils/internal/isHandlerKind'\n\ninterface HandleWebSocketEventOptions {\n getUnhandledRequestStrategy: () => UnhandledRequestStrategy\n getHandlers: () => Array<RequestHandler | WebSocketHandler>\n onMockedConnection: (connection: WebSocketConnectionData) => void\n onPassthroughConnection: (onnection: WebSocketConnectionData) => void\n}\n\nexport function handleWebSocketEvent(options: HandleWebSocketEventOptions) {\n webSocketInterceptor.on('connection', async (connection) => {\n const handlers = options.getHandlers()\n\n const connectionEvent = new MessageEvent('connection', {\n data: connection,\n })\n\n // First, filter only those WebSocket handlers that\n // match the \"ws.link()\" endpoint predicate. Don't dispatch\n // anything yet so the logger can be attached to the connection\n // before it potentially sends events.\n const matchingHandlers: Array<WebSocketHandler> = []\n\n for (const handler of handlers) {\n if (\n isHandlerKind('EventHandler')(handler) &&\n handler.predicate({\n event: connectionEvent,\n parsedResult: handler.parse({\n event: connectionEvent,\n }),\n })\n ) {\n matchingHandlers.push(handler)\n }\n }\n\n if (matchingHandlers.length > 0) {\n options?.onMockedConnection(connection)\n\n // Iterate over the handlers and forward the connection\n // event to WebSocket event handlers. This is equivalent\n // to dispatching that event onto multiple listeners.\n for (const handler of matchingHandlers) {\n handler[kDispatchEvent](connectionEvent)\n }\n } else {\n // Construct a request representing this WebSocket connection.\n const request = new Request(connection.client.url, {\n headers: {\n upgrade: 'websocket',\n connection: 'upgrade',\n },\n })\n await onUnhandledRequest(\n request,\n options.getUnhandledRequestStrategy(),\n ).catch((error) => {\n const errorEvent = new Event('error')\n Object.defineProperty(errorEvent, 'cause', {\n enumerable: true,\n configurable: false,\n value: error,\n })\n connection.client.socket.dispatchEvent(errorEvent)\n })\n\n options?.onPassthroughConnection(connection)\n\n // If none of the \"ws\" handlers matched,\n // establish the WebSocket connection as-is.\n connection.server.connect()\n }\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAAiD;AACjD,kCAAqC;AACrC,gCAGO;AACP,2BAA8B;AASvB,SAAS,qBAAqB,SAAsC;AACzE,mDAAqB,GAAG,cAAc,OAAO,eAAe;AAC1D,UAAM,WAAW,QAAQ,YAAY;AAErC,UAAM,kBAAkB,IAAI,aAAa,cAAc;AAAA,MACrD,MAAM;AAAA,IACR,CAAC;AAMD,UAAM,mBAA4C,CAAC;AAEnD,eAAW,WAAW,UAAU;AAC9B,cACE,oCAAc,cAAc,EAAE,OAAO,KACrC,QAAQ,UAAU;AAAA,QAChB,OAAO;AAAA,QACP,cAAc,QAAQ,MAAM;AAAA,UAC1B,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC,GACD;AACA,yBAAiB,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAS,mBAAmB,UAAU;AAKtC,iBAAW,WAAW,kBAAkB;AACtC,gBAAQ,sCAAc,EAAE,eAAe;AAAA,MACzC;AAAA,IACF,OAAO;AAEL,YAAM,UAAU,IAAI,QAAQ,WAAW,OAAO,KAAK;AAAA,QACjD,SAAS;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF,CAAC;AACD,gBAAM;AAAA,QACJ;AAAA,QACA,QAAQ,4BAA4B;AAAA,MACtC,EAAE,MAAM,CAAC,UAAU;AACjB,cAAM,aAAa,IAAI,MAAM,OAAO;AACpC,eAAO,eAAe,YAAY,SAAS;AAAA,UACzC,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AACD,mBAAW,OAAO,OAAO,cAAc,UAAU;AAAA,MACnD,CAAC;AAED,eAAS,wBAAwB,UAAU;AAI3C,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { kDispatchEvent } from '../handlers/WebSocketHandler.mjs';
|
|
2
|
+
import { webSocketInterceptor } from './webSocketInterceptor.mjs';
|
|
3
|
+
import {
|
|
4
|
+
onUnhandledRequest
|
|
5
|
+
} from '../utils/request/onUnhandledRequest.mjs';
|
|
6
|
+
import { isHandlerKind } from '../utils/internal/isHandlerKind.mjs';
|
|
7
|
+
function handleWebSocketEvent(options) {
|
|
8
|
+
webSocketInterceptor.on("connection", async (connection) => {
|
|
9
|
+
const handlers = options.getHandlers();
|
|
10
|
+
const connectionEvent = new MessageEvent("connection", {
|
|
11
|
+
data: connection
|
|
12
|
+
});
|
|
13
|
+
const matchingHandlers = [];
|
|
14
|
+
for (const handler of handlers) {
|
|
15
|
+
if (isHandlerKind("EventHandler")(handler) && handler.predicate({
|
|
16
|
+
event: connectionEvent,
|
|
17
|
+
parsedResult: handler.parse({
|
|
18
|
+
event: connectionEvent
|
|
19
|
+
})
|
|
20
|
+
})) {
|
|
21
|
+
matchingHandlers.push(handler);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (matchingHandlers.length > 0) {
|
|
25
|
+
options?.onMockedConnection(connection);
|
|
26
|
+
for (const handler of matchingHandlers) {
|
|
27
|
+
handler[kDispatchEvent](connectionEvent);
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
const request = new Request(connection.client.url, {
|
|
31
|
+
headers: {
|
|
32
|
+
upgrade: "websocket",
|
|
33
|
+
connection: "upgrade"
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
await onUnhandledRequest(
|
|
37
|
+
request,
|
|
38
|
+
options.getUnhandledRequestStrategy()
|
|
39
|
+
).catch((error) => {
|
|
40
|
+
const errorEvent = new Event("error");
|
|
41
|
+
Object.defineProperty(errorEvent, "cause", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: false,
|
|
44
|
+
value: error
|
|
45
|
+
});
|
|
46
|
+
connection.client.socket.dispatchEvent(errorEvent);
|
|
47
|
+
});
|
|
48
|
+
options?.onPassthroughConnection(connection);
|
|
49
|
+
connection.server.connect();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
handleWebSocketEvent
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=handleWebSocketEvent.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/ws/handleWebSocketEvent.ts"],"sourcesContent":["import type { WebSocketConnectionData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket'\nimport { RequestHandler } from '../handlers/RequestHandler'\nimport { WebSocketHandler, kDispatchEvent } from '../handlers/WebSocketHandler'\nimport { webSocketInterceptor } from './webSocketInterceptor'\nimport {\n onUnhandledRequest,\n UnhandledRequestStrategy,\n} from '../utils/request/onUnhandledRequest'\nimport { isHandlerKind } from '../utils/internal/isHandlerKind'\n\ninterface HandleWebSocketEventOptions {\n getUnhandledRequestStrategy: () => UnhandledRequestStrategy\n getHandlers: () => Array<RequestHandler | WebSocketHandler>\n onMockedConnection: (connection: WebSocketConnectionData) => void\n onPassthroughConnection: (onnection: WebSocketConnectionData) => void\n}\n\nexport function handleWebSocketEvent(options: HandleWebSocketEventOptions) {\n webSocketInterceptor.on('connection', async (connection) => {\n const handlers = options.getHandlers()\n\n const connectionEvent = new MessageEvent('connection', {\n data: connection,\n })\n\n // First, filter only those WebSocket handlers that\n // match the \"ws.link()\" endpoint predicate. Don't dispatch\n // anything yet so the logger can be attached to the connection\n // before it potentially sends events.\n const matchingHandlers: Array<WebSocketHandler> = []\n\n for (const handler of handlers) {\n if (\n isHandlerKind('EventHandler')(handler) &&\n handler.predicate({\n event: connectionEvent,\n parsedResult: handler.parse({\n event: connectionEvent,\n }),\n })\n ) {\n matchingHandlers.push(handler)\n }\n }\n\n if (matchingHandlers.length > 0) {\n options?.onMockedConnection(connection)\n\n // Iterate over the handlers and forward the connection\n // event to WebSocket event handlers. This is equivalent\n // to dispatching that event onto multiple listeners.\n for (const handler of matchingHandlers) {\n handler[kDispatchEvent](connectionEvent)\n }\n } else {\n // Construct a request representing this WebSocket connection.\n const request = new Request(connection.client.url, {\n headers: {\n upgrade: 'websocket',\n connection: 'upgrade',\n },\n })\n await onUnhandledRequest(\n request,\n options.getUnhandledRequestStrategy(),\n ).catch((error) => {\n const errorEvent = new Event('error')\n Object.defineProperty(errorEvent, 'cause', {\n enumerable: true,\n configurable: false,\n value: error,\n })\n connection.client.socket.dispatchEvent(errorEvent)\n })\n\n options?.onPassthroughConnection(connection)\n\n // If none of the \"ws\" handlers matched,\n // establish the WebSocket connection as-is.\n connection.server.connect()\n }\n })\n}\n"],"mappings":"AAEA,SAA2B,sBAAsB;AACjD,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,OAEK;AACP,SAAS,qBAAqB;AASvB,SAAS,qBAAqB,SAAsC;AACzE,uBAAqB,GAAG,cAAc,OAAO,eAAe;AAC1D,UAAM,WAAW,QAAQ,YAAY;AAErC,UAAM,kBAAkB,IAAI,aAAa,cAAc;AAAA,MACrD,MAAM;AAAA,IACR,CAAC;AAMD,UAAM,mBAA4C,CAAC;AAEnD,eAAW,WAAW,UAAU;AAC9B,UACE,cAAc,cAAc,EAAE,OAAO,KACrC,QAAQ,UAAU;AAAA,QAChB,OAAO;AAAA,QACP,cAAc,QAAQ,MAAM;AAAA,UAC1B,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC,GACD;AACA,yBAAiB,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAS,mBAAmB,UAAU;AAKtC,iBAAW,WAAW,kBAAkB;AACtC,gBAAQ,cAAc,EAAE,eAAe;AAAA,MACzC;AAAA,IACF,OAAO;AAEL,YAAM,UAAU,IAAI,QAAQ,WAAW,OAAO,KAAK;AAAA,QACjD,SAAS;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF,CAAC;AACD,YAAM;AAAA,QACJ;AAAA,QACA,QAAQ,4BAA4B;AAAA,MACtC,EAAE,MAAM,CAAC,UAAU;AACjB,cAAM,aAAa,IAAI,MAAM,OAAO;AACpC,eAAO,eAAe,YAAY,SAAS;AAAA,UACzC,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AACD,mBAAW,OAAO,OAAO,cAAc,UAAU;AAAA,MACnD,CAAC;AAED,eAAS,wBAAwB,UAAU;AAI3C,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WebSocketConnectionData, WebSocketClientConnection } from '@mswjs/interceptors/WebSocket';
|
|
2
|
+
|
|
3
|
+
declare function attachWebSocketLogger(connection: WebSocketConnectionData): void;
|
|
4
|
+
/**
|
|
5
|
+
* Prints the WebSocket connection.
|
|
6
|
+
* This is meant to be logged by every WebSocket handler
|
|
7
|
+
* that intercepted this connection. This helps you see
|
|
8
|
+
* what handlers observe this connection.
|
|
9
|
+
*/
|
|
10
|
+
declare function logConnectionOpen(client: WebSocketClientConnection): void;
|
|
11
|
+
|
|
12
|
+
export { attachWebSocketLogger, logConnectionOpen };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WebSocketConnectionData, WebSocketClientConnection } from '@mswjs/interceptors/WebSocket';
|
|
2
|
+
|
|
3
|
+
declare function attachWebSocketLogger(connection: WebSocketConnectionData): void;
|
|
4
|
+
/**
|
|
5
|
+
* Prints the WebSocket connection.
|
|
6
|
+
* This is meant to be logged by every WebSocket handler
|
|
7
|
+
* that intercepted this connection. This helps you see
|
|
8
|
+
* what handlers observe this connection.
|
|
9
|
+
*/
|
|
10
|
+
declare function logConnectionOpen(client: WebSocketClientConnection): void;
|
|
11
|
+
|
|
12
|
+
export { attachWebSocketLogger, logConnectionOpen };
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var attachWebSocketLogger_exports = {};
|
|
20
|
+
__export(attachWebSocketLogger_exports, {
|
|
21
|
+
attachWebSocketLogger: () => attachWebSocketLogger,
|
|
22
|
+
logConnectionOpen: () => logConnectionOpen
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(attachWebSocketLogger_exports);
|
|
25
|
+
var import_devUtils = require("../../utils/internal/devUtils.js");
|
|
26
|
+
var import_getTimestamp = require("../../utils/logging/getTimestamp.js");
|
|
27
|
+
var import_toPublicUrl = require("../../utils/request/toPublicUrl.js");
|
|
28
|
+
var import_getMessageLength = require("./getMessageLength.js");
|
|
29
|
+
var import_getPublicData = require("./getPublicData.js");
|
|
30
|
+
const colors = {
|
|
31
|
+
system: "#3b82f6",
|
|
32
|
+
outgoing: "#22c55e",
|
|
33
|
+
incoming: "#ef4444",
|
|
34
|
+
mocked: "#ff6a33"
|
|
35
|
+
};
|
|
36
|
+
function attachWebSocketLogger(connection) {
|
|
37
|
+
const { client, server } = connection;
|
|
38
|
+
logConnectionOpen(client);
|
|
39
|
+
client.addEventListener("message", (event) => {
|
|
40
|
+
logOutgoingClientMessage(event);
|
|
41
|
+
});
|
|
42
|
+
client.addEventListener("close", (event) => {
|
|
43
|
+
logConnectionClose(event);
|
|
44
|
+
});
|
|
45
|
+
client.socket.addEventListener("error", (event) => {
|
|
46
|
+
logClientError(event);
|
|
47
|
+
});
|
|
48
|
+
client.send = new Proxy(client.send, {
|
|
49
|
+
apply(target, thisArg, args) {
|
|
50
|
+
const [data] = args;
|
|
51
|
+
const messageEvent = new MessageEvent("message", { data });
|
|
52
|
+
Object.defineProperties(messageEvent, {
|
|
53
|
+
currentTarget: {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
writable: false,
|
|
56
|
+
value: client.socket
|
|
57
|
+
},
|
|
58
|
+
target: {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
writable: false,
|
|
61
|
+
value: client.socket
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
queueMicrotask(() => {
|
|
65
|
+
logIncomingMockedClientMessage(messageEvent);
|
|
66
|
+
});
|
|
67
|
+
return Reflect.apply(target, thisArg, args);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
server.addEventListener(
|
|
71
|
+
"open",
|
|
72
|
+
() => {
|
|
73
|
+
server.addEventListener("message", (event) => {
|
|
74
|
+
logIncomingServerMessage(event);
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
{ once: true }
|
|
78
|
+
);
|
|
79
|
+
server.send = new Proxy(server.send, {
|
|
80
|
+
apply(target, thisArg, args) {
|
|
81
|
+
const [data] = args;
|
|
82
|
+
const messageEvent = new MessageEvent("message", { data });
|
|
83
|
+
Object.defineProperties(messageEvent, {
|
|
84
|
+
currentTarget: {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
writable: false,
|
|
87
|
+
value: server.socket
|
|
88
|
+
},
|
|
89
|
+
target: {
|
|
90
|
+
enumerable: true,
|
|
91
|
+
writable: false,
|
|
92
|
+
value: server.socket
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
logOutgoingMockedClientMessage(messageEvent);
|
|
96
|
+
return Reflect.apply(target, thisArg, args);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function logConnectionOpen(client) {
|
|
101
|
+
const publicUrl = (0, import_toPublicUrl.toPublicUrl)(client.url);
|
|
102
|
+
console.groupCollapsed(
|
|
103
|
+
import_devUtils.devUtils.formatMessage(`${(0, import_getTimestamp.getTimestamp)()} %c\u25B6%c ${publicUrl}`),
|
|
104
|
+
`color:${colors.system}`,
|
|
105
|
+
"color:inherit"
|
|
106
|
+
);
|
|
107
|
+
console.log("Client:", client.socket);
|
|
108
|
+
console.groupEnd();
|
|
109
|
+
}
|
|
110
|
+
function logConnectionClose(event) {
|
|
111
|
+
const target = event.target;
|
|
112
|
+
const publicUrl = (0, import_toPublicUrl.toPublicUrl)(target.url);
|
|
113
|
+
console.groupCollapsed(
|
|
114
|
+
import_devUtils.devUtils.formatMessage(
|
|
115
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
|
|
116
|
+
),
|
|
117
|
+
`color:${colors.system}`,
|
|
118
|
+
"color:inherit"
|
|
119
|
+
);
|
|
120
|
+
console.log(event);
|
|
121
|
+
console.groupEnd();
|
|
122
|
+
}
|
|
123
|
+
function logClientError(event) {
|
|
124
|
+
const socket = event.target;
|
|
125
|
+
const publicUrl = (0, import_toPublicUrl.toPublicUrl)(socket.url);
|
|
126
|
+
console.groupCollapsed(
|
|
127
|
+
import_devUtils.devUtils.formatMessage(
|
|
128
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c\xD7%c ${publicUrl}`
|
|
129
|
+
),
|
|
130
|
+
`color:${colors.system}`,
|
|
131
|
+
"color:inherit"
|
|
132
|
+
);
|
|
133
|
+
console.log(event);
|
|
134
|
+
console.groupEnd();
|
|
135
|
+
}
|
|
136
|
+
async function logOutgoingClientMessage(event) {
|
|
137
|
+
const byteLength = (0, import_getMessageLength.getMessageLength)(event.data);
|
|
138
|
+
const publicData = await (0, import_getPublicData.getPublicData)(event.data);
|
|
139
|
+
const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06";
|
|
140
|
+
console.groupCollapsed(
|
|
141
|
+
import_devUtils.devUtils.formatMessage(
|
|
142
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
|
|
143
|
+
),
|
|
144
|
+
`color:${colors.outgoing}`,
|
|
145
|
+
"color:inherit",
|
|
146
|
+
"color:gray;font-weight:normal",
|
|
147
|
+
"color:inherit;font-weight:inherit"
|
|
148
|
+
);
|
|
149
|
+
console.log(event);
|
|
150
|
+
console.groupEnd();
|
|
151
|
+
}
|
|
152
|
+
async function logOutgoingMockedClientMessage(event) {
|
|
153
|
+
const byteLength = (0, import_getMessageLength.getMessageLength)(event.data);
|
|
154
|
+
const publicData = await (0, import_getPublicData.getPublicData)(event.data);
|
|
155
|
+
console.groupCollapsed(
|
|
156
|
+
import_devUtils.devUtils.formatMessage(
|
|
157
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c`
|
|
158
|
+
),
|
|
159
|
+
`color:${colors.mocked}`,
|
|
160
|
+
"color:inherit",
|
|
161
|
+
"color:gray;font-weight:normal",
|
|
162
|
+
"color:inherit;font-weight:inherit"
|
|
163
|
+
);
|
|
164
|
+
console.log(event);
|
|
165
|
+
console.groupEnd();
|
|
166
|
+
}
|
|
167
|
+
async function logIncomingMockedClientMessage(event) {
|
|
168
|
+
const byteLength = (0, import_getMessageLength.getMessageLength)(event.data);
|
|
169
|
+
const publicData = await (0, import_getPublicData.getPublicData)(event.data);
|
|
170
|
+
console.groupCollapsed(
|
|
171
|
+
import_devUtils.devUtils.formatMessage(
|
|
172
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c`
|
|
173
|
+
),
|
|
174
|
+
`color:${colors.mocked}`,
|
|
175
|
+
"color:inherit",
|
|
176
|
+
"color:gray;font-weight:normal",
|
|
177
|
+
"color:inherit;font-weight:inherit"
|
|
178
|
+
);
|
|
179
|
+
console.log(event);
|
|
180
|
+
console.groupEnd();
|
|
181
|
+
}
|
|
182
|
+
async function logIncomingServerMessage(event) {
|
|
183
|
+
const byteLength = (0, import_getMessageLength.getMessageLength)(event.data);
|
|
184
|
+
const publicData = await (0, import_getPublicData.getPublicData)(event.data);
|
|
185
|
+
const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07";
|
|
186
|
+
console.groupCollapsed(
|
|
187
|
+
import_devUtils.devUtils.formatMessage(
|
|
188
|
+
`${(0, import_getTimestamp.getTimestamp)({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
|
|
189
|
+
),
|
|
190
|
+
`color:${colors.incoming}`,
|
|
191
|
+
"color:inherit",
|
|
192
|
+
"color:gray;font-weight:normal",
|
|
193
|
+
"color:inherit;font-weight:inherit"
|
|
194
|
+
);
|
|
195
|
+
console.log(event);
|
|
196
|
+
console.groupEnd();
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=attachWebSocketLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/ws/utils/attachWebSocketLogger.ts"],"sourcesContent":["import type {\n WebSocketClientConnection,\n WebSocketConnectionData,\n WebSocketData,\n} from '@mswjs/interceptors/WebSocket'\nimport { devUtils } from '../../utils/internal/devUtils'\nimport { getTimestamp } from '../../utils/logging/getTimestamp'\nimport { toPublicUrl } from '../../utils/request/toPublicUrl'\nimport { getMessageLength } from './getMessageLength'\nimport { getPublicData } from './getPublicData'\n\nconst colors = {\n system: '#3b82f6',\n outgoing: '#22c55e',\n incoming: '#ef4444',\n mocked: '#ff6a33',\n}\n\nexport function attachWebSocketLogger(\n connection: WebSocketConnectionData,\n): void {\n const { client, server } = connection\n\n logConnectionOpen(client)\n\n // Log the events sent from the WebSocket client.\n // WebSocket client connection object is written from the\n // server's perspective so these message events are outgoing.\n /**\n * @todo Provide the reference to the exact event handler\n * that called this `client.send()`.\n */\n client.addEventListener('message', (event) => {\n logOutgoingClientMessage(event)\n })\n\n client.addEventListener('close', (event) => {\n logConnectionClose(event)\n })\n\n // Log client errors (connection closures due to errors).\n client.socket.addEventListener('error', (event) => {\n logClientError(event)\n })\n\n client.send = new Proxy(client.send, {\n apply(target, thisArg, args) {\n const [data] = args\n const messageEvent = new MessageEvent('message', { data })\n Object.defineProperties(messageEvent, {\n currentTarget: {\n enumerable: true,\n writable: false,\n value: client.socket,\n },\n target: {\n enumerable: true,\n writable: false,\n value: client.socket,\n },\n })\n\n queueMicrotask(() => {\n logIncomingMockedClientMessage(messageEvent)\n })\n\n return Reflect.apply(target, thisArg, args)\n },\n })\n\n server.addEventListener(\n 'open',\n () => {\n server.addEventListener('message', (event) => {\n logIncomingServerMessage(event)\n })\n },\n { once: true },\n )\n\n // Log outgoing client events initiated by the event handler.\n // The actual client never sent these but the handler did.\n server.send = new Proxy(server.send, {\n apply(target, thisArg, args) {\n const [data] = args\n const messageEvent = new MessageEvent('message', { data })\n Object.defineProperties(messageEvent, {\n currentTarget: {\n enumerable: true,\n writable: false,\n value: server.socket,\n },\n target: {\n enumerable: true,\n writable: false,\n value: server.socket,\n },\n })\n\n logOutgoingMockedClientMessage(messageEvent)\n\n return Reflect.apply(target, thisArg, args)\n },\n })\n}\n\n/**\n * Prints the WebSocket connection.\n * This is meant to be logged by every WebSocket handler\n * that intercepted this connection. This helps you see\n * what handlers observe this connection.\n */\nexport function logConnectionOpen(client: WebSocketClientConnection) {\n const publicUrl = toPublicUrl(client.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(`${getTimestamp()} %c▶%c ${publicUrl}`),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log('Client:', client.socket)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nfunction logConnectionClose(event: CloseEvent) {\n const target = event.target as WebSocket\n const publicUrl = toPublicUrl(target.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,\n ),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nfunction logClientError(event: Event) {\n const socket = event.target as WebSocket\n const publicUrl = toPublicUrl(socket.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c\\u00D7%c ${publicUrl}`,\n ),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message.\n */\nasync function logOutgoingClientMessage(event: MessageEvent<WebSocketData>) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n const arrow = event.defaultPrevented ? '⇡' : '⬆'\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.outgoing}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `server.send()` in the event handler.\n */\nasync function logOutgoingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⬆%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.mocked}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `client.send()` in the event handler.\n */\nasync function logIncomingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⬇%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.mocked}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nasync function logIncomingServerMessage(event: MessageEvent<WebSocketData>) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n const arrow = event.defaultPrevented ? '⇣' : '⬇'\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.incoming}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { devUtils } from '../../utils/internal/devUtils.mjs';
|
|
2
|
+
import { getTimestamp } from '../../utils/logging/getTimestamp.mjs';
|
|
3
|
+
import { toPublicUrl } from '../../utils/request/toPublicUrl.mjs';
|
|
4
|
+
import { getMessageLength } from './getMessageLength.mjs';
|
|
5
|
+
import { getPublicData } from './getPublicData.mjs';
|
|
6
|
+
const colors = {
|
|
7
|
+
system: "#3b82f6",
|
|
8
|
+
outgoing: "#22c55e",
|
|
9
|
+
incoming: "#ef4444",
|
|
10
|
+
mocked: "#ff6a33"
|
|
11
|
+
};
|
|
12
|
+
function attachWebSocketLogger(connection) {
|
|
13
|
+
const { client, server } = connection;
|
|
14
|
+
logConnectionOpen(client);
|
|
15
|
+
client.addEventListener("message", (event) => {
|
|
16
|
+
logOutgoingClientMessage(event);
|
|
17
|
+
});
|
|
18
|
+
client.addEventListener("close", (event) => {
|
|
19
|
+
logConnectionClose(event);
|
|
20
|
+
});
|
|
21
|
+
client.socket.addEventListener("error", (event) => {
|
|
22
|
+
logClientError(event);
|
|
23
|
+
});
|
|
24
|
+
client.send = new Proxy(client.send, {
|
|
25
|
+
apply(target, thisArg, args) {
|
|
26
|
+
const [data] = args;
|
|
27
|
+
const messageEvent = new MessageEvent("message", { data });
|
|
28
|
+
Object.defineProperties(messageEvent, {
|
|
29
|
+
currentTarget: {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
writable: false,
|
|
32
|
+
value: client.socket
|
|
33
|
+
},
|
|
34
|
+
target: {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
writable: false,
|
|
37
|
+
value: client.socket
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
queueMicrotask(() => {
|
|
41
|
+
logIncomingMockedClientMessage(messageEvent);
|
|
42
|
+
});
|
|
43
|
+
return Reflect.apply(target, thisArg, args);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
server.addEventListener(
|
|
47
|
+
"open",
|
|
48
|
+
() => {
|
|
49
|
+
server.addEventListener("message", (event) => {
|
|
50
|
+
logIncomingServerMessage(event);
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
{ once: true }
|
|
54
|
+
);
|
|
55
|
+
server.send = new Proxy(server.send, {
|
|
56
|
+
apply(target, thisArg, args) {
|
|
57
|
+
const [data] = args;
|
|
58
|
+
const messageEvent = new MessageEvent("message", { data });
|
|
59
|
+
Object.defineProperties(messageEvent, {
|
|
60
|
+
currentTarget: {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
writable: false,
|
|
63
|
+
value: server.socket
|
|
64
|
+
},
|
|
65
|
+
target: {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
writable: false,
|
|
68
|
+
value: server.socket
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
logOutgoingMockedClientMessage(messageEvent);
|
|
72
|
+
return Reflect.apply(target, thisArg, args);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function logConnectionOpen(client) {
|
|
77
|
+
const publicUrl = toPublicUrl(client.url);
|
|
78
|
+
console.groupCollapsed(
|
|
79
|
+
devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
|
|
80
|
+
`color:${colors.system}`,
|
|
81
|
+
"color:inherit"
|
|
82
|
+
);
|
|
83
|
+
console.log("Client:", client.socket);
|
|
84
|
+
console.groupEnd();
|
|
85
|
+
}
|
|
86
|
+
function logConnectionClose(event) {
|
|
87
|
+
const target = event.target;
|
|
88
|
+
const publicUrl = toPublicUrl(target.url);
|
|
89
|
+
console.groupCollapsed(
|
|
90
|
+
devUtils.formatMessage(
|
|
91
|
+
`${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
|
|
92
|
+
),
|
|
93
|
+
`color:${colors.system}`,
|
|
94
|
+
"color:inherit"
|
|
95
|
+
);
|
|
96
|
+
console.log(event);
|
|
97
|
+
console.groupEnd();
|
|
98
|
+
}
|
|
99
|
+
function logClientError(event) {
|
|
100
|
+
const socket = event.target;
|
|
101
|
+
const publicUrl = toPublicUrl(socket.url);
|
|
102
|
+
console.groupCollapsed(
|
|
103
|
+
devUtils.formatMessage(
|
|
104
|
+
`${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
|
|
105
|
+
),
|
|
106
|
+
`color:${colors.system}`,
|
|
107
|
+
"color:inherit"
|
|
108
|
+
);
|
|
109
|
+
console.log(event);
|
|
110
|
+
console.groupEnd();
|
|
111
|
+
}
|
|
112
|
+
async function logOutgoingClientMessage(event) {
|
|
113
|
+
const byteLength = getMessageLength(event.data);
|
|
114
|
+
const publicData = await getPublicData(event.data);
|
|
115
|
+
const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06";
|
|
116
|
+
console.groupCollapsed(
|
|
117
|
+
devUtils.formatMessage(
|
|
118
|
+
`${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
|
|
119
|
+
),
|
|
120
|
+
`color:${colors.outgoing}`,
|
|
121
|
+
"color:inherit",
|
|
122
|
+
"color:gray;font-weight:normal",
|
|
123
|
+
"color:inherit;font-weight:inherit"
|
|
124
|
+
);
|
|
125
|
+
console.log(event);
|
|
126
|
+
console.groupEnd();
|
|
127
|
+
}
|
|
128
|
+
async function logOutgoingMockedClientMessage(event) {
|
|
129
|
+
const byteLength = getMessageLength(event.data);
|
|
130
|
+
const publicData = await getPublicData(event.data);
|
|
131
|
+
console.groupCollapsed(
|
|
132
|
+
devUtils.formatMessage(
|
|
133
|
+
`${getTimestamp({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c`
|
|
134
|
+
),
|
|
135
|
+
`color:${colors.mocked}`,
|
|
136
|
+
"color:inherit",
|
|
137
|
+
"color:gray;font-weight:normal",
|
|
138
|
+
"color:inherit;font-weight:inherit"
|
|
139
|
+
);
|
|
140
|
+
console.log(event);
|
|
141
|
+
console.groupEnd();
|
|
142
|
+
}
|
|
143
|
+
async function logIncomingMockedClientMessage(event) {
|
|
144
|
+
const byteLength = getMessageLength(event.data);
|
|
145
|
+
const publicData = await getPublicData(event.data);
|
|
146
|
+
console.groupCollapsed(
|
|
147
|
+
devUtils.formatMessage(
|
|
148
|
+
`${getTimestamp({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c`
|
|
149
|
+
),
|
|
150
|
+
`color:${colors.mocked}`,
|
|
151
|
+
"color:inherit",
|
|
152
|
+
"color:gray;font-weight:normal",
|
|
153
|
+
"color:inherit;font-weight:inherit"
|
|
154
|
+
);
|
|
155
|
+
console.log(event);
|
|
156
|
+
console.groupEnd();
|
|
157
|
+
}
|
|
158
|
+
async function logIncomingServerMessage(event) {
|
|
159
|
+
const byteLength = getMessageLength(event.data);
|
|
160
|
+
const publicData = await getPublicData(event.data);
|
|
161
|
+
const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07";
|
|
162
|
+
console.groupCollapsed(
|
|
163
|
+
devUtils.formatMessage(
|
|
164
|
+
`${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
|
|
165
|
+
),
|
|
166
|
+
`color:${colors.incoming}`,
|
|
167
|
+
"color:inherit",
|
|
168
|
+
"color:gray;font-weight:normal",
|
|
169
|
+
"color:inherit;font-weight:inherit"
|
|
170
|
+
);
|
|
171
|
+
console.log(event);
|
|
172
|
+
console.groupEnd();
|
|
173
|
+
}
|
|
174
|
+
export {
|
|
175
|
+
attachWebSocketLogger,
|
|
176
|
+
logConnectionOpen
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=attachWebSocketLogger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/ws/utils/attachWebSocketLogger.ts"],"sourcesContent":["import type {\n WebSocketClientConnection,\n WebSocketConnectionData,\n WebSocketData,\n} from '@mswjs/interceptors/WebSocket'\nimport { devUtils } from '../../utils/internal/devUtils'\nimport { getTimestamp } from '../../utils/logging/getTimestamp'\nimport { toPublicUrl } from '../../utils/request/toPublicUrl'\nimport { getMessageLength } from './getMessageLength'\nimport { getPublicData } from './getPublicData'\n\nconst colors = {\n system: '#3b82f6',\n outgoing: '#22c55e',\n incoming: '#ef4444',\n mocked: '#ff6a33',\n}\n\nexport function attachWebSocketLogger(\n connection: WebSocketConnectionData,\n): void {\n const { client, server } = connection\n\n logConnectionOpen(client)\n\n // Log the events sent from the WebSocket client.\n // WebSocket client connection object is written from the\n // server's perspective so these message events are outgoing.\n /**\n * @todo Provide the reference to the exact event handler\n * that called this `client.send()`.\n */\n client.addEventListener('message', (event) => {\n logOutgoingClientMessage(event)\n })\n\n client.addEventListener('close', (event) => {\n logConnectionClose(event)\n })\n\n // Log client errors (connection closures due to errors).\n client.socket.addEventListener('error', (event) => {\n logClientError(event)\n })\n\n client.send = new Proxy(client.send, {\n apply(target, thisArg, args) {\n const [data] = args\n const messageEvent = new MessageEvent('message', { data })\n Object.defineProperties(messageEvent, {\n currentTarget: {\n enumerable: true,\n writable: false,\n value: client.socket,\n },\n target: {\n enumerable: true,\n writable: false,\n value: client.socket,\n },\n })\n\n queueMicrotask(() => {\n logIncomingMockedClientMessage(messageEvent)\n })\n\n return Reflect.apply(target, thisArg, args)\n },\n })\n\n server.addEventListener(\n 'open',\n () => {\n server.addEventListener('message', (event) => {\n logIncomingServerMessage(event)\n })\n },\n { once: true },\n )\n\n // Log outgoing client events initiated by the event handler.\n // The actual client never sent these but the handler did.\n server.send = new Proxy(server.send, {\n apply(target, thisArg, args) {\n const [data] = args\n const messageEvent = new MessageEvent('message', { data })\n Object.defineProperties(messageEvent, {\n currentTarget: {\n enumerable: true,\n writable: false,\n value: server.socket,\n },\n target: {\n enumerable: true,\n writable: false,\n value: server.socket,\n },\n })\n\n logOutgoingMockedClientMessage(messageEvent)\n\n return Reflect.apply(target, thisArg, args)\n },\n })\n}\n\n/**\n * Prints the WebSocket connection.\n * This is meant to be logged by every WebSocket handler\n * that intercepted this connection. This helps you see\n * what handlers observe this connection.\n */\nexport function logConnectionOpen(client: WebSocketClientConnection) {\n const publicUrl = toPublicUrl(client.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(`${getTimestamp()} %c▶%c ${publicUrl}`),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log('Client:', client.socket)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nfunction logConnectionClose(event: CloseEvent) {\n const target = event.target as WebSocket\n const publicUrl = toPublicUrl(target.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,\n ),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nfunction logClientError(event: Event) {\n const socket = event.target as WebSocket\n const publicUrl = toPublicUrl(socket.url)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c\\u00D7%c ${publicUrl}`,\n ),\n `color:${colors.system}`,\n 'color:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message.\n */\nasync function logOutgoingClientMessage(event: MessageEvent<WebSocketData>) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n const arrow = event.defaultPrevented ? '⇡' : '⬆'\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.outgoing}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `server.send()` in the event handler.\n */\nasync function logOutgoingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⬆%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.mocked}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `client.send()` in the event handler.\n */\nasync function logIncomingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⬇%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.mocked}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n\nasync function logIncomingServerMessage(event: MessageEvent<WebSocketData>) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n const arrow = event.defaultPrevented ? '⇣' : '⬇'\n\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.incoming}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WebSocketData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns the byte length of the given WebSocket message.
|
|
5
|
+
* @example
|
|
6
|
+
* getMessageLength('hello') // 5
|
|
7
|
+
* getMessageLength(new Blob(['hello'])) // 5
|
|
8
|
+
*/
|
|
9
|
+
declare function getMessageLength(data: WebSocketData): number;
|
|
10
|
+
|
|
11
|
+
export { getMessageLength };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WebSocketData } from '@mswjs/interceptors/lib/browser/interceptors/WebSocket';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns the byte length of the given WebSocket message.
|
|
5
|
+
* @example
|
|
6
|
+
* getMessageLength('hello') // 5
|
|
7
|
+
* getMessageLength(new Blob(['hello'])) // 5
|
|
8
|
+
*/
|
|
9
|
+
declare function getMessageLength(data: WebSocketData): number;
|
|
10
|
+
|
|
11
|
+
export { getMessageLength };
|