runframe 1.0.0
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.
Potentially problematic release.
This version of runframe might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/dist/async.d.ts +38 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/async.js +98 -0
- package/dist/async.js.map +1 -0
- package/dist/benchmark.d.ts +9 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +216 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/capabilities.d.ts +26 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +110 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/deterministic.d.ts +81 -0
- package/dist/deterministic.d.ts.map +1 -0
- package/dist/deterministic.js +135 -0
- package/dist/deterministic.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +24 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +42 -0
- package/dist/limits.js.map +1 -0
- package/dist/memory-optimization.d.ts +43 -0
- package/dist/memory-optimization.d.ts.map +1 -0
- package/dist/memory-optimization.js +103 -0
- package/dist/memory-optimization.js.map +1 -0
- package/dist/optimization-examples.d.ts +33 -0
- package/dist/optimization-examples.d.ts.map +1 -0
- package/dist/optimization-examples.js +255 -0
- package/dist/optimization-examples.js.map +1 -0
- package/dist/optimized-index.d.ts +12 -0
- package/dist/optimized-index.d.ts.map +1 -0
- package/dist/optimized-index.js +9 -0
- package/dist/optimized-index.js.map +1 -0
- package/dist/optimized-sandbox.d.ts +77 -0
- package/dist/optimized-sandbox.d.ts.map +1 -0
- package/dist/optimized-sandbox.js +153 -0
- package/dist/optimized-sandbox.js.map +1 -0
- package/dist/sandbox.d.ts +25 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +55 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/script-cache.d.ts +48 -0
- package/dist/script-cache.d.ts.map +1 -0
- package/dist/script-cache.js +97 -0
- package/dist/script-cache.js.map +1 -0
- package/dist/stats.d.ts +41 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +70 -0
- package/dist/stats.js.map +1 -0
- package/dist/test-corpus.d.ts +15 -0
- package/dist/test-corpus.d.ts.map +1 -0
- package/dist/test-corpus.js +225 -0
- package/dist/test-corpus.js.map +1 -0
- package/dist/vm-runtime.d.ts +21 -0
- package/dist/vm-runtime.d.ts.map +1 -0
- package/dist/vm-runtime.js +276 -0
- package/dist/vm-runtime.js.map +1 -0
- package/dist/worker-pool.d.ts +62 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +144 -0
- package/dist/worker-pool.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +39 -0
- package/dist/worker.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized sandbox for high throughput
|
|
3
|
+
* Features: worker pool, script cache, batch execution
|
|
4
|
+
*/
|
|
5
|
+
import { WorkerPool, DEFAULT_POOL_CONFIG } from "./worker-pool.js";
|
|
6
|
+
import { ScriptCache, globalScriptCache } from "./script-cache.js";
|
|
7
|
+
/**
|
|
8
|
+
* Optimized sandbox with pooling and caching
|
|
9
|
+
*/
|
|
10
|
+
export class OptimizedSandbox {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.intrinsicsFrozen = false;
|
|
13
|
+
this.options = options;
|
|
14
|
+
// Set up worker pool
|
|
15
|
+
const poolConfig = {
|
|
16
|
+
...DEFAULT_POOL_CONFIG,
|
|
17
|
+
memoryMb: options.memoryMb,
|
|
18
|
+
...options.poolConfig
|
|
19
|
+
};
|
|
20
|
+
this.pool = new WorkerPool(poolConfig);
|
|
21
|
+
// Set up script cache
|
|
22
|
+
this.scriptCache = options.cacheScripts !== false ? globalScriptCache : new ScriptCache(0);
|
|
23
|
+
// Cleanup timer (every 30s)
|
|
24
|
+
setInterval(() => {
|
|
25
|
+
this.pool.cleanup();
|
|
26
|
+
}, 30000);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Run code in sandbox
|
|
30
|
+
*/
|
|
31
|
+
run(code) {
|
|
32
|
+
return new Promise(async (resolve, reject) => {
|
|
33
|
+
let worker = null;
|
|
34
|
+
try {
|
|
35
|
+
// Acquire worker from pool
|
|
36
|
+
worker = await this.pool.acquire();
|
|
37
|
+
// Set up timeout
|
|
38
|
+
const timeout = setTimeout(() => {
|
|
39
|
+
this.pool.release(worker);
|
|
40
|
+
worker = null;
|
|
41
|
+
reject(new Error("Sandbox timeout exceeded"));
|
|
42
|
+
}, this.options.cpuMs);
|
|
43
|
+
// Send work to worker
|
|
44
|
+
worker.once("message", (msg) => {
|
|
45
|
+
clearTimeout(timeout);
|
|
46
|
+
this.pool.release(worker);
|
|
47
|
+
worker = null;
|
|
48
|
+
if (msg.type === "result") {
|
|
49
|
+
resolve(msg);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
reject(new Error(msg.error));
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
worker.once("error", (err) => {
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
this.pool.release(worker);
|
|
58
|
+
worker = null;
|
|
59
|
+
reject(err);
|
|
60
|
+
});
|
|
61
|
+
worker.once("exit", (code) => {
|
|
62
|
+
clearTimeout(timeout);
|
|
63
|
+
if (worker) {
|
|
64
|
+
this.pool.release(worker);
|
|
65
|
+
worker = null;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// Send message
|
|
69
|
+
worker.postMessage({
|
|
70
|
+
code,
|
|
71
|
+
options: {
|
|
72
|
+
cpuMs: this.options.cpuMs,
|
|
73
|
+
memoryMb: this.options.memoryMb
|
|
74
|
+
},
|
|
75
|
+
capabilities: this.options.capabilities,
|
|
76
|
+
seed: this.options.seed,
|
|
77
|
+
cacheScript: this.options.cacheScripts !== false
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (worker) {
|
|
82
|
+
this.pool.release(worker);
|
|
83
|
+
}
|
|
84
|
+
reject(err);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Batch execute multiple operations
|
|
90
|
+
*/
|
|
91
|
+
async batch(operations, options) {
|
|
92
|
+
const { concurrency = 4, stopOnError = false } = options || {};
|
|
93
|
+
const results = [];
|
|
94
|
+
let opIdx = 0;
|
|
95
|
+
const worker = async () => {
|
|
96
|
+
while (opIdx < operations.length) {
|
|
97
|
+
const op = operations[opIdx++];
|
|
98
|
+
try {
|
|
99
|
+
const msg = await this.run(op.code);
|
|
100
|
+
if (msg.type === "result") {
|
|
101
|
+
results.push({
|
|
102
|
+
id: op.id,
|
|
103
|
+
result: msg.result,
|
|
104
|
+
stats: msg.stats
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
results.push({
|
|
109
|
+
id: op.id,
|
|
110
|
+
error: msg.error
|
|
111
|
+
});
|
|
112
|
+
if (stopOnError)
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
results.push({
|
|
118
|
+
id: op.id,
|
|
119
|
+
error: err instanceof Error ? err.message : String(err)
|
|
120
|
+
});
|
|
121
|
+
if (stopOnError)
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
// Run concurrent workers
|
|
127
|
+
await Promise.all(Array(Math.min(concurrency, operations.length)).fill(null).map(() => worker()));
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get current stats
|
|
132
|
+
*/
|
|
133
|
+
stats() {
|
|
134
|
+
return {
|
|
135
|
+
pool: this.pool.stats(),
|
|
136
|
+
cache: this.scriptCache.stats()
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Clean up
|
|
141
|
+
*/
|
|
142
|
+
async destroy() {
|
|
143
|
+
await this.pool.destroy();
|
|
144
|
+
this.scriptCache.clear();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create optimized sandbox
|
|
149
|
+
*/
|
|
150
|
+
export function createOptimizedSandbox(options) {
|
|
151
|
+
return new OptimizedSandbox(options);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=optimized-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimized-sandbox.js","sourceRoot":"","sources":["../src/optimized-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CapabilityGrant, DEFAULT_CAPABILITIES } from "./capabilities.js";
|
|
2
|
+
import { ExecutionStats } from "./stats.js";
|
|
3
|
+
export interface SandboxOptions {
|
|
4
|
+
cpuMs: number;
|
|
5
|
+
memoryMb: number;
|
|
6
|
+
capabilities?: Partial<CapabilityGrant>;
|
|
7
|
+
seed?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SandboxResult {
|
|
10
|
+
type: "result";
|
|
11
|
+
result: unknown;
|
|
12
|
+
stats: ExecutionStats;
|
|
13
|
+
}
|
|
14
|
+
export interface SandboxError {
|
|
15
|
+
type: "error";
|
|
16
|
+
error: string;
|
|
17
|
+
}
|
|
18
|
+
export type SandboxMessage = SandboxResult | SandboxError;
|
|
19
|
+
export declare function createSandbox(options: SandboxOptions): {
|
|
20
|
+
run(code: string): Promise<SandboxMessage>;
|
|
21
|
+
};
|
|
22
|
+
export { CapabilityGrant, DEFAULT_CAPABILITIES };
|
|
23
|
+
export { ExecutionStats } from "./stats.js";
|
|
24
|
+
export { ESCAPE_TESTS, checkTestResult } from "./test-corpus.js";
|
|
25
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE1D,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc;cAEvC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;EA+C7C;AAED,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/sandbox.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { DEFAULT_CAPABILITIES } from "./capabilities.js";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
export function createSandbox(options) {
|
|
8
|
+
return {
|
|
9
|
+
run(code) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const worker = new Worker(path.resolve(__dirname, "worker.js"), {
|
|
12
|
+
workerData: {
|
|
13
|
+
code,
|
|
14
|
+
options: {
|
|
15
|
+
cpuMs: options.cpuMs,
|
|
16
|
+
memoryMb: options.memoryMb
|
|
17
|
+
},
|
|
18
|
+
capabilities: options.capabilities,
|
|
19
|
+
seed: options.seed
|
|
20
|
+
}
|
|
21
|
+
// Note: Memory limit is enforced via resource limits, not Node flags
|
|
22
|
+
// Worker threads inherit parent process memory limits
|
|
23
|
+
});
|
|
24
|
+
const timeout = setTimeout(() => {
|
|
25
|
+
worker.terminate();
|
|
26
|
+
reject(new Error("Sandbox timeout exceeded"));
|
|
27
|
+
}, options.cpuMs);
|
|
28
|
+
worker.once("message", (msg) => {
|
|
29
|
+
clearTimeout(timeout);
|
|
30
|
+
worker.terminate();
|
|
31
|
+
if (msg.type === "result") {
|
|
32
|
+
resolve(msg);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
reject(new Error(msg.error));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
worker.once("error", (err) => {
|
|
39
|
+
clearTimeout(timeout);
|
|
40
|
+
worker.terminate();
|
|
41
|
+
reject(err);
|
|
42
|
+
});
|
|
43
|
+
worker.once("exit", (code) => {
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
if (code !== 0) {
|
|
46
|
+
reject(new Error(`Worker exited with code ${code}`));
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export { DEFAULT_CAPABILITIES };
|
|
54
|
+
export { ESCAPE_TESTS, checkTestResult } from "./test-corpus.js";
|
|
55
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAmB,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAsB3C,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,OAAO;QACL,GAAG,CAAC,IAAY;YACd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;oBAC9D,UAAU,EAAE;wBACV,IAAI;wBACJ,OAAO,EAAE;4BACP,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;yBAC3B;wBACD,YAAY,EAAE,OAAO,CAAC,YAAY;wBAClC,IAAI,EAAE,OAAO,CAAC,IAAI;qBACnB;oBACD,qEAAqE;oBACrE,sDAAsD;iBACvD,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAChD,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAElB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAmB,EAAE,EAAE;oBAC7C,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,SAAS,EAAE,CAAC;oBAEnB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAmB,oBAAoB,EAAE,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script cache: Compile once, run many times
|
|
3
|
+
* Reduces CPU overhead for repeated code patterns
|
|
4
|
+
*/
|
|
5
|
+
import vm from "node:vm";
|
|
6
|
+
export interface CachedScript {
|
|
7
|
+
script: vm.Script;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
uses: number;
|
|
10
|
+
hitRate: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CacheStats {
|
|
13
|
+
size: number;
|
|
14
|
+
maxSize: number;
|
|
15
|
+
hits: number;
|
|
16
|
+
misses: number;
|
|
17
|
+
hitRate: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class ScriptCache {
|
|
20
|
+
private cache;
|
|
21
|
+
private maxSize;
|
|
22
|
+
private maxAge;
|
|
23
|
+
constructor(maxSize?: number, maxAgeMs?: number);
|
|
24
|
+
/**
|
|
25
|
+
* Get or compile a script
|
|
26
|
+
*/
|
|
27
|
+
get(code: string): vm.Script;
|
|
28
|
+
/**
|
|
29
|
+
* Simple hash for code
|
|
30
|
+
*/
|
|
31
|
+
private hashCode;
|
|
32
|
+
/**
|
|
33
|
+
* Clear all cached scripts
|
|
34
|
+
*/
|
|
35
|
+
clear(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get cache stats
|
|
38
|
+
*/
|
|
39
|
+
stats(): {
|
|
40
|
+
size: number;
|
|
41
|
+
maxSize: number;
|
|
42
|
+
totalUses: number;
|
|
43
|
+
totalHits: number;
|
|
44
|
+
hitRate: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export declare const globalScriptCache: ScriptCache;
|
|
48
|
+
//# sourceMappingURL=script-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-cache.d.ts","sourceRoot":"","sources":["../src/script-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,MAAa,EAAE,QAAQ,GAAE,MAAgB;IAK9D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM;IAiD5B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK;;;;;;;CAiBN;AAED,eAAO,MAAM,iBAAiB,aAAiC,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script cache: Compile once, run many times
|
|
3
|
+
* Reduces CPU overhead for repeated code patterns
|
|
4
|
+
*/
|
|
5
|
+
import vm from "node:vm";
|
|
6
|
+
export class ScriptCache {
|
|
7
|
+
constructor(maxSize = 1000, maxAgeMs = 3600000) {
|
|
8
|
+
this.cache = new Map();
|
|
9
|
+
this.maxSize = maxSize;
|
|
10
|
+
this.maxAge = maxAgeMs;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get or compile a script
|
|
14
|
+
*/
|
|
15
|
+
get(code) {
|
|
16
|
+
const hash = this.hashCode(code);
|
|
17
|
+
const cached = this.cache.get(hash);
|
|
18
|
+
if (cached) {
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
// Invalidate if too old
|
|
21
|
+
if (now - cached.createdAt > this.maxAge) {
|
|
22
|
+
this.cache.delete(hash);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Update stats
|
|
26
|
+
cached.uses++;
|
|
27
|
+
cached.hitRate = (cached.uses / (cached.uses + 1)) * 100;
|
|
28
|
+
return cached.script;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Compile new script
|
|
32
|
+
const wrapped = `"use strict";\n(async () => {\n${code}\n})();`;
|
|
33
|
+
const script = new vm.Script(wrapped, {
|
|
34
|
+
filename: "sandboxed.js",
|
|
35
|
+
lineOffset: 0,
|
|
36
|
+
columnOffset: 0
|
|
37
|
+
});
|
|
38
|
+
// Store in cache
|
|
39
|
+
if (this.cache.size >= this.maxSize) {
|
|
40
|
+
// Evict least recently used
|
|
41
|
+
let oldest = null;
|
|
42
|
+
for (const [key, cached] of this.cache) {
|
|
43
|
+
if (!oldest || cached.createdAt < oldest[1].createdAt) {
|
|
44
|
+
oldest = [key, cached];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (oldest) {
|
|
48
|
+
this.cache.delete(oldest[0]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.cache.set(hash, {
|
|
52
|
+
script,
|
|
53
|
+
createdAt: Date.now(),
|
|
54
|
+
uses: 1,
|
|
55
|
+
hitRate: 0
|
|
56
|
+
});
|
|
57
|
+
return script;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Simple hash for code
|
|
61
|
+
*/
|
|
62
|
+
hashCode(code) {
|
|
63
|
+
let hash = 0;
|
|
64
|
+
for (let i = 0; i < code.length; i++) {
|
|
65
|
+
const char = code.charCodeAt(i);
|
|
66
|
+
hash = ((hash << 5) - hash) + char;
|
|
67
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
68
|
+
}
|
|
69
|
+
return `script_${Math.abs(hash)}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear all cached scripts
|
|
73
|
+
*/
|
|
74
|
+
clear() {
|
|
75
|
+
this.cache.clear();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get cache stats
|
|
79
|
+
*/
|
|
80
|
+
stats() {
|
|
81
|
+
let totalUses = 0;
|
|
82
|
+
let totalHits = 0;
|
|
83
|
+
for (const cached of this.cache.values()) {
|
|
84
|
+
totalUses += cached.uses;
|
|
85
|
+
totalHits += cached.uses - 1; // Minus first compilation
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
size: this.cache.size,
|
|
89
|
+
maxSize: this.maxSize,
|
|
90
|
+
totalUses,
|
|
91
|
+
totalHits,
|
|
92
|
+
hitRate: totalUses > 0 ? (totalHits / totalUses) * 100 : 0
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const globalScriptCache = new ScriptCache(1000, 3600000);
|
|
97
|
+
//# sourceMappingURL=script-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-cache.js","sourceRoot":"","sources":["../src/script-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/stats.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution statistics collection
|
|
3
|
+
* Tracks time, memory, async ops
|
|
4
|
+
*/
|
|
5
|
+
export interface ExecutionStats {
|
|
6
|
+
duration: number;
|
|
7
|
+
cpuTime: number;
|
|
8
|
+
memoryStart: number;
|
|
9
|
+
memoryEnd: number;
|
|
10
|
+
memoryPeak: number;
|
|
11
|
+
promisesCreated: number;
|
|
12
|
+
promisesResolved: number;
|
|
13
|
+
promisesRejected: number;
|
|
14
|
+
errors: string[];
|
|
15
|
+
timeout: boolean;
|
|
16
|
+
completed: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Stats tracker for execution
|
|
20
|
+
*/
|
|
21
|
+
export declare class StatsCollector {
|
|
22
|
+
private startTime;
|
|
23
|
+
private startMemory;
|
|
24
|
+
private peakMemory;
|
|
25
|
+
private errors;
|
|
26
|
+
private promisesCreated;
|
|
27
|
+
private promisesResolved;
|
|
28
|
+
private promisesRejected;
|
|
29
|
+
private timeout;
|
|
30
|
+
private completed;
|
|
31
|
+
start(): void;
|
|
32
|
+
recordPromiseCreated(): void;
|
|
33
|
+
recordPromiseResolved(): void;
|
|
34
|
+
recordPromiseRejected(): void;
|
|
35
|
+
recordError(message: string): void;
|
|
36
|
+
recordTimeout(): void;
|
|
37
|
+
markCompleted(): void;
|
|
38
|
+
updateMemory(): void;
|
|
39
|
+
finish(): ExecutionStats;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAkB;IAEnC,KAAK,IAAI,IAAI;IAOb,oBAAoB,IAAI,IAAI;IAI5B,qBAAqB,IAAI,IAAI;IAI7B,qBAAqB,IAAI,IAAI;IAI7B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,aAAa,IAAI,IAAI;IAIrB,aAAa,IAAI,IAAI;IAIrB,YAAY,IAAI,IAAI;IAOpB,MAAM,IAAI,cAAc;CAqBzB"}
|
package/dist/stats.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution statistics collection
|
|
3
|
+
* Tracks time, memory, async ops
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Stats tracker for execution
|
|
7
|
+
*/
|
|
8
|
+
export class StatsCollector {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.startTime = 0;
|
|
11
|
+
this.startMemory = 0;
|
|
12
|
+
this.peakMemory = 0;
|
|
13
|
+
this.errors = [];
|
|
14
|
+
this.promisesCreated = 0;
|
|
15
|
+
this.promisesResolved = 0;
|
|
16
|
+
this.promisesRejected = 0;
|
|
17
|
+
this.timeout = false;
|
|
18
|
+
this.completed = false;
|
|
19
|
+
}
|
|
20
|
+
start() {
|
|
21
|
+
this.startTime = Date.now();
|
|
22
|
+
const usage = process.memoryUsage();
|
|
23
|
+
this.startMemory = usage.heapUsed;
|
|
24
|
+
this.peakMemory = usage.heapUsed;
|
|
25
|
+
}
|
|
26
|
+
recordPromiseCreated() {
|
|
27
|
+
this.promisesCreated++;
|
|
28
|
+
}
|
|
29
|
+
recordPromiseResolved() {
|
|
30
|
+
this.promisesResolved++;
|
|
31
|
+
}
|
|
32
|
+
recordPromiseRejected() {
|
|
33
|
+
this.promisesRejected++;
|
|
34
|
+
}
|
|
35
|
+
recordError(message) {
|
|
36
|
+
this.errors.push(message);
|
|
37
|
+
}
|
|
38
|
+
recordTimeout() {
|
|
39
|
+
this.timeout = true;
|
|
40
|
+
}
|
|
41
|
+
markCompleted() {
|
|
42
|
+
this.completed = true;
|
|
43
|
+
}
|
|
44
|
+
updateMemory() {
|
|
45
|
+
const usage = process.memoryUsage();
|
|
46
|
+
if (usage.heapUsed > this.peakMemory) {
|
|
47
|
+
this.peakMemory = usage.heapUsed;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
finish() {
|
|
51
|
+
this.updateMemory();
|
|
52
|
+
const endTime = Date.now();
|
|
53
|
+
const usage = process.memoryUsage();
|
|
54
|
+
const endMemory = usage.heapUsed;
|
|
55
|
+
return {
|
|
56
|
+
duration: endTime - this.startTime,
|
|
57
|
+
cpuTime: Math.max(0, (process.cpuUsage().user + process.cpuUsage().system) / 1000),
|
|
58
|
+
memoryStart: this.startMemory,
|
|
59
|
+
memoryEnd: endMemory,
|
|
60
|
+
memoryPeak: this.peakMemory,
|
|
61
|
+
promisesCreated: this.promisesCreated,
|
|
62
|
+
promisesResolved: this.promisesResolved,
|
|
63
|
+
promisesRejected: this.promisesRejected,
|
|
64
|
+
errors: this.errors,
|
|
65
|
+
timeout: this.timeout,
|
|
66
|
+
completed: this.completed
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;GAEG;AACH,MAAM,OAAO,cAAc;IAA3B;QACU,cAAS,GAAW,CAAC,CAAC;QACtB,gBAAW,GAAW,CAAC,CAAC;QACxB,eAAU,GAAW,CAAC,CAAC;QACvB,WAAM,GAAa,EAAE,CAAC;QACtB,oBAAe,GAAW,CAAC,CAAC;QAC5B,qBAAgB,GAAW,CAAC,CAAC;QAC7B,qBAAgB,GAAW,CAAC,CAAC;QAC7B,YAAO,GAAY,KAAK,CAAC;QACzB,cAAS,GAAY,KAAK,CAAC;IA6DrC,CAAC;IA3DC,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEjC,OAAO;YACL,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,SAAS;YAClC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAClF,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape test corpus: Known sandboxing attacks that MUST fail
|
|
3
|
+
* Used to verify the sandbox actually blocks dangerous operations
|
|
4
|
+
*/
|
|
5
|
+
export interface EscapeTest {
|
|
6
|
+
name: string;
|
|
7
|
+
code: string;
|
|
8
|
+
shouldBlock: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const ESCAPE_TESTS: EscapeTest[];
|
|
11
|
+
/**
|
|
12
|
+
* Check if a test result is correct
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkTestResult(test: EscapeTest, threw: boolean, timedOut: boolean): boolean;
|
|
15
|
+
//# sourceMappingURL=test-corpus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-corpus.d.ts","sourceRoot":"","sources":["../src/test-corpus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,UAAU,EAqOpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAQ5F"}
|