@@ -10,90 +10,92 @@ if (globalThis.navigator == null) {
10
10
} as Navigator ;
11
11
}
12
12
13
- globalThis . Worker = class Worker extends EventTarget {
14
- private _worker : import ( "node:worker_threads" ) . Worker ;
13
+ if ( globalThis . Worker == null ) {
14
+ globalThis . Worker = class Worker extends EventTarget {
15
+ private _worker : import ( "node:worker_threads" ) . Worker ;
15
16
16
- constructor ( url : string | URL , options ?: WorkerOptions | undefined ) {
17
- super ( ) ;
17
+ constructor ( url : string | URL , options ?: WorkerOptions | undefined ) {
18
+ super ( ) ;
18
19
19
- if ( url instanceof URL ) {
20
- if ( url . protocol !== "file:" ) {
21
- throw new Error ( "Worker only supports file: URLs" ) ;
20
+ if ( url instanceof URL ) {
21
+ if ( url . protocol !== "file:" ) {
22
+ throw new Error ( "Worker only supports file: URLs" ) ;
23
+ }
24
+
25
+ url = url . href ;
26
+
27
+ } else {
28
+ throw new Error ( "Filepaths are unreliable, use `new URL(\"...\", import.meta.url)` instead." ) ;
22
29
}
23
30
24
- url = url . href ;
31
+ if ( ! options || options . type !== "module" ) {
32
+ throw new Error ( "Workers must use \`type: \"module\"\`" ) ;
33
+ }
25
34
26
- } else {
27
- throw new Error ( "Filepaths are unreliable, use `new URL(\"...\", import.meta.url)` instead." ) ;
35
+ const code = `
36
+ import("node:worker_threads")
37
+ .then(({ workerData }) => {
38
+ return import(workerData.polyfill)
39
+ .then(() => import(workerData.url))
40
+ })
41
+ .catch((e) => {
42
+ // TODO maybe it should send a message to the parent?
43
+ console.error(e.stack);
44
+ });
45
+ ` ;
46
+
47
+ this . _worker = new $worker . Worker ( code , {
48
+ eval : true ,
49
+ workerData : {
50
+ url,
51
+ polyfill : new URL ( "node-polyfill.js" , import . meta. url ) . href ,
52
+ } ,
53
+ } ) ;
54
+
55
+ this . _worker . on ( "message" , ( data ) => {
56
+ this . dispatchEvent ( new MessageEvent ( "message" , { data } ) ) ;
57
+ } ) ;
58
+
59
+ this . _worker . on ( "messageerror" , ( error ) => {
60
+ throw new Error ( "UNIMPLEMENTED" ) ;
61
+ } ) ;
62
+
63
+ this . _worker . on ( "error" , ( error ) => {
64
+ // TODO attach the error to the event somehow
65
+ const event = new Event ( "error" ) ;
66
+ this . dispatchEvent ( event ) ;
67
+ } ) ;
28
68
}
29
69
30
- if ( ! options || options . type !== "module" ) {
31
- throw new Error ( "Workers must use \`type: \"module\"\` " ) ;
70
+ set onmessage ( f : ( ) => void ) {
71
+ throw new Error ( "UNIMPLEMENTED " ) ;
32
72
}
33
73
34
- const code = `
35
- import("node:worker_threads")
36
- .then(({ workerData }) => {
37
- return import(workerData.polyfill)
38
- .then(() => import(workerData.url))
39
- })
40
- .catch((e) => {
41
- // TODO maybe it should send a message to the parent?
42
- console.error(e.stack);
43
- });
44
- ` ;
45
-
46
- this . _worker = new $worker . Worker ( code , {
47
- eval : true ,
48
- workerData : {
49
- url,
50
- polyfill : new URL ( "node-polyfill.js" , import . meta. url ) . href ,
51
- } ,
52
- } ) ;
53
-
54
- this . _worker . on ( "message" , ( data ) => {
55
- this . dispatchEvent ( new MessageEvent ( "message" , { data } ) ) ;
56
- } ) ;
57
-
58
- this . _worker . on ( "messageerror" , ( error ) => {
74
+ set onmessageerror ( f : ( ) => void ) {
59
75
throw new Error ( "UNIMPLEMENTED" ) ;
60
- } ) ;
61
-
62
- this . _worker . on ( "error" , ( error ) => {
63
- // TODO attach the error to the event somehow
64
- const event = new Event ( "error" ) ;
65
- this . dispatchEvent ( event ) ;
66
- } ) ;
67
- }
68
-
69
- set onmessage ( f : ( ) => void ) {
70
- throw new Error ( "UNIMPLEMENTED" ) ;
71
- }
72
-
73
- set onmessageerror ( f : ( ) => void ) {
74
- throw new Error ( "UNIMPLEMENTED" ) ;
75
- }
76
+ }
76
77
77
- set onerror ( f : ( ) => void ) {
78
- throw new Error ( "UNIMPLEMENTED" ) ;
79
- }
78
+ set onerror ( f : ( ) => void ) {
79
+ throw new Error ( "UNIMPLEMENTED" ) ;
80
+ }
80
81
81
- postMessage ( message : any , transfer : Array < Transferable > ) : void ;
82
- postMessage ( message : any , options ?: StructuredSerializeOptions | undefined ) : void ;
83
- postMessage ( value : any , transfer : any ) {
84
- this . _worker . postMessage ( value , transfer ) ;
85
- }
82
+ postMessage ( message : any , transfer : Array < Transferable > ) : void ;
83
+ postMessage ( message : any , options ?: StructuredSerializeOptions | undefined ) : void ;
84
+ postMessage ( value : any , transfer : any ) {
85
+ this . _worker . postMessage ( value , transfer ) ;
86
+ }
86
87
87
- terminate ( ) {
88
- this . _worker . terminate ( ) ;
89
- }
88
+ terminate ( ) {
89
+ this . _worker . terminate ( ) ;
90
+ }
90
91
91
- // This is Node-specific, it allows the process to exit
92
- // even if the Worker is still running.
93
- unref ( ) {
94
- this . _worker . unref ( ) ;
95
- }
96
- } ;
92
+ // This is Node-specific, it allows the process to exit
93
+ // even if the Worker is still running.
94
+ unref ( ) {
95
+ this . _worker . unref ( ) ;
96
+ }
97
+ } ;
98
+ }
97
99
98
100
99
101
if ( ! $worker . isMainThread ) {
0 commit comments