hakojs
Version:
A secure, embeddable JavaScript engine that runs untrusted code inside WebAssembly sandboxes with fine-grained permissions and resource limits
87 lines (84 loc) • 2.2 kB
JavaScript
// src/helpers/interrupt-helpers.ts
function shouldInterruptAfterDeadline(deadlineMs) {
const deadline = Date.now() + deadlineMs;
return () => {
return Date.now() >= deadline;
};
}
function shouldInterruptAfterSteps(maxSteps) {
let steps = 0;
return () => {
steps++;
return steps >= maxSteps;
};
}
function shouldInterruptAfterMemoryUsage(maxMemoryBytes, checkIntervalSteps = 1000) {
let steps = 0;
return (runtime) => {
steps++;
if (steps % checkIntervalSteps === 0) {
const context = runtime.getSystemContext();
const memoryUsage = runtime.computeMemoryUsage(context);
if (memoryUsage.memory_used_size > maxMemoryBytes) {
return true;
}
}
return false;
};
}
function combineInterruptHandlers(...handlers) {
return (runtime, context, opaque) => {
for (const handler of handlers) {
if (handler(runtime, context, opaque)) {
return true;
}
}
return false;
};
}
function createResourceLimitedInterruptHandler(options) {
const handlers = [];
if (options.maxTimeMs) {
handlers.push(shouldInterruptAfterDeadline(options.maxTimeMs));
}
if (options.maxSteps) {
handlers.push(shouldInterruptAfterSteps(options.maxSteps));
}
if (options.maxMemoryBytes) {
handlers.push(shouldInterruptAfterMemoryUsage(options.maxMemoryBytes, options.memoryCheckInterval || 1000));
}
return combineInterruptHandlers(...handlers);
}
class PausableInterruptHandler {
handler;
isPaused = false;
constructor(baseHandler) {
this.handler = baseHandler;
}
interruptHandler = (runtime, context, opaque) => {
if (this.isPaused) {
return false;
}
return this.handler(runtime, context, opaque);
};
pause() {
this.isPaused = true;
}
resume() {
this.isPaused = false;
}
toggle() {
this.isPaused = !this.isPaused;
return this.isPaused;
}
}
export {
shouldInterruptAfterSteps,
shouldInterruptAfterMemoryUsage,
shouldInterruptAfterDeadline,
createResourceLimitedInterruptHandler,
combineInterruptHandlers,
PausableInterruptHandler
};
//# debugId=983B614C8AD6280664756E2164756E21
//# sourceMappingURL=interrupt-helpers.js.map