msw 2.3.0-ws.rc-5 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/cli/init.js +0 -0
  2. package/config/scripts/postinstall.js +0 -0
  3. package/lib/browser/index.d.mts +6 -7
  4. package/lib/browser/index.d.ts +6 -7
  5. package/lib/browser/index.js +156 -81
  6. package/lib/browser/index.js.map +1 -1
  7. package/lib/browser/index.mjs +156 -81
  8. package/lib/browser/index.mjs.map +1 -1
  9. package/lib/core/{GraphQLHandler-DGyzNtRQ.d.ts → GraphQLHandler-COiPfZ8k.d.ts} +1 -1
  10. package/lib/core/{GraphQLHandler-CzcXr7At.d.mts → GraphQLHandler-Dq_WRbKe.d.mts} +1 -1
  11. package/lib/core/{HttpResponse-BOzDwzB6.d.ts → HttpResponse-B07UKAkU.d.ts} +2 -2
  12. package/lib/core/{HttpResponse-CSyJ1cbO.d.mts → HttpResponse-C7niBMwb.d.mts} +2 -2
  13. package/lib/core/HttpResponse.d.mts +1 -1
  14. package/lib/core/HttpResponse.d.ts +1 -1
  15. package/lib/core/SetupApi.d.mts +12 -15
  16. package/lib/core/SetupApi.d.ts +12 -15
  17. package/lib/core/SetupApi.js +1 -3
  18. package/lib/core/SetupApi.js.map +1 -1
  19. package/lib/core/SetupApi.mjs +1 -3
  20. package/lib/core/SetupApi.mjs.map +1 -1
  21. package/lib/core/getResponse.d.mts +1 -1
  22. package/lib/core/getResponse.d.ts +1 -1
  23. package/lib/core/graphql.d.mts +2 -2
  24. package/lib/core/graphql.d.ts +2 -2
  25. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  26. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  27. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  28. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  29. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  30. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  31. package/lib/core/http.d.mts +1 -1
  32. package/lib/core/http.d.ts +1 -1
  33. package/lib/core/index.d.mts +2 -5
  34. package/lib/core/index.d.ts +2 -5
  35. package/lib/core/index.js +1 -5
  36. package/lib/core/index.js.map +1 -1
  37. package/lib/core/index.mjs +1 -7
  38. package/lib/core/index.mjs.map +1 -1
  39. package/lib/core/passthrough.d.mts +1 -1
  40. package/lib/core/passthrough.d.ts +1 -1
  41. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  42. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  43. package/lib/core/utils/executeHandlers.d.mts +1 -1
  44. package/lib/core/utils/executeHandlers.d.ts +1 -1
  45. package/lib/core/utils/executeHandlers.js +0 -4
  46. package/lib/core/utils/executeHandlers.js.map +1 -1
  47. package/lib/core/utils/executeHandlers.mjs +0 -6
  48. package/lib/core/utils/executeHandlers.mjs.map +1 -1
  49. package/lib/core/utils/handleRequest.d.mts +2 -2
  50. package/lib/core/utils/handleRequest.d.ts +2 -2
  51. package/lib/core/utils/handleRequest.js.map +1 -1
  52. package/lib/core/utils/handleRequest.mjs.map +1 -1
  53. package/lib/core/utils/internal/Disposable.d.mts +2 -2
  54. package/lib/core/utils/internal/Disposable.d.ts +2 -2
  55. package/lib/core/utils/internal/Disposable.js +5 -2
  56. package/lib/core/utils/internal/Disposable.js.map +1 -1
  57. package/lib/core/utils/internal/Disposable.mjs +5 -2
  58. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  59. package/lib/core/utils/internal/devUtils.d.mts +10 -1
  60. package/lib/core/utils/internal/devUtils.d.ts +10 -1
  61. package/lib/core/utils/internal/devUtils.js +7 -0
  62. package/lib/core/utils/internal/devUtils.js.map +1 -1
  63. package/lib/core/utils/internal/devUtils.mjs +7 -0
  64. package/lib/core/utils/internal/devUtils.mjs.map +1 -1
  65. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  66. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  67. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  68. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  69. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  70. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  71. package/lib/core/utils/logging/getTimestamp.d.mts +1 -4
  72. package/lib/core/utils/logging/getTimestamp.d.ts +1 -4
  73. package/lib/core/utils/logging/getTimestamp.js +2 -6
  74. package/lib/core/utils/logging/getTimestamp.js.map +1 -1
  75. package/lib/core/utils/logging/getTimestamp.mjs +2 -6
  76. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
  77. package/lib/core/utils/matching/matchRequestUrl.d.mts +1 -2
  78. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -2
  79. package/lib/core/utils/matching/matchRequestUrl.js +0 -4
  80. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
  81. package/lib/core/utils/matching/matchRequestUrl.mjs +0 -4
  82. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
  83. package/lib/core/utils/request/onUnhandledRequest.js +3 -3
  84. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  85. package/lib/core/utils/request/onUnhandledRequest.mjs +4 -4
  86. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  87. package/lib/iife/index.js +177 -1063
  88. package/lib/iife/index.js.map +1 -1
  89. package/lib/mockServiceWorker.js +1 -1
  90. package/lib/native/index.d.mts +5 -6
  91. package/lib/native/index.d.ts +5 -6
  92. package/lib/native/index.js +5 -13
  93. package/lib/native/index.js.map +1 -1
  94. package/lib/native/index.mjs +6 -14
  95. package/lib/native/index.mjs.map +1 -1
  96. package/lib/node/index.d.mts +7 -8
  97. package/lib/node/index.d.ts +7 -8
  98. package/lib/node/index.js +5 -13
  99. package/lib/node/index.js.map +1 -1
  100. package/lib/node/index.mjs +6 -14
  101. package/lib/node/index.mjs.map +1 -1
  102. package/package.json +36 -29
  103. package/src/browser/setupWorker/glossary.ts +10 -10
  104. package/src/browser/setupWorker/setupWorker.ts +3 -34
  105. package/src/core/SetupApi.ts +20 -28
  106. package/src/core/index.ts +1 -8
  107. package/src/core/utils/executeHandlers.ts +2 -6
  108. package/src/core/utils/handleRequest.ts +2 -1
  109. package/src/core/utils/internal/Disposable.ts +6 -3
  110. package/src/core/utils/internal/devUtils.test.ts +21 -0
  111. package/src/core/utils/internal/devUtils.ts +13 -0
  112. package/src/core/utils/logging/getTimestamp.test.ts +6 -20
  113. package/src/core/utils/logging/getTimestamp.ts +6 -11
  114. package/src/core/utils/matching/matchRequestUrl.test.ts +0 -44
  115. package/src/core/utils/matching/matchRequestUrl.ts +0 -4
  116. package/src/core/utils/request/onUnhandledRequest.test.ts +30 -4
  117. package/src/core/utils/request/onUnhandledRequest.ts +4 -4
  118. package/src/node/SetupServerApi.ts +7 -8
  119. package/src/node/SetupServerCommonApi.ts +8 -15
  120. package/src/node/glossary.ts +7 -5
  121. package/src/node/setupServer.ts +1 -2
  122. package/lib/core/handlers/WebSocketHandler.d.mts +0 -32
  123. package/lib/core/handlers/WebSocketHandler.d.ts +0 -32
  124. package/lib/core/handlers/WebSocketHandler.js +0 -62
  125. package/lib/core/handlers/WebSocketHandler.js.map +0 -1
  126. package/lib/core/handlers/WebSocketHandler.mjs +0 -44
  127. package/lib/core/handlers/WebSocketHandler.mjs.map +0 -1
  128. package/lib/core/ws/WebSocketClientManager.d.mts +0 -64
  129. package/lib/core/ws/WebSocketClientManager.d.ts +0 -64
  130. package/lib/core/ws/WebSocketClientManager.js +0 -123
  131. package/lib/core/ws/WebSocketClientManager.js.map +0 -1
  132. package/lib/core/ws/WebSocketClientManager.mjs +0 -103
  133. package/lib/core/ws/WebSocketClientManager.mjs.map +0 -1
  134. package/lib/core/ws/handleWebSocketEvent.d.mts +0 -16
  135. package/lib/core/ws/handleWebSocketEvent.d.ts +0 -16
  136. package/lib/core/ws/handleWebSocketEvent.js +0 -56
  137. package/lib/core/ws/handleWebSocketEvent.js.map +0 -1
  138. package/lib/core/ws/handleWebSocketEvent.mjs +0 -36
  139. package/lib/core/ws/handleWebSocketEvent.mjs.map +0 -1
  140. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +0 -34
  141. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +0 -34
  142. package/lib/core/ws/utils/attachWebSocketLogger.js +0 -217
  143. package/lib/core/ws/utils/attachWebSocketLogger.js.map +0 -1
  144. package/lib/core/ws/utils/attachWebSocketLogger.mjs +0 -197
  145. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +0 -1
  146. package/lib/core/ws/utils/getMessageLength.d.mts +0 -11
  147. package/lib/core/ws/utils/getMessageLength.d.ts +0 -11
  148. package/lib/core/ws/utils/getMessageLength.js +0 -33
  149. package/lib/core/ws/utils/getMessageLength.js.map +0 -1
  150. package/lib/core/ws/utils/getMessageLength.mjs +0 -13
  151. package/lib/core/ws/utils/getMessageLength.mjs.map +0 -1
  152. package/lib/core/ws/utils/getPublicData.d.mts +0 -5
  153. package/lib/core/ws/utils/getPublicData.d.ts +0 -5
  154. package/lib/core/ws/utils/getPublicData.js +0 -36
  155. package/lib/core/ws/utils/getPublicData.js.map +0 -1
  156. package/lib/core/ws/utils/getPublicData.mjs +0 -16
  157. package/lib/core/ws/utils/getPublicData.mjs.map +0 -1
  158. package/lib/core/ws/utils/truncateMessage.d.mts +0 -3
  159. package/lib/core/ws/utils/truncateMessage.d.ts +0 -3
  160. package/lib/core/ws/utils/truncateMessage.js +0 -31
  161. package/lib/core/ws/utils/truncateMessage.js.map +0 -1
  162. package/lib/core/ws/utils/truncateMessage.mjs +0 -11
  163. package/lib/core/ws/utils/truncateMessage.mjs.map +0 -1
  164. package/lib/core/ws/webSocketInterceptor.d.mts +0 -5
  165. package/lib/core/ws/webSocketInterceptor.d.ts +0 -5
  166. package/lib/core/ws/webSocketInterceptor.js +0 -26
  167. package/lib/core/ws/webSocketInterceptor.js.map +0 -1
  168. package/lib/core/ws/webSocketInterceptor.mjs +0 -6
  169. package/lib/core/ws/webSocketInterceptor.mjs.map +0 -1
  170. package/lib/core/ws.d.mts +0 -49
  171. package/lib/core/ws.d.ts +0 -49
  172. package/lib/core/ws.js +0 -63
  173. package/lib/core/ws.js.map +0 -1
  174. package/lib/core/ws.mjs +0 -46
  175. package/lib/core/ws.mjs.map +0 -1
  176. package/src/core/handlers/WebSocketHandler.ts +0 -71
  177. package/src/core/ws/WebSocketClientManager.test.ts +0 -159
  178. package/src/core/ws/WebSocketClientManager.ts +0 -170
  179. package/src/core/ws/handleWebSocketEvent.ts +0 -56
  180. package/src/core/ws/utils/attachWebSocketLogger.ts +0 -269
  181. package/src/core/ws/utils/getMessageLength.test.ts +0 -16
  182. package/src/core/ws/utils/getMessageLength.ts +0 -19
  183. package/src/core/ws/utils/getPublicData.test.ts +0 -38
  184. package/src/core/ws/utils/getPublicData.ts +0 -17
  185. package/src/core/ws/utils/truncateMessage.test.ts +0 -12
  186. package/src/core/ws/utils/truncateMessage.ts +0 -9
  187. package/src/core/ws/webSocketInterceptor.ts +0 -3
  188. package/src/core/ws.test.ts +0 -23
  189. package/src/core/ws.ts +0 -122
