msw 2.3.0-ws.rc-2 → 2.3.0-ws.rc-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/lib/browser/index.js +8 -8
  2. package/lib/browser/index.js.map +1 -1
  3. package/lib/browser/index.mjs +8 -8
  4. package/lib/browser/index.mjs.map +1 -1
  5. package/lib/core/{GraphQLHandler-4DPdxG0R.d.mts → GraphQLHandler-CzcXr7At.d.mts} +1 -1
  6. package/lib/core/{GraphQLHandler-3gvpA65n.d.ts → GraphQLHandler-DGyzNtRQ.d.ts} +1 -1
  7. package/lib/core/HttpResponse.d.mts +1 -1
  8. package/lib/core/HttpResponse.d.ts +1 -1
  9. package/lib/core/SetupApi.d.mts +1 -1
  10. package/lib/core/SetupApi.d.ts +1 -1
  11. package/lib/core/getResponse.d.mts +1 -1
  12. package/lib/core/getResponse.d.ts +1 -1
  13. package/lib/core/graphql.d.mts +2 -2
  14. package/lib/core/graphql.d.ts +2 -2
  15. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  16. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  17. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  18. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  19. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  20. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  21. package/lib/core/http.d.mts +1 -1
  22. package/lib/core/http.d.ts +1 -1
  23. package/lib/core/index.d.mts +3 -3
  24. package/lib/core/index.d.ts +3 -3
  25. package/lib/core/index.js +1 -1
  26. package/lib/core/index.js.map +1 -1
  27. package/lib/core/index.mjs +1 -1
  28. package/lib/core/index.mjs.map +1 -1
  29. package/lib/core/passthrough.d.mts +1 -1
  30. package/lib/core/passthrough.d.ts +1 -1
  31. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  32. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  33. package/lib/core/utils/executeHandlers.d.mts +1 -1
  34. package/lib/core/utils/executeHandlers.d.ts +1 -1
  35. package/lib/core/utils/handleRequest.d.mts +1 -1
  36. package/lib/core/utils/handleRequest.d.ts +1 -1
  37. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  38. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  39. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  40. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  41. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  42. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  43. package/lib/core/{utils → ws}/handleWebSocketEvent.d.mts +2 -2
  44. package/lib/core/{utils → ws}/handleWebSocketEvent.d.ts +2 -2
  45. package/lib/core/{utils → ws}/handleWebSocketEvent.js +1 -4
  46. package/lib/core/ws/handleWebSocketEvent.js.map +1 -0
  47. package/lib/core/{utils → ws}/handleWebSocketEvent.mjs +1 -4
  48. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -0
  49. package/lib/core/ws/utils/attachWebSocketLogger.js +15 -9
  50. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
  51. package/lib/core/ws/utils/attachWebSocketLogger.mjs +15 -9
  52. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
  53. package/lib/core/{ws/ws.d.mts → ws.d.mts} +19 -14
  54. package/lib/core/{ws/ws.d.ts → ws.d.ts} +19 -14
  55. package/lib/core/{ws/ws.js → ws.js} +4 -23
  56. package/lib/core/ws.js.map +1 -0
  57. package/lib/core/{ws/ws.mjs → ws.mjs} +4 -23
  58. package/lib/core/ws.mjs.map +1 -0
  59. package/lib/iife/index.js +136 -107
  60. package/lib/iife/index.js.map +1 -1
  61. package/lib/mockServiceWorker.js +1 -1
  62. package/lib/native/index.js +1 -1
  63. package/lib/native/index.js.map +1 -1
  64. package/lib/native/index.mjs +1 -1
  65. package/lib/native/index.mjs.map +1 -1
  66. package/lib/node/index.js +1 -1
  67. package/lib/node/index.js.map +1 -1
  68. package/lib/node/index.mjs +1 -1
  69. package/lib/node/index.mjs.map +1 -1
  70. package/package.json +3 -3
  71. package/src/browser/setupWorker/setupWorker.ts +1 -1
  72. package/src/core/index.ts +1 -1
  73. package/src/core/{utils → ws}/handleWebSocketEvent.ts +1 -4
  74. package/src/core/ws/utils/attachWebSocketLogger.ts +16 -9
  75. package/src/core/{ws/ws.test.ts → ws.test.ts} +1 -1
  76. package/src/core/{ws/ws.ts → ws.ts} +49 -35
  77. package/src/node/SetupServerCommonApi.ts +1 -1
  78. package/lib/core/utils/handleWebSocketEvent.js.map +0 -1
  79. package/lib/core/utils/handleWebSocketEvent.mjs.map +0 -1
  80. package/lib/core/ws/ws.js.map +0 -1
  81. package/lib/core/ws/ws.mjs.map +0 -1
  82. /package/lib/core/{HttpResponse-aJY-D0oG.d.ts → HttpResponse-BOzDwzB6.d.ts} +0 -0
  83. /package/lib/core/{HttpResponse-xuSipbNt.d.mts → HttpResponse-CSyJ1cbO.d.mts} +0 -0
