@powerhousedao/reactor 6.1.0-dev.1 → 6.1.0-dev.10

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.
Files changed (37) hide show
  1. package/dist/build-worker-executor-DDVXB921.js +83 -0
  2. package/dist/build-worker-executor-DDVXB921.js.map +1 -0
  3. package/dist/document-indexer-B2iLRB0o.js +917 -0
  4. package/dist/document-indexer-B2iLRB0o.js.map +1 -0
  5. package/dist/drive-container-types-BNpMlgT_.js +2964 -0
  6. package/dist/drive-container-types-BNpMlgT_.js.map +1 -0
  7. package/dist/entry.d.ts +1 -0
  8. package/dist/entry.js +313 -0
  9. package/dist/entry.js.map +1 -0
  10. package/dist/error-info-Cpu4OY3o.js +62 -0
  11. package/dist/error-info-Cpu4OY3o.js.map +1 -0
  12. package/dist/errors-D3S6Eysd.js +56 -0
  13. package/dist/errors-D3S6Eysd.js.map +1 -0
  14. package/dist/forwarding-logger-BBkMSxuJ.js +85 -0
  15. package/dist/forwarding-logger-BBkMSxuJ.js.map +1 -0
  16. package/dist/index.d.ts +991 -75
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +900 -3889
  19. package/dist/index.js.map +1 -1
  20. package/dist/projection-entry.d.ts +1 -0
  21. package/dist/projection-entry.js +406 -0
  22. package/dist/projection-entry.js.map +1 -0
  23. package/dist/projection-shard-manager-_c7orNo5.js +313 -0
  24. package/dist/projection-shard-manager-_c7orNo5.js.map +1 -0
  25. package/dist/projection-worker-wI4PwcV2.js +13 -0
  26. package/dist/projection-worker-wI4PwcV2.js.map +1 -0
  27. package/dist/transport-ByGviWdZ.js +33 -0
  28. package/dist/transport-ByGviWdZ.js.map +1 -0
  29. package/dist/transport-CuogVKN_.js +23 -0
  30. package/dist/transport-CuogVKN_.js.map +1 -0
  31. package/dist/types-CxSpmNGK.js +32 -0
  32. package/dist/types-CxSpmNGK.js.map +1 -0
  33. package/dist/worker-SUoDhurA.js +22 -0
  34. package/dist/worker-SUoDhurA.js.map +1 -0
  35. package/dist/worker-handle-B1w03nRA.js +383 -0
  36. package/dist/worker-handle-B1w03nRA.js.map +1 -0
  37. package/package.json +6 -4
