msw 2.13.5 → 2.14.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 (111) hide show
  1. package/lib/core/{HttpResponse-BMMzfpjG.d.mts → HttpResponse-CxHR1nNN.d.mts} +5 -1
  2. package/lib/core/{HttpResponse-DPDqE4Pb.d.ts → HttpResponse-aGiIzO91.d.ts} +5 -1
  3. package/lib/core/HttpResponse.d.mts +1 -1
  4. package/lib/core/HttpResponse.d.ts +1 -1
  5. package/lib/core/experimental/compat.d.mts +1 -1
  6. package/lib/core/experimental/compat.d.ts +1 -1
  7. package/lib/core/experimental/define-network.d.mts +1 -1
  8. package/lib/core/experimental/define-network.d.ts +1 -1
  9. package/lib/core/experimental/frames/http-frame.d.mts +1 -1
  10. package/lib/core/experimental/frames/http-frame.d.ts +1 -1
  11. package/lib/core/experimental/frames/http-frame.js +3 -2
  12. package/lib/core/experimental/frames/http-frame.js.map +1 -1
  13. package/lib/core/experimental/frames/http-frame.mjs +3 -2
  14. package/lib/core/experimental/frames/http-frame.mjs.map +1 -1
  15. package/lib/core/experimental/frames/network-frame.d.mts +1 -1
  16. package/lib/core/experimental/frames/network-frame.d.ts +1 -1
  17. package/lib/core/experimental/frames/websocket-frame.d.mts +1 -1
  18. package/lib/core/experimental/frames/websocket-frame.d.ts +1 -1
  19. package/lib/core/experimental/handlers-controller.d.mts +1 -1
  20. package/lib/core/experimental/handlers-controller.d.ts +1 -1
  21. package/lib/core/experimental/handlers-controller.js +16 -5
  22. package/lib/core/experimental/handlers-controller.js.map +1 -1
  23. package/lib/core/experimental/handlers-controller.mjs +16 -5
  24. package/lib/core/experimental/handlers-controller.mjs.map +1 -1
  25. package/lib/core/experimental/index.d.mts +1 -1
  26. package/lib/core/experimental/index.d.ts +1 -1
  27. package/lib/core/experimental/on-unhandled-frame.d.mts +1 -1
  28. package/lib/core/experimental/on-unhandled-frame.d.ts +1 -1
  29. package/lib/core/experimental/setup-api.d.mts +1 -1
  30. package/lib/core/experimental/setup-api.d.ts +1 -1
  31. package/lib/core/experimental/sources/interceptor-source.d.mts +1 -1
  32. package/lib/core/experimental/sources/interceptor-source.d.ts +1 -1
  33. package/lib/core/experimental/sources/network-source.d.mts +1 -1
  34. package/lib/core/experimental/sources/network-source.d.ts +1 -1
  35. package/lib/core/getResponse.d.mts +1 -1
  36. package/lib/core/getResponse.d.ts +1 -1
  37. package/lib/core/graphql.d.mts +1 -1
  38. package/lib/core/graphql.d.ts +1 -1
  39. package/lib/core/handlers/GraphQLHandler.d.mts +1 -1
  40. package/lib/core/handlers/GraphQLHandler.d.ts +1 -1
  41. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  42. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  43. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  44. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  45. package/lib/core/handlers/RequestHandler.js +22 -1
  46. package/lib/core/handlers/RequestHandler.js.map +1 -1
  47. package/lib/core/handlers/RequestHandler.mjs +22 -1
  48. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  49. package/lib/core/handlers/WebSocketHandler.d.mts +5 -2
  50. package/lib/core/handlers/WebSocketHandler.d.ts +5 -2
  51. package/lib/core/handlers/WebSocketHandler.js +23 -6
  52. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  53. package/lib/core/handlers/WebSocketHandler.mjs +23 -6
  54. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  55. package/lib/core/http.d.mts +1 -1
  56. package/lib/core/http.d.ts +1 -1
  57. package/lib/core/index.d.mts +1 -1
  58. package/lib/core/index.d.ts +1 -1
  59. package/lib/core/passthrough.d.mts +1 -1
  60. package/lib/core/passthrough.d.ts +1 -1
  61. package/lib/core/sse.d.mts +1 -1
  62. package/lib/core/sse.d.ts +1 -1
  63. package/lib/core/utils/HttpResponse/decorators.d.mts +3 -3
  64. package/lib/core/utils/HttpResponse/decorators.d.ts +3 -3
  65. package/lib/core/utils/HttpResponse/decorators.js +4 -10
  66. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  67. package/lib/core/utils/HttpResponse/decorators.mjs +4 -10
  68. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  69. package/lib/core/utils/executeHandlers.d.mts +1 -1
  70. package/lib/core/utils/executeHandlers.d.ts +1 -1
  71. package/lib/core/utils/handleRequest.d.mts +1 -1
  72. package/lib/core/utils/handleRequest.d.ts +1 -1
  73. package/lib/core/utils/internal/attachSiblingHandlers.d.mts +15 -0
  74. package/lib/core/utils/internal/attachSiblingHandlers.d.ts +15 -0
  75. package/lib/core/utils/internal/attachSiblingHandlers.js +44 -0
  76. package/lib/core/utils/internal/attachSiblingHandlers.js.map +1 -0
  77. package/lib/core/utils/internal/attachSiblingHandlers.mjs +24 -0
  78. package/lib/core/utils/internal/attachSiblingHandlers.mjs.map +1 -0
  79. package/lib/core/utils/internal/isHandlerKind.d.mts +1 -1
  80. package/lib/core/utils/internal/isHandlerKind.d.ts +1 -1
  81. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +1 -1
  82. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +1 -1
  83. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  84. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  85. package/lib/core/utils/request/storeResponseCookies.js +1 -1
  86. package/lib/core/utils/request/storeResponseCookies.js.map +1 -1
  87. package/lib/core/utils/request/storeResponseCookies.mjs +2 -2
  88. package/lib/core/utils/request/storeResponseCookies.mjs.map +1 -1
  89. package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
  90. package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
  91. package/lib/core/ws.d.mts +17 -4
  92. package/lib/core/ws.d.ts +17 -4
  93. package/lib/core/ws.js +30 -5
  94. package/lib/core/ws.js.map +1 -1
  95. package/lib/core/ws.mjs +34 -6
  96. package/lib/core/ws.mjs.map +1 -1
  97. package/lib/iife/index.js +1241 -1158
  98. package/lib/iife/index.js.map +1 -1
  99. package/lib/mockServiceWorker.js +1 -1
  100. package/package.json +2 -2
  101. package/src/core/experimental/frames/http-frame.test.ts +6 -1
  102. package/src/core/experimental/frames/http-frame.ts +6 -2
  103. package/src/core/experimental/handlers-controller.test.ts +139 -5
  104. package/src/core/experimental/handlers-controller.ts +24 -9
  105. package/src/core/handlers/RequestHandler.ts +36 -1
  106. package/src/core/handlers/WebSocketHandler.test.ts +58 -0
  107. package/src/core/handlers/WebSocketHandler.ts +37 -8
  108. package/src/core/utils/HttpResponse/decorators.ts +6 -21
  109. package/src/core/utils/internal/attachSiblingHandlers.ts +28 -0
  110. package/src/core/utils/request/storeResponseCookies.ts +2 -4
  111. package/src/core/ws.ts +65 -6
