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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +351 -0
  3. package/dist/async.d.ts +38 -0
  4. package/dist/async.d.ts.map +1 -0
  5. package/dist/async.js +98 -0
  6. package/dist/async.js.map +1 -0
  7. package/dist/benchmark.d.ts +9 -0
  8. package/dist/benchmark.d.ts.map +1 -0
  9. package/dist/benchmark.js +216 -0
  10. package/dist/benchmark.js.map +1 -0
  11. package/dist/capabilities.d.ts +26 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +110 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/deterministic.d.ts +81 -0
  16. package/dist/deterministic.d.ts.map +1 -0
  17. package/dist/deterministic.js +135 -0
  18. package/dist/deterministic.js.map +1 -0
  19. package/dist/index.d.ts +17 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +12 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/limits.d.ts +24 -0
  24. package/dist/limits.d.ts.map +1 -0
  25. package/dist/limits.js +42 -0
  26. package/dist/limits.js.map +1 -0
  27. package/dist/memory-optimization.d.ts +43 -0
  28. package/dist/memory-optimization.d.ts.map +1 -0
  29. package/dist/memory-optimization.js +103 -0
  30. package/dist/memory-optimization.js.map +1 -0
  31. package/dist/optimization-examples.d.ts +33 -0
  32. package/dist/optimization-examples.d.ts.map +1 -0
  33. package/dist/optimization-examples.js +255 -0
  34. package/dist/optimization-examples.js.map +1 -0
  35. package/dist/optimized-index.d.ts +12 -0
  36. package/dist/optimized-index.d.ts.map +1 -0
  37. package/dist/optimized-index.js +9 -0
  38. package/dist/optimized-index.js.map +1 -0
  39. package/dist/optimized-sandbox.d.ts +77 -0
  40. package/dist/optimized-sandbox.d.ts.map +1 -0
  41. package/dist/optimized-sandbox.js +153 -0
  42. package/dist/optimized-sandbox.js.map +1 -0
  43. package/dist/sandbox.d.ts +25 -0
  44. package/dist/sandbox.d.ts.map +1 -0
  45. package/dist/sandbox.js +55 -0
  46. package/dist/sandbox.js.map +1 -0
  47. package/dist/script-cache.d.ts +48 -0
  48. package/dist/script-cache.d.ts.map +1 -0
  49. package/dist/script-cache.js +97 -0
  50. package/dist/script-cache.js.map +1 -0
  51. package/dist/stats.d.ts +41 -0
  52. package/dist/stats.d.ts.map +1 -0
  53. package/dist/stats.js +70 -0
  54. package/dist/stats.js.map +1 -0
  55. package/dist/test-corpus.d.ts +15 -0
  56. package/dist/test-corpus.d.ts.map +1 -0
  57. package/dist/test-corpus.js +225 -0
  58. package/dist/test-corpus.js.map +1 -0
  59. package/dist/vm-runtime.d.ts +21 -0
  60. package/dist/vm-runtime.d.ts.map +1 -0
  61. package/dist/vm-runtime.js +276 -0
  62. package/dist/vm-runtime.js.map +1 -0
  63. package/dist/worker-pool.d.ts +62 -0
  64. package/dist/worker-pool.d.ts.map +1 -0
  65. package/dist/worker-pool.js +144 -0
  66. package/dist/worker-pool.js.map +1 -0
  67. package/dist/worker.d.ts +2 -0
  68. package/dist/worker.d.ts.map +1 -0
  69. package/dist/worker.js +39 -0
  70. package/dist/worker.js.map +1 -0
  71. 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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"}
@@ -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"}