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.
- 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,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Before & After: Real-world comparison
|
|
3
|
+
* Shows exact performance improvements with numbers
|
|
4
|
+
*/
|
|
5
|
+
import { createSandbox } from "./sandbox.js";
|
|
6
|
+
import { createOptimizedSandbox } from "./optimized-sandbox.js";
|
|
7
|
+
/**
|
|
8
|
+
* OLD WAY: Create new sandbox each time (unoptimized)
|
|
9
|
+
*/
|
|
10
|
+
async function oldWay_100Requests() {
|
|
11
|
+
console.log("🐢 OLD WAY: Spawning new worker for each request");
|
|
12
|
+
const startMem = process.memoryUsage().heapUsed;
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
const promises = [];
|
|
15
|
+
// Each creates a new worker
|
|
16
|
+
for (let i = 0; i < 100; i++) {
|
|
17
|
+
const sandbox = createSandbox({
|
|
18
|
+
cpuMs: 5000,
|
|
19
|
+
memoryMb: 128
|
|
20
|
+
});
|
|
21
|
+
promises.push(sandbox.run(`
|
|
22
|
+
const data = [${Array(10).fill(i).join(",")}];
|
|
23
|
+
data.map(x => x * Math.PI).reduce((a, b) => a + b, 0);
|
|
24
|
+
`));
|
|
25
|
+
}
|
|
26
|
+
await Promise.allSettled(promises);
|
|
27
|
+
const duration = Date.now() - startTime;
|
|
28
|
+
const endMem = process.memoryUsage().heapUsed;
|
|
29
|
+
console.log(`⏱️ Time: ${duration}ms`);
|
|
30
|
+
console.log(`💾 Memory: ${((endMem - startMem) / 1024 / 1024).toFixed(2)}MB`);
|
|
31
|
+
console.log(`📊 Avg time per request: ${(duration / 100).toFixed(2)}ms\n`);
|
|
32
|
+
return { duration, memory: endMem - startMem };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* NEW WAY: Use optimized sandbox with pooling
|
|
36
|
+
*/
|
|
37
|
+
async function newWay_100Requests() {
|
|
38
|
+
console.log("🚀 NEW WAY: Optimized with worker pool + caching");
|
|
39
|
+
const sandbox = createOptimizedSandbox({
|
|
40
|
+
cpuMs: 5000,
|
|
41
|
+
memoryMb: 128,
|
|
42
|
+
poolConfig: {
|
|
43
|
+
minWorkers: 4,
|
|
44
|
+
maxWorkers: 16,
|
|
45
|
+
idleTimeout: 30000,
|
|
46
|
+
memoryMb: 128
|
|
47
|
+
},
|
|
48
|
+
cacheScripts: true
|
|
49
|
+
});
|
|
50
|
+
const startMem = process.memoryUsage().heapUsed;
|
|
51
|
+
const startTime = Date.now();
|
|
52
|
+
const promises = [];
|
|
53
|
+
// All reuse the same pool
|
|
54
|
+
for (let i = 0; i < 100; i++) {
|
|
55
|
+
promises.push(sandbox.run(`
|
|
56
|
+
const data = [${Array(10).fill(i).join(",")}];
|
|
57
|
+
data.map(x => x * Math.PI).reduce((a, b) => a + b, 0);
|
|
58
|
+
`));
|
|
59
|
+
}
|
|
60
|
+
await Promise.allSettled(promises);
|
|
61
|
+
const duration = Date.now() - startTime;
|
|
62
|
+
const endMem = process.memoryUsage().heapUsed;
|
|
63
|
+
console.log(`⏱️ Time: ${duration}ms`);
|
|
64
|
+
console.log(`💾 Memory: ${((endMem - startMem) / 1024 / 1024).toFixed(2)}MB`);
|
|
65
|
+
console.log(`📊 Avg time per request: ${(duration / 100).toFixed(2)}ms`);
|
|
66
|
+
console.log(`📈 Pool stats:`, sandbox.stats().pool);
|
|
67
|
+
console.log(`🔄 Cache stats:`, sandbox.stats().cache);
|
|
68
|
+
await sandbox.destroy();
|
|
69
|
+
return { duration, memory: endMem - startMem };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Repeated code example
|
|
73
|
+
*/
|
|
74
|
+
async function repeatedCodeBenefit() {
|
|
75
|
+
console.log("\n\n🔄 SCENARIO: Running same formula 50 times\n");
|
|
76
|
+
const formula = `
|
|
77
|
+
const arr = Array(1000).fill(0).map((_, i) => i);
|
|
78
|
+
arr.filter(x => x % 2 === 0)
|
|
79
|
+
.map(x => x * Math.PI)
|
|
80
|
+
.reduce((a, b) => a + b, 0);
|
|
81
|
+
`;
|
|
82
|
+
// Old way - recompile each time
|
|
83
|
+
console.log("📝 Without cache (recompile each time):");
|
|
84
|
+
const noCacheStart = Date.now();
|
|
85
|
+
const noCacheSandbox = createOptimizedSandbox({
|
|
86
|
+
cpuMs: 3000,
|
|
87
|
+
memoryMb: 64,
|
|
88
|
+
cacheScripts: false // Disable cache
|
|
89
|
+
});
|
|
90
|
+
for (let i = 0; i < 50; i++) {
|
|
91
|
+
await noCacheSandbox.run(formula);
|
|
92
|
+
}
|
|
93
|
+
const noCacheDuration = Date.now() - noCacheStart;
|
|
94
|
+
console.log(`⏱️ 50 runs: ${noCacheDuration}ms (avg: ${(noCacheDuration / 50).toFixed(2)}ms)`);
|
|
95
|
+
// New way - cache hits
|
|
96
|
+
console.log("\n📝 With cache (compile once, reuse):");
|
|
97
|
+
const withCacheStart = Date.now();
|
|
98
|
+
const withCacheSandbox = createOptimizedSandbox({
|
|
99
|
+
cpuMs: 3000,
|
|
100
|
+
memoryMb: 64,
|
|
101
|
+
cacheScripts: true // Enable cache
|
|
102
|
+
});
|
|
103
|
+
for (let i = 0; i < 50; i++) {
|
|
104
|
+
await withCacheSandbox.run(formula);
|
|
105
|
+
}
|
|
106
|
+
const withCacheDuration = Date.now() - withCacheStart;
|
|
107
|
+
console.log(`⏱️ 50 runs: ${withCacheDuration}ms (avg: ${(withCacheDuration / 50).toFixed(2)}ms)`);
|
|
108
|
+
console.log(`🔄 Cache stats:`, withCacheSandbox.stats().cache);
|
|
109
|
+
const speedup = noCacheDuration / withCacheDuration;
|
|
110
|
+
console.log(`\n✨ Speedup: ${speedup.toFixed(1)}x faster with cache!`);
|
|
111
|
+
await noCacheSandbox.destroy();
|
|
112
|
+
await withCacheSandbox.destroy();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Batch vs sequential
|
|
116
|
+
*/
|
|
117
|
+
async function batchVsSequential() {
|
|
118
|
+
console.log("\n\n📦 SCENARIO: Processing 50 items\n");
|
|
119
|
+
const items = Array.from({ length: 50 }, (_, i) => ({
|
|
120
|
+
code: `Array(${10 + i}).fill(0).reduce((a, b) => a + b, 0)`
|
|
121
|
+
}));
|
|
122
|
+
// Sequential
|
|
123
|
+
console.log("🐢 Sequential (1 at a time):");
|
|
124
|
+
const seqStart = Date.now();
|
|
125
|
+
const seqSandbox = createOptimizedSandbox({
|
|
126
|
+
cpuMs: 3000,
|
|
127
|
+
memoryMb: 64
|
|
128
|
+
});
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
await seqSandbox.run(item.code);
|
|
131
|
+
}
|
|
132
|
+
const seqDuration = Date.now() - seqStart;
|
|
133
|
+
console.log(`⏱️ Time: ${seqDuration}ms (avg: ${(seqDuration / 50).toFixed(2)}ms)`);
|
|
134
|
+
// Batch with concurrency
|
|
135
|
+
console.log("\n🚀 Batch (4 concurrent):");
|
|
136
|
+
const batchStart = Date.now();
|
|
137
|
+
const batchSandbox = createOptimizedSandbox({
|
|
138
|
+
cpuMs: 3000,
|
|
139
|
+
memoryMb: 64,
|
|
140
|
+
poolConfig: { minWorkers: 2, maxWorkers: 4, idleTimeout: 30000, memoryMb: 64 }
|
|
141
|
+
});
|
|
142
|
+
await batchSandbox.batch(items, { concurrency: 4 });
|
|
143
|
+
const batchDuration = Date.now() - batchStart;
|
|
144
|
+
console.log(`⏱️ Time: ${batchDuration}ms (avg: ${(batchDuration / 50).toFixed(2)}ms)`);
|
|
145
|
+
const speedup = seqDuration / batchDuration;
|
|
146
|
+
console.log(`\n✨ Speedup: ${speedup.toFixed(1)}x faster with batching!`);
|
|
147
|
+
await seqSandbox.destroy();
|
|
148
|
+
await batchSandbox.destroy();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Memory comparison
|
|
152
|
+
*/
|
|
153
|
+
async function memoryComparison() {
|
|
154
|
+
console.log("\n\n💾 SCENARIO: High-concurrency (100 parallel requests)\n");
|
|
155
|
+
console.log("Memory usage tracking...");
|
|
156
|
+
// Unoptimized
|
|
157
|
+
console.log("\n🐢 WITHOUT optimization:");
|
|
158
|
+
const unoptStart = process.memoryUsage().heapUsed;
|
|
159
|
+
const unoptSandbox = createSandbox({
|
|
160
|
+
cpuMs: 5000,
|
|
161
|
+
memoryMb: 128
|
|
162
|
+
});
|
|
163
|
+
const unoptPromises = Array.from({ length: 100 }, (_, i) => unoptSandbox.run(`Array(${100 + i}).fill(0).reduce((a,b) => a+b, 0)`));
|
|
164
|
+
await Promise.allSettled(unoptPromises);
|
|
165
|
+
const unoptEnd = process.memoryUsage().heapUsed;
|
|
166
|
+
console.log(`💾 Memory delta: ${((unoptEnd - unoptStart) / 1024 / 1024).toFixed(2)}MB`);
|
|
167
|
+
// Optimized
|
|
168
|
+
console.log("\n🚀 WITH optimization:");
|
|
169
|
+
const optStart = process.memoryUsage().heapUsed;
|
|
170
|
+
const optSandbox = createOptimizedSandbox({
|
|
171
|
+
cpuMs: 5000,
|
|
172
|
+
memoryMb: 128,
|
|
173
|
+
poolConfig: {
|
|
174
|
+
minWorkers: 4,
|
|
175
|
+
maxWorkers: 16,
|
|
176
|
+
idleTimeout: 30000,
|
|
177
|
+
memoryMb: 128
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const optPromises = Array.from({ length: 100 }, (_, i) => optSandbox.run(`Array(${100 + i}).fill(0).reduce((a,b) => a+b, 0)`));
|
|
181
|
+
await Promise.allSettled(optPromises);
|
|
182
|
+
const optEnd = process.memoryUsage().heapUsed;
|
|
183
|
+
console.log(`💾 Memory delta: ${((optEnd - optStart) / 1024 / 1024).toFixed(2)}MB`);
|
|
184
|
+
const savings = ((unoptEnd - unoptStart) - (optEnd - optStart)) / (unoptEnd - unoptStart) * 100;
|
|
185
|
+
console.log(`\n✨ Memory savings: ${savings.toFixed(0)}%`);
|
|
186
|
+
await optSandbox.destroy();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Run all comparisons
|
|
190
|
+
*/
|
|
191
|
+
export async function runComparisons() {
|
|
192
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
193
|
+
console.log("🔬 OPTIMIZATION BENCHMARKS");
|
|
194
|
+
console.log("═══════════════════════════════════════════════════════════\n");
|
|
195
|
+
console.log("BENCHMARK 1: 100 Concurrent Requests");
|
|
196
|
+
console.log("───────────────────────────────────────────────────────────");
|
|
197
|
+
const oldResult = await oldWay_100Requests();
|
|
198
|
+
const newResult = await newWay_100Requests();
|
|
199
|
+
const speedup = oldResult.duration / newResult.duration;
|
|
200
|
+
const memSavings = oldResult.memory - newResult.memory;
|
|
201
|
+
console.log(`\n📊 IMPROVEMENT:`);
|
|
202
|
+
console.log(` ⏱️ Speed: ${speedup.toFixed(1)}x faster`);
|
|
203
|
+
console.log(` 💾 Memory: ${(memSavings / 1024 / 1024).toFixed(2)}MB saved (${(memSavings / oldResult.memory * 100).toFixed(0)}%)`);
|
|
204
|
+
// Run other scenarios
|
|
205
|
+
await repeatedCodeBenefit();
|
|
206
|
+
await batchVsSequential();
|
|
207
|
+
await memoryComparison();
|
|
208
|
+
console.log("\n═══════════════════════════════════════════════════════════");
|
|
209
|
+
console.log("✅ All benchmarks completed!");
|
|
210
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
211
|
+
}
|
|
212
|
+
// Run if executed
|
|
213
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
214
|
+
runComparisons().catch(console.error);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability membranes: Proxy-based controlled access to APIs
|
|
3
|
+
* Allows fine-grained restrictions on what sandboxed code can access
|
|
4
|
+
*/
|
|
5
|
+
export type CapabilityName = "console" | "math" | "date" | "json" | "crypto" | "timers";
|
|
6
|
+
export type CapabilityGrant = Record<CapabilityName, boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Default: Minimal capabilities
|
|
9
|
+
* Only safe, read-only, deterministic operations
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_CAPABILITIES: CapabilityGrant;
|
|
12
|
+
/**
|
|
13
|
+
* Strict mode: absolute minimum
|
|
14
|
+
*/
|
|
15
|
+
export declare const STRICT_CAPABILITIES: CapabilityGrant;
|
|
16
|
+
/**
|
|
17
|
+
* Create a capability grant from user input
|
|
18
|
+
* Always defaults to denied, must explicitly allow
|
|
19
|
+
*/
|
|
20
|
+
export declare function createCapabilityGrant(requested?: Partial<CapabilityGrant>): CapabilityGrant;
|
|
21
|
+
/**
|
|
22
|
+
* Create a proxy membrane that guards access to a capability
|
|
23
|
+
* Throws if capability is not granted
|
|
24
|
+
*/
|
|
25
|
+
export declare function createCapabilityMembrane<T extends object>(target: T, capability: CapabilityName, granted: boolean): T;
|
|
26
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,eAOlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAOjC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACnC,eAAe,CASjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EACvD,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,OAAO,GACf,CAAC,CAgEH"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability membranes: Proxy-based controlled access to APIs
|
|
3
|
+
* Allows fine-grained restrictions on what sandboxed code can access
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default: Minimal capabilities
|
|
7
|
+
* Only safe, read-only, deterministic operations
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_CAPABILITIES = {
|
|
10
|
+
console: true, // no-op console (doesn't actually log)
|
|
11
|
+
math: true, // deterministic Math (no random)
|
|
12
|
+
date: true, // frozen/deterministic Date
|
|
13
|
+
json: true, // JSON.parse/stringify
|
|
14
|
+
crypto: false, // NO crypto by default (expensive, leaks timing)
|
|
15
|
+
timers: false // NO timers (no setTimeout/setInterval)
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Strict mode: absolute minimum
|
|
19
|
+
*/
|
|
20
|
+
export const STRICT_CAPABILITIES = {
|
|
21
|
+
console: false,
|
|
22
|
+
math: true,
|
|
23
|
+
date: false,
|
|
24
|
+
json: false,
|
|
25
|
+
crypto: false,
|
|
26
|
+
timers: false
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Create a capability grant from user input
|
|
30
|
+
* Always defaults to denied, must explicitly allow
|
|
31
|
+
*/
|
|
32
|
+
export function createCapabilityGrant(requested) {
|
|
33
|
+
return {
|
|
34
|
+
console: requested?.console ?? DEFAULT_CAPABILITIES.console,
|
|
35
|
+
math: requested?.math ?? DEFAULT_CAPABILITIES.math,
|
|
36
|
+
date: requested?.date ?? DEFAULT_CAPABILITIES.date,
|
|
37
|
+
json: requested?.json ?? DEFAULT_CAPABILITIES.json,
|
|
38
|
+
crypto: requested?.crypto ?? DEFAULT_CAPABILITIES.crypto,
|
|
39
|
+
timers: requested?.timers ?? DEFAULT_CAPABILITIES.timers
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a proxy membrane that guards access to a capability
|
|
44
|
+
* Throws if capability is not granted
|
|
45
|
+
*/
|
|
46
|
+
export function createCapabilityMembrane(target, capability, granted) {
|
|
47
|
+
if (!granted) {
|
|
48
|
+
return new Proxy(target, {
|
|
49
|
+
get() {
|
|
50
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
51
|
+
},
|
|
52
|
+
set() {
|
|
53
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
54
|
+
},
|
|
55
|
+
has() {
|
|
56
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
57
|
+
},
|
|
58
|
+
ownKeys() {
|
|
59
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
60
|
+
},
|
|
61
|
+
getOwnPropertyDescriptor() {
|
|
62
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
63
|
+
},
|
|
64
|
+
defineProperty() {
|
|
65
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
66
|
+
},
|
|
67
|
+
deleteProperty() {
|
|
68
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
69
|
+
},
|
|
70
|
+
getPrototypeOf() {
|
|
71
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
72
|
+
},
|
|
73
|
+
setPrototypeOf() {
|
|
74
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
75
|
+
},
|
|
76
|
+
isExtensible() {
|
|
77
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
78
|
+
},
|
|
79
|
+
preventExtensions() {
|
|
80
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
81
|
+
},
|
|
82
|
+
apply() {
|
|
83
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
84
|
+
},
|
|
85
|
+
construct() {
|
|
86
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// If granted, return a safer proxy that prevents dangerous mutations
|
|
91
|
+
return new Proxy(target, {
|
|
92
|
+
set: () => {
|
|
93
|
+
// Prevent reassignment
|
|
94
|
+
return false;
|
|
95
|
+
},
|
|
96
|
+
deleteProperty: () => {
|
|
97
|
+
return false;
|
|
98
|
+
},
|
|
99
|
+
setPrototypeOf: () => {
|
|
100
|
+
return false;
|
|
101
|
+
},
|
|
102
|
+
defineProperty: () => {
|
|
103
|
+
return false;
|
|
104
|
+
},
|
|
105
|
+
preventExtensions: () => {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic globals for sandboxed code
|
|
3
|
+
* - Date: Always returns fixed timestamp
|
|
4
|
+
* - Math: Safe, no random (unless explicitly seeded)
|
|
5
|
+
* - JSON: Safe parse/stringify
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic date: frozen to a specific moment
|
|
9
|
+
* Prevents timing attacks and makes execution reproducible
|
|
10
|
+
*/
|
|
11
|
+
export declare class DeterministicDate {
|
|
12
|
+
private static FIXED_TIMESTAMP;
|
|
13
|
+
static now(): number;
|
|
14
|
+
constructor(dateString?: string);
|
|
15
|
+
constructor(year: number, month: number, date?: number, ...rest: number[]);
|
|
16
|
+
getTime(): number;
|
|
17
|
+
valueOf(): number;
|
|
18
|
+
toString(): string;
|
|
19
|
+
toISOString(): string;
|
|
20
|
+
toJSON(): string;
|
|
21
|
+
[Symbol.toPrimitive](hint: string): string | number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Seeded pseudo-random number generator
|
|
25
|
+
* For reproducible, deterministic randomness
|
|
26
|
+
*/
|
|
27
|
+
export declare class SeededRandom {
|
|
28
|
+
private seed;
|
|
29
|
+
constructor(seed?: number);
|
|
30
|
+
/**
|
|
31
|
+
* Xorshift32 algorithm - fast, deterministic
|
|
32
|
+
*/
|
|
33
|
+
next(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Reset the seed
|
|
36
|
+
*/
|
|
37
|
+
setSeed(seed: number): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Deterministic Math object (no true random)
|
|
41
|
+
*/
|
|
42
|
+
export declare const DeterministicMath: {
|
|
43
|
+
abs: (x: number) => number;
|
|
44
|
+
acos: (x: number) => number;
|
|
45
|
+
asin: (x: number) => number;
|
|
46
|
+
atan: (x: number) => number;
|
|
47
|
+
atan2: (y: number, x: number) => number;
|
|
48
|
+
ceil: (x: number) => number;
|
|
49
|
+
cos: (x: number) => number;
|
|
50
|
+
exp: (x: number) => number;
|
|
51
|
+
floor: (x: number) => number;
|
|
52
|
+
log: (x: number) => number;
|
|
53
|
+
max: (...values: number[]) => number;
|
|
54
|
+
min: (...values: number[]) => number;
|
|
55
|
+
pow: (x: number, y: number) => number;
|
|
56
|
+
round: (x: number) => number;
|
|
57
|
+
sin: (x: number) => number;
|
|
58
|
+
sqrt: (x: number) => number;
|
|
59
|
+
tan: (x: number) => number;
|
|
60
|
+
E: number;
|
|
61
|
+
LN2: number;
|
|
62
|
+
LN10: number;
|
|
63
|
+
LOG2E: number;
|
|
64
|
+
LOG10E: number;
|
|
65
|
+
PI: number;
|
|
66
|
+
SQRT1_2: number;
|
|
67
|
+
SQRT2: number;
|
|
68
|
+
random: () => number;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Safe JSON with circular reference protection
|
|
72
|
+
*/
|
|
73
|
+
export declare const SafeJSON: {
|
|
74
|
+
parse(text: string, reviver?: (key: string, value: unknown) => unknown): unknown;
|
|
75
|
+
stringify(value: unknown, replacer?: (key: string, value: unknown) => unknown | (string | number)[] | null, space?: string | number): string;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Create a deterministic global scope with safe APIs
|
|
79
|
+
*/
|
|
80
|
+
export declare function createDeterministicGlobals(seed?: number): Record<string, unknown>;
|
|
81
|
+
//# sourceMappingURL=deterministic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic.d.ts","sourceRoot":"","sources":["../src/deterministic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,eAAe,CAAiB;IAE/C,MAAM,CAAC,GAAG,IAAI,MAAM;gBAIR,UAAU,CAAC,EAAE,MAAM;gBACnB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE;IAQzE,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM;IAIjB,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAIrB,MAAM,IAAI,MAAM;IAKhB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;CAKpD;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAc;IAIhC;;OAEG;IACH,IAAI,IAAI,MAAM;IAOd;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAG5B;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;YA2BI,MAAM,MAAM;CAC7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ;gBACP,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO;qBASvE,OAAO,aACH,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,UACxE,MAAM,GAAG,MAAM,GACtB,MAAM;CAOV,CAAC;AAEF;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASjF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic globals for sandboxed code
|
|
3
|
+
* - Date: Always returns fixed timestamp
|
|
4
|
+
* - Math: Safe, no random (unless explicitly seeded)
|
|
5
|
+
* - JSON: Safe parse/stringify
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic date: frozen to a specific moment
|
|
9
|
+
* Prevents timing attacks and makes execution reproducible
|
|
10
|
+
*/
|
|
11
|
+
export class DeterministicDate {
|
|
12
|
+
static now() {
|
|
13
|
+
return DeterministicDate.FIXED_TIMESTAMP;
|
|
14
|
+
}
|
|
15
|
+
constructor(...args) {
|
|
16
|
+
// Stub - just prevent actual Date operations
|
|
17
|
+
if (args.length === 0) {
|
|
18
|
+
// new Date() -> fixed time
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
getTime() {
|
|
22
|
+
return DeterministicDate.FIXED_TIMESTAMP;
|
|
23
|
+
}
|
|
24
|
+
valueOf() {
|
|
25
|
+
return DeterministicDate.FIXED_TIMESTAMP;
|
|
26
|
+
}
|
|
27
|
+
toString() {
|
|
28
|
+
return new Date(DeterministicDate.FIXED_TIMESTAMP).toString();
|
|
29
|
+
}
|
|
30
|
+
toISOString() {
|
|
31
|
+
return new Date(DeterministicDate.FIXED_TIMESTAMP).toISOString();
|
|
32
|
+
}
|
|
33
|
+
toJSON() {
|
|
34
|
+
return new Date(DeterministicDate.FIXED_TIMESTAMP).toJSON();
|
|
35
|
+
}
|
|
36
|
+
// Stub the rest to prevent side effects
|
|
37
|
+
[Symbol.toPrimitive](hint) {
|
|
38
|
+
if (hint === "number")
|
|
39
|
+
return DeterministicDate.FIXED_TIMESTAMP;
|
|
40
|
+
if (hint === "string")
|
|
41
|
+
return this.toString();
|
|
42
|
+
return DeterministicDate.FIXED_TIMESTAMP;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
DeterministicDate.FIXED_TIMESTAMP = 1609459200000; // 2021-01-01T00:00:00Z
|
|
46
|
+
/**
|
|
47
|
+
* Seeded pseudo-random number generator
|
|
48
|
+
* For reproducible, deterministic randomness
|
|
49
|
+
*/
|
|
50
|
+
export class SeededRandom {
|
|
51
|
+
constructor(seed = 12345) {
|
|
52
|
+
this.seed = seed >>> 0; // Ensure 32-bit unsigned
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Xorshift32 algorithm - fast, deterministic
|
|
56
|
+
*/
|
|
57
|
+
next() {
|
|
58
|
+
this.seed ^= this.seed << 13;
|
|
59
|
+
this.seed ^= this.seed >> 17;
|
|
60
|
+
this.seed ^= this.seed << 5;
|
|
61
|
+
return (this.seed >>> 0) / 4294967296; // Normalize to [0, 1)
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Reset the seed
|
|
65
|
+
*/
|
|
66
|
+
setSeed(seed) {
|
|
67
|
+
this.seed = seed >>> 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Deterministic Math object (no true random)
|
|
72
|
+
*/
|
|
73
|
+
export const DeterministicMath = {
|
|
74
|
+
abs: Math.abs,
|
|
75
|
+
acos: Math.acos,
|
|
76
|
+
asin: Math.asin,
|
|
77
|
+
atan: Math.atan,
|
|
78
|
+
atan2: Math.atan2,
|
|
79
|
+
ceil: Math.ceil,
|
|
80
|
+
cos: Math.cos,
|
|
81
|
+
exp: Math.exp,
|
|
82
|
+
floor: Math.floor,
|
|
83
|
+
log: Math.log,
|
|
84
|
+
max: Math.max,
|
|
85
|
+
min: Math.min,
|
|
86
|
+
pow: Math.pow,
|
|
87
|
+
round: Math.round,
|
|
88
|
+
sin: Math.sin,
|
|
89
|
+
sqrt: Math.sqrt,
|
|
90
|
+
tan: Math.tan,
|
|
91
|
+
E: Math.E,
|
|
92
|
+
LN2: Math.LN2,
|
|
93
|
+
LN10: Math.LN10,
|
|
94
|
+
LOG2E: Math.LOG2E,
|
|
95
|
+
LOG10E: Math.LOG10E,
|
|
96
|
+
PI: Math.PI,
|
|
97
|
+
SQRT1_2: Math.SQRT1_2,
|
|
98
|
+
SQRT2: Math.SQRT2,
|
|
99
|
+
// NO Math.random! Prevents timing leaks and non-determinism
|
|
100
|
+
random: undefined
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Safe JSON with circular reference protection
|
|
104
|
+
*/
|
|
105
|
+
export const SafeJSON = {
|
|
106
|
+
parse(text, reviver) {
|
|
107
|
+
try {
|
|
108
|
+
return JSON.parse(text, reviver);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
throw new SyntaxError(`Invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
stringify(value, replacer, space) {
|
|
115
|
+
try {
|
|
116
|
+
return JSON.stringify(value, replacer, space);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
throw new TypeError(`Cannot stringify: ${err instanceof Error ? err.message : String(err)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Create a deterministic global scope with safe APIs
|
|
125
|
+
*/
|
|
126
|
+
export function createDeterministicGlobals(seed) {
|
|
127
|
+
const random = new SeededRandom(seed);
|
|
128
|
+
return {
|
|
129
|
+
Date: DeterministicDate,
|
|
130
|
+
Math: DeterministicMath,
|
|
131
|
+
JSON: SafeJSON,
|
|
132
|
+
Math_random: () => random.next() // If seed is provided, code can use Math_random
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=deterministic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic.js","sourceRoot":"","sources":["../src/deterministic.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodebox - High-performance JavaScript sandbox
|
|
3
|
+
* @module nodebox
|
|
4
|
+
*/
|
|
5
|
+
export { createSandbox } from './sandbox.js';
|
|
6
|
+
export type { SandboxOptions, SandboxMessage } from './sandbox.js';
|
|
7
|
+
export { freezeIntrinsics, createSandboxScope, runInSandbox } from './vm-runtime.js';
|
|
8
|
+
export type { SandboxRuntimeOptions } from './vm-runtime.js';
|
|
9
|
+
export { STRICT_LIMITS, DEFAULT_LIMITS, RELAXED_LIMITS } from './limits.js';
|
|
10
|
+
export type { ResourceLimits } from './limits.js';
|
|
11
|
+
export { createCapabilityMembrane, DEFAULT_CAPABILITIES, STRICT_CAPABILITIES } from './capabilities.js';
|
|
12
|
+
export type { CapabilityGrant } from './capabilities.js';
|
|
13
|
+
export { DeterministicDate, DeterministicMath, SeededRandom, SafeJSON } from './deterministic.js';
|
|
14
|
+
export { StatsCollector } from './stats.js';
|
|
15
|
+
export type { ExecutionStats } from './stats.js';
|
|
16
|
+
export { PromiseTracker, createPromiseInterceptor } from './async.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodebox - High-performance JavaScript sandbox
|
|
3
|
+
* @module nodebox
|
|
4
|
+
*/
|
|
5
|
+
export { createSandbox } from './sandbox.js';
|
|
6
|
+
export { freezeIntrinsics, createSandboxScope, runInSandbox } from './vm-runtime.js';
|
|
7
|
+
export { STRICT_LIMITS, DEFAULT_LIMITS, RELAXED_LIMITS } from './limits.js';
|
|
8
|
+
export { createCapabilityMembrane, DEFAULT_CAPABILITIES, STRICT_CAPABILITIES } from './capabilities.js';
|
|
9
|
+
export { DeterministicDate, DeterministicMath, SeededRandom, SafeJSON } from './deterministic.js';
|
|
10
|
+
export { StatsCollector } from './stats.js';
|
|
11
|
+
export { PromiseTracker, createPromiseInterceptor } from './async.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
|