@@ -0,0 +1,383 @@
1
+ import { a as WorkerLoadModelFailedError, i as WorkerInitFailedError, n as WorkerBusyError, o as WorkerShutdownTimeoutError, r as WorkerExitedError, t as WorkerAbortTimeoutError } from "./errors-D3S6Eysd.js";
2
+ import { t as fromErrorInfo } from "./error-info-Cpu4OY3o.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/executor/worker/worker-handle.ts
5
+ const DEFAULT_ABORT_GRACE_MS = 5e3;
6
+ const DEFAULT_SHUTDOWN_GRACE_MS = 5e3;
7
+ var WorkerHandle = class {
8
+ workerId;
9
+ index;
10
+ transport;
11
+ initPayload;
12
+ logger;
13
+ abortGraceMs;
14
+ defaultShutdownGraceMs;
15
+ poolInstrumentation;
16
+ pending = /* @__PURE__ */ new Map();
17
+ inFlight = null;
18
+ phase = "fresh";
19
+ lastExitError = null;
20
+ lastCorrelationId = null;
21
+ abortTimer = null;
22
+ lastHeartbeatAt = null;
23
+ lastMetrics = null;
24
+ onMessage;
25
+ onError;
26
+ onExit;
27
+ constructor(options) {
28
+ this.workerId = options.workerId;
29
+ this.index = options.index;
30
+ this.transport = options.transport;
31
+ this.initPayload = options.initPayload;
32
+ this.logger = options.logger;
33
+ this.abortGraceMs = options.abortGraceMs ?? DEFAULT_ABORT_GRACE_MS;
34
+ this.defaultShutdownGraceMs = options.defaultShutdownGraceMs ?? DEFAULT_SHUTDOWN_GRACE_MS;
35
+ this.poolInstrumentation = options.poolInstrumentation;
36
+ this.onMessage = (msg) => this.handleMessage(msg);
37
+ this.onError = (err) => this.handleTransportError(err);
38
+ this.onExit = (code) => this.handleExit(code);
39
+ this.transport.on("message", this.onMessage);
40
+ this.transport.on("error", this.onError);
41
+ this.transport.on("exit", this.onExit);
42
+ }
43
+ async start() {
44
+ if (this.phase !== "fresh") throw new WorkerInitFailedError(this.workerId, `cannot start worker in phase ${this.phase}`);
45
+ this.phase = "starting";
46
+ const correlationId = this.nextCorrelationId();
47
+ const ready = new Promise((resolve, reject) => {
48
+ this.pending.set(correlationId, {
49
+ kind: "init",
50
+ resolve,
51
+ reject
52
+ });
53
+ });
54
+ this.transport.postMessage({
55
+ type: "init",
56
+ correlationId,
57
+ workerId: this.workerId,
58
+ poolConfig: this.initPayload.poolConfig,
59
+ db: this.initPayload.db,
60
+ signatureVerifier: this.initPayload.signatureVerifier,
61
+ models: this.initPayload.models
62
+ });
63
+ await ready;
64
+ this.phase = "ready";
65
+ }
66
+ execute(job, signal) {
67
+ if (this.phase === "terminated") return Promise.reject(this.lastExitError ?? new WorkerExitedError(this.workerId, -1, this.lastCorrelationId));
68
+ if (this.phase !== "ready") return Promise.reject(new WorkerInitFailedError(this.workerId, `worker not ready (phase=${this.phase})`));
69
+ if (this.inFlight !== null) return Promise.reject(new WorkerBusyError(this.workerId, job.id));
70
+ const correlationId = this.nextCorrelationId();
71
+ this.lastCorrelationId = correlationId;
72
+ this.inFlight = {
73
+ correlationId,
74
+ jobId: job.id
75
+ };
76
+ let abortListener = null;
77
+ const detachSignal = () => {
78
+ if (signal && abortListener) {
79
+ signal.removeEventListener("abort", abortListener);
80
+ abortListener = null;
81
+ }
82
+ };
83
+ const promise = new Promise((resolve, reject) => {
84
+ this.pending.set(correlationId, {
85
+ kind: "execute",
86
+ jobId: job.id,
87
+ resolve: (outcome) => {
88
+ detachSignal();
89
+ resolve(outcome);
90
+ },
91
+ reject: (err) => {
92
+ detachSignal();
93
+ reject(err);
94
+ }
95
+ });
96
+ });
97
+ if (signal) if (signal.aborted) this.abort(correlationId, "aborted before dispatch");
98
+ else {
99
+ abortListener = () => this.abort(correlationId, "caller signal");
100
+ signal.addEventListener("abort", abortListener, { once: true });
101
+ }
102
+ this.transport.postMessage({
103
+ type: "execute",
104
+ correlationId,
105
+ job
106
+ });
107
+ return promise;
108
+ }
109
+ abort(correlationId, reason) {
110
+ if (this.phase === "terminated") return;
111
+ if (!this.inFlight || this.inFlight.correlationId !== correlationId) return;
112
+ if (this.abortTimer) return;
113
+ this.transport.postMessage({
114
+ type: "abort",
115
+ correlationId: this.nextCorrelationId(),
116
+ targetCorrelationId: correlationId,
117
+ reason
118
+ });
119
+ this.abortTimer = setTimeout(() => {
120
+ this.abortTimer = null;
121
+ const entry = this.pending.get(correlationId);
122
+ if (!entry || entry.kind !== "execute") return;
123
+ const err = new WorkerAbortTimeoutError(this.workerId, correlationId, this.abortGraceMs);
124
+ this.failPending(correlationId, err);
125
+ this.inFlight = null;
126
+ this.forceTerminate(err);
127
+ }, this.abortGraceMs);
128
+ }
129
+ async shutdown(graceful, graceMs) {
130
+ if (this.phase === "terminated") return;
131
+ if (!graceful) {
132
+ this.phase = "shutting-down";
133
+ await this.forceTerminate(null);
134
+ return;
135
+ }
136
+ const effectiveGrace = graceMs ?? this.defaultShutdownGraceMs;
137
+ this.phase = "shutting-down";
138
+ const correlationId = this.nextCorrelationId();
139
+ const drained = new Promise((resolve, reject) => {
140
+ this.pending.set(correlationId, {
141
+ kind: "shutdown",
142
+ resolve,
143
+ reject
144
+ });
145
+ });
146
+ this.transport.postMessage({
147
+ type: "shutdown",
148
+ correlationId,
149
+ graceMs: effectiveGrace
150
+ });
151
+ let timer;
152
+ const timeout = new Promise((_, reject) => {
153
+ timer = setTimeout(() => {
154
+ reject(new WorkerShutdownTimeoutError(this.workerId, effectiveGrace));
155
+ }, effectiveGrace);
156
+ });
157
+ try {
158
+ await Promise.race([drained, timeout]);
159
+ } catch (err) {
160
+ this.logger.warn(`worker ${this.workerId} shutdown timed out after ${effectiveGrace}ms`, err);
161
+ } finally {
162
+ clearTimeout(timer);
163
+ }
164
+ await this.forceTerminate(null);
165
+ }
166
+ loadModel(entry, signal) {
167
+ if (this.phase === "terminated") return Promise.reject(this.lastExitError ?? new WorkerExitedError(this.workerId, -1, this.lastCorrelationId));
168
+ if (this.phase !== "ready") return Promise.reject(new WorkerInitFailedError(this.workerId, `worker not ready (phase=${this.phase})`));
169
+ const correlationId = this.nextCorrelationId();
170
+ let abortListener = null;
171
+ const detachSignal = () => {
172
+ if (signal && abortListener) {
173
+ signal.removeEventListener("abort", abortListener);
174
+ abortListener = null;
175
+ }
176
+ };
177
+ const promise = new Promise((resolve, reject) => {
178
+ this.pending.set(correlationId, {
179
+ kind: "load-model",
180
+ documentType: entry.documentType,
181
+ version: entry.version,
182
+ resolve: () => {
183
+ detachSignal();
184
+ resolve();
185
+ },
186
+ reject: (err) => {
187
+ detachSignal();
188
+ reject(err);
189
+ }
190
+ });
191
+ });
192
+ if (signal) {
193
+ if (signal.aborted) {
194
+ this.failPending(correlationId, new WorkerLoadModelFailedError(this.workerId, entry.documentType, entry.version, "aborted before dispatch"));
195
+ return promise;
196
+ }
197
+ abortListener = () => {
198
+ this.failPending(correlationId, new WorkerLoadModelFailedError(this.workerId, entry.documentType, entry.version, "caller signal"));
199
+ };
200
+ signal.addEventListener("abort", abortListener, { once: true });
201
+ }
202
+ this.transport.postMessage({
203
+ type: "load-model",
204
+ correlationId,
205
+ model: entry
206
+ });
207
+ return promise;
208
+ }
209
+ isIdle() {
210
+ return this.inFlight === null && this.phase === "ready";
211
+ }
212
+ getInFlight() {
213
+ if (!this.inFlight) return null;
214
+ return {
215
+ correlationId: this.inFlight.correlationId,
216
+ jobId: this.inFlight.jobId
217
+ };
218
+ }
219
+ nextCorrelationId() {
220
+ return randomUUID();
221
+ }
222
+ handleMessage(msg) {
223
+ switch (msg.type) {
224
+ case "ready":
225
+ this.handleReady(msg.correlationId);
226
+ return;
227
+ case "result":
228
+ this.handleResult(msg);
229
+ return;
230
+ case "model-loaded":
231
+ this.handleModelLoaded(msg);
232
+ return;
233
+ case "model-load-failed":
234
+ this.handleModelLoadFailed(msg);
235
+ return;
236
+ case "log":
237
+ this.handleLog(msg);
238
+ return;
239
+ case "heartbeat":
240
+ this.handleHeartbeat(msg);
241
+ return;
242
+ case "metrics":
243
+ this.handleMetrics(msg);
244
+ return;
245
+ case "pool-acquire-samples":
246
+ this.handlePoolAcquireSamples(msg);
247
+ return;
248
+ default:
249
+ }
250
+ }
251
+ handlePoolAcquireSamples(msg) {
252
+ if (!this.poolInstrumentation) return;
253
+ this.poolInstrumentation.updateStats({
254
+ size: msg.size,
255
+ idle: msg.idle,
256
+ waiting: msg.waiting
257
+ });
258
+ this.poolInstrumentation.pushSamples(msg.durations);
259
+ }
260
+ handleReady(correlationId) {
261
+ const entry = this.pending.get(correlationId);
262
+ if (!entry || entry.kind !== "init") return;
263
+ this.pending.delete(correlationId);
264
+ entry.resolve();
265
+ }
266
+ handleResult(msg) {
267
+ const entry = this.pending.get(msg.correlationId);
268
+ if (!entry || entry.kind !== "execute") return;
269
+ this.pending.delete(msg.correlationId);
270
+ if (this.inFlight?.correlationId === msg.correlationId) this.inFlight = null;
271
+ if (this.abortTimer) {
272
+ clearTimeout(this.abortTimer);
273
+ this.abortTimer = null;
274
+ }
275
+ const outcome = msg.error ? { result: {
276
+ ...msg.result,
277
+ success: false,
278
+ error: fromErrorInfo(msg.error)
279
+ } } : {
280
+ result: msg.result,
281
+ writeReady: msg.writeReady
282
+ };
283
+ entry.resolve(outcome);
284
+ if (this.phase === "shutting-down") {
285
+ const shutdownEntry = [...this.pending.values()].find((e) => e.kind === "shutdown");
286
+ if (shutdownEntry) shutdownEntry.resolve();
287
+ }
288
+ }
289
+ handleModelLoaded(msg) {
290
+ const entry = this.pending.get(msg.correlationId);
291
+ if (!entry || entry.kind !== "load-model") return;
292
+ this.pending.delete(msg.correlationId);
293
+ entry.resolve();
294
+ }
295
+ handleModelLoadFailed(msg) {
296
+ const entry = this.pending.get(msg.correlationId);
297
+ if (!entry || entry.kind !== "load-model") return;
298
+ this.pending.delete(msg.correlationId);
299
+ entry.reject(new WorkerLoadModelFailedError(this.workerId, msg.documentType, msg.version, msg.error.message, { cause: fromErrorInfo(msg.error) }));
300
+ }
301
+ handleLog(msg) {
302
+ const args = msg.args;
303
+ switch (msg.level) {
304
+ case "debug":
305
+ this.logger.debug(msg.message, ...args);
306
+ return;
307
+ case "info":
308
+ this.logger.info(msg.message, ...args);
309
+ return;
310
+ case "warn":
311
+ this.logger.warn(msg.message, ...args);
312
+ return;
313
+ case "error":
314
+ this.logger.error(msg.message, ...args);
315
+ return;
316
+ default: msg.level;
317
+ }
318
+ }
319
+ handleHeartbeat(msg) {
320
+ this.lastHeartbeatAt = msg.timestamp;
321
+ }
322
+ handleMetrics(msg) {
323
+ this.lastMetrics = {
324
+ counters: msg.counters,
325
+ gauges: msg.gauges,
326
+ timestamp: msg.timestamp
327
+ };
328
+ }
329
+ handleTransportError(err) {
330
+ this.logger.error(`worker ${this.workerId} transport error: ${err.message}`, err);
331
+ }
332
+ handleExit(code) {
333
+ if (this.phase === "terminated") return;
334
+ const wasGraceful = this.phase === "shutting-down" && code === 0;
335
+ this.phase = "terminated";
336
+ const err = wasGraceful ? null : new WorkerExitedError(this.workerId, code, this.lastCorrelationId);
337
+ this.lastExitError = err;
338
+ if (this.abortTimer) {
339
+ clearTimeout(this.abortTimer);
340
+ this.abortTimer = null;
341
+ }
342
+ this.detachTransportListeners();
343
+ this.drainPending(err);
344
+ this.inFlight = null;
345
+ }
346
+ detachTransportListeners() {
347
+ this.transport.off("message", this.onMessage);
348
+ this.transport.off("error", this.onError);
349
+ this.transport.off("exit", this.onExit);
350
+ }
351
+ drainPending(err) {
352
+ for (const [, entry] of this.pending) if (err) entry.reject(err);
353
+ else if (entry.kind === "shutdown") entry.resolve();
354
+ else if (entry.kind === "init") entry.reject(new WorkerInitFailedError(this.workerId, "worker exited"));
355
+ else if (entry.kind === "load-model") entry.reject(new WorkerLoadModelFailedError(this.workerId, entry.documentType, entry.version, "worker exited before responding"));
356
+ else entry.reject(new WorkerExitedError(this.workerId, 0, this.lastCorrelationId));
357
+ this.pending.clear();
358
+ }
359
+ failPending(correlationId, err) {
360
+ const entry = this.pending.get(correlationId);
361
+ if (!entry) return;
362
+ this.pending.delete(correlationId);
363
+ entry.reject(err);
364
+ }
365
+ async forceTerminate(reason) {
366
+ if (this.phase === "terminated") return;
367
+ try {
368
+ await this.transport.terminate();
369
+ } catch (err) {
370
+ this.logger.warn(`worker ${this.workerId} terminate threw: ${err.message}`);
371
+ }
372
+ if (this.phase === "terminated") return;
373
+ this.phase = "terminated";
374
+ this.lastExitError = reason;
375
+ this.detachTransportListeners();
376
+ this.drainPending(reason);
377
+ this.inFlight = null;
378
+ }
379
+ };
380
+ //#endregion
381
+ export { WorkerHandle };
382
+
383
+ //# sourceMappingURL=worker-handle-B1w03nRA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-handle-B1w03nRA.js","names":[],"sources":["../src/executor/worker/worker-handle.ts"],"sourcesContent":["/**\n * Parent-side IPC wrapper around a single executor worker.\n *\n * Implements {@link IExecutorWorker} on top of an injectable\n * {@link IWorkerTransport}. The handle owns one worker's lifecycle (init ->\n * ready -> execute/result rounds -> abort/shutdown -> terminate) and bounds\n * its in-flight slot to a single job — `SimpleJobExecutor` is single-threaded\n * inside the worker, and concurrent dispatches would race its caches.\n *\n * @see Executor Worker Pool Design wiki page\n * (Powerhouse board wiki id: d400d711-f07e-4389-a226-4e9fdd4fa8ba)\n */\n\nimport type { ILogger } from \"document-model\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n IExecutorWorker,\n WorkerExecutionOutcome,\n WorkerInFlightSnapshot,\n} from \"../interfaces.js\";\nimport type { Job } from \"../../queue/types.js\";\nimport { fromErrorInfo } from \"./error-info.js\";\nimport {\n WorkerAbortTimeoutError,\n WorkerBusyError,\n WorkerExitedError,\n WorkerInitFailedError,\n WorkerLoadModelFailedError,\n WorkerShutdownTimeoutError,\n} from \"./errors.js\";\nimport type { ForwardingPoolInstrumentation } from \"../../storage/pool-instrumentation.js\";\nimport type {\n DbConfig,\n HeartbeatMessage,\n LogMessage,\n MetricsMessage,\n ModelLoadFailedMessage,\n ModelLoadedMessage,\n ModelManifestEntry,\n PoolAcquireSamplesMessage,\n ResultMessage,\n SignatureVerifierSpec,\n WorkerMessage,\n WorkerPoolConfig,\n} from \"./protocol.js\";\nimport type { IWorkerTransport, WorkerTransportListener } from \"./transport.js\";\n\nconst DEFAULT_ABORT_GRACE_MS = 5_000;\nconst DEFAULT_SHUTDOWN_GRACE_MS = 5_000;\n\n/**\n * Payload the parent ships in the `init` message (everything except the\n * envelope fields the handle fills in itself).\n */\nexport type WorkerInitPayload = {\n poolConfig: WorkerPoolConfig;\n db: DbConfig;\n signatureVerifier: SignatureVerifierSpec;\n models: ModelManifestEntry[];\n};\n\nexport type WorkerHandleOptions = {\n workerId: string;\n index: number;\n transport: IWorkerTransport;\n initPayload: WorkerInitPayload;\n logger: ILogger;\n /** Grace period before an outstanding `abort` escalates to terminate. */\n abortGraceMs?: number;\n /** Default grace period applied to graceful `shutdown` when not overridden. */\n defaultShutdownGraceMs?: number;\n /**\n * Forwarding instrumentation the host registers per worker. The handle\n * pumps `pool-acquire-samples` messages into this object so the host's\n * OpenTelemetry instrumentation records acquire-wait latencies as if the\n * worker's pool were local.\n */\n poolInstrumentation?: ForwardingPoolInstrumentation;\n};\n\ntype PendingEntry =\n | {\n kind: \"init\";\n resolve: () => void;\n reject: (err: Error) => void;\n }\n | {\n kind: \"execute\";\n jobId: string;\n resolve: (outcome: WorkerExecutionOutcome) => void;\n reject: (err: Error) => void;\n }\n | {\n kind: \"shutdown\";\n resolve: () => void;\n reject: (err: Error) => void;\n }\n | {\n kind: \"load-model\";\n documentType: string;\n version: string;\n resolve: () => void;\n reject: (err: Error) => void;\n };\n\ntype Phase = \"fresh\" | \"starting\" | \"ready\" | \"shutting-down\" | \"terminated\";\n\nexport class WorkerHandle implements IExecutorWorker {\n readonly workerId: string;\n readonly index: number;\n\n private readonly transport: IWorkerTransport;\n private readonly initPayload: WorkerInitPayload;\n private readonly logger: ILogger;\n private readonly abortGraceMs: number;\n private readonly defaultShutdownGraceMs: number;\n private readonly poolInstrumentation?: ForwardingPoolInstrumentation;\n\n private readonly pending = new Map<string, PendingEntry>();\n private inFlight: { correlationId: string; jobId: string } | null = null;\n private phase: Phase = \"fresh\";\n private lastExitError: Error | null = null;\n private lastCorrelationId: string | null = null;\n private abortTimer: NodeJS.Timeout | null = null;\n private lastHeartbeatAt: number | null = null;\n private lastMetrics: {\n counters: Record<string, number>;\n gauges: Record<string, number>;\n timestamp: number;\n } | null = null;\n\n private readonly onMessage: WorkerTransportListener<\"message\">;\n private readonly onError: WorkerTransportListener<\"error\">;\n private readonly onExit: WorkerTransportListener<\"exit\">;\n\n constructor(options: WorkerHandleOptions) {\n this.workerId = options.workerId;\n this.index = options.index;\n this.transport = options.transport;\n this.initPayload = options.initPayload;\n this.logger = options.logger;\n this.abortGraceMs = options.abortGraceMs ?? DEFAULT_ABORT_GRACE_MS;\n this.defaultShutdownGraceMs =\n options.defaultShutdownGraceMs ?? DEFAULT_SHUTDOWN_GRACE_MS;\n this.poolInstrumentation = options.poolInstrumentation;\n\n this.onMessage = (msg) => this.handleMessage(msg);\n this.onError = (err) => this.handleTransportError(err);\n this.onExit = (code) => this.handleExit(code);\n\n this.transport.on(\"message\", this.onMessage);\n this.transport.on(\"error\", this.onError);\n this.transport.on(\"exit\", this.onExit);\n }\n\n public async start(): Promise<void> {\n if (this.phase !== \"fresh\") {\n throw new WorkerInitFailedError(\n this.workerId,\n `cannot start worker in phase ${this.phase}`,\n );\n }\n this.phase = \"starting\";\n const correlationId = this.nextCorrelationId();\n const ready = new Promise<void>((resolve, reject) => {\n this.pending.set(correlationId, {\n kind: \"init\",\n resolve,\n reject,\n });\n });\n this.transport.postMessage({\n type: \"init\",\n correlationId,\n workerId: this.workerId,\n poolConfig: this.initPayload.poolConfig,\n db: this.initPayload.db,\n signatureVerifier: this.initPayload.signatureVerifier,\n models: this.initPayload.models,\n });\n await ready;\n this.phase = \"ready\";\n }\n\n public execute(\n job: Job,\n signal?: AbortSignal,\n ): Promise<WorkerExecutionOutcome> {\n if (this.phase === \"terminated\") {\n return Promise.reject(\n this.lastExitError ??\n new WorkerExitedError(this.workerId, -1, this.lastCorrelationId),\n );\n }\n if (this.phase !== \"ready\") {\n return Promise.reject(\n new WorkerInitFailedError(\n this.workerId,\n `worker not ready (phase=${this.phase})`,\n ),\n );\n }\n if (this.inFlight !== null) {\n return Promise.reject(new WorkerBusyError(this.workerId, job.id));\n }\n\n const correlationId = this.nextCorrelationId();\n this.lastCorrelationId = correlationId;\n this.inFlight = { correlationId, jobId: job.id };\n\n let abortListener: (() => void) | null = null;\n const detachSignal = () => {\n if (signal && abortListener) {\n signal.removeEventListener(\"abort\", abortListener);\n abortListener = null;\n }\n };\n\n const promise = new Promise<WorkerExecutionOutcome>((resolve, reject) => {\n this.pending.set(correlationId, {\n kind: \"execute\",\n jobId: job.id,\n resolve: (outcome) => {\n detachSignal();\n resolve(outcome);\n },\n reject: (err) => {\n detachSignal();\n reject(err);\n },\n });\n });\n\n if (signal) {\n if (signal.aborted) {\n this.abort(correlationId, \"aborted before dispatch\");\n } else {\n abortListener = () => this.abort(correlationId, \"caller signal\");\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n }\n\n this.transport.postMessage({\n type: \"execute\",\n correlationId,\n job,\n });\n\n return promise;\n }\n\n public abort(correlationId: string, reason?: string): void {\n if (this.phase === \"terminated\") {\n return;\n }\n if (!this.inFlight || this.inFlight.correlationId !== correlationId) {\n return;\n }\n if (this.abortTimer) {\n return;\n }\n this.transport.postMessage({\n type: \"abort\",\n correlationId: this.nextCorrelationId(),\n targetCorrelationId: correlationId,\n reason,\n });\n this.abortTimer = setTimeout(() => {\n this.abortTimer = null;\n const entry = this.pending.get(correlationId);\n if (!entry || entry.kind !== \"execute\") {\n return;\n }\n const err = new WorkerAbortTimeoutError(\n this.workerId,\n correlationId,\n this.abortGraceMs,\n );\n this.failPending(correlationId, err);\n this.inFlight = null;\n void this.forceTerminate(err);\n }, this.abortGraceMs);\n }\n\n public async shutdown(graceful: boolean, graceMs?: number): Promise<void> {\n if (this.phase === \"terminated\") {\n return;\n }\n if (!graceful) {\n this.phase = \"shutting-down\";\n await this.forceTerminate(null);\n return;\n }\n\n const effectiveGrace = graceMs ?? this.defaultShutdownGraceMs;\n this.phase = \"shutting-down\";\n const correlationId = this.nextCorrelationId();\n const drained = new Promise<void>((resolve, reject) => {\n this.pending.set(correlationId, {\n kind: \"shutdown\",\n resolve,\n reject,\n });\n });\n this.transport.postMessage({\n type: \"shutdown\",\n correlationId,\n graceMs: effectiveGrace,\n });\n\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<void>((_, reject) => {\n timer = setTimeout(() => {\n reject(new WorkerShutdownTimeoutError(this.workerId, effectiveGrace));\n }, effectiveGrace);\n });\n\n try {\n await Promise.race([drained, timeout]);\n } catch (err) {\n this.logger.warn(\n `worker ${this.workerId} shutdown timed out after ${effectiveGrace}ms`,\n err,\n );\n } finally {\n clearTimeout(timer);\n }\n\n await this.forceTerminate(null);\n }\n\n public loadModel(\n entry: ModelManifestEntry,\n signal?: AbortSignal,\n ): Promise<void> {\n if (this.phase === \"terminated\") {\n return Promise.reject(\n this.lastExitError ??\n new WorkerExitedError(this.workerId, -1, this.lastCorrelationId),\n );\n }\n if (this.phase !== \"ready\") {\n return Promise.reject(\n new WorkerInitFailedError(\n this.workerId,\n `worker not ready (phase=${this.phase})`,\n ),\n );\n }\n\n const correlationId = this.nextCorrelationId();\n let abortListener: (() => void) | null = null;\n const detachSignal = () => {\n if (signal && abortListener) {\n signal.removeEventListener(\"abort\", abortListener);\n abortListener = null;\n }\n };\n\n const promise = new Promise<void>((resolve, reject) => {\n this.pending.set(correlationId, {\n kind: \"load-model\",\n documentType: entry.documentType,\n version: entry.version,\n resolve: () => {\n detachSignal();\n resolve();\n },\n reject: (err) => {\n detachSignal();\n reject(err);\n },\n });\n });\n\n if (signal) {\n if (signal.aborted) {\n this.failPending(\n correlationId,\n new WorkerLoadModelFailedError(\n this.workerId,\n entry.documentType,\n entry.version,\n \"aborted before dispatch\",\n ),\n );\n return promise;\n }\n abortListener = () => {\n this.failPending(\n correlationId,\n new WorkerLoadModelFailedError(\n this.workerId,\n entry.documentType,\n entry.version,\n \"caller signal\",\n ),\n );\n };\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n\n this.transport.postMessage({\n type: \"load-model\",\n correlationId,\n model: entry,\n });\n\n return promise;\n }\n\n public isIdle(): boolean {\n return this.inFlight === null && this.phase === \"ready\";\n }\n\n public getInFlight(): WorkerInFlightSnapshot | null {\n if (!this.inFlight) {\n return null;\n }\n return {\n correlationId: this.inFlight.correlationId,\n jobId: this.inFlight.jobId,\n };\n }\n\n private nextCorrelationId(): string {\n return randomUUID();\n }\n\n private handleMessage(msg: WorkerMessage): void {\n switch (msg.type) {\n case \"ready\":\n this.handleReady(msg.correlationId);\n return;\n case \"result\":\n this.handleResult(msg);\n return;\n case \"model-loaded\":\n this.handleModelLoaded(msg);\n return;\n case \"model-load-failed\":\n this.handleModelLoadFailed(msg);\n return;\n case \"log\":\n this.handleLog(msg);\n return;\n case \"heartbeat\":\n this.handleHeartbeat(msg);\n return;\n case \"metrics\":\n this.handleMetrics(msg);\n return;\n case \"pool-acquire-samples\":\n this.handlePoolAcquireSamples(msg);\n return;\n default: {\n const exhaustive: never = msg;\n void exhaustive;\n }\n }\n }\n\n private handlePoolAcquireSamples(msg: PoolAcquireSamplesMessage): void {\n if (!this.poolInstrumentation) {\n return;\n }\n this.poolInstrumentation.updateStats({\n size: msg.size,\n idle: msg.idle,\n waiting: msg.waiting,\n });\n this.poolInstrumentation.pushSamples(msg.durations);\n }\n\n private handleReady(correlationId: string): void {\n const entry = this.pending.get(correlationId);\n if (!entry || entry.kind !== \"init\") {\n return;\n }\n this.pending.delete(correlationId);\n entry.resolve();\n }\n\n private handleResult(msg: ResultMessage): void {\n const entry = this.pending.get(msg.correlationId);\n if (!entry || entry.kind !== \"execute\") {\n return;\n }\n this.pending.delete(msg.correlationId);\n if (this.inFlight?.correlationId === msg.correlationId) {\n this.inFlight = null;\n }\n if (this.abortTimer) {\n clearTimeout(this.abortTimer);\n this.abortTimer = null;\n }\n\n const outcome: WorkerExecutionOutcome = msg.error\n ? {\n result: {\n ...msg.result,\n success: false,\n error: fromErrorInfo(msg.error),\n },\n }\n : {\n result: msg.result,\n writeReady: msg.writeReady,\n };\n entry.resolve(outcome);\n\n if (this.phase === \"shutting-down\") {\n const shutdownEntry = [...this.pending.values()].find(\n (e) => e.kind === \"shutdown\",\n );\n if (shutdownEntry) {\n shutdownEntry.resolve();\n }\n }\n }\n\n private handleModelLoaded(msg: ModelLoadedMessage): void {\n const entry = this.pending.get(msg.correlationId);\n if (!entry || entry.kind !== \"load-model\") {\n return;\n }\n this.pending.delete(msg.correlationId);\n entry.resolve();\n }\n\n private handleModelLoadFailed(msg: ModelLoadFailedMessage): void {\n const entry = this.pending.get(msg.correlationId);\n if (!entry || entry.kind !== \"load-model\") {\n return;\n }\n this.pending.delete(msg.correlationId);\n entry.reject(\n new WorkerLoadModelFailedError(\n this.workerId,\n msg.documentType,\n msg.version,\n msg.error.message,\n { cause: fromErrorInfo(msg.error) },\n ),\n );\n }\n\n private handleLog(msg: LogMessage): void {\n const args = msg.args;\n switch (msg.level) {\n case \"debug\":\n this.logger.debug(msg.message, ...args);\n return;\n case \"info\":\n this.logger.info(msg.message, ...args);\n return;\n case \"warn\":\n this.logger.warn(msg.message, ...args);\n return;\n case \"error\":\n this.logger.error(msg.message, ...args);\n return;\n default: {\n const exhaustive: never = msg.level;\n void exhaustive;\n }\n }\n }\n\n private handleHeartbeat(msg: HeartbeatMessage): void {\n this.lastHeartbeatAt = msg.timestamp;\n }\n\n private handleMetrics(msg: MetricsMessage): void {\n this.lastMetrics = {\n counters: msg.counters,\n gauges: msg.gauges,\n timestamp: msg.timestamp,\n };\n }\n\n private handleTransportError(err: Error): void {\n this.logger.error(\n `worker ${this.workerId} transport error: ${err.message}`,\n err,\n );\n }\n\n private handleExit(code: number): void {\n if (this.phase === \"terminated\") {\n return;\n }\n const wasGraceful = this.phase === \"shutting-down\" && code === 0;\n this.phase = \"terminated\";\n const err = wasGraceful\n ? null\n : new WorkerExitedError(this.workerId, code, this.lastCorrelationId);\n this.lastExitError = err;\n if (this.abortTimer) {\n clearTimeout(this.abortTimer);\n this.abortTimer = null;\n }\n this.detachTransportListeners();\n this.drainPending(err);\n this.inFlight = null;\n }\n\n private detachTransportListeners(): void {\n this.transport.off(\"message\", this.onMessage);\n this.transport.off(\"error\", this.onError);\n this.transport.off(\"exit\", this.onExit);\n }\n\n private drainPending(err: Error | null): void {\n for (const [, entry] of this.pending) {\n if (err) {\n entry.reject(err);\n } else if (entry.kind === \"shutdown\") {\n entry.resolve();\n } else if (entry.kind === \"init\") {\n entry.reject(new WorkerInitFailedError(this.workerId, \"worker exited\"));\n } else if (entry.kind === \"load-model\") {\n entry.reject(\n new WorkerLoadModelFailedError(\n this.workerId,\n entry.documentType,\n entry.version,\n \"worker exited before responding\",\n ),\n );\n } else {\n entry.reject(\n new WorkerExitedError(this.workerId, 0, this.lastCorrelationId),\n );\n }\n }\n this.pending.clear();\n }\n\n private failPending(correlationId: string, err: Error): void {\n const entry = this.pending.get(correlationId);\n if (!entry) {\n return;\n }\n this.pending.delete(correlationId);\n entry.reject(err);\n }\n\n private async forceTerminate(reason: Error | null): Promise<void> {\n if (this.phase === \"terminated\") {\n return;\n }\n try {\n await this.transport.terminate();\n } catch (err) {\n this.logger.warn(\n `worker ${this.workerId} terminate threw: ${(err as Error).message}`,\n );\n }\n const phaseAfter = this.phase as Phase;\n if (phaseAfter === \"terminated\") {\n return;\n }\n this.phase = \"terminated\";\n this.lastExitError = reason;\n this.detachTransportListeners();\n this.drainPending(reason);\n this.inFlight = null;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/reactor",
3
- "version": "6.1.0-dev.1",
3
+ "version": "6.1.0-dev.10",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "url": "https://github.com/powerhouse-inc/powerhouse",
@@ -29,11 +29,13 @@
29
29
  "kysely": "0.28.16",
30
30
  "kysely-pglite-dialect": "1.2.0",
31
31
  "@electric-sql/pglite": "0.3.15",
32
+ "pg": "8.18.0",
32
33
  "@sindresorhus/fnv1a": "3.1.0",
33
- "@powerhousedao/shared": "6.1.0-dev.1",
34
- "document-model": "6.1.0-dev.1"
34
+ "@powerhousedao/shared": "6.1.0-dev.10",
35
+ "document-model": "6.1.0-dev.10"
35
36
  },
36
37
  "devDependencies": {
38
+ "@types/pg": "8.16.0",
37
39
  "@vitest/coverage-v8": "4.1.1",
38
40
  "prettier": "3.8.1",
39
41
  "tinybench": "^2.9.0",
@@ -41,7 +43,7 @@
41
43
  "vitest": "4.1.1",
42
44
  "@types/bun": "1.3.8",
43
45
  "tsdown": "0.21.1",
44
- "@powerhousedao/pglite-fs": "6.1.0-dev.1"
46
+ "@powerhousedao/pglite-fs": "6.1.0-dev.10"
45
47
  },
46
48
  "scripts": {
47
49
  "build": "tsdown",