msw 2.13.6 → 2.14.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/core/{HttpResponse-BMMzfpjG.d.mts → HttpResponse-CxHR1nNN.d.mts} +5 -1
- package/lib/core/{HttpResponse-DPDqE4Pb.d.ts → HttpResponse-aGiIzO91.d.ts} +5 -1
- package/lib/core/HttpResponse.d.mts +1 -1
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/experimental/compat.d.mts +1 -1
- package/lib/core/experimental/compat.d.ts +1 -1
- package/lib/core/experimental/define-network.d.mts +1 -1
- package/lib/core/experimental/define-network.d.ts +1 -1
- package/lib/core/experimental/frames/http-frame.d.mts +1 -1
- package/lib/core/experimental/frames/http-frame.d.ts +1 -1
- package/lib/core/experimental/frames/http-frame.js +3 -2
- package/lib/core/experimental/frames/http-frame.js.map +1 -1
- package/lib/core/experimental/frames/http-frame.mjs +3 -2
- package/lib/core/experimental/frames/http-frame.mjs.map +1 -1
- package/lib/core/experimental/frames/network-frame.d.mts +1 -1
- package/lib/core/experimental/frames/network-frame.d.ts +1 -1
- package/lib/core/experimental/frames/websocket-frame.d.mts +1 -1
- package/lib/core/experimental/frames/websocket-frame.d.ts +1 -1
- package/lib/core/experimental/handlers-controller.d.mts +1 -1
- package/lib/core/experimental/handlers-controller.d.ts +1 -1
- package/lib/core/experimental/handlers-controller.js +16 -5
- package/lib/core/experimental/handlers-controller.js.map +1 -1
- package/lib/core/experimental/handlers-controller.mjs +16 -5
- package/lib/core/experimental/handlers-controller.mjs.map +1 -1
- package/lib/core/experimental/index.d.mts +3 -3
- package/lib/core/experimental/index.d.ts +3 -3
- package/lib/core/experimental/index.js +3 -0
- package/lib/core/experimental/index.js.map +1 -1
- package/lib/core/experimental/index.mjs +6 -0
- package/lib/core/experimental/index.mjs.map +1 -1
- package/lib/core/experimental/on-unhandled-frame.d.mts +1 -1
- package/lib/core/experimental/on-unhandled-frame.d.ts +1 -1
- package/lib/core/experimental/setup-api.d.mts +1 -1
- package/lib/core/experimental/setup-api.d.ts +1 -1
- package/lib/core/experimental/sources/interceptor-source.d.mts +1 -1
- package/lib/core/experimental/sources/interceptor-source.d.ts +1 -1
- package/lib/core/experimental/sources/network-source.d.mts +1 -1
- package/lib/core/experimental/sources/network-source.d.ts +1 -1
- package/lib/core/getResponse.d.mts +1 -1
- package/lib/core/getResponse.d.ts +1 -1
- package/lib/core/graphql.d.mts +1 -1
- package/lib/core/graphql.d.ts +1 -1
- package/lib/core/handlers/GraphQLHandler.d.mts +1 -1
- package/lib/core/handlers/GraphQLHandler.d.ts +1 -1
- 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 +22 -1
- package/lib/core/handlers/RequestHandler.js.map +1 -1
- package/lib/core/handlers/RequestHandler.mjs +22 -1
- package/lib/core/handlers/RequestHandler.mjs.map +1 -1
- package/lib/core/handlers/WebSocketHandler.js +1 -1
- package/lib/core/handlers/WebSocketHandler.js.map +1 -1
- package/lib/core/handlers/WebSocketHandler.mjs +1 -1
- package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
- package/lib/core/http.d.mts +1 -1
- package/lib/core/http.d.ts +1 -1
- package/lib/core/index.d.mts +1 -1
- package/lib/core/index.d.ts +1 -1
- package/lib/core/passthrough.d.mts +1 -1
- package/lib/core/passthrough.d.ts +1 -1
- package/lib/core/sse.d.mts +1 -1
- package/lib/core/sse.d.ts +1 -1
- package/lib/core/utils/HttpResponse/decorators.d.mts +3 -3
- package/lib/core/utils/HttpResponse/decorators.d.ts +3 -3
- package/lib/core/utils/HttpResponse/decorators.js +4 -10
- package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
- package/lib/core/utils/HttpResponse/decorators.mjs +4 -10
- package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
- package/lib/core/utils/executeHandlers.d.mts +1 -1
- package/lib/core/utils/executeHandlers.d.ts +1 -1
- package/lib/core/utils/handleRequest.d.mts +1 -1
- package/lib/core/utils/handleRequest.d.ts +1 -1
- package/lib/core/utils/internal/attachSiblingHandlers.d.mts +15 -0
- package/lib/core/utils/internal/attachSiblingHandlers.d.ts +15 -0
- package/lib/core/utils/internal/attachSiblingHandlers.js +44 -0
- package/lib/core/utils/internal/attachSiblingHandlers.js.map +1 -0
- package/lib/core/utils/internal/attachSiblingHandlers.mjs +24 -0
- package/lib/core/utils/internal/attachSiblingHandlers.mjs.map +1 -0
- package/lib/core/utils/internal/isHandlerKind.d.mts +1 -1
- package/lib/core/utils/internal/isHandlerKind.d.ts +1 -1
- package/lib/core/utils/internal/parseGraphQLRequest.d.mts +1 -1
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +1 -1
- package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
- package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
- package/lib/core/utils/request/storeResponseCookies.js +1 -1
- package/lib/core/utils/request/storeResponseCookies.js.map +1 -1
- package/lib/core/utils/request/storeResponseCookies.mjs +2 -2
- package/lib/core/utils/request/storeResponseCookies.mjs.map +1 -1
- package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
- package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
- package/lib/core/ws.d.mts +17 -4
- package/lib/core/ws.d.ts +17 -4
- package/lib/core/ws.js +30 -5
- package/lib/core/ws.js.map +1 -1
- package/lib/core/ws.mjs +34 -6
- package/lib/core/ws.mjs.map +1 -1
- package/lib/iife/index.js +1208 -1142
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +1 -1
- package/lib/node/index.d.mts +1 -1
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.js +2 -0
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +1 -0
- package/package.json +2 -2
- package/src/core/experimental/frames/http-frame.test.ts +6 -1
- package/src/core/experimental/frames/http-frame.ts +6 -2
- package/src/core/experimental/handlers-controller.test.ts +139 -5
- package/src/core/experimental/handlers-controller.ts +24 -9
- package/src/core/experimental/index.ts +6 -0
- package/src/core/handlers/RequestHandler.ts +36 -1
- package/src/core/handlers/WebSocketHandler.ts +1 -1
- package/src/core/utils/HttpResponse/decorators.ts +6 -21
- package/src/core/utils/internal/attachSiblingHandlers.ts +28 -0
- package/src/core/utils/request/storeResponseCookies.ts +2 -4
- package/src/core/ws.ts +65 -6
- package/src/node/index.ts +1 -0
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
141
|
+
webSocketHandler[kEmitter].on(event, listener)
|
|
123
142
|
|
|
124
|
-
return
|
|
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 }
|
package/src/node/index.ts
CHANGED