Skip to content

Commit 49825c5

Browse files
committed
fix(browser): fix browser mock factory event race condition
1 parent 2a50464 commit 49825c5

File tree

6 files changed

+28
-19
lines changed

6 files changed

+28
-19
lines changed

packages/browser/src/client/channel.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,19 @@ export interface IframeMockingDoneEvent {
3939

4040
export interface IframeMockFactoryRequestEvent {
4141
type: 'mock-factory:request'
42+
eventId: string
4243
id: string
4344
}
4445

4546
export interface IframeMockFactoryResponseEvent {
4647
type: 'mock-factory:response'
48+
eventId: string
4749
exports: string[]
4850
}
4951

5052
export interface IframeMockFactoryErrorEvent {
5153
type: 'mock-factory:error'
54+
eventId: string
5255
error: any
5356
}
5457

packages/browser/src/client/tester/mocker.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { IframeChannelOutgoingEvent } from '@vitest/browser/client'
1+
import type { IframeChannelOutgoingEvent, IframeMockFactoryErrorEvent, IframeMockFactoryResponseEvent } from '@vitest/browser/client'
22
import { channel } from '@vitest/browser/client'
33
import { ModuleMocker } from '@vitest/mocker/browser'
44
import { getBrowserState } from '../utils'
@@ -14,18 +14,20 @@ export class VitestBrowserClientMocker extends ModuleMocker {
1414
const exports = Object.keys(module)
1515
channel.postMessage({
1616
type: 'mock-factory:response',
17+
eventId: e.data.eventId,
1718
exports,
18-
})
19+
} satisfies IframeMockFactoryResponseEvent)
1920
}
2021
catch (err: any) {
2122
channel.postMessage({
2223
type: 'mock-factory:error',
24+
eventId: e.data.eventId,
2325
error: {
2426
name: err.name,
2527
message: err.message,
2628
stack: err.stack,
2729
},
28-
})
30+
} satisfies IframeMockFactoryErrorEvent)
2931
}
3032
}
3133
},

packages/browser/src/client/tester/msw.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
import type { MockedModuleSerialized } from '@vitest/mocker'
77
import { ManualMockedModule } from '@vitest/mocker'
88
import { ModuleMockerMSWInterceptor } from '@vitest/mocker/browser'
9+
import { nanoid } from '@vitest/utils'
910

1011
export class VitestBrowserModuleMockerInterceptor extends ModuleMockerMSWInterceptor {
1112
override async register(event: MockedModuleSerialized): Promise<void> {
@@ -42,19 +43,21 @@ export function createModuleMockerInterceptor() {
4243
}
4344

4445
function getFactoryExports(id: string) {
46+
const eventId = nanoid()
4547
channel.postMessage({
4648
type: 'mock-factory:request',
49+
eventId,
4750
id,
4851
})
4952
return new Promise<string[]>((resolve, reject) => {
5053
channel.addEventListener(
5154
'message',
5255
function onMessage(e: MessageEvent<IframeChannelEvent>) {
53-
if (e.data.type === 'mock-factory:response') {
56+
if (e.data.type === 'mock-factory:response' && e.data.eventId === eventId) {
5457
resolve(e.data.exports)
5558
channel.removeEventListener('message', onMessage)
5659
}
57-
if (e.data.type === 'mock-factory:error') {
60+
if (e.data.type === 'mock-factory:error' && e.data.eventId === eventId) {
5861
reject(e.data.error)
5962
channel.removeEventListener('message', onMessage)
6063
}

packages/utils/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,5 @@ export type {
5151
SerializedError,
5252
TestError,
5353
} from './types'
54+
55+
export { nanoid } from './nanoid'

packages/utils/src/nanoid.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// port from nanoid
2+
// https://github.com/ai/nanoid
3+
const urlAlphabet
4+
= 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
5+
export function nanoid(size = 21): string {
6+
let id = ''
7+
let i = size
8+
while (i--) {
9+
id += urlAlphabet[(Math.random() * 64) | 0]
10+
}
11+
return id
12+
}

packages/vitest/src/utils/base.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Arrayable, Nullable } from '../types/general'
22

3-
export { notNullish, getCallLastIndex } from '@vitest/utils'
3+
export { notNullish, getCallLastIndex, nanoid } from '@vitest/utils'
44

55
export interface GlobalConstructors {
66
Object: ObjectConstructor
@@ -203,16 +203,3 @@ export function wildcardPatternToRegExp(pattern: string): RegExp {
203203
'i',
204204
)
205205
}
206-
207-
// port from nanoid
208-
// https://github.com/ai/nanoid
209-
const urlAlphabet
210-
= 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
211-
export function nanoid(size = 21) {
212-
let id = ''
213-
let i = size
214-
while (i--) {
215-
id += urlAlphabet[(Math.random() * 64) | 0]
216-
}
217-
return id
218-
}

0 commit comments

Comments
 (0)