msw 2.3.0-ws.rc-1 → 2.3.0-ws.rc-2
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/README.md +8 -3
- package/cli/init.js +1 -1
- package/lib/browser/index.d.mts +4 -4
- package/lib/browser/index.js +64 -59
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/index.mjs +64 -59
- package/lib/browser/index.mjs.map +1 -1
- package/lib/core/{GraphQLHandler-Cbu12sb0.d.ts → GraphQLHandler-3gvpA65n.d.ts} +3 -3
- package/lib/core/{GraphQLHandler-QGQY_9Rc.d.mts → GraphQLHandler-4DPdxG0R.d.mts} +3 -3
- package/lib/core/{HttpResponse-BWB1yDNM.d.mts → HttpResponse-aJY-D0oG.d.ts} +3 -3
- package/lib/core/{HttpResponse-DeJBWGN5.d.ts → HttpResponse-xuSipbNt.d.mts} +3 -3
- package/lib/core/HttpResponse.d.mts +1 -1
- package/lib/core/HttpResponse.d.ts +1 -1
- package/lib/core/HttpResponse.js.map +1 -1
- package/lib/core/HttpResponse.mjs.map +1 -1
- package/lib/core/SetupApi.d.mts +1 -1
- package/lib/core/SetupApi.d.ts +1 -1
- package/lib/core/bypass.js +6 -1
- package/lib/core/bypass.js.map +1 -1
- package/lib/core/bypass.mjs +6 -1
- package/lib/core/bypass.mjs.map +1 -1
- package/lib/core/getResponse.d.mts +1 -1
- package/lib/core/getResponse.d.ts +1 -1
- package/lib/core/getResponse.js +2 -2
- package/lib/core/getResponse.js.map +1 -1
- package/lib/core/getResponse.mjs +2 -2
- package/lib/core/getResponse.mjs.map +1 -1
- package/lib/core/graphql.d.mts +8 -6
- package/lib/core/graphql.d.ts +8 -6
- package/lib/core/graphql.js.map +1 -1
- package/lib/core/graphql.mjs.map +1 -1
- package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
- package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
- package/lib/core/handlers/GraphQLHandler.js.map +1 -1
- package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
- package/lib/core/handlers/HttpHandler.d.mts +1 -1
- package/lib/core/handlers/HttpHandler.d.ts +1 -1
- package/lib/core/handlers/HttpHandler.js +1 -1
- package/lib/core/handlers/HttpHandler.js.map +1 -1
- package/lib/core/handlers/HttpHandler.mjs +1 -1
- package/lib/core/handlers/HttpHandler.mjs.map +1 -1
- package/lib/core/handlers/RequestHandler.d.mts +1 -1
- package/lib/core/handlers/RequestHandler.d.ts +1 -1
- package/lib/core/handlers/WebSocketHandler.d.mts +11 -17
- package/lib/core/handlers/WebSocketHandler.d.ts +11 -17
- package/lib/core/handlers/WebSocketHandler.js +9 -12
- package/lib/core/handlers/WebSocketHandler.js.map +1 -1
- package/lib/core/handlers/WebSocketHandler.mjs +9 -12
- 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 +4 -4
- package/lib/core/index.d.ts +4 -4
- package/lib/core/index.js +2 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/index.mjs +4 -0
- package/lib/core/index.mjs.map +1 -1
- package/lib/core/passthrough.d.mts +1 -1
- package/lib/core/passthrough.d.ts +1 -1
- package/lib/core/typeUtils.d.mts +6 -1
- package/lib/core/typeUtils.d.ts +6 -1
- package/lib/core/typeUtils.js.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/HttpResponse/decorators.js +4 -1
- package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
- package/lib/core/utils/HttpResponse/decorators.mjs +4 -1
- 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/handleRequest.js.map +1 -1
- package/lib/core/utils/handleRequest.mjs.map +1 -1
- package/lib/core/utils/handleWebSocketEvent.d.mts +8 -2
- package/lib/core/utils/handleWebSocketEvent.d.ts +8 -2
- package/lib/core/utils/handleWebSocketEvent.js +20 -17
- package/lib/core/utils/handleWebSocketEvent.js.map +1 -1
- package/lib/core/utils/handleWebSocketEvent.mjs +21 -22
- package/lib/core/utils/handleWebSocketEvent.mjs.map +1 -1
- package/lib/core/utils/internal/mergeRight.js +15 -12
- package/lib/core/utils/internal/mergeRight.js.map +1 -1
- package/lib/core/utils/internal/mergeRight.mjs +15 -12
- package/lib/core/utils/internal/mergeRight.mjs.map +1 -1
- package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
- 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/logging/getTimestamp.d.mts +4 -1
- package/lib/core/utils/logging/getTimestamp.d.ts +4 -1
- package/lib/core/utils/logging/getTimestamp.js +6 -2
- package/lib/core/utils/logging/getTimestamp.js.map +1 -1
- package/lib/core/utils/logging/getTimestamp.mjs +6 -2
- package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
- package/lib/core/ws/utils/attachWebSocketLogger.d.mts +34 -0
- package/lib/core/ws/utils/attachWebSocketLogger.d.ts +34 -0
- package/lib/core/ws/utils/attachWebSocketLogger.js +211 -0
- package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -0
- package/lib/core/ws/utils/attachWebSocketLogger.mjs +191 -0
- package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -0
- package/lib/core/ws/utils/getMessageLength.d.mts +11 -0
- package/lib/core/ws/utils/getMessageLength.d.ts +11 -0
- package/lib/core/ws/utils/getMessageLength.js +33 -0
- package/lib/core/ws/utils/getMessageLength.js.map +1 -0
- package/lib/core/ws/utils/getMessageLength.mjs +13 -0
- package/lib/core/ws/utils/getMessageLength.mjs.map +1 -0
- package/lib/core/ws/utils/getPublicData.d.mts +5 -0
- package/lib/core/ws/utils/getPublicData.d.ts +5 -0
- package/lib/core/ws/utils/getPublicData.js +36 -0
- package/lib/core/ws/utils/getPublicData.js.map +1 -0
- package/lib/core/ws/utils/getPublicData.mjs +16 -0
- package/lib/core/ws/utils/getPublicData.mjs.map +1 -0
- package/lib/core/ws/utils/truncateMessage.d.mts +3 -0
- package/lib/core/ws/utils/truncateMessage.d.ts +3 -0
- package/lib/core/{utils/internal/randomId.js → ws/utils/truncateMessage.js} +11 -7
- package/lib/core/ws/utils/truncateMessage.js.map +1 -0
- package/lib/core/ws/utils/truncateMessage.mjs +11 -0
- package/lib/core/ws/utils/truncateMessage.mjs.map +1 -0
- package/lib/iife/index.js +508 -231
- package/lib/iife/index.js.map +1 -1
- package/lib/mockServiceWorker.js +8 -11
- package/lib/native/index.d.mts +4 -4
- package/lib/native/index.js +8 -2
- package/lib/native/index.js.map +1 -1
- package/lib/native/index.mjs +8 -2
- package/lib/native/index.mjs.map +1 -1
- package/lib/node/index.d.mts +6 -6
- package/lib/node/index.d.ts +2 -2
- package/lib/node/index.js +8 -2
- package/lib/node/index.js.map +1 -1
- package/lib/node/index.mjs +8 -2
- package/lib/node/index.mjs.map +1 -1
- package/package.json +8 -11
- package/src/browser/setupWorker/glossary.ts +4 -1
- package/src/browser/setupWorker/setupWorker.ts +19 -2
- package/src/browser/setupWorker/start/createRequestListener.ts +1 -1
- package/src/browser/setupWorker/start/createStartHandler.ts +9 -19
- package/src/browser/setupWorker/start/utils/createMessageChannel.ts +1 -1
- package/src/browser/utils/checkWorkerIntegrity.ts +34 -0
- package/src/core/HttpResponse.ts +3 -2
- package/src/core/bypass.test.ts +22 -0
- package/src/core/bypass.ts +9 -1
- package/src/core/getResponse.ts +2 -2
- package/src/core/graphql.ts +6 -3
- package/src/core/handlers/GraphQLHandler.test.ts +4 -5
- package/src/core/handlers/GraphQLHandler.ts +7 -4
- package/src/core/handlers/HttpHandler.test.ts +5 -5
- package/src/core/handlers/HttpHandler.ts +1 -1
- package/src/core/handlers/WebSocketHandler.ts +21 -39
- package/src/core/index.ts +6 -2
- package/src/core/typeUtils.ts +16 -10
- package/src/core/utils/HttpResponse/decorators.ts +8 -4
- package/src/core/utils/handleRequest.test.ts +14 -14
- package/src/core/utils/handleRequest.ts +1 -1
- package/src/core/utils/handleWebSocketEvent.ts +39 -29
- package/src/core/utils/internal/mergeRight.ts +16 -13
- package/src/core/utils/logging/getTimestamp.test.ts +20 -6
- package/src/core/utils/logging/getTimestamp.ts +11 -6
- package/src/core/ws/utils/attachWebSocketLogger.ts +262 -0
- package/src/core/ws/utils/getMessageLength.test.ts +16 -0
- package/src/core/ws/utils/getMessageLength.ts +19 -0
- package/src/core/ws/utils/getPublicData.test.ts +38 -0
- package/src/core/ws/utils/getPublicData.ts +17 -0
- package/src/core/ws/utils/truncateMessage.test.ts +12 -0
- package/src/core/ws/utils/truncateMessage.ts +9 -0
- package/src/mockServiceWorker.js +7 -10
- package/src/node/SetupServerApi.ts +4 -4
- package/src/node/SetupServerCommonApi.ts +6 -2
- package/src/node/glossary.ts +3 -3
- package/lib/core/utils/internal/randomId.d.mts +0 -3
- package/lib/core/utils/internal/randomId.d.ts +0 -3
- package/lib/core/utils/internal/randomId.js.map +0 -1
- package/lib/core/utils/internal/randomId.mjs +0 -7
- package/lib/core/utils/internal/randomId.mjs.map +0 -1
- package/src/browser/utils/requestIntegrityCheck.ts +0 -23
- package/src/core/utils/internal/randomId.ts +0 -3
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
import { getTimestamp } from './getTimestamp'
|
|
2
2
|
|
|
3
3
|
beforeAll(() => {
|
|
4
|
-
|
|
5
|
-
// to always produce a predictable value for testing purposes.
|
|
6
|
-
vi.spyOn(global.Date.prototype, 'getHours').mockImplementation(() => 12)
|
|
7
|
-
vi.spyOn(global.Date.prototype, 'getMinutes').mockImplementation(() => 4)
|
|
8
|
-
vi.spyOn(global.Date.prototype, 'getSeconds').mockImplementation(() => 8)
|
|
4
|
+
vi.useFakeTimers()
|
|
9
5
|
})
|
|
10
6
|
|
|
11
7
|
afterAll(() => {
|
|
12
|
-
vi.
|
|
8
|
+
vi.useRealTimers()
|
|
13
9
|
})
|
|
14
10
|
|
|
15
11
|
test('returns a timestamp string of the invocation time', () => {
|
|
12
|
+
vi.setSystemTime(new Date('2024-01-01 12:4:8'))
|
|
16
13
|
const timestamp = getTimestamp()
|
|
17
14
|
expect(timestamp).toBe('12:04:08')
|
|
18
15
|
})
|
|
16
|
+
|
|
17
|
+
test('returns a timestamp with milliseconds', () => {
|
|
18
|
+
vi.setSystemTime(new Date('2024-01-01 12:4:8'))
|
|
19
|
+
expect(getTimestamp({ milliseconds: true })).toBe('12:04:08.000')
|
|
20
|
+
|
|
21
|
+
vi.setSystemTime(new Date('2024-01-01 12:4:8.000'))
|
|
22
|
+
expect(getTimestamp({ milliseconds: true })).toBe('12:04:08.000')
|
|
23
|
+
|
|
24
|
+
vi.setSystemTime(new Date('2024-01-01 12:4:8.4'))
|
|
25
|
+
expect(getTimestamp({ milliseconds: true })).toBe('12:04:08.400')
|
|
26
|
+
|
|
27
|
+
vi.setSystemTime(new Date('2024-01-01 12:4:8.123'))
|
|
28
|
+
expect(getTimestamp({ milliseconds: true })).toBe('12:04:08.123')
|
|
29
|
+
|
|
30
|
+
vi.setSystemTime(new Date('2024-01-01 12:00:00'))
|
|
31
|
+
expect(getTimestamp({ milliseconds: true })).toBe('12:00:00.000')
|
|
32
|
+
})
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
interface GetTimestampOptions {
|
|
2
|
+
milliseconds?: boolean
|
|
3
|
+
}
|
|
4
|
+
|
|
1
5
|
/**
|
|
2
6
|
* Returns a timestamp string in a "HH:MM:SS" format.
|
|
3
7
|
*/
|
|
4
|
-
export function getTimestamp(): string {
|
|
8
|
+
export function getTimestamp(options?: GetTimestampOptions): string {
|
|
5
9
|
const now = new Date()
|
|
10
|
+
const timestamp = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}`
|
|
11
|
+
|
|
12
|
+
if (options?.milliseconds) {
|
|
13
|
+
return `${timestamp}.${now.getMilliseconds().toString().padStart(3, '0')}`
|
|
14
|
+
}
|
|
6
15
|
|
|
7
|
-
return
|
|
8
|
-
.map(String)
|
|
9
|
-
.map((chunk) => chunk.slice(0, 2))
|
|
10
|
-
.map((chunk) => chunk.padStart(2, '0'))
|
|
11
|
-
.join(':')
|
|
16
|
+
return timestamp
|
|
12
17
|
}
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
+
export function attachWebSocketLogger(
|
|
13
|
+
connection: WebSocketConnectionData,
|
|
14
|
+
): void {
|
|
15
|
+
const { client, server } = connection
|
|
16
|
+
|
|
17
|
+
logConnectionOpen(client)
|
|
18
|
+
|
|
19
|
+
// Log the events sent from the WebSocket client.
|
|
20
|
+
// WebSocket client connection object is written from the
|
|
21
|
+
// server's perspective so these message events are outgoing.
|
|
22
|
+
/**
|
|
23
|
+
* @todo Provide the reference to the exact event handler
|
|
24
|
+
* that called this `client.send()`.
|
|
25
|
+
*/
|
|
26
|
+
client.addEventListener('message', (event) => {
|
|
27
|
+
logOutgoingClientMessage(event)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
client.addEventListener('close', (event) => {
|
|
31
|
+
logConnectionClose(event)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Log the events received by the WebSocket client.
|
|
35
|
+
// "client.socket" references the actual WebSocket instance
|
|
36
|
+
// so these message events are incoming messages.
|
|
37
|
+
client.socket.addEventListener('message', (event) => {
|
|
38
|
+
logIncomingClientMessage(event)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// Log client errors (connection closures due to errors).
|
|
42
|
+
client.socket.addEventListener('error', (event) => {
|
|
43
|
+
logClientError(event)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
client.send = new Proxy(client.send, {
|
|
47
|
+
apply(target, thisArg, args) {
|
|
48
|
+
const [data] = args
|
|
49
|
+
const messageEvent = new MessageEvent('message', { data })
|
|
50
|
+
Object.defineProperties(messageEvent, {
|
|
51
|
+
currentTarget: {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
writable: false,
|
|
54
|
+
value: client.socket,
|
|
55
|
+
},
|
|
56
|
+
target: {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
writable: false,
|
|
59
|
+
value: client.socket,
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
logIncomingMockedClientMessage(messageEvent)
|
|
63
|
+
|
|
64
|
+
return Reflect.apply(target, thisArg, args)
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
server.addEventListener(
|
|
69
|
+
'open',
|
|
70
|
+
() => {
|
|
71
|
+
server.addEventListener('message', (event) => {
|
|
72
|
+
logIncomingServerMessage(event)
|
|
73
|
+
})
|
|
74
|
+
},
|
|
75
|
+
{ once: true },
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
// Log outgoing client events initiated by the event handler.
|
|
79
|
+
// The actual client never sent these but the handler did.
|
|
80
|
+
server.send = new Proxy(server.send, {
|
|
81
|
+
apply(target, thisArg, args) {
|
|
82
|
+
const [data] = args
|
|
83
|
+
const messageEvent = new MessageEvent('message', { data })
|
|
84
|
+
Object.defineProperties(messageEvent, {
|
|
85
|
+
currentTarget: {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
writable: false,
|
|
88
|
+
value: server['realWebSocket'],
|
|
89
|
+
},
|
|
90
|
+
target: {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
writable: false,
|
|
93
|
+
value: server['realWebSocket'],
|
|
94
|
+
},
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
logOutgoingMockedClientMessage(messageEvent)
|
|
98
|
+
|
|
99
|
+
return Reflect.apply(target, thisArg, args)
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Prints the WebSocket connection.
|
|
106
|
+
* This is meant to be logged by every WebSocket handler
|
|
107
|
+
* that intercepted this connection. This helps you see
|
|
108
|
+
* what handlers observe this connection.
|
|
109
|
+
*/
|
|
110
|
+
export function logConnectionOpen(client: WebSocketClientConnection) {
|
|
111
|
+
const publicUrl = toPublicUrl(client.url)
|
|
112
|
+
|
|
113
|
+
console.groupCollapsed(
|
|
114
|
+
devUtils.formatMessage(`${getTimestamp()} %c▸%c ${publicUrl}`),
|
|
115
|
+
'color:blue',
|
|
116
|
+
'color:inherit',
|
|
117
|
+
)
|
|
118
|
+
console.log('Client:', client.socket)
|
|
119
|
+
console.groupEnd()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Prints the outgoing client message.
|
|
124
|
+
*/
|
|
125
|
+
export async function logOutgoingClientMessage(
|
|
126
|
+
event: MessageEvent<WebSocketData>,
|
|
127
|
+
) {
|
|
128
|
+
const byteLength = getMessageLength(event.data)
|
|
129
|
+
const publicData = await getPublicData(event.data)
|
|
130
|
+
|
|
131
|
+
console.groupCollapsed(
|
|
132
|
+
devUtils.formatMessage(
|
|
133
|
+
`${getTimestamp({ milliseconds: true })} %c↑%c ${publicData} %c${byteLength}%c`,
|
|
134
|
+
),
|
|
135
|
+
'color:green',
|
|
136
|
+
'color:inherit',
|
|
137
|
+
'color:gray;font-weight:normal',
|
|
138
|
+
'color:inherit;font-weight:inherit',
|
|
139
|
+
)
|
|
140
|
+
console.log(event)
|
|
141
|
+
console.groupEnd()
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Prints the outgoing client message initiated
|
|
146
|
+
* by `server.send()` in the event handler.
|
|
147
|
+
*/
|
|
148
|
+
export async function logOutgoingMockedClientMessage(
|
|
149
|
+
event: MessageEvent<WebSocketData>,
|
|
150
|
+
) {
|
|
151
|
+
const byteLength = getMessageLength(event.data)
|
|
152
|
+
const publicData = await getPublicData(event.data)
|
|
153
|
+
|
|
154
|
+
console.groupCollapsed(
|
|
155
|
+
devUtils.formatMessage(
|
|
156
|
+
`${getTimestamp({ milliseconds: true })} %c⇡%c ${publicData} %c${byteLength}%c`,
|
|
157
|
+
),
|
|
158
|
+
'color:orangered',
|
|
159
|
+
'color:inherit',
|
|
160
|
+
'color:gray;font-weight:normal',
|
|
161
|
+
'color:inherit;font-weight:inherit',
|
|
162
|
+
)
|
|
163
|
+
console.log(event)
|
|
164
|
+
console.groupEnd()
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Prings the message received by the WebSocket client.
|
|
169
|
+
* This is fired when the "message" event is dispatched
|
|
170
|
+
* on the actual WebSocket client instance, and translates to
|
|
171
|
+
* the client receiving a message from the server.
|
|
172
|
+
*/
|
|
173
|
+
export async function logIncomingClientMessage(
|
|
174
|
+
event: MessageEvent<WebSocketData>,
|
|
175
|
+
) {
|
|
176
|
+
const byteLength = getMessageLength(event.data)
|
|
177
|
+
const publicData = await getPublicData(event.data)
|
|
178
|
+
|
|
179
|
+
console.groupCollapsed(
|
|
180
|
+
devUtils.formatMessage(
|
|
181
|
+
`${getTimestamp({ milliseconds: true })} %c↓%c ${publicData} %c${byteLength}%c`,
|
|
182
|
+
),
|
|
183
|
+
'color:red',
|
|
184
|
+
'color:inherit',
|
|
185
|
+
'color:gray;font-weight:normal',
|
|
186
|
+
'color:inherit;font-weight:inherit',
|
|
187
|
+
)
|
|
188
|
+
console.log(event)
|
|
189
|
+
console.groupEnd()
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Prints the outgoing client message initiated
|
|
194
|
+
* by `client.send()` in the event handler.
|
|
195
|
+
*/
|
|
196
|
+
export async function logIncomingMockedClientMessage(
|
|
197
|
+
event: MessageEvent<WebSocketData>,
|
|
198
|
+
) {
|
|
199
|
+
const byteLength = getMessageLength(event.data)
|
|
200
|
+
const publicData = await getPublicData(event.data)
|
|
201
|
+
|
|
202
|
+
console.groupCollapsed(
|
|
203
|
+
devUtils.formatMessage(
|
|
204
|
+
`${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,
|
|
205
|
+
),
|
|
206
|
+
'color:orangered',
|
|
207
|
+
'color:inherit',
|
|
208
|
+
'color:gray;font-weight:normal',
|
|
209
|
+
'color:inherit;font-weight:inherit',
|
|
210
|
+
)
|
|
211
|
+
console.log(event)
|
|
212
|
+
console.groupEnd()
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function logConnectionClose(event: CloseEvent) {
|
|
216
|
+
const target = event.target as WebSocket
|
|
217
|
+
const publicUrl = toPublicUrl(target.url)
|
|
218
|
+
|
|
219
|
+
console.groupCollapsed(
|
|
220
|
+
devUtils.formatMessage(
|
|
221
|
+
`${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,
|
|
222
|
+
),
|
|
223
|
+
'color:blue',
|
|
224
|
+
'color:inherit',
|
|
225
|
+
)
|
|
226
|
+
console.log(event)
|
|
227
|
+
console.groupEnd()
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export async function logIncomingServerMessage(
|
|
231
|
+
event: MessageEvent<WebSocketData>,
|
|
232
|
+
) {
|
|
233
|
+
const byteLength = getMessageLength(event.data)
|
|
234
|
+
const publicData = await getPublicData(event.data)
|
|
235
|
+
|
|
236
|
+
console.groupCollapsed(
|
|
237
|
+
devUtils.formatMessage(
|
|
238
|
+
`${getTimestamp({ milliseconds: true })} %c⇣%c ${publicData} %c${byteLength}%c`,
|
|
239
|
+
),
|
|
240
|
+
'color:orangered',
|
|
241
|
+
'color:inherit',
|
|
242
|
+
'color:gray;font-weight:normal',
|
|
243
|
+
'color:inherit;font-weight:inherit',
|
|
244
|
+
)
|
|
245
|
+
console.log(event)
|
|
246
|
+
console.groupEnd()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function logClientError(event: Event) {
|
|
250
|
+
const socket = event.target as WebSocket
|
|
251
|
+
const publicUrl = toPublicUrl(socket.url)
|
|
252
|
+
|
|
253
|
+
console.groupCollapsed(
|
|
254
|
+
devUtils.formatMessage(
|
|
255
|
+
`${getTimestamp({ milliseconds: true })} %c\u00D7%c ${publicUrl}`,
|
|
256
|
+
),
|
|
257
|
+
'color:red',
|
|
258
|
+
'color:inherit',
|
|
259
|
+
)
|
|
260
|
+
console.log(event)
|
|
261
|
+
console.groupEnd()
|
|
262
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
})
|
package/src/mockServiceWorker.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
/* tslint:disable */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Mock Service Worker
|
|
5
|
+
* Mock Service Worker.
|
|
6
6
|
* @see https://github.com/mswjs/msw
|
|
7
7
|
* - Please do NOT modify this file.
|
|
8
8
|
* - Please do NOT serve this file on production.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
const PACKAGE_VERSION = '<PACKAGE_VERSION>'
|
|
11
12
|
const INTEGRITY_CHECKSUM = '<INTEGRITY_CHECKSUM>'
|
|
12
13
|
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
|
|
13
14
|
const activeClientIds = new Set()
|
|
@@ -48,7 +49,10 @@ self.addEventListener('message', async function (event) {
|
|
|
48
49
|
case 'INTEGRITY_CHECK_REQUEST': {
|
|
49
50
|
sendToClient(client, {
|
|
50
51
|
type: 'INTEGRITY_CHECK_RESPONSE',
|
|
51
|
-
payload:
|
|
52
|
+
payload: {
|
|
53
|
+
packageVersion: PACKAGE_VERSION,
|
|
54
|
+
checksum: INTEGRITY_CHECKSUM,
|
|
55
|
+
},
|
|
52
56
|
})
|
|
53
57
|
break
|
|
54
58
|
}
|
|
@@ -202,13 +206,6 @@ async function getResponse(event, client, requestId) {
|
|
|
202
206
|
return passthrough()
|
|
203
207
|
}
|
|
204
208
|
|
|
205
|
-
// Bypass requests with the explicit bypass header.
|
|
206
|
-
// Such requests can be issued by "ctx.fetch()".
|
|
207
|
-
const mswIntention = request.headers.get('x-msw-intention')
|
|
208
|
-
if (['bypass', 'passthrough'].includes(mswIntention)) {
|
|
209
|
-
return passthrough()
|
|
210
|
-
}
|
|
211
|
-
|
|
212
209
|
// Notify the client that a request has been intercepted.
|
|
213
210
|
const requestBuffer = await request.arrayBuffer()
|
|
214
211
|
const clientMessage = await sendToClient(
|
|
@@ -240,7 +237,7 @@ async function getResponse(event, client, requestId) {
|
|
|
240
237
|
return respondWithMock(clientMessage.data)
|
|
241
238
|
}
|
|
242
239
|
|
|
243
|
-
case '
|
|
240
|
+
case 'PASSTHROUGH': {
|
|
244
241
|
return passthrough()
|
|
245
242
|
}
|
|
246
243
|
}
|
|
@@ -61,10 +61,10 @@ export class SetupServerApi
|
|
|
61
61
|
this.handlersController = new AsyncHandlersController(handlers)
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
public boundary<
|
|
65
|
-
callback:
|
|
66
|
-
): (...args:
|
|
67
|
-
return (...args:
|
|
64
|
+
public boundary<Args extends Array<any>, R>(
|
|
65
|
+
callback: (...args: Args) => R,
|
|
66
|
+
): (...args: Args) => R {
|
|
67
|
+
return (...args: Args): R => {
|
|
68
68
|
return store.run<any, any>(
|
|
69
69
|
{
|
|
70
70
|
initialHandlers: this.handlersController.currentHandlers(),
|
|
@@ -85,8 +85,12 @@ export class SetupServerCommonApi
|
|
|
85
85
|
},
|
|
86
86
|
)
|
|
87
87
|
|
|
88
|
-
handleWebSocketEvent(
|
|
89
|
-
|
|
88
|
+
handleWebSocketEvent({
|
|
89
|
+
getHandlers: () => {
|
|
90
|
+
return this.handlersController.currentHandlers()
|
|
91
|
+
},
|
|
92
|
+
onMockedConnection: () => {},
|
|
93
|
+
onPassthroughConnection: () => {},
|
|
90
94
|
})
|
|
91
95
|
}
|
|
92
96
|
|
package/src/node/glossary.ts
CHANGED
|
@@ -68,7 +68,7 @@ export interface SetupServer extends SetupServerCommon {
|
|
|
68
68
|
*
|
|
69
69
|
* @see {@link https://mswjs.io/docs/api/setup-server/boundary `server.boundary()` API reference}
|
|
70
70
|
*/
|
|
71
|
-
boundary<
|
|
72
|
-
callback:
|
|
73
|
-
): (...args:
|
|
71
|
+
boundary<Args extends Array<any>, R>(
|
|
72
|
+
callback: (...args: Args) => R,
|
|
73
|
+
): (...args: Args) => R
|
|
74
74
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/utils/internal/randomId.ts"],"sourcesContent":["export function randomId(): string {\n return Math.random().toString(16).slice(2)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,WAAmB;AACjC,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC3C;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/utils/internal/randomId.ts"],"sourcesContent":["export function randomId(): string {\n return Math.random().toString(16).slice(2)\n}\n"],"mappings":"AAAO,SAAS,WAAmB;AACjC,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC3C;","names":[]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { SetupWorkerInternalContext } from '../setupWorker/glossary'
|
|
2
|
-
|
|
3
|
-
export async function requestIntegrityCheck(
|
|
4
|
-
context: SetupWorkerInternalContext,
|
|
5
|
-
serviceWorker: ServiceWorker,
|
|
6
|
-
): Promise<ServiceWorker> {
|
|
7
|
-
// Signal Service Worker to report back its integrity
|
|
8
|
-
context.workerChannel.send('INTEGRITY_CHECK_REQUEST')
|
|
9
|
-
|
|
10
|
-
const { payload: actualChecksum } = await context.events.once(
|
|
11
|
-
'INTEGRITY_CHECK_RESPONSE',
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
// Compare the response from the Service Worker and the
|
|
15
|
-
// global variable set during the build.
|
|
16
|
-
if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {
|
|
17
|
-
throw new Error(
|
|
18
|
-
`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return serviceWorker
|
|
23
|
-
}
|