@@ -1,269 +0,0 @@
1
- import type {
2
- WebSocketClientConnection,
3
- WebSocketConnectionData,
4
- WebSocketData,
5
- } from '@mswjs/interceptors/WebSocket'
6
- import { devUtils } from '../../utils/internal/devUtils'
7
- import { getTimestamp } from '../../utils/logging/getTimestamp'
8
- import { toPublicUrl } from '../../utils/request/toPublicUrl'
9
- import { getMessageLength } from './getMessageLength'
10
- import { getPublicData } from './getPublicData'
11
-
12
- const colors = {
13
- blue: '#3b82f6',
14
- green: '#22c55e',
15
- red: '#ef4444',
16
- orange: '#ff6a33',
17
- }
18
-
19
- export function attachWebSocketLogger(
20
- connection: WebSocketConnectionData,
21
- ): void {
22
- const { client, server } = connection
23
-
24
- logConnectionOpen(client)
25
-
26
- // Log the events sent from the WebSocket client.
27
- // WebSocket client connection object is written from the
28
- // server's perspective so these message events are outgoing.
29
- /**
30
- * @todo Provide the reference to the exact event handler
31
- * that called this `client.send()`.
32
- */
33
- client.addEventListener('message', (event) => {
34
- logOutgoingClientMessage(event)
35
- })
36
-
37
- client.addEventListener('close', (event) => {
38
- logConnectionClose(event)
39
- })
40
-
41
- // Log the events received by the WebSocket client.
42
- // "client.socket" references the actual WebSocket instance
43
- // so these message events are incoming messages.
44
- client.socket.addEventListener('message', (event) => {
45
- logIncomingClientMessage(event)
46
- })
47
-
48
- // Log client errors (connection closures due to errors).
49
- client.socket.addEventListener('error', (event) => {
50
- logClientError(event)
51
- })
52
-
53
- client.send = new Proxy(client.send, {
54
- apply(target, thisArg, args) {
55
- const [data] = args
56
- const messageEvent = new MessageEvent('message', { data })
57
- Object.defineProperties(messageEvent, {
58
- currentTarget: {
59
- enumerable: true,
60
- writable: false,
61
- value: client.socket,
62
- },
63
- target: {
64
- enumerable: true,
65
- writable: false,
66
- value: client.socket,
67
- },
68
- })
69
- logIncomingMockedClientMessage(messageEvent)
70
-
71
- return Reflect.apply(target, thisArg, args)
72
- },
73
- })
74
-
75
- server.addEventListener(
76
- 'open',
77
- () => {
78
- server.addEventListener('message', (event) => {
79
- logIncomingServerMessage(event)
80
- })
81
- },
82
- { once: true },
83
- )
84
-
85
- // Log outgoing client events initiated by the event handler.
86
- // The actual client never sent these but the handler did.
87
- server.send = new Proxy(server.send, {
88
- apply(target, thisArg, args) {
89
- const [data] = args
90
- const messageEvent = new MessageEvent('message', { data })
91
- Object.defineProperties(messageEvent, {
92
- currentTarget: {
93
- enumerable: true,
94
- writable: false,
95
- value: server['realWebSocket'],
96
- },
97
- target: {
98
- enumerable: true,
99
- writable: false,
100
- value: server['realWebSocket'],
101
- },
102
- })
103
-
104
- logOutgoingMockedClientMessage(messageEvent)
105
-
106
- return Reflect.apply(target, thisArg, args)
107
- },
108
- })
109
- }
110
-
111
- /**
112
- * Prints the WebSocket connection.
113
- * This is meant to be logged by every WebSocket handler
114
- * that intercepted this connection. This helps you see
115
- * what handlers observe this connection.
116
- */
117
- export function logConnectionOpen(client: WebSocketClientConnection) {
118
- const publicUrl = toPublicUrl(client.url)
119
-
120
- console.groupCollapsed(
121
- devUtils.formatMessage(`${getTimestamp()} %c▶%c ${publicUrl}`),
122
- `color:${colors.blue}`,
123
- 'color:inherit',
124
- )
125
- console.log('Client:', client.socket)
126
- console.groupEnd()
127
- }
128
-
129
- /**
130
- * Prints the outgoing client message.
131
- */
132
- export async function logOutgoingClientMessage(
133
- event: MessageEvent<WebSocketData>,
134
- ) {
135
- const byteLength = getMessageLength(event.data)
136
- const publicData = await getPublicData(event.data)
137
-
138
- console.groupCollapsed(
139
- devUtils.formatMessage(
140
- `${getTimestamp({ milliseconds: true })} %c↑%c ${publicData} %c${byteLength}%c`,
141
- ),
142
- `color:${colors.green}`,
143
- 'color:inherit',
144
- 'color:gray;font-weight:normal',
145
- 'color:inherit;font-weight:inherit',
146
- )
147
- console.log(event)
148
- console.groupEnd()
149
- }
150
-
151
- /**
152
- * Prints the outgoing client message initiated
153
- * by `server.send()` in the event handler.
154
- */
155
- export async function logOutgoingMockedClientMessage(
156
- event: MessageEvent<WebSocketData>,
157
- ) {
158
- const byteLength = getMessageLength(event.data)
159
- const publicData = await getPublicData(event.data)
160
-
161
- console.groupCollapsed(
162
- devUtils.formatMessage(
163
- `${getTimestamp({ milliseconds: true })} %c⇡%c ${publicData} %c${byteLength}%c`,
164
- ),
165
- `color:${colors.orange}`,
166
- 'color:inherit',
167
- 'color:gray;font-weight:normal',
168
- 'color:inherit;font-weight:inherit',
169
- )
170
- console.log(event)
171
- console.groupEnd()
172
- }
173
-
174
- /**
175
- * Prings the message received by the WebSocket client.
176
- * This is fired when the "message" event is dispatched
177
- * on the actual WebSocket client instance, and translates to
178
- * the client receiving a message from the server.
179
- */
180
- export async function logIncomingClientMessage(
181
- event: MessageEvent<WebSocketData>,
182
- ) {
183
- const byteLength = getMessageLength(event.data)
184
- const publicData = await getPublicData(event.data)
185
-
186
- console.groupCollapsed(
187
- devUtils.formatMessage(
188
- `${getTimestamp({ milliseconds: true })} %c↓%c ${publicData} %c${byteLength}%c`,
189
- ),
190
- `color:${colors.red}`,
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
-
199
- /**
200
- * Prints the outgoing client message initiated
201
- * by `client.send()` in the event handler.
202
- */
203
- export async function logIncomingMockedClientMessage(
204
- event: MessageEvent<WebSocketData>,
205
- ) {
206
- const byteLength = getMessageLength(event.data)
207
- const publicData = await getPublicData(event.data)
208
-
209
- console.groupCollapsed(
210
- devUtils.formatMessage(
211
- `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,
212
- ),
213
- `color:${colors.orange}`,
214
- 'color:inherit',
215
- 'color:gray;font-weight:normal',
216
- 'color:inherit;font-weight:inherit',
217
- )
218
- console.log(event)
219
- console.groupEnd()
220
- }
221
-
222
- function logConnectionClose(event: CloseEvent) {
223
- const target = event.target as WebSocket
224
- const publicUrl = toPublicUrl(target.url)
225
-
226
- console.groupCollapsed(
227
- devUtils.formatMessage(
228
- `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,
229
- ),
230
- `color:${colors.blue}`,
231
- 'color:inherit',
232
- )
233
- console.log(event)
234
- console.groupEnd()
235
- }
236
-
237
- export async function logIncomingServerMessage(
238
- event: MessageEvent<WebSocketData>,
239
- ) {
240
- const byteLength = getMessageLength(event.data)
241
- const publicData = await getPublicData(event.data)
242
-
243
- console.groupCollapsed(
244
- devUtils.formatMessage(
245
- `${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,
246
- ),
247
- `color:${colors.green}`,
248
- 'color:inherit',
249
- 'color:gray;font-weight:normal',
250
- 'color:inherit;font-weight:inherit',
251
- )
252
- console.log(event)
253
- console.groupEnd()
254
- }
255
-
256
- function logClientError(event: Event) {
257
- const socket = event.target as WebSocket
258
- const publicUrl = toPublicUrl(socket.url)
259
-
260
- console.groupCollapsed(
261
- devUtils.formatMessage(
262
- `${getTimestamp({ milliseconds: true })} %c\u00D7%c ${publicUrl}`,
263
- ),
264
- `color:${colors.blue}`,
265
- 'color:inherit',
266
- )
267
- console.log(event)
268
- console.groupEnd()
269
- }
@@ -1,16 +0,0 @@
1
- import { getMessageLength } from './getMessageLength'
2
-
3
- it('returns the length of the string', () => {
4
- expect(getMessageLength('')).toBe(0)
5
- expect(getMessageLength('hello')).toBe(5)
6
- })
7
-
8
- it('returns the size of the Blob', () => {
9
- expect(getMessageLength(new Blob())).toBe(0)
10
- expect(getMessageLength(new Blob(['hello']))).toBe(5)
11
- })
12
-
13
- it('returns the byte length of ArrayBuffer', () => {
14
- expect(getMessageLength(new ArrayBuffer(0))).toBe(0)
15
- expect(getMessageLength(new ArrayBuffer(5))).toBe(5)
16
- })
@@ -1,19 +0,0 @@
1
- import type { 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
- export function getMessageLength(data: WebSocketData): number {
10
- if (data instanceof Blob) {
11
- return data.size
12
- }
13
-
14
- if (data instanceof ArrayBuffer) {
15
- return data.byteLength
16
- }
17
-
18
- return new Blob([data]).size
19
- }
@@ -1,38 +0,0 @@
1
- import { getPublicData } from './getPublicData'
2
-
3
- it('returns a short string as-is', async () => {
4
- expect(await getPublicData('')).toBe('')
5
- expect(await getPublicData('hello')).toBe('hello')
6
- })
7
-
8
- it('returns a truncated long string', async () => {
9
- expect(await getPublicData('this is a very long string')).toBe(
10
- 'this is a very long stri…',
11
- )
12
- })
13
-
14
- it('returns a short Blob text as-is', async () => {
15
- expect(await getPublicData(new Blob(['']))).toBe('Blob()')
16
- expect(await getPublicData(new Blob(['hello']))).toBe('Blob(hello)')
17
- })
18
-
19
- it('returns a truncated long Blob text', async () => {
20
- expect(await getPublicData(new Blob(['this is a very long string']))).toBe(
21
- 'Blob(this is a very long stri…)',
22
- )
23
- })
24
-
25
- it('returns a short ArrayBuffer text as-is', async () => {
26
- expect(await getPublicData(new TextEncoder().encode(''))).toBe(
27
- 'ArrayBuffer()',
28
- )
29
- expect(await getPublicData(new TextEncoder().encode('hello'))).toBe(
30
- 'ArrayBuffer(hello)',
31
- )
32
- })
33
-
34
- it('returns a truncated ArrayBuffer text', async () => {
35
- expect(
36
- await getPublicData(new TextEncoder().encode('this is a very long string')),
37
- ).toBe('ArrayBuffer(this is a very long stri…)')
38
- })
@@ -1,17 +0,0 @@
1
- import { WebSocketData } from '@mswjs/interceptors/WebSocket'
2
- import { truncateMessage } from './truncateMessage'
3
-
4
- export async function getPublicData(data: WebSocketData): Promise<string> {
5
- if (data instanceof Blob) {
6
- const text = await data.text()
7
- return `Blob(${truncateMessage(text)})`
8
- }
9
-
10
- // Handle all ArrayBuffer-like objects.
11
- if (typeof data === 'object' && 'byteLength' in data) {
12
- const text = new TextDecoder().decode(data)
13
- return `ArrayBuffer(${truncateMessage(text)})`
14
- }
15
-
16
- return truncateMessage(data)
17
- }
@@ -1,12 +0,0 @@
1
- import { truncateMessage } from './truncateMessage'
2
-
3
- it('returns a short string as-is', () => {
4
- expect(truncateMessage('')).toBe('')
5
- expect(truncateMessage('hello')).toBe('hello')
6
- })
7
-
8
- it('truncates a long string', () => {
9
- expect(truncateMessage('this is a very long string')).toBe(
10
- 'this is a very long stri…',
11
- )
12
- })
@@ -1,9 +0,0 @@
1
- const MAX_LENGTH = 24
2
-
3
- export function truncateMessage(message: string): string {
4
- if (message.length <= MAX_LENGTH) {
5
- return message
6
- }
7
-
8
- return `${message.slice(0, MAX_LENGTH)}…`
9
- }
@@ -1,3 +0,0 @@
1
- import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket'
2
-
3
- export const webSocketInterceptor = new WebSocketInterceptor()
@@ -1,23 +0,0 @@
1
- /**
2
- * @vitest-environment node-websocket
3
- */
4
- import { ws } from './ws'
5
-
6
- it('exports the "link()" method', () => {
7
- expect(ws).toHaveProperty('link')
8
- expect(ws.link).toBeInstanceOf(Function)
9
- })
10
-
11
- it('throws an error when calling "ws.link()" without a URL argument', () => {
12
- expect(() =>
13
- // @ts-expect-error Intentionally invalid call.
14
- ws.link(),
15
- ).toThrow('Expected a WebSocket server URL but got undefined')
16
- })
17
-
18
- it('throws an error when given a non-path argument to "ws.link()"', () => {
19
- expect(() =>
20
- // @ts-expect-error Intentionally invalid argument.
21
- ws.link(2),
22
- ).toThrow('Expected a WebSocket server URL to be a valid path but got number')
23
- })
package/src/core/ws.ts DELETED
@@ -1,122 +0,0 @@
1
- import { invariant } from 'outvariant'
2
- import type {
3
- WebSocketClientConnectionProtocol,
4
- WebSocketData,
5
- } from '@mswjs/interceptors/WebSocket'
6
- import {
7
- WebSocketHandler,
8
- kEmitter,
9
- type WebSocketHandlerEventMap,
10
- } from './handlers/WebSocketHandler'
11
- import { Path, isPath } from './utils/matching/matchRequestUrl'
12
- import { WebSocketClientManager } from './ws/WebSocketClientManager'
13
-
14
- const wsBroadcastChannel = new BroadcastChannel('msw:ws-client-manager')
15
-
16
- export type WebSocketLink = {
17
- /**
18
- * A set of all WebSocket clients connected
19
- * to this link.
20
- */
21
- clients: Set<WebSocketClientConnectionProtocol>
22
-
23
- on<EventType extends keyof WebSocketHandlerEventMap>(
24
- event: EventType,
25
- listener: (...args: WebSocketHandlerEventMap[EventType]) => void,
26
- ): WebSocketHandler
27
-
28
- /**
29
- * Broadcasts the given data to all WebSocket clients.
30
- *
31
- * @example
32
- * const service = ws.link('wss://example.com')
33
- * service.on('connection', () => {
34
- * service.broadcast('hello, everyone!')
35
- * })
36
- */
37
- broadcast(data: WebSocketData): void
38
-
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
- broadcastExcept(
50
- clients:
51
- | WebSocketClientConnectionProtocol
52
- | Array<WebSocketClientConnectionProtocol>,
53
- data: WebSocketData,
54
- ): void
55
- }
56
-
57
- /**
58
- * Intercepts outgoing WebSocket connections to the given URL.
59
- *
60
- * @example
61
- * const chat = ws.link('wss://chat.example.com')
62
- * chat.on('connection', ({ client }) => {
63
- * client.send('hello from server!')
64
- * })
65
- */
66
- function createWebSocketLinkHandler(url: Path): WebSocketLink {
67
- invariant(url, 'Expected a WebSocket server URL but got undefined')
68
-
69
- invariant(
70
- isPath(url),
71
- 'Expected a WebSocket server URL to be a valid path but got %s',
72
- typeof url,
73
- )
74
-
75
- const clientManager = new WebSocketClientManager(wsBroadcastChannel)
76
-
77
- return {
78
- clients: clientManager.clients,
79
- on(event, listener) {
80
- const handler = new WebSocketHandler(url)
81
-
82
- // Add the connection event listener for when the
83
- // handler matches and emits a connection event.
84
- // When that happens, store that connection in the
85
- // set of all connections for reference.
86
- handler[kEmitter].on('connection', ({ client }) => {
87
- clientManager.addConnection(client)
88
- })
89
-
90
- // The "handleWebSocketEvent" function will invoke
91
- // the "run()" method on the WebSocketHandler.
92
- // If the handler matches, it will emit the "connection"
93
- // event. Attach the user-defined listener to that event.
94
- handler[kEmitter].on(event, listener)
95
-
96
- return handler
97
- },
98
-
99
- broadcast(data) {
100
- // This will invoke "send()" on the immediate clients
101
- // in this runtime and post a message to the broadcast channel
102
- // to trigger send for the clients in other runtimes.
103
- this.broadcastExcept([], data)
104
- },
105
-
106
- broadcastExcept(clients, data) {
107
- const ignoreClients = Array.prototype
108
- .concat(clients)
109
- .map((client) => client.id)
110
-
111
- clientManager.clients.forEach((otherClient) => {
112
- if (!ignoreClients.includes(otherClient.id)) {
113
- otherClient.send(data)
114
- }
115
- })
116
- },
117
- }
118
- }
119
-
120
- export const ws = {
121
- link: createWebSocketLinkHandler,
122
- }