UNPKG

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
// 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