1
1
import { fileURLToPath } from 'node:url'
2
2
import { Worker , isMainThread , parentPort , workerData as rawWorkerData } from 'node:worker_threads'
3
3
import { Schema } from '@effect/schema'
4
+ import { getExecutionId } from './executionOrder.ts'
4
5
import { Queue } from './queue.ts'
5
6
6
7
export declare namespace workerThreads {
@@ -25,49 +26,57 @@ export declare namespace workerThreads {
25
26
}
26
27
27
28
export async function workerThreads < Schema extends workerThreads . Schema > ( props : workerThreads . Props < Schema > ) {
28
- if ( isMainThread ) {
29
- const spawnWorker = ( workerData : Schema [ 'init' ] [ 'Encoded' ] ) => {
30
- const worker = new Worker ( fileURLToPath ( props . filePath ) , { workerData } )
29
+ const { executionId } = getExecutionId ( props . filePath )
31
30
32
- const queue = new Queue < Schema [ 'main' ] [ 'Type' ] > ( )
33
- worker . on ( 'message' , rawData => {
34
- const data = Schema . decodeSync ( props . schema . main ) ( rawData )
35
- void queue . publish ( data )
36
- } )
31
+ if ( isMainThread && process . env [ 'workerThreadsId' ] === executionId ) {
32
+ const worker = parentPort !
33
+ const workerData = Schema . decodeSync ( props . schema . init ) ( rawWorkerData )
37
34
38
- worker . on ( 'exit' , ( ) => queue . close ( ) )
39
- worker . on ( 'error' , ( ) => queue . close ( ) )
40
- worker . on ( 'messageerror' , ( ) => queue . close ( ) )
35
+ const queue = new Queue < Schema [ 'worker' ] [ 'Type' ] > ( )
36
+ worker . on ( 'message' , rawData => {
37
+ const data = Schema . decodeSync ( props . schema . worker ) ( rawData )
38
+ void queue . publish ( data )
39
+ } )
41
40
42
- const send = async ( rawData : Schema [ 'worker' ] [ 'Encoded' ] ) => {
43
- const data = await Schema . encodePromise ( props . schema . worker ) ( rawData )
44
- worker . postMessage ( data )
45
- }
41
+ worker . on ( 'exit' , ( ) => queue . close ( ) )
42
+ worker . on ( 'error' , ( ) => queue . close ( ) )
43
+ worker . on ( 'messageerror' , ( ) => queue . close ( ) )
46
44
47
- return { queue, send, terminate : worker . terminate }
45
+ const send = async ( rawData : Schema [ 'main' ] [ 'Encoded' ] ) => {
46
+ const data = await Schema . encodePromise ( props . schema . main ) ( rawData )
47
+ worker . postMessage ( data )
48
48
}
49
49
50
- return { spawnWorker }
50
+ await props . worker ( { queue, send, workerData, terminate : process . exit } )
51
+ process . exit ( 0 )
51
52
}
52
53
53
- const worker = parentPort !
54
- const workerData = Schema . decodeSync ( props . schema . init ) ( rawWorkerData )
54
+ function spawnWorker ( workerData : Schema [ 'init' ] [ 'Encoded' ] ) {
55
+ const worker = new Worker ( fileURLToPath ( props . filePath ) , {
56
+ workerData,
57
+ env : {
58
+ ...process . env ,
59
+ workerThreadsId : executionId
60
+ }
61
+ } )
62
+
63
+ const queue = new Queue < Schema [ 'main' ] [ 'Type' ] > ( )
64
+ worker . on ( 'message' , rawData => {
65
+ const data = Schema . decodeSync ( props . schema . main ) ( rawData )
66
+ void queue . publish ( data )
67
+ } )
55
68
56
- const queue = new Queue < Schema [ 'worker' ] [ 'Type' ] > ( )
57
- worker . on ( 'message' , rawData => {
58
- const data = Schema . decodeSync ( props . schema . worker ) ( rawData )
59
- void queue . publish ( data )
60
- } )
69
+ worker . on ( 'exit' , ( ) => queue . close ( ) )
70
+ worker . on ( 'error' , ( ) => queue . close ( ) )
71
+ worker . on ( 'messageerror' , ( ) => queue . close ( ) )
61
72
62
- worker . on ( 'exit' , ( ) => queue . close ( ) )
63
- worker . on ( 'error' , ( ) => queue . close ( ) )
64
- worker . on ( 'messageerror' , ( ) => queue . close ( ) )
73
+ const send = async ( rawData : Schema [ 'worker' ] [ 'Encoded' ] ) => {
74
+ const data = await Schema . encodePromise ( props . schema . worker ) ( rawData )
75
+ worker . postMessage ( data )
76
+ }
65
77
66
- const send = async ( rawData : Schema [ 'main' ] [ 'Encoded' ] ) => {
67
- const data = await Schema . encodePromise ( props . schema . main ) ( rawData )
68
- worker . postMessage ( data )
78
+ return { queue, send, terminate : worker . terminate }
69
79
}
70
80
71
- await props . worker ( { queue, send, workerData, terminate : process . exit } )
72
- process . exit ( 0 )
81
+ return { spawnWorker }
73
82
}
0 commit comments