package/src/core/ws.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { invariant } from 'outvariant'
2
+ import { FetchResponse, resolveWebSocketUrl } from '@mswjs/interceptors'
2
3
  import type {
3
4
  WebSocketData,
4
5
  WebSocketClientConnectionProtocol,
@@ -9,8 +10,15 @@ import {
9
10
  type WebSocketHandlerEventMap,
10
11
  } from './handlers/WebSocketHandler'
11
12
  import { hasRefCounted } from './utils/internal/hasRefCounted'
12
- import { type Path, isPath } from './utils/matching/matchRequestUrl'
13
+ import {
14
+ type Path,
15
+ type PathParams,
16
+ isPath,
17
+ matchRequestUrl,
18
+ } from './utils/matching/matchRequestUrl'
13
19
  import { WebSocketClientManager } from './ws/WebSocketClientManager'
20
+ import { http } from './http'
21
+ import { attachSiblingHandlers } from './utils/internal/attachSiblingHandlers'
14
22
 
15
23
  const webSocketChannel = new BroadcastChannel('msw:websocket-client-manager')
16
24
 
@@ -100,18 +108,29 @@ function createWebSocketLinkHandler(url: Path): WebSocketLink {
100
108
 
101
109
  const clientManager = new WebSocketClientManager(webSocketChannel)
102
110
 
111
+ // The same upgrade handler instance is attached as a sibling to every
112
+ // WebSocketHandler returned by this link. `groupHandlersByKind` dedupes
113
+ // by reference, so it lands in the `request` bucket exactly once regardless
114
+ // of which subset of WS handlers the user ends up registering.
115
+ const upgradeHandler = http.get(({ request }) => {
116
+ return (
117
+ request.headers.get('upgrade')?.toLowerCase() === 'websocket' &&
118
+ matchRequestUrl(new URL(resolveWebSocketUrl(request.url)), url).matches
119
+ )
120
+ }, ws.onUpgrade)
121
+
103
122
  return {
104
123
  get clients() {
105
124
  return clientManager.clients
106
125
  },
107
126
  addEventListener(event, listener) {
108
- const handler = new WebSocketHandler(url)
127
+ const webSocketHandler = new WebSocketHandler(url)
109
128
 
110
129
  // Add the connection event listener for when the
111
130
  // handler matches and emits a connection event.
112
131
  // When that happens, store that connection in the
113
132
  // set of all connections for reference.
114
- handler[kEmitter].on('connection', async ({ client }) => {
133
+ webSocketHandler[kEmitter].on('connection', async ({ client }) => {
115
134
  await clientManager.addConnection(client)
116
135
  })
117
136
 
@@ -119,9 +138,9 @@ function createWebSocketLinkHandler(url: Path): WebSocketLink {
119
138
  // the "run()" method on the WebSocketHandler.
120
139
  // If the handler matches, it will emit the "connection"
121
140
  // event. Attach the user-defined listener to that event.
122
- handler[kEmitter].on(event, listener)
141
+ webSocketHandler[kEmitter].on(event, listener)
123
142
 
124
- return handler
143
+ return attachSiblingHandlers(webSocketHandler, [upgradeHandler])
125
144
  },
126
145
 
127
146
  broadcast(data) {
@@ -145,6 +164,24 @@ function createWebSocketLinkHandler(url: Path): WebSocketLink {
145
164
  }
146
165
  }
147
166
 
167
+ const WEBSOCKET_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
168
+
169
+ interface WebSocketNamespace {
170
+ link: typeof createWebSocketLinkHandler
171
+ /**
172
+ * Request handler for the `upgrade` requests to the WebSocket protocol.
173
+ * This requires a WebSocket handler to be present to fire.
174
+ * @note This only affects Node.js as the `upgrade` request header is
175
+ * forbidden and cannot be read in the browser. Consider using the
176
+ * `WebSocket` API for establishing WebSocket connections in the browser.
177
+ */
178
+ onUpgrade: (info: {
179
+ requestId: string
180
+ request: Request
181
+ params: PathParams
182
+ }) => Promise<Response | undefined> | Response | undefined
183
+ }
184
+
148
185
  /**
149
186
  * A namespace to intercept and mock WebSocket connections.
150
187
  *
@@ -154,8 +191,30 @@ function createWebSocketLinkHandler(url: Path): WebSocketLink {
154
191
  * @see {@link https://mswjs.io/docs/api/ws `ws` API reference}
155
192
  * @see {@link https://mswjs.io/docs/basics/handling-websocket-events Handling WebSocket events}
156
193
  */
157
- export const ws = {
194
+ export const ws: WebSocketNamespace = {
158
195
  link: createWebSocketLinkHandler,
196
+ async onUpgrade({ request }) {
197
+ const key = request.headers.get('sec-websocket-key')
198
+
199
+ if (!key) {
200
+ return
201
+ }
202
+
203
+ const keyBytes = new TextEncoder().encode(key + WEBSOCKET_GUID)
204
+ const digest = await crypto.subtle.digest('SHA-1', keyBytes)
205
+ const acceptValue = btoa(String.fromCharCode(...new Uint8Array(digest)))
206
+
207
+ new WebSocket(resolveWebSocketUrl(request.url))
208
+
209
+ return new FetchResponse(null, {
210
+ status: 101,
211
+ headers: {
212
+ upgrade: 'websocket',
213
+ connection: 'upgrade',
214
+ 'sec-websocket-accept': acceptValue,
215
+ },
216
+ })
217
+ },
159
218
  }
160
219
 
161
220
  export { type WebSocketData }