@powerhousedao/reactor 6.2.3-dev.23 → 6.2.3-dev.25
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.
- package/dist/{build-worker-executor-DUjyF4NM.js → build-worker-executor-DPGjh9Uc.js} +24 -8
- package/dist/build-worker-executor-DPGjh9Uc.js.map +1 -0
- package/dist/{document-indexer-CQzTEE1o.js → document-indexer-zbdzqZ3K.js} +18 -9
- package/dist/{document-indexer-CQzTEE1o.js.map → document-indexer-zbdzqZ3K.js.map} +1 -1
- package/dist/entry.d.ts +2 -1
- package/dist/entry.js +10 -6
- package/dist/entry.js.map +1 -1
- package/dist/{errors-D3S6Eysd.js → errors-BM_ULVWd.js} +9 -1
- package/dist/{errors-D3S6Eysd.js.map → errors-BM_ULVWd.js.map} +1 -1
- package/dist/{drive-container-types-CS5IxDiA.js → forwarding-logger-CSsCJ38f.js} +1081 -174
- package/dist/forwarding-logger-CSsCJ38f.js.map +1 -0
- package/dist/index.d.ts +2248 -1978
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +438 -258
- package/dist/index.js.map +1 -1
- package/dist/projection-entry.d.ts +2 -1
- package/dist/projection-entry.js +7 -13
- package/dist/projection-entry.js.map +1 -1
- package/dist/{projection-shard-manager-CUo4bF4O.js → projection-shard-manager-B-j8VYzA.js} +2 -3
- package/dist/{projection-shard-manager-CUo4bF4O.js.map → projection-shard-manager-B-j8VYzA.js.map} +1 -1
- package/dist/{projection-worker-wI4PwcV2.js → projection-worker-D8uNFdwX.js} +1 -1
- package/dist/{projection-worker-wI4PwcV2.js.map → projection-worker-D8uNFdwX.js.map} +1 -1
- package/dist/{transport-CuogVKN_.js → transport-B3G50KVd.js} +1 -1
- package/dist/{transport-CuogVKN_.js.map → transport-B3G50KVd.js.map} +1 -1
- package/dist/{transport-ByGviWdZ.js → transport-CZDHzfvy.js} +1 -1
- package/dist/{transport-ByGviWdZ.js.map → transport-CZDHzfvy.js.map} +1 -1
- package/dist/{worker-handle-CrERzl8s.js → worker-handle-CwWNTpUg.js} +22 -16
- package/dist/worker-handle-CwWNTpUg.js.map +1 -0
- package/package.json +7 -8
- package/dist/build-worker-executor-DUjyF4NM.js.map +0 -1
- package/dist/drive-container-types-CS5IxDiA.js.map +0 -1
- package/dist/error-info-Cpu4OY3o.js +0 -62
- package/dist/error-info-Cpu4OY3o.js.map +0 -1
- package/dist/forwarding-logger-BBkMSxuJ.js +0 -85
- package/dist/forwarding-logger-BBkMSxuJ.js.map +0 -1
- package/dist/types-DMKLa0Ok.js +0 -33
- package/dist/types-DMKLa0Ok.js.map +0 -1
- package/dist/worker-g03lNM42.js +0 -22
- package/dist/worker-g03lNM42.js.map +0 -1
- package/dist/worker-handle-CrERzl8s.js.map +0 -1
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
//#region src/executor/worker/error-info.ts
|
|
2
|
-
const MAX_STACK_LENGTH = 8 * 1024;
|
|
3
|
-
const MAX_CAUSE_DEPTH = 8;
|
|
4
|
-
function toErrorInfo(err, depth = 0) {
|
|
5
|
-
if (depth > MAX_CAUSE_DEPTH) return {
|
|
6
|
-
name: "Error",
|
|
7
|
-
message: "cause chain truncated"
|
|
8
|
-
};
|
|
9
|
-
if (err instanceof Error) {
|
|
10
|
-
const info = {
|
|
11
|
-
name: err.name || "Error",
|
|
12
|
-
message: err.message
|
|
13
|
-
};
|
|
14
|
-
if (typeof err.stack === "string") info.stack = err.stack.length > MAX_STACK_LENGTH ? err.stack.slice(0, MAX_STACK_LENGTH) : err.stack;
|
|
15
|
-
if (err.cause !== void 0) info.cause = toErrorInfo(err.cause, depth + 1);
|
|
16
|
-
return info;
|
|
17
|
-
}
|
|
18
|
-
if (typeof err === "string") return {
|
|
19
|
-
name: "Error",
|
|
20
|
-
message: err
|
|
21
|
-
};
|
|
22
|
-
if (err && typeof err === "object") {
|
|
23
|
-
const record = err;
|
|
24
|
-
return {
|
|
25
|
-
name: typeof record.name === "string" ? record.name : "Error",
|
|
26
|
-
message: typeof record.message === "string" ? record.message : safeStringify(err)
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
name: "Error",
|
|
31
|
-
message: safeStringify(err)
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
function safeStringify(value) {
|
|
35
|
-
if (value === null || value === void 0) return String(value);
|
|
36
|
-
if (typeof value === "string") return value;
|
|
37
|
-
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
38
|
-
try {
|
|
39
|
-
return JSON.stringify(value);
|
|
40
|
-
} catch {
|
|
41
|
-
return "[unserializable]";
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function fromErrorInfo(info) {
|
|
45
|
-
const err = new Error(info.message);
|
|
46
|
-
Object.defineProperty(err, "name", {
|
|
47
|
-
value: info.name,
|
|
48
|
-
configurable: true,
|
|
49
|
-
writable: true
|
|
50
|
-
});
|
|
51
|
-
if (info.stack !== void 0) err.stack = info.stack;
|
|
52
|
-
if (info.cause !== void 0) Object.defineProperty(err, "cause", {
|
|
53
|
-
value: fromErrorInfo(info.cause),
|
|
54
|
-
configurable: true,
|
|
55
|
-
writable: true
|
|
56
|
-
});
|
|
57
|
-
return err;
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
export { toErrorInfo as n, fromErrorInfo as t };
|
|
61
|
-
|
|
62
|
-
//# sourceMappingURL=error-info-Cpu4OY3o.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-info-Cpu4OY3o.js","names":[],"sources":["../src/executor/worker/error-info.ts"],"sourcesContent":["/**\n * Helpers for marshalling `Error` instances across the worker IPC boundary.\n *\n * Class instances cannot be structured-cloned, so {@link ErrorInfo} is the\n * canonical wire shape (see `protocol.ts`). These helpers walk `cause`\n * chains, truncate stacks, and drop non-cloneable fields.\n */\n\nimport type { ErrorInfo } from \"./protocol.js\";\n\nconst MAX_STACK_LENGTH = 8 * 1024;\nconst MAX_CAUSE_DEPTH = 8;\n\nexport function toErrorInfo(err: unknown, depth = 0): ErrorInfo {\n if (depth > MAX_CAUSE_DEPTH) {\n return { name: \"Error\", message: \"cause chain truncated\" };\n }\n if (err instanceof Error) {\n const info: ErrorInfo = {\n name: err.name || \"Error\",\n message: err.message,\n };\n if (typeof err.stack === \"string\") {\n info.stack =\n err.stack.length > MAX_STACK_LENGTH\n ? err.stack.slice(0, MAX_STACK_LENGTH)\n : err.stack;\n }\n if (err.cause !== undefined) {\n info.cause = toErrorInfo(err.cause, depth + 1);\n }\n return info;\n }\n if (typeof err === \"string\") {\n return { name: \"Error\", message: err };\n }\n if (err && typeof err === \"object\") {\n const record = err as { name?: unknown; message?: unknown };\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : safeStringify(err),\n };\n }\n return { name: \"Error\", message: safeStringify(err) };\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\nexport function fromErrorInfo(info: ErrorInfo): Error {\n const err = new Error(info.message);\n Object.defineProperty(err, \"name\", {\n value: info.name,\n configurable: true,\n writable: true,\n });\n if (info.stack !== undefined) {\n err.stack = info.stack;\n }\n if (info.cause !== undefined) {\n Object.defineProperty(err, \"cause\", {\n value: fromErrorInfo(info.cause),\n configurable: true,\n writable: true,\n });\n }\n return err;\n}\n"],"mappings":";AAUA,MAAM,mBAAmB,IAAI;AAC7B,MAAM,kBAAkB;AAExB,SAAgB,YAAY,KAAc,QAAQ,GAAc;AAC9D,KAAI,QAAQ,gBACV,QAAO;EAAE,MAAM;EAAS,SAAS;EAAyB;AAE5D,KAAI,eAAe,OAAO;EACxB,MAAM,OAAkB;GACtB,MAAM,IAAI,QAAQ;GAClB,SAAS,IAAI;GACd;AACD,MAAI,OAAO,IAAI,UAAU,SACvB,MAAK,QACH,IAAI,MAAM,SAAS,mBACf,IAAI,MAAM,MAAM,GAAG,iBAAiB,GACpC,IAAI;AAEZ,MAAI,IAAI,UAAU,KAAA,EAChB,MAAK,QAAQ,YAAY,IAAI,OAAO,QAAQ,EAAE;AAEhD,SAAO;;AAET,KAAI,OAAO,QAAQ,SACjB,QAAO;EAAE,MAAM;EAAS,SAAS;EAAK;AAExC,KAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,MAAM,SAAS;AACf,SAAO;GACL,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;GACtD,SACE,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,cAAc,IAAI;GACzB;;AAEH,QAAO;EAAE,MAAM;EAAS,SAAS,cAAc,IAAI;EAAE;;AAGvD,SAAS,cAAc,OAAwB;AAC7C,KAAI,UAAU,QAAQ,UAAU,KAAA,EAC9B,QAAO,OAAO,MAAM;AAEtB,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QAAO,OAAO,MAAM;AAEtB,KAAI;AACF,SAAO,KAAK,UAAU,MAAM;SACtB;AACN,SAAO;;;AAIX,SAAgB,cAAc,MAAwB;CACpD,MAAM,MAAM,IAAI,MAAM,KAAK,QAAQ;AACnC,QAAO,eAAe,KAAK,QAAQ;EACjC,OAAO,KAAK;EACZ,cAAc;EACd,UAAU;EACX,CAAC;AACF,KAAI,KAAK,UAAU,KAAA,EACjB,KAAI,QAAQ,KAAK;AAEnB,KAAI,KAAK,UAAU,KAAA,EACjB,QAAO,eAAe,KAAK,SAAS;EAClC,OAAO,cAAc,KAAK,MAAM;EAChC,cAAc;EACd,UAAU;EACX,CAAC;AAEJ,QAAO"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { n as toErrorInfo } from "./error-info-Cpu4OY3o.js";
|
|
2
|
-
//#region src/executor/worker/sanitize.ts
|
|
3
|
-
const MAX_DEPTH = 8;
|
|
4
|
-
function errorToInfo(err) {
|
|
5
|
-
return toErrorInfo(err);
|
|
6
|
-
}
|
|
7
|
-
function sanitizeArg(value, depth = 0, seen = /* @__PURE__ */ new WeakSet()) {
|
|
8
|
-
if (depth > MAX_DEPTH) return "[Truncated]";
|
|
9
|
-
if (value === null || value === void 0) return null;
|
|
10
|
-
if (typeof value === "boolean") return value;
|
|
11
|
-
if (typeof value === "number") return value;
|
|
12
|
-
if (typeof value === "string") return value;
|
|
13
|
-
if (typeof value === "bigint") return value.toString();
|
|
14
|
-
if (typeof value === "function" || typeof value === "symbol") return null;
|
|
15
|
-
if (value instanceof Error) return toErrorInfo(value);
|
|
16
|
-
if (value instanceof Date) return value.toISOString();
|
|
17
|
-
if (value instanceof Map) {
|
|
18
|
-
const obj = {};
|
|
19
|
-
for (const [k, v] of value.entries()) obj[String(k)] = sanitizeArg(v, depth + 1, seen);
|
|
20
|
-
return obj;
|
|
21
|
-
}
|
|
22
|
-
if (value instanceof Set) {
|
|
23
|
-
const arr = [];
|
|
24
|
-
for (const v of value.values()) arr.push(sanitizeArg(v, depth + 1, seen));
|
|
25
|
-
return arr;
|
|
26
|
-
}
|
|
27
|
-
if (Array.isArray(value)) {
|
|
28
|
-
if (seen.has(value)) return "[Circular]";
|
|
29
|
-
seen.add(value);
|
|
30
|
-
const result = value.map((v) => sanitizeArg(v, depth + 1, seen));
|
|
31
|
-
seen.delete(value);
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
if (typeof value === "object") {
|
|
35
|
-
const proto = Object.getPrototypeOf(value);
|
|
36
|
-
if (proto !== Object.prototype && proto !== null) return { __nonClonable: value.constructor?.name || "Unknown" };
|
|
37
|
-
if (seen.has(value)) return "[Circular]";
|
|
38
|
-
seen.add(value);
|
|
39
|
-
const result = {};
|
|
40
|
-
for (const [k, v] of Object.entries(value)) result[k] = sanitizeArg(v, depth + 1, seen);
|
|
41
|
-
seen.delete(value);
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region src/executor/worker/forwarding-logger.ts
|
|
48
|
-
function createForwardingLogger(post, level = "info", tags = []) {
|
|
49
|
-
function safePost(msg) {
|
|
50
|
-
try {
|
|
51
|
-
post(msg);
|
|
52
|
-
} catch {
|
|
53
|
-
try {
|
|
54
|
-
process.stderr.write(`[forwarding-logger] postMessage failed: ${msg.level} ${msg.message}\n`);
|
|
55
|
-
} catch {}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function emit(wireLevel, message, args) {
|
|
59
|
-
const sanitizedArgs = args.map((a) => sanitizeArg(a));
|
|
60
|
-
safePost({
|
|
61
|
-
type: "log",
|
|
62
|
-
level: wireLevel,
|
|
63
|
-
message,
|
|
64
|
-
args: tags.length > 0 ? [sanitizeArg({ tags }), ...sanitizedArgs] : sanitizedArgs,
|
|
65
|
-
timestamp: Date.now()
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
level,
|
|
70
|
-
verbose: (message, ...args) => emit("debug", message, args),
|
|
71
|
-
debug: (message, ...args) => emit("debug", message, args),
|
|
72
|
-
info: (message, ...args) => emit("info", message, args),
|
|
73
|
-
warn: (message, ...args) => emit("warn", message, args),
|
|
74
|
-
error: (message, ...args) => emit("error", message, args),
|
|
75
|
-
errorHandler: ((...data) => {
|
|
76
|
-
const first = data[0];
|
|
77
|
-
emit("error", typeof first === "string" ? first : "", data.slice(1));
|
|
78
|
-
}),
|
|
79
|
-
child: (childTags) => createForwardingLogger(post, level, [...tags, ...childTags])
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
//#endregion
|
|
83
|
-
export { errorToInfo as n, sanitizeArg as r, createForwardingLogger as t };
|
|
84
|
-
|
|
85
|
-
//# sourceMappingURL=forwarding-logger-BBkMSxuJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forwarding-logger-BBkMSxuJ.js","names":[],"sources":["../src/executor/worker/sanitize.ts","../src/executor/worker/forwarding-logger.ts"],"sourcesContent":["import type { ErrorInfo, SanitizedArg } from \"./protocol.js\";\nimport { toErrorInfo } from \"./error-info.js\";\n\nconst MAX_DEPTH = 8;\n\nexport function errorToInfo(err: unknown): ErrorInfo {\n return toErrorInfo(err);\n}\n\nexport function sanitizeArg(\n value: unknown,\n depth = 0,\n seen = new WeakSet<object>(),\n): SanitizedArg {\n if (depth > MAX_DEPTH) {\n return \"[Truncated]\";\n }\n\n if (value === null || value === undefined) return null;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value;\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"function\" || typeof value === \"symbol\") return null;\n\n if (value instanceof Error) {\n return toErrorInfo(value);\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (value instanceof Map) {\n const obj: { [key: string]: SanitizedArg } = {};\n for (const [k, v] of value.entries()) {\n obj[String(k)] = sanitizeArg(v, depth + 1, seen);\n }\n return obj;\n }\n\n if (value instanceof Set) {\n const arr: SanitizedArg[] = [];\n for (const v of value.values()) {\n arr.push(sanitizeArg(v, depth + 1, seen));\n }\n return arr;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n const result: SanitizedArg[] = value.map((v) =>\n sanitizeArg(v, depth + 1, seen),\n );\n seen.delete(value);\n return result;\n }\n\n if (typeof value === \"object\") {\n const proto: object | null = Object.getPrototypeOf(value) as object | null;\n if (proto !== Object.prototype && proto !== null) {\n const ctorName =\n (value as { constructor?: { name?: string } }).constructor?.name ||\n \"Unknown\";\n return { __nonClonable: ctorName };\n }\n\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n const result: { [key: string]: SanitizedArg } = {};\n for (const [k, v] of Object.entries(value as object)) {\n result[k] = sanitizeArg(v, depth + 1, seen);\n }\n seen.delete(value as object);\n return result;\n }\n\n return null;\n}\n","import type { ILogger, LoggerErrorHandler } from \"document-model\";\nimport type { LogMessage } from \"./protocol.js\";\nimport { sanitizeArg } from \"./sanitize.js\";\n\nexport function createForwardingLogger(\n post: (msg: LogMessage) => void,\n level: ILogger[\"level\"] = \"info\",\n tags: string[] = [],\n): ILogger {\n function safePost(msg: LogMessage): void {\n try {\n post(msg);\n } catch {\n try {\n process.stderr.write(\n `[forwarding-logger] postMessage failed: ${msg.level} ${msg.message}\\n`,\n );\n } catch {\n // nowhere left to report\n }\n }\n }\n\n function emit(\n wireLevel: LogMessage[\"level\"],\n message: string,\n args: unknown[],\n ): void {\n const sanitizedArgs = args.map((a) => sanitizeArg(a));\n const finalArgs =\n tags.length > 0\n ? [sanitizeArg({ tags }), ...sanitizedArgs]\n : sanitizedArgs;\n safePost({\n type: \"log\",\n level: wireLevel,\n message,\n args: finalArgs,\n timestamp: Date.now(),\n });\n }\n\n return {\n level,\n verbose: (message, ...args) => emit(\"debug\", message, args),\n debug: (message, ...args) => emit(\"debug\", message, args),\n info: (message, ...args) => emit(\"info\", message, args),\n warn: (message, ...args) => emit(\"warn\", message, args),\n error: (message, ...args) => emit(\"error\", message, args),\n errorHandler: ((...data: unknown[]) => {\n const first = data[0];\n const head = typeof first === \"string\" ? first : \"\";\n emit(\"error\", head, data.slice(1));\n }) as LoggerErrorHandler,\n child: (childTags) =>\n createForwardingLogger(post, level, [...tags, ...childTags]),\n };\n}\n"],"mappings":"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"}
|
package/dist/types-DMKLa0Ok.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
//#region src/events/types.ts
|
|
2
|
-
/**
|
|
3
|
-
* Custom error class that aggregates multiple errors from event subscribers.
|
|
4
|
-
*/
|
|
5
|
-
var EventBusAggregateError = class extends Error {
|
|
6
|
-
errors;
|
|
7
|
-
constructor(errors) {
|
|
8
|
-
const message = `EventBus emit failed with ${errors.length} error(s): ${errors.map((e) => {
|
|
9
|
-
if (e && typeof e === "object" && "message" in e) return e.message;
|
|
10
|
-
return String(e);
|
|
11
|
-
}).join("; ")}`;
|
|
12
|
-
super(message);
|
|
13
|
-
this.name = "EventBusAggregateError";
|
|
14
|
-
this.errors = errors;
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Event types for reactor lifecycle events.
|
|
19
|
-
*/
|
|
20
|
-
const ReactorEventTypes = {
|
|
21
|
-
JOB_PENDING: 10001,
|
|
22
|
-
JOB_RUNNING: 10002,
|
|
23
|
-
JOB_WRITE_READY: 10003,
|
|
24
|
-
JOB_READ_READY: 10004,
|
|
25
|
-
JOB_FAILED: 10005,
|
|
26
|
-
READMODEL_BATCH_COMPLETED: 10006,
|
|
27
|
-
READMODEL_INDEXED: 10007,
|
|
28
|
-
MODEL_LOADED: 10008
|
|
29
|
-
};
|
|
30
|
-
//#endregion
|
|
31
|
-
export { ReactorEventTypes as n, EventBusAggregateError as t };
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=types-DMKLa0Ok.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-DMKLa0Ok.js","names":[],"sources":["../src/events/types.ts"],"sourcesContent":["import type { OperationWithContext } from \"@powerhousedao/shared/document-model\";\nimport type { Job } from \"../queue/types.js\";\nimport type { JobMeta } from \"../shared/types.js\";\n\n/**\n * Describes a function to unsubscribe from an event.\n */\nexport type Unsubscribe = () => void;\n\n/**\n * A subscriber is a function that is called when an event is emitted.\n *\n * It is passed the event type and the data.\n * It can return a promise or a value.\n * If it returns a promise, the event bus will wait for the promise to resolve before calling the next subscriber.\n * If it throws an error, the event bus will reject with an aggregate error of all errors.\n *\n * @param type - The type of event to emit.\n * @param data - The data to pass to the subscriber.\n */\nexport type Subscriber = (type: number, data: any) => void | Promise<void>;\n\n/**\n * Custom error class that aggregates multiple errors from event subscribers.\n */\nexport class EventBusAggregateError extends Error {\n public readonly errors: any[];\n\n constructor(errors: unknown[]) {\n const message = `EventBus emit failed with ${errors.length} error(s): ${errors\n .map((e) => {\n if (e && typeof e === \"object\" && \"message\" in e) {\n return (e as Error).message;\n }\n return String(e);\n })\n .join(\"; \")}`;\n super(message);\n\n this.name = \"EventBusAggregateError\";\n this.errors = errors;\n }\n}\n\n/**\n * Event types for reactor lifecycle events.\n */\nexport const ReactorEventTypes = {\n JOB_PENDING: 10001,\n JOB_RUNNING: 10002,\n JOB_WRITE_READY: 10003,\n JOB_READ_READY: 10004,\n JOB_FAILED: 10005,\n READMODEL_BATCH_COMPLETED: 10006,\n READMODEL_INDEXED: 10007,\n MODEL_LOADED: 10008,\n} as const;\n\n/**\n * Stage within ReadModelCoordinator.runChain. Used as a dimension on\n * stage-attribution events and histograms.\n */\nexport type ReadModelStage = \"pre_ready\" | \"emit\" | \"post_ready\";\n\n/**\n * Stage in which an individual read model ran. The emit stage does not\n * involve a read model so it is excluded from this discriminant.\n */\nexport type ReadModelIndexingStage = \"pre_ready\" | \"post_ready\";\n\n/**\n * Emitted after the resolver loads a model on demand, so peers load it too.\n */\nexport type ModelLoadedEvent = {\n documentType: string;\n};\n\n/**\n * Event emitted when a job is registered and waiting to be executed.\n */\nexport type JobPendingEvent = {\n jobId: string;\n jobMeta: JobMeta;\n};\n\n/**\n * Event emitted when a job starts executing.\n */\nexport type JobRunningEvent = {\n jobId: string;\n jobMeta: JobMeta;\n};\n\n/**\n * Event emitted when operations are written to IOperationStore.\n * Contains the operations directly to avoid round-trip queries.\n */\nexport type JobWriteReadyEvent = {\n jobId: string;\n operations: OperationWithContext[];\n jobMeta: JobMeta;\n /**\n * The ids of the actions the caller submitted with this job. `operations`\n * can also carry operations the job merely moved into a new position, so a\n * consumer reporting back to the caller needs this to tell the two apart.\n * Absent on jobs that carry no submitted actions.\n */\n submittedActionIds?: string[];\n /**\n * Maps documentId to the collection IDs it belongs to.\n * Used by SyncManager to route operations only to remotes\n * whose collection contains the document.\n */\n collectionMemberships?: Record<string, string[]>;\n};\n\n/**\n * Event emitted after all read models have finished processing operations.\n * This event fires after JOB_WRITE_READY and guarantees that:\n * - All read models (DocumentView, DocumentIndexer, etc.) have indexed the operations\n * - All consistency trackers have been updated with the new operation indices\n * - Queries without consistency tokens will now see the updated data\n *\n * This event is useful for:\n * - Test synchronization (knowing when read models are ready)\n * - Observability (measuring read model latency)\n * - Event-driven workflows (triggering downstream processes)\n */\nexport type JobReadReadyEvent = {\n jobId: string;\n operations: OperationWithContext[];\n};\n\n/**\n * Event emitted when a job fails with an unrecoverable error.\n * This event allows the JobAwaiter and other subscribers to react to job failures\n * without polling.\n */\nexport type JobFailedEvent = {\n jobId: string;\n error: Error;\n job?: Job;\n};\n\n/**\n * Event emitted once per batch processed by ReadModelCoordinator.runChain,\n * after all three projection stages complete. Carries per-stage wall times,\n * the chain wait time, and the batch size so projection cost can be\n * attributed by an observer.\n */\nexport type ReadModelBatchCompletedEvent = {\n jobId: string;\n batchSize: number;\n chainWaitDurationMs: number;\n preReadyDurationMs: number;\n emitDurationMs: number;\n postReadyDurationMs: number;\n};\n\n/**\n * Event emitted once per individual read model per batch and stage, after\n * that read model's indexOperations call resolves (or rejects). Lets\n * observers attribute projection cost to a specific read model.\n */\nexport type ReadModelIndexedEvent = {\n jobId: string;\n readModelName: string;\n stage: ReadModelIndexingStage;\n durationMs: number;\n operationCount: number;\n success: boolean;\n};\n"],"mappings":";;;;AAyBA,IAAa,yBAAb,cAA4C,MAAM;CAChD;CAEA,YAAY,QAAmB;EAC7B,MAAM,UAAU,6BAA6B,OAAO,OAAO,aAAa,OACrE,KAAK,MAAM;AACV,OAAI,KAAK,OAAO,MAAM,YAAY,aAAa,EAC7C,QAAQ,EAAY;AAEtB,UAAO,OAAO,EAAE;IAChB,CACD,KAAK,KAAK;AACb,QAAM,QAAQ;AAEd,OAAK,OAAO;AACZ,OAAK,SAAS;;;;;;AAOlB,MAAa,oBAAoB;CAC/B,aAAa;CACb,aAAa;CACb,iBAAiB;CACjB,gBAAgB;CAChB,YAAY;CACZ,2BAA2B;CAC3B,mBAAmB;CACnB,cAAc;CACf"}
|
package/dist/worker-g03lNM42.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { nt as __exportAll } from "./drive-container-types-CS5IxDiA.js";
|
|
2
|
-
import { n as errorToInfo, r as sanitizeArg, t as createForwardingLogger } from "./forwarding-logger-BBkMSxuJ.js";
|
|
3
|
-
//#region src/executor/worker/index.ts
|
|
4
|
-
var worker_exports = /* @__PURE__ */ __exportAll({
|
|
5
|
-
createForwardingLogger: () => createForwardingLogger,
|
|
6
|
-
errorToInfo: () => errorToInfo,
|
|
7
|
-
sanitizeArg: () => sanitizeArg,
|
|
8
|
-
workerEntryPath: () => workerEntryPath
|
|
9
|
-
});
|
|
10
|
-
function resolveWorkerEntryPath() {
|
|
11
|
-
const url = new URL("./entry.js", import.meta.url);
|
|
12
|
-
if (url.protocol !== "file:") return url.href;
|
|
13
|
-
let pathname = decodeURIComponent(url.pathname);
|
|
14
|
-
if (/^\/[A-Za-z]:[/\\]/.test(pathname)) pathname = pathname.slice(1);
|
|
15
|
-
return pathname;
|
|
16
|
-
}
|
|
17
|
-
/** Absolute path to the worker entry script for use with `new Worker(workerEntryPath)`. */
|
|
18
|
-
const workerEntryPath = resolveWorkerEntryPath();
|
|
19
|
-
//#endregion
|
|
20
|
-
export { worker_exports as n, workerEntryPath as t };
|
|
21
|
-
|
|
22
|
-
//# sourceMappingURL=worker-g03lNM42.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-g03lNM42.js","names":[],"sources":["../src/executor/worker/index.ts"],"sourcesContent":["export { createForwardingLogger } from \"./forwarding-logger.js\";\nexport { errorToInfo, sanitizeArg } from \"./sanitize.js\";\n\nfunction resolveWorkerEntryPath(): string {\n const url = new URL(\"./entry.js\", import.meta.url);\n if (url.protocol !== \"file:\") {\n return url.href;\n }\n let pathname = decodeURIComponent(url.pathname);\n if (/^\\/[A-Za-z]:[/\\\\]/.test(pathname)) {\n pathname = pathname.slice(1);\n }\n return pathname;\n}\n\n/** Absolute path to the worker entry script for use with `new Worker(workerEntryPath)`. */\nexport const workerEntryPath = resolveWorkerEntryPath();\n"],"mappings":";;;;;;;;;AAGA,SAAS,yBAAiC;CACxC,MAAM,MAAM,IAAI,IAAI,cAAc,OAAO,KAAK,IAAI;AAClD,KAAI,IAAI,aAAa,QACnB,QAAO,IAAI;CAEb,IAAI,WAAW,mBAAmB,IAAI,SAAS;AAC/C,KAAI,oBAAoB,KAAK,SAAS,CACpC,YAAW,SAAS,MAAM,EAAE;AAE9B,QAAO;;;AAIT,MAAa,kBAAkB,wBAAwB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-handle-CrERzl8s.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 type { JobExecutorConfig } from \"../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 /** Omitted = the worker performs no executor-side signature verification. */\n signatureVerifier?: SignatureVerifierSpec;\n models: ModelManifestEntry[];\n /** Omitted = the worker builds its executor with the built-in defaults. */\n executorConfig?: JobExecutorConfig;\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 executorConfig: this.initPayload.executorConfig,\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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"}
|