@gql.tada/cli-utils 1.7.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -62,87 +62,117 @@ exports.expose = function expose(i) {
62
62
  return function main(r) {
63
63
  var i;
64
64
  var s = 0;
65
- return (...o) => {
65
+ var o = 0;
66
+ return (...u) => {
66
67
  if (!i) {
67
68
  (i = new e.Worker(r, t)).unref();
68
69
  }
69
- var u = 0 | ++s;
70
- var d = [];
71
- var c = !1;
72
- var l = !1;
70
+ var d = i;
71
+ var c = 0 | ++o;
72
+ var l = [];
73
+ var f = !1;
73
74
  var v = !1;
74
- var f;
75
- var p;
75
+ var p = !1;
76
+ var k;
77
+ var g;
76
78
  function cleanup() {
77
- l = !0;
78
- f = void 0;
79
- p = void 0;
80
- i.removeListener("message", receiveMessage);
81
- i.removeListener("error", receiveError);
79
+ if (v) {
80
+ return;
81
+ }
82
+ v = !0;
83
+ k = void 0;
84
+ g = void 0;
85
+ d.removeListener("message", receiveMessage);
86
+ d.removeListener("error", receiveError);
87
+ d.removeListener("exit", receiveExit);
88
+ if (0 == --s) {
89
+ d.unref();
90
+ }
82
91
  }
83
92
  function sendMessage(e) {
84
- i.postMessage({
85
- id: u,
93
+ d.postMessage({
94
+ id: c,
86
95
  kind: e
87
96
  });
88
97
  }
89
- function receiveError(e) {
98
+ function fail(e) {
99
+ var r = g;
90
100
  cleanup();
91
- d.length = 1;
92
- d[0] = {
93
- id: u,
94
- kind: a.Throw,
95
- data: e
96
- };
101
+ if (r) {
102
+ r(e);
103
+ } else {
104
+ l.length = 1;
105
+ l[0] = {
106
+ id: c,
107
+ kind: a.Throw,
108
+ data: e
109
+ };
110
+ }
111
+ }
112
+ function receiveError(e) {
113
+ fail(e);
114
+ }
115
+ function receiveExit(e) {
116
+ if (v) {
117
+ return;
118
+ }
119
+ if (i === d) {
120
+ i = void 0;
121
+ }
122
+ fail(new Error(`Worker stopped unexpectedly with exit code ${e}`));
97
123
  }
98
124
  function receiveMessage(e) {
99
125
  var r = e && "object" == typeof e && "kind" in e ? e : null;
100
126
  if (!r) {
101
127
  return;
102
- } else if (p && r.kind === a.Throw) {
103
- p(getMessageData(r));
128
+ } else if (g && r.kind === a.Throw) {
129
+ g(getMessageData(r));
104
130
  cleanup();
105
- } else if (f && r.kind === a.Return) {
106
- f({
131
+ } else if (k && r.kind === a.Return) {
132
+ k({
107
133
  done: !0,
108
134
  value: getMessageData(r)
109
135
  });
110
136
  cleanup();
111
- } else if (f && r.kind === a.Next) {
112
- v = !1;
113
- f({
137
+ } else if (k && r.kind === a.Next) {
138
+ p = !1;
139
+ k({
114
140
  done: !1,
115
141
  value: getMessageData(r)
116
142
  });
117
143
  } else if (r.kind === a.Throw || r.kind === a.Return) {
118
- d.push(r);
144
+ l.push(r);
119
145
  cleanup();
120
146
  } else if (r.kind === a.Next) {
121
- d.push(r);
122
- v = !1;
147
+ l.push(r);
148
+ p = !1;
123
149
  }
124
150
  }
125
151
  return {
126
152
  async next() {
127
- if (!c) {
128
- c = !0;
129
- i.addListener("message", receiveMessage);
130
- i.addListener("error", receiveError);
131
- i.postMessage({
132
- id: u,
153
+ if (!f) {
154
+ f = !0;
155
+ if (0 == s++) {
156
+ d.ref();
157
+ }
158
+ d.addListener("message", receiveMessage);
159
+ d.addListener("error", receiveError);
160
+ d.addListener("exit", receiveExit);
161
+ d.postMessage({
162
+ id: c,
133
163
  kind: n.Start,
134
- data: o
164
+ data: u
135
165
  });
136
166
  }
137
- if (l && !d.length) {
167
+ if (v && !l.length) {
138
168
  return {
139
169
  done: !0
140
170
  };
141
- } else if (!l && !v && d.length <= 1) {
142
- v = !0;
171
+ } else if (!v && !p && l.length <= 1) {
172
+ p = !0;
143
173
  sendMessage(n.Pull);
144
174
  }
145
- var e = d.shift();
175
+ var e = l.shift();
146
176
  if (e && e.kind === a.Throw) {
147
177
  cleanup();
148
178
  throw getMessageData(e);
@@ -159,21 +189,21 @@ exports.expose = function expose(i) {
159
189
  };
160
190
  } else {
161
191
  return new Promise(((e, r) => {
162
- f = r => {
163
- f = void 0;
164
- p = void 0;
192
+ k = r => {
193
+ k = void 0;
194
+ g = void 0;
165
195
  e(r);
166
196
  };
167
- p = e => {
168
- f = void 0;
169
- p = void 0;
197
+ g = e => {
198
+ k = void 0;
199
+ g = void 0;
170
200
  r(e);
171
201
  };
172
202
  }));
173
203
  }
174
204
  },
175
205
  async return() {
176
- if (!l) {
206
+ if (!v) {
177
207
  cleanup();
178
208
  sendMessage(n.Close);
179
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index-chunk2.js","sources":["../../src/threads/index.ts"],"sourcesContent":["import type { WorkerOptions } from 'node:worker_threads';\nimport { Worker, isMainThread, parentPort, SHARE_ENV } from 'node:worker_threads';\n\nconst port = parentPort!;\nif (!isMainThread && !port) {\n throw new ReferenceError('Failed to receive parent message port');\n}\n\nconst enum MainMessageCodes {\n Start = 'START',\n Close = 'CLOSE',\n Pull = 'PULL',\n}\n\ninterface MainMessage {\n id?: number;\n kind: MainMessageCodes;\n data?: any;\n}\n\nconst enum ThreadMessageCodes {\n Next = 'NEXT',\n Throw = 'THROW',\n Return = 'RETURN',\n}\n\ninterface ThreadMessage {\n id?: number;\n kind: ThreadMessageCodes;\n data?: any;\n extra?: Record<string, unknown>;\n}\n\nconst workerOpts: WorkerOptions = {\n env: SHARE_ENV,\n stderr: false,\n stdout: false,\n stdin: false,\n};\n\nconst getMessageData = (message: ThreadMessage) => {\n const data = message.data;\n if (message.kind === ThreadMessageCodes.Throw) {\n return typeof data === 'object' && data && message.extra != null\n ? Object.assign(data, message.extra)\n : data;\n } else {\n return data;\n }\n};\n\nconst asyncIteratorSymbol = (): typeof Symbol.asyncIterator =>\n (typeof Symbol === 'function' && Symbol.asyncIterator) || ('@@asyncIterator' as any);\n\n/** Capture the stack above the caller */\nfunction captureStack(): NodeJS.CallSite[] {\n const _error: any = new Error();\n const _prepareStackTrace = Error.prepareStackTrace;\n try {\n let stack: NodeJS.CallSite[] | undefined;\n Error.prepareStackTrace = (_error, _stack) => (stack = _stack);\n Error.captureStackTrace(_error);\n if (!_error.stack) throw _error;\n return (stack && stack.slice(2)) || [];\n } finally {\n Error.prepareStackTrace = _prepareStackTrace;\n }\n}\n\nexport interface Generator<Args extends readonly any[], Next> {\n // TODO: Update to support for AsyncGenerator interface\n (...args: Args): AsyncIterableIterator<Next>;\n}\n\nfunction main<Args extends readonly any[], Next>(url: string | URL): Generator<Args, Next> {\n let worker: Worker;\n let ids = 0;\n return (...args: Args) => {\n if (!worker) {\n worker = new Worker(url, workerOpts);\n worker.unref();\n }\n\n const id = ++ids | 0;\n const buffer: ThreadMessage[] = [];\n\n let started = false;\n let ended = false;\n let pulled = false;\n let resolve: ((value: IteratorResult<Next>) => void) | void;\n let reject: ((error: any) => void) | void;\n\n function cleanup() {\n ended = true;\n resolve = undefined;\n reject = undefined;\n worker.removeListener('message', receiveMessage);\n worker.removeListener('error', receiveError);\n }\n\n function sendMessage(kind: MainMessageCodes) {\n worker.postMessage({ id, kind });\n }\n\n function receiveError(error: any) {\n cleanup();\n buffer.length = 1;\n buffer[0] = {\n id,\n kind: ThreadMessageCodes.Throw,\n data: error,\n };\n }\n\n function receiveMessage(data: unknown) {\n const message: ThreadMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as ThreadMessage) : null;\n if (!message) {\n return;\n } else if (reject && message.kind === ThreadMessageCodes.Throw) {\n reject(getMessageData(message));\n cleanup();\n } else if (resolve && message.kind === ThreadMessageCodes.Return) {\n resolve({ done: true, value: getMessageData(message) });\n cleanup();\n } else if (resolve && message.kind === ThreadMessageCodes.Next) {\n pulled = false;\n resolve({ done: false, value: getMessageData(message) });\n } else if (\n message.kind === ThreadMessageCodes.Throw ||\n message.kind === ThreadMessageCodes.Return\n ) {\n buffer.push(message);\n cleanup();\n } else if (message.kind === ThreadMessageCodes.Next) {\n buffer.push(message);\n pulled = false;\n }\n }\n\n return {\n async next() {\n if (!started) {\n started = true;\n worker.addListener('message', receiveMessage);\n worker.addListener('error', receiveError);\n worker.postMessage({\n id,\n kind: MainMessageCodes.Start,\n data: args,\n });\n }\n if (ended && !buffer.length) {\n return { done: true } as IteratorReturnResult<any>;\n } else if (!ended && !pulled && buffer.length <= 1) {\n pulled = true;\n sendMessage(MainMessageCodes.Pull);\n }\n const message = buffer.shift();\n if (message && message.kind === ThreadMessageCodes.Throw) {\n cleanup();\n throw getMessageData(message);\n } else if (message && message.kind === ThreadMessageCodes.Return) {\n cleanup();\n return { value: getMessageData(message), done: true };\n } else if (message && message.kind === ThreadMessageCodes.Next) {\n return { value: getMessageData(message), done: false };\n } else {\n return new Promise((_resolve, _reject) => {\n resolve = (value) => {\n resolve = undefined;\n reject = undefined;\n _resolve(value);\n };\n reject = (error) => {\n resolve = undefined;\n reject = undefined;\n _reject(error);\n };\n });\n }\n },\n async return() {\n if (!ended) {\n cleanup();\n sendMessage(MainMessageCodes.Close);\n }\n return { done: true } as IteratorReturnResult<any>;\n },\n [asyncIteratorSymbol()]() {\n return this;\n },\n };\n };\n}\n\nfunction thread<Args extends readonly any[], Next>(\n message: MainMessage,\n generator: Generator<Args, Next>\n): void {\n if (message.kind !== MainMessageCodes.Start) return;\n const id = message.id;\n const iterator = generator(...(message.data as any));\n\n let ended = false;\n let pulled = false;\n let looping = false;\n\n function cleanup() {\n ended = true;\n port.removeListener('message', receiveMessage);\n }\n\n async function sendMessage(kind: ThreadMessageCodes, data?: any) {\n try {\n const message: ThreadMessage = { id, kind, data };\n // NOTE: Copy error annotations to separate property\n if (kind === ThreadMessageCodes.Throw && typeof data === 'object' && data != null)\n message.extra = { ...data };\n port.postMessage(message);\n } catch (error) {\n cleanup();\n if (iterator.throw) {\n let result = await iterator.throw();\n if (result.done === false && iterator.return) {\n result = await iterator.return();\n sendMessage(ThreadMessageCodes.Return, result.value);\n } else {\n sendMessage(ThreadMessageCodes.Return, result.value);\n }\n } else {\n sendMessage(ThreadMessageCodes.Return);\n }\n }\n }\n\n async function receiveMessage(data: unknown) {\n const message: MainMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as MainMessage) : null;\n let next: IteratorResult<Next>;\n if (!message) {\n return;\n } else if (message.kind === MainMessageCodes.Close) {\n cleanup();\n if (iterator.return) iterator.return();\n } else if (message.kind === MainMessageCodes.Pull && looping) {\n pulled = true;\n } else if (message.kind === MainMessageCodes.Pull) {\n for (pulled = looping = true; pulled && !ended; ) {\n try {\n if ((next = await iterator.next()).done) {\n cleanup();\n if (iterator.return) next = await iterator.return();\n sendMessage(ThreadMessageCodes.Return, next.value);\n } else {\n pulled = false;\n sendMessage(ThreadMessageCodes.Next, next.value);\n }\n } catch (error) {\n cleanup();\n sendMessage(ThreadMessageCodes.Throw, error);\n }\n }\n looping = false;\n }\n }\n\n port.addListener('message', receiveMessage);\n}\n\nexport function expose<Args extends readonly any[], Return>(\n generator: Generator<Args, Return>\n): Generator<Args, Return> {\n if (isMainThread) {\n const call = captureStack()[0];\n const file = call && call.getFileName();\n if (!file) throw new ReferenceError('Captured stack trace is empty');\n const url = file.startsWith('file://') ? new URL(file) : file;\n return main(url);\n } else {\n port.addListener('message', (data) => {\n const message: MainMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as MainMessage) : null;\n if (message) thread(message, generator);\n });\n return generator;\n }\n}\n"],"names":["port","parentPort","isMainThread","ReferenceError","MainMessageCodes","ThreadMessageCodes","workerOpts","env","SHARE_ENV","stderr","stdout","stdin","getMessageData","message","data","kind","Throw","extra","Object","assign","asyncIteratorSymbol","Symbol","asyncIterator","expose","generator","call","captureStack","_error","Error","_prepareStackTrace","prepareStackTrace","stack","_stack","captureStackTrace","slice","file","getFileName","main","url","worker","ids","args","Worker","unref","id","buffer","started","ended","pulled","resolve","reject","cleanup","undefined","removeListener","receiveMessage","receiveError","sendMessage","postMessage","error","length","Return","done","value","Next","push","next","addListener","Start","Pull","shift","Promise","_resolve","_reject","return","Close","this","startsWith","URL","thread","iterator","looping","async","throw","result"],"mappings":"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"}
1
+ {"version":3,"file":"index-chunk2.js","sources":["../../src/threads/index.ts"],"sourcesContent":["import type { WorkerOptions } from 'node:worker_threads';\nimport { Worker, isMainThread, parentPort, SHARE_ENV } from 'node:worker_threads';\n\nconst port = parentPort!;\nif (!isMainThread && !port) {\n throw new ReferenceError('Failed to receive parent message port');\n}\n\nconst enum MainMessageCodes {\n Start = 'START',\n Close = 'CLOSE',\n Pull = 'PULL',\n}\n\ninterface MainMessage {\n id?: number;\n kind: MainMessageCodes;\n data?: any;\n}\n\nconst enum ThreadMessageCodes {\n Next = 'NEXT',\n Throw = 'THROW',\n Return = 'RETURN',\n}\n\ninterface ThreadMessage {\n id?: number;\n kind: ThreadMessageCodes;\n data?: any;\n extra?: Record<string, unknown>;\n}\n\nconst workerOpts: WorkerOptions = {\n env: SHARE_ENV,\n stderr: false,\n stdout: false,\n stdin: false,\n};\n\nconst getMessageData = (message: ThreadMessage) => {\n const data = message.data;\n if (message.kind === ThreadMessageCodes.Throw) {\n return typeof data === 'object' && data && message.extra != null\n ? Object.assign(data, message.extra)\n : data;\n } else {\n return data;\n }\n};\n\nconst asyncIteratorSymbol = (): typeof Symbol.asyncIterator =>\n (typeof Symbol === 'function' && Symbol.asyncIterator) || ('@@asyncIterator' as any);\n\n/** Capture the stack above the caller */\nfunction captureStack(): NodeJS.CallSite[] {\n const _error: any = new Error();\n const _prepareStackTrace = Error.prepareStackTrace;\n try {\n let stack: NodeJS.CallSite[] | undefined;\n Error.prepareStackTrace = (_error, _stack) => (stack = _stack);\n Error.captureStackTrace(_error);\n if (!_error.stack) throw _error;\n return (stack && stack.slice(2)) || [];\n } finally {\n Error.prepareStackTrace = _prepareStackTrace;\n }\n}\n\nexport interface Generator<Args extends readonly any[], Next> {\n // TODO: Update to support for AsyncGenerator interface\n (...args: Args): AsyncIterableIterator<Next>;\n}\n\nfunction main<Args extends readonly any[], Next>(url: string | URL): Generator<Args, Next> {\n let worker: Worker | undefined;\n let activeCalls = 0;\n let ids = 0;\n return (...args: Args) => {\n if (!worker) {\n worker = new Worker(url, workerOpts);\n worker.unref();\n }\n\n const currentWorker = worker;\n const id = ++ids | 0;\n const buffer: ThreadMessage[] = [];\n\n let started = false;\n let ended = false;\n let pulled = false;\n let resolve: ((value: IteratorResult<Next>) => void) | void;\n let reject: ((error: any) => void) | void;\n\n function cleanup() {\n if (ended) return;\n ended = true;\n resolve = undefined;\n reject = undefined;\n currentWorker.removeListener('message', receiveMessage);\n currentWorker.removeListener('error', receiveError);\n currentWorker.removeListener('exit', receiveExit);\n if (--activeCalls === 0) currentWorker.unref();\n }\n\n function sendMessage(kind: MainMessageCodes) {\n currentWorker.postMessage({ id, kind });\n }\n\n function fail(error: any) {\n const pendingReject = reject;\n cleanup();\n if (pendingReject) {\n pendingReject(error);\n } else {\n buffer.length = 1;\n buffer[0] = {\n id,\n kind: ThreadMessageCodes.Throw,\n data: error,\n };\n }\n }\n\n function receiveError(error: any) {\n fail(error);\n }\n\n function receiveExit(code: number) {\n if (ended) return;\n if (worker === currentWorker) worker = undefined;\n fail(new Error(`Worker stopped unexpectedly with exit code ${code}`));\n }\n\n function receiveMessage(data: unknown) {\n const message: ThreadMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as ThreadMessage) : null;\n if (!message) {\n return;\n } else if (reject && message.kind === ThreadMessageCodes.Throw) {\n reject(getMessageData(message));\n cleanup();\n } else if (resolve && message.kind === ThreadMessageCodes.Return) {\n resolve({ done: true, value: getMessageData(message) });\n cleanup();\n } else if (resolve && message.kind === ThreadMessageCodes.Next) {\n pulled = false;\n resolve({ done: false, value: getMessageData(message) });\n } else if (\n message.kind === ThreadMessageCodes.Throw ||\n message.kind === ThreadMessageCodes.Return\n ) {\n buffer.push(message);\n cleanup();\n } else if (message.kind === ThreadMessageCodes.Next) {\n buffer.push(message);\n pulled = false;\n }\n }\n\n return {\n async next() {\n if (!started) {\n started = true;\n if (activeCalls++ === 0) currentWorker.ref();\n currentWorker.addListener('message', receiveMessage);\n currentWorker.addListener('error', receiveError);\n currentWorker.addListener('exit', receiveExit);\n currentWorker.postMessage({\n id,\n kind: MainMessageCodes.Start,\n data: args,\n });\n }\n if (ended && !buffer.length) {\n return { done: true } as IteratorReturnResult<any>;\n } else if (!ended && !pulled && buffer.length <= 1) {\n pulled = true;\n sendMessage(MainMessageCodes.Pull);\n }\n const message = buffer.shift();\n if (message && message.kind === ThreadMessageCodes.Throw) {\n cleanup();\n throw getMessageData(message);\n } else if (message && message.kind === ThreadMessageCodes.Return) {\n cleanup();\n return { value: getMessageData(message), done: true };\n } else if (message && message.kind === ThreadMessageCodes.Next) {\n return { value: getMessageData(message), done: false };\n } else {\n return new Promise((_resolve, _reject) => {\n resolve = (value) => {\n resolve = undefined;\n reject = undefined;\n _resolve(value);\n };\n reject = (error) => {\n resolve = undefined;\n reject = undefined;\n _reject(error);\n };\n });\n }\n },\n async return() {\n if (!ended) {\n cleanup();\n sendMessage(MainMessageCodes.Close);\n }\n return { done: true } as IteratorReturnResult<any>;\n },\n [asyncIteratorSymbol()]() {\n return this;\n },\n };\n };\n}\n\nfunction thread<Args extends readonly any[], Next>(\n message: MainMessage,\n generator: Generator<Args, Next>\n): void {\n if (message.kind !== MainMessageCodes.Start) return;\n const id = message.id;\n const iterator = generator(...(message.data as any));\n\n let ended = false;\n let pulled = false;\n let looping = false;\n\n function cleanup() {\n ended = true;\n port.removeListener('message', receiveMessage);\n }\n\n async function sendMessage(kind: ThreadMessageCodes, data?: any) {\n try {\n const message: ThreadMessage = { id, kind, data };\n // NOTE: Copy error annotations to separate property\n if (kind === ThreadMessageCodes.Throw && typeof data === 'object' && data != null)\n message.extra = { ...data };\n port.postMessage(message);\n } catch (error) {\n cleanup();\n if (iterator.throw) {\n let result = await iterator.throw();\n if (result.done === false && iterator.return) {\n result = await iterator.return();\n sendMessage(ThreadMessageCodes.Return, result.value);\n } else {\n sendMessage(ThreadMessageCodes.Return, result.value);\n }\n } else {\n sendMessage(ThreadMessageCodes.Return);\n }\n }\n }\n\n async function receiveMessage(data: unknown) {\n const message: MainMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as MainMessage) : null;\n let next: IteratorResult<Next>;\n if (!message) {\n return;\n } else if (message.kind === MainMessageCodes.Close) {\n cleanup();\n if (iterator.return) iterator.return();\n } else if (message.kind === MainMessageCodes.Pull && looping) {\n pulled = true;\n } else if (message.kind === MainMessageCodes.Pull) {\n for (pulled = looping = true; pulled && !ended; ) {\n try {\n if ((next = await iterator.next()).done) {\n cleanup();\n if (iterator.return) next = await iterator.return();\n sendMessage(ThreadMessageCodes.Return, next.value);\n } else {\n pulled = false;\n sendMessage(ThreadMessageCodes.Next, next.value);\n }\n } catch (error) {\n cleanup();\n sendMessage(ThreadMessageCodes.Throw, error);\n }\n }\n looping = false;\n }\n }\n\n port.addListener('message', receiveMessage);\n}\n\nexport function expose<Args extends readonly any[], Return>(\n generator: Generator<Args, Return>\n): Generator<Args, Return> {\n if (isMainThread) {\n const call = captureStack()[0];\n const file = call && call.getFileName();\n if (!file) throw new ReferenceError('Captured stack trace is empty');\n const url = file.startsWith('file://') ? new URL(file) : file;\n return main(url);\n } else {\n port.addListener('message', (data) => {\n const message: MainMessage | null =\n data && typeof data === 'object' && 'kind' in data ? (data as MainMessage) : null;\n if (message) thread(message, generator);\n });\n return generator;\n }\n}\n"],"names":["port","parentPort","isMainThread","ReferenceError","MainMessageCodes","ThreadMessageCodes","workerOpts","env","SHARE_ENV","stderr","stdout","stdin","getMessageData","message","data","kind","Throw","extra","Object","assign","asyncIteratorSymbol","Symbol","asyncIterator","expose","generator","call","captureStack","_error","Error","_prepareStackTrace","prepareStackTrace","stack","_stack","captureStackTrace","slice","file","getFileName","main","url","worker","activeCalls","ids","args","Worker","unref","currentWorker","id","buffer","started","ended","pulled","resolve","reject","cleanup","undefined","removeListener","receiveMessage","receiveError","receiveExit","sendMessage","postMessage","fail","error","pendingReject","length","code","Return","done","value","Next","push","next","ref","addListener","Start","Pull","shift","Promise","_resolve","_reject","return","Close","this","startsWith","URL","thread","iterator","looping","async","throw","result"],"mappings":"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"}
@@ -1,27 +1,27 @@
1
- import { isMainThread as e, parentPort as r, Worker as n, SHARE_ENV as a } from "node:worker_threads";
1
+ import { isMainThread as e, parentPort as r, Worker as n, SHARE_ENV as t } from "node:worker_threads";
2
2
 
3
- var t = r;
3
+ var a = r;
4
4
 
5
- if (!e && !t) {
5
+ if (!e && !a) {
6
6
  throw new ReferenceError("Failed to receive parent message port");
7
7
  }
8
8
 
9
- var s = function(e) {
9
+ var i = function(e) {
10
10
  e.Start = "START";
11
11
  e.Close = "CLOSE";
12
12
  e.Pull = "PULL";
13
13
  return e;
14
- }(s || {});
14
+ }(i || {});
15
15
 
16
- var i = function(e) {
16
+ var s = function(e) {
17
17
  e.Next = "NEXT";
18
18
  e.Throw = "THROW";
19
19
  e.Return = "RETURN";
20
20
  return e;
21
- }(i || {});
21
+ }(s || {});
22
22
 
23
23
  var o = {
24
- env: a,
24
+ env: t,
25
25
  stderr: !1,
26
26
  stdout: !1,
27
27
  stdin: !1
@@ -29,7 +29,7 @@ var o = {
29
29
 
30
30
  var getMessageData = e => {
31
31
  var r = e.data;
32
- if (e.kind === i.Throw) {
32
+ if (e.kind === s.Throw) {
33
33
  return "object" == typeof r && r && null != e.extra ? Object.assign(r, e.extra) : r;
34
34
  } else {
35
35
  return r;
@@ -40,7 +40,7 @@ var asyncIteratorSymbol = () => "function" == typeof Symbol && Symbol.asyncItera
40
40
 
41
41
  function expose(r) {
42
42
  if (e) {
43
- var a = function captureStack() {
43
+ var t = function captureStack() {
44
44
  var e = new Error;
45
45
  var r = Error.prepareStackTrace;
46
46
  try {
@@ -55,127 +55,157 @@ function expose(r) {
55
55
  Error.prepareStackTrace = r;
56
56
  }
57
57
  }()[0];
58
- var u = a && a.getFileName();
58
+ var u = t && t.getFileName();
59
59
  if (!u) {
60
60
  throw new ReferenceError("Captured stack trace is empty");
61
61
  }
62
62
  return function main(e) {
63
63
  var r;
64
+ var t = 0;
64
65
  var a = 0;
65
- return (...t) => {
66
+ return (...u) => {
66
67
  if (!r) {
67
68
  (r = new n(e, o)).unref();
68
69
  }
69
- var u = 0 | ++a;
70
- var d = [];
71
- var c = !1;
72
- var l = !1;
70
+ var c = r;
71
+ var d = 0 | ++a;
72
+ var l = [];
73
+ var f = !1;
73
74
  var v = !1;
74
- var f;
75
- var p;
75
+ var p = !1;
76
+ var g;
77
+ var k;
76
78
  function cleanup() {
77
- l = !0;
78
- f = void 0;
79
- p = void 0;
80
- r.removeListener("message", receiveMessage);
81
- r.removeListener("error", receiveError);
79
+ if (v) {
80
+ return;
81
+ }
82
+ v = !0;
83
+ g = void 0;
84
+ k = void 0;
85
+ c.removeListener("message", receiveMessage);
86
+ c.removeListener("error", receiveError);
87
+ c.removeListener("exit", receiveExit);
88
+ if (0 == --t) {
89
+ c.unref();
90
+ }
82
91
  }
83
92
  function sendMessage(e) {
84
- r.postMessage({
85
- id: u,
93
+ c.postMessage({
94
+ id: d,
86
95
  kind: e
87
96
  });
88
97
  }
89
- function receiveError(e) {
98
+ function fail(e) {
99
+ var r = k;
90
100
  cleanup();
91
- d.length = 1;
92
- d[0] = {
93
- id: u,
94
- kind: i.Throw,
95
- data: e
96
- };
101
+ if (r) {
102
+ r(e);
103
+ } else {
104
+ l.length = 1;
105
+ l[0] = {
106
+ id: d,
107
+ kind: s.Throw,
108
+ data: e
109
+ };
110
+ }
111
+ }
112
+ function receiveError(e) {
113
+ fail(e);
114
+ }
115
+ function receiveExit(e) {
116
+ if (v) {
117
+ return;
118
+ }
119
+ if (r === c) {
120
+ r = void 0;
121
+ }
122
+ fail(new Error(`Worker stopped unexpectedly with exit code ${e}`));
97
123
  }
98
124
  function receiveMessage(e) {
99
125
  var r = e && "object" == typeof e && "kind" in e ? e : null;
100
126
  if (!r) {
101
127
  return;
102
- } else if (p && r.kind === i.Throw) {
103
- p(getMessageData(r));
128
+ } else if (k && r.kind === s.Throw) {
129
+ k(getMessageData(r));
104
130
  cleanup();
105
- } else if (f && r.kind === i.Return) {
106
- f({
131
+ } else if (g && r.kind === s.Return) {
132
+ g({
107
133
  done: !0,
108
134
  value: getMessageData(r)
109
135
  });
110
136
  cleanup();
111
- } else if (f && r.kind === i.Next) {
112
- v = !1;
113
- f({
137
+ } else if (g && r.kind === s.Next) {
138
+ p = !1;
139
+ g({
114
140
  done: !1,
115
141
  value: getMessageData(r)
116
142
  });
117
- } else if (r.kind === i.Throw || r.kind === i.Return) {
118
- d.push(r);
143
+ } else if (r.kind === s.Throw || r.kind === s.Return) {
144
+ l.push(r);
119
145
  cleanup();
120
- } else if (r.kind === i.Next) {
121
- d.push(r);
122
- v = !1;
146
+ } else if (r.kind === s.Next) {
147
+ l.push(r);
148
+ p = !1;
123
149
  }
124
150
  }
125
151
  return {
126
152
  async next() {
127
- if (!c) {
128
- c = !0;
129
- r.addListener("message", receiveMessage);
130
- r.addListener("error", receiveError);
131
- r.postMessage({
132
- id: u,
133
- kind: s.Start,
134
- data: t
153
+ if (!f) {
154
+ f = !0;
155
+ if (0 == t++) {
156
+ c.ref();
157
+ }
158
+ c.addListener("message", receiveMessage);
159
+ c.addListener("error", receiveError);
160
+ c.addListener("exit", receiveExit);
161
+ c.postMessage({
162
+ id: d,
163
+ kind: i.Start,
164
+ data: u
135
165
  });
136
166
  }
137
- if (l && !d.length) {
167
+ if (v && !l.length) {
138
168
  return {
139
169
  done: !0
140
170
  };
141
- } else if (!l && !v && d.length <= 1) {
142
- v = !0;
143
- sendMessage(s.Pull);
171
+ } else if (!v && !p && l.length <= 1) {
172
+ p = !0;
173
+ sendMessage(i.Pull);
144
174
  }
145
- var e = d.shift();
146
- if (e && e.kind === i.Throw) {
175
+ var e = l.shift();
176
+ if (e && e.kind === s.Throw) {
147
177
  cleanup();
148
178
  throw getMessageData(e);
149
- } else if (e && e.kind === i.Return) {
179
+ } else if (e && e.kind === s.Return) {
150
180
  cleanup();
151
181
  return {
152
182
  value: getMessageData(e),
153
183
  done: !0
154
184
  };
155
- } else if (e && e.kind === i.Next) {
185
+ } else if (e && e.kind === s.Next) {
156
186
  return {
157
187
  value: getMessageData(e),
158
188
  done: !1
159
189
  };
160
190
  } else {
161
191
  return new Promise(((e, r) => {
162
- f = r => {
163
- f = void 0;
164
- p = void 0;
192
+ g = r => {
193
+ g = void 0;
194
+ k = void 0;
165
195
  e(r);
166
196
  };
167
- p = e => {
168
- f = void 0;
169
- p = void 0;
197
+ k = e => {
198
+ g = void 0;
199
+ k = void 0;
170
200
  r(e);
171
201
  };
172
202
  }));
173
203
  }
174
204
  },
175
205
  async return() {
176
- if (!l) {
206
+ if (!v) {
177
207
  cleanup();
178
- sendMessage(s.Close);
208
+ sendMessage(i.Close);
179
209
  }
180
210
  return {
181
211
  done: !0
@@ -188,47 +218,47 @@ function expose(r) {
188
218
  };
189
219
  }(u.startsWith("file://") ? new URL(u) : u);
190
220
  } else {
191
- t.addListener("message", (e => {
221
+ a.addListener("message", (e => {
192
222
  var n = e && "object" == typeof e && "kind" in e ? e : null;
193
223
  if (n) {
194
224
  !function thread(e, r) {
195
- if (e.kind !== s.Start) {
225
+ if (e.kind !== i.Start) {
196
226
  return;
197
227
  }
198
228
  var n = e.id;
199
- var a = r(...e.data);
229
+ var t = r(...e.data);
200
230
  var o = !1;
201
231
  var u = !1;
202
- var d = !1;
232
+ var c = !1;
203
233
  function cleanup() {
204
234
  o = !0;
205
- t.removeListener("message", receiveMessage);
235
+ a.removeListener("message", receiveMessage);
206
236
  }
207
237
  async function sendMessage(e, r) {
208
238
  try {
209
- var s = {
239
+ var i = {
210
240
  id: n,
211
241
  kind: e,
212
242
  data: r
213
243
  };
214
- if (e === i.Throw && "object" == typeof r && null != r) {
215
- s.extra = {
244
+ if (e === s.Throw && "object" == typeof r && null != r) {
245
+ i.extra = {
216
246
  ...r
217
247
  };
218
248
  }
219
- t.postMessage(s);
249
+ a.postMessage(i);
220
250
  } catch (e) {
221
251
  cleanup();
222
- if (a.throw) {
223
- var o = await a.throw();
224
- if (!1 === o.done && a.return) {
225
- o = await a.return();
226
- sendMessage(i.Return, o.value);
252
+ if (t.throw) {
253
+ var o = await t.throw();
254
+ if (!1 === o.done && t.return) {
255
+ o = await t.return();
256
+ sendMessage(s.Return, o.value);
227
257
  } else {
228
- sendMessage(i.Return, o.value);
258
+ sendMessage(s.Return, o.value);
229
259
  }
230
260
  } else {
231
- sendMessage(i.Return);
261
+ sendMessage(s.Return);
232
262
  }
233
263
  }
234
264
  }
@@ -237,35 +267,35 @@ function expose(r) {
237
267
  var n;
238
268
  if (!r) {
239
269
  return;
240
- } else if (r.kind === s.Close) {
270
+ } else if (r.kind === i.Close) {
241
271
  cleanup();
242
- if (a.return) {
243
- a.return();
272
+ if (t.return) {
273
+ t.return();
244
274
  }
245
- } else if (r.kind === s.Pull && d) {
275
+ } else if (r.kind === i.Pull && c) {
246
276
  u = !0;
247
- } else if (r.kind === s.Pull) {
248
- for (u = d = !0; u && !o; ) {
277
+ } else if (r.kind === i.Pull) {
278
+ for (u = c = !0; u && !o; ) {
249
279
  try {
250
- if ((n = await a.next()).done) {
280
+ if ((n = await t.next()).done) {
251
281
  cleanup();
252
- if (a.return) {
253
- n = await a.return();
282
+ if (t.return) {
283
+ n = await t.return();
254
284
  }
255
- sendMessage(i.Return, n.value);
285
+ sendMessage(s.Return, n.value);
256
286
  } else {
257
287
  u = !1;
258
- sendMessage(i.Next, n.value);
288
+ sendMessage(s.Next, n.value);
259
289
  }
260
290
  } catch (e) {
261
291
  cleanup();
262
- sendMessage(i.Throw, e);
292
+ sendMessage(s.Throw, e);
263
293
  }
264
294
  }
265
- d = !1;
295
+ c = !1;
266
296
  }
267
297
  }
268
- t.addListener("message", receiveMessage);
298
+ a.addListener("message", receiveMessage);
269
299
  }(n, r);
270
300
  }
271
301
  }));