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
package/dist/limits.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CPU/Memory limit helpers
|
|
3
|
+
*/
|
|
4
|
+
export interface ResourceLimits {
|
|
5
|
+
cpuMs: number;
|
|
6
|
+
memoryMb: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Default strict limits for untrusted code
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_LIMITS: ResourceLimits;
|
|
12
|
+
/**
|
|
13
|
+
* Strict mode - minimal resources
|
|
14
|
+
*/
|
|
15
|
+
export declare const STRICT_LIMITS: ResourceLimits;
|
|
16
|
+
/**
|
|
17
|
+
* Relaxed mode - for trusted/safe code
|
|
18
|
+
*/
|
|
19
|
+
export declare const RELAXED_LIMITS: ResourceLimits;
|
|
20
|
+
/**
|
|
21
|
+
* Validate that limits are reasonable
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateLimits(limits: ResourceLimits): void;
|
|
24
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,cAG5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,cAG3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,cAG5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAa3D"}
|
package/dist/limits.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CPU/Memory limit helpers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default strict limits for untrusted code
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_LIMITS = {
|
|
8
|
+
cpuMs: 5000, // 5 second timeout
|
|
9
|
+
memoryMb: 128 // 128 MB max
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Strict mode - minimal resources
|
|
13
|
+
*/
|
|
14
|
+
export const STRICT_LIMITS = {
|
|
15
|
+
cpuMs: 1000, // 1 second timeout
|
|
16
|
+
memoryMb: 32 // 32 MB max
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Relaxed mode - for trusted/safe code
|
|
20
|
+
*/
|
|
21
|
+
export const RELAXED_LIMITS = {
|
|
22
|
+
cpuMs: 30000, // 30 second timeout
|
|
23
|
+
memoryMb: 512 // 512 MB max
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Validate that limits are reasonable
|
|
27
|
+
*/
|
|
28
|
+
export function validateLimits(limits) {
|
|
29
|
+
if (limits.cpuMs < 100) {
|
|
30
|
+
throw new Error("CPU timeout must be at least 100ms");
|
|
31
|
+
}
|
|
32
|
+
if (limits.cpuMs > 300000) {
|
|
33
|
+
throw new Error("CPU timeout cannot exceed 300s");
|
|
34
|
+
}
|
|
35
|
+
if (limits.memoryMb < 16) {
|
|
36
|
+
throw new Error("Memory limit must be at least 16MB");
|
|
37
|
+
}
|
|
38
|
+
if (limits.memoryMb > 2048) {
|
|
39
|
+
throw new Error("Memory limit cannot exceed 2048MB");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,KAAK,EAAE,IAAI,EAAO,mBAAmB;IACrC,QAAQ,EAAE,GAAG,CAAK,aAAa;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,KAAK,EAAE,IAAI,EAAO,mBAAmB;IACrC,QAAQ,EAAE,EAAE,CAAM,YAAY;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,KAAK,EAAE,KAAK,EAAM,oBAAoB;IACtC,QAAQ,EAAE,GAAG,CAAK,aAAa;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory optimization utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Lazy capability membrane builder
|
|
6
|
+
* Only creates proxies for capabilities that are actually restricted
|
|
7
|
+
*/
|
|
8
|
+
export declare function createLazyCapabilityProxy(target: any, capability: string, granted: boolean): any;
|
|
9
|
+
/**
|
|
10
|
+
* Compress stats for storage/transmission
|
|
11
|
+
*/
|
|
12
|
+
export interface CompressedStats {
|
|
13
|
+
d: number;
|
|
14
|
+
m: number;
|
|
15
|
+
p: number;
|
|
16
|
+
c: number;
|
|
17
|
+
r: number;
|
|
18
|
+
e: number;
|
|
19
|
+
t: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function compressStats(stats: any): CompressedStats;
|
|
22
|
+
export declare function decompressStats(compressed: CompressedStats, memoryStart: number): any;
|
|
23
|
+
/**
|
|
24
|
+
* GC hints for Node.js
|
|
25
|
+
*/
|
|
26
|
+
export declare function suggestGC(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Periodic memory warning handler
|
|
29
|
+
*/
|
|
30
|
+
export declare function setupMemoryWatcher(threshold?: number): () => void;
|
|
31
|
+
/**
|
|
32
|
+
* Limit queue depth to prevent memory explosion
|
|
33
|
+
*/
|
|
34
|
+
export declare class BoundedQueue<T> {
|
|
35
|
+
private queue;
|
|
36
|
+
private maxSize;
|
|
37
|
+
constructor(maxSize?: number);
|
|
38
|
+
push(item: T): boolean;
|
|
39
|
+
shift(): T | undefined;
|
|
40
|
+
size(): number;
|
|
41
|
+
clear(): void;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=memory-optimization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-optimization.d.ts","sourceRoot":"","sources":["../src/memory-optimization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,GAAG,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,OAmBjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,OAAO,CAAC;CACZ;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,eAAe,CAUzD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAarF;AAED;;GAEG;AACH,wBAAgB,SAAS,SAMxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,MAAY,cAgBzD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC;IACzB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAa;IAIlC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO;IAQtB,KAAK,IAAI,CAAC,GAAG,SAAS;IAItB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory optimization utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Lazy capability membrane builder
|
|
6
|
+
* Only creates proxies for capabilities that are actually restricted
|
|
7
|
+
*/
|
|
8
|
+
export function createLazyCapabilityProxy(target, capability, granted) {
|
|
9
|
+
// If granted, no need to wrap - save memory
|
|
10
|
+
if (granted) {
|
|
11
|
+
return target;
|
|
12
|
+
}
|
|
13
|
+
// Only wrap if denied
|
|
14
|
+
return new Proxy(target, {
|
|
15
|
+
get() {
|
|
16
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
17
|
+
},
|
|
18
|
+
set() {
|
|
19
|
+
throw new Error(`Capability '${capability}' is not granted`);
|
|
20
|
+
},
|
|
21
|
+
has() {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function compressStats(stats) {
|
|
27
|
+
return {
|
|
28
|
+
d: stats.duration,
|
|
29
|
+
m: stats.memoryEnd - stats.memoryStart,
|
|
30
|
+
p: stats.memoryPeak - stats.memoryStart,
|
|
31
|
+
c: stats.promisesCreated,
|
|
32
|
+
r: stats.promisesResolved,
|
|
33
|
+
e: stats.errors?.length || 0,
|
|
34
|
+
t: stats.timeout
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function decompressStats(compressed, memoryStart) {
|
|
38
|
+
return {
|
|
39
|
+
duration: compressed.d,
|
|
40
|
+
memoryStart,
|
|
41
|
+
memoryEnd: memoryStart + compressed.m,
|
|
42
|
+
memoryPeak: memoryStart + compressed.p,
|
|
43
|
+
promisesCreated: compressed.c,
|
|
44
|
+
promisesResolved: compressed.r,
|
|
45
|
+
promisesRejected: 0,
|
|
46
|
+
errors: Array(compressed.e).fill(""),
|
|
47
|
+
timeout: compressed.t,
|
|
48
|
+
completed: !compressed.t
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* GC hints for Node.js
|
|
53
|
+
*/
|
|
54
|
+
export function suggestGC() {
|
|
55
|
+
// Only if gc is exposed
|
|
56
|
+
if (typeof global.gc !== "undefined") {
|
|
57
|
+
// Full GC
|
|
58
|
+
global.gc();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Periodic memory warning handler
|
|
63
|
+
*/
|
|
64
|
+
export function setupMemoryWatcher(threshold = 0.9) {
|
|
65
|
+
const memWatcher = setInterval(() => {
|
|
66
|
+
const usage = process.memoryUsage();
|
|
67
|
+
const heapPercent = usage.heapUsed / usage.heapTotal;
|
|
68
|
+
if (heapPercent > threshold) {
|
|
69
|
+
console.warn(`⚠️ Memory usage high: ${(heapPercent * 100).toFixed(2)}%`);
|
|
70
|
+
// Try to clean up
|
|
71
|
+
if (typeof global.gc !== "undefined") {
|
|
72
|
+
global.gc();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}, 10000);
|
|
76
|
+
return () => clearInterval(memWatcher);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Limit queue depth to prevent memory explosion
|
|
80
|
+
*/
|
|
81
|
+
export class BoundedQueue {
|
|
82
|
+
constructor(maxSize = 1000) {
|
|
83
|
+
this.queue = [];
|
|
84
|
+
this.maxSize = maxSize;
|
|
85
|
+
}
|
|
86
|
+
push(item) {
|
|
87
|
+
if (this.queue.length >= this.maxSize) {
|
|
88
|
+
return false; // Queue full
|
|
89
|
+
}
|
|
90
|
+
this.queue.push(item);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
shift() {
|
|
94
|
+
return this.queue.shift();
|
|
95
|
+
}
|
|
96
|
+
size() {
|
|
97
|
+
return this.queue.length;
|
|
98
|
+
}
|
|
99
|
+
clear() {
|
|
100
|
+
this.queue = [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=memory-optimization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-optimization.js","sourceRoot":"","sources":["../src/memory-optimization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAW,EACX,UAAkB,EAClB,OAAgB;IAEhB,4CAA4C;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sBAAsB;IACtB,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACvB,GAAG;YACD,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,kBAAkB,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG;YACD,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,kBAAkB,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAeD,MAAM,UAAU,aAAa,CAAC,KAAU;IACtC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,QAAQ;QACjB,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW;QACtC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW;QACvC,CAAC,EAAE,KAAK,CAAC,eAAe;QACxB,CAAC,EAAE,KAAK,CAAC,gBAAgB;QACzB,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;QAC5B,CAAC,EAAE,KAAK,CAAC,OAAO;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAA2B,EAAE,WAAmB;IAC9E,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtB,WAAW;QACX,SAAS,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;QACrC,UAAU,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;QACtC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC7B,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAC9B,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrB,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,wBAAwB;IACxB,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;QACrC,UAAU;QACV,MAAM,CAAC,EAAE,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAAoB,GAAG;IACxD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QAErD,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEzE,kBAAkB;YAClB,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;gBACrC,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IAIvB,YAAY,UAAkB,IAAI;QAH1B,UAAK,GAAQ,EAAE,CAAC;QAItB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,IAAO;QACV,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC,CAAC,aAAa;QAC7B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete optimization example
|
|
3
|
+
* Shows all performance improvements in action
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Example 1: High-throughput sandbox with pooling
|
|
7
|
+
*/
|
|
8
|
+
export declare function example1_HighThroughput(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Example 2: Batch execution (reduce overhead)
|
|
11
|
+
*/
|
|
12
|
+
export declare function example2_BatchExecution(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Example 3: Script caching benefit
|
|
15
|
+
*/
|
|
16
|
+
export declare function example3_ScriptCaching(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Example 4: Memory-constrained environment
|
|
19
|
+
*/
|
|
20
|
+
export declare function example4_MemoryOptimized(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Example 5: Comparison - Old vs New
|
|
23
|
+
*/
|
|
24
|
+
export declare function example5_ComparisonOldVsNew(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Example 6: Production setup with queue
|
|
27
|
+
*/
|
|
28
|
+
export declare function example6_ProductionQueue(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Run all examples
|
|
31
|
+
*/
|
|
32
|
+
export declare function runAllExamples(): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=optimization-examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimization-examples.d.ts","sourceRoot":"","sources":["../src/optimization-examples.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,wBAAsB,uBAAuB,kBA0C5C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,kBAmC5C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,kBA6B3C;AAED;;GAEG;AACH,wBAAsB,wBAAwB,kBA4C7C;AAED;;GAEG;AACH,wBAAsB,2BAA2B,kBAmDhD;AAED;;GAEG;AACH,wBAAsB,wBAAwB,kBA0D7C;AAED;;GAEG;AACH,wBAAsB,cAAc,kBAanC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete optimization example
|
|
3
|
+
* Shows all performance improvements in action
|
|
4
|
+
*/
|
|
5
|
+
import { createOptimizedSandbox } from "./optimized-sandbox.js";
|
|
6
|
+
import { setupMemoryWatcher, suggestGC, BoundedQueue } from "./memory-optimization.js";
|
|
7
|
+
import { HIGH_CONCURRENCY_CONFIG } from "./worker-pool.js";
|
|
8
|
+
/**
|
|
9
|
+
* Example 1: High-throughput sandbox with pooling
|
|
10
|
+
*/
|
|
11
|
+
export async function example1_HighThroughput() {
|
|
12
|
+
console.log("📊 Example 1: High-Throughput Sandbox");
|
|
13
|
+
const sandbox = createOptimizedSandbox({
|
|
14
|
+
cpuMs: 5000,
|
|
15
|
+
memoryMb: 128,
|
|
16
|
+
poolConfig: HIGH_CONCURRENCY_CONFIG,
|
|
17
|
+
cacheScripts: true
|
|
18
|
+
});
|
|
19
|
+
// Stop memory watcher on cleanup
|
|
20
|
+
const stopWatcher = setupMemoryWatcher(0.85);
|
|
21
|
+
const startMem = process.memoryUsage();
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
// Simulate 100 concurrent requests
|
|
24
|
+
const promises = [];
|
|
25
|
+
for (let i = 0; i < 100; i++) {
|
|
26
|
+
promises.push(sandbox.run(`
|
|
27
|
+
const arr = Array(${i + 1}).fill(0).map((_, i) => i * 2);
|
|
28
|
+
arr.reduce((a, b) => a + b, 0);
|
|
29
|
+
`));
|
|
30
|
+
}
|
|
31
|
+
const results = await Promise.allSettled(promises);
|
|
32
|
+
const duration = Date.now() - startTime;
|
|
33
|
+
const endMem = process.memoryUsage();
|
|
34
|
+
// Show results
|
|
35
|
+
const succeeded = results.filter((r) => r.status === "fulfilled").length;
|
|
36
|
+
console.log(`✅ Succeeded: ${succeeded}/100`);
|
|
37
|
+
console.log(`⏱️ Total time: ${duration}ms (avg: ${(duration / 100).toFixed(2)}ms)`);
|
|
38
|
+
console.log(`📈 Memory delta: ${((endMem.heapUsed - startMem.heapUsed) / 1024 / 1024).toFixed(2)}MB`);
|
|
39
|
+
console.log(`🔄 Pool stats:`, sandbox.stats().pool);
|
|
40
|
+
console.log(`💾 Cache stats:`, sandbox.stats().cache);
|
|
41
|
+
await sandbox.destroy();
|
|
42
|
+
stopWatcher();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Example 2: Batch execution (reduce overhead)
|
|
46
|
+
*/
|
|
47
|
+
export async function example2_BatchExecution() {
|
|
48
|
+
console.log("\n📦 Example 2: Batch Execution");
|
|
49
|
+
const sandbox = createOptimizedSandbox({
|
|
50
|
+
cpuMs: 3000,
|
|
51
|
+
memoryMb: 64,
|
|
52
|
+
poolConfig: { minWorkers: 2, maxWorkers: 4, idleTimeout: 30000, memoryMb: 64 },
|
|
53
|
+
cacheScripts: true
|
|
54
|
+
});
|
|
55
|
+
const startTime = Date.now();
|
|
56
|
+
// Create 50 operations
|
|
57
|
+
const operations = Array.from({ length: 50 }, (_, i) => ({
|
|
58
|
+
id: `op_${i}`,
|
|
59
|
+
code: `
|
|
60
|
+
const data = ${JSON.stringify(Array(10).fill(i))};
|
|
61
|
+
data.map(x => x * Math.PI).reduce((a, b) => a + b, 0);
|
|
62
|
+
`
|
|
63
|
+
}));
|
|
64
|
+
// Execute with 4 concurrent workers
|
|
65
|
+
const results = await sandbox.batch(operations, {
|
|
66
|
+
concurrency: 4,
|
|
67
|
+
stopOnError: false
|
|
68
|
+
});
|
|
69
|
+
const duration = Date.now() - startTime;
|
|
70
|
+
const successful = results.filter((r) => !r.error).length;
|
|
71
|
+
console.log(`✅ Successful: ${successful}/50`);
|
|
72
|
+
console.log(`⏱️ Total time: ${duration}ms (avg: ${(duration / 50).toFixed(2)}ms per op)`);
|
|
73
|
+
console.log(`📊 First result:`, results[0]);
|
|
74
|
+
await sandbox.destroy();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Example 3: Script caching benefit
|
|
78
|
+
*/
|
|
79
|
+
export async function example3_ScriptCaching() {
|
|
80
|
+
console.log("\n🔄 Example 3: Script Caching");
|
|
81
|
+
const sandbox = createOptimizedSandbox({
|
|
82
|
+
cpuMs: 2000,
|
|
83
|
+
memoryMb: 32,
|
|
84
|
+
cacheScripts: true
|
|
85
|
+
});
|
|
86
|
+
const code = `
|
|
87
|
+
const arr = [1, 2, 3, 4, 5];
|
|
88
|
+
arr.map(x => x * 2).reduce((a, b) => a + b, 0);
|
|
89
|
+
`;
|
|
90
|
+
// Run same code 20 times
|
|
91
|
+
console.log("Running same code 20 times...");
|
|
92
|
+
const startTime = Date.now();
|
|
93
|
+
for (let i = 0; i < 20; i++) {
|
|
94
|
+
await sandbox.run(code);
|
|
95
|
+
}
|
|
96
|
+
const duration = Date.now() - startTime;
|
|
97
|
+
console.log(`⏱️ Total time: ${duration}ms (avg: ${(duration / 20).toFixed(2)}ms)`);
|
|
98
|
+
console.log(`💾 Cache stats:`, sandbox.stats().cache);
|
|
99
|
+
console.log(`💡 First run compiles, rest use cache (saves compilation time)`);
|
|
100
|
+
await sandbox.destroy();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Example 4: Memory-constrained environment
|
|
104
|
+
*/
|
|
105
|
+
export async function example4_MemoryOptimized() {
|
|
106
|
+
console.log("\n💾 Example 4: Memory Optimization");
|
|
107
|
+
const sandbox = createOptimizedSandbox({
|
|
108
|
+
cpuMs: 3000,
|
|
109
|
+
memoryMb: 32, // Very low
|
|
110
|
+
poolConfig: {
|
|
111
|
+
minWorkers: 1,
|
|
112
|
+
maxWorkers: 2,
|
|
113
|
+
idleTimeout: 10000,
|
|
114
|
+
memoryMb: 32
|
|
115
|
+
},
|
|
116
|
+
cacheScripts: true
|
|
117
|
+
});
|
|
118
|
+
// Watch memory
|
|
119
|
+
const stopWatcher = setupMemoryWatcher(0.75);
|
|
120
|
+
const startMem = process.memoryUsage();
|
|
121
|
+
// Run 30 operations sequentially
|
|
122
|
+
const operations = Array.from({ length: 30 }, (_, i) => ({
|
|
123
|
+
id: `mem_${i}`,
|
|
124
|
+
code: `Array(1000).fill(0).map(x => Math.random())`
|
|
125
|
+
}));
|
|
126
|
+
const results = await sandbox.batch(operations, {
|
|
127
|
+
concurrency: 1, // Serial execution to save memory
|
|
128
|
+
stopOnError: false
|
|
129
|
+
});
|
|
130
|
+
const endMem = process.memoryUsage();
|
|
131
|
+
console.log(`✅ Completed: ${results.filter((r) => !r.error).length}/30`);
|
|
132
|
+
console.log(`📈 Memory used: ${((endMem.heapUsed - startMem.heapUsed) / 1024 / 1024).toFixed(2)}MB`);
|
|
133
|
+
console.log(`🔄 Pool stats:`, sandbox.stats().pool);
|
|
134
|
+
// Suggest GC
|
|
135
|
+
suggestGC();
|
|
136
|
+
await sandbox.destroy();
|
|
137
|
+
stopWatcher();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Example 5: Comparison - Old vs New
|
|
141
|
+
*/
|
|
142
|
+
export async function example5_ComparisonOldVsNew() {
|
|
143
|
+
console.log("\n⚡ Example 5: Old vs Optimized (10 runs)");
|
|
144
|
+
const OLD_TIME = [];
|
|
145
|
+
const NEW_TIME = [];
|
|
146
|
+
// Simulate old approach (spawn new worker each time)
|
|
147
|
+
for (let run = 0; run < 3; run++) {
|
|
148
|
+
const startTime = Date.now();
|
|
149
|
+
const promises = [];
|
|
150
|
+
for (let i = 0; i < 10; i++) {
|
|
151
|
+
promises.push(new Promise((resolve) => {
|
|
152
|
+
// Simulate old way - would be much slower
|
|
153
|
+
setTimeout(() => resolve(i * 2), 10); // Simulated spawn overhead
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
await Promise.all(promises);
|
|
157
|
+
OLD_TIME.push(Date.now() - startTime);
|
|
158
|
+
}
|
|
159
|
+
// New optimized approach
|
|
160
|
+
const sandbox = createOptimizedSandbox({
|
|
161
|
+
cpuMs: 3000,
|
|
162
|
+
memoryMb: 64,
|
|
163
|
+
poolConfig: HIGH_CONCURRENCY_CONFIG,
|
|
164
|
+
cacheScripts: true
|
|
165
|
+
});
|
|
166
|
+
for (let run = 0; run < 3; run++) {
|
|
167
|
+
const startTime = Date.now();
|
|
168
|
+
const promises = [];
|
|
169
|
+
for (let i = 0; i < 10; i++) {
|
|
170
|
+
promises.push(sandbox.run(`${i} * 2`));
|
|
171
|
+
}
|
|
172
|
+
await Promise.all(promises);
|
|
173
|
+
NEW_TIME.push(Date.now() - startTime);
|
|
174
|
+
}
|
|
175
|
+
await sandbox.destroy();
|
|
176
|
+
console.log(`Old approach (simulated): ${OLD_TIME.map((t) => t + "ms").join(", ")}`);
|
|
177
|
+
console.log(`Optimized approach: ${NEW_TIME.map((t) => t + "ms").join(", ")}`);
|
|
178
|
+
console.log(`💡 Speedup: ~${((OLD_TIME[2] / NEW_TIME[2]) * 100).toFixed(0)}% faster`);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Example 6: Production setup with queue
|
|
182
|
+
*/
|
|
183
|
+
export async function example6_ProductionQueue() {
|
|
184
|
+
console.log("\n🏭 Example 6: Production Queue with Rate Limiting");
|
|
185
|
+
const sandbox = createOptimizedSandbox({
|
|
186
|
+
cpuMs: 5000,
|
|
187
|
+
memoryMb: 128,
|
|
188
|
+
poolConfig: HIGH_CONCURRENCY_CONFIG
|
|
189
|
+
});
|
|
190
|
+
// Bounded queue prevents memory explosion
|
|
191
|
+
const queue = new BoundedQueue(500);
|
|
192
|
+
let processed = 0;
|
|
193
|
+
let rejected = 0;
|
|
194
|
+
// Simulate incoming requests
|
|
195
|
+
const incomingRate = 100; // 100 req/s
|
|
196
|
+
const processingTime = 10; // ms per req
|
|
197
|
+
const simulator = setInterval(async () => {
|
|
198
|
+
// Try to add 10 requests
|
|
199
|
+
for (let i = 0; i < 10; i++) {
|
|
200
|
+
const queued = queue.push({
|
|
201
|
+
resolve: () => { },
|
|
202
|
+
reject: () => { },
|
|
203
|
+
code: `Array(100).fill(0).reduce((a,b) => a+b, 0)`
|
|
204
|
+
});
|
|
205
|
+
if (!queued) {
|
|
206
|
+
rejected++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}, 100);
|
|
210
|
+
// Process queue
|
|
211
|
+
while (processed < 100) {
|
|
212
|
+
const item = queue.shift();
|
|
213
|
+
if (item) {
|
|
214
|
+
try {
|
|
215
|
+
await sandbox.run(item.code);
|
|
216
|
+
processed++;
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
if (item.reject) {
|
|
220
|
+
item.reject(err);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
clearInterval(simulator);
|
|
229
|
+
console.log(`✅ Processed: ${processed}`);
|
|
230
|
+
console.log(`❌ Rejected: ${rejected}`);
|
|
231
|
+
console.log(`📊 Queue depth limit: 500`);
|
|
232
|
+
await sandbox.destroy();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Run all examples
|
|
236
|
+
*/
|
|
237
|
+
export async function runAllExamples() {
|
|
238
|
+
try {
|
|
239
|
+
await example1_HighThroughput();
|
|
240
|
+
await example2_BatchExecution();
|
|
241
|
+
await example3_ScriptCaching();
|
|
242
|
+
await example4_MemoryOptimized();
|
|
243
|
+
await example5_ComparisonOldVsNew();
|
|
244
|
+
await example6_ProductionQueue();
|
|
245
|
+
console.log("\n✅ All examples completed!");
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
console.error("Error:", err);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Run if executed directly
|
|
252
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
253
|
+
runAllExamples();
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=optimization-examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimization-examples.js","sourceRoot":"","sources":["../src/optimization-examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodebox/optimized - Optimized sandbox with pooling and caching
|
|
3
|
+
* @module nodebox/optimized
|
|
4
|
+
*/
|
|
5
|
+
export { createOptimizedSandbox } from './optimized-sandbox.js';
|
|
6
|
+
export type { OptimizedSandboxOptions } from './optimized-sandbox.js';
|
|
7
|
+
export { WorkerPool } from './worker-pool.js';
|
|
8
|
+
export type { PooledWorker, PoolConfig, PoolStats } from './worker-pool.js';
|
|
9
|
+
export { ScriptCache } from './script-cache.js';
|
|
10
|
+
export type { CachedScript, CacheStats } from './script-cache.js';
|
|
11
|
+
export { createLazyCapabilityProxy, compressStats, decompressStats, suggestGC, setupMemoryWatcher, BoundedQueue } from './memory-optimization.js';
|
|
12
|
+
//# sourceMappingURL=optimized-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimized-index.d.ts","sourceRoot":"","sources":["../src/optimized-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,YAAY,EACb,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodebox/optimized - Optimized sandbox with pooling and caching
|
|
3
|
+
* @module nodebox/optimized
|
|
4
|
+
*/
|
|
5
|
+
export { createOptimizedSandbox } from './optimized-sandbox.js';
|
|
6
|
+
export { WorkerPool } from './worker-pool.js';
|
|
7
|
+
export { ScriptCache } from './script-cache.js';
|
|
8
|
+
export { createLazyCapabilityProxy, compressStats, decompressStats, suggestGC, setupMemoryWatcher, BoundedQueue } from './memory-optimization.js';
|
|
9
|
+
//# sourceMappingURL=optimized-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimized-index.js","sourceRoot":"","sources":["../src/optimized-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,YAAY,EACb,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized sandbox for high throughput
|
|
3
|
+
* Features: worker pool, script cache, batch execution
|
|
4
|
+
*/
|
|
5
|
+
import { PoolConfig } from "./worker-pool.js";
|
|
6
|
+
import { CapabilityGrant } from "./capabilities.js";
|
|
7
|
+
import { ExecutionStats } from "./stats.js";
|
|
8
|
+
export interface OptimizedSandboxOptions {
|
|
9
|
+
cpuMs: number;
|
|
10
|
+
memoryMb: number;
|
|
11
|
+
capabilities?: Partial<CapabilityGrant>;
|
|
12
|
+
seed?: number;
|
|
13
|
+
poolConfig?: Partial<PoolConfig>;
|
|
14
|
+
cacheScripts?: boolean;
|
|
15
|
+
enableStrictFreezing?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SandboxResult {
|
|
18
|
+
type: "result";
|
|
19
|
+
result: unknown;
|
|
20
|
+
stats: ExecutionStats;
|
|
21
|
+
}
|
|
22
|
+
export interface SandboxError {
|
|
23
|
+
type: "error";
|
|
24
|
+
error: string;
|
|
25
|
+
}
|
|
26
|
+
export type SandboxMessage = SandboxResult | SandboxError;
|
|
27
|
+
/**
|
|
28
|
+
* Optimized sandbox with pooling and caching
|
|
29
|
+
*/
|
|
30
|
+
export declare class OptimizedSandbox {
|
|
31
|
+
private pool;
|
|
32
|
+
private scriptCache;
|
|
33
|
+
private options;
|
|
34
|
+
private intrinsicsFrozen;
|
|
35
|
+
constructor(options: OptimizedSandboxOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Run code in sandbox
|
|
38
|
+
*/
|
|
39
|
+
run(code: string): Promise<SandboxMessage>;
|
|
40
|
+
/**
|
|
41
|
+
* Batch execute multiple operations
|
|
42
|
+
*/
|
|
43
|
+
batch(operations: Array<{
|
|
44
|
+
code: string;
|
|
45
|
+
id?: string;
|
|
46
|
+
}>, options?: {
|
|
47
|
+
concurrency?: number;
|
|
48
|
+
stopOnError?: boolean;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
id?: string;
|
|
51
|
+
result?: unknown;
|
|
52
|
+
error?: string;
|
|
53
|
+
stats?: ExecutionStats;
|
|
54
|
+
}[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Get current stats
|
|
57
|
+
*/
|
|
58
|
+
stats(): {
|
|
59
|
+
pool: import("./worker-pool.js").PoolStats;
|
|
60
|
+
cache: {
|
|
61
|
+
size: number;
|
|
62
|
+
maxSize: number;
|
|
63
|
+
totalUses: number;
|
|
64
|
+
totalHits: number;
|
|
65
|
+
hitRate: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Clean up
|
|
70
|
+
*/
|
|
71
|
+
destroy(): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create optimized sandbox
|
|
75
|
+
*/
|
|
76
|
+
export declare function createOptimizedSandbox(options: OptimizedSandboxOptions): OptimizedSandbox;
|
|
77
|
+
//# sourceMappingURL=optimized-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimized-sandbox.d.ts","sourceRoot":"","sources":["../src/optimized-sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAmC,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAwB,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;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;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,EAAE,uBAAuB;IAoB5C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA+D1C;;OAEG;IACG,KAAK,CACT,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAChD,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;aAIlD,MAAM;iBACF,OAAO;gBACR,MAAM;gBACN,cAAc;;IAwC1B;;OAEG;IACH,KAAK;;;;;;;;;;IAOL;;OAEG;IACG,OAAO;CAId;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,oBAEtE"}
|