msw 2.12.13 → 2.13.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.
- package/lib/browser/index.d.mts +29 -19
- package/lib/browser/index.d.ts +29 -19
- package/lib/browser/index.js +1763 -1321
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/index.mjs +1769 -1321
- package/lib/browser/index.mjs.map +1 -1
- package/lib/core/{HttpResponse-Dj6ibgFJ.d.ts → HttpResponse-CksOMVAa.d.ts} +5 -5
- package/lib/core/{HttpResponse-Be4eT3x6.d.mts → HttpResponse-DlRR1D-f.d.mts} +5 -5
- package/lib/core/HttpResponse.d.mts +1 -1
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/experimental/compat.d.mts +17 -0
- package/lib/core/experimental/compat.d.ts +17 -0
- package/lib/core/experimental/compat.js +54 -0
- package/lib/core/experimental/compat.js.map +1 -0
- package/lib/core/experimental/compat.mjs +36 -0
- package/lib/core/experimental/compat.mjs.map +1 -0
- package/lib/core/experimental/define-network.d.mts +75 -0
- package/lib/core/experimental/define-network.d.ts +75 -0
- package/lib/core/experimental/define-network.js +124 -0
- package/lib/core/experimental/define-network.js.map +1 -0
- package/lib/core/experimental/define-network.mjs +107 -0
- package/lib/core/experimental/define-network.mjs.map +1 -0
- package/lib/core/experimental/frames/http-frame.d.mts +77 -0
- package/lib/core/experimental/frames/http-frame.d.ts +77 -0
- package/lib/core/experimental/frames/http-frame.js +194 -0
- package/lib/core/experimental/frames/http-frame.js.map +1 -0
- package/lib/core/experimental/frames/http-frame.mjs +176 -0
- package/lib/core/experimental/frames/http-frame.mjs.map +1 -0
- package/lib/core/experimental/frames/network-frame.d.mts +12 -0
- package/lib/core/experimental/frames/network-frame.d.ts +12 -0
- package/lib/core/{handlers/common.js → experimental/frames/network-frame.js} +19 -3
- package/lib/core/experimental/frames/network-frame.js.map +1 -0
- package/lib/core/experimental/frames/network-frame.mjs +13 -0
- package/lib/core/experimental/frames/network-frame.mjs.map +1 -0
- package/lib/core/experimental/frames/websocket-frame.d.mts +55 -0
- package/lib/core/experimental/frames/websocket-frame.d.ts +55 -0
- package/lib/core/experimental/frames/websocket-frame.js +129 -0
- package/lib/core/experimental/frames/websocket-frame.js.map +1 -0
- package/lib/core/experimental/frames/websocket-frame.mjs +116 -0
- package/lib/core/experimental/frames/websocket-frame.mjs.map +1 -0
- package/lib/core/experimental/handlers-controller.d.mts +35 -0
- package/lib/core/experimental/handlers-controller.d.ts +35 -0
- package/lib/core/experimental/handlers-controller.js +121 -0
- package/lib/core/experimental/handlers-controller.js.map +1 -0
- package/lib/core/experimental/handlers-controller.mjs +101 -0
- package/lib/core/experimental/handlers-controller.mjs.map +1 -0
- package/lib/core/experimental/index.d.mts +17 -0
- package/lib/core/experimental/index.d.ts +17 -0
- package/lib/core/experimental/index.js +36 -0
- package/lib/core/experimental/index.js.map +1 -0
- package/lib/core/experimental/index.mjs +20 -0
- package/lib/core/experimental/index.mjs.map +1 -0
- package/lib/core/experimental/on-unhandled-frame.d.mts +12 -0
- package/lib/core/experimental/on-unhandled-frame.d.ts +12 -0
- package/lib/core/experimental/on-unhandled-frame.js +90 -0
- package/lib/core/experimental/on-unhandled-frame.js.map +1 -0
- package/lib/core/experimental/on-unhandled-frame.mjs +70 -0
- package/lib/core/experimental/on-unhandled-frame.mjs.map +1 -0
- package/lib/core/experimental/request-utils.d.mts +12 -0
- package/lib/core/experimental/request-utils.d.ts +12 -0
- package/lib/core/experimental/request-utils.js +50 -0
- package/lib/core/experimental/request-utils.js.map +1 -0
- package/lib/core/experimental/request-utils.mjs +30 -0
- package/lib/core/experimental/request-utils.mjs.map +1 -0
- package/lib/core/experimental/setup-api.d.mts +33 -0
- package/lib/core/experimental/setup-api.d.ts +33 -0
- package/lib/core/experimental/setup-api.js +61 -0
- package/lib/core/experimental/setup-api.js.map +1 -0
- package/lib/core/experimental/setup-api.mjs +43 -0
- package/lib/core/experimental/setup-api.mjs.map +1 -0
- package/lib/core/experimental/sources/interceptor-source.d.mts +28 -0
- package/lib/core/experimental/sources/interceptor-source.d.ts +28 -0
- package/lib/core/experimental/sources/interceptor-source.js +142 -0
- package/lib/core/experimental/sources/interceptor-source.js.map +1 -0
- package/lib/core/experimental/sources/interceptor-source.mjs +124 -0
- package/lib/core/experimental/sources/interceptor-source.mjs.map +1 -0
- package/lib/core/experimental/sources/network-source.d.mts +31 -0
- package/lib/core/experimental/sources/network-source.d.ts +31 -0
- package/lib/core/experimental/sources/network-source.js +50 -0
- package/lib/core/experimental/sources/network-source.js.map +1 -0
- package/lib/core/experimental/sources/network-source.mjs +30 -0
- package/lib/core/experimental/sources/network-source.mjs.map +1 -0
- 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 +5 -6
- package/lib/core/handlers/RequestHandler.js.map +1 -1
- package/lib/core/handlers/RequestHandler.mjs +5 -6
- package/lib/core/handlers/RequestHandler.mjs.map +1 -1
- package/lib/core/handlers/WebSocketHandler.d.mts +8 -4
- package/lib/core/handlers/WebSocketHandler.d.ts +8 -4
- package/lib/core/handlers/WebSocketHandler.js +18 -5
- package/lib/core/handlers/WebSocketHandler.js.map +1 -1
- package/lib/core/handlers/WebSocketHandler.mjs +18 -5
- 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 +7 -12
- package/lib/core/index.d.ts +7 -12
- package/lib/core/index.js +2 -2
- package/lib/core/index.js.map +1 -1
- package/lib/core/index.mjs +1 -1
- package/lib/core/index.mjs.map +1 -1
- package/lib/core/network-frame-B7A0ggXE.d.mts +56 -0
- package/lib/core/network-frame-usYiHS0K.d.ts +56 -0
- package/lib/core/passthrough.d.mts +1 -1
- package/lib/core/passthrough.d.ts +1 -1
- package/lib/core/sharedOptions.d.mts +6 -2
- package/lib/core/sharedOptions.d.ts +6 -2
- package/lib/core/sharedOptions.js.map +1 -1
- package/lib/core/sse.d.mts +1 -1
- package/lib/core/sse.d.ts +1 -1
- package/lib/core/sse.js.map +1 -1
- package/lib/core/sse.mjs.map +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/cookieStore.js.map +1 -1
- package/lib/core/utils/cookieStore.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 +2 -1
- package/lib/core/utils/handleRequest.d.ts +2 -1
- package/lib/core/utils/internal/isHandlerKind.d.mts +3 -3
- package/lib/core/utils/internal/isHandlerKind.d.ts +3 -3
- package/lib/core/utils/internal/isHandlerKind.js +2 -1
- package/lib/core/utils/internal/isHandlerKind.js.map +1 -1
- package/lib/core/utils/internal/isHandlerKind.mjs +2 -1
- package/lib/core/utils/internal/isHandlerKind.mjs.map +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/internal/requestHandlerUtils.d.mts +1 -1
- package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
- package/lib/core/utils/matching/matchRequestUrl.js +1 -1
- package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
- package/lib/core/utils/matching/matchRequestUrl.mjs +1 -1
- package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
- package/lib/core/utils/request/onUnhandledRequest.d.mts +2 -2
- package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
- package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
- package/lib/core/utils/request/onUnhandledRequest.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/handleWebSocketEvent.js +1 -1
- package/lib/core/ws/handleWebSocketEvent.js.map +1 -1
- package/lib/core/ws/handleWebSocketEvent.mjs +1 -1
- package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -1
- package/lib/core/ws/utils/attachWebSocketLogger.d.mts +1 -1
- package/lib/core/ws/utils/attachWebSocketLogger.d.ts +1 -1
- package/lib/core/ws/utils/attachWebSocketLogger.js +39 -10
- package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
- package/lib/core/ws/utils/attachWebSocketLogger.mjs +39 -10
- package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
- package/lib/core/ws.d.mts +3 -3
- package/lib/core/ws.d.ts +3 -3
- package/lib/core/ws.js.map +1 -1
- package/lib/core/ws.mjs.map +1 -1
- package/lib/iife/index.js +2022 -1433
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +1 -1
- package/lib/native/index.d.mts +21 -29
- package/lib/native/index.d.ts +21 -29
- package/lib/native/index.js +48 -116
- package/lib/native/index.js.map +1 -1
- package/lib/native/index.mjs +51 -118
- package/lib/native/index.mjs.map +1 -1
- package/lib/node/index.d.mts +55 -33
- package/lib/node/index.d.ts +55 -33
- package/lib/node/index.js +152 -154
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +156 -156
- package/lib/node/index.mjs.map +1 -1
- package/package.json +10 -2
- package/src/browser/{setupWorker/glossary.ts → glossary.ts} +16 -33
- package/src/browser/index.ts +2 -3
- package/src/browser/{setupWorker/setupWorker.node.test.ts → setup-worker.node.test.ts} +2 -4
- package/src/browser/setup-worker.ts +148 -0
- package/src/browser/sources/fallback-http-source.ts +56 -0
- package/src/browser/sources/service-worker-source.ts +455 -0
- package/src/browser/tsconfig.browser.json +7 -2
- package/src/browser/utils/deserializeRequest.ts +1 -1
- package/src/browser/{setupWorker/start/utils/getWorkerByRegistration.ts → utils/get-worker-by-registration.ts} +3 -1
- package/src/browser/{setupWorker/start/utils/getWorkerInstance.ts → utils/get-worker-instance.ts} +4 -4
- package/src/browser/utils/pruneGetRequestBody.test.ts +1 -3
- package/src/browser/utils/pruneGetRequestBody.ts +1 -1
- package/src/browser/utils/validate-worker-scope.ts +19 -0
- package/src/browser/utils/workerChannel.ts +2 -2
- package/src/core/experimental/compat.ts +50 -0
- package/src/core/experimental/define-network.test.ts +124 -0
- package/src/core/experimental/define-network.ts +215 -0
- package/src/core/experimental/frames/http-frame.test.ts +360 -0
- package/src/core/experimental/frames/http-frame.ts +271 -0
- package/src/core/experimental/frames/network-frame.ts +64 -0
- package/src/core/experimental/frames/websocket-frame.test.ts +280 -0
- package/src/core/experimental/frames/websocket-frame.ts +188 -0
- package/src/core/experimental/handlers-controller.test.ts +198 -0
- package/src/core/experimental/handlers-controller.ts +145 -0
- package/src/core/experimental/index.ts +16 -0
- package/src/core/experimental/on-unhandled-frame.test.ts +360 -0
- package/src/core/experimental/on-unhandled-frame.ts +110 -0
- package/src/core/experimental/request-utils.test.ts +70 -0
- package/src/core/experimental/request-utils.ts +39 -0
- package/src/core/experimental/setup-api.ts +59 -0
- package/src/core/experimental/sources/interceptor-source.ts +185 -0
- package/src/core/experimental/sources/network-source.test.ts +74 -0
- package/src/core/experimental/sources/network-source.ts +56 -0
- package/src/core/handlers/RequestHandler.ts +9 -10
- package/src/core/handlers/WebSocketHandler.ts +27 -11
- package/src/core/index.ts +3 -7
- package/src/core/sharedOptions.ts +9 -4
- package/src/core/sse.ts +1 -1
- package/src/core/utils/cookieStore.ts +2 -1
- package/src/core/utils/internal/isHandlerKind.test.ts +20 -22
- package/src/core/utils/internal/isHandlerKind.ts +5 -9
- package/src/core/utils/matching/matchRequestUrl.test.ts +87 -3
- package/src/core/utils/matching/matchRequestUrl.ts +2 -2
- package/src/core/utils/request/onUnhandledRequest.ts +2 -2
- package/src/core/ws/WebSocketClientManager.test.ts +2 -10
- package/src/core/ws/handleWebSocketEvent.ts +5 -1
- package/src/core/ws/utils/attachWebSocketLogger.ts +43 -11
- package/src/core/ws.test.ts +1 -3
- package/src/core/ws.ts +6 -6
- package/src/iife/index.ts +1 -1
- package/src/native/index.ts +34 -11
- package/src/node/async-handlers-controller.test.ts +50 -0
- package/src/node/async-handlers-controller.ts +69 -0
- package/src/node/glossary.ts +19 -18
- package/src/node/index.ts +6 -2
- package/src/node/setup-server-common.ts +100 -0
- package/src/node/setup-server.ts +91 -0
- package/src/tsconfig.core.json +8 -0
- package/src/tsconfig.node.json +8 -3
- package/src/tsconfig.src.json +0 -2
- package/src/tsconfig.worker.json +2 -1
- package/lib/core/SetupApi.d.mts +0 -44
- package/lib/core/SetupApi.d.ts +0 -44
- package/lib/core/SetupApi.js +0 -112
- package/lib/core/SetupApi.js.map +0 -1
- package/lib/core/SetupApi.mjs +0 -92
- package/lib/core/SetupApi.mjs.map +0 -1
- package/lib/core/handlers/common.d.mts +0 -3
- package/lib/core/handlers/common.d.ts +0 -3
- package/lib/core/handlers/common.js.map +0 -1
- package/lib/core/handlers/common.mjs +0 -1
- package/lib/core/handlers/common.mjs.map +0 -1
- package/src/browser/setupWorker/setupWorker.ts +0 -184
- package/src/browser/setupWorker/start/createFallbackRequestListener.ts +0 -71
- package/src/browser/setupWorker/start/createRequestListener.ts +0 -138
- package/src/browser/setupWorker/start/createResponseListener.ts +0 -57
- package/src/browser/setupWorker/start/createStartHandler.ts +0 -137
- package/src/browser/setupWorker/start/utils/enableMocking.ts +0 -30
- package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +0 -59
- package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +0 -44
- package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +0 -84
- package/src/browser/setupWorker/start/utils/printStartMessage.ts +0 -51
- package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +0 -18
- package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +0 -26
- package/src/browser/setupWorker/stop/utils/printStopMessage.ts +0 -13
- package/src/browser/utils/checkWorkerIntegrity.ts +0 -42
- package/src/core/SetupApi.ts +0 -127
- package/src/core/handlers/common.ts +0 -1
- package/src/node/SetupServerApi.ts +0 -87
- package/src/node/SetupServerCommonApi.ts +0 -169
- package/src/node/setupServer.ts +0 -15
|
@@ -5,14 +5,12 @@ import { WebSocketHandler } from '../../handlers/WebSocketHandler'
|
|
|
5
5
|
import { isHandlerKind } from './isHandlerKind'
|
|
6
6
|
|
|
7
7
|
it('returns true if expected a request handler and given a request handler', () => {
|
|
8
|
-
expect(
|
|
9
|
-
|
|
10
|
-
)
|
|
8
|
+
expect(isHandlerKind('request')(new HttpHandler('*', '*', () => {}))).toBe(
|
|
9
|
+
true,
|
|
10
|
+
)
|
|
11
11
|
|
|
12
12
|
expect(
|
|
13
|
-
isHandlerKind('
|
|
14
|
-
new GraphQLHandler('all', '*', '*', () => {}),
|
|
15
|
-
),
|
|
13
|
+
isHandlerKind('request')(new GraphQLHandler('all', '*', '*', () => {})),
|
|
16
14
|
).toBe(true)
|
|
17
15
|
})
|
|
18
16
|
|
|
@@ -25,24 +23,24 @@ it('returns true if expected a request handler and given a custom request handle
|
|
|
25
23
|
log() {}
|
|
26
24
|
}
|
|
27
25
|
|
|
28
|
-
expect(isHandlerKind('
|
|
26
|
+
expect(isHandlerKind('request')(new MyHandler())).toBe(true)
|
|
29
27
|
})
|
|
30
28
|
|
|
31
29
|
it('returns false if expected a request handler but given event handler', () => {
|
|
32
|
-
expect(isHandlerKind('
|
|
30
|
+
expect(isHandlerKind('request')(new WebSocketHandler('*'))).toBe(false)
|
|
33
31
|
})
|
|
34
32
|
|
|
35
33
|
it('returns false if expected a request handler but given arbitrary object', () => {
|
|
36
|
-
expect(isHandlerKind('
|
|
37
|
-
expect(isHandlerKind('
|
|
38
|
-
expect(isHandlerKind('
|
|
39
|
-
expect(isHandlerKind('
|
|
40
|
-
expect(isHandlerKind('
|
|
41
|
-
expect(isHandlerKind('
|
|
34
|
+
expect(isHandlerKind('request')(undefined)).toBe(false)
|
|
35
|
+
expect(isHandlerKind('request')(null)).toBe(false)
|
|
36
|
+
expect(isHandlerKind('request')({})).toBe(false)
|
|
37
|
+
expect(isHandlerKind('request')([])).toBe(false)
|
|
38
|
+
expect(isHandlerKind('request')(123)).toBe(false)
|
|
39
|
+
expect(isHandlerKind('request')('hello')).toBe(false)
|
|
42
40
|
})
|
|
43
41
|
|
|
44
42
|
it('returns true if expected an event handler and given an event handler', () => {
|
|
45
|
-
expect(isHandlerKind('
|
|
43
|
+
expect(isHandlerKind('websocket')(new WebSocketHandler('*'))).toBe(true)
|
|
46
44
|
})
|
|
47
45
|
|
|
48
46
|
it('returns true if expected an event handler and given a custom event handler', () => {
|
|
@@ -51,14 +49,14 @@ it('returns true if expected an event handler and given a custom event handler',
|
|
|
51
49
|
super('*')
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
|
-
expect(isHandlerKind('
|
|
52
|
+
expect(isHandlerKind('websocket')(new MyEventHandler())).toBe(true)
|
|
55
53
|
})
|
|
56
54
|
|
|
57
55
|
it('returns false if expected an event handler but given arbitrary object', () => {
|
|
58
|
-
expect(isHandlerKind('
|
|
59
|
-
expect(isHandlerKind('
|
|
60
|
-
expect(isHandlerKind('
|
|
61
|
-
expect(isHandlerKind('
|
|
62
|
-
expect(isHandlerKind('
|
|
63
|
-
expect(isHandlerKind('
|
|
56
|
+
expect(isHandlerKind('websocket')(undefined)).toBe(false)
|
|
57
|
+
expect(isHandlerKind('websocket')(null)).toBe(false)
|
|
58
|
+
expect(isHandlerKind('websocket')({})).toBe(false)
|
|
59
|
+
expect(isHandlerKind('websocket')([])).toBe(false)
|
|
60
|
+
expect(isHandlerKind('websocket')(123)).toBe(false)
|
|
61
|
+
expect(isHandlerKind('websocket')('hello')).toBe(false)
|
|
64
62
|
})
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AnyHandler } from '../../experimental/handlers-controller'
|
|
2
2
|
import type { RequestHandler } from '../../handlers/RequestHandler'
|
|
3
3
|
import type { WebSocketHandler } from '../../handlers/WebSocketHandler'
|
|
4
|
+
import { isObject } from './isObject'
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* A filter function that ensures that the provided argument
|
|
7
8
|
* is a handler of the given kind. This helps differentiate
|
|
8
9
|
* between different kinds of handlers, e.g. request and event handlers.
|
|
9
10
|
*/
|
|
10
|
-
export function isHandlerKind<K extends
|
|
11
|
+
export function isHandlerKind<K extends AnyHandler['kind']>(kind: K) {
|
|
11
12
|
return (
|
|
12
13
|
input: unknown,
|
|
13
|
-
): input is K extends '
|
|
14
|
-
return (
|
|
15
|
-
input != null &&
|
|
16
|
-
typeof input === 'object' &&
|
|
17
|
-
'__kind' in input &&
|
|
18
|
-
input.__kind === kind
|
|
19
|
-
)
|
|
14
|
+
): input is K extends 'websocket' ? WebSocketHandler : RequestHandler => {
|
|
15
|
+
return isObject(input) && 'kind' in input && input.kind === kind
|
|
20
16
|
}
|
|
21
17
|
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @vitest-environment jsdom
|
|
3
|
-
*/
|
|
1
|
+
// @vitest-environment jsdom
|
|
4
2
|
import { coercePath, matchRequestUrl } from './matchRequestUrl'
|
|
5
3
|
|
|
6
4
|
describe('matchRequestUrl', () => {
|
|
@@ -87,6 +85,77 @@ describe('matchRequestUrl', () => {
|
|
|
87
85
|
})
|
|
88
86
|
})
|
|
89
87
|
|
|
88
|
+
test('returns true when matching URLs with wildcard ports', () => {
|
|
89
|
+
expect
|
|
90
|
+
.soft(
|
|
91
|
+
matchRequestUrl(new URL('http://localhost:3000'), 'http://localhost:*'),
|
|
92
|
+
)
|
|
93
|
+
.toEqual({
|
|
94
|
+
matches: true,
|
|
95
|
+
params: {
|
|
96
|
+
'0': '3000/',
|
|
97
|
+
},
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
expect
|
|
101
|
+
.soft(
|
|
102
|
+
matchRequestUrl(
|
|
103
|
+
new URL('http://localhost:3000'),
|
|
104
|
+
'http://localhost:*/',
|
|
105
|
+
),
|
|
106
|
+
)
|
|
107
|
+
.toEqual({
|
|
108
|
+
matches: true,
|
|
109
|
+
params: {
|
|
110
|
+
'0': '3000',
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
test('returns true when matching URLs with wildcard ports and pathnames', () => {
|
|
116
|
+
expect(
|
|
117
|
+
matchRequestUrl(
|
|
118
|
+
new URL('http://localhost:3000/resource'),
|
|
119
|
+
'http://localhost:*/resource',
|
|
120
|
+
),
|
|
121
|
+
).toEqual({
|
|
122
|
+
matches: true,
|
|
123
|
+
params: {
|
|
124
|
+
'0': '3000',
|
|
125
|
+
},
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
test('matches wildcard ports with other wildcard parameters', () => {
|
|
130
|
+
expect(
|
|
131
|
+
matchRequestUrl(
|
|
132
|
+
new URL('http://subdomain.localhost:3000/user/settings'),
|
|
133
|
+
'http://*.localhost:*/user/*',
|
|
134
|
+
),
|
|
135
|
+
).toEqual({
|
|
136
|
+
matches: true,
|
|
137
|
+
params: {
|
|
138
|
+
'0': 'subdomain',
|
|
139
|
+
'1': '3000',
|
|
140
|
+
'2': 'settings',
|
|
141
|
+
},
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test('matches wildcard ports that also match a part of the pathname', () => {
|
|
146
|
+
expect(
|
|
147
|
+
matchRequestUrl(
|
|
148
|
+
new URL('http://localhost:3000/user/settings'),
|
|
149
|
+
'http://localhost:*/settings',
|
|
150
|
+
),
|
|
151
|
+
).toEqual({
|
|
152
|
+
matches: true,
|
|
153
|
+
params: {
|
|
154
|
+
'0': '3000/user',
|
|
155
|
+
},
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
|
|
90
159
|
test('returns true for matching WebSocket URL', () => {
|
|
91
160
|
expect(
|
|
92
161
|
matchRequestUrl(new URL('ws://test.mswjs.io'), 'ws://test.mswjs.io'),
|
|
@@ -130,6 +199,17 @@ describe('matchRequestUrl', () => {
|
|
|
130
199
|
},
|
|
131
200
|
})
|
|
132
201
|
})
|
|
202
|
+
|
|
203
|
+
test('returns true for matching WebSocket URLs with wildcard ports', () => {
|
|
204
|
+
expect(
|
|
205
|
+
matchRequestUrl(new URL('ws://localhost:3000'), 'ws://localhost:*'),
|
|
206
|
+
).toEqual({
|
|
207
|
+
matches: true,
|
|
208
|
+
params: {
|
|
209
|
+
'0': '3000/',
|
|
210
|
+
},
|
|
211
|
+
})
|
|
212
|
+
})
|
|
133
213
|
})
|
|
134
214
|
|
|
135
215
|
describe('coercePath', () => {
|
|
@@ -156,6 +236,10 @@ describe('coercePath', () => {
|
|
|
156
236
|
expect(coercePath('https://example.com:8080/:5678')).toEqual(
|
|
157
237
|
'https\\://example.com\\:8080/:5678',
|
|
158
238
|
)
|
|
239
|
+
expect(coercePath('http://localhost:*')).toEqual(
|
|
240
|
+
'http\\://localhost\\:(.*)',
|
|
241
|
+
)
|
|
242
|
+
expect(coercePath('ws://localhost:*')).toEqual('ws\\://localhost\\:(.*)')
|
|
159
243
|
})
|
|
160
244
|
|
|
161
245
|
test('replaces wildcard with an unnnamed capturing group', () => {
|
|
@@ -40,9 +40,9 @@ export function coercePath(path: string): string {
|
|
|
40
40
|
)
|
|
41
41
|
/**
|
|
42
42
|
* Escape the port so that "path-to-regexp" can match
|
|
43
|
-
* absolute URLs
|
|
43
|
+
* absolute URLs with numeric or wildcard ports.
|
|
44
44
|
*/
|
|
45
|
-
.replace(/([^/])(:)(
|
|
45
|
+
.replace(/([^/])(:)(?=(?:\d+|\(\.\*\))(?=\/|$))/, '$1\\$2')
|
|
46
46
|
/**
|
|
47
47
|
* Escape the protocol so that "path-to-regexp" could match
|
|
48
48
|
* absolute URL.
|
|
@@ -3,8 +3,8 @@ import { InternalError, devUtils } from '../internal/devUtils'
|
|
|
3
3
|
import { isCommonAssetRequest } from '../../isCommonAssetRequest'
|
|
4
4
|
|
|
5
5
|
export interface UnhandledRequestPrint {
|
|
6
|
-
warning()
|
|
7
|
-
error()
|
|
6
|
+
warning: () => void
|
|
7
|
+
error: () => void
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export type UnhandledRequestCallback = (
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
// @vitest-environment node-websocket
|
|
2
2
|
import { setMaxListeners } from 'node:events'
|
|
3
|
-
import {
|
|
4
|
-
WebSocketClientConnection,
|
|
5
|
-
WebSocketData,
|
|
6
|
-
WebSocketTransport,
|
|
7
|
-
} from '@mswjs/interceptors/WebSocket'
|
|
3
|
+
import { WebSocketClientConnection } from '@mswjs/interceptors/WebSocket'
|
|
8
4
|
import {
|
|
9
5
|
WebSocketClientManager,
|
|
10
6
|
WebSocketBroadcastChannelMessage,
|
|
11
7
|
} from './WebSocketClientManager'
|
|
8
|
+
import { TestWebSocketTransport } from '../../../test/support/ws-test-utils'
|
|
12
9
|
|
|
13
10
|
const channel = new BroadcastChannel('test:channel')
|
|
14
11
|
|
|
@@ -23,11 +20,6 @@ vi.spyOn(channel, 'postMessage')
|
|
|
23
20
|
|
|
24
21
|
const socket = new WebSocket('ws://localhost')
|
|
25
22
|
|
|
26
|
-
class TestWebSocketTransport extends EventTarget implements WebSocketTransport {
|
|
27
|
-
send(_data: WebSocketData): void {}
|
|
28
|
-
close(_code?: number | undefined, _reason?: string | undefined): void {}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
23
|
afterEach(() => {
|
|
32
24
|
vi.resetAllMocks()
|
|
33
25
|
})
|
|
@@ -17,7 +17,11 @@ interface HandleWebSocketEventOptions {
|
|
|
17
17
|
|
|
18
18
|
export function handleWebSocketEvent(options: HandleWebSocketEventOptions) {
|
|
19
19
|
webSocketInterceptor.on('connection', async (connection) => {
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* @todo @fixme Reference the handlers controller here and use `.getHandlersByKind`.
|
|
22
|
+
* That one relies on the pre-grouped handlers map and will be more performant.
|
|
23
|
+
*/
|
|
24
|
+
const handlers = options.getHandlers().filter(isHandlerKind('websocket'))
|
|
21
25
|
|
|
22
26
|
// Ignore this connection if the user hasn't defined any handlers.
|
|
23
27
|
if (handlers.length > 0) {
|
|
@@ -18,8 +18,9 @@ export const colors = {
|
|
|
18
18
|
|
|
19
19
|
export function attachWebSocketLogger(
|
|
20
20
|
connection: WebSocketConnectionData,
|
|
21
|
-
): void {
|
|
21
|
+
): () => void {
|
|
22
22
|
const { client, server } = connection
|
|
23
|
+
const controller = new AbortController()
|
|
23
24
|
|
|
24
25
|
logConnectionOpen(client)
|
|
25
26
|
|
|
@@ -30,19 +31,32 @@ export function attachWebSocketLogger(
|
|
|
30
31
|
* @todo Provide the reference to the exact event handler
|
|
31
32
|
* that called this `client.send()`.
|
|
32
33
|
*/
|
|
33
|
-
client.addEventListener(
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
client.addEventListener(
|
|
35
|
+
'message',
|
|
36
|
+
(event) => {
|
|
37
|
+
logOutgoingClientMessage(event)
|
|
38
|
+
},
|
|
39
|
+
{ signal: controller.signal },
|
|
40
|
+
)
|
|
36
41
|
|
|
37
|
-
client.addEventListener(
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
client.addEventListener(
|
|
43
|
+
'close',
|
|
44
|
+
(event) => {
|
|
45
|
+
logConnectionClose(event)
|
|
46
|
+
},
|
|
47
|
+
{ signal: controller.signal },
|
|
48
|
+
)
|
|
40
49
|
|
|
41
50
|
// Log client errors (connection closures due to errors).
|
|
42
|
-
client.socket.addEventListener(
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
client.socket.addEventListener(
|
|
52
|
+
'error',
|
|
53
|
+
(event) => {
|
|
54
|
+
logClientError(event)
|
|
55
|
+
},
|
|
56
|
+
{ signal: controller.signal },
|
|
57
|
+
)
|
|
45
58
|
|
|
59
|
+
const { send: originalClientSend } = client
|
|
46
60
|
client.send = new Proxy(client.send, {
|
|
47
61
|
apply(target, thisArg, args) {
|
|
48
62
|
const [data] = args
|
|
@@ -75,11 +89,15 @@ export function attachWebSocketLogger(
|
|
|
75
89
|
logIncomingServerMessage(event)
|
|
76
90
|
})
|
|
77
91
|
},
|
|
78
|
-
{
|
|
92
|
+
{
|
|
93
|
+
once: true,
|
|
94
|
+
signal: controller.signal,
|
|
95
|
+
},
|
|
79
96
|
)
|
|
80
97
|
|
|
81
98
|
// Log outgoing client events initiated by the event handler.
|
|
82
99
|
// The actual client never sent these but the handler did.
|
|
100
|
+
const { send: originalServerSend } = server
|
|
83
101
|
server.send = new Proxy(server.send, {
|
|
84
102
|
apply(target, thisArg, args) {
|
|
85
103
|
const [data] = args
|
|
@@ -102,6 +120,20 @@ export function attachWebSocketLogger(
|
|
|
102
120
|
return Reflect.apply(target, thisArg, args)
|
|
103
121
|
},
|
|
104
122
|
})
|
|
123
|
+
|
|
124
|
+
// Undo method proxies.
|
|
125
|
+
controller.signal.addEventListener(
|
|
126
|
+
'abort',
|
|
127
|
+
() => {
|
|
128
|
+
client.send = originalClientSend
|
|
129
|
+
server.send = originalServerSend
|
|
130
|
+
},
|
|
131
|
+
{ once: true },
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
return () => {
|
|
135
|
+
controller.abort()
|
|
136
|
+
}
|
|
105
137
|
}
|
|
106
138
|
|
|
107
139
|
/**
|
package/src/core/ws.test.ts
CHANGED
package/src/core/ws.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
type WebSocketHandlerEventMap,
|
|
10
10
|
} from './handlers/WebSocketHandler'
|
|
11
11
|
import { hasRefCounted } from './utils/internal/hasRefCounted'
|
|
12
|
-
import { Path, isPath } from './utils/matching/matchRequestUrl'
|
|
12
|
+
import { type Path, isPath } from './utils/matching/matchRequestUrl'
|
|
13
13
|
import { WebSocketClientManager } from './ws/WebSocketClientManager'
|
|
14
14
|
|
|
15
15
|
const webSocketChannel = new BroadcastChannel('msw:websocket-client-manager')
|
|
@@ -42,10 +42,10 @@ export type WebSocketLink = {
|
|
|
42
42
|
*
|
|
43
43
|
* @see {@link https://mswjs.io/docs/api/ws#onevent-listener `on()` API reference}
|
|
44
44
|
*/
|
|
45
|
-
addEventListener<EventType extends keyof WebSocketHandlerEventMap>(
|
|
45
|
+
addEventListener: <EventType extends keyof WebSocketHandlerEventMap>(
|
|
46
46
|
event: EventType,
|
|
47
47
|
listener: WebSocketEventListener<EventType>,
|
|
48
|
-
)
|
|
48
|
+
) => WebSocketHandler
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Broadcasts the given data to all WebSocket clients.
|
|
@@ -58,7 +58,7 @@ export type WebSocketLink = {
|
|
|
58
58
|
*
|
|
59
59
|
* @see {@link https://mswjs.io/docs/api/ws#broadcastdata `broadcast()` API reference}
|
|
60
60
|
*/
|
|
61
|
-
broadcast(data: WebSocketData)
|
|
61
|
+
broadcast: (data: WebSocketData) => void
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Broadcasts the given data to all WebSocket clients
|
|
@@ -72,12 +72,12 @@ export type WebSocketLink = {
|
|
|
72
72
|
*
|
|
73
73
|
* @see {@link https://mswjs.io/docs/api/ws#broadcastexceptclients-data `broadcast()` API reference}
|
|
74
74
|
*/
|
|
75
|
-
broadcastExcept(
|
|
75
|
+
broadcastExcept: (
|
|
76
76
|
clients:
|
|
77
77
|
| WebSocketClientConnectionProtocol
|
|
78
78
|
| Array<WebSocketClientConnectionProtocol>,
|
|
79
79
|
data: WebSocketData,
|
|
80
|
-
)
|
|
80
|
+
) => void
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
/**
|
package/src/iife/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from '
|
|
1
|
+
export * from '#core'
|
|
2
2
|
export * from '../browser'
|
package/src/native/index.ts
CHANGED
|
@@ -1,21 +1,44 @@
|
|
|
1
|
+
import type { Interceptor } from '@mswjs/interceptors'
|
|
1
2
|
import { FetchInterceptor } from '@mswjs/interceptors/fetch'
|
|
2
3
|
import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
|
|
3
|
-
import type
|
|
4
|
-
import {
|
|
4
|
+
import { type AnyHandler } from '#core/experimental/handlers-controller'
|
|
5
|
+
import {
|
|
6
|
+
defineNetwork,
|
|
7
|
+
DefineNetworkOptions,
|
|
8
|
+
} from '#core/experimental/define-network'
|
|
9
|
+
import { InterceptorSource } from '#core/experimental/sources/interceptor-source'
|
|
10
|
+
import { type SetupServerCommon } from '../node/glossary'
|
|
11
|
+
import { defineSetupServerApi } from '../node/setup-server-common'
|
|
12
|
+
|
|
13
|
+
const defaultInterceptors: Array<Interceptor<any>> = [
|
|
14
|
+
new FetchInterceptor(),
|
|
15
|
+
new XMLHttpRequestInterceptor(),
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
export const defaultNetworkOptions: DefineNetworkOptions<[InterceptorSource]> =
|
|
19
|
+
{
|
|
20
|
+
sources: [
|
|
21
|
+
new InterceptorSource({
|
|
22
|
+
interceptors: defaultInterceptors,
|
|
23
|
+
}),
|
|
24
|
+
],
|
|
25
|
+
onUnhandledFrame: 'warn',
|
|
26
|
+
context: {
|
|
27
|
+
quiet: true,
|
|
28
|
+
},
|
|
29
|
+
}
|
|
5
30
|
|
|
6
31
|
/**
|
|
7
32
|
* Sets up a requests interception in React Native with the given request handlers.
|
|
8
|
-
* @param {
|
|
33
|
+
* @param {Array<AnyHandler>} handlers List of request handlers.
|
|
9
34
|
*
|
|
10
35
|
* @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference}
|
|
11
36
|
*/
|
|
12
|
-
export function setupServer(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// Provision request interception via patching the `XMLHttpRequest` class only
|
|
16
|
-
// in React Native. There is no `http`/`https` modules in that environment.
|
|
17
|
-
return new SetupServerCommonApi(
|
|
18
|
-
[new FetchInterceptor(), new XMLHttpRequestInterceptor()],
|
|
37
|
+
export function setupServer(...handlers: Array<AnyHandler>): SetupServerCommon {
|
|
38
|
+
const network = defineNetwork({
|
|
39
|
+
...defaultNetworkOptions,
|
|
19
40
|
handlers,
|
|
20
|
-
)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
return defineSetupServerApi(network)
|
|
21
44
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { http } from '../core/http'
|
|
2
|
+
import { AsyncHandlersController } from './async-handlers-controller'
|
|
3
|
+
|
|
4
|
+
it('respects initial handlers in the boundary', () => {
|
|
5
|
+
{
|
|
6
|
+
const controller = new AsyncHandlersController([])
|
|
7
|
+
controller.boundary(() => {
|
|
8
|
+
expect(controller.currentHandlers()).toEqual([])
|
|
9
|
+
})()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
{
|
|
13
|
+
const initialHandlers = [http.get('/', () => {})]
|
|
14
|
+
const controller = new AsyncHandlersController(initialHandlers)
|
|
15
|
+
controller.boundary(() => {
|
|
16
|
+
expect(controller.currentHandlers()).toEqual(initialHandlers)
|
|
17
|
+
})()
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('provides boundary-specific overrides', () => {
|
|
22
|
+
const initialHandlers = [http.get('/one', () => {})]
|
|
23
|
+
const controller = new AsyncHandlersController(initialHandlers)
|
|
24
|
+
|
|
25
|
+
controller.boundary(() => {
|
|
26
|
+
const runtimeHandlers = [http.get('/two', () => {})]
|
|
27
|
+
controller.use(runtimeHandlers)
|
|
28
|
+
expect(controller.currentHandlers()).toEqual([
|
|
29
|
+
...runtimeHandlers,
|
|
30
|
+
...initialHandlers,
|
|
31
|
+
])
|
|
32
|
+
})()
|
|
33
|
+
|
|
34
|
+
expect(controller.currentHandlers()).toEqual(initialHandlers)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('resets the handlers in the boundary', () => {
|
|
38
|
+
const initialHandlers = [http.get('/one', () => {})]
|
|
39
|
+
const controller = new AsyncHandlersController(initialHandlers)
|
|
40
|
+
|
|
41
|
+
controller.boundary(() => {
|
|
42
|
+
const runtimeHandlers = [http.get('/two', () => {})]
|
|
43
|
+
controller.use(runtimeHandlers)
|
|
44
|
+
controller.reset([])
|
|
45
|
+
|
|
46
|
+
expect(controller.currentHandlers()).toEqual(initialHandlers)
|
|
47
|
+
})()
|
|
48
|
+
|
|
49
|
+
expect(controller.currentHandlers()).toEqual(initialHandlers)
|
|
50
|
+
})
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
2
|
+
import {
|
|
3
|
+
type AnyHandler,
|
|
4
|
+
type HandlersMap,
|
|
5
|
+
HandlersController,
|
|
6
|
+
HandlersControllerState,
|
|
7
|
+
} from '#core/experimental/handlers-controller'
|
|
8
|
+
|
|
9
|
+
export interface AsyncHandlersControllerContext {
|
|
10
|
+
initialHandlers: HandlersMap
|
|
11
|
+
handlers: HandlersMap
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class AsyncHandlersController extends HandlersController {
|
|
15
|
+
#asyncContext: AsyncLocalStorage<AsyncHandlersControllerContext>
|
|
16
|
+
#fallbackContext: AsyncHandlersControllerContext
|
|
17
|
+
|
|
18
|
+
constructor(initialHandlers: Array<AnyHandler>) {
|
|
19
|
+
super()
|
|
20
|
+
|
|
21
|
+
const initialState = this.getInitialState(initialHandlers)
|
|
22
|
+
|
|
23
|
+
this.#asyncContext = new AsyncLocalStorage()
|
|
24
|
+
this.#fallbackContext = {
|
|
25
|
+
initialHandlers: initialState.initialHandlers,
|
|
26
|
+
handlers: initialState.handlers,
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected getState() {
|
|
31
|
+
const { initialHandlers, handlers } = this.#getContext()
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
initialHandlers,
|
|
35
|
+
handlers,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
protected setState(nextState: HandlersControllerState): void {
|
|
40
|
+
const context = this.#getContext()
|
|
41
|
+
|
|
42
|
+
if (nextState.initialHandlers) {
|
|
43
|
+
context.initialHandlers = nextState.initialHandlers
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (nextState.handlers) {
|
|
47
|
+
context.handlers = nextState.handlers
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public boundary<Args extends Array<any>, R>(callback: (...args: Args) => R) {
|
|
52
|
+
return (...args: Args) => {
|
|
53
|
+
const initialHandlers = { ...this.getState().handlers }
|
|
54
|
+
|
|
55
|
+
return this.#asyncContext.run(
|
|
56
|
+
{
|
|
57
|
+
initialHandlers,
|
|
58
|
+
handlers: { ...initialHandlers },
|
|
59
|
+
},
|
|
60
|
+
callback,
|
|
61
|
+
...args,
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#getContext() {
|
|
67
|
+
return this.#asyncContext.getStore() || this.#fallbackContext
|
|
68
|
+
}
|
|
69
|
+
}
|