atabey-shared 0.0.22 → 0.0.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.
@@ -0,0 +1,210 @@
1
+ /**
2
+ * In-Memory Worker Pool — worker_threads based, no Redis/BullMQ.
3
+ *
4
+ * Heavy / isolable work runs off the main thread. Concurrency is capped
5
+ * (default os.cpus().length) via an internal queue so RAM/CPU stay bounded.
6
+ *
7
+ * Thread-safety note: SQLite (better-sqlite3) bindings are NOT thread-safe.
8
+ * Worker threads MUST NOT access AtabeyStorage or any SQLite connection.
9
+ * Only CPU-bound isolable work (hash, tokenize, etc.) should be dispatched
10
+ * to the worker pool.
11
+ */
12
+ import fs from "fs";
13
+ import os from "os";
14
+ import path from "path";
15
+ import { fileURLToPath } from "url";
16
+ import { Worker } from "worker_threads";
17
+ function defaultWorkerScript() {
18
+ // Compiled ESM layout: dist/worker-thread.js next to this module
19
+ const here = path.dirname(fileURLToPath(import.meta.url));
20
+ const jsScript = path.join(here, "worker-thread.js");
21
+ const tsScript = path.join(here, "worker-thread.ts");
22
+ // Prefer compiled JS; fall back to TS for dev (tsx/ts-node)
23
+ if (fs.existsSync(jsScript))
24
+ return jsScript;
25
+ if (fs.existsSync(tsScript))
26
+ return tsScript;
27
+ // Fallback: try resolving via import.meta.resolve for monorepo layouts
28
+ try {
29
+ const resolved = import.meta.resolve("./worker-thread.js");
30
+ if (resolved)
31
+ return new URL(resolved).pathname;
32
+ }
33
+ catch {
34
+ // ignore
35
+ }
36
+ return jsScript;
37
+ }
38
+ export class WorkerPool {
39
+ maxConcurrency;
40
+ minWorkers;
41
+ jobTimeoutMs;
42
+ workerScript;
43
+ workers = [];
44
+ queue = [];
45
+ inflight = new Map();
46
+ jobSeq = 0;
47
+ closed = false;
48
+ constructor(options = {}) {
49
+ const cpus = Math.max(1, os.cpus()?.length || 1);
50
+ const requested = options.maxConcurrency ?? cpus;
51
+ this.maxConcurrency = Math.max(1, Math.min(requested, 16));
52
+ this.minWorkers = Math.max(0, Math.min(options.minWorkers ?? Math.min(2, this.maxConcurrency), this.maxConcurrency));
53
+ this.jobTimeoutMs = options.jobTimeoutMs ?? 30_000;
54
+ this.workerScript = options.workerScript ?? defaultWorkerScript();
55
+ for (let i = 0; i < this.minWorkers; i++) {
56
+ this.spawnWorker();
57
+ }
58
+ }
59
+ /**
60
+ * Run a named job type on a worker thread.
61
+ * Returns when the worker posts a result (or on timeout/error).
62
+ */
63
+ run(type, payload) {
64
+ if (this.closed) {
65
+ return Promise.reject(new Error("[WorkerPool] Pool is closed."));
66
+ }
67
+ const id = `wjob-${++this.jobSeq}-${Date.now()}`;
68
+ const job = { id, type, payload };
69
+ return new Promise((resolve, reject) => {
70
+ const timer = setTimeout(() => {
71
+ this.inflight.delete(id);
72
+ reject(new Error(`[WorkerPool] Job ${id} timed out after ${this.jobTimeoutMs}ms`));
73
+ }, this.jobTimeoutMs);
74
+ const pending = {
75
+ job,
76
+ resolve: (v) => resolve(v),
77
+ reject,
78
+ timer,
79
+ };
80
+ this.queue.push(pending);
81
+ this.dispatch();
82
+ });
83
+ }
84
+ getStats() {
85
+ return {
86
+ maxConcurrency: this.maxConcurrency,
87
+ workers: this.workers.length,
88
+ busy: this.workers.filter((w) => w.busy).length,
89
+ pending: this.queue.length,
90
+ inflight: this.inflight.size,
91
+ };
92
+ }
93
+ async close() {
94
+ this.closed = true;
95
+ while (this.queue.length > 0) {
96
+ const p = this.queue.shift();
97
+ if (p) {
98
+ clearTimeout(p.timer);
99
+ p.reject(new Error("[WorkerPool] Pool closed while job was queued."));
100
+ }
101
+ }
102
+ await Promise.all(this.workers.map((pw) => new Promise((resolve) => {
103
+ pw.worker.once("exit", () => resolve());
104
+ void pw.worker.terminate();
105
+ })));
106
+ this.workers.length = 0;
107
+ }
108
+ failWorkerJob(pw, error) {
109
+ const jobId = pw.currentJobId;
110
+ pw.busy = false;
111
+ pw.currentJobId = null;
112
+ if (!jobId)
113
+ return;
114
+ const pending = this.inflight.get(jobId);
115
+ if (!pending)
116
+ return;
117
+ clearTimeout(pending.timer);
118
+ this.inflight.delete(jobId);
119
+ pending.reject(error);
120
+ }
121
+ spawnWorker() {
122
+ const worker = new Worker(this.workerScript);
123
+ const pw = { worker, busy: false, currentJobId: null };
124
+ worker.on("message", (msg) => {
125
+ const pending = this.inflight.get(msg.id);
126
+ pw.busy = false;
127
+ pw.currentJobId = null;
128
+ if (!pending) {
129
+ this.dispatch();
130
+ return;
131
+ }
132
+ clearTimeout(pending.timer);
133
+ this.inflight.delete(msg.id);
134
+ if (msg.ok) {
135
+ pending.resolve(msg.result);
136
+ }
137
+ else {
138
+ pending.reject(new Error(msg.error || "Worker job failed"));
139
+ }
140
+ this.dispatch();
141
+ });
142
+ worker.on("error", (err) => {
143
+ this.failWorkerJob(pw, err instanceof Error ? err : new Error(String(err)));
144
+ this.removeWorker(pw);
145
+ if (!this.closed) {
146
+ this.spawnWorker();
147
+ }
148
+ this.dispatch();
149
+ });
150
+ worker.on("exit", (code) => {
151
+ if (pw.busy && pw.currentJobId) {
152
+ this.failWorkerJob(pw, new Error(`[WorkerPool] Worker exited with code ${code} while running job ${pw.currentJobId}`));
153
+ }
154
+ this.removeWorker(pw);
155
+ if (!this.closed && code !== 0) {
156
+ // Replace crashed worker so pool size recovers
157
+ if (this.workers.length < this.minWorkers) {
158
+ this.spawnWorker();
159
+ }
160
+ }
161
+ this.dispatch();
162
+ });
163
+ this.workers.push(pw);
164
+ return pw;
165
+ }
166
+ removeWorker(pw) {
167
+ const idx = this.workers.indexOf(pw);
168
+ if (idx >= 0)
169
+ this.workers.splice(idx, 1);
170
+ }
171
+ dispatch() {
172
+ if (this.closed)
173
+ return;
174
+ while (this.queue.length > 0) {
175
+ let free = this.workers.find((w) => !w.busy);
176
+ if (!free && this.workers.length < this.maxConcurrency) {
177
+ free = this.spawnWorker();
178
+ }
179
+ if (!free)
180
+ break;
181
+ const pending = this.queue.shift();
182
+ if (!pending)
183
+ break;
184
+ free.busy = true;
185
+ free.currentJobId = pending.job.id;
186
+ this.inflight.set(pending.job.id, pending);
187
+ free.worker.postMessage(pending.job);
188
+ }
189
+ }
190
+ }
191
+ let defaultPool = null;
192
+ export function getDefaultWorkerPool(options) {
193
+ if (!defaultPool) {
194
+ const fromEnv = process.env.ATABEY_WORKER_CONCURRENCY
195
+ ? parseInt(process.env.ATABEY_WORKER_CONCURRENCY, 10)
196
+ : undefined;
197
+ defaultPool = new WorkerPool({
198
+ maxConcurrency: options?.maxConcurrency ?? (Number.isFinite(fromEnv) ? fromEnv : undefined),
199
+ ...options,
200
+ });
201
+ }
202
+ return defaultPool;
203
+ }
204
+ export async function resetDefaultWorkerPool() {
205
+ if (defaultPool) {
206
+ await defaultPool.close();
207
+ defaultPool = null;
208
+ }
209
+ }
210
+ //# sourceMappingURL=worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Generic worker_threads entrypoint for Atabey WorkerPool.
3
+ * Receives serializable jobs and returns serializable results.
4
+ *
5
+ * Supported job types (extensible):
6
+ * - "ping" — health check
7
+ * - "hash" — simple string hash (CPU sample)
8
+ * - "tokenize" — tokenization for TF-IDF style work
9
+ * - "sleep" — test helper
10
+ */
11
+ export interface WorkerJob {
12
+ id: string;
13
+ type: string;
14
+ payload?: unknown;
15
+ }
16
+ export interface WorkerResult {
17
+ id: string;
18
+ ok: boolean;
19
+ result?: unknown;
20
+ error?: string;
21
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Generic worker_threads entrypoint for Atabey WorkerPool.
3
+ * Receives serializable jobs and returns serializable results.
4
+ *
5
+ * Supported job types (extensible):
6
+ * - "ping" — health check
7
+ * - "hash" — simple string hash (CPU sample)
8
+ * - "tokenize" — tokenization for TF-IDF style work
9
+ * - "sleep" — test helper
10
+ */
11
+ import { parentPort } from "worker_threads";
12
+ function tokenize(text) {
13
+ return text
14
+ .toLowerCase()
15
+ .replace(/[^\w\s-]/g, " ")
16
+ .split(/\s+/)
17
+ .filter((t) => t.length > 1);
18
+ }
19
+ function simpleHash(input) {
20
+ let h = 0;
21
+ for (let i = 0; i < input.length; i++) {
22
+ h = (Math.imul(31, h) + input.charCodeAt(i)) | 0;
23
+ }
24
+ return h >>> 0;
25
+ }
26
+ async function handleJob(job) {
27
+ switch (job.type) {
28
+ case "ping":
29
+ return { pong: true, pid: process.pid, ts: Date.now() };
30
+ case "hash": {
31
+ const text = String(job.payload?.text ?? "");
32
+ return { hash: simpleHash(text), length: text.length };
33
+ }
34
+ case "tokenize": {
35
+ const text = String(job.payload?.text ?? "");
36
+ const tokens = tokenize(text);
37
+ return { tokens, count: tokens.length };
38
+ }
39
+ case "sleep": {
40
+ const ms = Math.min(10_000, Math.max(0, Number(job.payload?.ms ?? 0)));
41
+ await new Promise((r) => setTimeout(r, ms));
42
+ return { slept: ms };
43
+ }
44
+ default:
45
+ throw new Error(`Unknown worker job type: ${job.type}`);
46
+ }
47
+ }
48
+ if (parentPort) {
49
+ parentPort.on("message", (job) => {
50
+ void (async () => {
51
+ try {
52
+ const result = await handleJob(job);
53
+ const msg = { id: job.id, ok: true, result };
54
+ parentPort.postMessage(msg);
55
+ }
56
+ catch (err) {
57
+ const msg = {
58
+ id: job.id,
59
+ ok: false,
60
+ error: err instanceof Error ? err.message : String(err),
61
+ };
62
+ parentPort.postMessage(msg);
63
+ }
64
+ })();
65
+ });
66
+ }
67
+ //# sourceMappingURL=worker-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-thread.js","sourceRoot":"","sources":["../src/worker-thread.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atabey-shared",
3
- "version": "0.0.22",
3
+ "version": "0.0.25",
4
4
  "description": "Shared utility modules for Atabey — AI Governance & Multi-Agent Platform / Orchestrator",
5
5
  "author": "Yusuf BEKAR",
6
6
  "license": "AGPL-3.0",
@@ -35,6 +35,7 @@
35
35
  "exports": {
36
36
  ".": "./dist/index.js",
37
37
  "./audit.js": "./dist/audit.js",
38
+ "./audit-chain.js": "./dist/audit-chain.js",
38
39
  "./constants.js": "./dist/constants.js",
39
40
  "./database.js": "./dist/database.js",
40
41
  "./errors.js": "./dist/errors.js",
@@ -44,7 +45,16 @@
44
45
  "./pii.js": "./dist/pii.js",
45
46
  "./retention.js": "./dist/retention.js",
46
47
  "./string.js": "./dist/string.js",
47
- "./types.js": "./dist/types.js"
48
+ "./types.js": "./dist/types.js",
49
+ "./job-queue.js": "./dist/job-queue.js",
50
+ "./worker-pool.js": "./dist/worker-pool.js",
51
+ "./worker-thread.js": "./dist/worker-thread.js",
52
+ "./file-lock.js": "./dist/file-lock.js",
53
+ "./sandbox.js": "./dist/sandbox.js",
54
+ "./sandbox-runtime.js": "./dist/sandbox-runtime.js",
55
+ "./sandbox-fs.js": "./dist/sandbox-fs.js",
56
+ "./resilience.js": "./dist/resilience.js",
57
+ "./policy-gate.js": "./dist/policy-gate.js"
48
58
  },
49
59
  "scripts": {
50
60
  "build": "tsc",