@modelprofile.com/flexharness 11.0.1 → 11.1.1
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.codesandbox.d.ts +12 -4
- package/dist_ts/classes.codesandbox.js +119 -287
- package/dist_ts/classes.codesandbox.worker.d.ts +52 -0
- package/dist_ts/classes.codesandbox.worker.js +310 -0
- package/dist_ts/classes.flexharness.callbacks.d.ts +37 -1
- package/dist_ts/classes.flexharness.callbacks.js +162 -53
- package/dist_ts/classes.flexharness.core.d.ts +2 -1
- package/dist_ts/classes.flexharness.core.js +22 -18
- package/dist_ts/classes.flexharness.results.js +4 -4
- package/dist_ts/classes.flexharness.reversions.d.ts +7 -0
- package/dist_ts/classes.flexharness.reversions.js +40 -39
- package/dist_ts/classes.flexharness.runs.js +7 -3
- package/dist_ts/classes.flexharness.tooldispatch.d.ts +2 -1
- package/dist_ts/classes.flexharness.tooldispatch.js +27 -9
- package/dist_ts/classes.stores.js +15 -13
- package/dist_ts/errors.d.ts +5 -0
- package/dist_ts/errors.js +10 -1
- package/dist_ts/index.d.ts +2 -1
- package/dist_ts/index.js +3 -2
- package/dist_ts/interfaces.d.ts +31 -9
- package/dist_ts/interfaces.flexharness.d.ts +14 -0
- package/dist_ts/interfaces.js +3 -3
- package/dist_ts/plugins.d.ts +6 -4
- package/dist_ts/plugins.js +10 -11
- package/dist_ts/utils.harnessoptions.d.ts +3 -1
- package/dist_ts/utils.harnessoptions.js +15 -2
- package/dist_ts/utils.json.d.ts +9 -1
- package/dist_ts/utils.json.js +92 -33
- package/dist_ts/utils.storecodecs.d.ts +1 -1
- package/dist_ts/utils.storecodecs.js +4 -4
- package/dist_ts/utils.storerules.d.ts +3 -3
- package/dist_ts/utils.storerules.js +1 -14
- package/dist_ts_mcp/index.d.ts +3 -1
- package/dist_ts_mcp/index.js +17 -2
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +18 -6
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +27 -16
- package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +33 -3
- package/dist_ts_stores_nosqldb/classes.recordstore.js +78 -18
- package/dist_ts_stores_nosqldb/index.d.ts +2 -2
- package/dist_ts_stores_nosqldb/index.js +2 -2
- package/package.json +3 -3
- package/readme.md +8 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.codesandbox.ts +132 -276
- package/ts/classes.codesandbox.worker.ts +345 -0
- package/ts/classes.flexharness.callbacks.ts +207 -55
- package/ts/classes.flexharness.core.ts +22 -16
- package/ts/classes.flexharness.results.ts +3 -3
- package/ts/classes.flexharness.reversions.ts +43 -32
- package/ts/classes.flexharness.runs.ts +6 -2
- package/ts/classes.flexharness.tooldispatch.ts +23 -7
- package/ts/classes.stores.ts +21 -12
- package/ts/errors.ts +14 -0
- package/ts/index.ts +7 -1
- package/ts/interfaces.flexharness.ts +15 -0
- package/ts/interfaces.ts +32 -9
- package/ts/plugins.ts +9 -12
- package/ts/readme.md +8 -2
- package/ts/utils.harnessoptions.ts +22 -0
- package/ts/utils.json.ts +112 -35
- package/ts/utils.storecodecs.ts +3 -3
- package/ts/utils.storerules.ts +3 -24
- package/ts_mcp/index.ts +17 -1
- package/ts_mcp/readme.md +3 -1
- package/ts_stores_nosqldb/classes.nosqldbstores.ts +39 -15
- package/ts_stores_nosqldb/classes.recordstore.ts +105 -13
- package/ts_stores_nosqldb/index.ts +2 -0
- package/ts_stores_nosqldb/readme.md +10 -2
|
@@ -1,102 +1,24 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { FlexHarnessValidationError } from './errors.js';
|
|
3
|
-
|
|
3
|
+
import { maxTransferMetadataBytes, truncateUtf8 } from './utils.transfer.js';
|
|
4
4
|
/** How long calls in flight get to settle after their program stopped and their signal aborted. */
|
|
5
5
|
const stopGraceMs = 5_000;
|
|
6
|
-
const programPrefix = 'globalThis.__flexMain = async function () {\n';
|
|
7
|
-
const programSuffix = '\n};';
|
|
8
6
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* How long a program may compute past its time before the host ends its worker. QuickJS checks the
|
|
8
|
+
* time only at its interrupt points, and native work between two of them, such as sorting a large
|
|
9
|
+
* array many times over, can run far longer.
|
|
11
10
|
*/
|
|
12
|
-
const
|
|
13
|
-
(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
delete globalThis.__flexCall;
|
|
18
|
-
delete globalThis.__flexLog;
|
|
19
|
-
delete globalThis.__flexDone;
|
|
20
|
-
class ApiError extends Error {
|
|
21
|
-
constructor(details) {
|
|
22
|
-
const message = details && typeof details.message === 'string' ? details.message : JSON.stringify(details);
|
|
23
|
-
super(message);
|
|
24
|
-
this.name = 'ApiError';
|
|
25
|
-
this.details = details;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
const invoke = (path, args) => {
|
|
29
|
-
if (!path) return Promise.reject(new TypeError('Call a method as api.<namespace>.<method>(params).'));
|
|
30
|
-
let params;
|
|
31
|
-
try {
|
|
32
|
-
// api.results.get(handle, { page, path }) reads a stored result.
|
|
33
|
-
const argument = path === 'results.get' && typeof args[0] === 'string'
|
|
34
|
-
? Object.assign({}, args[1], { handle: args[0] })
|
|
35
|
-
: args[0];
|
|
36
|
-
params = JSON.stringify(args.length === 0 || argument === undefined ? {} : argument);
|
|
37
|
-
} catch (error) {
|
|
38
|
-
return Promise.reject(new TypeError('The params of ' + path + ' are not JSON: ' + error.message));
|
|
39
|
-
}
|
|
40
|
-
return call(path, params === undefined ? 'null' : params).then((text) => {
|
|
41
|
-
const outcome = JSON.parse(text);
|
|
42
|
-
if (outcome.ok) return outcome.value;
|
|
43
|
-
throw new ApiError(outcome.error);
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
const target = (path) => new Proxy(function () {}, {
|
|
47
|
-
get: (_target, key) => typeof key === 'string' && key !== 'then' ? target(path ? path + '.' + key : key) : undefined,
|
|
48
|
-
apply: (_target, _this, args) => invoke(path, args),
|
|
49
|
-
set: () => false,
|
|
50
|
-
defineProperty: () => false,
|
|
51
|
-
deleteProperty: () => false,
|
|
52
|
-
});
|
|
53
|
-
const format = (value) => {
|
|
54
|
-
if (typeof value === 'string') return value;
|
|
55
|
-
try {
|
|
56
|
-
const text = JSON.stringify(value);
|
|
57
|
-
return text === undefined ? String(value) : text;
|
|
58
|
-
} catch {
|
|
59
|
-
return String(value);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
const writer = (level) => (...values) => { log(level, values.map(format).join(' ')); };
|
|
63
|
-
const fixed = (value) => ({ value, enumerable: false, writable: false, configurable: false });
|
|
64
|
-
Object.defineProperty(globalThis, 'api', fixed(target('')));
|
|
65
|
-
Object.defineProperty(globalThis, 'ApiError', fixed(ApiError));
|
|
66
|
-
Object.defineProperty(globalThis, 'console', fixed(Object.freeze({
|
|
67
|
-
log: writer('log'), info: writer('info'), warn: writer('warn'), error: writer('error'), debug: writer('debug'),
|
|
68
|
-
})));
|
|
69
|
-
const settle = (value) => {
|
|
70
|
-
try {
|
|
71
|
-
const text = JSON.stringify({ ok: true, value: value === undefined ? null : value });
|
|
72
|
-
return text === undefined ? JSON.stringify({ ok: true, value: null }) : text;
|
|
73
|
-
} catch (error) {
|
|
74
|
-
return JSON.stringify({ ok: false, name: 'TypeError', message: 'The return value is not JSON: ' + error.message });
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const fail = (error) => JSON.stringify({
|
|
78
|
-
ok: false,
|
|
79
|
-
name: error && typeof error.name === 'string' ? error.name : 'Error',
|
|
80
|
-
message: error && typeof error.message === 'string' ? error.message : String(error),
|
|
81
|
-
stack: error && typeof error.stack === 'string' ? error.stack : '',
|
|
82
|
-
...(error instanceof ApiError ? { details: error.details } : {}),
|
|
83
|
-
});
|
|
84
|
-
Object.defineProperty(globalThis, '__flexStart', {
|
|
85
|
-
configurable: true,
|
|
86
|
-
value: () => {
|
|
87
|
-
const main = globalThis.__flexMain;
|
|
88
|
-
delete globalThis.__flexStart;
|
|
89
|
-
delete globalThis.__flexMain;
|
|
90
|
-
main().then(settle, fail).then(done);
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
})();
|
|
94
|
-
`;
|
|
11
|
+
const cpuGraceMs = 250;
|
|
12
|
+
const programPrefix = 'globalThis.__flexMain = async function () {\n';
|
|
13
|
+
const programSuffix = '\n};';
|
|
14
|
+
/** The worker module beside this one, compiled or, where the package runs uncompiled, its source. */
|
|
15
|
+
const workerUrl = new URL(`./classes.codesandbox.worker${plugins.path.extname(import.meta.url)}`, import.meta.url);
|
|
95
16
|
let enginePromise;
|
|
96
17
|
/**
|
|
97
|
-
* Runs `run_code` programs in QuickJS-ng compiled to WebAssembly: every program in a
|
|
98
|
-
* instance of its own, with no globals beyond the language, `api`, `ApiError` and
|
|
99
|
-
* every limit of `IFlexCodeModeLimits` enforced. Program types are stripped with amaro
|
|
18
|
+
* Runs `run_code` programs in QuickJS-ng compiled to WebAssembly: every program in a worker thread and
|
|
19
|
+
* WebAssembly instance of its own, with no globals beyond the language, `api`, `ApiError` and
|
|
20
|
+
* `console`, and every limit of `IFlexCodeModeLimits` enforced. Program types are stripped with amaro
|
|
21
|
+
* first.
|
|
100
22
|
*/
|
|
101
23
|
export class FlexCodeSandbox {
|
|
102
24
|
engine;
|
|
@@ -122,27 +44,26 @@ class CodeRun {
|
|
|
122
44
|
host;
|
|
123
45
|
limits;
|
|
124
46
|
signal;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
47
|
+
worker;
|
|
48
|
+
terminated;
|
|
49
|
+
program = '';
|
|
128
50
|
calls = new AbortController();
|
|
129
51
|
queue = [];
|
|
130
52
|
/** Host calls in flight; the run settles only after every one of them did. */
|
|
131
53
|
inFlight = new Set();
|
|
132
54
|
running = 0;
|
|
133
55
|
callCount = 0;
|
|
56
|
+
/** Requests the worker has not finished computing on: while there are any, the watchdog runs. */
|
|
57
|
+
busy = 0;
|
|
58
|
+
/** What the program computed by the worker's last report. */
|
|
134
59
|
cpuMs = 0;
|
|
135
|
-
|
|
60
|
+
watchdog;
|
|
136
61
|
stop;
|
|
137
62
|
logs = '';
|
|
138
|
-
logBytes = 0;
|
|
139
|
-
logsCut = false;
|
|
140
63
|
settle;
|
|
141
64
|
reject;
|
|
142
65
|
/** The outcome is decided; the run waits for its calls in flight, then settles. */
|
|
143
66
|
closing = false;
|
|
144
|
-
finished = false;
|
|
145
|
-
broken = false;
|
|
146
67
|
wallTimer;
|
|
147
68
|
startedAt = performance.now();
|
|
148
69
|
constructor(engine, source, host, limits, signal) {
|
|
@@ -178,125 +99,92 @@ class CodeRun {
|
|
|
178
99
|
const onAbort = () => this.halt({ kind: 'aborted', message: 'The program was stopped.' });
|
|
179
100
|
this.signal?.addEventListener('abort', onAbort, { once: true });
|
|
180
101
|
try {
|
|
181
|
-
const module = await this.engine.newModule();
|
|
182
|
-
// QuickJS runs on the host's stack too: start it from a fresh, shallow one.
|
|
183
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
184
102
|
if (this.signal?.aborted)
|
|
185
103
|
onAbort();
|
|
186
|
-
else
|
|
187
|
-
this.
|
|
188
|
-
this.boot(module);
|
|
189
|
-
}
|
|
104
|
+
else
|
|
105
|
+
this.spawn();
|
|
190
106
|
return await outcome;
|
|
191
107
|
}
|
|
192
108
|
finally {
|
|
193
109
|
this.signal?.removeEventListener('abort', onAbort);
|
|
194
|
-
this.dispose();
|
|
110
|
+
await this.dispose();
|
|
195
111
|
}
|
|
196
112
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
const vm = runtime.newContext();
|
|
205
|
-
this.vm = vm;
|
|
206
|
-
this.define('__flexCall', (pathHandle, paramsHandle) => this.bridgeCall(vm.getString(pathHandle), vm.getString(paramsHandle)));
|
|
207
|
-
this.define('__flexLog', (levelHandle, textHandle) => {
|
|
208
|
-
this.log(vm.getString(levelHandle), vm.getString(textHandle));
|
|
113
|
+
spawn() {
|
|
114
|
+
const worker = new plugins.Worker(workerUrl);
|
|
115
|
+
this.worker = worker;
|
|
116
|
+
worker.on('message', (report) => this.receive(report));
|
|
117
|
+
worker.on('error', (error) => this.halt({ kind: 'host', error }));
|
|
118
|
+
worker.on('exit', (code) => {
|
|
119
|
+
this.halt({ kind: 'host', error: new Error(`The code mode worker exited with code ${code}.`) });
|
|
209
120
|
});
|
|
210
|
-
this.define('__flexDone', (textHandle) => {
|
|
211
|
-
this.complete(vm.getString(textHandle));
|
|
212
|
-
});
|
|
213
|
-
if (!this.evaluate(prelude, 'prelude.js', 'prelude'))
|
|
214
|
-
return;
|
|
215
|
-
if (!this.evaluate(this.program, programFile, 'parse'))
|
|
216
|
-
return;
|
|
217
|
-
if (!this.evaluate('__flexStart();', 'start.js', 'program'))
|
|
218
|
-
return;
|
|
219
|
-
this.pump();
|
|
220
121
|
}
|
|
221
|
-
|
|
222
|
-
const handle = this.vm.newFunction(name, implementation);
|
|
223
|
-
this.vm.setProp(this.vm.global, name, handle);
|
|
224
|
-
handle.dispose();
|
|
225
|
-
}
|
|
226
|
-
evaluate(code, file, phase) {
|
|
122
|
+
receive(report) {
|
|
227
123
|
if (this.closing)
|
|
228
|
-
return false;
|
|
229
|
-
let result;
|
|
230
|
-
this.enter();
|
|
231
|
-
try {
|
|
232
|
-
result = this.vm.evalCode(code, file);
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
this.hostThrow(error);
|
|
236
|
-
return false;
|
|
237
|
-
}
|
|
238
|
-
finally {
|
|
239
|
-
this.leave();
|
|
240
|
-
}
|
|
241
|
-
if (result.error) {
|
|
242
|
-
this.failWith(result.error, phase);
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
result.value.dispose();
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
/** Runs the program's pending jobs after a call settled or the program started. */
|
|
249
|
-
pump() {
|
|
250
|
-
if (this.closing || !this.runtime?.alive)
|
|
251
124
|
return;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
125
|
+
switch (report.kind) {
|
|
126
|
+
case 'ready':
|
|
127
|
+
this.armWallTimer();
|
|
128
|
+
this.send({
|
|
129
|
+
kind: 'start',
|
|
130
|
+
program: this.program,
|
|
131
|
+
limits: {
|
|
132
|
+
cpuMs: this.limits.cpuMs,
|
|
133
|
+
memoryBytes: this.limits.memoryBytes,
|
|
134
|
+
stackBytes: this.limits.stackBytes,
|
|
135
|
+
maxLogBytes: this.limits.maxLogBytes,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
return;
|
|
139
|
+
case 'call':
|
|
140
|
+
this.call(report.id, report.method, report.params);
|
|
141
|
+
return;
|
|
142
|
+
case 'log':
|
|
143
|
+
this.logs += report.text;
|
|
144
|
+
return;
|
|
145
|
+
case 'idle':
|
|
146
|
+
this.idle(report.cpuMs);
|
|
147
|
+
return;
|
|
148
|
+
case 'done':
|
|
149
|
+
this.complete(report.text, report.unawaited);
|
|
150
|
+
return;
|
|
151
|
+
case 'failed':
|
|
152
|
+
if (report.phase === 'prelude') {
|
|
153
|
+
this.halt({ kind: 'host', error: new Error(`The code mode prelude failed: ${report.dumped}`) });
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
this.done(this.failure(this.classify(report, report.phase)));
|
|
157
|
+
return;
|
|
158
|
+
case 'stopped':
|
|
159
|
+
this.halt(report.limit === 'cpu'
|
|
160
|
+
? this.cpuLimit()
|
|
161
|
+
: { kind: 'limit', limit: 'stack', message: 'The program exceeded its stack.' });
|
|
162
|
+
return;
|
|
263
163
|
}
|
|
264
|
-
if (result.error)
|
|
265
|
-
this.failWith(result.error, 'program');
|
|
266
164
|
}
|
|
267
|
-
/**
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
this.broken = true;
|
|
273
|
-
if (error instanceof RangeError) {
|
|
274
|
-
this.halt({ kind: 'limit', limit: 'stack', message: 'The program exceeded its stack.' });
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
this.halt({ kind: 'host', error });
|
|
165
|
+
/** Has the worker compute: start the program, or go on with an answer. */
|
|
166
|
+
send(request) {
|
|
167
|
+
this.busy += 1;
|
|
168
|
+
this.worker.postMessage(request);
|
|
169
|
+
this.armWatchdog();
|
|
278
170
|
}
|
|
279
|
-
|
|
280
|
-
this.
|
|
171
|
+
idle(cpuMs) {
|
|
172
|
+
this.cpuMs = cpuMs;
|
|
173
|
+
this.busy -= 1;
|
|
174
|
+
clearTimeout(this.watchdog);
|
|
175
|
+
this.watchdog = undefined;
|
|
176
|
+
this.armWatchdog();
|
|
281
177
|
}
|
|
282
|
-
|
|
283
|
-
|
|
178
|
+
/** While the worker computes, ends it once the program's time and `cpuGraceMs` are up. */
|
|
179
|
+
armWatchdog() {
|
|
180
|
+
if (this.watchdog || this.busy === 0)
|
|
284
181
|
return;
|
|
285
|
-
this.
|
|
286
|
-
this.enteredAt = undefined;
|
|
182
|
+
this.watchdog = setTimeout(() => this.halt(this.cpuLimit()), Math.max(0, this.limits.cpuMs - this.cpuMs) + cpuGraceMs);
|
|
287
183
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
return true;
|
|
291
|
-
if (this.enteredAt !== undefined && this.cpuMs + performance.now() - this.enteredAt > this.limits.cpuMs) {
|
|
292
|
-
this.stop = { kind: 'limit', limit: 'cpu', message: `The program computed for more than ${this.limits.cpuMs} ms.` };
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
return false;
|
|
184
|
+
cpuLimit() {
|
|
185
|
+
return { kind: 'limit', limit: 'cpu', message: `The program computed for more than ${this.limits.cpuMs} ms.` };
|
|
296
186
|
}
|
|
297
|
-
|
|
298
|
-
const deferred = this.vm.newPromise();
|
|
299
|
-
this.deferreds.add(deferred);
|
|
187
|
+
call(id, method, paramsText) {
|
|
300
188
|
this.callCount += 1;
|
|
301
189
|
if (this.callCount > this.limits.maxCalls) {
|
|
302
190
|
this.halt({
|
|
@@ -304,7 +192,7 @@ class CodeRun {
|
|
|
304
192
|
limit: 'calls',
|
|
305
193
|
message: `The program made more than ${this.limits.maxCalls} calls.`,
|
|
306
194
|
});
|
|
307
|
-
return
|
|
195
|
+
return;
|
|
308
196
|
}
|
|
309
197
|
let params;
|
|
310
198
|
try {
|
|
@@ -317,14 +205,20 @@ class CodeRun {
|
|
|
317
205
|
if (this.closing)
|
|
318
206
|
return;
|
|
319
207
|
this.running += 1;
|
|
320
|
-
// A settled call
|
|
208
|
+
// A settled call leaves the calls in flight before its outcome is handled, which may end the run.
|
|
321
209
|
const settled = () => {
|
|
322
210
|
this.running -= 1;
|
|
323
211
|
this.inFlight.delete(call);
|
|
324
212
|
};
|
|
325
213
|
const call = this.host.call(method, params, this.calls.signal).then((outcome) => {
|
|
326
214
|
settled();
|
|
327
|
-
|
|
215
|
+
if ('limit' in outcome) {
|
|
216
|
+
// The host did not make the call.
|
|
217
|
+
this.callCount -= 1;
|
|
218
|
+
this.halt({ kind: 'limit', limit: outcome.limit, message: outcome.message });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.answer(id, outcome);
|
|
328
222
|
}, (error) => {
|
|
329
223
|
settled();
|
|
330
224
|
this.halt({ kind: 'host', error });
|
|
@@ -335,10 +229,9 @@ class CodeRun {
|
|
|
335
229
|
run();
|
|
336
230
|
else
|
|
337
231
|
this.queue.push(run);
|
|
338
|
-
return deferred.handle;
|
|
339
232
|
}
|
|
340
|
-
answer(
|
|
341
|
-
if (this.closing
|
|
233
|
+
answer(id, outcome) {
|
|
234
|
+
if (this.closing)
|
|
342
235
|
return;
|
|
343
236
|
let text;
|
|
344
237
|
try {
|
|
@@ -347,28 +240,9 @@ class CodeRun {
|
|
|
347
240
|
catch {
|
|
348
241
|
text = JSON.stringify({ ok: false, error: { error: 'failed', message: 'The result is not JSON.' } });
|
|
349
242
|
}
|
|
350
|
-
|
|
351
|
-
deferred.resolve(value);
|
|
352
|
-
value.dispose();
|
|
353
|
-
this.deferreds.delete(deferred);
|
|
354
|
-
this.pump();
|
|
243
|
+
this.send({ kind: 'answer', id, text });
|
|
355
244
|
}
|
|
356
|
-
|
|
357
|
-
if (this.logsCut || this.closing)
|
|
358
|
-
return;
|
|
359
|
-
const line = `${level === 'log' ? '' : `[${level}] `}${text}\n`;
|
|
360
|
-
const bytes = Buffer.byteLength(line, 'utf8');
|
|
361
|
-
if (this.logBytes + bytes > this.limits.maxLogBytes) {
|
|
362
|
-
this.logsCut = true;
|
|
363
|
-
this.logs += '[console output cut off]\n';
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
this.logBytes += bytes;
|
|
367
|
-
this.logs += line;
|
|
368
|
-
}
|
|
369
|
-
complete(text) {
|
|
370
|
-
if (this.closing)
|
|
371
|
-
return;
|
|
245
|
+
complete(text, unawaited) {
|
|
372
246
|
let outcome;
|
|
373
247
|
try {
|
|
374
248
|
outcome = JSON.parse(text);
|
|
@@ -377,7 +251,6 @@ class CodeRun {
|
|
|
377
251
|
outcome = { ok: false, name: 'Error', message: 'The program ended without a result.' };
|
|
378
252
|
}
|
|
379
253
|
if (outcome.ok) {
|
|
380
|
-
const unawaited = this.running + this.queue.length;
|
|
381
254
|
if (unawaited > 0) {
|
|
382
255
|
// Calls the program did not await are not part of its result: it fails, and proposes nothing.
|
|
383
256
|
this.done(this.failure({
|
|
@@ -396,36 +269,10 @@ class CodeRun {
|
|
|
396
269
|
}
|
|
397
270
|
this.done(this.failure(this.classify(outcome, 'program')));
|
|
398
271
|
}
|
|
399
|
-
failWith(handle, phase) {
|
|
400
|
-
let dumped;
|
|
401
|
-
// Reading the thrown value can run program code, such as a toJSON: it counts as computing.
|
|
402
|
-
this.enter();
|
|
403
|
-
try {
|
|
404
|
-
dumped = this.vm.dump(handle);
|
|
405
|
-
}
|
|
406
|
-
catch (error) {
|
|
407
|
-
if (!(error instanceof Error) || error instanceof RangeError)
|
|
408
|
-
this.broken = true;
|
|
409
|
-
dumped = undefined;
|
|
410
|
-
}
|
|
411
|
-
finally {
|
|
412
|
-
this.leave();
|
|
413
|
-
if (!this.broken && handle.alive)
|
|
414
|
-
handle.dispose();
|
|
415
|
-
}
|
|
416
|
-
if (phase === 'prelude' && !this.stop) {
|
|
417
|
-
this.halt({ kind: 'host', error: new Error(`The code mode prelude failed: ${JSON.stringify(dumped)}`) });
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
const error = (dumped && typeof dumped === 'object' ? dumped : { message: String(dumped) });
|
|
421
|
-
this.done(this.failure(this.classify(error, phase)));
|
|
422
|
-
}
|
|
423
272
|
classify(error, phase) {
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
return { error: 'aborted', message: this.stop.message };
|
|
428
|
-
const message = typeof error.message === 'string' ? error.message : 'The program failed.';
|
|
273
|
+
const message = typeof error.message === 'string'
|
|
274
|
+
? truncateUtf8(error.message, maxTransferMetadataBytes)
|
|
275
|
+
: 'The program failed.';
|
|
429
276
|
if (error.name === 'InternalError' && message === 'out of memory') {
|
|
430
277
|
return { error: 'limit_exceeded', limit: 'memory', message: `The program used more than ${this.limits.memoryBytes} bytes of memory.` };
|
|
431
278
|
}
|
|
@@ -433,13 +280,11 @@ class CodeRun {
|
|
|
433
280
|
|| (error.name === 'RangeError' && message === 'Maximum call stack size exceeded')) {
|
|
434
281
|
return { error: 'limit_exceeded', limit: 'stack', message: 'The program exceeded its stack.' };
|
|
435
282
|
}
|
|
436
|
-
|
|
437
|
-
return { error: 'limit_exceeded', limit: 'cpu', message: `The program computed for more than ${this.limits.cpuMs} ms.` };
|
|
438
|
-
}
|
|
283
|
+
// The worker evaluates the program's text as program.ts.
|
|
439
284
|
const line = /program\.ts:(\d+)/.exec(error.stack ?? '')?.[1];
|
|
440
285
|
return {
|
|
441
286
|
error: phase === 'parse' && error.name === 'SyntaxError' ? 'syntax_error' : 'program_error',
|
|
442
|
-
...(typeof error.name === 'string' ? { name: error.name } : {}),
|
|
287
|
+
...(typeof error.name === 'string' ? { name: truncateUtf8(error.name, maxTransferMetadataBytes) } : {}),
|
|
443
288
|
message,
|
|
444
289
|
...(line && Number(line) > 1 ? { line: Number(line) - 1 } : {}),
|
|
445
290
|
};
|
|
@@ -472,17 +317,18 @@ class CodeRun {
|
|
|
472
317
|
this.close(() => this.settle(result));
|
|
473
318
|
}
|
|
474
319
|
/**
|
|
475
|
-
* Decides the run's outcome. Calls not started yet never start. Calls
|
|
476
|
-
* through their signal, and the outcome is delivered once they settled,
|
|
477
|
-
* its program; a host call that ignores its signal gets `stopGraceMs`, and
|
|
320
|
+
* Decides the run's outcome and ends the program's worker. Calls not started yet never start. Calls
|
|
321
|
+
* in flight are told to stop through their signal, and the outcome is delivered once they settled,
|
|
322
|
+
* so no call runs on after its program; a host call that ignores its signal gets `stopGraceMs`, and
|
|
323
|
+
* its answer is dropped.
|
|
478
324
|
*/
|
|
479
325
|
close(deliver) {
|
|
480
326
|
if (this.closing)
|
|
481
327
|
return;
|
|
482
328
|
this.closing = true;
|
|
483
329
|
this.queue.length = 0;
|
|
330
|
+
void this.terminate();
|
|
484
331
|
if (this.inFlight.size === 0) {
|
|
485
|
-
this.finished = true;
|
|
486
332
|
deliver();
|
|
487
333
|
return;
|
|
488
334
|
}
|
|
@@ -495,7 +341,6 @@ class CodeRun {
|
|
|
495
341
|
}),
|
|
496
342
|
]).then(() => {
|
|
497
343
|
clearTimeout(grace);
|
|
498
|
-
this.finished = true;
|
|
499
344
|
deliver();
|
|
500
345
|
});
|
|
501
346
|
}
|
|
@@ -512,32 +357,19 @@ class CodeRun {
|
|
|
512
357
|
};
|
|
513
358
|
this.wallTimer = setTimeout(check, Math.max(10, Math.min(250, this.limits.wallMs)));
|
|
514
359
|
}
|
|
515
|
-
/**
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
360
|
+
/** Ends the program's worker, whatever it computes, which frees its WebAssembly instance with it. */
|
|
361
|
+
terminate() {
|
|
362
|
+
clearTimeout(this.watchdog);
|
|
363
|
+
this.terminated ??= this.worker?.terminate() ?? Promise.resolve();
|
|
364
|
+
return this.terminated;
|
|
365
|
+
}
|
|
366
|
+
async dispose() {
|
|
521
367
|
this.closing = true;
|
|
522
|
-
this.finished = true;
|
|
523
368
|
if (this.wallTimer)
|
|
524
369
|
clearTimeout(this.wallTimer);
|
|
525
370
|
this.queue.length = 0;
|
|
526
371
|
this.calls.abort();
|
|
527
|
-
|
|
528
|
-
return;
|
|
529
|
-
try {
|
|
530
|
-
for (const deferred of this.deferreds)
|
|
531
|
-
if (deferred.alive)
|
|
532
|
-
deferred.dispose();
|
|
533
|
-
this.deferreds.clear();
|
|
534
|
-
this.vm?.dispose();
|
|
535
|
-
if (this.runtime?.alive)
|
|
536
|
-
this.runtime.dispose();
|
|
537
|
-
}
|
|
538
|
-
catch {
|
|
539
|
-
this.broken = true;
|
|
540
|
-
}
|
|
372
|
+
await this.terminate();
|
|
541
373
|
}
|
|
542
374
|
}
|
|
543
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2Rlc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuY29kZXNhbmRib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBeUJ6RCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsbUdBQW1HO0FBQ25HLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUkxQixNQUFNLGFBQWEsR0FBRywrQ0FBK0MsQ0FBQztBQUN0RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFFN0I7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrRmYsQ0FBQztBQUVGLElBQUksYUFBOEQsQ0FBQztBQUVuRTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDVyxNQUFNO0lBQTNDLFlBQXFDLE1BQWtDO3NCQUFsQyxNQUFNO0lBQStCLENBQUM7SUFFM0UsaURBQWlEO0lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUN0QixhQUFhLEtBQUssT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDM0UsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMxQixNQUFNLElBQUksMEJBQTBCLENBQ2xDLDhEQUE4RDtrQkFDMUQsbURBQW1ELEVBQ3ZELEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUNqQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksZUFBZSxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLEdBQUcsQ0FD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
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2Rlc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuY29kZXNhbmRib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQThCN0UsbUdBQW1HO0FBQ25HLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRXZCLE1BQU0sYUFBYSxHQUFHLCtDQUErQyxDQUFDO0FBQ3RFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QixxR0FBcUc7QUFDckcsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsK0JBQStCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFbkgsSUFBSSxhQUE4RCxDQUFDO0FBRW5FOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDVyxNQUFNO0lBQTNDLFlBQXFDLE1BQWtDO3NCQUFsQyxNQUFNO0lBQStCLENBQUM7SUFFM0UsaURBQWlEO0lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUN0QixhQUFhLEtBQUssT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDM0UsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMxQixNQUFNLElBQUksMEJBQTBCLENBQ2xDLDhEQUE4RDtrQkFDMUQsbURBQW1ELEVBQ3ZELEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUNq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
|