@presidio-dev/hai-guardrails
Version:
A set of guards for LLM Apps
1,379 lines (1,353 loc) • 477 kB
JavaScript
var __create = Object.create;
var __getProtoOf = Object.getPrototypeOf;
var __defProp = Object.defineProperty;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __toESM = (mod, isNodeMode, target) => {
target = mod != null ? __create(__getProtoOf(mod)) : {};
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
for (let key of __getOwnPropNames(mod))
if (!__hasOwnProp.call(to, key))
__defProp(to, key, {
get: () => mod[key],
enumerable: true
});
return to;
};
var __moduleCache = /* @__PURE__ */ new WeakMap;
var __toCommonJS = (from) => {
var entry = __moduleCache.get(from), desc;
if (entry)
return entry;
entry = __defProp({}, "__esModule", { value: true });
if (from && typeof from === "object" || typeof from === "function")
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
}));
__moduleCache.set(from, entry);
return entry;
};
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {
get: all[name],
enumerable: true,
configurable: true,
set: (newValue) => all[name] = () => newValue
});
};
// node_modules/piscina/package.json
var require_package = __commonJS((exports2, module2) => {
module2.exports = {
name: "piscina",
version: "5.1.1",
description: "A fast, efficient Node.js Worker Thread Pool implementation",
main: "./dist/main.js",
types: "./dist/index.d.ts",
exports: {
types: "./dist/index.d.ts",
import: "./dist/esm-wrapper.mjs",
require: "./dist/main.js"
},
engines: {
node: ">=20.x"
},
scripts: {
build: "tsc && gen-esm-wrapper . dist/esm-wrapper.mjs",
lint: "eslint",
test: "node scripts/run-tests.js --pattern='test/**/*test.ts'",
"test:ci": "npm run lint && npm run build && npm run test:coverage",
"test:coverage": "node scripts/run-tests.js --coverage --pattern='test/**/*test.ts'",
prepack: "npm run build",
benchmark: "npm run benchmark:queue && npm run benchmark:piscina",
"benchmark:piscina": "npm run benchmark:default && npm run benchmark:queue:fixed && npm run benchmark:default:comparison",
"benchmark:default": "node benchmark/simple-benchmark.js",
"benchmark:default:async": "node benchmark/simple-benchmark.js",
"benchmark:default:comparison": "node benchmark/piscina-queue-comparison.js",
"benchmark:queue": "npm run benchmark:queue:comparison",
"benchmark:queue:fixed": "node benchmark/simple-benchmark-fixed-queue.js",
"benchmark:queue:comparison": "node benchmark/queue-comparison.js"
},
repository: {
type: "git",
url: "git+https://github.com/piscinajs/piscina.git"
},
keywords: [
"fast",
"worker threads",
"thread pool",
"wade wilson"
],
author: "James M Snell <jasnell@gmail.com>",
contributors: [
"Anna Henningsen <anna@addaleax.net>",
"Matteo Collina <matteo.collina@gmail.com>",
"Carlos Fuentes <me@metcoder.dev>"
],
license: "MIT",
devDependencies: {
"@types/node": "^24.0.1",
"abort-controller": "^3.0.0",
c8: "^10.1.2",
"concat-stream": "^2.0.0",
eslint: "^9.16.0",
"gen-esm-wrapper": "^1.1.1",
glob: "^11.0.2",
neostandard: "^0.12.0",
tinybench: "^4.0.1",
tsx: "^4.19.4",
typescript: "5.8.3"
},
optionalDependencies: {
"@napi-rs/nice": "^1.0.1"
},
bugs: {
url: "https://github.com/piscinajs/piscina/issues"
},
homepage: "https://github.com/piscinajs/piscina#readme",
directories: {
example: "examples",
test: "test"
}
};
});
// node_modules/piscina/dist/symbols.js
var require_symbols = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.kFieldCount = exports2.kResponseCountField = exports2.kRequestCountField = exports2.kQueueOptions = exports2.kValue = exports2.kTransferable = exports2.kWorkerData = exports2.kMovable = undefined;
exports2.kMovable = Symbol("Piscina.kMovable");
exports2.kWorkerData = Symbol("Piscina.kWorkerData");
exports2.kTransferable = Symbol.for("Piscina.transferable");
exports2.kValue = Symbol.for("Piscina.valueOf");
exports2.kQueueOptions = Symbol.for("Piscina.queueOptions");
exports2.kRequestCountField = 0;
exports2.kResponseCountField = 1;
exports2.kFieldCount = 2;
});
// node_modules/piscina/dist/common.js
var require_common = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.commonState = exports2.READY = undefined;
exports2.isTransferable = isTransferable;
exports2.isMovable = isMovable;
exports2.markMovable = markMovable;
exports2.maybeFileURLToPath = maybeFileURLToPath;
exports2.getAvailableParallelism = getAvailableParallelism;
var node_url_1 = require("node:url");
var node_os_1 = require("node:os");
var symbols_1 = require_symbols();
exports2.READY = "_WORKER_READY";
function isTransferable(value) {
return value != null && typeof value === "object" && symbols_1.kTransferable in value && symbols_1.kValue in value;
}
function isMovable(value) {
return isTransferable(value) && value[symbols_1.kMovable] === true;
}
function markMovable(value) {
Object.defineProperty(value, symbols_1.kMovable, {
enumerable: false,
configurable: true,
writable: true,
value: true
});
}
exports2.commonState = {
isWorkerThread: false,
workerData: undefined
};
function maybeFileURLToPath(filename) {
return filename.startsWith("file:") ? (0, node_url_1.fileURLToPath)(new node_url_1.URL(filename)) : filename;
}
function getAvailableParallelism() {
return (0, node_os_1.availableParallelism)();
}
});
// node_modules/piscina/dist/task_queue/array_queue.js
var require_array_queue = __commonJS((exports2) => {
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { default: mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.ArrayTaskQueue = undefined;
var node_assert_1 = __importDefault(require("node:assert"));
class ArrayTaskQueue {
constructor() {
this.tasks = [];
}
get size() {
return this.tasks.length;
}
shift() {
var _a;
return (_a = this.tasks.shift()) !== null && _a !== undefined ? _a : null;
}
push(task) {
this.tasks.push(task);
}
remove(task) {
const index = this.tasks.indexOf(task);
node_assert_1.default.notStrictEqual(index, -1);
this.tasks.splice(index, 1);
}
}
exports2.ArrayTaskQueue = ArrayTaskQueue;
});
// node_modules/piscina/dist/task_queue/fixed_queue.js
var require_fixed_queue = __commonJS((exports2) => {
var __classPrivateFieldGet = exports2 && exports2.__classPrivateFieldGet || function(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = exports2 && exports2.__classPrivateFieldSet || function(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { default: mod };
};
var _FixedQueue_size;
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.FixedQueue = undefined;
var node_assert_1 = __importDefault(require("node:assert"));
var kSize = 2048;
var kMask = kSize - 1;
class FixedCircularBuffer {
constructor() {
this.bottom = 0;
this.top = 0;
this.list = new Array(kSize);
this.next = null;
}
isEmpty() {
return this.top === this.bottom;
}
isFull() {
return (this.top + 1 & kMask) === this.bottom;
}
push(data) {
this.list[this.top] = data;
this.top = this.top + 1 & kMask;
}
shift() {
const nextItem = this.list[this.bottom];
if (nextItem === undefined) {
return null;
}
this.list[this.bottom] = undefined;
this.bottom = this.bottom + 1 & kMask;
return nextItem;
}
remove(task) {
const indexToRemove = this.list.indexOf(task);
node_assert_1.default.notStrictEqual(indexToRemove, -1);
let curr = indexToRemove;
while (true) {
const next = curr + 1 & kMask;
this.list[curr] = this.list[next];
if (this.list[curr] === undefined) {
break;
}
if (next === indexToRemove) {
this.list[curr] = undefined;
break;
}
curr = next;
}
this.top = this.top - 1 & kMask;
}
}
class FixedQueue {
constructor() {
_FixedQueue_size.set(this, 0);
this.head = this.tail = new FixedCircularBuffer;
}
isEmpty() {
return this.head.isEmpty();
}
push(data) {
var _a;
if (this.head.isFull()) {
this.head = this.head.next = new FixedCircularBuffer;
}
this.head.push(data);
__classPrivateFieldSet(this, _FixedQueue_size, (_a = __classPrivateFieldGet(this, _FixedQueue_size, "f"), _a++, _a), "f");
}
shift() {
var _a;
const tail = this.tail;
const next = tail.shift();
if (next !== null)
__classPrivateFieldSet(this, _FixedQueue_size, (_a = __classPrivateFieldGet(this, _FixedQueue_size, "f"), _a--, _a), "f");
if (tail.isEmpty() && tail.next !== null) {
this.tail = tail.next;
tail.next = null;
}
return next;
}
remove(task) {
var _a;
let prev = null;
let buffer = this.tail;
while (true) {
if (buffer.list.includes(task)) {
buffer.remove(task);
__classPrivateFieldSet(this, _FixedQueue_size, (_a = __classPrivateFieldGet(this, _FixedQueue_size, "f"), _a--, _a), "f");
break;
}
if (buffer.next === null)
break;
prev = buffer;
buffer = buffer.next;
}
if (buffer.isEmpty()) {
if (prev === null) {
if (buffer.next !== null)
this.tail = buffer.next;
} else {
if (buffer.next === null) {
this.head = prev;
} else {
prev.next = buffer.next;
}
}
}
}
get size() {
return __classPrivateFieldGet(this, _FixedQueue_size, "f");
}
}
exports2.FixedQueue = FixedQueue;
_FixedQueue_size = new WeakMap;
});
// node_modules/piscina/dist/task_queue/index.js
var require_task_queue = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.TaskInfo = exports2.FixedQueue = exports2.ArrayTaskQueue = undefined;
exports2.isTaskQueue = isTaskQueue;
var node_perf_hooks_1 = require("node:perf_hooks");
var node_async_hooks_1 = require("node:async_hooks");
var common_1 = require_common();
var symbols_1 = require_symbols();
var array_queue_1 = require_array_queue();
Object.defineProperty(exports2, "ArrayTaskQueue", { enumerable: true, get: function() {
return array_queue_1.ArrayTaskQueue;
} });
var fixed_queue_1 = require_fixed_queue();
Object.defineProperty(exports2, "FixedQueue", { enumerable: true, get: function() {
return fixed_queue_1.FixedQueue;
} });
function isTaskQueue(value) {
return typeof value === "object" && value !== null && "size" in value && typeof value.shift === "function" && typeof value.remove === "function" && typeof value.push === "function";
}
var taskIdCounter = 0;
class TaskInfo extends node_async_hooks_1.AsyncResource {
constructor(task, transferList, filename, name, callback, abortSignal, triggerAsyncId) {
super("Piscina.Task", { requireManualDestroy: true, triggerAsyncId });
this.workerInfo = null;
this.aborted = false;
this._abortListener = null;
this.callback = callback;
this.task = task;
this.transferList = transferList;
if ((0, common_1.isMovable)(task)) {
if (this.transferList == null) {
this.transferList = [];
}
this.transferList = this.transferList.concat(task[symbols_1.kTransferable]);
this.task = task[symbols_1.kValue];
}
this.filename = filename;
this.name = name;
this.taskId = taskIdCounter++;
this.abortSignal = abortSignal;
this.created = node_perf_hooks_1.performance.now();
this.started = 0;
}
set abortListener(value) {
this._abortListener = () => {
this.aborted = true;
value();
};
}
get abortListener() {
return this._abortListener;
}
releaseTask() {
const ret = this.task;
this.task = null;
return ret;
}
done(err, result) {
this.runInAsyncScope(this.callback, null, err, result);
this.emitDestroy();
if (this.abortSignal && this.abortListener) {
if ("removeEventListener" in this.abortSignal && this.abortListener) {
this.abortSignal.removeEventListener("abort", this.abortListener);
} else {
this.abortSignal.off("abort", this.abortListener);
}
}
}
get [symbols_1.kQueueOptions]() {
var _a, _b;
return (_b = (_a = this.task) === null || _a === undefined ? undefined : _a[symbols_1.kQueueOptions]) !== null && _b !== undefined ? _b : null;
}
get interface() {
return {
taskId: this.taskId,
filename: this.filename,
name: this.name,
created: this.created,
isAbortable: this.abortSignal !== null,
[symbols_1.kQueueOptions]: this[symbols_1.kQueueOptions]
};
}
}
exports2.TaskInfo = TaskInfo;
});
// node_modules/piscina/dist/errors.js
var require_errors = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.Errors = undefined;
exports2.Errors = {
ThreadTermination: () => new Error("Terminating worker thread"),
FilenameNotProvided: () => new Error("filename must be provided to run() or in options object"),
TaskQueueAtLimit: () => new Error("Task queue is at limit"),
NoTaskQueueAvailable: () => new Error("No task queue available and all Workers are busy"),
CloseTimeout: () => new Error("Close operation timed out")
};
});
// node_modules/piscina/dist/histogram.js
var require_histogram = __commonJS((exports2) => {
var __classPrivateFieldSet = exports2 && exports2.__classPrivateFieldSet || function(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
var __classPrivateFieldGet = exports2 && exports2.__classPrivateFieldGet || function(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _PiscinaHistogramHandler_runTime;
var _PiscinaHistogramHandler_waitTime;
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.PiscinaHistogramHandler = undefined;
var node_perf_hooks_1 = require("node:perf_hooks");
class PiscinaHistogramHandler {
constructor() {
_PiscinaHistogramHandler_runTime.set(this, undefined);
_PiscinaHistogramHandler_waitTime.set(this, undefined);
__classPrivateFieldSet(this, _PiscinaHistogramHandler_runTime, (0, node_perf_hooks_1.createHistogram)(), "f");
__classPrivateFieldSet(this, _PiscinaHistogramHandler_waitTime, (0, node_perf_hooks_1.createHistogram)(), "f");
}
get runTimeSummary() {
return PiscinaHistogramHandler.createHistogramSummary(__classPrivateFieldGet(this, _PiscinaHistogramHandler_runTime, "f"));
}
get waitTimeSummary() {
return PiscinaHistogramHandler.createHistogramSummary(__classPrivateFieldGet(this, _PiscinaHistogramHandler_waitTime, "f"));
}
get runTimeCount() {
return __classPrivateFieldGet(this, _PiscinaHistogramHandler_runTime, "f").count;
}
recordRunTime(value) {
__classPrivateFieldGet(this, _PiscinaHistogramHandler_runTime, "f").record(PiscinaHistogramHandler.toHistogramIntegerNano(value));
}
recordWaitTime(value) {
__classPrivateFieldGet(this, _PiscinaHistogramHandler_waitTime, "f").record(PiscinaHistogramHandler.toHistogramIntegerNano(value));
}
resetWaitTime() {
__classPrivateFieldGet(this, _PiscinaHistogramHandler_waitTime, "f").reset();
}
resetRunTime() {
__classPrivateFieldGet(this, _PiscinaHistogramHandler_runTime, "f").reset();
}
static createHistogramSummary(histogram) {
const { mean, stddev, min, max } = histogram;
return {
average: mean / 1000,
mean: mean / 1000,
stddev,
min: min / 1000,
max: max / 1000,
p0_001: histogram.percentile(0.001) / 1000,
p0_01: histogram.percentile(0.01) / 1000,
p0_1: histogram.percentile(0.1) / 1000,
p1: histogram.percentile(1) / 1000,
p2_5: histogram.percentile(2.5) / 1000,
p10: histogram.percentile(10) / 1000,
p25: histogram.percentile(25) / 1000,
p50: histogram.percentile(50) / 1000,
p75: histogram.percentile(75) / 1000,
p90: histogram.percentile(90) / 1000,
p97_5: histogram.percentile(97.5) / 1000,
p99: histogram.percentile(99) / 1000,
p99_9: histogram.percentile(99.9) / 1000,
p99_99: histogram.percentile(99.99) / 1000,
p99_999: histogram.percentile(99.999) / 1000
};
}
static toHistogramIntegerNano(milliseconds) {
return Math.max(1, Math.trunc(milliseconds * 1000));
}
}
exports2.PiscinaHistogramHandler = PiscinaHistogramHandler;
_PiscinaHistogramHandler_runTime = new WeakMap, _PiscinaHistogramHandler_waitTime = new WeakMap;
});
// node_modules/piscina/dist/worker_pool/base.js
var require_base = __commonJS((exports2) => {
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { default: mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.AsynchronouslyCreatedResourcePool = exports2.AsynchronouslyCreatedResource = undefined;
var node_assert_1 = __importDefault(require("node:assert"));
class AsynchronouslyCreatedResource {
constructor() {
this.onreadyListeners = [];
this.ondestroyListeners = [];
}
markAsReady() {
const listeners = this.onreadyListeners;
(0, node_assert_1.default)(listeners !== null);
this.onreadyListeners = null;
for (const listener of listeners) {
listener();
}
}
isReady() {
return this.onreadyListeners === null;
}
onReady(fn) {
if (this.onreadyListeners === null) {
fn();
return;
}
this.onreadyListeners.push(fn);
}
onDestroy(fn) {
if (this.ondestroyListeners === null) {
return;
}
this.ondestroyListeners.push(fn);
}
markAsDestroyed() {
const listeners = this.ondestroyListeners;
(0, node_assert_1.default)(listeners !== null);
this.ondestroyListeners = null;
for (const listener of listeners) {
listener();
}
}
isDestroyed() {
return this.ondestroyListeners === null;
}
}
exports2.AsynchronouslyCreatedResource = AsynchronouslyCreatedResource;
class AsynchronouslyCreatedResourcePool {
constructor(maximumUsage) {
this.pendingItems = new Set;
this.readyItems = new Set;
this.maximumUsage = maximumUsage;
this.onAvailableListeners = [];
this.onTaskDoneListeners = [];
}
add(item) {
this.pendingItems.add(item);
item.onReady(() => {
if (this.pendingItems.has(item)) {
this.pendingItems.delete(item);
this.readyItems.add(item);
this.maybeAvailable(item);
}
});
}
delete(item) {
this.pendingItems.delete(item);
this.readyItems.delete(item);
}
*[Symbol.iterator]() {
yield* this.pendingItems;
yield* this.readyItems;
}
get size() {
return this.pendingItems.size + this.readyItems.size;
}
maybeAvailable(item) {
if (item.currentUsage() < this.maximumUsage) {
for (const listener of this.onAvailableListeners) {
listener(item);
}
}
}
onAvailable(fn) {
this.onAvailableListeners.push(fn);
}
taskDone(item) {
for (let i = 0;i < this.onTaskDoneListeners.length; i++) {
this.onTaskDoneListeners[i](item);
}
}
onTaskDone(fn) {
this.onTaskDoneListeners.push(fn);
}
getCurrentUsage() {
let inFlight = 0;
for (const worker of this.readyItems) {
const currentUsage = worker.currentUsage();
if (Number.isFinite(currentUsage))
inFlight += currentUsage;
}
return inFlight;
}
}
exports2.AsynchronouslyCreatedResourcePool = AsynchronouslyCreatedResourcePool;
});
// node_modules/piscina/dist/worker_pool/balancer/index.js
var require_balancer = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.LeastBusyBalancer = LeastBusyBalancer;
function LeastBusyBalancer(opts) {
const { maximumUsage } = opts;
return (task, workers) => {
let candidate = null;
let checkpoint = maximumUsage;
for (const worker of workers) {
if (worker.currentUsage === 0) {
candidate = worker;
break;
}
if (worker.isRunningAbortableTask)
continue;
if (!task.isAbortable && worker.currentUsage < checkpoint) {
candidate = worker;
checkpoint = worker.currentUsage;
}
}
return candidate;
};
}
});
// node_modules/piscina/dist/worker_pool/index.js
var require_worker_pool = __commonJS((exports2) => {
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
if (k2 === undefined)
k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() {
return m[k];
} };
}
Object.defineProperty(o, k2, desc);
} : function(o, m, k, k2) {
if (k2 === undefined)
k2 = k;
o[k2] = m[k];
});
var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p))
__createBinding(exports3, m, p);
};
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { default: mod };
};
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.AsynchronouslyCreatedResourcePool = exports2.WorkerInfo = undefined;
var node_worker_threads_1 = require("node:worker_threads");
var node_perf_hooks_1 = require("node:perf_hooks");
var node_assert_1 = __importDefault(require("node:assert"));
var errors_1 = require_errors();
var symbols_1 = require_symbols();
var histogram_1 = require_histogram();
var base_1 = require_base();
Object.defineProperty(exports2, "AsynchronouslyCreatedResourcePool", { enumerable: true, get: function() {
return base_1.AsynchronouslyCreatedResourcePool;
} });
__exportStar(require_balancer(), exports2);
class WorkerInfo extends base_1.AsynchronouslyCreatedResource {
constructor(worker, port, onMessage, enableHistogram) {
super();
this.idleTimeout = null;
this.lastSeenResponseCount = 0;
this.terminating = false;
this.destroyed = false;
this.worker = worker;
this.port = port;
this.port.on("message", (message) => this._handleResponse(message));
this.onMessage = onMessage;
this.taskInfos = new Map;
this.sharedBuffer = new Int32Array(new SharedArrayBuffer(symbols_1.kFieldCount * Int32Array.BYTES_PER_ELEMENT));
this.histogram = enableHistogram ? (0, node_perf_hooks_1.createHistogram)() : null;
}
get id() {
return this.worker.threadId;
}
destroy() {
if (this.terminating || this.destroyed)
return;
this.terminating = true;
this.worker.terminate();
this.port.close();
this.clearIdleTimeout();
for (const taskInfo of this.taskInfos.values()) {
taskInfo.done(errors_1.Errors.ThreadTermination());
}
this.taskInfos.clear();
this.terminating = false;
this.destroyed = true;
this.markAsDestroyed();
}
clearIdleTimeout() {
if (this.idleTimeout != null) {
clearTimeout(this.idleTimeout);
this.idleTimeout = null;
}
}
ref() {
this.port.ref();
return this;
}
unref() {
this.port.unref();
return this;
}
_handleResponse(message) {
var _a;
if (message.time != null) {
(_a = this.histogram) === null || _a === undefined || _a.record(histogram_1.PiscinaHistogramHandler.toHistogramIntegerNano(message.time));
}
this.onMessage(message);
if (this.taskInfos.size === 0) {
this.unref();
}
}
postTask(taskInfo) {
(0, node_assert_1.default)(!this.taskInfos.has(taskInfo.taskId));
(0, node_assert_1.default)(!this.terminating && !this.destroyed);
const message = {
task: taskInfo.releaseTask(),
taskId: taskInfo.taskId,
filename: taskInfo.filename,
name: taskInfo.name,
histogramEnabled: this.histogram != null ? 1 : 0
};
try {
this.clearIdleTimeout();
this.port.postMessage(message, taskInfo.transferList);
} catch (err) {
taskInfo.done(err);
return;
}
taskInfo.workerInfo = this;
this.taskInfos.set(taskInfo.taskId, taskInfo);
this.ref();
Atomics.add(this.sharedBuffer, symbols_1.kRequestCountField, 1);
Atomics.notify(this.sharedBuffer, symbols_1.kRequestCountField, 1);
}
processPendingMessages() {
if (this.destroyed)
return;
const actualResponseCount = Atomics.load(this.sharedBuffer, symbols_1.kResponseCountField);
if (actualResponseCount !== this.lastSeenResponseCount) {
this.lastSeenResponseCount = actualResponseCount;
let entry;
while ((entry = (0, node_worker_threads_1.receiveMessageOnPort)(this.port)) !== undefined) {
this._handleResponse(entry.message);
}
}
}
isRunningAbortableTask() {
if (this.taskInfos.size !== 1)
return false;
const [[, task]] = this.taskInfos;
return task.abortSignal !== null;
}
currentUsage() {
if (this.isRunningAbortableTask())
return Infinity;
return this.taskInfos.size;
}
get interface() {
const worker = this;
return {
get id() {
return worker.worker.threadId;
},
get currentUsage() {
return worker.currentUsage();
},
get isRunningAbortableTask() {
return worker.isRunningAbortableTask();
},
get histogram() {
return worker.histogram != null ? histogram_1.PiscinaHistogramHandler.createHistogramSummary(worker.histogram) : null;
},
get terminating() {
return worker.terminating;
},
get destroyed() {
return worker.destroyed;
},
[symbols_1.kWorkerData]: worker
};
}
}
exports2.WorkerInfo = WorkerInfo;
});
// node_modules/piscina/dist/abort.js
var require_abort = __commonJS((exports2) => {
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.AbortError = undefined;
exports2.onabort = onabort;
class AbortError extends Error {
constructor(reason) {
super("The task has been aborted", { cause: reason });
}
get name() {
return "AbortError";
}
}
exports2.AbortError = AbortError;
function onabort(abortSignal, listener) {
if ("addEventListener" in abortSignal) {
abortSignal.addEventListener("abort", listener, { once: true });
} else {
abortSignal.once("abort", listener);
}
}
});
// node_modules/piscina/dist/index.js
var require_dist = __commonJS((exports2) => {
var __dirname = "/home/runner/work/hai-guardrails/hai-guardrails/node_modules/piscina/dist";
var __classPrivateFieldSet = exports2 && exports2.__classPrivateFieldSet || function(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
var __classPrivateFieldGet = exports2 && exports2.__classPrivateFieldGet || function(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : { default: mod };
};
var _DirectlyTransferable_value;
var _ArrayBufferViewTransferable_view;
var _Piscina_pool;
var _Piscina_histogram;
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.FixedQueue = exports2.version = exports2.queueOptionsSymbol = exports2.valueSymbol = exports2.transferableSymbol = exports2.Piscina = exports2.workerData = exports2.isWorkerThread = exports2.move = undefined;
var node_worker_threads_1 = require("node:worker_threads");
var node_events_1 = require("node:events");
var node_path_1 = require("node:path");
var node_util_1 = require("node:util");
var node_perf_hooks_1 = require("node:perf_hooks");
var promises_1 = require("node:timers/promises");
var node_assert_1 = __importDefault(require("node:assert"));
var package_json_1 = require_package();
Object.defineProperty(exports2, "version", { enumerable: true, get: function() {
return package_json_1.version;
} });
var symbols_1 = require_symbols();
Object.defineProperty(exports2, "queueOptionsSymbol", { enumerable: true, get: function() {
return symbols_1.kQueueOptions;
} });
Object.defineProperty(exports2, "transferableSymbol", { enumerable: true, get: function() {
return symbols_1.kTransferable;
} });
Object.defineProperty(exports2, "valueSymbol", { enumerable: true, get: function() {
return symbols_1.kValue;
} });
var task_queue_1 = require_task_queue();
Object.defineProperty(exports2, "FixedQueue", { enumerable: true, get: function() {
return task_queue_1.FixedQueue;
} });
var worker_pool_1 = require_worker_pool();
var abort_1 = require_abort();
var histogram_1 = require_histogram();
var errors_1 = require_errors();
var common_1 = require_common();
var cpuParallelism = (0, common_1.getAvailableParallelism)();
var kDefaultOptions = {
filename: null,
name: "default",
minThreads: Math.max(Math.floor(cpuParallelism / 2), 1),
maxThreads: cpuParallelism * 1.5,
idleTimeout: 0,
maxQueue: Infinity,
concurrentTasksPerWorker: 1,
atomics: "sync",
taskQueue: new task_queue_1.ArrayTaskQueue,
niceIncrement: 0,
trackUnmanagedFds: true,
closeTimeout: 30000,
recordTiming: true,
workerHistogram: false
};
var kDefaultRunOptions = {
transferList: undefined,
filename: null,
signal: null,
name: null
};
var kDefaultCloseOptions = {
force: false
};
class DirectlyTransferable {
constructor(value) {
_DirectlyTransferable_value.set(this, undefined);
__classPrivateFieldSet(this, _DirectlyTransferable_value, value, "f");
}
get [(_DirectlyTransferable_value = new WeakMap, symbols_1.kTransferable)]() {
return __classPrivateFieldGet(this, _DirectlyTransferable_value, "f");
}
get [symbols_1.kValue]() {
return __classPrivateFieldGet(this, _DirectlyTransferable_value, "f");
}
}
class ArrayBufferViewTransferable {
constructor(view) {
_ArrayBufferViewTransferable_view.set(this, undefined);
__classPrivateFieldSet(this, _ArrayBufferViewTransferable_view, view, "f");
}
get [(_ArrayBufferViewTransferable_view = new WeakMap, symbols_1.kTransferable)]() {
return __classPrivateFieldGet(this, _ArrayBufferViewTransferable_view, "f").buffer;
}
get [symbols_1.kValue]() {
return __classPrivateFieldGet(this, _ArrayBufferViewTransferable_view, "f");
}
}
class ThreadPool {
constructor(publicInterface, options) {
var _a, _b, _c;
this.skipQueue = [];
this.completed = 0;
this.histogram = null;
this.start = node_perf_hooks_1.performance.now();
this.inProcessPendingMessages = false;
this.startingUp = false;
this.closingUp = false;
this.workerFailsDuringBootstrap = false;
this.destroying = false;
this.publicInterface = publicInterface;
this.taskQueue = (_a = options.taskQueue) !== null && _a !== undefined ? _a : new task_queue_1.FixedQueue;
const filename = options.filename ? (0, common_1.maybeFileURLToPath)(options.filename) : null;
this.options = { ...kDefaultOptions, ...options, filename, maxQueue: 0 };
if (this.options.recordTiming) {
this.histogram = new histogram_1.PiscinaHistogramHandler;
}
if (options.maxThreads !== undefined && this.options.minThreads >= options.maxThreads) {
this.options.minThreads = options.maxThreads;
}
if (options.minThreads !== undefined && this.options.maxThreads <= options.minThreads) {
this.options.maxThreads = options.minThreads;
}
if (options.maxQueue === "auto") {
this.options.maxQueue = this.options.maxThreads ** 2;
} else {
this.options.maxQueue = (_b = options.maxQueue) !== null && _b !== undefined ? _b : kDefaultOptions.maxQueue;
}
this.balancer = (_c = this.options.loadBalancer) !== null && _c !== undefined ? _c : (0, worker_pool_1.LeastBusyBalancer)({ maximumUsage: this.options.concurrentTasksPerWorker });
this.workers = new worker_pool_1.AsynchronouslyCreatedResourcePool(this.options.concurrentTasksPerWorker);
this.workers.onTaskDone((w) => this._onWorkerTaskDone(w));
this.maxCapacity = this.options.maxThreads * this.options.concurrentTasksPerWorker;
this.startingUp = true;
this._ensureMinimumWorkers();
this.startingUp = false;
this._needsDrain = false;
}
_ensureMinimumWorkers() {
if (this.closingUp || this.destroying) {
return;
}
while (this.workers.size < this.options.minThreads) {
this._addNewWorker();
}
}
_addNewWorker() {
if (this.closingUp)
return;
const pool = this;
const worker = new node_worker_threads_1.Worker((0, node_path_1.resolve)(__dirname, "worker.js"), {
env: this.options.env,
argv: this.options.argv,
execArgv: this.options.execArgv,
resourceLimits: this.options.resourceLimits,
workerData: this.options.workerData,
trackUnmanagedFds: this.options.trackUnmanagedFds
});
const { port1, port2 } = new node_worker_threads_1.MessageChannel;
const workerInfo = new worker_pool_1.WorkerInfo(worker, port1, onMessage, this.options.workerHistogram);
workerInfo.onDestroy(() => {
this.publicInterface.emit("workerDestroy", workerInfo.interface);
});
if (this.startingUp) {
workerInfo.markAsReady();
queueMicrotask(() => {
this.publicInterface.emit("workerCreate", workerInfo.interface);
this._onWorkerReady(workerInfo);
});
} else {
workerInfo.onReady(() => {
this.publicInterface.emit("workerCreate", workerInfo.interface);
this._onWorkerReady(workerInfo);
});
}
const message = {
filename: this.options.filename,
name: this.options.name,
port: port2,
sharedBuffer: workerInfo.sharedBuffer,
atomics: this.options.atomics,
niceIncrement: this.options.niceIncrement
};
worker.postMessage(message, [port2]);
function onMessage(message2) {
const { taskId, result } = message2;
const taskInfo = workerInfo.taskInfos.get(taskId);
workerInfo.taskInfos.delete(taskId);
pool.workers.taskDone(workerInfo);
if (taskInfo === undefined) {
const err = new Error(`Unexpected message from Worker: ${(0, node_util_1.inspect)(message2)}`);
pool.publicInterface.emit("error", err);
} else {
taskInfo.done(message2.error, result);
}
pool._processPendingMessages();
}
function onReady() {
if (workerInfo.currentUsage() === 0) {
workerInfo.unref();
}
if (!workerInfo.isReady()) {
workerInfo.markAsReady();
}
}
function onEventMessage(message2) {
pool.publicInterface.emit("message", message2);
}
worker.on("message", (message2) => {
message2 instanceof Object && common_1.READY in message2 ? onReady() : onEventMessage(message2);
});
worker.on("error", (err) => {
this._onError(worker, workerInfo, err, false);
});
worker.on("exit", (exitCode) => {
if (this.destroying) {
return;
}
const err = new Error(`worker exited with code: ${exitCode}`);
this._onError(worker, workerInfo, err, true);
});
worker.unref();
port1.on("close", () => {
worker.ref();
});
this.workers.add(workerInfo);
}
_onError(worker, workerInfo, err, onlyErrorUnfinishedTasks) {
worker.ref = () => {
};
const taskInfos = [...workerInfo.taskInfos.values()];
workerInfo.taskInfos.clear();
this._removeWorker(workerInfo);
if (workerInfo.isReady() && !this.workerFailsDuringBootstrap) {
this._ensureMinimumWorkers();
} else {
this.workerFailsDuringBootstrap = true;
}
if (taskInfos.length > 0) {
for (const taskInfo of taskInfos) {
taskInfo.done(err, null);
}
} else if (!onlyErrorUnfinishedTasks) {
this.publicInterface.emit("error", err);
}
}
_processPendingMessages() {
if (this.inProcessPendingMessages || this.options.atomics === "disabled") {
return;
}
this.inProcessPendingMessages = true;
try {
for (const workerInfo of this.workers) {
workerInfo.processPendingMessages();
}
} finally {
this.inProcessPendingMessages = false;
}
}
_removeWorker(workerInfo) {
workerInfo.destroy();
this.workers.delete(workerInfo);
}
_onWorkerReady(workerInfo) {
this._onWorkerAvailable(workerInfo);
}
_onWorkerTaskDone(workerInfo) {
this._onWorkerAvailable(workerInfo);
}
_onWorkerAvailable(workerInfo) {
let workers = null;
while (this.taskQueue.size > 0 || this.skipQueue.length > 0) {
const taskInfo = this.skipQueue.shift() || this.taskQueue.shift();
if (workers == null) {
workers = [...this.workers].map((workerInfo2) => workerInfo2.interface);
}
const distributed = this._distributeTask(taskInfo, workers);
if (distributed) {
continue;
} else if (this.workers.size < this.options.maxThreads) {
this._addNewWorker();
continue;
} else {
break;
}
}
if (this.options.idleTimeout === Infinity) {
return;
}
if (workerInfo.currentUsage() === 0 && this.workers.size > this.options.minThreads) {
workerInfo.idleTimeout = setTimeout(() => {
node_assert_1.default.strictEqual(workerInfo.currentUsage(), 0);
if (this.workers.size > this.options.minThreads) {
this._removeWorker(workerInfo);
}
}, this.options.idleTimeout).unref();
}
}
_distributeTask(task, workers) {
var _a;
if (task.aborted)
return true;
const candidate = this.balancer(task.interface, workers);
if (candidate != null && candidate[symbols_1.kWorkerData] != null) {
const now = node_perf_hooks_1.performance.now();
(_a = this.histogram) === null || _a === undefined || _a.recordWaitTime(now - task.created);
task.started = now;
candidate[symbols_1.kWorkerData].postTask(task);
this._maybeDrain();
return true;
}
if (task.abortSignal) {
this.skipQueue.push(task);
} else {
this.taskQueue.push(task);
}
return false;
}
runTask(task, options) {
var _a;
let { filename, name } = options;
const { transferList = [] } = options;
if (filename == null) {
filename = this.options.filename;
}
if (name == null) {
name = this.options.name;
}
if (typeof filename !== "string") {
return Promise.reject(errors_1.Errors.FilenameNotProvided());
}
filename = (0, common_1.maybeFileURLToPath)(filename);
let signal;
if (this.closingUp || this.destroying) {
const closingUpAbortController = new AbortController;
closingUpAbortController.abort("queue is being terminated");
signal = closingUpAbortController.signal;
} else {
signal = (_a = options.signal) !== null && _a !== undefined ? _a : null;
}
let resolve;
let reject;
const ret = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
const taskInfo = new task_queue_1.TaskInfo(task, transferList, filename, name, (err, result) => {
var _a2;
this.completed++;
if (taskInfo.started) {
(_a2 = this.histogram) === null || _a2 === undefined || _a2.recordRunTime(node_perf_hooks_1.performance.now() - taskInfo.started);
}
if (err !== null) {
reject(err);
} else {
resolve(result);
}
this._maybeDrain();
}, signal, this.publicInterface.asyncResource.asyncId());
if (signal !== null) {
if (signal.aborted) {
reject(new abort_1.AbortError(signal.reason));
return ret;
}
taskInfo.abortListener = () => {
reject(new abort_1.AbortError(signal.reason));
if (taskInfo.workerInfo !== null) {
this._removeWorker(taskInfo.workerInfo);
this._ensureMinimumWorkers();
} else {
this.taskQueue.remove(taskInfo);
}
};
(0, abort_1.onabort)(signal, taskInfo.abortListener);
}
if (this.taskQueue.size > 0) {
const totalCapacity = this.options.maxQueue + this.pendingCapacity();
if (this.taskQueue.size >= totalCapacity) {
if (this.options.maxQueue === 0) {
reject(errors_1.Errors.NoTaskQueueAvailable());
} else {
reject(errors_1.Errors.TaskQueueAtLimit());
}
} else {
this.taskQueue.push(taskInfo);
}
this._maybeDrain();
return ret;
}
const workers = [...this.workers.readyItems].map((workerInfo) => workerInfo.interface);
const distributed = this._distributeTask(taskInfo, workers);
if (!distributed) {
if (this.workers.size < this.options.maxThreads) {
this._addNewWorker();
}
if (this.options.maxQueue <= 0 && this.pendingCapacity() === 0) {
reject(errors_1.Errors.NoTaskQueueAvailable());
}
}
this._maybeDrain();
return ret;
}
pendingCapacity() {
return this.workers.pendingItems.size * this.options.concurrentTasksPerWorker;
}
_maybeDrain() {
const { maxCapacity } = this;
const currentUsage = this.workers.getCurrentUsage();
if (maxCapacity === currentUsage) {
this._needsDrain = true;
this.publicInterface.emit("needsDrain");
} else if (maxCapacity > currentUsage && this._needsDrain) {
this._needsDrain = false;
this.publicInterface.emit("drain");
}
}
async destroy() {
this.destroying = true;
while (this.skipQueue.length > 0) {
const taskInfo = this.skipQueue.shift();
taskInfo.done(new Error("Terminating worker thread"));
}
while (this.taskQueue.size > 0) {
const taskInfo = this.taskQueue.shift();
taskInfo.done(new Error("Terminating worker thread"));
}
const exitEvents = [];
while (this.workers.size > 0) {
const [workerInfo] = this.workers;
exitEvents.push((0, node_events_1.once)(workerInfo.worker, "exit"));
this._removeWorker(workerInfo);
}
try {
await Promise.all(exitEvents);
} finally {
this.destroying = false;
}
}
async close(options) {
this.closingUp = true;
if (options.force) {
const skipQueueLength = this.skipQueue.length;
for (let i = 0;i < skipQueueLength; i++) {
const taskInfo = this.skipQueue.shift();
if (taskInfo.workerInfo === null) {
taskInfo.done(new abort_1.AbortError("pool is closed"));
} else {
this.skipQueue.push(taskInfo);
}
}
const taskQueueLength = this.taskQueue.size;
for (let i = 0;i < taskQueueLength; i++) {
const taskInfo = this.taskQueue.shift();
if (taskInfo.workerInfo === null) {
taskInfo.done(new abort_1.AbortError("pool is closed"));
} else {
this.taskQueue.push(taskInfo);
}
}
}
const onPoolFlushed = () => new Promise((resolve) => {
const numberOfWorkers = this.workers.size;
if (numberOfWorkers === 0) {
resolve();
return;
}
let numberOfWorkersDone = 0;
const checkIfWorkerIsDone = (workerInfo) => {
if (workerInfo.taskInfos.size === 0) {
numberOfWorkersDone++;
}
if (numberOfWorkers === numberOfWorkersDone) {
resolve();
}
};
for (const workerInfo of this.workers) {
checkIfWorkerIsDone(workerInfo);
this.workers.onTaskDone(checkIfWorkerIsDone);
}
});
const throwOnTimeOut = async (timeout) => {
await (0, promises_1.setTimeout)(timeout, null, { ref: false });
throw errors_1.Errors.CloseTimeout();
};
try {
await Promise.race([
onPoolFlushed(),
throwOnTimeOut(this.options.closeTimeout)
]);
} catch (error) {
this.publicInterface.emit("error", error);
} finally {
await this.destroy();
this.publicInterface.emit("close");
this.closingUp = false;
}
}
}
class Piscina extends node_events_1.EventEmitterAsyncResource {
constructor(options = {}) {
super({ ...options, name: "Piscina" });
_Piscina_pool.set(this, undefined);
_Piscina_histogram.set(this, null);
if (typeof options.filename !== "string" && options.filename != null) {
throw new TypeError("options.filename must be a string or null");
}
if (typeof options.name !== "string" && options.nam