@cuxt/sandboxjs 0.1.1 → 0.1.3
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 -21
- package/README.md +198 -185
- package/{build → dist/cjs}/Sandbox.d.ts +15 -6
- package/dist/cjs/Sandbox.js +126 -0
- package/dist/{SandboxExec.d.ts → cjs/SandboxExec.d.ts} +8 -17
- package/dist/cjs/SandboxExec.js +227 -0
- package/{build/eval.d.ts → dist/cjs/eval/index.d.ts} +10 -2
- package/dist/cjs/eval/index.js +233 -0
- package/dist/cjs/executor/executorUtils.d.ts +161 -0
- package/dist/cjs/executor/executorUtils.js +930 -0
- package/dist/cjs/executor/index.d.ts +1 -0
- package/dist/cjs/executor/index.js +2 -0
- package/dist/cjs/executor/ops/assignment.d.ts +1 -0
- package/dist/cjs/executor/ops/assignment.js +88 -0
- package/dist/cjs/executor/ops/call.d.ts +1 -0
- package/dist/cjs/executor/ops/call.js +160 -0
- package/dist/cjs/executor/ops/comparison.d.ts +1 -0
- package/dist/cjs/executor/ops/comparison.js +36 -0
- package/dist/cjs/executor/ops/control.d.ts +1 -0
- package/dist/cjs/executor/ops/control.js +203 -0
- package/dist/cjs/executor/ops/functions.d.ts +1 -0
- package/dist/cjs/executor/ops/functions.js +55 -0
- package/dist/cjs/executor/ops/index.d.ts +0 -0
- package/dist/cjs/executor/ops/index.js +11 -0
- package/dist/cjs/executor/ops/literals.d.ts +1 -0
- package/dist/cjs/executor/ops/literals.js +45 -0
- package/dist/cjs/executor/ops/misc.d.ts +1 -0
- package/dist/cjs/executor/ops/misc.js +25 -0
- package/dist/cjs/executor/ops/object.d.ts +1 -0
- package/dist/cjs/executor/ops/object.js +51 -0
- package/dist/cjs/executor/ops/prop.d.ts +1 -0
- package/dist/cjs/executor/ops/prop.js +70 -0
- package/dist/cjs/executor/ops/unary.d.ts +1 -0
- package/dist/cjs/executor/ops/unary.js +48 -0
- package/dist/cjs/executor/ops/variables.d.ts +1 -0
- package/dist/cjs/executor/ops/variables.js +16 -0
- package/dist/cjs/executor/opsRegistry.d.ts +33 -0
- package/dist/cjs/executor/opsRegistry.js +8 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/parser/index.d.ts +3 -0
- package/dist/cjs/parser/index.js +1 -0
- package/dist/{parser.d.ts → cjs/parser/lisp.d.ts} +29 -42
- package/dist/cjs/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/conditionals.js +135 -0
- package/dist/cjs/parser/lispTypes/control.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/control.js +204 -0
- package/dist/cjs/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/declarations.js +99 -0
- package/dist/cjs/parser/lispTypes/index.d.ts +3 -0
- package/dist/cjs/parser/lispTypes/index.js +17 -0
- package/dist/cjs/parser/lispTypes/operators.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/operators.js +252 -0
- package/dist/cjs/parser/lispTypes/shared.d.ts +38 -0
- package/dist/cjs/parser/lispTypes/structures.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/structures.js +188 -0
- package/dist/cjs/parser/lispTypes/values.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/values.js +89 -0
- package/dist/cjs/parser/parserUtils.d.ts +34 -0
- package/dist/cjs/parser/parserUtils.js +968 -0
- package/dist/cjs/utils/CodeString.d.ts +16 -0
- package/dist/cjs/utils/CodeString.js +64 -0
- package/dist/cjs/utils/ExecContext.d.ts +34 -0
- package/dist/cjs/utils/ExecContext.js +171 -0
- package/dist/cjs/utils/Prop.d.ts +16 -0
- package/dist/cjs/utils/Prop.js +81 -0
- package/dist/cjs/utils/Scope.d.ts +47 -0
- package/dist/cjs/utils/Scope.js +127 -0
- package/dist/cjs/utils/errors.d.ts +10 -0
- package/dist/cjs/utils/errors.js +12 -0
- package/dist/cjs/utils/functionReplacements.d.ts +11 -0
- package/dist/cjs/utils/functionReplacements.js +362 -0
- package/dist/cjs/utils/index.d.ts +7 -0
- package/dist/cjs/utils/index.js +7 -0
- package/dist/cjs/utils/types.d.ts +221 -0
- package/dist/cjs/utils/types.js +164 -0
- package/dist/cjs/utils/unraw.js +145 -0
- package/dist/{node → esm}/Sandbox.d.ts +15 -6
- package/dist/esm/Sandbox.js +115 -0
- package/dist/esm/Sandbox.js.map +1 -0
- package/{build → dist/esm}/SandboxExec.d.ts +8 -17
- package/dist/esm/SandboxExec.js +224 -0
- package/dist/esm/SandboxExec.js.map +1 -0
- package/dist/{eval.d.ts → esm/eval/index.d.ts} +10 -2
- package/dist/esm/eval/index.js +235 -0
- package/dist/esm/eval/index.js.map +1 -0
- package/dist/esm/executor/executorUtils.d.ts +161 -0
- package/dist/esm/executor/executorUtils.js +898 -0
- package/dist/esm/executor/executorUtils.js.map +1 -0
- package/dist/esm/executor/index.d.ts +1 -0
- package/dist/esm/executor/index.js +2 -0
- package/dist/esm/executor/ops/assignment.d.ts +1 -0
- package/dist/esm/executor/ops/assignment.js +90 -0
- package/dist/esm/executor/ops/assignment.js.map +1 -0
- package/dist/esm/executor/ops/call.d.ts +1 -0
- package/dist/esm/executor/ops/call.js +162 -0
- package/dist/esm/executor/ops/call.js.map +1 -0
- package/dist/esm/executor/ops/comparison.d.ts +1 -0
- package/dist/esm/executor/ops/comparison.js +38 -0
- package/dist/esm/executor/ops/comparison.js.map +1 -0
- package/dist/esm/executor/ops/control.d.ts +1 -0
- package/dist/esm/executor/ops/control.js +205 -0
- package/dist/esm/executor/ops/control.js.map +1 -0
- package/dist/esm/executor/ops/functions.d.ts +1 -0
- package/dist/esm/executor/ops/functions.js +57 -0
- package/dist/esm/executor/ops/functions.js.map +1 -0
- package/dist/esm/executor/ops/index.d.ts +0 -0
- package/dist/esm/executor/ops/index.js +11 -0
- package/dist/esm/executor/ops/literals.d.ts +1 -0
- package/dist/esm/executor/ops/literals.js +47 -0
- package/dist/esm/executor/ops/literals.js.map +1 -0
- package/dist/esm/executor/ops/misc.d.ts +1 -0
- package/dist/esm/executor/ops/misc.js +27 -0
- package/dist/esm/executor/ops/misc.js.map +1 -0
- package/dist/esm/executor/ops/object.d.ts +1 -0
- package/dist/esm/executor/ops/object.js +53 -0
- package/dist/esm/executor/ops/object.js.map +1 -0
- package/dist/esm/executor/ops/prop.d.ts +1 -0
- package/dist/esm/executor/ops/prop.js +72 -0
- package/dist/esm/executor/ops/prop.js.map +1 -0
- package/dist/esm/executor/ops/unary.d.ts +1 -0
- package/dist/esm/executor/ops/unary.js +50 -0
- package/dist/esm/executor/ops/unary.js.map +1 -0
- package/dist/esm/executor/ops/variables.d.ts +1 -0
- package/dist/esm/executor/ops/variables.js +18 -0
- package/dist/esm/executor/ops/variables.js.map +1 -0
- package/dist/esm/executor/opsRegistry.d.ts +33 -0
- package/dist/esm/executor/opsRegistry.js +9 -0
- package/dist/esm/executor/opsRegistry.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parser/index.d.ts +3 -0
- package/dist/esm/parser/index.js +1 -0
- package/{build/parser.d.ts → dist/esm/parser/lisp.d.ts} +29 -42
- package/dist/esm/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/esm/parser/lispTypes/conditionals.js +137 -0
- package/dist/esm/parser/lispTypes/conditionals.js.map +1 -0
- package/dist/esm/parser/lispTypes/control.d.ts +2 -0
- package/dist/esm/parser/lispTypes/control.js +206 -0
- package/dist/esm/parser/lispTypes/control.js.map +1 -0
- package/dist/esm/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/esm/parser/lispTypes/declarations.js +101 -0
- package/dist/esm/parser/lispTypes/declarations.js.map +1 -0
- package/dist/esm/parser/lispTypes/index.d.ts +3 -0
- package/dist/esm/parser/lispTypes/index.js +19 -0
- package/dist/esm/parser/lispTypes/index.js.map +1 -0
- package/dist/esm/parser/lispTypes/operators.d.ts +2 -0
- package/dist/esm/parser/lispTypes/operators.js +254 -0
- package/dist/esm/parser/lispTypes/operators.js.map +1 -0
- package/dist/esm/parser/lispTypes/shared.d.ts +38 -0
- package/dist/esm/parser/lispTypes/structures.d.ts +2 -0
- package/dist/esm/parser/lispTypes/structures.js +190 -0
- package/dist/esm/parser/lispTypes/structures.js.map +1 -0
- package/dist/esm/parser/lispTypes/values.d.ts +2 -0
- package/dist/esm/parser/lispTypes/values.js +91 -0
- package/dist/esm/parser/lispTypes/values.js.map +1 -0
- package/dist/esm/parser/parserUtils.d.ts +34 -0
- package/dist/esm/parser/parserUtils.js +959 -0
- package/dist/esm/parser/parserUtils.js.map +1 -0
- package/dist/esm/utils/CodeString.d.ts +16 -0
- package/dist/esm/utils/CodeString.js +66 -0
- package/dist/esm/utils/CodeString.js.map +1 -0
- package/dist/esm/utils/ExecContext.d.ts +34 -0
- package/dist/esm/utils/ExecContext.js +168 -0
- package/dist/esm/utils/ExecContext.js.map +1 -0
- package/dist/esm/utils/Prop.d.ts +16 -0
- package/dist/esm/utils/Prop.js +80 -0
- package/dist/esm/utils/Prop.js.map +1 -0
- package/dist/esm/utils/Scope.d.ts +47 -0
- package/dist/esm/utils/Scope.js +122 -0
- package/dist/esm/utils/Scope.js.map +1 -0
- package/dist/esm/utils/errors.d.ts +10 -0
- package/dist/esm/utils/errors.js +10 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/functionReplacements.d.ts +11 -0
- package/dist/esm/utils/functionReplacements.js +361 -0
- package/dist/esm/utils/functionReplacements.js.map +1 -0
- package/dist/esm/utils/index.d.ts +7 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/types.d.ts +221 -0
- package/dist/esm/utils/types.js +160 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unraw.js +147 -0
- package/dist/esm/utils/unraw.js.map +1 -0
- package/dist/umd/Sandbox.min.js +2 -0
- package/dist/umd/Sandbox.min.js.map +1 -0
- package/dist/umd/SandboxExec.min.js +2 -0
- package/dist/umd/SandboxExec.min.js.map +1 -0
- package/package.json +11 -9
- package/build/Sandbox.js +0 -62
- package/build/SandboxExec.js +0 -214
- package/build/eval.js +0 -205
- package/build/executor.d.ts +0 -124
- package/build/executor.js +0 -1554
- package/build/parser.js +0 -1527
- package/build/unraw.js +0 -168
- package/build/utils.d.ts +0 -264
- package/build/utils.js +0 -362
- package/dist/Sandbox.d.ts +0 -25
- package/dist/Sandbox.js +0 -270
- package/dist/Sandbox.js.map +0 -1
- package/dist/Sandbox.min.js +0 -2
- package/dist/Sandbox.min.js.map +0 -1
- package/dist/SandboxExec.js +0 -218
- package/dist/SandboxExec.js.map +0 -1
- package/dist/SandboxExec.min.js +0 -2
- package/dist/SandboxExec.min.js.map +0 -1
- package/dist/executor.d.ts +0 -124
- package/dist/executor.js +0 -1558
- package/dist/executor.js.map +0 -1
- package/dist/node/Sandbox.js +0 -277
- package/dist/node/SandboxExec.d.ts +0 -66
- package/dist/node/SandboxExec.js +0 -225
- package/dist/node/eval.d.ts +0 -27
- package/dist/node/executor.d.ts +0 -124
- package/dist/node/executor.js +0 -1575
- package/dist/node/parser.d.ts +0 -154
- package/dist/node/parser.js +0 -1704
- package/dist/node/utils.d.ts +0 -264
- package/dist/node/utils.js +0 -385
- package/dist/parser.js +0 -1690
- package/dist/parser.js.map +0 -1
- package/dist/unraw.d.ts +0 -11
- package/dist/utils.d.ts +0 -264
- package/dist/utils.js +0 -365
- package/dist/utils.js.map +0 -1
- /package/{build → dist/cjs/utils}/unraw.d.ts +0 -0
- /package/dist/{node → esm/utils}/unraw.d.ts +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { SandboxExecutionQuotaExceededError } from "./utils/errors.js";
|
|
2
|
+
import { createContext } from "./utils/ExecContext.js";
|
|
3
|
+
import "./utils/index.js";
|
|
4
|
+
import { executeTree, executeTreeAsync } from "./executor/executorUtils.js";
|
|
5
|
+
import "./executor/index.js";
|
|
6
|
+
//#region src/SandboxExec.ts
|
|
7
|
+
function subscribeSet(obj, name, callback, context) {
|
|
8
|
+
const names = context.setSubscriptions.get(obj) || /* @__PURE__ */ new Map();
|
|
9
|
+
context.setSubscriptions.set(obj, names);
|
|
10
|
+
const callbacks = names.get(name) || /* @__PURE__ */ new Set();
|
|
11
|
+
names.set(name, callbacks);
|
|
12
|
+
callbacks.add(callback);
|
|
13
|
+
let changeCbs;
|
|
14
|
+
const val = obj[name];
|
|
15
|
+
if (val instanceof Object) {
|
|
16
|
+
changeCbs = context.changeSubscriptions.get(val) || /* @__PURE__ */ new Set();
|
|
17
|
+
changeCbs.add(callback);
|
|
18
|
+
context.changeSubscriptions.set(val, changeCbs);
|
|
19
|
+
}
|
|
20
|
+
return { unsubscribe: () => {
|
|
21
|
+
callbacks.delete(callback);
|
|
22
|
+
changeCbs?.delete(callback);
|
|
23
|
+
} };
|
|
24
|
+
}
|
|
25
|
+
var SandboxExec = class SandboxExec {
|
|
26
|
+
constructor(options, evalContext) {
|
|
27
|
+
this.evalContext = evalContext;
|
|
28
|
+
this.setSubscriptions = /* @__PURE__ */ new WeakMap();
|
|
29
|
+
this.changeSubscriptions = /* @__PURE__ */ new WeakMap();
|
|
30
|
+
this.sandboxFunctions = /* @__PURE__ */ new WeakMap();
|
|
31
|
+
this.haltSubscriptions = /* @__PURE__ */ new Set();
|
|
32
|
+
this.resumeSubscriptions = /* @__PURE__ */ new Set();
|
|
33
|
+
this.halted = false;
|
|
34
|
+
this.timeoutHandleCounter = 0;
|
|
35
|
+
this.setTimeoutHandles = /* @__PURE__ */ new Map();
|
|
36
|
+
this.setIntervalHandles = /* @__PURE__ */ new Map();
|
|
37
|
+
const opt = Object.assign({
|
|
38
|
+
audit: false,
|
|
39
|
+
forbidFunctionCalls: false,
|
|
40
|
+
forbidFunctionCreation: false,
|
|
41
|
+
globals: SandboxExec.SAFE_GLOBALS,
|
|
42
|
+
symbolWhitelist: SandboxExec.SAFE_SYMBOLS,
|
|
43
|
+
prototypeWhitelist: SandboxExec.SAFE_PROTOTYPES,
|
|
44
|
+
maxParserRecursionDepth: 256,
|
|
45
|
+
nonBlocking: false,
|
|
46
|
+
functionReplacements: /* @__PURE__ */ new Map()
|
|
47
|
+
}, options || {});
|
|
48
|
+
this.context = createContext(this, opt);
|
|
49
|
+
}
|
|
50
|
+
static get SAFE_GLOBALS() {
|
|
51
|
+
return {
|
|
52
|
+
globalThis,
|
|
53
|
+
Function,
|
|
54
|
+
eval,
|
|
55
|
+
console: {
|
|
56
|
+
debug: console.debug,
|
|
57
|
+
error: console.error,
|
|
58
|
+
info: console.info,
|
|
59
|
+
log: console.log,
|
|
60
|
+
table: console.table,
|
|
61
|
+
warn: console.warn
|
|
62
|
+
},
|
|
63
|
+
isFinite,
|
|
64
|
+
isNaN,
|
|
65
|
+
parseFloat,
|
|
66
|
+
parseInt,
|
|
67
|
+
decodeURI,
|
|
68
|
+
decodeURIComponent,
|
|
69
|
+
encodeURI,
|
|
70
|
+
encodeURIComponent,
|
|
71
|
+
escape,
|
|
72
|
+
unescape,
|
|
73
|
+
Boolean,
|
|
74
|
+
Number,
|
|
75
|
+
BigInt,
|
|
76
|
+
String,
|
|
77
|
+
Object,
|
|
78
|
+
Array,
|
|
79
|
+
Symbol,
|
|
80
|
+
Error,
|
|
81
|
+
EvalError,
|
|
82
|
+
RangeError,
|
|
83
|
+
ReferenceError,
|
|
84
|
+
SyntaxError,
|
|
85
|
+
TypeError,
|
|
86
|
+
URIError,
|
|
87
|
+
Int8Array,
|
|
88
|
+
Uint8Array,
|
|
89
|
+
Uint8ClampedArray,
|
|
90
|
+
Int16Array,
|
|
91
|
+
Uint16Array,
|
|
92
|
+
Int32Array,
|
|
93
|
+
Uint32Array,
|
|
94
|
+
Float32Array,
|
|
95
|
+
Float64Array,
|
|
96
|
+
Map,
|
|
97
|
+
Set,
|
|
98
|
+
WeakMap,
|
|
99
|
+
WeakSet,
|
|
100
|
+
Promise,
|
|
101
|
+
Intl,
|
|
102
|
+
JSON,
|
|
103
|
+
Math,
|
|
104
|
+
Date,
|
|
105
|
+
RegExp
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
static get SAFE_SYMBOLS() {
|
|
109
|
+
const safeSymbols = {};
|
|
110
|
+
for (const key of [
|
|
111
|
+
"asyncIterator",
|
|
112
|
+
"iterator",
|
|
113
|
+
"match",
|
|
114
|
+
"matchAll",
|
|
115
|
+
"replace",
|
|
116
|
+
"search",
|
|
117
|
+
"split"
|
|
118
|
+
]) {
|
|
119
|
+
const value = Symbol[key];
|
|
120
|
+
if (typeof value === "symbol") safeSymbols[key] = value;
|
|
121
|
+
}
|
|
122
|
+
return safeSymbols;
|
|
123
|
+
}
|
|
124
|
+
static get SAFE_PROTOTYPES() {
|
|
125
|
+
const protos = [
|
|
126
|
+
Function,
|
|
127
|
+
Boolean,
|
|
128
|
+
Number,
|
|
129
|
+
BigInt,
|
|
130
|
+
String,
|
|
131
|
+
Date,
|
|
132
|
+
Error,
|
|
133
|
+
Array,
|
|
134
|
+
Int8Array,
|
|
135
|
+
Uint8Array,
|
|
136
|
+
Uint8ClampedArray,
|
|
137
|
+
Int16Array,
|
|
138
|
+
Uint16Array,
|
|
139
|
+
Int32Array,
|
|
140
|
+
Uint32Array,
|
|
141
|
+
Float32Array,
|
|
142
|
+
Float64Array,
|
|
143
|
+
Map,
|
|
144
|
+
Set,
|
|
145
|
+
WeakMap,
|
|
146
|
+
WeakSet,
|
|
147
|
+
Promise,
|
|
148
|
+
Symbol,
|
|
149
|
+
Date,
|
|
150
|
+
RegExp,
|
|
151
|
+
Response,
|
|
152
|
+
Request,
|
|
153
|
+
Headers,
|
|
154
|
+
FormData
|
|
155
|
+
];
|
|
156
|
+
const map = /* @__PURE__ */ new Map();
|
|
157
|
+
protos.forEach((proto) => {
|
|
158
|
+
map.set(proto, /* @__PURE__ */ new Set());
|
|
159
|
+
});
|
|
160
|
+
map.set(Object, new Set([
|
|
161
|
+
"constructor",
|
|
162
|
+
"name",
|
|
163
|
+
"entries",
|
|
164
|
+
"fromEntries",
|
|
165
|
+
"getOwnPropertyNames",
|
|
166
|
+
"is",
|
|
167
|
+
"keys",
|
|
168
|
+
"hasOwnProperty",
|
|
169
|
+
"isPrototypeOf",
|
|
170
|
+
"propertyIsEnumerable",
|
|
171
|
+
"toLocaleString",
|
|
172
|
+
"toString",
|
|
173
|
+
"valueOf",
|
|
174
|
+
"values"
|
|
175
|
+
]));
|
|
176
|
+
return map;
|
|
177
|
+
}
|
|
178
|
+
subscribeGet(callback, context) {
|
|
179
|
+
context.getSubscriptions.add(callback);
|
|
180
|
+
return { unsubscribe: () => context.getSubscriptions.delete(callback) };
|
|
181
|
+
}
|
|
182
|
+
subscribeSet(obj, name, callback, context) {
|
|
183
|
+
return subscribeSet(obj, name, callback, context);
|
|
184
|
+
}
|
|
185
|
+
subscribeSetGlobal(obj, name, callback) {
|
|
186
|
+
return subscribeSet(obj, name, callback, this);
|
|
187
|
+
}
|
|
188
|
+
subscribeHalt(cb) {
|
|
189
|
+
this.haltSubscriptions.add(cb);
|
|
190
|
+
return { unsubscribe: () => {
|
|
191
|
+
this.haltSubscriptions.delete(cb);
|
|
192
|
+
} };
|
|
193
|
+
}
|
|
194
|
+
subscribeResume(cb) {
|
|
195
|
+
this.resumeSubscriptions.add(cb);
|
|
196
|
+
return { unsubscribe: () => {
|
|
197
|
+
this.resumeSubscriptions.delete(cb);
|
|
198
|
+
} };
|
|
199
|
+
}
|
|
200
|
+
haltExecution(haltContext = { type: "manual" }) {
|
|
201
|
+
if (this.halted) return;
|
|
202
|
+
this.halted = true;
|
|
203
|
+
for (const cb of this.haltSubscriptions) cb(haltContext);
|
|
204
|
+
}
|
|
205
|
+
resumeExecution() {
|
|
206
|
+
if (!this.halted) return;
|
|
207
|
+
if (this.context.ticks.tickLimit !== void 0 && this.context.ticks.ticks >= this.context.ticks.tickLimit) throw new SandboxExecutionQuotaExceededError("Cannot resume execution: tick limit exceeded");
|
|
208
|
+
this.halted = false;
|
|
209
|
+
for (const cb of this.resumeSubscriptions) cb();
|
|
210
|
+
}
|
|
211
|
+
getContext(fn) {
|
|
212
|
+
return this.sandboxFunctions.get(fn);
|
|
213
|
+
}
|
|
214
|
+
executeTree(context, scopes = []) {
|
|
215
|
+
return executeTree(context.ctx.ticks, context, context.tree, scopes, void 0, false);
|
|
216
|
+
}
|
|
217
|
+
executeTreeAsync(context, scopes = []) {
|
|
218
|
+
return executeTreeAsync(context.ctx.ticks, context, context.tree, scopes, void 0, false);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
//#endregion
|
|
222
|
+
export { SandboxExec, SandboxExec as default };
|
|
223
|
+
|
|
224
|
+
//# sourceMappingURL=SandboxExec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxExec.js","names":[],"sources":["../../src/SandboxExec.ts"],"sourcesContent":["import type { IEvalContext } from './eval';\nimport { Change, ExecReturn, executeTree, executeTreeAsync } from './executor';\nimport { createContext, SandboxExecutionQuotaExceededError } from './utils';\nimport type {\n IContext,\n IExecContext,\n IGlobals,\n IOptionParams,\n IOptions,\n IScope,\n ISymbolWhitelist,\n SubscriptionSubject,\n HaltContext,\n} from './utils';\n\nfunction subscribeSet(\n obj: object,\n name: string,\n callback: (modification: Change) => void,\n context: {\n setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >;\n changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;\n },\n): { unsubscribe: () => void } {\n const names =\n context.setSubscriptions.get(obj) || new Map<string, Set<(modification: Change) => void>>();\n context.setSubscriptions.set(obj, names);\n const callbacks = names.get(name) || new Set();\n names.set(name, callbacks);\n callbacks.add(callback);\n let changeCbs: Set<(modification: Change) => void>;\n const val = (obj as any)[name] as unknown;\n if (val instanceof Object) {\n changeCbs = context.changeSubscriptions.get(val) || new Set();\n changeCbs.add(callback);\n context.changeSubscriptions.set(val, changeCbs);\n }\n return {\n unsubscribe: () => {\n callbacks.delete(callback);\n changeCbs?.delete(callback);\n },\n };\n}\n\nexport class SandboxExec {\n public readonly context: IContext;\n public readonly setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n > = new WeakMap();\n public readonly changeSubscriptions: WeakMap<\n SubscriptionSubject,\n Set<(modification: Change) => void>\n > = new WeakMap();\n public readonly sandboxFunctions: WeakMap<Function, IExecContext> = new WeakMap();\n private haltSubscriptions: Set<(context: HaltContext) => void> = new Set();\n private resumeSubscriptions: Set<() => void> = new Set();\n public halted = false;\n timeoutHandleCounter = 0;\n public readonly setTimeoutHandles = new Map<\n number,\n {\n handle: number;\n haltsub: { unsubscribe: () => void };\n contsub: { unsubscribe: () => void };\n }\n >();\n public readonly setIntervalHandles = new Map<\n number,\n {\n handle: number;\n haltsub: { unsubscribe: () => void };\n contsub: { unsubscribe: () => void };\n }\n >();\n constructor(\n options?: IOptionParams,\n public evalContext?: IEvalContext,\n ) {\n const opt: IOptions = Object.assign(\n {\n audit: false,\n forbidFunctionCalls: false,\n forbidFunctionCreation: false,\n globals: SandboxExec.SAFE_GLOBALS,\n symbolWhitelist: SandboxExec.SAFE_SYMBOLS,\n prototypeWhitelist: SandboxExec.SAFE_PROTOTYPES,\n maxParserRecursionDepth: 256,\n nonBlocking: false,\n functionReplacements: new Map<\n Function,\n (ctx: IExecContext, builtInReplacement?: Function) => Function\n >(),\n },\n options || {},\n );\n this.context = createContext(this, opt);\n }\n\n static get SAFE_GLOBALS(): IGlobals {\n return {\n globalThis,\n Function,\n eval,\n console: {\n debug: console.debug,\n error: console.error,\n info: console.info,\n log: console.log,\n table: console.table,\n warn: console.warn,\n },\n isFinite,\n isNaN,\n parseFloat,\n parseInt,\n decodeURI,\n decodeURIComponent,\n encodeURI,\n encodeURIComponent,\n escape,\n unescape,\n Boolean,\n Number,\n BigInt,\n String,\n Object,\n Array,\n Symbol,\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Promise,\n Intl,\n JSON,\n Math,\n Date,\n RegExp,\n };\n }\n\n static get SAFE_SYMBOLS(): ISymbolWhitelist {\n const safeSymbols: ISymbolWhitelist = {};\n for (const key of [\n 'asyncIterator',\n 'iterator',\n 'match',\n 'matchAll',\n 'replace',\n 'search',\n 'split',\n ]) {\n const value = (Symbol as unknown as Record<string, symbol | undefined>)[key];\n if (typeof value === 'symbol') {\n safeSymbols[key] = value;\n }\n }\n return safeSymbols;\n }\n\n static get SAFE_PROTOTYPES(): Map<any, Set<string>> {\n const protos = [\n Function,\n Boolean,\n Number,\n BigInt,\n String,\n Date,\n Error,\n Array,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Promise,\n Symbol,\n Date,\n RegExp,\n // Fetch API\n Response,\n Request,\n Headers,\n FormData,\n ];\n const map = new Map<any, Set<string>>();\n protos.forEach((proto) => {\n map.set(proto, new Set());\n });\n map.set(\n Object,\n new Set([\n 'constructor',\n 'name',\n 'entries',\n 'fromEntries',\n 'getOwnPropertyNames',\n 'is',\n 'keys',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf',\n 'values',\n ]),\n );\n return map;\n }\n\n subscribeGet(\n callback: (obj: SubscriptionSubject, name: string) => void,\n context: IExecContext,\n ): { unsubscribe: () => void } {\n context.getSubscriptions.add(callback);\n return { unsubscribe: () => context.getSubscriptions.delete(callback) };\n }\n\n subscribeSet(\n obj: object,\n name: string,\n callback: (modification: Change) => void,\n context: SandboxExec | IExecContext,\n ): { unsubscribe: () => void } {\n return subscribeSet(obj, name, callback, context);\n }\n\n subscribeSetGlobal(\n obj: SubscriptionSubject,\n name: string,\n callback: (modification: Change) => void,\n ): { unsubscribe: () => void } {\n return subscribeSet(obj, name, callback, this);\n }\n\n subscribeHalt(cb: (context: HaltContext) => void) {\n this.haltSubscriptions.add(cb);\n return {\n unsubscribe: () => {\n this.haltSubscriptions.delete(cb);\n },\n };\n }\n subscribeResume(cb: () => void) {\n this.resumeSubscriptions.add(cb);\n return {\n unsubscribe: () => {\n this.resumeSubscriptions.delete(cb);\n },\n };\n }\n\n haltExecution(haltContext: HaltContext = { type: 'manual' }) {\n if (this.halted) return;\n this.halted = true;\n for (const cb of this.haltSubscriptions) {\n cb(haltContext);\n }\n }\n\n resumeExecution() {\n if (!this.halted) return;\n if (\n this.context.ticks.tickLimit !== undefined &&\n this.context.ticks.ticks >= this.context.ticks.tickLimit\n ) {\n throw new SandboxExecutionQuotaExceededError('Cannot resume execution: tick limit exceeded');\n }\n this.halted = false;\n for (const cb of this.resumeSubscriptions) {\n cb();\n }\n }\n\n getContext(fn: (...args: any[]) => any) {\n return this.sandboxFunctions.get(fn);\n }\n\n executeTree<T>(context: IExecContext, scopes: IScope[] = []): ExecReturn<T> {\n return executeTree(context.ctx.ticks, context, context.tree, scopes, undefined, false);\n }\n\n executeTreeAsync<T>(context: IExecContext, scopes: IScope[] = []): Promise<ExecReturn<T>> {\n return executeTreeAsync(context.ctx.ticks, context, context.tree, scopes, undefined, false);\n }\n}\n\nexport default SandboxExec;\n"],"mappings":";;;;;;AAeA,SAAS,aACP,KACA,MACA,UACA,SAO6B;CAC7B,MAAM,QACJ,QAAQ,iBAAiB,IAAI,IAAI,oBAAI,IAAI,KAAkD;AAC7F,SAAQ,iBAAiB,IAAI,KAAK,MAAM;CACxC,MAAM,YAAY,MAAM,IAAI,KAAK,oBAAI,IAAI,KAAK;AAC9C,OAAM,IAAI,MAAM,UAAU;AAC1B,WAAU,IAAI,SAAS;CACvB,IAAI;CACJ,MAAM,MAAO,IAAY;AACzB,KAAI,eAAe,QAAQ;AACzB,cAAY,QAAQ,oBAAoB,IAAI,IAAI,oBAAI,IAAI,KAAK;AAC7D,YAAU,IAAI,SAAS;AACvB,UAAQ,oBAAoB,IAAI,KAAK,UAAU;;AAEjD,QAAO,EACL,mBAAmB;AACjB,YAAU,OAAO,SAAS;AAC1B,aAAW,OAAO,SAAS;IAE9B;;AAGH,IAAa,cAAb,MAAa,YAAY;CA+BvB,YACE,SACA,aACA;AADO,OAAA,cAAA;0CA5BL,IAAI,SAAS;6CAIb,IAAI,SAAS;0CACmD,IAAI,SAAS;2CAChB,IAAI,KAAK;6CAC3B,IAAI,KAAK;gBACxC;8BACO;2CACa,IAAI,KAOrC;4CACkC,IAAI,KAOtC;EAKD,MAAM,MAAgB,OAAO,OAC3B;GACE,OAAO;GACP,qBAAqB;GACrB,wBAAwB;GACxB,SAAS,YAAY;GACrB,iBAAiB,YAAY;GAC7B,oBAAoB,YAAY;GAChC,yBAAyB;GACzB,aAAa;GACb,sCAAsB,IAAI,KAGvB;GACJ,EACD,WAAW,EAAE,CACd;AACD,OAAK,UAAU,cAAc,MAAM,IAAI;;CAGzC,WAAW,eAAyB;AAClC,SAAO;GACL;GACA;GACA;GACA,SAAS;IACP,OAAO,QAAQ;IACf,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,KAAK,QAAQ;IACb,OAAO,QAAQ;IACf,MAAM,QAAQ;IACf;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,WAAW,eAAiC;EAC1C,MAAM,cAAgC,EAAE;AACxC,OAAK,MAAM,OAAO;GAChB;GACA;GACA;GACA;GACA;GACA;GACA;GACD,EAAE;GACD,MAAM,QAAS,OAAyD;AACxE,OAAI,OAAO,UAAU,SACnB,aAAY,OAAO;;AAGvB,SAAO;;CAGT,WAAW,kBAAyC;EAClD,MAAM,SAAS;GACb;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAEA;GACA;GACA;GACA;GACD;EACD,MAAM,sBAAM,IAAI,KAAuB;AACvC,SAAO,SAAS,UAAU;AACxB,OAAI,IAAI,uBAAO,IAAI,KAAK,CAAC;IACzB;AACF,MAAI,IACF,QACA,IAAI,IAAI;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,CACH;AACD,SAAO;;CAGT,aACE,UACA,SAC6B;AAC7B,UAAQ,iBAAiB,IAAI,SAAS;AACtC,SAAO,EAAE,mBAAmB,QAAQ,iBAAiB,OAAO,SAAS,EAAE;;CAGzE,aACE,KACA,MACA,UACA,SAC6B;AAC7B,SAAO,aAAa,KAAK,MAAM,UAAU,QAAQ;;CAGnD,mBACE,KACA,MACA,UAC6B;AAC7B,SAAO,aAAa,KAAK,MAAM,UAAU,KAAK;;CAGhD,cAAc,IAAoC;AAChD,OAAK,kBAAkB,IAAI,GAAG;AAC9B,SAAO,EACL,mBAAmB;AACjB,QAAK,kBAAkB,OAAO,GAAG;KAEpC;;CAEH,gBAAgB,IAAgB;AAC9B,OAAK,oBAAoB,IAAI,GAAG;AAChC,SAAO,EACL,mBAAmB;AACjB,QAAK,oBAAoB,OAAO,GAAG;KAEtC;;CAGH,cAAc,cAA2B,EAAE,MAAM,UAAU,EAAE;AAC3D,MAAI,KAAK,OAAQ;AACjB,OAAK,SAAS;AACd,OAAK,MAAM,MAAM,KAAK,kBACpB,IAAG,YAAY;;CAInB,kBAAkB;AAChB,MAAI,CAAC,KAAK,OAAQ;AAClB,MACE,KAAK,QAAQ,MAAM,cAAc,KAAA,KACjC,KAAK,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM,UAE/C,OAAM,IAAI,mCAAmC,+CAA+C;AAE9F,OAAK,SAAS;AACd,OAAK,MAAM,MAAM,KAAK,oBACpB,KAAI;;CAIR,WAAW,IAA6B;AACtC,SAAO,KAAK,iBAAiB,IAAI,GAAG;;CAGtC,YAAe,SAAuB,SAAmB,EAAE,EAAiB;AAC1E,SAAO,YAAY,QAAQ,IAAI,OAAO,SAAS,QAAQ,MAAM,QAAQ,KAAA,GAAW,MAAM;;CAGxF,iBAAoB,SAAuB,SAAmB,EAAE,EAA0B;AACxF,SAAO,iBAAiB,QAAQ,IAAI,OAAO,SAAS,QAAQ,MAAM,QAAQ,KAAA,GAAW,MAAM"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { lispifyFunction } from '
|
|
2
|
-
import { IExecContext } from '
|
|
1
|
+
import { lispifyFunction } from '../parser';
|
|
2
|
+
import { IExecContext } from '../utils';
|
|
3
3
|
export interface IEvalContext {
|
|
4
4
|
sandboxFunction: typeof sandboxFunction;
|
|
5
5
|
sandboxAsyncFunction: typeof sandboxAsyncFunction;
|
|
6
|
+
sandboxGeneratorFunction: typeof sandboxGeneratorFunction;
|
|
7
|
+
sandboxAsyncGeneratorFunction: typeof sandboxAsyncGeneratorFunction;
|
|
8
|
+
sandboxedSymbol: typeof sandboxedSymbol;
|
|
6
9
|
sandboxedEval: (func: SandboxFunction, context: IExecContext) => SandboxEval;
|
|
7
10
|
sandboxedSetTimeout: typeof sandboxedSetTimeout;
|
|
8
11
|
sandboxedSetInterval: typeof sandboxedSetInterval;
|
|
@@ -17,9 +20,14 @@ export type SandboxSetInterval = (handler: TimerHandler, timeout?: number, ...ar
|
|
|
17
20
|
export type SandboxClearTimeout = (handle: number) => void;
|
|
18
21
|
export type SandboxClearInterval = (handle: number) => void;
|
|
19
22
|
export declare function createEvalContext(): IEvalContext;
|
|
23
|
+
export declare function sandboxedSymbol(context: IExecContext): Function;
|
|
20
24
|
export declare function sandboxFunction(context: IExecContext): SandboxFunction;
|
|
21
25
|
export type SandboxAsyncFunction = (code: string, ...args: string[]) => () => Promise<unknown>;
|
|
22
26
|
export declare function sandboxAsyncFunction(context: IExecContext): SandboxAsyncFunction;
|
|
27
|
+
export type SandboxGeneratorFunction = (code: string, ...args: string[]) => () => Iterator<unknown> & Iterable<unknown>;
|
|
28
|
+
export declare function sandboxGeneratorFunction(context: IExecContext): SandboxGeneratorFunction;
|
|
29
|
+
export type SandboxAsyncGeneratorFunction = (code: string, ...args: string[]) => () => AsyncGenerator<unknown, unknown, unknown>;
|
|
30
|
+
export declare function sandboxAsyncGeneratorFunction(context: IExecContext): SandboxAsyncGeneratorFunction;
|
|
23
31
|
export declare function sandboxedEval(func: SandboxFunction, context: IExecContext): SandboxEval;
|
|
24
32
|
export declare function sandboxedSetTimeout(func: SandboxFunction, context: IExecContext): SandboxSetTimeout;
|
|
25
33
|
export declare function sandboxedClearTimeout(context: IExecContext): SandboxClearTimeout;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { LispType } from "../utils/types.js";
|
|
2
|
+
import { getSandboxSymbolCtor } from "../utils/ExecContext.js";
|
|
3
|
+
import "../utils/index.js";
|
|
4
|
+
import { createAsyncGeneratorFunction, createFunction, createFunctionAsync, createGeneratorFunction } from "../executor/executorUtils.js";
|
|
5
|
+
import "../executor/index.js";
|
|
6
|
+
import parse, { lispifyFunction } from "../parser/parserUtils.js";
|
|
7
|
+
import "../parser/index.js";
|
|
8
|
+
//#region src/eval/index.ts
|
|
9
|
+
function createEvalContext() {
|
|
10
|
+
return {
|
|
11
|
+
sandboxFunction,
|
|
12
|
+
sandboxAsyncFunction,
|
|
13
|
+
sandboxGeneratorFunction,
|
|
14
|
+
sandboxAsyncGeneratorFunction,
|
|
15
|
+
sandboxedSymbol,
|
|
16
|
+
sandboxedEval,
|
|
17
|
+
sandboxedSetTimeout,
|
|
18
|
+
sandboxedSetInterval,
|
|
19
|
+
sandboxedClearTimeout,
|
|
20
|
+
sandboxedClearInterval,
|
|
21
|
+
lispifyFunction
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function sandboxedSymbol(context) {
|
|
25
|
+
return getSandboxSymbolCtor(context.ctx.sandboxSymbols);
|
|
26
|
+
}
|
|
27
|
+
function SB() {}
|
|
28
|
+
function sandboxFunction(context) {
|
|
29
|
+
SandboxFunction.prototype = SB.prototype;
|
|
30
|
+
return SandboxFunction;
|
|
31
|
+
function SandboxFunction(...params) {
|
|
32
|
+
const parsed = parse(params.pop() || "", false, false, context.ctx.options.maxParserRecursionDepth);
|
|
33
|
+
return createFunction(params, parsed.tree, context.ctx.ticks, {
|
|
34
|
+
...context,
|
|
35
|
+
constants: parsed.constants,
|
|
36
|
+
tree: parsed.tree
|
|
37
|
+
}, void 0, "anonymous");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function SAF() {}
|
|
41
|
+
function sandboxAsyncFunction(context) {
|
|
42
|
+
SandboxAsyncFunction.prototype = SAF.prototype;
|
|
43
|
+
return SandboxAsyncFunction;
|
|
44
|
+
function SandboxAsyncFunction(...params) {
|
|
45
|
+
const parsed = parse(params.pop() || "", false, false, context.ctx.options.maxParserRecursionDepth);
|
|
46
|
+
return createFunctionAsync(params, parsed.tree, context.ctx.ticks, {
|
|
47
|
+
...context,
|
|
48
|
+
constants: parsed.constants,
|
|
49
|
+
tree: parsed.tree
|
|
50
|
+
}, void 0, "anonymous");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function SGF() {}
|
|
54
|
+
function sandboxGeneratorFunction(context) {
|
|
55
|
+
SandboxGeneratorFunction.prototype = SGF.prototype;
|
|
56
|
+
return SandboxGeneratorFunction;
|
|
57
|
+
function SandboxGeneratorFunction(...params) {
|
|
58
|
+
const parsed = parse(params.pop() || "", false, false, context.ctx.options.maxParserRecursionDepth);
|
|
59
|
+
return createGeneratorFunction(params, parsed.tree, context.ctx.ticks, {
|
|
60
|
+
...context,
|
|
61
|
+
constants: parsed.constants,
|
|
62
|
+
tree: parsed.tree
|
|
63
|
+
}, void 0, "anonymous");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function SAGF() {}
|
|
67
|
+
function sandboxAsyncGeneratorFunction(context) {
|
|
68
|
+
SandboxAsyncGeneratorFunction.prototype = SAGF.prototype;
|
|
69
|
+
return SandboxAsyncGeneratorFunction;
|
|
70
|
+
function SandboxAsyncGeneratorFunction(...params) {
|
|
71
|
+
const parsed = parse(params.pop() || "", false, false, context.ctx.options.maxParserRecursionDepth);
|
|
72
|
+
return createAsyncGeneratorFunction(params, parsed.tree, context.ctx.ticks, {
|
|
73
|
+
...context,
|
|
74
|
+
constants: parsed.constants,
|
|
75
|
+
tree: parsed.tree
|
|
76
|
+
}, void 0, "anonymous");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function SE() {}
|
|
80
|
+
function sandboxedEval(func, context) {
|
|
81
|
+
sandboxEval.prototype = SE.prototype;
|
|
82
|
+
return sandboxEval;
|
|
83
|
+
function sandboxEval(code) {
|
|
84
|
+
const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);
|
|
85
|
+
const tree = wrapLastStatementInReturn(parsed.tree);
|
|
86
|
+
return createFunction([], tree, context.ctx.ticks, {
|
|
87
|
+
...context,
|
|
88
|
+
constants: parsed.constants,
|
|
89
|
+
tree
|
|
90
|
+
}, void 0, "anonymous")();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function wrapLastStatementInReturn(tree) {
|
|
94
|
+
if (tree.length === 0) return tree;
|
|
95
|
+
const newTree = [...tree];
|
|
96
|
+
const lastIndex = newTree.length - 1;
|
|
97
|
+
const lastStmt = newTree[lastIndex];
|
|
98
|
+
if (Array.isArray(lastStmt) && lastStmt.length >= 1) {
|
|
99
|
+
const op = lastStmt[0];
|
|
100
|
+
if (op === LispType.Return || op === LispType.Throw) return newTree;
|
|
101
|
+
if ([
|
|
102
|
+
LispType.Let,
|
|
103
|
+
LispType.Const,
|
|
104
|
+
LispType.Var,
|
|
105
|
+
LispType.Function,
|
|
106
|
+
LispType.If,
|
|
107
|
+
LispType.Loop,
|
|
108
|
+
LispType.Try,
|
|
109
|
+
LispType.Switch,
|
|
110
|
+
LispType.InternalBlock,
|
|
111
|
+
LispType.Expression
|
|
112
|
+
].includes(op)) return newTree;
|
|
113
|
+
newTree[lastIndex] = [
|
|
114
|
+
LispType.Return,
|
|
115
|
+
LispType.None,
|
|
116
|
+
lastStmt
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
return newTree;
|
|
120
|
+
}
|
|
121
|
+
function sST() {}
|
|
122
|
+
function sandboxedSetTimeout(func, context) {
|
|
123
|
+
sandboxSetTimeout.prototype = sST.prototype;
|
|
124
|
+
return sandboxSetTimeout;
|
|
125
|
+
function sandboxSetTimeout(handler, timeout, ...args) {
|
|
126
|
+
const sandbox = context.ctx.sandbox;
|
|
127
|
+
const exec = (...a) => {
|
|
128
|
+
const h = typeof handler === "string" ? func(handler) : handler;
|
|
129
|
+
haltsub.unsubscribe();
|
|
130
|
+
contsub.unsubscribe();
|
|
131
|
+
sandbox.setTimeoutHandles.delete(sandBoxhandle);
|
|
132
|
+
return h(...a);
|
|
133
|
+
};
|
|
134
|
+
const sandBoxhandle = ++sandbox.timeoutHandleCounter;
|
|
135
|
+
let start = Date.now();
|
|
136
|
+
let handle = setTimeout(exec, timeout, ...args);
|
|
137
|
+
let elapsed = 0;
|
|
138
|
+
const haltsub = sandbox.subscribeHalt(() => {
|
|
139
|
+
elapsed = Date.now() - start + elapsed;
|
|
140
|
+
clearTimeout(handle);
|
|
141
|
+
});
|
|
142
|
+
const contsub = sandbox.subscribeResume(() => {
|
|
143
|
+
start = Date.now();
|
|
144
|
+
const remaining = Math.floor((timeout || 0) - elapsed);
|
|
145
|
+
handle = setTimeout(exec, remaining, ...args);
|
|
146
|
+
sandbox.setTimeoutHandles.set(sandBoxhandle, {
|
|
147
|
+
handle,
|
|
148
|
+
haltsub,
|
|
149
|
+
contsub
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
sandbox.setTimeoutHandles.set(sandBoxhandle, {
|
|
153
|
+
handle,
|
|
154
|
+
haltsub,
|
|
155
|
+
contsub
|
|
156
|
+
});
|
|
157
|
+
return sandBoxhandle;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function sCT() {}
|
|
161
|
+
function sandboxedClearTimeout(context) {
|
|
162
|
+
sandboxClearTimeout.prototype = sCT.prototype;
|
|
163
|
+
return sandboxClearTimeout;
|
|
164
|
+
function sandboxClearTimeout(handle) {
|
|
165
|
+
const sandbox = context.ctx.sandbox;
|
|
166
|
+
const timeoutHandle = sandbox.setTimeoutHandles.get(handle);
|
|
167
|
+
if (timeoutHandle) {
|
|
168
|
+
clearTimeout(timeoutHandle.handle);
|
|
169
|
+
timeoutHandle.haltsub.unsubscribe();
|
|
170
|
+
timeoutHandle.contsub.unsubscribe();
|
|
171
|
+
sandbox.setTimeoutHandles.delete(handle);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function sCI() {}
|
|
176
|
+
function sandboxedClearInterval(context) {
|
|
177
|
+
sandboxClearInterval.prototype = sCI.prototype;
|
|
178
|
+
return sandboxClearInterval;
|
|
179
|
+
function sandboxClearInterval(handle) {
|
|
180
|
+
const sandbox = context.ctx.sandbox;
|
|
181
|
+
const intervalHandle = sandbox.setIntervalHandles.get(handle);
|
|
182
|
+
if (intervalHandle) {
|
|
183
|
+
clearInterval(intervalHandle.handle);
|
|
184
|
+
clearTimeout(intervalHandle.handle);
|
|
185
|
+
intervalHandle.haltsub.unsubscribe();
|
|
186
|
+
intervalHandle.contsub.unsubscribe();
|
|
187
|
+
sandbox.setIntervalHandles.delete(handle);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function sSI() {}
|
|
192
|
+
function sandboxedSetInterval(func, context) {
|
|
193
|
+
sandboxSetInterval.prototype = sSI.prototype;
|
|
194
|
+
return sandboxSetInterval;
|
|
195
|
+
function sandboxSetInterval(handler, timeout, ...args) {
|
|
196
|
+
const sandbox = context.ctx.sandbox;
|
|
197
|
+
const h = typeof handler === "string" ? func(handler) : handler;
|
|
198
|
+
const exec = (...a) => {
|
|
199
|
+
start = Date.now();
|
|
200
|
+
elapsed = 0;
|
|
201
|
+
return h(...a);
|
|
202
|
+
};
|
|
203
|
+
const sandBoxhandle = ++sandbox.timeoutHandleCounter;
|
|
204
|
+
let start = Date.now();
|
|
205
|
+
let handle = setInterval(exec, timeout, ...args);
|
|
206
|
+
let elapsed = 0;
|
|
207
|
+
const haltsub = sandbox.subscribeHalt(() => {
|
|
208
|
+
elapsed = Date.now() - start + elapsed;
|
|
209
|
+
clearInterval(handle);
|
|
210
|
+
clearTimeout(handle);
|
|
211
|
+
});
|
|
212
|
+
const contsub = sandbox.subscribeResume(() => {
|
|
213
|
+
start = Date.now();
|
|
214
|
+
handle = setTimeout(() => {
|
|
215
|
+
start = Date.now();
|
|
216
|
+
elapsed = 0;
|
|
217
|
+
handle = setInterval(exec, timeout, ...args);
|
|
218
|
+
handlObj.handle = handle;
|
|
219
|
+
exec(...args);
|
|
220
|
+
}, Math.floor((timeout || 0) - elapsed), ...args);
|
|
221
|
+
handlObj.handle = handle;
|
|
222
|
+
});
|
|
223
|
+
const handlObj = {
|
|
224
|
+
handle,
|
|
225
|
+
haltsub,
|
|
226
|
+
contsub
|
|
227
|
+
};
|
|
228
|
+
sandbox.setIntervalHandles.set(sandBoxhandle, handlObj);
|
|
229
|
+
return sandBoxhandle;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//#endregion
|
|
233
|
+
export { createEvalContext };
|
|
234
|
+
|
|
235
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/eval/index.ts"],"sourcesContent":["import {\n createAsyncGeneratorFunction,\n createFunction,\n createFunctionAsync,\n createGeneratorFunction,\n} from '../executor';\nimport parse, { lispifyFunction } from '../parser';\nimport type { Lisp } from '../parser';\nimport { getSandboxSymbolCtor, LispType } from '../utils';\nimport type { IExecContext } from '../utils';\n\nexport interface IEvalContext {\n sandboxFunction: typeof sandboxFunction;\n sandboxAsyncFunction: typeof sandboxAsyncFunction;\n sandboxGeneratorFunction: typeof sandboxGeneratorFunction;\n sandboxAsyncGeneratorFunction: typeof sandboxAsyncGeneratorFunction;\n sandboxedSymbol: typeof sandboxedSymbol;\n sandboxedEval: (func: SandboxFunction, context: IExecContext) => SandboxEval;\n sandboxedSetTimeout: typeof sandboxedSetTimeout;\n sandboxedSetInterval: typeof sandboxedSetInterval;\n sandboxedClearTimeout: typeof sandboxedClearTimeout;\n sandboxedClearInterval: typeof sandboxedClearInterval;\n lispifyFunction: typeof lispifyFunction;\n}\nexport type SandboxFunction = (code: string, ...args: string[]) => () => unknown;\nexport type SandboxEval = (code: string) => unknown;\nexport type SandboxSetTimeout = (\n handler: TimerHandler,\n timeout?: number,\n ...args: unknown[]\n) => any;\nexport type SandboxSetInterval = (\n handler: TimerHandler,\n timeout?: number,\n ...args: unknown[]\n) => any;\nexport type SandboxClearTimeout = (handle: number) => void;\nexport type SandboxClearInterval = (handle: number) => void;\n\nexport function createEvalContext(): IEvalContext {\n return {\n sandboxFunction,\n sandboxAsyncFunction,\n sandboxGeneratorFunction,\n sandboxAsyncGeneratorFunction,\n sandboxedSymbol,\n sandboxedEval,\n sandboxedSetTimeout,\n sandboxedSetInterval,\n sandboxedClearTimeout,\n sandboxedClearInterval,\n lispifyFunction,\n };\n}\n\nexport function sandboxedSymbol(context: IExecContext) {\n return getSandboxSymbolCtor(context.ctx.sandboxSymbols);\n}\n\nfunction SB() {}\nexport function sandboxFunction(context: IExecContext): SandboxFunction {\n SandboxFunction.prototype = SB.prototype;\n return SandboxFunction;\n function SandboxFunction(...params: string[]) {\n const code = params.pop() || '';\n const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);\n return createFunction(\n params,\n parsed.tree,\n context.ctx.ticks,\n {\n ...context,\n constants: parsed.constants,\n tree: parsed.tree,\n },\n undefined,\n 'anonymous',\n );\n }\n}\n\nexport type SandboxAsyncFunction = (code: string, ...args: string[]) => () => Promise<unknown>;\nfunction SAF() {}\nexport function sandboxAsyncFunction(context: IExecContext): SandboxAsyncFunction {\n SandboxAsyncFunction.prototype = SAF.prototype;\n return SandboxAsyncFunction;\n function SandboxAsyncFunction(...params: string[]) {\n const code = params.pop() || '';\n const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);\n return createFunctionAsync(\n params,\n parsed.tree,\n context.ctx.ticks,\n {\n ...context,\n constants: parsed.constants,\n tree: parsed.tree,\n },\n undefined,\n 'anonymous',\n );\n }\n}\n\nexport type SandboxGeneratorFunction = (\n code: string,\n ...args: string[]\n) => () => Iterator<unknown> & Iterable<unknown>;\nfunction SGF() {}\nexport function sandboxGeneratorFunction(context: IExecContext): SandboxGeneratorFunction {\n SandboxGeneratorFunction.prototype = SGF.prototype;\n return SandboxGeneratorFunction;\n function SandboxGeneratorFunction(...params: string[]) {\n const code = params.pop() || '';\n const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);\n return createGeneratorFunction(\n params,\n parsed.tree,\n context.ctx.ticks,\n {\n ...context,\n constants: parsed.constants,\n tree: parsed.tree,\n },\n undefined,\n 'anonymous',\n );\n }\n}\n\nexport type SandboxAsyncGeneratorFunction = (\n code: string,\n ...args: string[]\n) => () => AsyncGenerator<unknown, unknown, unknown>;\nfunction SAGF() {}\nexport function sandboxAsyncGeneratorFunction(\n context: IExecContext,\n): SandboxAsyncGeneratorFunction {\n SandboxAsyncGeneratorFunction.prototype = SAGF.prototype;\n return SandboxAsyncGeneratorFunction;\n function SandboxAsyncGeneratorFunction(...params: string[]) {\n const code = params.pop() || '';\n const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);\n return createAsyncGeneratorFunction(\n params,\n parsed.tree,\n context.ctx.ticks,\n {\n ...context,\n constants: parsed.constants,\n tree: parsed.tree,\n },\n undefined,\n 'anonymous',\n );\n }\n}\n\nfunction SE() {}\nexport function sandboxedEval(func: SandboxFunction, context: IExecContext): SandboxEval {\n sandboxEval.prototype = SE.prototype;\n return sandboxEval;\n function sandboxEval(code: string) {\n // Parse the code and wrap last statement in return for completion value\n const parsed = parse(code, false, false, context.ctx.options.maxParserRecursionDepth);\n const tree = wrapLastStatementInReturn(parsed.tree);\n // Create and execute function with modified tree\n return createFunction(\n [],\n tree,\n context.ctx.ticks,\n {\n ...context,\n constants: parsed.constants,\n tree,\n },\n undefined,\n 'anonymous',\n )();\n }\n}\n\nfunction wrapLastStatementInReturn(tree: Lisp[]): Lisp[] {\n if (tree.length === 0) return tree;\n const newTree = [...tree];\n const lastIndex = newTree.length - 1;\n const lastStmt = newTree[lastIndex];\n\n // Only wrap if it's not already a return or throw\n if (Array.isArray(lastStmt) && lastStmt.length >= 1) {\n const op = lastStmt[0];\n\n // Don't wrap Return (8) or Throw (47) - they already control flow\n if (op === LispType.Return || op === LispType.Throw) {\n return newTree;\n }\n\n // List of statement types that should have undefined completion value\n // These match JavaScript semantics where declarations and control structures\n // don't produce a completion value\n const statementTypes = [\n LispType.Let, // 3\n LispType.Const, // 4\n LispType.Var, // 35\n LispType.Function, // 38\n LispType.If, // 14\n LispType.Loop, // 39\n LispType.Try, // 40\n LispType.Switch, // 41\n LispType.InternalBlock, // 43\n LispType.Expression, // 44\n ];\n\n // If the last statement is a declaration or control structure,\n // don't wrap it (it will naturally return undefined)\n if (statementTypes.includes(op)) {\n return newTree;\n }\n\n // For all other types (expressions, operators, etc.),\n // wrap in return to capture the completion value\n newTree[lastIndex] = [LispType.Return, LispType.None, lastStmt];\n }\n\n return newTree;\n}\n\nfunction sST() {}\nexport function sandboxedSetTimeout(\n func: SandboxFunction,\n context: IExecContext,\n): SandboxSetTimeout {\n sandboxSetTimeout.prototype = sST.prototype;\n return sandboxSetTimeout;\n function sandboxSetTimeout(handler: TimerHandler, timeout?: number, ...args: unknown[]) {\n const sandbox = context.ctx.sandbox;\n const exec = (...a: any[]) => {\n const h = typeof handler === 'string' ? func(handler) : handler;\n haltsub.unsubscribe();\n contsub.unsubscribe();\n sandbox.setTimeoutHandles.delete(sandBoxhandle);\n return h(...a);\n };\n\n const sandBoxhandle = ++sandbox.timeoutHandleCounter;\n\n let start = Date.now();\n let handle: number = setTimeout(exec, timeout, ...args);\n\n let elapsed = 0;\n const haltsub = sandbox.subscribeHalt(() => {\n elapsed = Date.now() - start + elapsed;\n clearTimeout(handle);\n });\n const contsub = sandbox.subscribeResume(() => {\n start = Date.now();\n const remaining = Math.floor((timeout || 0) - elapsed);\n handle = setTimeout(exec, remaining, ...args);\n sandbox.setTimeoutHandles.set(sandBoxhandle, {\n handle,\n haltsub,\n contsub,\n });\n });\n sandbox.setTimeoutHandles.set(sandBoxhandle, {\n handle,\n haltsub,\n contsub,\n });\n return sandBoxhandle;\n }\n}\n\nfunction sCT() {}\nexport function sandboxedClearTimeout(context: IExecContext): SandboxClearTimeout {\n sandboxClearTimeout.prototype = sCT.prototype;\n return sandboxClearTimeout;\n function sandboxClearTimeout(handle: number) {\n const sandbox = context.ctx.sandbox;\n const timeoutHandle = sandbox.setTimeoutHandles.get(handle);\n if (timeoutHandle) {\n clearTimeout(timeoutHandle.handle);\n timeoutHandle.haltsub.unsubscribe();\n timeoutHandle.contsub.unsubscribe();\n sandbox.setTimeoutHandles.delete(handle);\n }\n }\n}\nfunction sCI() {}\nexport function sandboxedClearInterval(context: IExecContext): SandboxClearInterval {\n sandboxClearInterval.prototype = sCI.prototype;\n return sandboxClearInterval;\n function sandboxClearInterval(handle: number) {\n const sandbox = context.ctx.sandbox;\n const intervalHandle = sandbox.setIntervalHandles.get(handle);\n if (intervalHandle) {\n clearInterval(intervalHandle.handle);\n clearTimeout(intervalHandle.handle);\n intervalHandle.haltsub.unsubscribe();\n intervalHandle.contsub.unsubscribe();\n sandbox.setIntervalHandles.delete(handle);\n }\n }\n}\n\nfunction sSI() {}\nexport function sandboxedSetInterval(\n func: SandboxFunction,\n context: IExecContext,\n): SandboxSetInterval {\n sandboxSetInterval.prototype = sSI.prototype;\n return sandboxSetInterval;\n function sandboxSetInterval(\n handler: TimerHandler,\n timeout: number | undefined,\n ...args: unknown[]\n ) {\n const sandbox = context.ctx.sandbox;\n const h = typeof handler === 'string' ? func(handler) : handler;\n const exec = (...a: any[]) => {\n start = Date.now();\n elapsed = 0;\n return h(...a);\n };\n\n const sandBoxhandle = ++sandbox.timeoutHandleCounter;\n\n let start = Date.now();\n let handle: number = setInterval(exec, timeout, ...args);\n\n let elapsed = 0;\n const haltsub = sandbox.subscribeHalt(() => {\n elapsed = Date.now() - start + elapsed;\n clearInterval(handle);\n clearTimeout(handle);\n });\n const contsub = sandbox.subscribeResume(() => {\n start = Date.now();\n handle = setTimeout(\n () => {\n start = Date.now();\n elapsed = 0;\n handle = setInterval(exec, timeout, ...args);\n handlObj.handle = handle;\n exec(...args);\n },\n Math.floor((timeout || 0) - elapsed),\n ...args,\n );\n handlObj.handle = handle;\n });\n\n const handlObj = {\n handle,\n haltsub,\n contsub,\n };\n sandbox.setIntervalHandles.set(sandBoxhandle, handlObj);\n return sandBoxhandle;\n }\n}\n"],"mappings":";;;;;;;;AAuCA,SAAgB,oBAAkC;AAChD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,gBAAgB,SAAuB;AACrD,QAAO,qBAAqB,QAAQ,IAAI,eAAe;;AAGzD,SAAS,KAAK;AACd,SAAgB,gBAAgB,SAAwC;AACtE,iBAAgB,YAAY,GAAG;AAC/B,QAAO;CACP,SAAS,gBAAgB,GAAG,QAAkB;EAE5C,MAAM,SAAS,MADF,OAAO,KAAK,IAAI,IACF,OAAO,OAAO,QAAQ,IAAI,QAAQ,wBAAwB;AACrF,SAAO,eACL,QACA,OAAO,MACP,QAAQ,IAAI,OACZ;GACE,GAAG;GACH,WAAW,OAAO;GAClB,MAAM,OAAO;GACd,EACD,KAAA,GACA,YACD;;;AAKL,SAAS,MAAM;AACf,SAAgB,qBAAqB,SAA6C;AAChF,sBAAqB,YAAY,IAAI;AACrC,QAAO;CACP,SAAS,qBAAqB,GAAG,QAAkB;EAEjD,MAAM,SAAS,MADF,OAAO,KAAK,IAAI,IACF,OAAO,OAAO,QAAQ,IAAI,QAAQ,wBAAwB;AACrF,SAAO,oBACL,QACA,OAAO,MACP,QAAQ,IAAI,OACZ;GACE,GAAG;GACH,WAAW,OAAO;GAClB,MAAM,OAAO;GACd,EACD,KAAA,GACA,YACD;;;AAQL,SAAS,MAAM;AACf,SAAgB,yBAAyB,SAAiD;AACxF,0BAAyB,YAAY,IAAI;AACzC,QAAO;CACP,SAAS,yBAAyB,GAAG,QAAkB;EAErD,MAAM,SAAS,MADF,OAAO,KAAK,IAAI,IACF,OAAO,OAAO,QAAQ,IAAI,QAAQ,wBAAwB;AACrF,SAAO,wBACL,QACA,OAAO,MACP,QAAQ,IAAI,OACZ;GACE,GAAG;GACH,WAAW,OAAO;GAClB,MAAM,OAAO;GACd,EACD,KAAA,GACA,YACD;;;AAQL,SAAS,OAAO;AAChB,SAAgB,8BACd,SAC+B;AAC/B,+BAA8B,YAAY,KAAK;AAC/C,QAAO;CACP,SAAS,8BAA8B,GAAG,QAAkB;EAE1D,MAAM,SAAS,MADF,OAAO,KAAK,IAAI,IACF,OAAO,OAAO,QAAQ,IAAI,QAAQ,wBAAwB;AACrF,SAAO,6BACL,QACA,OAAO,MACP,QAAQ,IAAI,OACZ;GACE,GAAG;GACH,WAAW,OAAO;GAClB,MAAM,OAAO;GACd,EACD,KAAA,GACA,YACD;;;AAIL,SAAS,KAAK;AACd,SAAgB,cAAc,MAAuB,SAAoC;AACvF,aAAY,YAAY,GAAG;AAC3B,QAAO;CACP,SAAS,YAAY,MAAc;EAEjC,MAAM,SAAS,MAAM,MAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,wBAAwB;EACrF,MAAM,OAAO,0BAA0B,OAAO,KAAK;AAEnD,SAAO,eACL,EAAE,EACF,MACA,QAAQ,IAAI,OACZ;GACE,GAAG;GACH,WAAW,OAAO;GAClB;GACD,EACD,KAAA,GACA,YACD,EAAE;;;AAIP,SAAS,0BAA0B,MAAsB;AACvD,KAAI,KAAK,WAAW,EAAG,QAAO;CAC9B,MAAM,UAAU,CAAC,GAAG,KAAK;CACzB,MAAM,YAAY,QAAQ,SAAS;CACnC,MAAM,WAAW,QAAQ;AAGzB,KAAI,MAAM,QAAQ,SAAS,IAAI,SAAS,UAAU,GAAG;EACnD,MAAM,KAAK,SAAS;AAGpB,MAAI,OAAO,SAAS,UAAU,OAAO,SAAS,MAC5C,QAAO;AAqBT,MAfuB;GACrB,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACV,CAIkB,SAAS,GAAG,CAC7B,QAAO;AAKT,UAAQ,aAAa;GAAC,SAAS;GAAQ,SAAS;GAAM;GAAS;;AAGjE,QAAO;;AAGT,SAAS,MAAM;AACf,SAAgB,oBACd,MACA,SACmB;AACnB,mBAAkB,YAAY,IAAI;AAClC,QAAO;CACP,SAAS,kBAAkB,SAAuB,SAAkB,GAAG,MAAiB;EACtF,MAAM,UAAU,QAAQ,IAAI;EAC5B,MAAM,QAAQ,GAAG,MAAa;GAC5B,MAAM,IAAI,OAAO,YAAY,WAAW,KAAK,QAAQ,GAAG;AACxD,WAAQ,aAAa;AACrB,WAAQ,aAAa;AACrB,WAAQ,kBAAkB,OAAO,cAAc;AAC/C,UAAO,EAAE,GAAG,EAAE;;EAGhB,MAAM,gBAAgB,EAAE,QAAQ;EAEhC,IAAI,QAAQ,KAAK,KAAK;EACtB,IAAI,SAAiB,WAAW,MAAM,SAAS,GAAG,KAAK;EAEvD,IAAI,UAAU;EACd,MAAM,UAAU,QAAQ,oBAAoB;AAC1C,aAAU,KAAK,KAAK,GAAG,QAAQ;AAC/B,gBAAa,OAAO;IACpB;EACF,MAAM,UAAU,QAAQ,sBAAsB;AAC5C,WAAQ,KAAK,KAAK;GAClB,MAAM,YAAY,KAAK,OAAO,WAAW,KAAK,QAAQ;AACtD,YAAS,WAAW,MAAM,WAAW,GAAG,KAAK;AAC7C,WAAQ,kBAAkB,IAAI,eAAe;IAC3C;IACA;IACA;IACD,CAAC;IACF;AACF,UAAQ,kBAAkB,IAAI,eAAe;GAC3C;GACA;GACA;GACD,CAAC;AACF,SAAO;;;AAIX,SAAS,MAAM;AACf,SAAgB,sBAAsB,SAA4C;AAChF,qBAAoB,YAAY,IAAI;AACpC,QAAO;CACP,SAAS,oBAAoB,QAAgB;EAC3C,MAAM,UAAU,QAAQ,IAAI;EAC5B,MAAM,gBAAgB,QAAQ,kBAAkB,IAAI,OAAO;AAC3D,MAAI,eAAe;AACjB,gBAAa,cAAc,OAAO;AAClC,iBAAc,QAAQ,aAAa;AACnC,iBAAc,QAAQ,aAAa;AACnC,WAAQ,kBAAkB,OAAO,OAAO;;;;AAI9C,SAAS,MAAM;AACf,SAAgB,uBAAuB,SAA6C;AAClF,sBAAqB,YAAY,IAAI;AACrC,QAAO;CACP,SAAS,qBAAqB,QAAgB;EAC5C,MAAM,UAAU,QAAQ,IAAI;EAC5B,MAAM,iBAAiB,QAAQ,mBAAmB,IAAI,OAAO;AAC7D,MAAI,gBAAgB;AAClB,iBAAc,eAAe,OAAO;AACpC,gBAAa,eAAe,OAAO;AACnC,kBAAe,QAAQ,aAAa;AACpC,kBAAe,QAAQ,aAAa;AACpC,WAAQ,mBAAmB,OAAO,OAAO;;;;AAK/C,SAAS,MAAM;AACf,SAAgB,qBACd,MACA,SACoB;AACpB,oBAAmB,YAAY,IAAI;AACnC,QAAO;CACP,SAAS,mBACP,SACA,SACA,GAAG,MACH;EACA,MAAM,UAAU,QAAQ,IAAI;EAC5B,MAAM,IAAI,OAAO,YAAY,WAAW,KAAK,QAAQ,GAAG;EACxD,MAAM,QAAQ,GAAG,MAAa;AAC5B,WAAQ,KAAK,KAAK;AAClB,aAAU;AACV,UAAO,EAAE,GAAG,EAAE;;EAGhB,MAAM,gBAAgB,EAAE,QAAQ;EAEhC,IAAI,QAAQ,KAAK,KAAK;EACtB,IAAI,SAAiB,YAAY,MAAM,SAAS,GAAG,KAAK;EAExD,IAAI,UAAU;EACd,MAAM,UAAU,QAAQ,oBAAoB;AAC1C,aAAU,KAAK,KAAK,GAAG,QAAQ;AAC/B,iBAAc,OAAO;AACrB,gBAAa,OAAO;IACpB;EACF,MAAM,UAAU,QAAQ,sBAAsB;AAC5C,WAAQ,KAAK,KAAK;AAClB,YAAS,iBACD;AACJ,YAAQ,KAAK,KAAK;AAClB,cAAU;AACV,aAAS,YAAY,MAAM,SAAS,GAAG,KAAK;AAC5C,aAAS,SAAS;AAClB,SAAK,GAAG,KAAK;MAEf,KAAK,OAAO,WAAW,KAAK,QAAQ,EACpC,GAAG,KACJ;AACD,YAAS,SAAS;IAClB;EAEF,MAAM,WAAW;GACf;GACA;GACA;GACD;AACD,UAAQ,mBAAmB,IAAI,eAAe,SAAS;AACvD,SAAO"}
|