()
| 59 | } |
| 60 | |
| 61 | function createClient() { |
| 62 | const autoReconnect = true |
| 63 | const reconnectInterval = 2000 |
| 64 | const reconnectTries = 10 |
| 65 | const connectTimeout = 60000 |
| 66 | |
| 67 | let tries = reconnectTries |
| 68 | |
| 69 | const ctx: VitestBrowserClient = { |
| 70 | ws: new WebSocket(ENTRY_URL), |
| 71 | waitForConnection, |
| 72 | } as VitestBrowserClient |
| 73 | |
| 74 | let onMessage: Function |
| 75 | |
| 76 | ctx.rpc = createBirpc<WebSocketBrowserHandlers, WebSocketBrowserEvents>( |
| 77 | { |
| 78 | async onCancel(reason) { |
| 79 | await Promise.all(onCancelCallbacks.map(fn => fn(reason))) |
| 80 | }, |
| 81 | async createTesters(options) { |
| 82 | const orchestrator = await waitForOrchestrator() |
| 83 | return orchestrator.createTesters(options) |
| 84 | }, |
| 85 | async cleanupTesters() { |
| 86 | const orchestrator = await waitForOrchestrator() |
| 87 | return orchestrator.cleanupTesters() |
| 88 | }, |
| 89 | cdpEvent(event: string, payload: unknown) { |
| 90 | const cdp = getBrowserState().cdp |
| 91 | if (!cdp) { |
| 92 | return |
| 93 | } |
| 94 | cdp.emit(event, payload) |
| 95 | }, |
| 96 | async resolveManualMock(url: string) { |
| 97 | // @ts-expect-error not typed global API |
| 98 | const mocker = globalThis.__vitest_mocker__ as ModuleMocker | undefined |
| 99 | const responseId = getBrowserState().sessionId |
| 100 | if (!mocker) { |
| 101 | return { url, keys: [], responseId } |
| 102 | } |
| 103 | const exports = await mocker.resolveFactoryModule(url) |
| 104 | const keys = Object.keys(exports) |
| 105 | return { |
| 106 | url, |
| 107 | keys, |
| 108 | responseId, |
| 109 | } |
| 110 | }, |
| 111 | }, |
| 112 | { |
| 113 | post: msg => ctx.ws.send(msg), |
| 114 | on: fn => (onMessage = fn), |
| 115 | serialize: e => |
| 116 | stringify(e, (_, v) => { |
| 117 | if (v instanceof Error) { |
| 118 | return { |
no test coverage detected