@@ -3,6 +3,12 @@ import { getTimestamp } from '../../utils/logging/getTimestamp.mjs';
3
3
  import { toPublicUrl } from '../../utils/request/toPublicUrl.mjs';
4
4
  import { getMessageLength } from './getMessageLength.mjs';
5
5
  import { getPublicData } from './getPublicData.mjs';
6
+ const colors = {
7
+ blue: "#3b82f6",
8
+ green: "#22c55e",
9
+ red: "#ef4444",
10
+ orange: "#ff6a33"
11
+ };
6
12
  function attachWebSocketLogger(connection) {
7
13
  const { client, server } = connection;
8
14
  logConnectionOpen(client);
@@ -71,8 +77,8 @@ function attachWebSocketLogger(connection) {
71
77
  function logConnectionOpen(client) {
72
78
  const publicUrl = toPublicUrl(client.url);
73
79
  console.groupCollapsed(
74
- devUtils.formatMessage(`${getTimestamp()} %c\u25B8%c ${publicUrl}`),
75
- "color:blue",
80
+ devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
81
+ `color:${colors.blue}`,
76
82
  "color:inherit"
77
83
  );
78
84
  console.log("Client:", client.socket);
@@ -85,7 +91,7 @@ async function logOutgoingClientMessage(event) {
85
91
  devUtils.formatMessage(
86
92
  `${getTimestamp({ milliseconds: true })} %c\u2191%c ${publicData} %c${byteLength}%c`
87
93
  ),
88
- "color:green",
94
+ `color:${colors.green}`,
89
95
  "color:inherit",
90
96
  "color:gray;font-weight:normal",
91
97
  "color:inherit;font-weight:inherit"
@@ -100,7 +106,7 @@ async function logOutgoingMockedClientMessage(event) {
100
106
  devUtils.formatMessage(
101
107
  `${getTimestamp({ milliseconds: true })} %c\u21E1%c ${publicData} %c${byteLength}%c`
102
108
  ),
103
- "color:orangered",
109
+ `color:${colors.orange}`,
104
110
  "color:inherit",
105
111
  "color:gray;font-weight:normal",
106
112
  "color:inherit;font-weight:inherit"
@@ -115,7 +121,7 @@ async function logIncomingClientMessage(event) {
115
121
  devUtils.formatMessage(
116
122
  `${getTimestamp({ milliseconds: true })} %c\u2193%c ${publicData} %c${byteLength}%c`
117
123
  ),
118
- "color:red",
124
+ `color:${colors.red}`,
119
125
  "color:inherit",
120
126
  "color:gray;font-weight:normal",
121
127
  "color:inherit;font-weight:inherit"
@@ -130,7 +136,7 @@ async function logIncomingMockedClientMessage(event) {
130
136
  devUtils.formatMessage(
131
137
  `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
132
138
  ),
133
- "color:orangered",
139
+ `color:${colors.orange}`,
134
140
  "color:inherit",
135
141
  "color:gray;font-weight:normal",
136
142
  "color:inherit;font-weight:inherit"
@@ -145,7 +151,7 @@ function logConnectionClose(event) {
145
151
  devUtils.formatMessage(
146
152
  `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
147
153
  ),
148
- "color:blue",
154
+ `color:${colors.blue}`,
149
155
  "color:inherit"
150
156
  );
151
157
  console.log(event);
@@ -158,7 +164,7 @@ async function logIncomingServerMessage(event) {
158
164
  devUtils.formatMessage(
159
165
  `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
160
166
  ),
161
- "color:orangered",
167
+ `color:${colors.green}`,
162
168
  "color:inherit",
163
169
  "color:gray;font-weight:normal",
164
170
  "color:inherit;font-weight:inherit"
@@ -173,7 +179,7 @@ function logClientError(event) {
173
179
  devUtils.formatMessage(
174
180
  `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
175
181
  ),
176
- "color:red",
182
+ `color:${colors.blue}`,
177
183
  "color:inherit"
178
184
  );
179
185
  console.log(event);
@@ -1 +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\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 the events received by the WebSocket client.\n // \"client.socket\" references the actual WebSocket instance\n // so these message events are incoming messages.\n client.socket.addEventListener('message', (event) => {\n logIncomingClientMessage(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 logIncomingMockedClientMessage(messageEvent)\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['realWebSocket'],\n },\n target: {\n enumerable: true,\n writable: false,\n value: server['realWebSocket'],\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 console.groupCollapsed(\n devUtils.formatMessage(`${getTimestamp()} %c▸%c ${publicUrl}`),\n 'color:blue',\n 'color:inherit',\n )\n console.log('Client:', client.socket)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message.\n */\nexport async function logOutgoingClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c↑%c ${publicData} %c${byteLength}%c`,\n ),\n 'color:green',\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `server.send()` in the event handler.\n */\nexport async function logOutgoingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇡%c ${publicData} %c${byteLength}%c`,\n ),\n 'color:orangered',\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prings the message received by the WebSocket client.\n * This is fired when the \"message\" event is dispatched\n * on the actual WebSocket client instance, and translates to\n * the client receiving a message from the server.\n */\nexport async function logIncomingClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c↓%c ${publicData} %c${byteLength}%c`,\n ),\n 'color:red',\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `client.send()` in the event handler.\n */\nexport async function logIncomingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,\n ),\n 'color:orangered',\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nfunction logConnectionClose(event: CloseEvent) {\n const target = event.target as WebSocket\n const publicUrl = toPublicUrl(target.url)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,\n ),\n 'color:blue',\n 'color:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nexport async function logIncomingServerMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,\n ),\n 'color:orangered',\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nfunction logClientError(event: Event) {\n const socket = event.target as WebSocket\n const publicUrl = toPublicUrl(socket.url)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c\\u00D7%c ${publicUrl}`,\n ),\n 'color:red',\n 'color:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n"],"mappings":"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","names":[]}
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 blue: '#3b82f6',\n green: '#22c55e',\n red: '#ef4444',\n orange: '#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 the events received by the WebSocket client.\n // \"client.socket\" references the actual WebSocket instance\n // so these message events are incoming messages.\n client.socket.addEventListener('message', (event) => {\n logIncomingClientMessage(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 logIncomingMockedClientMessage(messageEvent)\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['realWebSocket'],\n },\n target: {\n enumerable: true,\n writable: false,\n value: server['realWebSocket'],\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 console.groupCollapsed(\n devUtils.formatMessage(`${getTimestamp()} %c▶%c ${publicUrl}`),\n `color:${colors.blue}`,\n 'color:inherit',\n )\n console.log('Client:', client.socket)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message.\n */\nexport async function logOutgoingClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c↑%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.green}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `server.send()` in the event handler.\n */\nexport async function logOutgoingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇡%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.orange}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prings the message received by the WebSocket client.\n * This is fired when the \"message\" event is dispatched\n * on the actual WebSocket client instance, and translates to\n * the client receiving a message from the server.\n */\nexport async function logIncomingClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c↓%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.red}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\n/**\n * Prints the outgoing client message initiated\n * by `client.send()` in the event handler.\n */\nexport async function logIncomingMockedClientMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.orange}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nfunction logConnectionClose(event: CloseEvent) {\n const target = event.target as WebSocket\n const publicUrl = toPublicUrl(target.url)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,\n ),\n `color:${colors.blue}`,\n 'color:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nexport async function logIncomingServerMessage(\n event: MessageEvent<WebSocketData>,\n) {\n const byteLength = getMessageLength(event.data)\n const publicData = await getPublicData(event.data)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,\n ),\n `color:${colors.green}`,\n 'color:inherit',\n 'color:gray;font-weight:normal',\n 'color:inherit;font-weight:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n\nfunction logClientError(event: Event) {\n const socket = event.target as WebSocket\n const publicUrl = toPublicUrl(socket.url)\n\n console.groupCollapsed(\n devUtils.formatMessage(\n `${getTimestamp({ milliseconds: true })} %c\\u00D7%c ${publicUrl}`,\n ),\n `color:${colors.blue}`,\n 'color:inherit',\n )\n console.log(event)\n console.groupEnd()\n}\n"],"mappings":"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","names":[]}
@@ -1,20 +1,15 @@
1
1
  import { WebSocketClientConnectionProtocol, WebSocketData } from '@mswjs/interceptors/WebSocket';
2
- import { WebSocketHandlerEventMap, WebSocketHandler } from '../handlers/WebSocketHandler.mjs';
3
- import { Path } from '../utils/matching/matchRequestUrl.mjs';
2
+ import { WebSocketHandlerEventMap, WebSocketHandler } from './handlers/WebSocketHandler.mjs';
3
+ import { Path } from './utils/matching/matchRequestUrl.mjs';
4
4
  import 'strict-event-emitter';
5
5
 
6
- /**
7
- * Intercepts outgoing WebSocket connections to the given URL.
8
- *
9
- * @example
10
- * const chat = ws.link('wss://chat.example.com')
11
- * chat.on('connection', ({ client }) => {
12
- * client.send('hello from server!')
13
- * })
14
- */
15
- declare function createWebSocketLinkHandler(url: Path): {
6
+ type WebSocketLink = {
7
+ /**
8
+ * A set of all WebSocket clients connected
9
+ * to this link.
10
+ */
16
11
  clients: Set<WebSocketClientConnectionProtocol>;
17
- on<K extends "connection">(event: K, listener: (...args: WebSocketHandlerEventMap[K]) => void): WebSocketHandler;
12
+ on<EventType extends keyof WebSocketHandlerEventMap>(event: EventType, listener: (...args: WebSocketHandlerEventMap[EventType]) => void): WebSocketHandler;
18
13
  /**
19
14
  * Broadcasts the given data to all WebSocket clients.
20
15
  *
@@ -37,8 +32,18 @@ declare function createWebSocketLinkHandler(url: Path): {
37
32
  */
38
33
  broadcastExcept(clients: WebSocketClientConnectionProtocol | Array<WebSocketClientConnectionProtocol>, data: WebSocketData): void;
39
34
  };
35
+ /**
36
+ * Intercepts outgoing WebSocket connections to the given URL.
37
+ *
38
+ * @example
39
+ * const chat = ws.link('wss://chat.example.com')
40
+ * chat.on('connection', ({ client }) => {
41
+ * client.send('hello from server!')
42
+ * })
43
+ */
44
+ declare function createWebSocketLinkHandler(url: Path): WebSocketLink;
40
45
  declare const ws: {
41
46
  link: typeof createWebSocketLinkHandler;
42
47
  };
43
48
 
44
- export { ws };
49
+ export { type WebSocketLink, ws };
@@ -1,20 +1,15 @@
1
1
  import { WebSocketClientConnectionProtocol, WebSocketData } from '@mswjs/interceptors/WebSocket';
2
- import { WebSocketHandlerEventMap, WebSocketHandler } from '../handlers/WebSocketHandler.js';
3
- import { Path } from '../utils/matching/matchRequestUrl.js';
2
+ import { WebSocketHandlerEventMap, WebSocketHandler } from './handlers/WebSocketHandler.js';
3
+ import { Path } from './utils/matching/matchRequestUrl.js';
4
4
  import 'strict-event-emitter';
5
5
 
6
- /**
7
- * Intercepts outgoing WebSocket connections to the given URL.
8
- *
9
- * @example
10
- * const chat = ws.link('wss://chat.example.com')
11
- * chat.on('connection', ({ client }) => {
12
- * client.send('hello from server!')
13
- * })
14
- */
15
- declare function createWebSocketLinkHandler(url: Path): {
6
+ type WebSocketLink = {
7
+ /**
8
+ * A set of all WebSocket clients connected
9
+ * to this link.
10
+ */
16
11
  clients: Set<WebSocketClientConnectionProtocol>;
17
- on<K extends "connection">(event: K, listener: (...args: WebSocketHandlerEventMap[K]) => void): WebSocketHandler;
12
+ on<EventType extends keyof WebSocketHandlerEventMap>(event: EventType, listener: (...args: WebSocketHandlerEventMap[EventType]) => void): WebSocketHandler;
18
13
  /**
19
14
  * Broadcasts the given data to all WebSocket clients.
20
15
  *
@@ -37,8 +32,18 @@ declare function createWebSocketLinkHandler(url: Path): {
37
32
  */
38
33
  broadcastExcept(clients: WebSocketClientConnectionProtocol | Array<WebSocketClientConnectionProtocol>, data: WebSocketData): void;
39
34
  };
35
+ /**
36
+ * Intercepts outgoing WebSocket connections to the given URL.
37
+ *
38
+ * @example
39
+ * const chat = ws.link('wss://chat.example.com')
40
+ * chat.on('connection', ({ client }) => {
41
+ * client.send('hello from server!')
42
+ * })
43
+ */
44
+ declare function createWebSocketLinkHandler(url: Path): WebSocketLink;
40
45
  declare const ws: {
41
46
  link: typeof createWebSocketLinkHandler;
42
47
  };
43
48
 
44
- export { ws };
49
+ export { type WebSocketLink, ws };
@@ -22,15 +22,15 @@ __export(ws_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(ws_exports);
24
24
  var import_outvariant = require("outvariant");
25
- var import_WebSocketHandler = require("../handlers/WebSocketHandler.js");
26
- var import_matchRequestUrl = require("../utils/matching/matchRequestUrl.js");
27
- var import_WebSocketClientManager = require("./WebSocketClientManager.js");
25
+ var import_WebSocketHandler = require("./handlers/WebSocketHandler.js");
26
+ var import_matchRequestUrl = require("./utils/matching/matchRequestUrl.js");
27
+ var import_WebSocketClientManager = require("./ws/WebSocketClientManager.js");
28
28
  const wsBroadcastChannel = new BroadcastChannel("msw:ws-client-manager");
29
29
  function createWebSocketLinkHandler(url) {
30
30
  (0, import_outvariant.invariant)(url, "Expected a WebSocket server URL but got undefined");
31
31
  (0, import_outvariant.invariant)(
32
32
  (0, import_matchRequestUrl.isPath)(url),
33
- "Expected a WebSocket server URL but got %s",
33
+ "Expected a WebSocket server URL to be a valid path but got %s",
34
34
  typeof url
35
35
  );
36
36
  const clientManager = new import_WebSocketClientManager.WebSocketClientManager(wsBroadcastChannel);
@@ -44,28 +44,9 @@ function createWebSocketLinkHandler(url) {
44
44
  handler[import_WebSocketHandler.kEmitter].on(event, listener);
45
45
  return handler;
46
46
  },
47
- /**
48
- * Broadcasts the given data to all WebSocket clients.
49
- *
50
- * @example
51
- * const service = ws.link('wss://example.com')
52
- * service.on('connection', () => {
53
- * service.broadcast('hello, everyone!')
54
- * })
55
- */
56
47
  broadcast(data) {
57
48
  this.broadcastExcept([], data);
58
49
  },
59
- /**
60
- * Broadcasts the given data to all WebSocket clients
61
- * except the ones provided in the `clients` argument.
62
- *
63
- * @example
64
- * const service = ws.link('wss://example.com')
65
- * service.on('connection', ({ client }) => {
66
- * service.broadcastExcept(client, 'hi, the rest of you!')
67
- * })
68
- */
69
50
  broadcastExcept(clients, data) {
70
51
  const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
71
52
  clientManager.clients.forEach((otherClient) => {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/ws.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport type {\n WebSocketClientConnectionProtocol,\n WebSocketData,\n} from '@mswjs/interceptors/WebSocket'\nimport {\n WebSocketHandler,\n kEmitter,\n type WebSocketHandlerEventMap,\n} from './handlers/WebSocketHandler'\nimport { Path, isPath } from './utils/matching/matchRequestUrl'\nimport { WebSocketClientManager } from './ws/WebSocketClientManager'\n\nconst wsBroadcastChannel = new BroadcastChannel('msw:ws-client-manager')\n\nexport type WebSocketLink = {\n /**\n * A set of all WebSocket clients connected\n * to this link.\n */\n clients: Set<WebSocketClientConnectionProtocol>\n\n on<EventType extends keyof WebSocketHandlerEventMap>(\n event: EventType,\n listener: (...args: WebSocketHandlerEventMap[EventType]) => void,\n ): WebSocketHandler\n\n /**\n * Broadcasts the given data to all WebSocket clients.\n *\n * @example\n * const service = ws.link('wss://example.com')\n * service.on('connection', () => {\n * service.broadcast('hello, everyone!')\n * })\n */\n broadcast(data: WebSocketData): void\n\n /**\n * Broadcasts the given data to all WebSocket clients\n * except the ones provided in the `clients` argument.\n *\n * @example\n * const service = ws.link('wss://example.com')\n * service.on('connection', ({ client }) => {\n * service.broadcastExcept(client, 'hi, the rest of you!')\n * })\n */\n broadcastExcept(\n clients:\n | WebSocketClientConnectionProtocol\n | Array<WebSocketClientConnectionProtocol>,\n data: WebSocketData,\n ): void\n}\n\n/**\n * Intercepts outgoing WebSocket connections to the given URL.\n *\n * @example\n * const chat = ws.link('wss://chat.example.com')\n * chat.on('connection', ({ client }) => {\n * client.send('hello from server!')\n * })\n */\nfunction createWebSocketLinkHandler(url: Path): WebSocketLink {\n invariant(url, 'Expected a WebSocket server URL but got undefined')\n\n invariant(\n isPath(url),\n 'Expected a WebSocket server URL to be a valid path but got %s',\n typeof url,\n )\n\n const clientManager = new WebSocketClientManager(wsBroadcastChannel)\n\n return {\n clients: clientManager.clients,\n on(event, listener) {\n const handler = new WebSocketHandler(url)\n\n // Add the connection event listener for when the\n // handler matches and emits a connection event.\n // When that happens, store that connection in the\n // set of all connections for reference.\n handler[kEmitter].on('connection', ({ client }) => {\n clientManager.addConnection(client)\n })\n\n // The \"handleWebSocketEvent\" function will invoke\n // the \"run()\" method on the WebSocketHandler.\n // If the handler matches, it will emit the \"connection\"\n // event. Attach the user-defined listener to that event.\n handler[kEmitter].on(event, listener)\n\n return handler\n },\n\n broadcast(data) {\n // This will invoke \"send()\" on the immediate clients\n // in this runtime and post a message to the broadcast channel\n // to trigger send for the clients in other runtimes.\n this.broadcastExcept([], data)\n },\n\n broadcastExcept(clients, data) {\n const ignoreClients = Array.prototype\n .concat(clients)\n .map((client) => client.id)\n\n clientManager.clients.forEach((otherClient) => {\n if (!ignoreClients.includes(otherClient.id)) {\n otherClient.send(data)\n }\n })\n },\n }\n}\n\nexport const ws = {\n link: createWebSocketLinkHandler,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAK1B,8BAIO;AACP,6BAA6B;AAC7B,oCAAuC;AAEvC,MAAM,qBAAqB,IAAI,iBAAiB,uBAAuB;AAoDvE,SAAS,2BAA2B,KAA0B;AAC5D,mCAAU,KAAK,mDAAmD;AAElE;AAAA,QACE,+BAAO,GAAG;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,IAAI,qDAAuB,kBAAkB;AAEnE,SAAO;AAAA,IACL,SAAS,cAAc;AAAA,IACvB,GAAG,OAAO,UAAU;AAClB,YAAM,UAAU,IAAI,yCAAiB,GAAG;AAMxC,cAAQ,gCAAQ,EAAE,GAAG,cAAc,CAAC,EAAE,OAAO,MAAM;AACjD,sBAAc,cAAc,MAAM;AAAA,MACpC,CAAC;AAMD,cAAQ,gCAAQ,EAAE,GAAG,OAAO,QAAQ;AAEpC,aAAO;AAAA,IACT;AAAA,IAEA,UAAU,MAAM;AAId,WAAK,gBAAgB,CAAC,GAAG,IAAI;AAAA,IAC/B;AAAA,IAEA,gBAAgB,SAAS,MAAM;AAC7B,YAAM,gBAAgB,MAAM,UACzB,OAAO,OAAO,EACd,IAAI,CAAC,WAAW,OAAO,EAAE;AAE5B,oBAAc,QAAQ,QAAQ,CAAC,gBAAgB;AAC7C,YAAI,CAAC,cAAc,SAAS,YAAY,EAAE,GAAG;AAC3C,sBAAY,KAAK,IAAI;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,MAAM,KAAK;AAAA,EAChB,MAAM;AACR;","names":[]}
@@ -2,15 +2,15 @@ import { invariant } from "outvariant";
2
2
  import {
3
3
  WebSocketHandler,
4
4
  kEmitter
5
- } from '../handlers/WebSocketHandler.mjs';
6
- import { isPath } from '../utils/matching/matchRequestUrl.mjs';
7
- import { WebSocketClientManager } from './WebSocketClientManager.mjs';
5
+ } from './handlers/WebSocketHandler.mjs';
6
+ import { isPath } from './utils/matching/matchRequestUrl.mjs';
7
+ import { WebSocketClientManager } from './ws/WebSocketClientManager.mjs';
8
8
  const wsBroadcastChannel = new BroadcastChannel("msw:ws-client-manager");
9
9
  function createWebSocketLinkHandler(url) {
10
10
  invariant(url, "Expected a WebSocket server URL but got undefined");
11
11
  invariant(
12
12
  isPath(url),
13
- "Expected a WebSocket server URL but got %s",
13
+ "Expected a WebSocket server URL to be a valid path but got %s",
14
14
  typeof url
15
15
  );
16
16
  const clientManager = new WebSocketClientManager(wsBroadcastChannel);
@@ -24,28 +24,9 @@ function createWebSocketLinkHandler(url) {
24
24
  handler[kEmitter].on(event, listener);
25
25
  return handler;
26
26
  },
27
- /**
28
- * Broadcasts the given data to all WebSocket clients.
29
- *
30
- * @example
31
- * const service = ws.link('wss://example.com')
32
- * service.on('connection', () => {
33
- * service.broadcast('hello, everyone!')
34
- * })
35
- */
36
27
  broadcast(data) {
37
28
  this.broadcastExcept([], data);
38
29
  },
39
- /**
40
- * Broadcasts the given data to all WebSocket clients
41
- * except the ones provided in the `clients` argument.
42
- *
43
- * @example
44
- * const service = ws.link('wss://example.com')
45
- * service.on('connection', ({ client }) => {
46
- * service.broadcastExcept(client, 'hi, the rest of you!')
47
- * })
48
- */
49
30
  broadcastExcept(clients, data) {
50
31
  const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
51
32
  clientManager.clients.forEach((otherClient) => {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/ws.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport type {\n WebSocketClientConnectionProtocol,\n WebSocketData,\n} from '@mswjs/interceptors/WebSocket'\nimport {\n WebSocketHandler,\n kEmitter,\n type WebSocketHandlerEventMap,\n} from './handlers/WebSocketHandler'\nimport { Path, isPath } from './utils/matching/matchRequestUrl'\nimport { WebSocketClientManager } from './ws/WebSocketClientManager'\n\nconst wsBroadcastChannel = new BroadcastChannel('msw:ws-client-manager')\n\nexport type WebSocketLink = {\n /**\n * A set of all WebSocket clients connected\n * to this link.\n */\n clients: Set<WebSocketClientConnectionProtocol>\n\n on<EventType extends keyof WebSocketHandlerEventMap>(\n event: EventType,\n listener: (...args: WebSocketHandlerEventMap[EventType]) => void,\n ): WebSocketHandler\n\n /**\n * Broadcasts the given data to all WebSocket clients.\n *\n * @example\n * const service = ws.link('wss://example.com')\n * service.on('connection', () => {\n * service.broadcast('hello, everyone!')\n * })\n */\n broadcast(data: WebSocketData): void\n\n /**\n * Broadcasts the given data to all WebSocket clients\n * except the ones provided in the `clients` argument.\n *\n * @example\n * const service = ws.link('wss://example.com')\n * service.on('connection', ({ client }) => {\n * service.broadcastExcept(client, 'hi, the rest of you!')\n * })\n */\n broadcastExcept(\n clients:\n | WebSocketClientConnectionProtocol\n | Array<WebSocketClientConnectionProtocol>,\n data: WebSocketData,\n ): void\n}\n\n/**\n * Intercepts outgoing WebSocket connections to the given URL.\n *\n * @example\n * const chat = ws.link('wss://chat.example.com')\n * chat.on('connection', ({ client }) => {\n * client.send('hello from server!')\n * })\n */\nfunction createWebSocketLinkHandler(url: Path): WebSocketLink {\n invariant(url, 'Expected a WebSocket server URL but got undefined')\n\n invariant(\n isPath(url),\n 'Expected a WebSocket server URL to be a valid path but got %s',\n typeof url,\n )\n\n const clientManager = new WebSocketClientManager(wsBroadcastChannel)\n\n return {\n clients: clientManager.clients,\n on(event, listener) {\n const handler = new WebSocketHandler(url)\n\n // Add the connection event listener for when the\n // handler matches and emits a connection event.\n // When that happens, store that connection in the\n // set of all connections for reference.\n handler[kEmitter].on('connection', ({ client }) => {\n clientManager.addConnection(client)\n })\n\n // The \"handleWebSocketEvent\" function will invoke\n // the \"run()\" method on the WebSocketHandler.\n // If the handler matches, it will emit the \"connection\"\n // event. Attach the user-defined listener to that event.\n handler[kEmitter].on(event, listener)\n\n return handler\n },\n\n broadcast(data) {\n // This will invoke \"send()\" on the immediate clients\n // in this runtime and post a message to the broadcast channel\n // to trigger send for the clients in other runtimes.\n this.broadcastExcept([], data)\n },\n\n broadcastExcept(clients, data) {\n const ignoreClients = Array.prototype\n .concat(clients)\n .map((client) => client.id)\n\n clientManager.clients.forEach((otherClient) => {\n if (!ignoreClients.includes(otherClient.id)) {\n otherClient.send(data)\n }\n })\n },\n }\n}\n\nexport const ws = {\n link: createWebSocketLinkHandler,\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAK1B;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAe,cAAc;AAC7B,SAAS,8BAA8B;AAEvC,MAAM,qBAAqB,IAAI,iBAAiB,uBAAuB;AAoDvE,SAAS,2BAA2B,KAA0B;AAC5D,YAAU,KAAK,mDAAmD;AAElE;AAAA,IACE,OAAO,GAAG;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,IAAI,uBAAuB,kBAAkB;AAEnE,SAAO;AAAA,IACL,SAAS,cAAc;AAAA,IACvB,GAAG,OAAO,UAAU;AAClB,YAAM,UAAU,IAAI,iBAAiB,GAAG;AAMxC,cAAQ,QAAQ,EAAE,GAAG,cAAc,CAAC,EAAE,OAAO,MAAM;AACjD,sBAAc,cAAc,MAAM;AAAA,MACpC,CAAC;AAMD,cAAQ,QAAQ,EAAE,GAAG,OAAO,QAAQ;AAEpC,aAAO;AAAA,IACT;AAAA,IAEA,UAAU,MAAM;AAId,WAAK,gBAAgB,CAAC,GAAG,IAAI;AAAA,IAC/B;AAAA,IAEA,gBAAgB,SAAS,MAAM;AAC7B,YAAM,gBAAgB,MAAM,UACzB,OAAO,OAAO,EACd,IAAI,CAAC,WAAW,OAAO,EAAE;AAE5B,oBAAc,QAAQ,QAAQ,CAAC,gBAAgB;AAC7C,YAAI,CAAC,cAAc,SAAS,YAAY,EAAE,GAAG;AAC3C,sBAAY,KAAK,IAAI;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,MAAM,KAAK;AAAA,EAChB,MAAM;AACR;","names":[]}