Skip to content

Commit 1ac66f0

Browse files
committed
fix: add websocket logging
1 parent dc56c2a commit 1ac66f0

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

src/browser/setup-worker.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import { InterceptorSource } from '~/core/new/sources/interceptor-source'
1818

1919
const DEFAULT_WORKER_URL = '/mockServiceWorker.js'
2020

21-
export interface SetupWorkerApi
22-
extends NetworkHandlersApi<HttpHandler | WebSocketHandler> {
21+
export interface SetupWorkerApi extends NetworkHandlersApi {
2322
start: (options?: SetupWorkerStartOptions) => Promise<void>
2423
stop: () => void
2524
}
@@ -48,7 +47,7 @@ export type FindWorker = (
4847
export function setupWorker(
4948
...handlers: Array<HttpHandler | WebSocketHandler>
5049
): SetupWorkerApi {
51-
let network: NetworkApi<HttpHandler | WebSocketHandler>
50+
let network: NetworkApi
5251

5352
return {
5453
async start(options) {

src/core/handlers/WebSocketHandler.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
} from '../utils/matching/matchRequestUrl'
1414
import { getCallFrame } from '../utils/internal/getCallFrame'
1515
import type { HandlerKind } from './common'
16+
import { attachWebSocketLogger } from '../ws/utils/attachWebSocketLogger'
1617

1718
type WebSocketHandlerParsedResult = {
1819
match: Match
@@ -138,6 +139,10 @@ export class WebSocketHandler {
138139
// This is what the developer adds listeners for.
139140
return this[kEmitter].emit('connection', connection)
140141
}
142+
143+
public log(connection: WebSocketConnectionData): void {
144+
attachWebSocketLogger(connection)
145+
}
141146
}
142147

143148
function createStopPropagationListener(handler: WebSocketHandler) {

src/core/new/define-network.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
} from './on-unhandled-frame'
1515
import { pipeEvents } from '../utils/internal/pipeEvents'
1616

17-
export interface DefineNetworkOptions<Handler extends AnyHandler> {
17+
export interface DefineNetworkOptions {
1818
/**
1919
* A list of network sources.
2020
*/
@@ -23,7 +23,7 @@ export interface DefineNetworkOptions<Handler extends AnyHandler> {
2323
/**
2424
* A list of the initial handlers.
2525
*/
26-
handlers: Array<Handler>
26+
handlers: Array<AnyHandler>
2727

2828
/**
2929
* A custom handlers controller to use.
@@ -39,8 +39,7 @@ export interface DefineNetworkOptions<Handler extends AnyHandler> {
3939
quiet?: boolean
4040
}
4141

42-
export interface NetworkApi<Handler extends AnyHandler>
43-
extends NetworkHandlersApi<Handler> {
42+
export interface NetworkApi extends NetworkHandlersApi {
4443
/**
4544
* Enables the network interception.
4645
*/
@@ -57,16 +56,14 @@ export interface NetworkApi<Handler extends AnyHandler>
5756
events: Emitter<any>
5857
}
5958

60-
export interface NetworkHandlersApi<Handler extends AnyHandler> {
61-
use(...handlers: Array<Handler>): void
62-
resetHandlers(...nextHandlers: Array<Handler>): void
59+
export interface NetworkHandlersApi {
60+
use(...handlers: Array<AnyHandler>): void
61+
resetHandlers(...nextHandlers: Array<AnyHandler>): void
6362
restoreHandlers(): void
64-
listHandlers(): ReadonlyArray<Handler>
63+
listHandlers(): ReadonlyArray<AnyHandler>
6564
}
6665

67-
export function defineNetwork<Handler extends AnyHandler>(
68-
options: DefineNetworkOptions<Handler>,
69-
): NetworkApi<Handler> {
66+
export function defineNetwork(options: DefineNetworkOptions): NetworkApi {
7067
const source = NetworkSource.from(...options.sources)
7168
const events = new Emitter()
7269

src/core/new/resolve-network-frame.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,9 @@ async function resolveHttpNetworkFrame(
126126
frame.events.emit('request:end', { request, requestId })
127127

128128
if (!flow.quiet) {
129-
/**
130-
* @fixme This doesn't belong here. Different network APIs might choose
131-
* to handle logging differently (e.g. `setupServer` doesn't log at all).
132-
* This likely belongs in an abstract method on `defineNetwork()` or something.
133-
*/
134129
// Log mocked responses. Use the Network tab to observe the original network.
135130
handler.log({
136-
request: requestCloneForLogs,
131+
request: requestCloneForLogs!,
137132
response,
138133
parsedResult,
139134
})
@@ -148,7 +143,7 @@ async function resolveHttpNetworkFrame(
148143
async function resolveWebSocketNetworkFrame(
149144
frame: WebSocketNetworkFrame,
150145
handlers: Array<AnyHandler>,
151-
_flow: ResolveNetworkFlow,
146+
flow: ResolveNetworkFlow,
152147
): Promise<void> {
153148
const { connection } = frame.data
154149
const eventHandlers = handlers.filter(isHandlerKind('EventHandler'))
@@ -159,21 +154,32 @@ async function resolveWebSocketNetworkFrame(
159154
})
160155

161156
if (eventHandlers.length > 0) {
162-
await Promise.all(
163-
eventHandlers.map((handler) => {
157+
const matches = await Promise.all<boolean>(
158+
eventHandlers.map(async (handler) => {
164159
// Foward the connection data to every WebSocket handler.
165160
// This is equivalent to dispatching the connection event
166161
// onto multiple listeners.
167-
return handler.run(connection)
162+
return handler.run(connection).then((matches) => {
163+
if (matches) {
164+
flow?.handled?.({ frame, handler })
165+
166+
if (!flow?.quiet) {
167+
handler.log(connection)
168+
}
169+
}
170+
171+
return matches
172+
})
168173
}),
169174
)
170175

176+
if (matches.every((match) => !match)) {
177+
flow?.unhandled?.()
178+
}
179+
171180
return
172181
}
173182

174-
/**
175-
* @todo Support WebSocket logging, somehow.
176-
*/
177-
178183
frame.passthrough()
184+
flow.unhandled?.()
179185
}

0 commit comments

Comments
 (0)