···88import { createBirpc } from 'birpc'
99import { parse, stringify } from 'flatted'
1010import { dirname } from 'pathe'
1111-import { createDebugger, isFileServingAllowed } from 'vitest/node'
1111+import { createDebugger, isFileServingAllowed, isValidApiRequest } from 'vitest/node'
1212import { WebSocketServer } from 'ws'
13131414const debug = createDebugger('vitest:browser:api')
···29293030 const { pathname, searchParams } = new URL(request.url, 'http://localhost')
3131 if (pathname !== BROWSER_API_PATH) {
3232+ return
3333+ }
3434+3535+ if (!isValidApiRequest(ctx.config, request)) {
3636+ socket.destroy()
3237 return
3338 }
3439
+1
packages/browser/src/node/serverOrchestrator.ts
···3232 __VITEST_CONTEXT_ID__: JSON.stringify(contextId),
3333 __VITEST_TESTER_ID__: '"none"',
3434 __VITEST_PROVIDED_CONTEXT__: '{}',
3535+ __VITEST_API_TOKEN__: JSON.stringify(project.ctx.config.api.token),
3536 })
36373738 // disable CSP for the orchestrator as we are the ones controlling it
···99} from '../types/config'
1010import type { BaseCoverageOptions, CoverageReporterWithOptions } from '../types/coverage'
1111import type { BuiltinPool, ForksOptions, PoolOptions, ThreadsOptions } from '../types/pool-options'
1212+import crypto from 'node:crypto'
1213import { toArray } from '@vitest/utils'
1314import { resolveModule } from 'local-pkg'
1415import { normalize, relative, resolve } from 'pathe'
···584585 }
585586586587 // the server has been created, we don't need to override vite.server options
587587- resolved.api = resolveApiServerConfig(options, defaultPort)
588588+ const api = resolveApiServerConfig(options, defaultPort)
589589+ resolved.api = { ...api, token: crypto.randomUUID() }
588590589591 if (options.related) {
590592 resolved.related = toArray(options.related).map(file =>