@nyariv/sandboxjs 0.8.22 → 0.8.24
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/.eslintignore +6 -0
- package/.eslintrc.js +22 -0
- package/.prettierrc +4 -0
- package/.vscode/settings.json +4 -0
- package/build/Sandbox.d.ts +11 -78
- package/build/Sandbox.js +21 -216
- package/build/SandboxExec.d.ts +25 -0
- package/build/SandboxExec.js +169 -0
- package/build/eval.d.ts +18 -0
- package/build/eval.js +43 -0
- package/build/executor.d.ts +56 -95
- package/build/executor.js +739 -815
- package/build/parser.d.ts +112 -74
- package/build/parser.js +504 -542
- package/build/unraw.js +13 -16
- package/build/utils.d.ts +242 -0
- package/build/utils.js +276 -0
- package/dist/Sandbox.d.ts +11 -78
- package/dist/Sandbox.js +106 -1
- package/dist/Sandbox.js.map +1 -1
- package/dist/Sandbox.min.js +1 -1
- package/dist/Sandbox.min.js.map +1 -1
- package/dist/SandboxExec.d.ts +25 -0
- package/dist/SandboxExec.js +173 -0
- package/dist/SandboxExec.js.map +1 -0
- package/dist/SandboxExec.min.js +2 -0
- package/dist/SandboxExec.min.js.map +1 -0
- package/dist/eval.d.ts +18 -0
- package/dist/executor.d.ts +56 -95
- package/dist/executor.js +1270 -0
- package/dist/executor.js.map +1 -0
- package/dist/node/Sandbox.d.ts +11 -78
- package/dist/node/Sandbox.js +37 -3091
- package/dist/node/SandboxExec.d.ts +25 -0
- package/dist/node/SandboxExec.js +176 -0
- package/dist/node/eval.d.ts +18 -0
- package/dist/node/executor.d.ts +56 -95
- package/dist/node/executor.js +1289 -0
- package/dist/node/parser.d.ts +112 -74
- package/dist/node/parser.js +1528 -0
- package/dist/node/utils.d.ts +242 -0
- package/dist/node/utils.js +290 -0
- package/dist/parser.d.ts +112 -74
- package/dist/parser.js +1514 -0
- package/dist/parser.js.map +1 -0
- package/dist/utils.d.ts +242 -0
- package/dist/utils.js +279 -0
- package/dist/utils.js.map +1 -0
- package/package.json +22 -14
- package/.github/workflows/npm-publish.yml +0 -34
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IEvalContext } from './eval.js';
|
|
2
|
+
import { Change, ExecReturn } from './executor.js';
|
|
3
|
+
import { IContext, IExecContext, IGlobals, IOptionParams, IScope, SubscriptionSubject } from './utils.js';
|
|
4
|
+
export default class SandboxExec {
|
|
5
|
+
evalContext?: IEvalContext | undefined;
|
|
6
|
+
context: IContext;
|
|
7
|
+
setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>;
|
|
8
|
+
changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;
|
|
9
|
+
sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext>;
|
|
10
|
+
constructor(options?: IOptionParams, evalContext?: IEvalContext | undefined);
|
|
11
|
+
static get SAFE_GLOBALS(): IGlobals;
|
|
12
|
+
static get SAFE_PROTOTYPES(): Map<any, Set<string>>;
|
|
13
|
+
subscribeGet(callback: (obj: SubscriptionSubject, name: string) => void, context: IExecContext): {
|
|
14
|
+
unsubscribe: () => void;
|
|
15
|
+
};
|
|
16
|
+
subscribeSet(obj: object, name: string, callback: (modification: Change) => void, context: SandboxExec | IExecContext): {
|
|
17
|
+
unsubscribe: () => void;
|
|
18
|
+
};
|
|
19
|
+
subscribeSetGlobal(obj: SubscriptionSubject, name: string, callback: (modification: Change) => void): {
|
|
20
|
+
unsubscribe: () => void;
|
|
21
|
+
};
|
|
22
|
+
getContext(fn: (...args: any[]) => any): IExecContext | undefined;
|
|
23
|
+
executeTree<T>(context: IExecContext, scopes?: IScope[]): ExecReturn<T>;
|
|
24
|
+
executeTreeAsync<T>(context: IExecContext, scopes?: IScope[]): Promise<ExecReturn<T>>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { executeTree, executeTreeAsync } from './executor.js';
|
|
2
|
+
import { createContext, SandboxGlobal } from './utils.js';
|
|
3
|
+
|
|
4
|
+
function subscribeSet(obj, name, callback, context) {
|
|
5
|
+
if (!(obj instanceof Object))
|
|
6
|
+
throw new Error('Invalid subscription object, got ' + (typeof obj === 'object' ? 'null' : typeof obj));
|
|
7
|
+
const names = context.setSubscriptions.get(obj) || new Map();
|
|
8
|
+
context.setSubscriptions.set(obj, names);
|
|
9
|
+
const callbacks = names.get(name) || new Set();
|
|
10
|
+
names.set(name, callbacks);
|
|
11
|
+
callbacks.add(callback);
|
|
12
|
+
let changeCbs;
|
|
13
|
+
const val = obj[name];
|
|
14
|
+
if (val instanceof Object) {
|
|
15
|
+
changeCbs = context.changeSubscriptions.get(val) || new Set();
|
|
16
|
+
changeCbs.add(callback);
|
|
17
|
+
context.changeSubscriptions.set(val, changeCbs);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
unsubscribe: () => {
|
|
21
|
+
callbacks.delete(callback);
|
|
22
|
+
changeCbs?.delete(callback);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
class SandboxExec {
|
|
27
|
+
constructor(options, evalContext) {
|
|
28
|
+
this.evalContext = evalContext;
|
|
29
|
+
this.setSubscriptions = new WeakMap();
|
|
30
|
+
this.changeSubscriptions = new WeakMap();
|
|
31
|
+
this.sandboxFunctions = new WeakMap();
|
|
32
|
+
const opt = Object.assign({
|
|
33
|
+
audit: false,
|
|
34
|
+
forbidFunctionCalls: false,
|
|
35
|
+
forbidFunctionCreation: false,
|
|
36
|
+
globals: SandboxExec.SAFE_GLOBALS,
|
|
37
|
+
prototypeWhitelist: SandboxExec.SAFE_PROTOTYPES,
|
|
38
|
+
prototypeReplacements: new Map(),
|
|
39
|
+
}, options || {});
|
|
40
|
+
this.context = createContext(this, opt);
|
|
41
|
+
}
|
|
42
|
+
static get SAFE_GLOBALS() {
|
|
43
|
+
return {
|
|
44
|
+
Function,
|
|
45
|
+
console: {
|
|
46
|
+
debug: console.debug,
|
|
47
|
+
error: console.error,
|
|
48
|
+
info: console.info,
|
|
49
|
+
log: console.log,
|
|
50
|
+
table: console.table,
|
|
51
|
+
warn: console.warn,
|
|
52
|
+
},
|
|
53
|
+
isFinite,
|
|
54
|
+
isNaN,
|
|
55
|
+
parseFloat,
|
|
56
|
+
parseInt,
|
|
57
|
+
decodeURI,
|
|
58
|
+
decodeURIComponent,
|
|
59
|
+
encodeURI,
|
|
60
|
+
encodeURIComponent,
|
|
61
|
+
escape,
|
|
62
|
+
unescape,
|
|
63
|
+
Boolean,
|
|
64
|
+
Number,
|
|
65
|
+
BigInt,
|
|
66
|
+
String,
|
|
67
|
+
Object,
|
|
68
|
+
Array,
|
|
69
|
+
Symbol,
|
|
70
|
+
Error,
|
|
71
|
+
EvalError,
|
|
72
|
+
RangeError,
|
|
73
|
+
ReferenceError,
|
|
74
|
+
SyntaxError,
|
|
75
|
+
TypeError,
|
|
76
|
+
URIError,
|
|
77
|
+
Int8Array,
|
|
78
|
+
Uint8Array,
|
|
79
|
+
Uint8ClampedArray,
|
|
80
|
+
Int16Array,
|
|
81
|
+
Uint16Array,
|
|
82
|
+
Int32Array,
|
|
83
|
+
Uint32Array,
|
|
84
|
+
Float32Array,
|
|
85
|
+
Float64Array,
|
|
86
|
+
Map,
|
|
87
|
+
Set,
|
|
88
|
+
WeakMap,
|
|
89
|
+
WeakSet,
|
|
90
|
+
Promise,
|
|
91
|
+
Intl,
|
|
92
|
+
JSON,
|
|
93
|
+
Math,
|
|
94
|
+
Date,
|
|
95
|
+
RegExp,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
static get SAFE_PROTOTYPES() {
|
|
99
|
+
const protos = [
|
|
100
|
+
SandboxGlobal,
|
|
101
|
+
Function,
|
|
102
|
+
Boolean,
|
|
103
|
+
Number,
|
|
104
|
+
BigInt,
|
|
105
|
+
String,
|
|
106
|
+
Date,
|
|
107
|
+
Error,
|
|
108
|
+
Array,
|
|
109
|
+
Int8Array,
|
|
110
|
+
Uint8Array,
|
|
111
|
+
Uint8ClampedArray,
|
|
112
|
+
Int16Array,
|
|
113
|
+
Uint16Array,
|
|
114
|
+
Int32Array,
|
|
115
|
+
Uint32Array,
|
|
116
|
+
Float32Array,
|
|
117
|
+
Float64Array,
|
|
118
|
+
Map,
|
|
119
|
+
Set,
|
|
120
|
+
WeakMap,
|
|
121
|
+
WeakSet,
|
|
122
|
+
Promise,
|
|
123
|
+
Symbol,
|
|
124
|
+
Date,
|
|
125
|
+
RegExp,
|
|
126
|
+
];
|
|
127
|
+
const map = new Map();
|
|
128
|
+
protos.forEach((proto) => {
|
|
129
|
+
map.set(proto, new Set());
|
|
130
|
+
});
|
|
131
|
+
map.set(Object, new Set([
|
|
132
|
+
'entries',
|
|
133
|
+
'fromEntries',
|
|
134
|
+
'getOwnPropertyNames',
|
|
135
|
+
'is',
|
|
136
|
+
'keys',
|
|
137
|
+
'hasOwnProperty',
|
|
138
|
+
'isPrototypeOf',
|
|
139
|
+
'propertyIsEnumerable',
|
|
140
|
+
'toLocaleString',
|
|
141
|
+
'toString',
|
|
142
|
+
'valueOf',
|
|
143
|
+
'values',
|
|
144
|
+
]));
|
|
145
|
+
return map;
|
|
146
|
+
}
|
|
147
|
+
subscribeGet(callback, context) {
|
|
148
|
+
context.getSubscriptions.add(callback);
|
|
149
|
+
return { unsubscribe: () => context.getSubscriptions.delete(callback) };
|
|
150
|
+
}
|
|
151
|
+
subscribeSet(obj, name, callback, context) {
|
|
152
|
+
return subscribeSet(obj, name, callback, context);
|
|
153
|
+
}
|
|
154
|
+
subscribeSetGlobal(obj, name, callback) {
|
|
155
|
+
return subscribeSet(obj, name, callback, this);
|
|
156
|
+
}
|
|
157
|
+
getContext(fn) {
|
|
158
|
+
return this.sandboxFunctions.get(fn);
|
|
159
|
+
}
|
|
160
|
+
executeTree(context, scopes = []) {
|
|
161
|
+
return executeTree({
|
|
162
|
+
ticks: BigInt(0),
|
|
163
|
+
}, context, context.tree, scopes);
|
|
164
|
+
}
|
|
165
|
+
executeTreeAsync(context, scopes = []) {
|
|
166
|
+
return executeTreeAsync({
|
|
167
|
+
ticks: BigInt(0),
|
|
168
|
+
}, context, context.tree, scopes);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export { SandboxExec as default };
|
|
173
|
+
//# sourceMappingURL=SandboxExec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxExec.js","sources":["../src/SandboxExec.ts"],"sourcesContent":["import { IEvalContext } from './eval.js';\nimport { Change, ExecReturn, executeTree, executeTreeAsync } from './executor.js';\nimport {\n createContext,\n IContext,\n IExecContext,\n IGlobals,\n IOptionParams,\n IOptions,\n IScope,\n replacementCallback,\n SandboxGlobal,\n SubscriptionSubject,\n} from './utils.js';\n\nfunction subscribeSet(\n obj: unknown,\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 if (!(obj instanceof Object))\n throw new Error(\n 'Invalid subscription object, got ' + (typeof obj === 'object' ? 'null' : typeof obj)\n );\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 default class SandboxExec {\n context: IContext;\n setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>> =\n new WeakMap();\n changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>> =\n new WeakMap();\n sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext> = new WeakMap();\n constructor(options?: IOptionParams, public evalContext?: IEvalContext) {\n const opt: IOptions = Object.assign(\n {\n audit: false,\n forbidFunctionCalls: false,\n forbidFunctionCreation: false,\n globals: SandboxExec.SAFE_GLOBALS,\n prototypeWhitelist: SandboxExec.SAFE_PROTOTYPES,\n prototypeReplacements: new Map<new () => any, replacementCallback>(),\n },\n options || {}\n );\n this.context = createContext(this, opt);\n }\n\n static get SAFE_GLOBALS(): IGlobals {\n return {\n Function,\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_PROTOTYPES(): Map<any, Set<string>> {\n const protos = [\n SandboxGlobal,\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 ];\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 '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 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(\n {\n ticks: BigInt(0),\n },\n context,\n context.tree,\n scopes\n );\n }\n\n executeTreeAsync<T>(context: IExecContext, scopes: IScope[] = []): Promise<ExecReturn<T>> {\n return executeTreeAsync(\n {\n ticks: BigInt(0),\n },\n context,\n context.tree,\n scopes\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const t=function(t){if(t===globalThis)return globalThis;for(const e in t)this[e]=t[e]};class e{constructor(t){this.ref={str:""},t instanceof e?(this.ref=t.ref,this.start=t.start,this.end=t.end):(this.ref.str=t,this.start=0,this.end=t.length)}substring(t,o){if(!this.length)return this;(t=this.start+t)<0&&(t=0),t>this.end&&(t=this.end),(o=void 0===o?this.end:this.start+o)<0&&(o=0),o>this.end&&(o=this.end);const n=new e(this);return n.start=t,n.end=o,n}get length(){const t=this.end-this.start;return t<0?0:t}char(t){if(this.start!==this.end)return this.ref.str[this.start+t]}toString(){return this.ref.str.substring(this.start,this.end)}trimStart(){const t=/^\s+/.exec(this.toString()),o=new e(this);return t&&(o.start+=t[0].length),o}slice(t,e){return t<0&&(t=this.end-this.start+t),t<0&&(t=0),void 0===e&&(e=this.end-this.start),e<0&&(e=this.end-this.start+e),e<0&&(e=0),this.substring(t,e)}trim(){const t=this.trimStart(),e=/\s+$/.exec(t.toString());return e&&(t.end-=e[0].length),t}valueOf(){return this.toString()}}function o(t){const e=Object.assign({},t);for(const t in e)e[t]=!0;return e}const n=new Set(["instanceof","typeof","return","throw","try","catch","if","finally","else","in","of","var","let","const","for","delete","false","true","while","do","break","continue","new","function","async","await","switch","case"]);class r{constructor(t,e={},n){this.const={},this.let={},this.var={};const r=void 0!==n||null===t;this.parent=t,this.allVars=e,this.let=r?this.let:o(e),this.var=r?o(e):this.var,this.globals=null===t?o(e):{},this.functionThis=n}get(t,e=!1){const o=this.functionThis;if("this"===t&&void 0!==o)return new c({this:o},t,!0,!1,!0);if(n.has(t))throw new SyntaxError("Unexepected token '"+t+"'");if(null===this.parent||!e||void 0!==o){if(this.globals.hasOwnProperty(t))return new c(o,t,!1,!0,!0);if(t in this.allVars&&(!(t in{})||this.allVars.hasOwnProperty(t)))return new c(this.allVars,t,this.const.hasOwnProperty(t),this.globals.hasOwnProperty(t),!0);if(null===this.parent)return new c(void 0,t)}return this.parent.get(t,e)}set(t,e){if("this"===t)throw new SyntaxError('"this" cannot be assigned');if(n.has(t))throw new SyntaxError("Unexepected token '"+t+"'");const o=this.get(t);if(void 0===o.context)throw new ReferenceError(`Variable '${t}' was not declared.`);if(o.isConst)throw new TypeError(`Cannot assign to const variable '${t}'`);if(o.isGlobal)throw new s(`Cannot override global variable '${t}'`);if(!(o.context instanceof Object))throw new s("Scope is not an object");return o.context[o.prop]=e,o}declare(t,e,o=undefined,r=!1){if("this"===t)throw new SyntaxError('"this" cannot be declared');if(n.has(t))throw new SyntaxError("Unexepected token '"+t+"'");if("var"===e&&void 0===this.functionThis&&null!==this.parent)return this.parent.declare(t,e,o,r);if((!this[e].hasOwnProperty(t)||"const"===e||this.globals.hasOwnProperty(t))&&t in this.allVars)throw new s(`Identifier '${t}' has already been declared`);return r&&(this.globals[t]=!0),this[e][t]=!0,this.allVars[t]=o,new c(this.allVars,t,this.const.hasOwnProperty(t),r)}}class i{}class s extends Error{}function a(t){return Array.isArray(t)&&"number"==typeof t[0]&&0!==t[0]&&88!==t[0]}class c{constructor(t,e,o=!1,n=!1,r=!1){this.context=t,this.prop=e,this.isConst=o,this.isGlobal=n,this.isVariable=r}get(t){const e=this.context;if(void 0===e)throw new ReferenceError(`${this.prop} is not defined`);if(null===e)throw new TypeError(`Cannot read properties of null, (reading '${this.prop}')`);return t.getSubscriptions.forEach((t=>t(e,this.prop))),e[this.prop]}}class l{constructor(t,e,o,n=!1,r=!1){this.auditReport=t,this.result=e,this.returned=o,this.breakLoop=n,this.continueLoop=r}}const p={};function d(t,e){const o={};return t.forEach(((t,n)=>{t.startsWith("...")?o[t.substring(3)]=e.slice(n):o[t]=e[n]})),o}const u=new WeakSet;function f(t,e,o,n,i,a){if(n.ctx.options.forbidFunctionCreation)throw new s("Function creation is forbidden");let c;return c=void 0===a?(...s)=>{const a=d(t,s);return $(o,n,e,void 0===i?[]:[new r(i,a)]).result}:function(...s){const a=d(t,s);return $(o,n,e,void 0===i?[]:[new r(i,a,this)]).result},n.registerSandboxFunction(c),u.add(c),c}function h(t,e,o,n,i,a){if(n.ctx.options.forbidFunctionCreation)throw new s("Function creation is forbidden");if(!n.ctx.prototypeWhitelist?.has(Promise.prototype))throw new s("Async/await not permitted");let c;return c=void 0===a?async(...s)=>{const a=d(t,s);return(await U(o,n,e,void 0===i?[]:[new r(i,a)])).result}:async function(...s){const a=d(t,s);return(await U(o,n,e,void 0===i?[]:[new r(i,a,this)])).result},n.registerSandboxFunction(c),u.add(c),c}function v(t,e,o="assign"){if(void 0===t.context)throw new ReferenceError(`Cannot ${o} value to undefined.`);if("object"!=typeof t.context&&"function"!=typeof t.context)throw new SyntaxError(`Cannot ${o} value to a primitive.`);if(t.isConst)throw new TypeError(`Cannot set value to const variable '${t.prop}'`);if(t.isGlobal)throw new s(`Cannot ${o} property '${t.prop}' of a global object`);if(null===t.context)throw new TypeError("Cannot set properties of null");if("function"==typeof t.context[t.prop]&&!t.context.hasOwnProperty(t.prop))throw new s(`Override prototype property '${t.prop}' not allowed`);"delete"===o?t.context.hasOwnProperty(t.prop)&&(e.changeSubscriptions.get(t.context)?.forEach((e=>e({type:"delete",prop:t.prop}))),e.changeSubscriptionsGlobal.get(t.context)?.forEach((e=>e({type:"delete",prop:t.prop})))):t.context.hasOwnProperty(t.prop)?(e.setSubscriptions.get(t.context)?.get(t.prop)?.forEach((t=>t({type:"replace"}))),e.setSubscriptionsGlobal.get(t.context)?.get(t.prop)?.forEach((t=>t({type:"replace"})))):(e.changeSubscriptions.get(t.context)?.forEach((e=>e({type:"create",prop:t.prop}))),e.changeSubscriptionsGlobal.get(t.context)?.forEach((e=>e({type:"create",prop:t.prop}))))}const w=new Set([[].push,[].pop,[].shift,[].unshift,[].splice,[].reverse,[].sort,[].copyWithin]);class y{constructor(t,e){this.key=t,this.val=e}}class g{constructor(t){this.item=t}}class b{constructor(t){this.item=t}}class x{constructor(t,e){this.t=t,this.f=e}}const S=/(\$\$)*(\$)?\${(\d+)}/g,m=new Map;function E(t,e){m.set(t,e)}function I(t,e){return t instanceof c?t.get(e):t!==p?t:void 0}function A(t,e,o,n,r,i,s){e===C?function(t,e,o,n,r,i){const s=[];for(let c=0;c<e.length;c++){let p;try{p=R((o=>C(t,e[c],n,r,o,i))).result}catch(t){return void o(t)}if(p instanceof l&&(p.returned||p.breakLoop||p.continueLoop))return void o(void 0,p);if(a(e[c])&&8===e[c][0])return void o(void 0,new l(r.ctx.auditReport,p,!0));s.push(p)}o(void 0,s)}(t,o,n,r,i,s):async function(t,e,o,n,r,i){const s=[];for(let c=0;c<e.length;c++){let p;try{let o;p=!0===(o=O((o=>k(t,e[c],n,r,o,i)))).isInstant?o.instant:(await o.p).result}catch(t){return void o(t)}if(p instanceof l&&(p.returned||p.breakLoop||p.continueLoop))return void o(void 0,p);if(a(e[c])&&8===e[c][0])return void o(void 0,new l(r.ctx.auditReport,p,!0));s.push(p)}o(void 0,s)}(t,o,n,r,i,s).catch(n)}function O(t){let e,o=!1;const n=new Promise(((n,r)=>{t(((t,i)=>{t?r(t):(o=!0,e=i,n({result:i}))}))}));return{isInstant:o,instant:e,p:n}}function R(t){let e,o;if(t(((t,n)=>{o=t,e=n})),o)throw o;return{result:e}}async function k(t,e,o,n,r,i){let s=r;const l=new Promise((t=>{s=(e,o)=>{r(e,o),t()}}));if(!F(t,e,o,n,s,!0,i)&&a(e)){let r,a=e[0];try{let s;r=!0===(s=O((r=>k(t,e[1],o,n,r,i)))).isInstant?s.instant:(await s.p).result}catch(t){return void s(t)}let l,d=r;try{d=r instanceof c?r.get(n):r}catch(t){return void s(t)}if(20===a||21===a){if(null==d)return void s(void 0,p);a=20===a?1:5}if(d===p){if(1===a||5===a)return void s(void 0,d);d=void 0}try{let r;l=!0===(r=O((r=>k(t,e[2],o,n,r,i)))).isInstant?r.instant:(await r.p).result}catch(t){return void s(t)}let u=l;try{u=l instanceof c?l.get(n):l}catch(t){return void s(t)}if(u===p&&(u=void 0),m.has(a))try{m.get(a)?.(k,s,t,d,u,r,n,o,l,i)}catch(t){s(t)}else s(new SyntaxError("Unknown operator: "+a))}await l}function C(t,e,o,n,r,i){if(!F(t,e,o,n,r,!1,i)&&a(e)){let s,a=e[0];try{s=R((r=>C(t,e[1],o,n,r,i))).result}catch(t){return void r(t)}let l,d=s;try{d=s instanceof c?s.get(n):s}catch(t){return void r(t)}if(20===a||21===a){if(null==d)return void r(void 0,p);a=20===a?1:5}if(d===p){if(1===a||5===a)return void r(void 0,d);d=void 0}try{l=R((r=>C(t,e[2],o,n,r,i))).result}catch(t){return void r(t)}let u=l;try{u=l instanceof c?l.get(n):l}catch(t){return void r(t)}if(u===p&&(u=void 0),m.has(a))try{m.get(a)?.(C,r,t,d,u,s,n,o,l,i)}catch(t){r(t)}else r(new SyntaxError("Unknown operator: "+a))}}E(1,((t,e,o,n,r,i,a,l)=>{if(null===n)throw new TypeError(`Cannot get property ${r} of null`);const p=typeof n;if("undefined"===p&&void 0===i){const t=l.get(r);if(t.context===a.ctx.sandboxGlobal){a.ctx.options.audit&&a.ctx.auditReport?.globalsAccess.add(r);const t=a.ctx.globalsWhitelist.has(a.ctx.sandboxGlobal[r])?a.evals.get(a.ctx.sandboxGlobal[r]):void 0;if(t)return void e(void 0,t)}return t.context&&t.context[r]===globalThis?void e(void 0,a.ctx.globalScope.get("this")):void e(void 0,t)}if(void 0===n)throw new s("Cannot get property '"+r+"' of undefined");if("object"!==p)"number"===p?n=new Number(n):"string"===p?n=new String(n):"boolean"===p&&(n=new Boolean(n));else if(void 0===n.hasOwnProperty)return void e(void 0,new c(void 0,r));const d="function"===p,f=d||!(n.hasOwnProperty(r)||"number"==typeof r);if(a.ctx.options.audit&&f&&"string"==typeof r){let t=Object.getPrototypeOf(n);do{t.hasOwnProperty(r)&&(a.ctx.auditReport&&!a.ctx.auditReport.prototypeAccess[t.constructor.name]&&(a.ctx.auditReport.prototypeAccess[t.constructor.name]=new Set),a.ctx.auditReport?.prototypeAccess[t.constructor.name].add(r))}while(t=Object.getPrototypeOf(t))}if(f)if(d){if(!["name","length","constructor"].includes(r)&&(n.hasOwnProperty(r)||"__proto__"===r)){const t=a.ctx.prototypeWhitelist.get(n.prototype),o=a.ctx.options.prototypeReplacements.get(n);if(o)return void e(void 0,new c(o(n,!0),r));if(!t||t.size&&!t.has(r))throw new s(`Static method or property access not permitted: ${n.name}.${r}`)}}else if("constructor"!==r){let t=n;for(;t=Object.getPrototypeOf(t);)if(t.hasOwnProperty(r)){const o=a.ctx.prototypeWhitelist.get(t),i=a.ctx.options.prototypeReplacements.get(t.constuctor);if(i)return void e(void 0,new c(i(n,!1),r));if(o&&(!o.size||o.has(r)))break;throw new s(`Method or property access not permitted: ${t.constructor.name}.${r}`)}}if(a.evals.has(n[r]))return void e(void 0,a.evals.get(n[r]));if(n[r]===globalThis)return void e(void 0,a.ctx.globalScope.get("this"));const h=i.isGlobal||d&&!u.has(n)||a.ctx.globalsWhitelist.has(n);e(void 0,new c(n,r,!1,h))})),E(5,((t,e,o,n,r,i,a)=>{if(a.ctx.options.forbidFunctionCalls)throw new s("Function invocations are not allowed");if("function"!=typeof n)throw new TypeError(`${"symbol"==typeof i.prop?"Symbol":i.prop} is not a function`);const c=r.map((t=>t instanceof b?[...t.item]:[t])).flat().map((t=>I(t,a)));if("function"!=typeof i){if(i.context[i.prop]===JSON.stringify&&a.getSubscriptions.size){const t=new Set,e=o=>{if(o&&"object"==typeof o&&!t.has(o)){t.add(o);for(const t of Object.keys(o))a.getSubscriptions.forEach((e=>e(o,t))),e(o[t])}};e(c[0])}if(i.context instanceof Array&&w.has(i.context[i.prop])&&(a.changeSubscriptions.get(i.context)||a.changeSubscriptionsGlobal.get(i.context))){let t,e=!1;if("push"===i.prop)t={type:"push",added:c},e=!!c.length;else if("pop"===i.prop)t={type:"pop",removed:i.context.slice(-1)},e=!!t.removed.length;else if("shift"===i.prop)t={type:"shift",removed:i.context.slice(0,1)},e=!!t.removed.length;else if("unshift"===i.prop)t={type:"unshift",added:c},e=!!c.length;else if("splice"===i.prop)t={type:"splice",startIndex:c[0],deleteCount:void 0===c[1]?i.context.length:c[1],added:c.slice(2),removed:i.context.slice(c[0],void 0===c[1]?void 0:c[0]+c[1])},e=!!t.added.length||!!t.removed.length;else if("reverse"===i.prop||"sort"===i.prop)t={type:i.prop},e=!!i.context.length;else if("copyWithin"===i.prop){const o=void 0===c[2]?i.context.length-c[1]:Math.min(i.context.length,c[2]-c[1]);t={type:"copyWithin",startIndex:c[0],endIndex:c[0]+o,added:i.context.slice(c[1],c[1]+o),removed:i.context.slice(c[0],c[0]+o)},e=!!t.added.length||!!t.removed.length}e&&(a.changeSubscriptions.get(i.context)?.forEach((e=>e(t))),a.changeSubscriptionsGlobal.get(i.context)?.forEach((e=>e(t))))}i.get(a),e(void 0,i.context[i.prop](...c))}else e(void 0,i(...c))})),E(22,((t,e,o,n,r)=>{let i={};for(const t of r)t.key instanceof g?i={...i,...t.key.item}:i[t.key]=t.val;e(void 0,i)})),E(6,((t,e,o,n,r)=>e(void 0,new y(n,r)))),E(12,((t,e,o,n,r,i,s)=>{e(void 0,r.map((t=>t instanceof b?[...t.item]:[t])).flat().map((t=>I(t,s))))})),E(23,((t,e,o,n,r)=>e(void 0,r))),E(35,((t,e,o,n,r)=>{switch(r){case"true":return e(void 0,!0);case"false":return e(void 0,!1);case"null":return e(void 0,null);case"undefined":return e(void 0,void 0);case"NaN":return e(void 0,NaN);case"Infinity":return e(void 0,1/0)}e(new Error("Unknown symbol: "+r))})),E(7,((t,e,o,n,r)=>e(void 0,Number(r)))),E(83,((t,e,o,n,r)=>e(void 0,BigInt(r)))),E(2,((t,e,o,n,r,i,s)=>e(void 0,s.constants.strings[parseInt(r)]))),E(85,((t,e,o,n,r,i,a)=>{const c=a.constants.regexes[parseInt(r)];if(!a.ctx.globalsWhitelist.has(RegExp))throw new s("Regex not permitted");e(void 0,new RegExp(c.regex,c.flags))})),E(84,((t,e,o,n,r,i,s,a)=>{const c=s.constants.literals[parseInt(r)],[,l,p]=c,d=[];let u;const f=[];for(;u=S.exec(l);)u[2]||(d.push(p[parseInt(u[3],10)]),f.push(u[3]));t(o,d,a,s,((t,o)=>{const n={};if(t)e(t);else{for(const t of Object.keys(o)){const e=f[t];n[e]=o[t]}e(void 0,l.replace(/(\\\\)*(\\)?\${(\d+)}/g,((t,e,o,r)=>{if(o)return t;return(e||"")+`${I(n[r],s)}`})))}}))})),E(18,((t,e,o,n,r)=>{e(void 0,new b(r))})),E(17,((t,e,o,n,r)=>{e(void 0,new g(r))})),E(24,((t,e,o,n,r)=>e(void 0,!r))),E(64,((t,e,o,n,r)=>e(void 0,~r))),E(25,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,++i.context[i.prop])})),E(26,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]++)})),E(27,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,--i.context[i.prop])})),E(28,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]--)})),E(9,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]=r)})),E(66,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]+=r)})),E(65,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]-=r)})),E(67,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]/=r)})),E(69,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]*=r)})),E(68,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]**=r)})),E(70,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]%=r)})),E(71,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]^=r)})),E(72,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]&=r)})),E(73,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]|=r)})),E(76,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]<<=r)})),E(75,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]>>=r)})),E(74,((t,e,o,n,r,i,s)=>{v(i,s),e(void 0,i.context[i.prop]>>=r)})),E(57,((t,e,o,n,r)=>e(void 0,n>r))),E(56,((t,e,o,n,r)=>e(void 0,n<r))),E(55,((t,e,o,n,r)=>e(void 0,n>=r))),E(54,((t,e,o,n,r)=>e(void 0,n<=r))),E(52,((t,e,o,n,r)=>e(void 0,n==r))),E(32,((t,e,o,n,r)=>e(void 0,n===r))),E(53,((t,e,o,n,r)=>e(void 0,n!=r))),E(31,((t,e,o,n,r)=>e(void 0,n!==r))),E(29,((t,e,o,n,r)=>e(void 0,n&&r))),E(30,((t,e,o,n,r)=>e(void 0,n||r))),E(77,((t,e,o,n,r)=>e(void 0,n&r))),E(78,((t,e,o,n,r)=>e(void 0,n|r))),E(33,((t,e,o,n,r)=>e(void 0,n+r))),E(47,((t,e,o,n,r)=>e(void 0,n-r))),E(59,((t,e,o,n,r)=>e(void 0,+r))),E(58,((t,e,o,n,r)=>e(void 0,-r))),E(48,((t,e,o,n,r)=>e(void 0,n/r))),E(79,((t,e,o,n,r)=>e(void 0,n^r))),E(50,((t,e,o,n,r)=>e(void 0,n*r))),E(51,((t,e,o,n,r)=>e(void 0,n%r))),E(80,((t,e,o,n,r)=>e(void 0,n<<r))),E(81,((t,e,o,n,r)=>e(void 0,n>>r))),E(82,((t,e,o,n,r)=>e(void 0,n>>>r))),E(60,((t,e,o,n,r,i,s,a)=>{t(o,r,a,s,((t,o)=>{e(void 0,typeof I(o,s))}))})),E(62,((t,e,o,n,r)=>e(void 0,n instanceof r))),E(63,((t,e,o,n,r)=>e(void 0,n in r))),E(61,((t,e,o,n,r,i,s,a,c)=>{void 0!==c.context?(v(c,s,"delete"),c.isVariable?e(void 0,!1):e(void 0,delete c.context?.[c.prop])):e(void 0,!0)})),E(8,((t,e,o,n,r)=>e(void 0,r))),E(34,((t,e,o,n,r,i,s,a)=>{e(void 0,a.declare(n,"var",r))})),E(3,((t,e,o,n,r,i,s,a,c)=>{e(void 0,a.declare(n,"let",r,c&&c.isGlobal))})),E(4,((t,e,o,n,r,i,s,a)=>{e(void 0,a.declare(n,"const",r))})),E(11,((t,o,n,r,i,a,c,l)=>{if(r=[...r],"string"==typeof a[2]||a[2]instanceof e){if(!c.allowJit||!c.evalContext)throw new s("Unevaluated code detected, JIT not allowed");a[2]=i=c.evalContext.lispifyFunction(new e(a[2]),c.constants)}r.shift()?o(void 0,h(r,i,n,c,l)):o(void 0,f(r,i,n,c,l))})),E(37,((t,o,n,r,i,a,c,l)=>{if("string"==typeof a[2]||a[2]instanceof e){if(!c.allowJit||!c.evalContext)throw new s("Unevaluated code detected, JIT not allowed");a[2]=i=c.evalContext.lispifyFunction(new e(a[2]),c.constants)}const p=r.shift(),d=r.shift();let u;u=88===p?h(r,i,n,c,l,d):f(r,i,n,c,l,d),d&&l.declare(d,"var",u),o(void 0,u)})),E(10,((t,o,n,i,a,c,l,p)=>{if("string"==typeof c[2]||c[2]instanceof e){if(!l.allowJit||!l.evalContext)throw new s("Unevaluated code detected, JIT not allowed");c[2]=a=l.evalContext.lispifyFunction(new e(c[2]),l.constants)}const d=i.shift(),u=i.shift();let v;u&&(p=new r(p,{})),v=88===d?h(i,a,n,l,p,u):f(i,a,n,l,p,u),u&&p.declare(u,"let",v),o(void 0,v)})),E(38,((t,e,o,n,i,s,a,c)=>{const[p,d,u,f,h,v,w]=n;let y=!0;const g=new r(c,{}),b={$$obj:void 0},x=new r(g,b);if(t===k)(async()=>{let n;for(n=O((e=>t(o,f,g,a,e))),b.$$obj=!0===(n=O((e=>t(o,u,g,a,e)))).isInstant?n.instant:(await n.p).result,n=O((e=>t(o,d,x,a,e))),p&&(y=!0===(n=O((e=>t(o,v,x,a,e)))).isInstant?n.instant:(await n.p).result);y;){const s={};n=O((e=>t(o,w,new r(x,s),a,e))),!0===n.isInstant?n.instant:(await n.p).result;const c=await U(o,a,i,[new r(g,s)],"loop");if(c instanceof l&&c.returned)return void e(void 0,c);if(c instanceof l&&c.breakLoop)break;n=O((e=>t(o,h,x,a,e))),y=!0===(n=O((e=>t(o,v,x,a,e)))).isInstant?n.instant:(await n.p).result}e()})().catch(e);else{for(R((e=>t(o,f,g,a,e))),b.$$obj=R((e=>t(o,u,g,a,e))).result,R((e=>t(o,d,x,a,e))),p&&(y=R((e=>t(o,v,x,a,e))).result);y;){const n={};R((e=>t(o,w,new r(x,n),a,e)));const s=$(o,a,i,[new r(g,n)],"loop");if(s instanceof l&&s.returned)return void e(void 0,s);if(s instanceof l&&s.breakLoop)break;R((e=>t(o,h,x,a,e))),y=R((e=>t(o,v,x,a,e))).result}e()}})),E(86,((t,e,o,n,r,i,a,c,p,d)=>{if("switch"===d&&"continue"===n||!d)throw new s("Illegal "+n+" statement");e(void 0,new l(a.ctx.auditReport,void 0,!1,"break"===n,"continue"===n))})),E(13,((t,e,o,n,r,i,s,a)=>{t(o,I(n,s)?r.t:r.f,a,s,e)})),E(15,((t,e,o,n,r,i,s,a)=>{t(o,I(n,s)?r.t:r.f,a,s,e)})),E(16,((t,e,o,n,r)=>e(void 0,new x(n,r)))),E(14,((t,e,o,n,r)=>e(void 0,new x(n,r)))),E(40,((t,e,o,n,r,i,s,a)=>{t(o,n,a,s,((n,i)=>{if(n)e(n);else if(i=I(i,s),t===C){let n,c=!1;for(const l of r)if(c||(c=!l[1]||i===I(R((e=>t(o,l[1],a,s,e))).result,s))){if(!l[2])continue;if(n=$(o,s,l[2],[a],"switch"),n.breakLoop)break;if(n.returned)return void e(void 0,n);if(!l[1])break}e()}else(async()=>{let n,c=!1;for(const l of r){let r;if(c||(c=!l[1]||i===I(!0===(r=O((e=>t(o,l[1],a,s,e)))).isInstant?r.instant:(await r.p).result,s))){if(!l[2])continue;if(n=await U(o,s,l[2],[a],"switch"),n.breakLoop)break;if(n.returned)return void e(void 0,n);if(!l[1])break}}e()})().catch(e)}))})),E(39,((t,e,o,n,i,s,a,c,l,p)=>{const[d,u,f]=i;j(t,((n,i)=>{j(t,(s=>{s?e(s):n?j(t,e,o,a,u,[new r(c)],p):e(void 0,i)}),o,a,f,[new r(c,{})])}),o,a,n,[new r(c)],p)})),E(87,((t,e)=>{e()})),E(45,((t,e,o,n,r,i,a)=>{if(!a.ctx.globalsWhitelist.has(n)&&!u.has(n))throw new s(`Object construction not allowed: ${n.constructor.name}`);e(void 0,new n(...r))})),E(46,((t,e,o,n,r)=>{e(r)})),E(43,((t,e,o,n)=>e(void 0,n.pop()))),E(0,((t,e)=>e()));const P=new Set([11,37,10,38,39,40,14,16,60]);function F(t,e,o,n,r,i,l){const d=i?k:C;if(n.ctx.options.executionQuota&&n.ctx.options.executionQuota<=t.ticks&&("function"!=typeof n.ctx.options.onExecutionQuotaReached||!n.ctx.options.onExecutionQuotaReached(t,o,n,e)))return r(new s("Execution quota exceeded")),!0;if(t.ticks++,e instanceof c)try{r(void 0,e.get(n))}catch(t){r(t)}else if(e===p)r();else if(Array.isArray(e)&&!a(e))0===e[0]?r():A(t,d,e,r,o,n,l);else if(a(e))if(42===e[0])A(t,d,e[1],r,o,n,l);else if(44===e[0])i?n.ctx.prototypeWhitelist?.has(Promise.prototype)?k(t,e[1],o,n,(async(t,e)=>{if(t)r(t);else try{r(void 0,await I(e,n))}catch(t){r(t)}}),l).catch(r):r(new s("Async/await is not permitted")):r(new s("Illegal use of 'await', must be inside async function"));else{if(!P.has(e[0]))return!1;try{m.get(e[0])?.(d,r,t,e[1],e[2],e,n,o,void 0,l)}catch(t){r(t)}}else r(void 0,e);return!0}function $(t,e,o,n=[],r){return R((i=>j(C,i,t,e,o,n,r))).result}async function U(t,e,o,n=[],r){let i;return!0===(i=O((i=>j(k,i,t,e,o,n,r)))).isInstant?i.instant:(await i.p).result}function j(t,e,o,n,s,c=[],p){if(!s)return void e();if(!(s instanceof Array))throw new SyntaxError("Bad execution tree");let d,u=n.ctx.globalScope;for(;d=c.shift();)"object"==typeof d&&(u=d instanceof r?d:new r(u,d,d instanceof i?void 0:null));n.ctx.options.audit&&!n.ctx.auditReport&&(n.ctx.auditReport={globalsAccess:new Set,prototypeAccess:{}}),t===C?function(t,e,o,n,r,i){if(!(n instanceof Array))throw new SyntaxError("Bad execution tree");let s=0;for(s=0;s<n.length;s++){let c,p;const d=n[s];try{C(e,d,r,o,((t,e)=>{p=t,c=e}),i)}catch(t){p=t}if(p)return void t(p);if(c instanceof l)return void t(void 0,c);if(a(d)&&8===d[0])return void t(void 0,new l(o.ctx.auditReport,c,!0))}t(void 0,new l(o.ctx.auditReport,void 0,!1))}(e,o,n,s,u,p):async function(t,e,o,n,r,i){if(!(n instanceof Array))throw new SyntaxError("Bad execution tree");let s=0;for(s=0;s<n.length;s++){let c,p;const d=n[s];try{await k(e,d,r,o,((t,e)=>{p=t,c=e}),i)}catch(t){p=t}if(p)return void t(p);if(c instanceof l)return void t(void 0,c);if(a(d)&&8===d[0])return void t(void 0,new l(o.ctx.auditReport,c,!0))}t(void 0,new l(o.ctx.auditReport,void 0,!1))}(e,o,n,s,u,p).catch(e)}function W(t,e,o,n){if(!(t instanceof Object))throw new Error("Invalid subscription object, got "+("object"==typeof t?"null":typeof t));const r=n.setSubscriptions.get(t)||new Map;n.setSubscriptions.set(t,r);const i=r.get(e)||new Set;let s;r.set(e,i),i.add(o);const a=t[e];return a instanceof Object&&(s=n.changeSubscriptions.get(a)||new Set,s.add(o),n.changeSubscriptions.set(a,s)),{unsubscribe:()=>{i.delete(o),s?.delete(o)}}}BigInt(0);class T{constructor(e,o){this.evalContext=o,this.setSubscriptions=new WeakMap,this.changeSubscriptions=new WeakMap,this.sandboxFunctions=new WeakMap;const n=Object.assign({audit:!1,forbidFunctionCalls:!1,forbidFunctionCreation:!1,globals:T.SAFE_GLOBALS,prototypeWhitelist:T.SAFE_PROTOTYPES,prototypeReplacements:new Map},e||{});this.context=function(e,o){const n=new t(o.globals),i={sandbox:e,globalsWhitelist:new Set(Object.values(o.globals)),prototypeWhitelist:new Map([...o.prototypeWhitelist].map((t=>[t[0].prototype,t[1]]))),options:o,globalScope:new r(null,o.globals,n),sandboxGlobal:n};return i.prototypeWhitelist.set(Object.getPrototypeOf([][Symbol.iterator]()),new Set),i}(this,n)}static get SAFE_GLOBALS(){return{Function:Function,console:{debug:console.debug,error:console.error,info:console.info,log:console.log,table:console.table,warn:console.warn},isFinite:isFinite,isNaN:isNaN,parseFloat:parseFloat,parseInt:parseInt,decodeURI:decodeURI,decodeURIComponent:decodeURIComponent,encodeURI:encodeURI,encodeURIComponent:encodeURIComponent,escape:escape,unescape:unescape,Boolean:Boolean,Number:Number,BigInt:BigInt,String:String,Object:Object,Array:Array,Symbol:Symbol,Error:Error,EvalError:EvalError,RangeError:RangeError,ReferenceError:ReferenceError,SyntaxError:SyntaxError,TypeError:TypeError,URIError:URIError,Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,Map:Map,Set:Set,WeakMap:WeakMap,WeakSet:WeakSet,Promise:Promise,Intl:Intl,JSON:JSON,Math:Math,Date:Date,RegExp:RegExp}}static get SAFE_PROTOTYPES(){const e=[t,Function,Boolean,Number,BigInt,String,Date,Error,Array,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,Map,Set,WeakMap,WeakSet,Promise,Symbol,Date,RegExp],o=new Map;return e.forEach((t=>{o.set(t,new Set)})),o.set(Object,new Set(["entries","fromEntries","getOwnPropertyNames","is","keys","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf","values"])),o}subscribeGet(t,e){return e.getSubscriptions.add(t),{unsubscribe:()=>e.getSubscriptions.delete(t)}}subscribeSet(t,e,o,n){return W(t,e,o,n)}subscribeSetGlobal(t,e,o){return W(t,e,o,this)}getContext(t){return this.sandboxFunctions.get(t)}executeTree(t,e=[]){return $({ticks:BigInt(0)},t,t.tree,e)}executeTreeAsync(t,e=[]){return U({ticks:BigInt(0)},t,t.tree,e)}}export{T as default};
|
|
2
|
+
//# sourceMappingURL=SandboxExec.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxExec.min.js","sources":["../src/utils.ts","../src/executor.ts","../src/SandboxExec.ts"],"sourcesContent":["import { IEvalContext } from './eval';\nimport { Change, Unknown } from './executor';\nimport { IConstants, IExecutionTree, Lisp, LispItem } from './parser';\nimport SandboxExec from './SandboxExec';\n\nexport type replacementCallback = (obj: any, isStaticAccess: boolean) => any;\n\nexport interface IOptionParams {\n audit?: boolean;\n forbidFunctionCalls?: boolean;\n forbidFunctionCreation?: boolean;\n prototypeReplacements?: Map<new () => any, replacementCallback>;\n prototypeWhitelist?: Map<any, Set<string>>;\n globals: IGlobals;\n executionQuota?: bigint;\n onExecutionQuotaReached?: (\n ticks: Ticks,\n scope: Scope,\n context: IExecutionTree,\n tree: LispItem\n ) => boolean | void;\n}\n\nexport interface IOptions {\n audit: boolean;\n forbidFunctionCalls: boolean;\n forbidFunctionCreation: boolean;\n prototypeReplacements: Map<new () => any, replacementCallback>;\n prototypeWhitelist: Map<any, Set<string>>;\n globals: IGlobals;\n executionQuota?: bigint;\n onExecutionQuotaReached?: (\n ticks: Ticks,\n scope: Scope,\n context: IExecutionTree,\n tree: LispItem\n ) => boolean | void;\n}\n\nexport interface IContext {\n sandbox: SandboxExec;\n globalScope: Scope;\n sandboxGlobal: ISandboxGlobal;\n globalsWhitelist: Set<any>;\n prototypeWhitelist: Map<any, Set<string>>;\n options: IOptions;\n auditReport?: IAuditReport;\n}\n\nexport interface IAuditReport {\n globalsAccess: Set<unknown>;\n prototypeAccess: { [name: string]: Set<string> };\n}\n\nexport interface Ticks {\n ticks: bigint;\n}\n\nexport type SubscriptionSubject = object;\n\nexport interface IExecContext extends IExecutionTree {\n ctx: IContext;\n getSubscriptions: Set<(obj: SubscriptionSubject, name: string) => void>;\n setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>;\n changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;\n setSubscriptionsGlobal: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >;\n changeSubscriptionsGlobal: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;\n registerSandboxFunction: (fn: (...args: any[]) => any) => void;\n evals: Map<any, any>;\n allowJit: boolean;\n evalContext?: IEvalContext;\n}\n\nexport interface ISandboxGlobal {\n [key: string]: unknown;\n}\ninterface SandboxGlobalConstructor {\n new (globals: IGlobals): ISandboxGlobal;\n}\n\nexport const SandboxGlobal = function SandboxGlobal(this: ISandboxGlobal, globals: IGlobals) {\n if (globals === (globalThis as any)) return globalThis;\n for (const i in globals) {\n this[i] = globals[i];\n }\n} as any as SandboxGlobalConstructor;\n\nexport type IGlobals = ISandboxGlobal;\n\nexport class ExecContext implements IExecContext {\n constructor(\n public ctx: IContext,\n public constants: IConstants,\n public tree: Lisp[],\n public getSubscriptions: Set<(obj: SubscriptionSubject, name: string) => void>,\n public setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >,\n public changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>,\n public setSubscriptionsGlobal: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >,\n public changeSubscriptionsGlobal: WeakMap<\n SubscriptionSubject,\n Set<(modification: Change) => void>\n >,\n public evals: Map<any, any>,\n public registerSandboxFunction: (fn: (...args: any[]) => any) => void,\n public allowJit: boolean,\n public evalContext?: IEvalContext\n ) {}\n}\n\nexport function createContext(sandbox: SandboxExec, options: IOptions): IContext {\n const sandboxGlobal = new SandboxGlobal(options.globals);\n const context = {\n sandbox: sandbox,\n globalsWhitelist: new Set(Object.values(options.globals)),\n prototypeWhitelist: new Map([...options.prototypeWhitelist].map((a) => [a[0].prototype, a[1]])),\n options,\n globalScope: new Scope(null, options.globals, sandboxGlobal),\n sandboxGlobal,\n };\n context.prototypeWhitelist.set(Object.getPrototypeOf([][Symbol.iterator]()) as Object, new Set());\n return context;\n}\n\nexport function createExecContext(\n sandbox: {\n setSubscriptions: WeakMap<\n SubscriptionSubject,\n Map<string, Set<(modification: Change) => void>>\n >;\n changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>;\n sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext>;\n context: IContext;\n },\n executionTree: IExecutionTree,\n evalContext?: IEvalContext\n): IExecContext {\n const evals = new Map();\n const execContext: IExecContext = new ExecContext(\n sandbox.context,\n executionTree.constants,\n executionTree.tree,\n new Set<(obj: SubscriptionSubject, name: string) => void>(),\n new WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>>(),\n new WeakMap<SubscriptionSubject, Set<(modification: Change) => void>>(),\n sandbox.setSubscriptions,\n sandbox.changeSubscriptions,\n evals,\n (fn) => sandbox.sandboxFunctions.set(fn, execContext),\n !!evalContext,\n evalContext\n );\n if (evalContext) {\n const func = evalContext.sandboxFunction(execContext);\n evals.set(Function, func);\n evals.set(eval, evalContext.sandboxedEval(func));\n evals.set(setTimeout, evalContext.sandboxedSetTimeout(func));\n evals.set(setInterval, evalContext.sandboxedSetInterval(func));\n }\n return execContext;\n}\n\nexport class CodeString {\n start: number;\n end: number;\n ref: { str: string };\n constructor(str: string | CodeString) {\n this.ref = { str: '' };\n if (str instanceof CodeString) {\n this.ref = str.ref;\n this.start = str.start;\n this.end = str.end;\n } else {\n this.ref.str = str;\n this.start = 0;\n this.end = str.length;\n }\n }\n\n substring(start: number, end?: number): CodeString {\n if (!this.length) return this;\n start = this.start + start;\n if (start < 0) {\n start = 0;\n }\n if (start > this.end) {\n start = this.end;\n }\n end = end === undefined ? this.end : this.start + end;\n if (end < 0) {\n end = 0;\n }\n if (end > this.end) {\n end = this.end;\n }\n const code = new CodeString(this);\n code.start = start;\n code.end = end;\n return code;\n }\n\n get length() {\n const len = this.end - this.start;\n return len < 0 ? 0 : len;\n }\n\n char(i: number) {\n if (this.start === this.end) return undefined;\n return this.ref.str[this.start + i];\n }\n\n toString() {\n return this.ref.str.substring(this.start, this.end);\n }\n\n trimStart() {\n const found = /^\\s+/.exec(this.toString());\n const code = new CodeString(this);\n if (found) {\n code.start += found[0].length;\n }\n return code;\n }\n\n slice(start: number, end?: number) {\n if (start < 0) {\n start = this.end - this.start + start;\n }\n if (start < 0) {\n start = 0;\n }\n if (end === undefined) {\n end = this.end - this.start;\n }\n\n if (end < 0) {\n end = this.end - this.start + end;\n }\n if (end < 0) {\n end = 0;\n }\n return this.substring(start, end);\n }\n\n trim() {\n const code = this.trimStart();\n const found = /\\s+$/.exec(code.toString());\n if (found) {\n code.end -= found[0].length;\n }\n return code;\n }\n\n valueOf() {\n return this.toString();\n }\n}\n\nfunction keysOnly(obj: unknown): Record<string, true> {\n const ret: Record<string, true> = Object.assign({}, obj);\n for (const key in ret) {\n ret[key] = true;\n }\n return ret;\n}\n\nconst reservedWords = new Set([\n 'instanceof',\n 'typeof',\n 'return',\n 'throw',\n 'try',\n 'catch',\n 'if',\n 'finally',\n 'else',\n 'in',\n 'of',\n 'var',\n 'let',\n 'const',\n 'for',\n 'delete',\n 'false',\n 'true',\n 'while',\n 'do',\n 'break',\n 'continue',\n 'new',\n 'function',\n 'async',\n 'await',\n 'switch',\n 'case',\n]);\n\nexport const enum VarType {\n let = 'let',\n const = 'const',\n var = 'var',\n}\n\nexport class Scope {\n parent: Scope | null;\n const: { [key: string]: true } = {};\n let: { [key: string]: true } = {};\n var: { [key: string]: true } = {};\n globals: { [key: string]: true };\n allVars: { [key: string]: unknown } & Object;\n functionThis?: Unknown;\n constructor(parent: Scope | null, vars = {}, functionThis?: Unknown) {\n const isFuncScope = functionThis !== undefined || parent === null;\n this.parent = parent;\n this.allVars = vars;\n this.let = isFuncScope ? this.let : keysOnly(vars);\n this.var = isFuncScope ? keysOnly(vars) : this.var;\n this.globals = parent === null ? keysOnly(vars) : {};\n this.functionThis = functionThis;\n }\n\n get(key: string, functionScope = false): Prop {\n const functionThis = this.functionThis;\n if (key === 'this' && functionThis !== undefined) {\n return new Prop({ this: functionThis }, key, true, false, true);\n }\n if (reservedWords.has(key)) throw new SyntaxError(\"Unexepected token '\" + key + \"'\");\n if (this.parent === null || !functionScope || functionThis !== undefined) {\n if (this.globals.hasOwnProperty(key)) {\n return new Prop(functionThis, key, false, true, true);\n }\n if (key in this.allVars && (!(key in {}) || this.allVars.hasOwnProperty(key))) {\n return new Prop(\n this.allVars,\n key,\n this.const.hasOwnProperty(key),\n this.globals.hasOwnProperty(key),\n true\n );\n }\n if (this.parent === null) {\n return new Prop(undefined, key);\n }\n }\n return this.parent.get(key, functionScope);\n }\n\n set(key: string, val: unknown) {\n if (key === 'this') throw new SyntaxError('\"this\" cannot be assigned');\n if (reservedWords.has(key)) throw new SyntaxError(\"Unexepected token '\" + key + \"'\");\n const prop = this.get(key);\n if (prop.context === undefined) {\n throw new ReferenceError(`Variable '${key}' was not declared.`);\n }\n if (prop.isConst) {\n throw new TypeError(`Cannot assign to const variable '${key}'`);\n }\n if (prop.isGlobal) {\n throw new SandboxError(`Cannot override global variable '${key}'`);\n }\n if (!(prop.context instanceof Object)) throw new SandboxError('Scope is not an object');\n prop.context[prop.prop] = val;\n return prop;\n }\n\n declare(key: string, type: VarType, value: unknown = undefined, isGlobal = false): Prop {\n if (key === 'this') throw new SyntaxError('\"this\" cannot be declared');\n if (reservedWords.has(key)) throw new SyntaxError(\"Unexepected token '\" + key + \"'\");\n if (type === 'var' && this.functionThis === undefined && this.parent !== null) {\n return this.parent.declare(key, type, value, isGlobal);\n } else if (\n (this[type].hasOwnProperty(key) && type !== 'const' && !this.globals.hasOwnProperty(key)) ||\n !(key in this.allVars)\n ) {\n if (isGlobal) {\n this.globals[key] = true;\n }\n this[type][key] = true;\n this.allVars[key] = value;\n } else {\n throw new SandboxError(`Identifier '${key}' has already been declared`);\n }\n return new Prop(this.allVars, key, this.const.hasOwnProperty(key), isGlobal);\n }\n}\n\nexport interface IScope {\n [key: string]: any;\n}\n\nexport class FunctionScope implements IScope {}\n\nexport class LocalScope implements IScope {}\n\nexport class SandboxError extends Error {}\n\nexport function isLisp<Type extends Lisp = Lisp>(item: LispItem | LispItem): item is Type {\n return (\n Array.isArray(item) &&\n typeof item[0] === 'number' &&\n item[0] !== LispType.None &&\n item[0] !== LispType.True\n );\n}\n\nexport const enum LispType {\n None,\n Prop,\n StringIndex,\n Let,\n Const,\n Call,\n KeyVal,\n Number,\n Return,\n Assign,\n InlineFunction,\n ArrowFunction,\n CreateArray,\n If,\n IfCase,\n InlineIf,\n InlineIfCase,\n SpreadObject,\n SpreadArray,\n ArrayProp,\n PropOptional,\n CallOptional,\n CreateObject,\n Group,\n Not,\n IncrementBefore,\n IncrementAfter,\n DecrementBefore,\n DecrementAfter,\n And,\n Or,\n StrictNotEqual,\n StrictEqual,\n Plus,\n Var,\n GlobalSymbol,\n Literal,\n Function,\n Loop,\n Try,\n Switch,\n SwitchCase,\n Block,\n Expression,\n Await,\n New,\n Throw,\n Minus,\n Divide,\n Power,\n Multiply,\n Modulus,\n Equal,\n NotEqual,\n SmallerEqualThan,\n LargerEqualThan,\n SmallerThan,\n LargerThan,\n Negative,\n Positive,\n Typeof,\n Delete,\n Instanceof,\n In,\n Inverse,\n SubractEquals,\n AddEquals,\n DivideEquals,\n PowerEquals,\n MultiplyEquals,\n ModulusEquals,\n BitNegateEquals,\n BitAndEquals,\n BitOrEquals,\n UnsignedShiftRightEquals,\n ShiftRightEquals,\n ShiftLeftEquals,\n BitAnd,\n BitOr,\n BitNegate,\n BitShiftLeft,\n BitShiftRight,\n BitUnsignedShiftRight,\n BigInt,\n LiteralIndex,\n RegexIndex,\n LoopAction,\n Void,\n True,\n\n LispEnumSize,\n}\n\nexport class Prop {\n constructor(\n public context: Unknown,\n public prop: string,\n public isConst = false,\n public isGlobal = false,\n public isVariable = false\n ) {}\n\n get<T = unknown>(context: IExecContext): T {\n const ctx = this.context;\n if (ctx === undefined) throw new ReferenceError(`${this.prop} is not defined`);\n if (ctx === null)\n throw new TypeError(`Cannot read properties of null, (reading '${this.prop}')`);\n context.getSubscriptions.forEach((cb) => cb(ctx, this.prop));\n return (ctx as any)[this.prop] as T;\n }\n}\n","import { LispItem, Lisp, IRegEx, LispFamily, ExtractLispOp, SwitchCase } from './parser.js';\nimport {\n CodeString,\n IAuditReport,\n IExecContext,\n IScope,\n isLisp,\n LispType,\n LocalScope,\n Prop,\n SandboxError,\n Scope,\n Ticks,\n VarType,\n} from './utils.js';\n\nexport type Done<T = any> = (err?: any, res?: T | typeof optional) => void;\n\nexport class ExecReturn<T> {\n constructor(\n public auditReport: IAuditReport | undefined,\n public result: T,\n public returned: boolean,\n public breakLoop = false,\n public continueLoop = false\n ) {}\n}\n\nexport type Unknown = undefined | null | Record<string | number, unknown>;\n\nexport interface IChange {\n type: string;\n}\n\nexport interface ICreate extends IChange {\n type: 'create';\n prop: number | string;\n}\n\nexport interface IReplace extends IChange {\n type: 'replace';\n}\n\nexport interface IDelete extends IChange {\n type: 'delete';\n prop: number | string;\n}\n\nexport interface IReverse extends IChange {\n type: 'reverse';\n}\n\nexport interface ISort extends IChange {\n type: 'sort';\n}\n\nexport interface IPush extends IChange {\n type: 'push';\n added: unknown[];\n}\n\nexport interface IPop extends IChange {\n type: 'pop';\n removed: unknown[];\n}\n\nexport interface IShift extends IChange {\n type: 'shift';\n removed: unknown[];\n}\n\nexport interface IUnShift extends IChange {\n type: 'unshift';\n added: unknown[];\n}\n\nexport interface ISplice extends IChange {\n type: 'splice';\n startIndex: number;\n deleteCount: number;\n added: unknown[];\n removed: unknown[];\n}\n\nexport interface ICopyWithin extends IChange {\n type: 'copyWithin';\n startIndex: number;\n endIndex: number;\n added: unknown[];\n removed: unknown[];\n}\n\nexport type Change =\n | ICreate\n | IReplace\n | IDelete\n | IReverse\n | ISort\n | IPush\n | IPop\n | IUnShift\n | IShift\n | ISplice\n | ICopyWithin;\n\nconst optional = {};\n\nfunction generateArgs(argNames: string[], args: unknown[]) {\n const vars: Record<string, unknown> = {};\n argNames.forEach((arg, i) => {\n if (arg.startsWith('...')) {\n vars[arg.substring(3)] = args.slice(i);\n } else {\n vars[arg] = args[i];\n }\n });\n return vars;\n}\n\nexport const sandboxedFunctions = new WeakSet();\nexport function createFunction(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxError('Function creation is forbidden');\n }\n let func;\n if (name === undefined) {\n func = (...args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const res = executeTree(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars)]\n );\n return res.result;\n };\n } else {\n func = function sandboxedObject(this: Unknown, ...args: unknown[]) {\n const vars = generateArgs(argNames, args);\n const res = executeTree(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars, this)]\n );\n return res.result;\n };\n }\n context.registerSandboxFunction(func);\n sandboxedFunctions.add(func);\n return func;\n}\n\nexport function createFunctionAsync(\n argNames: string[],\n parsed: Lisp[],\n ticks: Ticks,\n context: IExecContext,\n scope?: Scope,\n name?: string\n) {\n if (context.ctx.options.forbidFunctionCreation) {\n throw new SandboxError('Function creation is forbidden');\n }\n if (!context.ctx.prototypeWhitelist?.has(Promise.prototype)) {\n throw new SandboxError('Async/await not permitted');\n }\n let func;\n if (name === undefined) {\n func = async (...args: unknown[]) => {\n const vars = generateArgs(argNames, args);\n const res = await executeTreeAsync(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars)]\n );\n return res.result;\n };\n } else {\n func = async function sandboxedObject(this: Unknown, ...args: unknown[]) {\n const vars = generateArgs(argNames, args);\n const res = await executeTreeAsync(\n ticks,\n context,\n parsed,\n scope === undefined ? [] : [new Scope(scope, vars, this)]\n );\n return res.result;\n };\n }\n context.registerSandboxFunction(func);\n sandboxedFunctions.add(func);\n return func;\n}\n\nexport function assignCheck(obj: Prop, context: IExecContext, op = 'assign') {\n if (obj.context === undefined) {\n throw new ReferenceError(`Cannot ${op} value to undefined.`);\n }\n if (typeof obj.context !== 'object' && typeof obj.context !== 'function') {\n throw new SyntaxError(`Cannot ${op} value to a primitive.`);\n }\n if (obj.isConst) {\n throw new TypeError(`Cannot set value to const variable '${obj.prop}'`);\n }\n if (obj.isGlobal) {\n throw new SandboxError(`Cannot ${op} property '${obj.prop}' of a global object`);\n }\n if (obj.context === null) {\n throw new TypeError('Cannot set properties of null');\n }\n if (typeof obj.context[obj.prop] === 'function' && !obj.context.hasOwnProperty(obj.prop)) {\n throw new SandboxError(`Override prototype property '${obj.prop}' not allowed`);\n }\n if (op === 'delete') {\n if (obj.context.hasOwnProperty(obj.prop)) {\n context.changeSubscriptions\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'delete', prop: obj.prop }));\n context.changeSubscriptionsGlobal\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'delete', prop: obj.prop }));\n }\n } else if (obj.context.hasOwnProperty(obj.prop)) {\n context.setSubscriptions\n .get(obj.context)\n ?.get(obj.prop)\n ?.forEach((cb) =>\n cb({\n type: 'replace',\n })\n );\n context.setSubscriptionsGlobal\n .get(obj.context)\n ?.get(obj.prop)\n ?.forEach((cb) =>\n cb({\n type: 'replace',\n })\n );\n } else {\n context.changeSubscriptions\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'create', prop: obj.prop }));\n context.changeSubscriptionsGlobal\n .get(obj.context)\n ?.forEach((cb) => cb({ type: 'create', prop: obj.prop }));\n }\n}\nconst arrayChange = new Set([\n [].push,\n [].pop,\n [].shift,\n [].unshift,\n [].splice,\n [].reverse,\n [].sort,\n [].copyWithin,\n]);\n\nexport class KeyVal {\n constructor(public key: string | SpreadObject, public val: unknown) {}\n}\n\nexport class SpreadObject {\n constructor(public item: { [key: string]: unknown }) {}\n}\n\nexport class SpreadArray {\n constructor(public item: unknown[]) {}\n}\n\nexport class If {\n constructor(public t: Lisp, public f: Lisp) {}\n}\n\nconst literalRegex = /(\\$\\$)*(\\$)?\\${(\\d+)}/g;\ntype OpCallback = (\n exec: Execution,\n done: Done,\n ticks: Ticks,\n a: any,\n b: any,\n obj: any,\n context: IExecContext,\n scope: Scope,\n bobj?: any,\n inLoopOrSwitch?: string\n) => void;\n\nexport const ops = new Map<LispType, OpCallback>();\nexport function addOps<Type extends LispFamily>(type: ExtractLispOp<Type>, cb: OpCallback) {\n ops.set(type, cb);\n}\n\naddOps(LispType.Prop, (exec, done, ticks, a, b: string, obj, context, scope) => {\n if (a === null) {\n throw new TypeError(`Cannot get property ${b} of null`);\n }\n const type = typeof a;\n if (type === 'undefined' && obj === undefined) {\n const prop = scope.get(b);\n if (prop.context === context.ctx.sandboxGlobal) {\n if (context.ctx.options.audit) {\n context.ctx.auditReport?.globalsAccess.add(b);\n }\n const rep = context.ctx.globalsWhitelist.has(context.ctx.sandboxGlobal[b])\n ? context.evals.get(context.ctx.sandboxGlobal[b])\n : undefined;\n if (rep) {\n done(undefined, rep);\n return;\n }\n }\n if (prop.context && prop.context[b] === globalThis) {\n done(undefined, context.ctx.globalScope.get('this'));\n return;\n }\n\n done(undefined, prop);\n return;\n } else if (a === undefined) {\n throw new SandboxError(\"Cannot get property '\" + b + \"' of undefined\");\n }\n\n if (type !== 'object') {\n if (type === 'number') {\n a = new Number(a);\n } else if (type === 'string') {\n a = new String(a);\n } else if (type === 'boolean') {\n a = new Boolean(a);\n }\n } else if (typeof a.hasOwnProperty === 'undefined') {\n done(undefined, new Prop(undefined, b));\n return;\n }\n\n const isFunction = type === 'function';\n const prototypeAccess = isFunction || !(a.hasOwnProperty(b) || typeof b === 'number');\n\n if (context.ctx.options.audit && prototypeAccess) {\n if (typeof b === 'string') {\n let prot = Object.getPrototypeOf(a);\n do {\n if (prot.hasOwnProperty(b)) {\n if (\n context.ctx.auditReport &&\n !context.ctx.auditReport.prototypeAccess[prot.constructor.name]\n ) {\n context.ctx.auditReport.prototypeAccess[prot.constructor.name] = new Set();\n }\n context.ctx.auditReport?.prototypeAccess[prot.constructor.name].add(b);\n }\n } while ((prot = Object.getPrototypeOf(prot)));\n }\n }\n\n if (prototypeAccess) {\n if (isFunction) {\n if (!['name', 'length', 'constructor'].includes(b) && (a.hasOwnProperty(b) || b === '__proto__')) {\n const whitelist = context.ctx.prototypeWhitelist.get(a.prototype);\n const replace = context.ctx.options.prototypeReplacements.get(a);\n if (replace) {\n done(undefined, new Prop(replace(a, true), b));\n return;\n }\n if (!(whitelist && (!whitelist.size || whitelist.has(b)))) {\n throw new SandboxError(`Static method or property access not permitted: ${a.name}.${b}`);\n }\n }\n } else if (b !== 'constructor') {\n let prot = a;\n while ((prot = Object.getPrototypeOf(prot))) {\n if (prot.hasOwnProperty(b)) {\n const whitelist = context.ctx.prototypeWhitelist.get(prot);\n const replace = context.ctx.options.prototypeReplacements.get(prot.constuctor);\n if (replace) {\n done(undefined, new Prop(replace(a, false), b));\n return;\n }\n if (whitelist && (!whitelist.size || whitelist.has(b))) {\n break;\n }\n throw new SandboxError(\n `Method or property access not permitted: ${prot.constructor.name}.${b}`\n );\n }\n }\n }\n }\n\n if (context.evals.has(a[b])) {\n done(undefined, context.evals.get(a[b]));\n return;\n }\n if (a[b] === globalThis) {\n done(undefined, context.ctx.globalScope.get('this'));\n return;\n }\n\n const g =\n obj.isGlobal ||\n (isFunction && !sandboxedFunctions.has(a)) ||\n context.ctx.globalsWhitelist.has(a);\n\n done(undefined, new Prop(a, b, false, g));\n});\n\naddOps(LispType.Call, (exec, done, ticks, a, b: Lisp[], obj, context) => {\n if (context.ctx.options.forbidFunctionCalls)\n throw new SandboxError('Function invocations are not allowed');\n if (typeof a !== 'function') {\n throw new TypeError(`${typeof obj.prop === 'symbol' ? 'Symbol' : obj.prop} is not a function`);\n }\n const vals = b\n .map((item) => {\n if (item instanceof SpreadArray) {\n return [...item.item];\n } else {\n return [item];\n }\n })\n .flat()\n .map((item) => valueOrProp(item, context));\n\n if (typeof obj === 'function') {\n done(undefined, obj(...vals));\n return;\n }\n if (obj.context[obj.prop] === JSON.stringify && context.getSubscriptions.size) {\n const cache = new Set<any>();\n const recurse = (x: unknown) => {\n if (!x || !(typeof x === 'object') || cache.has(x)) return;\n cache.add(x);\n for (const y of Object.keys(x) as (keyof typeof x)[]) {\n context.getSubscriptions.forEach((cb) => cb(x, y));\n recurse(x[y]);\n }\n };\n recurse(vals[0]);\n }\n\n if (\n obj.context instanceof Array &&\n arrayChange.has(obj.context[obj.prop]) &&\n (context.changeSubscriptions.get(obj.context) ||\n context.changeSubscriptionsGlobal.get(obj.context))\n ) {\n let change: Change;\n let changed = false;\n if (obj.prop === 'push') {\n change = {\n type: 'push',\n added: vals,\n };\n changed = !!vals.length;\n } else if (obj.prop === 'pop') {\n change = {\n type: 'pop',\n removed: obj.context.slice(-1),\n };\n changed = !!change.removed.length;\n } else if (obj.prop === 'shift') {\n change = {\n type: 'shift',\n removed: obj.context.slice(0, 1),\n };\n changed = !!change.removed.length;\n } else if (obj.prop === 'unshift') {\n change = {\n type: 'unshift',\n added: vals,\n };\n changed = !!vals.length;\n } else if (obj.prop === 'splice') {\n change = {\n type: 'splice',\n startIndex: vals[0],\n deleteCount: vals[1] === undefined ? obj.context.length : vals[1],\n added: vals.slice(2),\n removed: obj.context.slice(vals[0], vals[1] === undefined ? undefined : vals[0] + vals[1]),\n };\n changed = !!change.added.length || !!change.removed.length;\n } else if (obj.prop === 'reverse' || obj.prop === 'sort') {\n change = { type: obj.prop };\n changed = !!obj.context.length;\n } else if (obj.prop === 'copyWithin') {\n const len =\n vals[2] === undefined\n ? obj.context.length - vals[1]\n : Math.min(obj.context.length, vals[2] - vals[1]);\n change = {\n type: 'copyWithin',\n startIndex: vals[0],\n endIndex: vals[0] + len,\n added: obj.context.slice(vals[1], vals[1] + len),\n removed: obj.context.slice(vals[0], vals[0] + len),\n };\n changed = !!change.added.length || !!change.removed.length;\n }\n if (changed) {\n context.changeSubscriptions.get(obj.context)?.forEach((cb) => cb(change));\n context.changeSubscriptionsGlobal.get(obj.context)?.forEach((cb) => cb(change));\n }\n }\n obj.get(context);\n done(undefined, obj.context[obj.prop](...vals));\n});\n\naddOps(LispType.CreateObject, (exec, done, ticks, a, b: KeyVal[]) => {\n let res = {} as any;\n for (const item of b) {\n if (item.key instanceof SpreadObject) {\n res = { ...res, ...item.key.item };\n } else {\n res[item.key] = item.val;\n }\n }\n done(undefined, res);\n});\n\naddOps(LispType.KeyVal, (exec, done, ticks, a: string, b: LispItem) =>\n done(undefined, new KeyVal(a, b))\n);\n\naddOps(LispType.CreateArray, (exec, done, ticks, a, b: Lisp[], obj, context) => {\n const items = b\n .map((item) => {\n if (item instanceof SpreadArray) {\n return [...item.item];\n } else {\n return [item];\n }\n })\n .flat()\n .map((item) => valueOrProp(item, context));\n done(undefined, items);\n});\n\naddOps(LispType.Group, (exec, done, ticks, a, b) => done(undefined, b));\n\naddOps(LispType.GlobalSymbol, (exec, done, ticks, a, b: string) => {\n switch (b) {\n case 'true':\n return done(undefined, true);\n case 'false':\n return done(undefined, false);\n case 'null':\n return done(undefined, null);\n case 'undefined':\n return done(undefined, undefined);\n case 'NaN':\n return done(undefined, NaN);\n case 'Infinity':\n return done(undefined, Infinity);\n }\n done(new Error('Unknown symbol: ' + b));\n});\n\naddOps(LispType.Number, (exec, done, ticks, a, b) => done(undefined, Number(b)));\naddOps(LispType.BigInt, (exec, done, ticks, a, b) => done(undefined, BigInt(b)));\naddOps(LispType.StringIndex, (exec, done, ticks, a, b: string, obj, context) =>\n done(undefined, context.constants.strings[parseInt(b)])\n);\n\naddOps(LispType.RegexIndex, (exec, done, ticks, a, b: string, obj, context) => {\n const reg: IRegEx = context.constants.regexes[parseInt(b)];\n if (!context.ctx.globalsWhitelist.has(RegExp)) {\n throw new SandboxError('Regex not permitted');\n } else {\n done(undefined, new RegExp(reg.regex, reg.flags));\n }\n});\n\naddOps(LispType.LiteralIndex, (exec, done, ticks, a, b: string, obj, context, scope) => {\n const item = context.constants.literals[parseInt(b)];\n const [, name, js] = item;\n const found: Lisp[] = [];\n let f: RegExpExecArray | null;\n const resnums: string[] = [];\n while ((f = literalRegex.exec(name))) {\n if (!f[2]) {\n found.push(js[parseInt(f[3], 10)]);\n resnums.push(f[3]);\n }\n }\n\n exec<unknown[]>(ticks, found, scope, context, (err, processed) => {\n const reses: Record<string, unknown> = {};\n if (err) {\n done(err);\n return;\n }\n for (const i of Object.keys(processed!) as (keyof typeof processed)[]) {\n const num = resnums[i];\n reses[num] = processed![i];\n }\n done(\n undefined,\n name.replace(/(\\\\\\\\)*(\\\\)?\\${(\\d+)}/g, (match, $$, $, num) => {\n if ($) return match;\n const res = reses[num];\n return ($$ ? $$ : '') + `${valueOrProp(res, context)}`;\n })\n );\n });\n});\n\naddOps(LispType.SpreadArray, (exec, done, ticks, a, b) => {\n done(undefined, new SpreadArray(b));\n});\n\naddOps(LispType.SpreadObject, (exec, done, ticks, a, b) => {\n done(undefined, new SpreadObject(b));\n});\n\naddOps(LispType.Not, (exec, done, ticks, a, b) => done(undefined, !b));\naddOps(LispType.Inverse, (exec, done, ticks, a, b) => done(undefined, ~b));\n\naddOps(LispType.IncrementBefore, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, ++obj.context[obj.prop]);\n});\n\naddOps(LispType.IncrementAfter, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, obj.context[obj.prop]++);\n});\n\naddOps(LispType.DecrementBefore, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, --obj.context[obj.prop]);\n});\n\naddOps(LispType.DecrementAfter, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, obj.context[obj.prop]--);\n});\n\naddOps(LispType.Assign, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] = b));\n});\n\naddOps(LispType.AddEquals, (exec, done, ticks, a, b, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] += b));\n});\n\naddOps(LispType.SubractEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] -= b));\n});\n\naddOps(LispType.DivideEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] /= b));\n});\n\naddOps(LispType.MultiplyEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] *= b));\n});\n\naddOps(LispType.PowerEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] **= b));\n});\n\naddOps(LispType.ModulusEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] %= b));\n});\n\naddOps(LispType.BitNegateEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] ^= b));\n});\n\naddOps(LispType.BitAndEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] &= b));\n});\n\naddOps(LispType.BitOrEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] |= b));\n});\n\naddOps(LispType.ShiftLeftEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] <<= b));\n});\n\naddOps(LispType.ShiftRightEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] >>= b));\n});\n\naddOps(LispType.UnsignedShiftRightEquals, (exec, done, ticks, a, b: number, obj, context) => {\n assignCheck(obj, context);\n done(undefined, (obj.context[obj.prop] >>= b));\n});\n\naddOps(LispType.LargerThan, (exec, done, ticks, a, b) => done(undefined, a > b));\naddOps(LispType.SmallerThan, (exec, done, ticks, a, b) => done(undefined, a < b));\naddOps(LispType.LargerEqualThan, (exec, done, ticks, a, b) => done(undefined, a >= b));\naddOps(LispType.SmallerEqualThan, (exec, done, ticks, a, b) => done(undefined, a <= b));\naddOps(LispType.Equal, (exec, done, ticks, a, b) => done(undefined, a == b));\naddOps(LispType.StrictEqual, (exec, done, ticks, a, b) => done(undefined, a === b));\naddOps(LispType.NotEqual, (exec, done, ticks, a, b) => done(undefined, a != b));\naddOps(LispType.StrictNotEqual, (exec, done, ticks, a, b) => done(undefined, a !== b));\naddOps(LispType.And, (exec, done, ticks, a, b) => done(undefined, a && b));\naddOps(LispType.Or, (exec, done, ticks, a, b) => done(undefined, a || b));\naddOps(LispType.BitAnd, (exec, done, ticks, a: number, b: number) => done(undefined, a & b));\naddOps(LispType.BitOr, (exec, done, ticks, a: number, b: number) => done(undefined, a | b));\naddOps(LispType.Plus, (exec, done, ticks, a: number, b: number) => done(undefined, a + b));\naddOps(LispType.Minus, (exec, done, ticks, a: number, b: number) => done(undefined, a - b));\naddOps(LispType.Positive, (exec, done, ticks, a, b) => done(undefined, +b));\naddOps(LispType.Negative, (exec, done, ticks, a, b) => done(undefined, -b));\naddOps(LispType.Divide, (exec, done, ticks, a: number, b: number) => done(undefined, a / b));\naddOps(LispType.BitNegate, (exec, done, ticks, a: number, b: number) => done(undefined, a ^ b));\naddOps(LispType.Multiply, (exec, done, ticks, a: number, b: number) => done(undefined, a * b));\naddOps(LispType.Modulus, (exec, done, ticks, a: number, b: number) => done(undefined, a % b));\naddOps(LispType.BitShiftLeft, (exec, done, ticks, a: number, b: number) => done(undefined, a << b));\naddOps(LispType.BitShiftRight, (exec, done, ticks, a: number, b: number) =>\n done(undefined, a >> b)\n);\naddOps(LispType.BitUnsignedShiftRight, (exec, done, ticks, a: number, b: number) =>\n done(undefined, a >>> b)\n);\naddOps(LispType.Typeof, (exec, done, ticks, a, b: LispItem, obj, context, scope) => {\n exec(ticks, b, scope, context, (e, prop) => {\n done(undefined, typeof valueOrProp(prop, context));\n });\n});\n\naddOps(LispType.Instanceof, (exec, done, ticks, a, b: { new (): unknown }) =>\n done(undefined, a instanceof b)\n);\naddOps(LispType.In, (exec, done, ticks, a: string, b) => done(undefined, a in b));\n\naddOps(LispType.Delete, (exec, done, ticks, a, b, obj, context, scope, bobj: Prop) => {\n if (bobj.context === undefined) {\n done(undefined, true);\n return;\n }\n assignCheck(bobj, context, 'delete');\n if (bobj.isVariable) {\n done(undefined, false);\n return;\n }\n done(undefined, delete bobj.context?.[bobj.prop]);\n});\n\naddOps(LispType.Return, (exec, done, ticks, a, b) => done(undefined, b));\n\naddOps(LispType.Var, (exec, done, ticks, a: string, b: LispItem, obj, context, scope) => {\n done(undefined, scope.declare(a, VarType.var, b));\n});\n\naddOps(LispType.Let, (exec, done, ticks, a: string, b: LispItem, obj, context, scope, bobj) => {\n done(undefined, scope.declare(a, VarType.let, b, bobj && bobj.isGlobal));\n});\n\naddOps(LispType.Const, (exec, done, ticks, a: string, b: LispItem, obj, context, scope) => {\n done(undefined, scope.declare(a, VarType.const, b));\n});\n\naddOps(\n LispType.ArrowFunction,\n (exec, done, ticks, a: string[], b: Lisp[], obj: Lisp, context, scope) => {\n a = [...a];\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants);\n } else {\n throw new SandboxError('Unevaluated code detected, JIT not allowed');\n }\n }\n if (a.shift()) {\n done(undefined, createFunctionAsync(a, b, ticks, context, scope));\n } else {\n done(undefined, createFunction(a, b, ticks, context, scope));\n }\n }\n);\n\naddOps(\n LispType.Function,\n (exec, done, ticks, a: (string | LispType)[], b: Lisp[], obj: Lisp, context, scope) => {\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants);\n } else {\n throw new SandboxError('Unevaluated code detected, JIT not allowed');\n }\n }\n const isAsync = a.shift();\n const name = a.shift() as string;\n let func;\n if (isAsync === LispType.True) {\n func = createFunctionAsync(a as string[], b, ticks, context, scope, name);\n } else {\n func = createFunction(a as string[], b, ticks, context, scope, name);\n }\n if (name) {\n scope.declare(name, VarType.var, func);\n }\n done(undefined, func);\n }\n);\n\naddOps(\n LispType.InlineFunction,\n (exec, done, ticks, a: (string | LispType)[], b: Lisp[], obj: Lisp, context, scope) => {\n if (typeof obj[2] === 'string' || obj[2] instanceof CodeString) {\n if (context.allowJit && context.evalContext) {\n obj[2] = b = context.evalContext.lispifyFunction(new CodeString(obj[2]), context.constants);\n } else {\n throw new SandboxError('Unevaluated code detected, JIT not allowed');\n }\n }\n const isAsync = a.shift();\n const name = a.shift() as string;\n if (name) {\n scope = new Scope(scope, {});\n }\n let func;\n if (isAsync === LispType.True) {\n func = createFunctionAsync(a as string[], b, ticks, context, scope, name);\n } else {\n func = createFunction(a as string[], b, ticks, context, scope, name);\n }\n if (name) {\n scope.declare(name, VarType.let, func);\n }\n done(undefined, func);\n }\n);\n\naddOps(LispType.Loop, (exec, done, ticks, a: Lisp[], b: Lisp[], obj, context, scope) => {\n const [checkFirst, startInternal, getIterator, startStep, step, condition, beforeStep] = a;\n let loop = true;\n const loopScope = new Scope(scope, {});\n const internalVars = {\n $$obj: undefined,\n };\n const interalScope = new Scope(loopScope, internalVars);\n if (exec === execAsync) {\n (async () => {\n let ad: AsyncDoneRet;\n ad = asyncDone((d) => exec(ticks, startStep, loopScope, context, d));\n internalVars['$$obj'] =\n (ad = asyncDone((d) => exec(ticks, getIterator, loopScope, context, d))).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n ad = asyncDone((d) => exec(ticks, startInternal, interalScope, context, d));\n if (checkFirst)\n loop =\n (ad = asyncDone((d) => exec(ticks, condition, interalScope, context, d))).isInstant ===\n true\n ? ad.instant\n : (await ad.p).result;\n while (loop) {\n const innerLoopVars = {};\n ad = asyncDone((d) =>\n exec(ticks, beforeStep, new Scope(interalScope, innerLoopVars), context, d)\n );\n ad.isInstant === true ? ad.instant : (await ad.p).result;\n const res = await executeTreeAsync(\n ticks,\n context,\n b,\n [new Scope(loopScope, innerLoopVars)],\n 'loop'\n );\n if (res instanceof ExecReturn && res.returned) {\n done(undefined, res);\n return;\n }\n if (res instanceof ExecReturn && res.breakLoop) {\n break;\n }\n ad = asyncDone((d) => exec(ticks, step, interalScope, context, d));\n loop =\n (ad = asyncDone((d) => exec(ticks, condition, interalScope, context, d))).isInstant ===\n true\n ? ad.instant\n : (await ad.p).result;\n }\n done();\n })().catch(done);\n } else {\n syncDone((d) => exec(ticks, startStep, loopScope, context, d));\n internalVars['$$obj'] = syncDone((d) => exec(ticks, getIterator, loopScope, context, d)).result;\n syncDone((d) => exec(ticks, startInternal, interalScope, context, d));\n if (checkFirst) loop = syncDone((d) => exec(ticks, condition, interalScope, context, d)).result;\n while (loop) {\n const innerLoopVars = {};\n syncDone((d) => exec(ticks, beforeStep, new Scope(interalScope, innerLoopVars), context, d));\n const res = executeTree(ticks, context, b, [new Scope(loopScope, innerLoopVars)], 'loop');\n if (res instanceof ExecReturn && res.returned) {\n done(undefined, res);\n return;\n }\n if (res instanceof ExecReturn && res.breakLoop) {\n break;\n }\n syncDone((d) => exec(ticks, step, interalScope, context, d));\n loop = syncDone((d) => exec(ticks, condition, interalScope, context, d)).result;\n }\n done();\n }\n});\n\naddOps(\n LispType.LoopAction,\n (exec, done, ticks, a: LispItem, b: LispItem, obj, context, scope, bobj, inLoopOrSwitch) => {\n if ((inLoopOrSwitch === 'switch' && a === 'continue') || !inLoopOrSwitch) {\n throw new SandboxError('Illegal ' + a + ' statement');\n }\n done(\n undefined,\n new ExecReturn(context.ctx.auditReport, undefined, false, a === 'break', a === 'continue')\n );\n }\n);\n\naddOps(\n LispType.If,\n (exec, done, ticks, a: LispItem, b: If, obj, context, scope) => {\n exec(ticks, valueOrProp(a, context) ? b.t : b.f, scope, context, done);\n }\n);\n\naddOps(LispType.InlineIf, (exec, done, ticks, a: LispItem, b: If, obj, context, scope) => {\n exec(ticks, valueOrProp(a, context) ? b.t : b.f, scope, context, done);\n});\naddOps(LispType.InlineIfCase, (exec, done, ticks, a, b) => done(undefined, new If(a, b)));\naddOps(LispType.IfCase, (exec, done, ticks, a, b) => done(undefined, new If(a, b)));\n\naddOps(LispType.Switch, (exec, done, ticks, a: LispItem, b: SwitchCase[], obj, context, scope) => {\n exec(ticks, a, scope, context, (err, toTest) => {\n if (err) {\n done(err);\n return;\n }\n toTest = valueOrProp(toTest, context);\n if (exec === execSync) {\n let res: ExecReturn<unknown>;\n let isTrue = false;\n for (const caseItem of b) {\n if (\n isTrue ||\n (isTrue =\n !caseItem[1] ||\n toTest ===\n valueOrProp(\n syncDone((d) => exec(ticks, caseItem[1], scope, context, d)).result,\n context\n ))\n ) {\n if (!caseItem[2]) continue;\n res = executeTree(ticks, context, caseItem[2], [scope], 'switch');\n if (res.breakLoop) break;\n if (res.returned) {\n done(undefined, res);\n return;\n }\n if (!caseItem[1]) {\n // default case\n break;\n }\n }\n }\n done();\n } else {\n (async () => {\n let res: ExecReturn<unknown>;\n let isTrue = false;\n for (const caseItem of b) {\n let ad: AsyncDoneRet;\n if (\n isTrue ||\n (isTrue =\n !caseItem[1] ||\n toTest ===\n valueOrProp(\n (ad = asyncDone((d) => exec(ticks, caseItem[1], scope, context, d))).isInstant ===\n true\n ? ad.instant\n : (await ad.p).result,\n context\n ))\n ) {\n if (!caseItem[2]) continue;\n res = await executeTreeAsync(ticks, context, caseItem[2], [scope], 'switch');\n if (res.breakLoop) break;\n if (res.returned) {\n done(undefined, res);\n return;\n }\n if (!caseItem[1]) {\n // default case\n break;\n }\n }\n }\n done();\n })().catch(done);\n }\n });\n});\n\naddOps(\n LispType.Try,\n (\n exec,\n done,\n ticks,\n a: Lisp[],\n b: [string, Lisp[], Lisp[]],\n obj,\n context,\n scope,\n bobj,\n inLoopOrSwitch\n ) => {\n const [exception, catchBody, finallyBody] = b;\n executeTreeWithDone(\n exec,\n (err, res) => {\n executeTreeWithDone(\n exec,\n (e) => {\n if (e) done(e);\n else if (err) {\n const sc: Record<string, unknown> = {};\n if (exception) sc[exception] = err;\n executeTreeWithDone(\n exec,\n done,\n ticks,\n context,\n catchBody,\n [new Scope(scope)],\n inLoopOrSwitch\n );\n } else {\n done(undefined, res);\n }\n },\n ticks,\n context,\n finallyBody,\n [new Scope(scope, {})]\n );\n },\n ticks,\n context,\n a,\n [new Scope(scope)],\n inLoopOrSwitch\n );\n }\n);\n\naddOps(LispType.Void, (exec, done) => {\n done();\n});\naddOps(\n LispType.New,\n (exec, done, ticks, a: new (...args: unknown[]) => unknown, b: unknown[], obj, context) => {\n if (!context.ctx.globalsWhitelist.has(a) && !sandboxedFunctions.has(a)) {\n throw new SandboxError(`Object construction not allowed: ${a.constructor.name}`);\n }\n done(undefined, new a(...b));\n }\n);\n\naddOps(LispType.Throw, (exec, done, ticks, a, b) => {\n done(b);\n});\naddOps(LispType.Expression, (exec, done, ticks, a: unknown[]) => done(undefined, a.pop()));\naddOps(LispType.None, (exec, done) => done());\n\nfunction valueOrProp(a: unknown, context: IExecContext): any {\n if (a instanceof Prop) return a.get(context);\n if (a === optional) return undefined;\n return a;\n}\n\nexport function execMany(\n ticks: Ticks,\n exec: Execution,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n inLoopOrSwitch?: string\n) {\n if (exec === execSync) {\n _execManySync(ticks, tree, done, scope, context, inLoopOrSwitch);\n } else {\n _execManyAsync(ticks, tree, done, scope, context, inLoopOrSwitch).catch(done);\n }\n}\n\nfunction _execManySync(\n ticks: Ticks,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n inLoopOrSwitch?: string\n) {\n const ret = [];\n for (let i = 0; i < tree.length; i++) {\n let res;\n try {\n res = syncDone((d) => execSync(ticks, tree[i], scope, context, d, inLoopOrSwitch)).result;\n } catch (e) {\n done(e);\n return;\n }\n if (res instanceof ExecReturn && (res.returned || res.breakLoop || res.continueLoop)) {\n done(undefined, res);\n return;\n }\n if (isLisp(tree[i]) && tree[i][0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n ret.push(res);\n }\n done(undefined, ret);\n}\n\nasync function _execManyAsync(\n ticks: Ticks,\n tree: Lisp[],\n done: Done,\n scope: Scope,\n context: IExecContext,\n inLoopOrSwitch?: string\n) {\n const ret = [];\n for (let i = 0; i < tree.length; i++) {\n let res;\n try {\n let ad: AsyncDoneRet;\n res =\n (ad = asyncDone((d) => execAsync(ticks, tree[i], scope, context, d, inLoopOrSwitch)))\n .isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n if (res instanceof ExecReturn && (res.returned || res.breakLoop || res.continueLoop)) {\n done(undefined, res);\n return;\n }\n if (isLisp(tree[i]) && tree[i][0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n ret.push(res);\n }\n done(undefined, ret);\n}\n\ntype Execution = <T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n done: Done<T>,\n inLoopOrSwitch?: string\n) => void;\n\nexport interface AsyncDoneRet {\n isInstant: boolean;\n instant: any;\n p: Promise<{ result: any }>;\n}\n\nexport function asyncDone(callback: (done: Done) => void): AsyncDoneRet {\n let isInstant = false;\n let instant: unknown;\n const p = new Promise<any>((resolve, reject) => {\n callback((err, result) => {\n if (err) reject(err);\n else {\n isInstant = true;\n instant = result;\n resolve({ result });\n }\n });\n });\n return {\n isInstant,\n instant,\n p,\n };\n}\n\nexport function syncDone(callback: (done: Done) => void): { result: any } {\n let result;\n let err;\n callback((e, r) => {\n err = e;\n result = r;\n });\n if (err) throw err;\n return { result };\n}\n\nexport async function execAsync<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n doneOriginal: Done<T>,\n inLoopOrSwitch?: string\n): Promise<void> {\n let done: Done<T> = doneOriginal;\n const p = new Promise<void>((resolve) => {\n done = (e, r?) => {\n doneOriginal(e, r);\n resolve();\n };\n });\n if (!_execNoneRecurse(ticks, tree, scope, context, done, true, inLoopOrSwitch) && isLisp(tree)) {\n let op = tree[0];\n let obj;\n try {\n let ad: AsyncDoneRet;\n obj =\n (ad = asyncDone((d) => execAsync(ticks, tree[1], scope, context, d, inLoopOrSwitch)))\n .isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n let a = obj;\n try {\n a = obj instanceof Prop ? obj.get(context) : obj;\n } catch (e) {\n done(e);\n return;\n }\n if (op === LispType.PropOptional || op === LispType.CallOptional) {\n if (a === undefined || a === null) {\n done(undefined, optional);\n return;\n }\n op = op === LispType.PropOptional ? LispType.Prop : LispType.Call;\n }\n if (a === optional) {\n if (op === LispType.Prop || op === LispType.Call) {\n done(undefined, a);\n return;\n } else {\n a = undefined;\n }\n }\n let bobj;\n try {\n let ad: AsyncDoneRet;\n bobj =\n (ad = asyncDone((d) => execAsync(ticks, tree[2], scope, context, d, inLoopOrSwitch)))\n .isInstant === true\n ? ad.instant\n : (await ad.p).result;\n } catch (e) {\n done(e);\n return;\n }\n let b = bobj;\n try {\n b = bobj instanceof Prop ? bobj.get(context) : bobj;\n } catch (e) {\n done(e);\n return;\n }\n if (b === optional) {\n b = undefined;\n }\n if (ops.has(op)) {\n try {\n ops.get(op)?.(execAsync, done, ticks, a, b, obj, context, scope, bobj, inLoopOrSwitch);\n } catch (err) {\n done(err);\n }\n } else {\n done(new SyntaxError('Unknown operator: ' + op));\n }\n }\n await p;\n}\n\nexport function execSync<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n done: Done<T>,\n inLoopOrSwitch?: string\n) {\n if (!_execNoneRecurse(ticks, tree, scope, context, done, false, inLoopOrSwitch) && isLisp(tree)) {\n let op = tree[0];\n let obj;\n try {\n obj = syncDone((d) => execSync(ticks, tree[1], scope, context, d, inLoopOrSwitch)).result;\n } catch (e) {\n done(e);\n return;\n }\n let a = obj;\n try {\n a = obj instanceof Prop ? obj.get(context) : obj;\n } catch (e) {\n done(e);\n return;\n }\n if (op === LispType.PropOptional || op === LispType.CallOptional) {\n if (a === undefined || a === null) {\n done(undefined, optional);\n return;\n }\n op = op === LispType.PropOptional ? LispType.Prop : LispType.Call;\n }\n if (a === optional) {\n if (op === LispType.Prop || op === LispType.Call) {\n done(undefined, a);\n return;\n } else {\n a = undefined;\n }\n }\n let bobj;\n try {\n bobj = syncDone((d) => execSync(ticks, tree[2], scope, context, d, inLoopOrSwitch)).result;\n } catch (e) {\n done(e);\n return;\n }\n let b = bobj;\n try {\n b = bobj instanceof Prop ? bobj.get(context) : bobj;\n } catch (e) {\n done(e);\n return;\n }\n if (b === optional) {\n b = undefined;\n }\n if (ops.has(op)) {\n try {\n ops.get(op)?.(execSync, done, ticks, a, b, obj, context, scope, bobj, inLoopOrSwitch);\n } catch (err) {\n done(err);\n }\n } else {\n done(new SyntaxError('Unknown operator: ' + op));\n }\n }\n}\n\nconst unexecTypes = new Set([\n LispType.ArrowFunction,\n LispType.Function,\n LispType.InlineFunction,\n LispType.Loop,\n LispType.Try,\n LispType.Switch,\n LispType.IfCase,\n LispType.InlineIfCase,\n LispType.Typeof,\n]);\n\nexport const currentTicks = { current: { ticks: BigInt(0) } as Ticks };\n\nfunction _execNoneRecurse<T = any>(\n ticks: Ticks,\n tree: LispItem,\n scope: Scope,\n context: IExecContext,\n done: Done<T>,\n isAsync: boolean,\n inLoopOrSwitch?: string\n): boolean {\n const exec = isAsync ? execAsync : execSync;\n if (context.ctx.options.executionQuota && context.ctx.options.executionQuota <= ticks.ticks) {\n if (\n !(\n typeof context.ctx.options.onExecutionQuotaReached === 'function' &&\n context.ctx.options.onExecutionQuotaReached(ticks, scope, context, tree)\n )\n ) {\n done(new SandboxError('Execution quota exceeded'));\n return true;\n }\n }\n ticks.ticks++;\n currentTicks.current = ticks;\n if (tree instanceof Prop) {\n try {\n done(undefined, tree.get(context));\n } catch (err) {\n done(err);\n }\n } else if (tree === optional) {\n done();\n } else if (Array.isArray(tree) && !isLisp(tree)) {\n if (tree[0] === LispType.None) {\n done();\n } else {\n execMany(ticks, exec, tree as Lisp[], done, scope, context, inLoopOrSwitch);\n }\n } else if (!isLisp(tree)) {\n done(undefined, tree);\n } else if (tree[0] === LispType.Block) {\n execMany(ticks, exec, tree[1] as Lisp[], done, scope, context, inLoopOrSwitch);\n } else if (tree[0] === LispType.Await) {\n if (!isAsync) {\n done(new SandboxError(\"Illegal use of 'await', must be inside async function\"));\n } else if (context.ctx.prototypeWhitelist?.has(Promise.prototype)) {\n execAsync(\n ticks,\n tree[1],\n scope,\n context,\n async (e, r) => {\n if (e) done(e);\n else\n try {\n done(undefined, await valueOrProp(r, context));\n } catch (err) {\n done(err);\n }\n },\n inLoopOrSwitch\n ).catch(done);\n } else {\n done(new SandboxError('Async/await is not permitted'));\n }\n } else if (unexecTypes.has(tree[0])) {\n try {\n ops.get(tree[0])?.(\n exec,\n done,\n ticks,\n tree[1],\n tree[2],\n tree,\n context,\n scope,\n undefined,\n inLoopOrSwitch\n );\n } catch (err) {\n done(err);\n }\n } else {\n return false;\n }\n return true;\n}\nexport function executeTree<T>(\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n inLoopOrSwitch?: string\n): ExecReturn<T> {\n return syncDone((done) =>\n executeTreeWithDone(execSync, done, ticks, context, executionTree, scopes, inLoopOrSwitch)\n ).result;\n}\n\nexport async function executeTreeAsync<T>(\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n inLoopOrSwitch?: string\n): Promise<ExecReturn<T>> {\n let ad: AsyncDoneRet;\n return (ad = asyncDone((done) =>\n executeTreeWithDone(execAsync, done, ticks, context, executionTree, scopes, inLoopOrSwitch)\n )).isInstant === true\n ? ad.instant\n : (await ad.p).result;\n}\n\nfunction executeTreeWithDone(\n exec: Execution,\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scopes: IScope[] = [],\n inLoopOrSwitch?: string\n) {\n if (!executionTree) {\n done();\n return;\n }\n if (!(executionTree instanceof Array)) {\n throw new SyntaxError('Bad execution tree');\n }\n let scope = context.ctx.globalScope;\n let s;\n while ((s = scopes.shift())) {\n if (typeof s !== 'object') continue;\n if (s instanceof Scope) {\n scope = s;\n } else {\n scope = new Scope(scope, s, s instanceof LocalScope ? undefined : null);\n }\n }\n if (context.ctx.options.audit && !context.ctx.auditReport) {\n context.ctx.auditReport = {\n globalsAccess: new Set(),\n prototypeAccess: {},\n };\n }\n if (exec === execSync) {\n _executeWithDoneSync(done, ticks, context, executionTree, scope, inLoopOrSwitch);\n } else {\n _executeWithDoneAsync(done, ticks, context, executionTree, scope, inLoopOrSwitch).catch(done);\n }\n}\n\nfunction _executeWithDoneSync(\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scope: Scope,\n inLoopOrSwitch?: string\n) {\n if (!(executionTree instanceof Array)) throw new SyntaxError('Bad execution tree');\n let i = 0;\n for (i = 0; i < executionTree.length; i++) {\n let res: unknown;\n let err: unknown;\n const current = executionTree[i];\n try {\n execSync(\n ticks,\n current,\n scope,\n context,\n (e, r) => {\n err = e;\n res = r;\n },\n inLoopOrSwitch\n );\n } catch (e) {\n err = e;\n }\n if (err) {\n done(err);\n return;\n }\n if (res instanceof ExecReturn) {\n done(undefined, res);\n return;\n }\n if (isLisp(current) && current[0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n }\n done(undefined, new ExecReturn(context.ctx.auditReport, undefined, false));\n}\n\nasync function _executeWithDoneAsync(\n done: Done,\n ticks: Ticks,\n context: IExecContext,\n executionTree: Lisp[],\n scope: Scope,\n inLoopOrSwitch?: string\n) {\n if (!(executionTree instanceof Array)) throw new SyntaxError('Bad execution tree');\n let i = 0;\n for (i = 0; i < executionTree.length; i++) {\n let res: unknown;\n let err: unknown;\n const current = executionTree[i];\n try {\n await execAsync(\n ticks,\n current,\n scope,\n context,\n (e, r) => {\n err = e;\n res = r;\n },\n inLoopOrSwitch\n );\n } catch (e) {\n err = e;\n }\n if (err) {\n done(err);\n return;\n }\n if (res instanceof ExecReturn) {\n done(undefined, res);\n return;\n }\n if (isLisp(current) && current[0] === LispType.Return) {\n done(undefined, new ExecReturn(context.ctx.auditReport, res, true));\n return;\n }\n }\n done(undefined, new ExecReturn(context.ctx.auditReport, undefined, false));\n}\n","import { IEvalContext } from './eval.js';\nimport { Change, ExecReturn, executeTree, executeTreeAsync } from './executor.js';\nimport {\n createContext,\n IContext,\n IExecContext,\n IGlobals,\n IOptionParams,\n IOptions,\n IScope,\n replacementCallback,\n SandboxGlobal,\n SubscriptionSubject,\n} from './utils.js';\n\nfunction subscribeSet(\n obj: unknown,\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 if (!(obj instanceof Object))\n throw new Error(\n 'Invalid subscription object, got ' + (typeof obj === 'object' ? 'null' : typeof obj)\n );\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 default class SandboxExec {\n context: IContext;\n setSubscriptions: WeakMap<SubscriptionSubject, Map<string, Set<(modification: Change) => void>>> =\n new WeakMap();\n changeSubscriptions: WeakMap<SubscriptionSubject, Set<(modification: Change) => void>> =\n new WeakMap();\n sandboxFunctions: WeakMap<(...args: any[]) => any, IExecContext> = new WeakMap();\n constructor(options?: IOptionParams, public evalContext?: IEvalContext) {\n const opt: IOptions = Object.assign(\n {\n audit: false,\n forbidFunctionCalls: false,\n forbidFunctionCreation: false,\n globals: SandboxExec.SAFE_GLOBALS,\n prototypeWhitelist: SandboxExec.SAFE_PROTOTYPES,\n prototypeReplacements: new Map<new () => any, replacementCallback>(),\n },\n options || {}\n );\n this.context = createContext(this, opt);\n }\n\n static get SAFE_GLOBALS(): IGlobals {\n return {\n Function,\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_PROTOTYPES(): Map<any, Set<string>> {\n const protos = [\n SandboxGlobal,\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 ];\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 '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 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(\n {\n ticks: BigInt(0),\n },\n context,\n context.tree,\n scopes\n );\n }\n\n executeTreeAsync<T>(context: IExecContext, scopes: IScope[] = []): Promise<ExecReturn<T>> {\n return executeTreeAsync(\n {\n ticks: BigInt(0),\n },\n context,\n context.tree,\n scopes\n );\n }\n}\n"],"names":["SandboxGlobal","globals","globalThis","i","this","CodeString","constructor","str","ref","start","end","length","substring","undefined","code","len","char","toString","trimStart","found","exec","slice","trim","valueOf","keysOnly","obj","ret","Object","assign","key","reservedWords","Set","Scope","parent","vars","functionThis","const","let","var","isFuncScope","allVars","get","functionScope","Prop","has","SyntaxError","hasOwnProperty","set","val","prop","context","ReferenceError","isConst","TypeError","isGlobal","SandboxError","declare","type","value","LocalScope","Error","isLisp","item","Array","isArray","isVariable","ctx","getSubscriptions","forEach","cb","ExecReturn","auditReport","result","returned","breakLoop","continueLoop","optional","generateArgs","argNames","args","arg","startsWith","sandboxedFunctions","WeakSet","createFunction","parsed","ticks","scope","name","options","forbidFunctionCreation","func","executeTree","registerSandboxFunction","add","createFunctionAsync","prototypeWhitelist","Promise","prototype","async","executeTreeAsync","assignCheck","op","changeSubscriptions","changeSubscriptionsGlobal","setSubscriptions","setSubscriptionsGlobal","arrayChange","push","pop","shift","unshift","splice","reverse","sort","copyWithin","KeyVal","SpreadObject","SpreadArray","If","t","f","literalRegex","ops","Map","addOps","valueOrProp","a","execMany","tree","done","inLoopOrSwitch","execSync","res","syncDone","d","e","_execManySync","ad","asyncDone","execAsync","isInstant","instant","p","_execManyAsync","catch","callback","resolve","reject","err","r","doneOriginal","_execNoneRecurse","bobj","b","sandboxGlobal","audit","globalsAccess","rep","globalsWhitelist","evals","globalScope","Number","String","Boolean","isFunction","prototypeAccess","prot","getPrototypeOf","includes","whitelist","replace","prototypeReplacements","size","constuctor","g","forbidFunctionCalls","vals","map","flat","JSON","stringify","cache","recurse","x","y","keys","change","changed","added","removed","startIndex","deleteCount","Math","min","endIndex","NaN","Infinity","BigInt","constants","strings","parseInt","reg","regexes","RegExp","regex","flags","literals","js","resnums","processed","reses","num","match","$$","$","allowJit","evalContext","lispifyFunction","isAsync","checkFirst","startInternal","getIterator","startStep","step","condition","beforeStep","loop","loopScope","internalVars","$$obj","interalScope","innerLoopVars","toTest","isTrue","caseItem","exception","catchBody","finallyBody","executeTreeWithDone","unexecTypes","executionQuota","onExecutionQuotaReached","executionTree","scopes","s","current","_executeWithDoneSync","_executeWithDoneAsync","subscribeSet","names","callbacks","changeCbs","unsubscribe","delete","SandboxExec","WeakMap","sandboxFunctions","opt","SAFE_GLOBALS","SAFE_PROTOTYPES","sandbox","values","Symbol","iterator","createContext","Function","console","debug","error","info","log","table","warn","isFinite","isNaN","parseFloat","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape","EvalError","RangeError","URIError","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","Intl","Date","protos","proto","subscribeGet","subscribeSetGlobal","getContext","fn"],"mappings":"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"}
|
package/dist/eval.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { lispifyFunction } from './parser.js';
|
|
2
|
+
import { IExecContext, Ticks } from './utils.js';
|
|
3
|
+
export interface IEvalContext {
|
|
4
|
+
sandboxFunction: typeof sandboxFunction;
|
|
5
|
+
sandboxedEval: typeof sandboxedEval;
|
|
6
|
+
sandboxedSetTimeout: typeof sandboxedSetTimeout;
|
|
7
|
+
sandboxedSetInterval: typeof sandboxedSetInterval;
|
|
8
|
+
lispifyFunction: typeof lispifyFunction;
|
|
9
|
+
}
|
|
10
|
+
export type SandboxFunction = (code: string, ...args: string[]) => () => unknown;
|
|
11
|
+
export type SandboxEval = (code: string) => unknown;
|
|
12
|
+
export type SandboxSetTimeout = (handler: TimerHandler, timeout?: number, ...args: unknown[]) => any;
|
|
13
|
+
export type SandboxSetInterval = (handler: TimerHandler, timeout?: number, ...args: unknown[]) => any;
|
|
14
|
+
export declare function createEvalContext(): IEvalContext;
|
|
15
|
+
export declare function sandboxFunction(context: IExecContext, ticks?: Ticks): SandboxFunction;
|
|
16
|
+
export declare function sandboxedEval(func: SandboxFunction): SandboxEval;
|
|
17
|
+
export declare function sandboxedSetTimeout(func: SandboxFunction): SandboxSetTimeout;
|
|
18
|
+
export declare function sandboxedSetInterval(func: SandboxFunction): SandboxSetInterval;
|