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,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"}
@@ -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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"}
@@ -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"}