Skip to content

Commit 8806874

Browse files
committed
eliminate race condition properly
1 parent c8b134a commit 8806874

File tree

7 files changed

+30
-26
lines changed

7 files changed

+30
-26
lines changed

package-lock.json

Lines changed: 17 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"@cucumber/query": "^14.0.0",
4444
"@cucumber/tag-expressions": "8.1.0",
4545
"globby": "^16.0.0",
46+
"rxjs": "7.8.2",
4647
"stack-utils": "2.0.6"
4748
},
4849
"devDependencies": {

src/messages/eventEmitter.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import { EventEmitter } from 'node:events'
2-
31
import { Envelope } from '@cucumber/messages'
2+
import { ReplaySubject } from 'rxjs'
43

5-
export const eventEmitter = new EventEmitter<{
6-
envelope: [Envelope]
7-
}>()
4+
export const envelopes$ = new ReplaySubject<Envelope>()

src/messages/setupMessageListening.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Envelope } from '@cucumber/messages'
55
import { Buffer } from 'buffer'
66

77
import { deriveSocketPath } from './deriveSocketPath.js'
8-
import { eventEmitter } from './eventEmitter.js'
8+
import { envelopes$ } from './eventEmitter.js'
99

1010
export async function setupMessageListening() {
1111
const pid = process.pid.toString()
@@ -50,7 +50,7 @@ class Deframer {
5050
for (const line of lines) {
5151
if (line) {
5252
const envelope = JSON.parse(line.toString()) as Envelope
53-
eventEmitter.emit('envelope', envelope)
53+
envelopes$.next(envelope)
5454
}
5555
}
5656
}

src/messages/setupMessageWriting.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { connect } from 'node:net'
22

33
import { deriveSocketPath } from './deriveSocketPath.js'
4-
import { eventEmitter } from './eventEmitter.js'
4+
import { envelopes$ } from './eventEmitter.js'
55

66
export async function setupMessageWriting() {
77
const listenerPid = process.env.CUCUMBER_MESSAGES_LISTENING
@@ -12,7 +12,7 @@ export async function setupMessageWriting() {
1212
const socketPath = deriveSocketPath(listenerPid)
1313
const client = connect(socketPath, resolve)
1414

15-
eventEmitter.on('envelope', (envelope) => {
15+
envelopes$.subscribe((envelope) => {
1616
client.write(JSON.stringify(envelope) + '\n')
1717
})
1818

src/reporters/generateEnvelopes.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@ import {
1010
} from '@cucumber/messages'
1111

1212
import { makeTimestamp } from '../makeTimestamp.js'
13-
import { eventEmitter, setupMessageListening } from '../messages/index.js'
13+
import { envelopes$, setupMessageListening } from '../messages/index.js'
1414
import { newId } from '../newId.js'
1515
import { mapTestStepResult } from './mapTestStepResult.js'
1616
import { meta } from './meta.js'
1717

1818
await setupMessageListening()
19-
const rawEnvelopes: Array<Envelope> = []
20-
eventEmitter.on('envelope', (envelope) => rawEnvelopes.push(envelope))
2119

2220
export async function* generateEnvelopes(
2321
source: AsyncIterable<TestEvent>
@@ -26,8 +24,11 @@ export async function* generateEnvelopes(
2624

2725
const nodeFailOrPassEvents: Array<EventData.TestFail | EventData.TestPass> = []
2826
const testStepFinishedMessages: Array<TestStepFinished> = []
27+
const rawEnvelopes: Array<Envelope> = []
2928
const testRunEnvelopes: Array<Envelope> = []
3029

30+
envelopes$.subscribe((envelope) => rawEnvelopes.push(envelope))
31+
3132
const testRunStarted: TestRunStarted = {
3233
id: newId(),
3334
timestamp: makeTimestamp(),

src/runner/MessagesCollector.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Envelope } from '@cucumber/messages'
22

3-
import { eventEmitter } from '../messages/index.js'
3+
import { envelopes$ } from '../messages/index.js'
44

55
export class MessagesCollector {
66
push(...envelopes: ReadonlyArray<Envelope>) {
7-
envelopes.forEach((envelope) => eventEmitter.emit('envelope', envelope))
7+
envelopes.forEach((envelope) => envelopes$.next(envelope))
88
}
99
}

0 commit comments

Comments
 (0)