@milaboratories/pframes-rs-wasm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4561 @@
1
+ "use jco";import { environment, exit as exit$1, stderr, stdin, stdout, terminalInput, terminalOutput, terminalStderr, terminalStdin, terminalStdout } from '@bytecodealliance/preview2-shim/cli';
2
+ import { error, poll, streams } from '@bytecodealliance/preview2-shim/io';
3
+ import { insecureSeed as insecureSeed$1, random } from '@bytecodealliance/preview2-shim/random';
4
+ const { getEnvironment } = environment;
5
+ getEnvironment._isHostProvided = true;
6
+
7
+ if (getEnvironment=== undefined) {
8
+ const err = new Error("unexpectedly undefined local import 'getEnvironment', was 'getEnvironment' available at instantiation?");
9
+ console.error("ERROR:", err.toString());
10
+ throw err;
11
+ }
12
+
13
+ const { exit } = exit$1;
14
+ exit._isHostProvided = true;
15
+
16
+ if (exit=== undefined) {
17
+ const err = new Error("unexpectedly undefined local import 'exit', was 'exit' available at instantiation?");
18
+ console.error("ERROR:", err.toString());
19
+ throw err;
20
+ }
21
+
22
+ const { getStderr } = stderr;
23
+ getStderr._isHostProvided = true;
24
+
25
+ if (getStderr=== undefined) {
26
+ const err = new Error("unexpectedly undefined local import 'getStderr', was 'getStderr' available at instantiation?");
27
+ console.error("ERROR:", err.toString());
28
+ throw err;
29
+ }
30
+
31
+ const { getStdin } = stdin;
32
+ getStdin._isHostProvided = true;
33
+
34
+ if (getStdin=== undefined) {
35
+ const err = new Error("unexpectedly undefined local import 'getStdin', was 'getStdin' available at instantiation?");
36
+ console.error("ERROR:", err.toString());
37
+ throw err;
38
+ }
39
+
40
+ const { getStdout } = stdout;
41
+ getStdout._isHostProvided = true;
42
+
43
+ if (getStdout=== undefined) {
44
+ const err = new Error("unexpectedly undefined local import 'getStdout', was 'getStdout' available at instantiation?");
45
+ console.error("ERROR:", err.toString());
46
+ throw err;
47
+ }
48
+
49
+ const { TerminalInput } = terminalInput;
50
+ TerminalInput._isHostProvided = true;
51
+
52
+ if (TerminalInput=== undefined) {
53
+ const err = new Error("unexpectedly undefined local import 'TerminalInput', was 'TerminalInput' available at instantiation?");
54
+ console.error("ERROR:", err.toString());
55
+ throw err;
56
+ }
57
+
58
+ const { TerminalOutput } = terminalOutput;
59
+ TerminalOutput._isHostProvided = true;
60
+
61
+ if (TerminalOutput=== undefined) {
62
+ const err = new Error("unexpectedly undefined local import 'TerminalOutput', was 'TerminalOutput' available at instantiation?");
63
+ console.error("ERROR:", err.toString());
64
+ throw err;
65
+ }
66
+
67
+ const { getTerminalStderr } = terminalStderr;
68
+ getTerminalStderr._isHostProvided = true;
69
+
70
+ if (getTerminalStderr=== undefined) {
71
+ const err = new Error("unexpectedly undefined local import 'getTerminalStderr', was 'getTerminalStderr' available at instantiation?");
72
+ console.error("ERROR:", err.toString());
73
+ throw err;
74
+ }
75
+
76
+ const { getTerminalStdin } = terminalStdin;
77
+ getTerminalStdin._isHostProvided = true;
78
+
79
+ if (getTerminalStdin=== undefined) {
80
+ const err = new Error("unexpectedly undefined local import 'getTerminalStdin', was 'getTerminalStdin' available at instantiation?");
81
+ console.error("ERROR:", err.toString());
82
+ throw err;
83
+ }
84
+
85
+ const { getTerminalStdout } = terminalStdout;
86
+ getTerminalStdout._isHostProvided = true;
87
+
88
+ if (getTerminalStdout=== undefined) {
89
+ const err = new Error("unexpectedly undefined local import 'getTerminalStdout', was 'getTerminalStdout' available at instantiation?");
90
+ console.error("ERROR:", err.toString());
91
+ throw err;
92
+ }
93
+
94
+ const { Error: Error$1 } = error;
95
+ Error$1._isHostProvided = true;
96
+
97
+ if (Error$1=== undefined) {
98
+ const err = new Error("unexpectedly undefined local import 'Error$1', was 'Error' available at instantiation?");
99
+ console.error("ERROR:", err.toString());
100
+ throw err;
101
+ }
102
+
103
+ const { Pollable } = poll;
104
+ Pollable._isHostProvided = true;
105
+
106
+ if (Pollable=== undefined) {
107
+ const err = new Error("unexpectedly undefined local import 'Pollable', was 'Pollable' available at instantiation?");
108
+ console.error("ERROR:", err.toString());
109
+ throw err;
110
+ }
111
+
112
+ const { InputStream,
113
+ OutputStream } = streams;
114
+ InputStream._isHostProvided = true;
115
+
116
+ if (InputStream=== undefined) {
117
+ const err = new Error("unexpectedly undefined local import 'InputStream', was 'InputStream' available at instantiation?");
118
+ console.error("ERROR:", err.toString());
119
+ throw err;
120
+ }
121
+
122
+ OutputStream._isHostProvided = true;
123
+
124
+ if (OutputStream=== undefined) {
125
+ const err = new Error("unexpectedly undefined local import 'OutputStream', was 'OutputStream' available at instantiation?");
126
+ console.error("ERROR:", err.toString());
127
+ throw err;
128
+ }
129
+
130
+ const { insecureSeed } = insecureSeed$1;
131
+ insecureSeed._isHostProvided = true;
132
+
133
+ if (insecureSeed=== undefined) {
134
+ const err = new Error("unexpectedly undefined local import 'insecureSeed', was 'insecureSeed' available at instantiation?");
135
+ console.error("ERROR:", err.toString());
136
+ throw err;
137
+ }
138
+
139
+ const { getRandomU64 } = random;
140
+ getRandomU64._isHostProvided = true;
141
+
142
+ if (getRandomU64=== undefined) {
143
+ const err = new Error("unexpectedly undefined local import 'getRandomU64', was 'getRandomU64' available at instantiation?");
144
+ console.error("ERROR:", err.toString());
145
+ throw err;
146
+ }
147
+
148
+
149
+ const emptyFunc = () => {};
150
+
151
+ let dv = new DataView(new ArrayBuffer());
152
+ const dataView = mem => dv.buffer === mem.buffer ? dv : dv = new DataView(mem.buffer);
153
+
154
+ const toUint64 = val => BigInt.asUintN(64, BigInt(val));
155
+ const TEXT_DECODER_UTF8 = new TextDecoder();
156
+ const TEXT_ENCODER_UTF8 = new TextEncoder();
157
+
158
+ function _utf8AllocateAndEncode(s, realloc, memory) {
159
+ if (typeof s !== 'string') {
160
+ throw new TypeError('expected a string, received [' + typeof s + ']');
161
+ }
162
+ if (s.length === 0) { return { ptr: 1, len: 0 }; }
163
+ let buf = TEXT_ENCODER_UTF8.encode(s);
164
+ let ptr = realloc(0, 0, 1, buf.length);
165
+ new Uint8Array(memory.buffer).set(buf, ptr);
166
+ return { ptr, len: buf.length, codepoints: [...s].length };
167
+ }
168
+
169
+
170
+ const T_FLAG = 1 << 30;
171
+
172
+ function rscTableCreateOwn (table, rep) {
173
+ const free = table[0] & ~T_FLAG;
174
+ if (free === 0) {
175
+ table.push(0);
176
+ table.push(rep | T_FLAG);
177
+ return (table.length >> 1) - 1;
178
+ }
179
+ table[0] = table[free << 1];
180
+ table[free << 1] = 0;
181
+ table[(free << 1) + 1] = rep | T_FLAG;
182
+ return free;
183
+ }
184
+
185
+ function rscTableRemove (table, handle) {
186
+ const scope = table[handle << 1];
187
+ const val = table[(handle << 1) + 1];
188
+ const own = (val & T_FLAG) !== 0;
189
+ const rep = val & ~T_FLAG;
190
+ if (val === 0 || (scope & T_FLAG) !== 0) throw new TypeError('Invalid handle');
191
+ table[handle << 1] = table[0] | T_FLAG;
192
+ table[0] = handle | T_FLAG;
193
+ return { rep, scope, own };
194
+ }
195
+
196
+ let curResourceBorrows = [];
197
+
198
+ function getCurrentTask(componentIdx) {
199
+ if (componentIdx === undefined || componentIdx === null) {
200
+ throw new Error('missing/invalid component instance index [' + componentIdx + '] while getting current task');
201
+ }
202
+ const tasks = ASYNC_TASKS_BY_COMPONENT_IDX.get(componentIdx);
203
+ if (tasks === undefined) { return undefined; }
204
+ if (tasks.length === 0) { return undefined; }
205
+ return tasks[tasks.length - 1];
206
+ }
207
+
208
+ function createNewCurrentTask(args) {
209
+ _debugLog('[createNewCurrentTask()] args', args);
210
+ const {
211
+ componentIdx,
212
+ isAsync,
213
+ entryFnName,
214
+ parentSubtaskID,
215
+ callbackFnName,
216
+ getCallbackFn,
217
+ getParamsFn,
218
+ stringEncoding,
219
+ errHandling,
220
+ getCalleeParamsFn,
221
+ resultPtr,
222
+ callingWasmExport,
223
+ } = args;
224
+ if (componentIdx === undefined || componentIdx === null) {
225
+ throw new Error('missing/invalid component instance index while starting task');
226
+ }
227
+ const taskMetas = ASYNC_TASKS_BY_COMPONENT_IDX.get(componentIdx);
228
+ const callbackFn = getCallbackFn ? getCallbackFn() : null;
229
+
230
+ const newTask = new AsyncTask({
231
+ componentIdx,
232
+ isAsync,
233
+ entryFnName,
234
+ callbackFn,
235
+ callbackFnName,
236
+ stringEncoding,
237
+ getCalleeParamsFn,
238
+ resultPtr,
239
+ errHandling,
240
+ });
241
+
242
+ const newTaskID = newTask.id();
243
+ const newTaskMeta = { id: newTaskID, componentIdx, task: newTask };
244
+
245
+ ASYNC_CURRENT_TASK_IDS.push(newTaskID);
246
+ ASYNC_CURRENT_COMPONENT_IDXS.push(componentIdx);
247
+
248
+ if (!taskMetas) {
249
+ ASYNC_TASKS_BY_COMPONENT_IDX.set(componentIdx, [newTaskMeta]);
250
+ } else {
251
+ taskMetas.push(newTaskMeta);
252
+ }
253
+
254
+ return [newTask, newTaskID];
255
+ }
256
+
257
+ function endCurrentTask(componentIdx, taskID) {
258
+ componentIdx ??= ASYNC_CURRENT_COMPONENT_IDXS.at(-1);
259
+ taskID ??= ASYNC_CURRENT_TASK_IDS.at(-1);
260
+ _debugLog('[endCurrentTask()] args', { componentIdx, taskID });
261
+
262
+ if (componentIdx === undefined || componentIdx === null) {
263
+ throw new Error('missing/invalid component instance index while ending current task');
264
+ }
265
+
266
+ const tasks = ASYNC_TASKS_BY_COMPONENT_IDX.get(componentIdx);
267
+ if (!tasks || !Array.isArray(tasks)) {
268
+ throw new Error('missing/invalid tasks for component instance while ending task');
269
+ }
270
+ if (tasks.length == 0) {
271
+ throw new Error('no current task(s) for component instance while ending task');
272
+ }
273
+
274
+ if (taskID) {
275
+ const last = tasks[tasks.length - 1];
276
+ if (last.id !== taskID) {
277
+ // throw new Error('current task does not match expected task ID');
278
+ return;
279
+ }
280
+ }
281
+
282
+ ASYNC_CURRENT_TASK_IDS.pop();
283
+ ASYNC_CURRENT_COMPONENT_IDXS.pop();
284
+
285
+ const taskMeta = tasks.pop();
286
+ return taskMeta.task;
287
+ }
288
+ const ASYNC_TASKS_BY_COMPONENT_IDX = new Map();
289
+ const ASYNC_CURRENT_TASK_IDS = [];
290
+ const ASYNC_CURRENT_COMPONENT_IDXS = [];
291
+
292
+ class AsyncTask {
293
+ static _ID = 0n;
294
+
295
+ static State = {
296
+ INITIAL: 'initial',
297
+ CANCELLED: 'cancelled',
298
+ CANCEL_PENDING: 'cancel-pending',
299
+ CANCEL_DELIVERED: 'cancel-delivered',
300
+ RESOLVED: 'resolved',
301
+ }
302
+
303
+ static BlockResult = {
304
+ CANCELLED: 'block.cancelled',
305
+ NOT_CANCELLED: 'block.not-cancelled',
306
+ }
307
+
308
+ #id;
309
+ #componentIdx;
310
+ #state;
311
+ #isAsync;
312
+ #entryFnName = null;
313
+ #subtasks = [];
314
+
315
+ #onResolveHandlers = [];
316
+ #completionPromise = null;
317
+
318
+ #memoryIdx = null;
319
+
320
+ #callbackFn = null;
321
+ #callbackFnName = null;
322
+
323
+ #postReturnFn = null;
324
+
325
+ #getCalleeParamsFn = null;
326
+
327
+ #stringEncoding = null;
328
+
329
+ #parentSubtask = null;
330
+
331
+ #needsExclusiveLock = false;
332
+
333
+ #errHandling;
334
+
335
+ #backpressurePromise;
336
+ #backpressureWaiters = 0n;
337
+
338
+ #returnLowerFns = null;
339
+
340
+ cancelled = false;
341
+ requested = false;
342
+ alwaysTaskReturn = false;
343
+
344
+ returnCalls = 0;
345
+ storage = [0, 0];
346
+ borrowedHandles = {};
347
+
348
+ awaitableResume = null;
349
+ awaitableCancel = null;
350
+
351
+ constructor(opts) {
352
+ this.#id = ++AsyncTask._ID;
353
+
354
+ if (opts?.componentIdx === undefined) {
355
+ throw new TypeError('missing component id during task creation');
356
+ }
357
+ this.#componentIdx = opts.componentIdx;
358
+
359
+ this.#state = AsyncTask.State.INITIAL;
360
+ this.#isAsync = opts?.isAsync ?? false;
361
+ this.#entryFnName = opts.entryFnName;
362
+
363
+ const {
364
+ promise: completionPromise,
365
+ resolve: resolveCompletionPromise,
366
+ reject: rejectCompletionPromise,
367
+ } = promiseWithResolvers();
368
+ this.#completionPromise = completionPromise;
369
+
370
+ this.#onResolveHandlers.push((results) => {
371
+ resolveCompletionPromise(results);
372
+ })
373
+
374
+ if (opts.callbackFn) { this.#callbackFn = opts.callbackFn; }
375
+ if (opts.callbackFnName) { this.#callbackFnName = opts.callbackFnName; }
376
+
377
+ if (opts.getCalleeParamsFn) { this.#getCalleeParamsFn = opts.getCalleeParamsFn; }
378
+
379
+ if (opts.stringEncoding) { this.#stringEncoding = opts.stringEncoding; }
380
+
381
+ if (opts.parentSubtask) { this.#parentSubtask = opts.parentSubtask; }
382
+
383
+ this.#needsExclusiveLock = this.isSync() || !this.hasCallback();
384
+
385
+ if (opts.errHandling) { this.#errHandling = opts.errHandling; }
386
+ }
387
+
388
+ taskState() { return this.#state; }
389
+ id() { return this.#id; }
390
+ componentIdx() { return this.#componentIdx; }
391
+ isAsync() { return this.#isAsync; }
392
+ entryFnName() { return this.#entryFnName; }
393
+ completionPromise() { return this.#completionPromise; }
394
+
395
+ isAsync() { return this.#isAsync; }
396
+ isSync() { return !this.isAsync(); }
397
+
398
+ getErrHandling() { return this.#errHandling; }
399
+
400
+ hasCallback() { return this.#callbackFn !== null; }
401
+
402
+ setReturnMemoryIdx(idx) { this.#memoryIdx = idx; }
403
+ getReturnMemoryIdx() { return this.#memoryIdx; }
404
+
405
+ setReturnLowerFns(fns) { this.#returnLowerFns = fns; }
406
+ getReturnLowerFns() { return this.#returnLowerFns; }
407
+
408
+ setParentSubtask(subtask) {
409
+ if (!subtask || !(subtask instanceof AsyncSubtask)) { return }
410
+ if (this.#parentSubtask) { throw new Error('parent subtask can only be set once'); }
411
+ this.#parentSubtask = subtask;
412
+ }
413
+
414
+ getParentSubtask() { return this.#parentSubtask; }
415
+
416
+ // TODO(threads): this is very inefficient, we can pass along a root task,
417
+ // and ideally do not need this once thread support is in place
418
+ getRootTask() {
419
+ let currentSubtask = this.getParentSubtask();
420
+ let task = this;
421
+ while (currentSubtask) {
422
+ task = currentSubtask.getParentTask();
423
+ currentSubtask = task.getParentSubtask();
424
+ }
425
+ return task;
426
+ }
427
+
428
+ setPostReturnFn(f) {
429
+ if (!f) { return; }
430
+ if (this.#postReturnFn) { throw new Error('postReturn fn can only be set once'); }
431
+ this.#postReturnFn = f;
432
+ }
433
+
434
+ setCallbackFn(f, name) {
435
+ if (!f) { return; }
436
+ if (this.#callbackFn) { throw new Error('callback fn can only be set once'); }
437
+ this.#callbackFn = f;
438
+ this.#callbackFnName = name;
439
+ }
440
+
441
+ getCallbackFnName() {
442
+ if (!this.#callbackFnName) { return undefined; }
443
+ return this.#callbackFnName;
444
+ }
445
+
446
+ runCallbackFn(...args) {
447
+ if (!this.#callbackFn) { throw new Error('on callback function has been set for task'); }
448
+ return this.#callbackFn.apply(null, args);
449
+ }
450
+
451
+ getCalleeParams() {
452
+ if (!this.#getCalleeParamsFn) { throw new Error('missing/invalid getCalleeParamsFn'); }
453
+ return this.#getCalleeParamsFn();
454
+ }
455
+
456
+ mayEnter(task) {
457
+ const cstate = getOrCreateAsyncState(this.#componentIdx);
458
+ if (cstate.hasBackpressure()) {
459
+ _debugLog('[AsyncTask#mayEnter()] disallowed due to backpressure', { taskID: this.#id });
460
+ return false;
461
+ }
462
+ if (!cstate.callingSyncImport()) {
463
+ _debugLog('[AsyncTask#mayEnter()] disallowed due to sync import call', { taskID: this.#id });
464
+ return false;
465
+ }
466
+ const callingSyncExportWithSyncPending = cstate.callingSyncExport && !task.isAsync;
467
+ if (!callingSyncExportWithSyncPending) {
468
+ _debugLog('[AsyncTask#mayEnter()] disallowed due to sync export w/ sync pending', { taskID: this.#id });
469
+ return false;
470
+ }
471
+ return true;
472
+ }
473
+
474
+ async enter() {
475
+ _debugLog('[AsyncTask#enter()] args', { taskID: this.#id });
476
+ const cstate = getOrCreateAsyncState(this.#componentIdx);
477
+
478
+ if (this.isSync()) { return true; }
479
+
480
+ if (cstate.hasBackpressure()) {
481
+ cstate.addBackpressureWaiter();
482
+
483
+ const result = await this.waitUntil({
484
+ readyFn: () => !cstate.hasBackpressure(),
485
+ cancellable: true,
486
+ });
487
+
488
+ cstate.removeBackpressureWaiter();
489
+
490
+ if (result === AsyncTask.BlockResult.CANCELLED) {
491
+ this.cancel();
492
+ return false;
493
+ }
494
+ }
495
+
496
+ if (this.needsExclusiveLock()) { cstate.exclusiveLock(); }
497
+
498
+ return true;
499
+ }
500
+
501
+ isRunning() {
502
+ return this.#state !== AsyncTask.State.RESOLVED;
503
+ }
504
+
505
+ async waitUntil(opts) {
506
+ const { readyFn, waitableSetRep, cancellable } = opts;
507
+ _debugLog('[AsyncTask#waitUntil()] args', { taskID: this.#id, waitableSetRep, cancellable });
508
+
509
+ const state = getOrCreateAsyncState(this.#componentIdx);
510
+ const wset = state.waitableSets.get(waitableSetRep);
511
+
512
+ let event;
513
+
514
+ wset.incrementNumWaiting();
515
+
516
+ const keepGoing = await this.suspendUntil({
517
+ readyFn: () => {
518
+ const hasPendingEvent = wset.hasPendingEvent();
519
+ return readyFn() && hasPendingEvent;
520
+ },
521
+ cancellable,
522
+ });
523
+
524
+ if (keepGoing) {
525
+ event = wset.getPendingEvent();
526
+ } else {
527
+ event = {
528
+ code: ASYNC_EVENT_CODE.TASK_CANCELLED,
529
+ index: 0,
530
+ result: 0,
531
+ };
532
+ }
533
+
534
+ wset.decrementNumWaiting();
535
+
536
+ return event;
537
+ }
538
+
539
+ async onBlock(awaitable) {
540
+ _debugLog('[AsyncTask#onBlock()] args', { taskID: this.#id, awaitable });
541
+ if (!(awaitable instanceof Awaitable)) {
542
+ throw new Error('invalid awaitable during onBlock');
543
+ }
544
+
545
+ // Build a promise that this task can await on which resolves when it is awoken
546
+ const { promise, resolve, reject } = promiseWithResolvers();
547
+ this.awaitableResume = () => {
548
+ _debugLog('[AsyncTask] resuming after onBlock', { taskID: this.#id });
549
+ resolve();
550
+ };
551
+ this.awaitableCancel = (err) => {
552
+ _debugLog('[AsyncTask] rejecting after onBlock', { taskID: this.#id, err });
553
+ reject(err);
554
+ };
555
+
556
+ // Park this task/execution to be handled later
557
+ const state = getOrCreateAsyncState(this.#componentIdx);
558
+ state.parkTaskOnAwaitable({ awaitable, task: this });
559
+
560
+ try {
561
+ await promise;
562
+ return AsyncTask.BlockResult.NOT_CANCELLED;
563
+ } catch (err) {
564
+ // rejection means task cancellation
565
+ return AsyncTask.BlockResult.CANCELLED;
566
+ }
567
+ }
568
+
569
+ async asyncOnBlock(awaitable) {
570
+ _debugLog('[AsyncTask#asyncOnBlock()] args', { taskID: this.#id, awaitable });
571
+ if (!(awaitable instanceof Awaitable)) {
572
+ throw new Error('invalid awaitable during onBlock');
573
+ }
574
+ // TODO: watch for waitable AND cancellation
575
+ // TODO: if it WAS cancelled:
576
+ // - return true
577
+ // - only once per subtask
578
+ // - do not wait on the scheduler
579
+ // - control flow should go to the subtask (only once)
580
+ // - Once subtask blocks/resolves, reqlinquishControl() will tehn resolve request_cancel_end (without scheduler lock release)
581
+ // - control flow goes back to request_cancel
582
+ //
583
+ // Subtask cancellation should work similarly to an async import call -- runs sync up until
584
+ // the subtask blocks or resolves
585
+ //
586
+ throw new Error('AsyncTask#asyncOnBlock() not yet implemented');
587
+ }
588
+
589
+ async yieldUntil(opts) {
590
+ const { readyFn, cancellable } = opts;
591
+ _debugLog('[AsyncTask#yield()] args', { taskID: this.#id, cancellable });
592
+
593
+ const keepGoing = await this.suspendUntil({ readyFn, cancellable });
594
+ if (!keepGoing) {
595
+ return {
596
+ code: ASYNC_EVENT_CODE.TASK_CANCELLED,
597
+ index: 0,
598
+ result: 0,
599
+ };
600
+ }
601
+
602
+ return {
603
+ code: ASYNC_EVENT_CODE.NONE,
604
+ index: 0,
605
+ result: 0,
606
+ };
607
+ }
608
+
609
+ async suspendUntil(opts) {
610
+ const { cancellable, readyFn } = opts;
611
+ _debugLog('[AsyncTask#suspendUntil()] args', { cancellable });
612
+
613
+ const pendingCancelled = this.deliverPendingCancel({ cancellable });
614
+ if (pendingCancelled) { return false; }
615
+
616
+ const completed = await this.immediateSuspendUntil({ readyFn, cancellable });
617
+ return completed;
618
+ }
619
+
620
+ // TODO(threads): equivalent to thread.suspend_until()
621
+ async immediateSuspendUntil(opts) {
622
+ const { cancellable, readyFn } = opts;
623
+ _debugLog('[AsyncTask#immediateSuspendUntil()] args', { cancellable, readyFn });
624
+
625
+ const ready = readyFn();
626
+ if (ready && !ASYNC_DETERMINISM && _coinFlip()) {
627
+ return true;
628
+ }
629
+
630
+ const cstate = getOrCreateAsyncState(this.#componentIdx);
631
+ cstate.addPendingTask(this);
632
+
633
+ const keepGoing = await this.immediateSuspend({ cancellable, readyFn });
634
+ return keepGoing;
635
+ }
636
+
637
+ async immediateSuspend(opts) { // NOTE: equivalent to thread.suspend()
638
+ // TODO(threads): store readyFn on the thread
639
+ const { cancellable, readyFn } = opts;
640
+ _debugLog('[AsyncTask#immediateSuspend()] args', { cancellable, readyFn });
641
+
642
+ const pendingCancelled = this.deliverPendingCancel({ cancellable });
643
+ if (pendingCancelled) { return false; }
644
+
645
+ const cstate = getOrCreateAsyncState(this.#componentIdx);
646
+
647
+ setTimeout(() => cstate.tick(), 0);
648
+ const taskWait = await cstate.suspendTask({ task: this, readyFn });
649
+ const keepGoing = await taskWait;
650
+ return keepGoing;
651
+ }
652
+
653
+ deliverPendingCancel(opts) {
654
+ const { cancellable } = opts;
655
+ _debugLog('[AsyncTask#deliverPendingCancel()] args', { cancellable });
656
+
657
+ if (cancellable && this.#state === AsyncTask.State.PENDING_CANCEL) {
658
+ this.#state = Task.State.CANCEL_DELIVERED;
659
+ return true;
660
+ }
661
+
662
+ return false;
663
+ }
664
+
665
+ isCancelled() { return this.cancelled }
666
+
667
+ cancel() {
668
+ _debugLog('[AsyncTask#cancel()] args', { });
669
+ if (!this.taskState() !== AsyncTask.State.CANCEL_DELIVERED) {
670
+ throw new Error(`(component [${this.#componentIdx}]) task [${this.#id}] invalid task state for cancellation`);
671
+ }
672
+ if (this.borrowedHandles.length > 0) { throw new Error('task still has borrow handles'); }
673
+ this.cancelled = true;
674
+ this.onResolve(new Error('cancelled'));
675
+ this.#state = AsyncTask.State.RESOLVED;
676
+ }
677
+
678
+ onResolve(taskValue) {
679
+ for (const f of this.#onResolveHandlers) {
680
+ try {
681
+ f(taskValue);
682
+ } catch (err) {
683
+ console.error("error during task resolve handler", err);
684
+ throw err;
685
+ }
686
+ }
687
+
688
+ if (this.#postReturnFn) {
689
+ _debugLog('[AsyncTask#onResolve()] running post return ', {
690
+ componentIdx: this.#componentIdx,
691
+ taskID: this.#id,
692
+ });
693
+ this.#postReturnFn();
694
+ }
695
+ }
696
+
697
+ registerOnResolveHandler(f) {
698
+ this.#onResolveHandlers.push(f);
699
+ }
700
+
701
+ resolve(results) {
702
+ _debugLog('[AsyncTask#resolve()] args', {
703
+ results,
704
+ componentIdx: this.#componentIdx,
705
+ taskID: this.#id,
706
+ });
707
+
708
+ if (this.#state === AsyncTask.State.RESOLVED) {
709
+ throw new Error(`(component [${this.#componentIdx}]) task [${this.#id}] is already resolved (did you forget to wait for an import?)`);
710
+ }
711
+ if (this.borrowedHandles.length > 0) { throw new Error('task still has borrow handles'); }
712
+ switch (results.length) {
713
+ case 0:
714
+ this.onResolve(undefined);
715
+ break;
716
+ case 1:
717
+ this.onResolve(results[0]);
718
+ break;
719
+ default:
720
+ throw new Error('unexpected number of results');
721
+ }
722
+ this.#state = AsyncTask.State.RESOLVED;
723
+ }
724
+
725
+ exit() {
726
+ _debugLog('[AsyncTask#exit()] args', { });
727
+
728
+ // TODO: ensure there is only one task at a time (scheduler.lock() functionality)
729
+ if (this.#state !== AsyncTask.State.RESOLVED) {
730
+ // TODO(fix): only fused, manually specified post returns seem to break this invariant,
731
+ // as the TaskReturn trampoline is not activated it seems.
732
+ //
733
+ // see: test/p3/ported/wasmtime/component-async/post-return.js
734
+ //
735
+ // We *should* be able to upgrade this to be more strict and throw at some point,
736
+ // which may involve rewriting the upstream test to surface task return manually somehow.
737
+ //
738
+ //throw new Error(`(component [${this.#componentIdx}]) task [${this.#id}] exited without resolution`);
739
+ _debugLog('[AsyncTask#exit()] task exited without resolution', {
740
+ componentIdx: this.#componentIdx,
741
+ taskID: this.#id,
742
+ subtask: this.getParentSubtask(),
743
+ subtaskID: this.getParentSubtask()?.id(),
744
+ });
745
+ this.#state = AsyncTask.State.RESOLVED;
746
+ }
747
+
748
+ if (this.borrowedHandles > 0) {
749
+ throw new Error('task [${this.#id}] exited without clearing borrowed handles');
750
+ }
751
+
752
+ const state = getOrCreateAsyncState(this.#componentIdx);
753
+ if (!state) { throw new Error('missing async state for component [' + this.#componentIdx + ']'); }
754
+ if (!this.#isAsync && !state.inSyncExportCall) {
755
+ throw new Error('sync task must be run from components known to be in a sync export call');
756
+ }
757
+ state.inSyncExportCall = false;
758
+
759
+ if (this.needsExclusiveLock() && !state.isExclusivelyLocked()) {
760
+ throw new Error('task [' + this.#id + '] exit: component [' + this.#componentIdx + '] should have been exclusively locked');
761
+ }
762
+
763
+ state.exclusiveRelease();
764
+ }
765
+
766
+ needsExclusiveLock() { return this.#needsExclusiveLock; }
767
+
768
+ createSubtask(args) {
769
+ _debugLog('[AsyncTask#createSubtask()] args', args);
770
+ const { componentIdx, childTask, callMetadata } = args;
771
+ const newSubtask = new AsyncSubtask({
772
+ componentIdx,
773
+ childTask,
774
+ parentTask: this,
775
+ callMetadata,
776
+ });
777
+ this.#subtasks.push(newSubtask);
778
+ return newSubtask;
779
+ }
780
+
781
+ getLatestSubtask() { return this.#subtasks.at(-1); }
782
+
783
+ currentSubtask() {
784
+ _debugLog('[AsyncTask#currentSubtask()]');
785
+ if (this.#subtasks.length === 0) { return undefined; }
786
+ return this.#subtasks.at(-1);
787
+ }
788
+
789
+ endCurrentSubtask() {
790
+ _debugLog('[AsyncTask#endCurrentSubtask()]');
791
+ if (this.#subtasks.length === 0) { throw new Error('cannot end current subtask: no current subtask'); }
792
+ const subtask = this.#subtasks.pop();
793
+ subtask.drop();
794
+ return subtask;
795
+ }
796
+ }
797
+
798
+ function unpackCallbackResult(result) {
799
+ _debugLog('[unpackCallbackResult()] args', { result });
800
+ if (!(_typeCheckValidI32(result))) { throw new Error('invalid callback return value [' + result + '], not a valid i32'); }
801
+ const eventCode = result & 0xF;
802
+ if (eventCode < 0 || eventCode > 3) {
803
+ throw new Error('invalid async return value [' + eventCode + '], outside callback code range');
804
+ }
805
+ if (result < 0 || result >= 2**32) { throw new Error('invalid callback result'); }
806
+ // TODO: table max length check?
807
+ const waitableSetRep = result >> 4;
808
+ return [eventCode, waitableSetRep];
809
+ }
810
+
811
+ function _lowerImport(args, exportFn) {
812
+ const params = [...arguments].slice(2);
813
+ _debugLog('[_lowerImport()] args', { args, params, exportFn });
814
+ const {
815
+ functionIdx,
816
+ componentIdx,
817
+ isAsync,
818
+ paramLiftFns,
819
+ resultLowerFns,
820
+ metadata,
821
+ memoryIdx,
822
+ getMemoryFn,
823
+ getReallocFn,
824
+ } = args;
825
+
826
+ const parentTaskMeta = getCurrentTask(componentIdx);
827
+ const parentTask = parentTaskMeta?.task;
828
+ if (!parentTask) { throw new Error('missing parent task during lower of import'); }
829
+
830
+ const cstate = getOrCreateAsyncState(componentIdx);
831
+
832
+ const subtask = parentTask.createSubtask({
833
+ componentIdx,
834
+ parentTask,
835
+ callMetadata: {
836
+ memoryIdx,
837
+ memory: getMemoryFn(),
838
+ realloc: getReallocFn(),
839
+ resultPtr: params[0],
840
+ }
841
+ });
842
+ parentTask.setReturnMemoryIdx(memoryIdx);
843
+
844
+ const rep = cstate.subtasks.insert(subtask);
845
+ subtask.setRep(rep);
846
+
847
+ subtask.setOnProgressFn(() => {
848
+ subtask.setPendingEventFn(() => {
849
+ if (subtask.resolved()) { subtask.deliverResolve(); }
850
+ return {
851
+ code: ASYNC_EVENT_CODE.SUBTASK,
852
+ index: rep,
853
+ result: subtask.getStateNumber(),
854
+ }
855
+ });
856
+ });
857
+
858
+ // Set up a handler on subtask completion to lower results from the call into the caller's memory region.
859
+ subtask.registerOnResolveHandler((res) => {
860
+ _debugLog('[_lowerImport()] handling subtask result', { res, subtaskID: subtask.id() });
861
+ const { memory, resultPtr, realloc } = subtask.getCallMetadata();
862
+ resultLowerFns[0]({ componentIdx, memory, realloc, vals: [res], storagePtr: resultPtr });
863
+ });
864
+
865
+ const subtaskState = subtask.getStateNumber();
866
+ if (subtaskState < 0 || subtaskState > 2**5) {
867
+ throw new Error('invalid subtask state, out of valid range');
868
+ }
869
+
870
+ // NOTE: we must wait a bit before calling the export function,
871
+ // to ensure the subtask state is not modified before the lower call return
872
+ //
873
+ // TODO: we should trigger via subtask state changing, rather than a static wait?
874
+ setTimeout(async () => {
875
+ try {
876
+ _debugLog('[_lowerImport()] calling lowered import', { exportFn, params });
877
+ exportFn.apply(null, params);
878
+
879
+ const task = subtask.getChildTask();
880
+ task.registerOnResolveHandler((res) => {
881
+ _debugLog('[_lowerImport()] cascading subtask completion', {
882
+ childTaskID: task.id(),
883
+ subtaskID: subtask.id(),
884
+ parentTaskID: parentTask.id(),
885
+ });
886
+
887
+ subtask.onResolve(res);
888
+
889
+ cstate.tick();
890
+ });
891
+ } catch (err) {
892
+ console.error("post-lower import fn error:", err);
893
+ throw err;
894
+ }
895
+ }, 100);
896
+
897
+ return Number(subtask.waitableRep()) << 4 | subtaskState;
898
+ }
899
+
900
+ function _liftFlatU8(ctx) {
901
+ _debugLog('[_liftFlatU8()] args', { ctx });
902
+
903
+ let val;
904
+ if (ctx.useDirectParams) {
905
+ if (ctx.params.length === 0) { throw new Error('expected at least a single i32 argument'); }
906
+ val = ctx.params[0];
907
+ ctx.params = ctx.params.slice(1);
908
+ } else {
909
+ if (ctx.storageLen < ctx.storagePtr + 1) { throw new Error('not enough storage remaining for lift'); }
910
+ val = new DataView(ctx.memory.buffer).getUint8(ctx.storagePtr);
911
+ ctx.storagePtr += 1;
912
+ ctx.storageLen -= 1;
913
+ }
914
+
915
+ return [val, ctx];
916
+ }
917
+
918
+ function _liftFlatU16(ctx) {
919
+ _debugLog('[_liftFlatU16()] args', { ctx });
920
+
921
+ let val;
922
+ if (ctx.useDirectParams) {
923
+ if (params.length === 0) { throw new Error('expected at least a single i32 argument'); }
924
+ val = ctx.params[0];
925
+ ctx.params = ctx.params.slice(1);
926
+ } else {
927
+ if (ctx.storageLen < ctx.storagePtr + 2) { throw new Error('not enough storage remaining for lift'); }
928
+ val = new DataView(ctx.memory.buffer).getUint16(ctx.storagePtr);
929
+ ctx.storagePtr += 2;
930
+ ctx.storageLen -= 2;
931
+ }
932
+
933
+ return [val, ctx];
934
+ }
935
+
936
+ function _liftFlatU32(ctx) {
937
+ _debugLog('[_liftFlatU32()] args', { ctx });
938
+
939
+ let val;
940
+ if (ctx.useDirectParams) {
941
+ if (ctx.params.length === 0) { throw new Error('expected at least a single i34 argument'); }
942
+ val = ctx.params[0];
943
+ ctx.params = ctx.params.slice(1);
944
+ } else {
945
+ if (ctx.storageLen < ctx.storagePtr + 4) { throw new Error('not enough storage remaining for lift'); }
946
+ val = new DataView(ctx.memory.buffer).getUint32(ctx.storagePtr);
947
+ ctx.storagePtr += 4;
948
+ ctx.storageLen -= 4;
949
+ }
950
+
951
+ return [val, ctx];
952
+ }
953
+
954
+ function _liftFlatVariant(casesAndLiftFns) {
955
+ return function _liftFlatVariantInner(ctx) {
956
+ _debugLog('[_liftFlatVariant()] args', { ctx });
957
+
958
+ const origUseParams = ctx.useDirectParams;
959
+
960
+ let caseIdx;
961
+ if (casesAndLiftFns.length < 256) {
962
+ let discriminantByteLen = 1;
963
+ const [idx, newCtx] = _liftFlatU8(ctx);
964
+ caseIdx = idx;
965
+ ctx = newCtx;
966
+ } else if (casesAndLiftFns.length > 256 && discriminantByteLen < 65536) {
967
+ discriminantByteLen = 2;
968
+ const [idx, newCtx] = _liftFlatU16(ctx);
969
+ caseIdx = idx;
970
+ ctx = newCtx;
971
+ } else if (casesAndLiftFns.length > 65536 && discriminantByteLen < 4_294_967_296) {
972
+ discriminantByteLen = 4;
973
+ const [idx, newCtx] = _liftFlatU32(ctx);
974
+ caseIdx = idx;
975
+ ctx = newCtx;
976
+ } else {
977
+ throw new Error('unsupported number of cases [' + casesAndLIftFns.legnth + ']');
978
+ }
979
+
980
+ const [ tag, liftFn, size32, alignment32 ] = casesAndLiftFns[caseIdx];
981
+
982
+ let val;
983
+ if (liftFn === null) {
984
+ val = { tag };
985
+ return [val, ctx];
986
+ }
987
+
988
+ const [newVal, newCtx] = liftFn(ctx);
989
+ ctx = newCtx;
990
+ val = { tag, val: newVal };
991
+
992
+ return [val, ctx];
993
+ }
994
+ }
995
+
996
+ function _liftFlatList(elemLiftFn, alignment32, knownLen) {
997
+ function _liftFlatListInner(ctx) {
998
+ _debugLog('[_liftFlatList()] args', { ctx });
999
+
1000
+ let metaPtr;
1001
+ let dataPtr;
1002
+ let len;
1003
+ if (ctx.useDirectParams) {
1004
+ if (knownLen) {
1005
+ dataPtr = _liftFlatU32(ctx);
1006
+ } else {
1007
+ metaPtr = _liftFlatU32(ctx);
1008
+ }
1009
+ } else {
1010
+ if (knownLen) {
1011
+ dataPtr = _liftFlatU32(ctx);
1012
+ } else {
1013
+ metaPtr = _liftFlatU32(ctx);
1014
+ }
1015
+ }
1016
+
1017
+ if (metaPtr) {
1018
+ if (dataPtr !== undefined) { throw new Error('both meta and data pointers should not be set yet'); }
1019
+
1020
+ if (ctx.useDirectParams) {
1021
+ ctx.useDirectParams = false;
1022
+ ctx.storagePtr = metaPtr;
1023
+ ctx.storageLen = 8;
1024
+
1025
+ dataPtr = _liftFlatU32(ctx);
1026
+ len = _liftFlatU32(ctx);
1027
+
1028
+ ctx.useDirectParams = true;
1029
+ ctx.storagePtr = null;
1030
+ ctx.storageLen = null;
1031
+ } else {
1032
+ dataPtr = _liftFlatU32(ctx);
1033
+ len = _liftFlatU32(ctx);
1034
+ }
1035
+ }
1036
+
1037
+ const val = [];
1038
+ for (var i = 0; i < len; i++) {
1039
+ ctx.storagePtr = Math.ceil(ctx.storagePtr / alignment32) * alignment32;
1040
+ const [res, nextCtx] = elemLiftFn(ctx);
1041
+ val.push(res);
1042
+ ctx = nextCtx;
1043
+ }
1044
+
1045
+ return [val, ctx];
1046
+ }
1047
+ }
1048
+
1049
+ function _liftFlatResult(casesAndLiftFns) {
1050
+ return function _liftFlatResultInner(ctx) {
1051
+ _debugLog('[_liftFlatResult()] args', { ctx });
1052
+ return _liftFlatVariant(casesAndLiftFns)(ctx);
1053
+ }
1054
+ }
1055
+
1056
+ function _liftFlatOwn(componentTableIdx, size, memory, vals, storagePtr, storageLen) {
1057
+ _debugLog('[_liftFlatOwn()] args', { size, memory, vals, storagePtr, storageLen });
1058
+ throw new Error('flat lift for owned resources not yet implemented!');
1059
+ }
1060
+
1061
+ function _lowerFlatU8(ctx) {
1062
+ _debugLog('[_lowerFlatU8()] args', ctx);
1063
+ const { memory, realloc, vals, storagePtr, storageLen } = ctx;
1064
+ if (vals.length !== 1) {
1065
+ throw new Error('unexpected number (' + vals.length + ') of core vals (expected 1)');
1066
+ }
1067
+ if (vals[0] > 255 || vals[0] < 0) { throw new Error('invalid value for core value representing u8'); }
1068
+ if (!memory) { throw new Error("missing memory for lower"); }
1069
+ new DataView(memory.buffer).setUint32(storagePtr, vals[0], true);
1070
+ return 1;
1071
+ }
1072
+
1073
+ function _lowerFlatU16(memory, vals, storagePtr, storageLen) {
1074
+ _debugLog('[_lowerFlatU16()] args', { memory, vals, storagePtr, storageLen });
1075
+ if (vals.length !== 1) {
1076
+ throw new Error('unexpected number (' + vals.length + ') of core vals (expected 1)');
1077
+ }
1078
+ if (vals[0] > 65_535 || vals[0] < 0) { throw new Error('invalid value for core value representing u16'); }
1079
+ new DataView(memory.buffer).setUint16(storagePtr, vals[0], true);
1080
+ return 2;
1081
+ }
1082
+
1083
+ function _lowerFlatU32(ctx) {
1084
+ _debugLog('[_lowerFlatU32()] args', ctx);
1085
+ const { memory, realloc, vals, storagePtr, storageLen } = ctx;
1086
+ if (vals.length !== 1) { throw new Error('expected single value to lower, got (' + vals.length + ')'); }
1087
+ if (vals[0] > 4_294_967_295 || vals[0] < 0) { throw new Error('invalid value for core value representing u32'); }
1088
+
1089
+ // TODO(fix): fix misaligned writes properly
1090
+ const rem = ctx.storagePtr % 4;
1091
+ if (rem !== 0) { ctx.storagePtr += (4 - rem); }
1092
+
1093
+ new DataView(memory.buffer).setUint32(storagePtr, vals[0], true);
1094
+ return 4;
1095
+ }
1096
+
1097
+ function _lowerFlatU64(memory, vals, storagePtr, storageLen) {
1098
+ _debugLog('[_lowerFlatU64()] args', { memory, vals, storagePtr, storageLen });
1099
+ if (vals.length !== 1) { throw new Error('unexpected number of core vals'); }
1100
+ if (vals[0] > 18_446_744_073_709_551_615n || vals[0] < 0n) { throw new Error('invalid value for core value representing u64'); }
1101
+ new DataView(memory.buffer).setBigUint64(storagePtr, vals[0], true);
1102
+ return 8;
1103
+ }
1104
+
1105
+ function _lowerFlatVariant(metadata, extra) {
1106
+ const { discriminantSizeBytes, lowerMetas } = metadata;
1107
+
1108
+ return function _lowerFlatVariantInner(ctx) {
1109
+ _debugLog('[_lowerFlatVariant()] args', ctx);
1110
+ const { memory, realloc, vals, storageLen, componentIdx } = ctx;
1111
+ let storagePtr = ctx.storagePtr;
1112
+
1113
+ const { tag, val } = vals[0];
1114
+ const variant = lowerMetas.find(vm => vm.tag === tag);
1115
+ if (!variant) { throw new Error(`missing/invalid variant, no tag matches [${tag}] (options were ${variantMetas.map(vm => vm.tag)})`); }
1116
+ if (!variant.discriminant) { throw new Error(`missing/invalid discriminant for variant [${variant}]`); }
1117
+
1118
+ let bytesWritten;
1119
+ let discriminantLowerArgs = { memory, realloc, vals: [variant.discriminant], storagePtr, componentIdx }
1120
+ switch (discriminantSizeBytes) {
1121
+ case 1:
1122
+ bytesWritten = _lowerFlatU8(discriminantLowerArgs);
1123
+ break;
1124
+ case 2:
1125
+ bytesWritten = _lowerFlatU16(discriminantLowerArgs);
1126
+ break;
1127
+ case 4:
1128
+ bytesWritten = _lowerFlatU32(discriminantLowerArgs);
1129
+ break;
1130
+ default:
1131
+ throw new Error(`unexpected discriminant size bytes [${discriminantSizeBytes}]`);
1132
+ }
1133
+ if (bytesWritten !== discriminantSizeBytes) {
1134
+ throw new Error("unexpectedly wrote more bytes than discriminant");
1135
+ }
1136
+ storagePtr += bytesWritten;
1137
+
1138
+ bytesWritten += variant.lowerFn({ memory, realloc, vals: [val], storagePtr, storageLen, componentIdx });
1139
+
1140
+ return bytesWritten;
1141
+ }
1142
+ }
1143
+
1144
+ function _lowerFlatList(size, memory, vals, storagePtr, storageLen) {
1145
+ _debugLog('[_lowerFlatList()] args', { size, memory, vals, storagePtr, storageLen });
1146
+ let [start, len] = vals;
1147
+ const totalSizeBytes = len * size;
1148
+ if (storageLen !== undefined && totalSizeBytes > storageLen) {
1149
+ throw new Error('not enough storage remaining for list flat lower');
1150
+ }
1151
+ const data = new Uint8Array(memory.buffer, start, totalSizeBytes);
1152
+ new Uint8Array(memory.buffer, storagePtr, totalSizeBytes).set(data);
1153
+ return data.byteLength;
1154
+ }
1155
+
1156
+ function _lowerFlatTuple(size, memory, vals, storagePtr, storageLen) {
1157
+ _debugLog('[_lowerFlatTuple()] args', { size, memory, vals, storagePtr, storageLen });
1158
+ let [start, len] = vals;
1159
+ if (storageLen !== undefined && len > storageLen) {
1160
+ throw new Error('not enough storage remaining for tuple flat lower');
1161
+ }
1162
+ const data = new Uint8Array(memory.buffer, start, len);
1163
+ new Uint8Array(memory.buffer, storagePtr, len).set(data);
1164
+ return data.byteLength;
1165
+ }
1166
+
1167
+ function _lowerFlatOption(size, memory, vals, storagePtr, storageLen) {
1168
+ _debugLog('[_lowerFlatOption()] args', { size, memory, vals, storagePtr, storageLen });
1169
+ let [start] = vals;
1170
+ if (storageLen !== undefined && size !== undefined && size > storageLen) {
1171
+ throw new Error('not enough storage remaining for option flat lower');
1172
+ }
1173
+ const data = new Uint8Array(memory.buffer, start, size);
1174
+ new Uint8Array(memory.buffer, storagePtr, size).set(data);
1175
+ return data.byteLength;
1176
+ }
1177
+
1178
+ function _lowerFlatResult(lowerMetas) {
1179
+ const invalidTag = lowerMetas.find(t => t.tag !== 'ok' && t.tag !== 'error')
1180
+ if (invalidTag) { throw new Error(`invalid variant tag [${invalidTag}] found for result`); }
1181
+
1182
+ return function _lowerFlatResultInner() {
1183
+ _debugLog('[_lowerFlatResult()] args', { lowerMetas });
1184
+ let lowerFn = _lowerFlatVariant({ discriminantSizeBytes: 1, lowerMetas }, { forResult: true });
1185
+ return lowerFn.apply(null, arguments);
1186
+ };
1187
+ }
1188
+
1189
+ function _lowerFlatOwn(size, memory, vals, storagePtr, storageLen) {
1190
+ _debugLog('[_lowerFlatOwn()] args', { size, memory, vals, storagePtr, storageLen });
1191
+ throw new Error('flat lower for owned resources not yet implemented!');
1192
+ }
1193
+ const ASYNC_STATE = new Map();
1194
+
1195
+ function getOrCreateAsyncState(componentIdx, init) {
1196
+ if (!ASYNC_STATE.has(componentIdx)) {
1197
+ const newState = new ComponentAsyncState({ componentIdx });
1198
+ ASYNC_STATE.set(componentIdx, newState);
1199
+ }
1200
+ return ASYNC_STATE.get(componentIdx);
1201
+ }
1202
+
1203
+ class ComponentAsyncState {
1204
+ static EVENT_HANDLER_EVENTS = [ 'backpressure-change' ];
1205
+
1206
+ #componentIdx;
1207
+ #callingAsyncImport = false;
1208
+ #syncImportWait = promiseWithResolvers();
1209
+ #locked = false;
1210
+ #parkedTasks = new Map();
1211
+ #suspendedTasksByTaskID = new Map();
1212
+ #suspendedTaskIDs = [];
1213
+ #pendingTasks = [];
1214
+ #errored = null;
1215
+
1216
+ #backpressure = 0;
1217
+ #backpressureWaiters = 0n;
1218
+
1219
+ #handlerMap = new Map();
1220
+ #nextHandlerID = 0n;
1221
+
1222
+ mayLeave = true;
1223
+
1224
+ waitableSets;
1225
+ waitables;
1226
+ subtasks;
1227
+
1228
+ constructor(args) {
1229
+ this.#componentIdx = args.componentIdx;
1230
+ this.waitableSets = new RepTable({ target: `component [${this.#componentIdx}] waitable sets` });
1231
+ this.waitables = new RepTable({ target: `component [${this.#componentIdx}] waitables` });
1232
+ this.subtasks = new RepTable({ target: `component [${this.#componentIdx}] subtasks` });
1233
+ };
1234
+
1235
+ componentIdx() { return this.#componentIdx; }
1236
+
1237
+ errored() { return this.#errored !== null; }
1238
+ setErrored(err) {
1239
+ _debugLog('[ComponentAsyncState#setErrored()] component errored', { err, componentIdx: this.#componentIdx });
1240
+ if (this.#errored) { return; }
1241
+ if (!err) {
1242
+ err = new Error('error elswehere (see other component instance error)')
1243
+ err.componentIdx = this.#componentIdx;
1244
+ }
1245
+ this.#errored = err;
1246
+ }
1247
+
1248
+ callingSyncImport(val) {
1249
+ if (val === undefined) { return this.#callingAsyncImport; }
1250
+ if (typeof val !== 'boolean') { throw new TypeError('invalid setting for async import'); }
1251
+ const prev = this.#callingAsyncImport;
1252
+ this.#callingAsyncImport = val;
1253
+ if (prev === true && this.#callingAsyncImport === false) {
1254
+ this.#notifySyncImportEnd();
1255
+ }
1256
+ }
1257
+
1258
+ #notifySyncImportEnd() {
1259
+ const existing = this.#syncImportWait;
1260
+ this.#syncImportWait = promiseWithResolvers();
1261
+ existing.resolve();
1262
+ }
1263
+
1264
+ async waitForSyncImportCallEnd() {
1265
+ await this.#syncImportWait.promise;
1266
+ }
1267
+
1268
+ setBackpressure(v) { this.#backpressure = v; }
1269
+ getBackpressure(v) { return this.#backpressure; }
1270
+ incrementBackpressure() {
1271
+ const newValue = this.getBackpressure() + 1;
1272
+ if (newValue > 2**16) { throw new Error("invalid backpressure value, overflow"); }
1273
+ this.setBackpressure(newValue);
1274
+ }
1275
+ decrementBackpressure() {
1276
+ this.setBackpressure(Math.max(0, this.getBackpressure() - 1));
1277
+ }
1278
+ hasBackpressure() { return this.#backpressure > 0; }
1279
+
1280
+ waitForBackpressure() {
1281
+ let backpressureCleared = false;
1282
+ const cstate = this;
1283
+ cstate.addBackpressureWaiter();
1284
+ const handlerID = this.registerHandler({
1285
+ event: 'backpressure-change',
1286
+ fn: (bp) => {
1287
+ if (bp === 0) {
1288
+ cstate.removeHandler(handlerID);
1289
+ backpressureCleared = true;
1290
+ }
1291
+ }
1292
+ });
1293
+ return new Promise((resolve) => {
1294
+ const interval = setInterval(() => {
1295
+ if (backpressureCleared) { return; }
1296
+ clearInterval(interval);
1297
+ cstate.removeBackpressureWaiter();
1298
+ resolve(null);
1299
+ }, 0);
1300
+ });
1301
+ }
1302
+
1303
+ registerHandler(args) {
1304
+ const { event, fn } = args;
1305
+ if (!event) { throw new Error("missing handler event"); }
1306
+ if (!fn) { throw new Error("missing handler fn"); }
1307
+
1308
+ if (!ComponentAsyncState.EVENT_HANDLER_EVENTS.includes(event)) {
1309
+ throw new Error(`unrecognized event handler [${event}]`);
1310
+ }
1311
+
1312
+ const handlerID = this.#nextHandlerID++;
1313
+ let handlers = this.#handlerMap.get(event);
1314
+ if (!handlers) {
1315
+ handlers = [];
1316
+ this.#handlerMap.set(event, handlers)
1317
+ }
1318
+
1319
+ handlers.push({ id: handlerID, fn, event });
1320
+ return handlerID;
1321
+ }
1322
+
1323
+ removeHandler(args) {
1324
+ const { event, handlerID } = args;
1325
+ const registeredHandlers = this.#handlerMap.get(event);
1326
+ if (!registeredHandlers) { return; }
1327
+ const found = registeredHandlers.find(h => h.id === handlerID);
1328
+ if (!found) { return; }
1329
+ this.#handlerMap.set(event, this.#handlerMap.get(event).filter(h => h.id !== handlerID));
1330
+ }
1331
+
1332
+ getBackpressureWaiters() { return this.#backpressureWaiters; }
1333
+ addBackpressureWaiter() { this.#backpressureWaiters++; }
1334
+ removeBackpressureWaiter() {
1335
+ this.#backpressureWaiters--;
1336
+ if (this.#backpressureWaiters < 0) {
1337
+ throw new Error("unexepctedly negative number of backpressure waiters");
1338
+ }
1339
+ }
1340
+
1341
+ parkTaskOnAwaitable(args) {
1342
+ if (!args.awaitable) { throw new TypeError('missing awaitable when trying to park'); }
1343
+ if (!args.task) { throw new TypeError('missing task when trying to park'); }
1344
+ const { awaitable, task } = args;
1345
+
1346
+ let taskList = this.#parkedTasks.get(awaitable.id());
1347
+ if (!taskList) {
1348
+ taskList = [];
1349
+ this.#parkedTasks.set(awaitable.id(), taskList);
1350
+ }
1351
+ taskList.push(task);
1352
+
1353
+ this.wakeNextTaskForAwaitable(awaitable);
1354
+ }
1355
+
1356
+ wakeNextTaskForAwaitable(awaitable) {
1357
+ if (!awaitable) { throw new TypeError('missing awaitable when waking next task'); }
1358
+ const awaitableID = awaitable.id();
1359
+
1360
+ const taskList = this.#parkedTasks.get(awaitableID);
1361
+ if (!taskList || taskList.length === 0) {
1362
+ _debugLog('[ComponentAsyncState] no tasks waiting for awaitable', { awaitableID: awaitable.id() });
1363
+ return;
1364
+ }
1365
+
1366
+ let task = taskList.shift(); // todo(perf)
1367
+ if (!task) { throw new Error('no task in parked list despite previous check'); }
1368
+
1369
+ if (!task.awaitableResume) {
1370
+ throw new Error('task ready due to awaitable is missing resume', { taskID: task.id(), awaitableID });
1371
+ }
1372
+ task.awaitableResume();
1373
+ }
1374
+
1375
+ // TODO: we might want to check for pre-locked status here
1376
+ exclusiveLock() {
1377
+ this.#locked = true;
1378
+ }
1379
+
1380
+ exclusiveRelease() {
1381
+ _debugLog('[ComponentAsyncState#exclusiveRelease()] releasing', {
1382
+ locked: this.#locked,
1383
+ componentIdx: this.#componentIdx,
1384
+ });
1385
+
1386
+ this.#locked = false
1387
+ }
1388
+
1389
+ isExclusivelyLocked() { return this.#locked === true; }
1390
+
1391
+ #getSuspendedTaskMeta(taskID) {
1392
+ return this.#suspendedTasksByTaskID.get(taskID);
1393
+ }
1394
+
1395
+ #removeSuspendedTaskMeta(taskID) {
1396
+ _debugLog('[ComponentAsyncState#removeSuspendedTaskMeta()] removing suspended task', { taskID });
1397
+ const idx = this.#suspendedTaskIDs.findIndex(t => t === taskID);
1398
+ const meta = this.#suspendedTasksByTaskID.get(taskID);
1399
+ this.#suspendedTaskIDs[idx] = null;
1400
+ this.#suspendedTasksByTaskID.delete(taskID);
1401
+ return meta;
1402
+ }
1403
+
1404
+ #addSuspendedTaskMeta(meta) {
1405
+ if (!meta) { throw new Error('missing task meta'); }
1406
+ const taskID = meta.taskID;
1407
+ this.#suspendedTasksByTaskID.set(taskID, meta);
1408
+ this.#suspendedTaskIDs.push(taskID);
1409
+ if (this.#suspendedTasksByTaskID.size < this.#suspendedTaskIDs.length - 10) {
1410
+ this.#suspendedTaskIDs = this.#suspendedTaskIDs.filter(t => t !== null);
1411
+ }
1412
+ }
1413
+
1414
+ suspendTask(args) {
1415
+ // TODO(threads): readyFn is normally on the thread
1416
+ const { task, readyFn } = args;
1417
+ const taskID = task.id();
1418
+ _debugLog('[ComponentAsyncState#suspendTask()]', { taskID });
1419
+
1420
+ if (this.#getSuspendedTaskMeta(taskID)) {
1421
+ throw new Error('task [' + taskID + '] already suspended');
1422
+ }
1423
+
1424
+ const { promise, resolve } = Promise.withResolvers();
1425
+ this.#addSuspendedTaskMeta({
1426
+ task,
1427
+ taskID,
1428
+ readyFn,
1429
+ resume: () => {
1430
+ _debugLog('[ComponentAsyncState#suspendTask()] resuming suspended task', { taskID });
1431
+ // TODO(threads): it's thread cancellation we should be checking for below, not task
1432
+ resolve(!task.isCancelled());
1433
+ },
1434
+ });
1435
+
1436
+ return promise;
1437
+ }
1438
+
1439
+ resumeTaskByID(taskID) {
1440
+ const meta = this.#removeSuspendedTaskMeta(taskID);
1441
+ if (!meta) { return; }
1442
+ if (meta.taskID !== taskID) { throw new Error('task ID does not match'); }
1443
+ meta.resume();
1444
+ }
1445
+
1446
+ tick() {
1447
+ _debugLog('[ComponentAsyncState#tick()]', { suspendedTaskIDs: this.#suspendedTaskIDs });
1448
+ let resumedTask = false;
1449
+ for (const taskID of this.#suspendedTaskIDs.filter(t => t !== null)) {
1450
+ const meta = this.#suspendedTasksByTaskID.get(taskID);
1451
+ if (!meta || !meta.readyFn) {
1452
+ throw new Error('missing/invalid task despite ID [' + taskID + '] being present');
1453
+ }
1454
+ if (!meta.readyFn()) { continue; }
1455
+ resumedTask = true;
1456
+ this.resumeTaskByID(taskID);
1457
+ }
1458
+ return resumedTask;
1459
+ }
1460
+
1461
+ addPendingTask(task) {
1462
+ this.#pendingTasks.push(task);
1463
+ }
1464
+ }
1465
+
1466
+ function _prepareCall(
1467
+ memoryIdx,
1468
+ getMemoryFn,
1469
+ startFn,
1470
+ returnFn,
1471
+ callerInstanceIdx,
1472
+ calleeInstanceIdx,
1473
+ taskReturnTypeIdx,
1474
+ isCalleeAsyncInt,
1475
+ stringEncoding,
1476
+ resultCountOrAsync,
1477
+ ) {
1478
+ _debugLog('[_prepareCall()]', {
1479
+ callerInstanceIdx,
1480
+ calleeInstanceIdx,
1481
+ taskReturnTypeIdx,
1482
+ isCalleeAsyncInt,
1483
+ stringEncoding,
1484
+ resultCountOrAsync,
1485
+ });
1486
+ const argArray = [...arguments];
1487
+
1488
+ // Since Rust will happily pass large u32s over, resultCountOrAsync should be one of:
1489
+ // (a) u32 max size => callee is async fn with no result
1490
+ // (b) u32 max size - 1 => callee is async fn with result
1491
+ // (c) any other value => callee is sync with the given result count
1492
+ //
1493
+ // Due to JS handling the value as 2s complement, the `resultCountOrAsync` ends up being:
1494
+ // (a) -1 as u32 max size
1495
+ // (b) -2 as u32 max size - 1
1496
+ // (c) x
1497
+ //
1498
+ // Due to JS mishandling the value as 2s complement, the actual values we get are:
1499
+ // see. https://github.com/wasm-bindgen/wasm-bindgen/issues/1388
1500
+ let isAsync = false;
1501
+ let hasResultPointer = false;
1502
+ if (resultCountOrAsync === -1) {
1503
+ isAsync = true;
1504
+ hasResultPointer = false;
1505
+ } else if (resultCountOrAsync === -2) {
1506
+ isAsync = true;
1507
+ hasResultPointer = true;
1508
+ }
1509
+
1510
+ const currentCallerTaskMeta = getCurrentTask(callerInstanceIdx);
1511
+ if (!currentCallerTaskMeta) {
1512
+ throw new Error('invalid/missing current task for caller during prepare call');
1513
+ }
1514
+
1515
+ const currentCallerTask = currentCallerTaskMeta.task;
1516
+ if (!currentCallerTask) {
1517
+ throw new Error('unexpectedly missing task in meta for caller during prepare call');
1518
+ }
1519
+
1520
+ if (currentCallerTask.componentIdx() !== callerInstanceIdx) {
1521
+ throw new Error(`task component idx [${ currentCallerTask.componentIdx() }] !== [${ callerInstanceIdx }] (callee ${ calleeInstanceIdx })`);
1522
+ }
1523
+
1524
+ let getCalleeParamsFn;
1525
+ let resultPtr = null;
1526
+ if (hasResultPointer) {
1527
+ const directParamsArr = argArray.slice(11);
1528
+ getCalleeParamsFn = () => directParamsArr;
1529
+ resultPtr = argArray[10];
1530
+ } else {
1531
+ const directParamsArr = argArray.slice(10);
1532
+ getCalleeParamsFn = () => directParamsArr;
1533
+ }
1534
+
1535
+ let encoding;
1536
+ switch (stringEncoding) {
1537
+ case 0:
1538
+ encoding = 'utf8';
1539
+ break;
1540
+ case 1:
1541
+ encoding = 'utf16';
1542
+ break;
1543
+ case 2:
1544
+ encoding = 'compact-utf16';
1545
+ break;
1546
+ default:
1547
+ throw new Error(`unrecognized string encoding enum [${stringEncoding}]`);
1548
+ }
1549
+
1550
+ const [newTask, newTaskID] = createNewCurrentTask({
1551
+ componentIdx: calleeInstanceIdx,
1552
+ isAsync: isCalleeAsyncInt !== 0,
1553
+ getCalleeParamsFn,
1554
+ // TODO: find a way to pass the import name through here
1555
+ entryFnName: 'task/' + currentCallerTask.id() + '/new-prepare-task',
1556
+ stringEncoding,
1557
+ });
1558
+
1559
+ const subtask = currentCallerTask.createSubtask({
1560
+ componentIdx: callerInstanceIdx,
1561
+ parentTask: currentCallerTask,
1562
+ childTask: newTask,
1563
+ callMetadata: {
1564
+ memory: getMemoryFn(),
1565
+ memoryIdx,
1566
+ resultPtr,
1567
+ returnFn,
1568
+ startFn,
1569
+ }
1570
+ });
1571
+
1572
+ newTask.setParentSubtask(subtask);
1573
+ // NOTE: This isn't really a return memory idx for the caller, it's for checking
1574
+ // against the task.return (which will be called from the callee)
1575
+ newTask.setReturnMemoryIdx(memoryIdx);
1576
+ }
1577
+
1578
+ function _asyncStartCall(args, callee, paramCount, resultCount, flags) {
1579
+ const { getCallbackFn, callbackIdx, getPostReturnFn, postReturnIdx } = args;
1580
+ _debugLog('[_asyncStartCall()] args', args);
1581
+
1582
+ const taskMeta = getCurrentTask(ASYNC_CURRENT_COMPONENT_IDXS.at(-1), ASYNC_CURRENT_TASK_IDS.at(-1));
1583
+ if (!taskMeta) { throw new Error('invalid/missing current async task meta during prepare call'); }
1584
+
1585
+ const argArray = [...arguments];
1586
+
1587
+ // NOTE: at this point we know the current task is the one that was started
1588
+ // in PrepareCall, so we *should* be able to pop it back off and be left with
1589
+ // the previous task
1590
+ const preparedTask = taskMeta.task;
1591
+ if (!preparedTask) { throw new Error('unexpectedly missing task in task meta during prepare call'); }
1592
+
1593
+ if (resultCount < 0 || resultCount > 1) { throw new Error('invalid/unsupported result count'); }
1594
+
1595
+ const callbackFnName = 'callback_' + callbackIdx;
1596
+ const callbackFn = getCallbackFn();
1597
+ preparedTask.setCallbackFn(callbackFn, callbackFnName);
1598
+ preparedTask.setPostReturnFn(getPostReturnFn());
1599
+
1600
+ const subtask = preparedTask.getParentSubtask();
1601
+
1602
+ if (resultCount < 0 || resultCount > 1) { throw new Error(`unsupported result count [${ resultCount }]`); }
1603
+
1604
+ const params = preparedTask.getCalleeParams();
1605
+ if (paramCount !== params.length) {
1606
+ throw new Error(`unexpected callee param count [${ params.length }], _asyncStartCall invocation expected [${ paramCount }]`);
1607
+ }
1608
+
1609
+ subtask.setOnProgressFn(() => {
1610
+ subtask.setPendingEventFn(() => {
1611
+ if (subtask.resolved()) { subtask.deliverResolve(); }
1612
+ return {
1613
+ code: ASYNC_EVENT_CODE.SUBTASK,
1614
+ index: rep,
1615
+ result: subtask.getStateNumber(),
1616
+ }
1617
+ });
1618
+ });
1619
+
1620
+ const subtaskState = subtask.getStateNumber();
1621
+ if (subtaskState < 0 || subtaskState > 2**5) {
1622
+ throw new Error('invalid subtask state, out of valid range');
1623
+ }
1624
+
1625
+ const callerComponentState = getOrCreateAsyncState(subtask.componentIdx());
1626
+ const rep = callerComponentState.subtasks.insert(subtask);
1627
+ subtask.setRep(rep);
1628
+
1629
+ const calleeComponentState = getOrCreateAsyncState(preparedTask.componentIdx());
1630
+ const calleeBackpressure = calleeComponentState.hasBackpressure();
1631
+
1632
+ // Set up a handler on subtask completion to lower results from the call into the caller's memory region.
1633
+ //
1634
+ // NOTE: during fused guest->guest calls this handler is triggered, but does not actually perform
1635
+ // lowering manually, as fused modules provider helper functions that can
1636
+ subtask.registerOnResolveHandler((res) => {
1637
+ _debugLog('[_asyncStartCall()] handling subtask result', { res, subtaskID: subtask.id() });
1638
+ let subtaskCallMeta = subtask.getCallMetadata();
1639
+
1640
+ // NOTE: in the case of guest -> guest async calls, there may be no memory/realloc present,
1641
+ // as the host will intermediate the value storage/movement between calls.
1642
+ //
1643
+ // We can simply take the value and lower it as a parameter
1644
+ if (subtaskCallMeta.memory || subtaskCallMeta.realloc) {
1645
+ throw new Error("call metadata unexpectedly contains memory/realloc for guest->guest call");
1646
+ }
1647
+
1648
+ const callerTask = subtask.getParentTask();
1649
+ const calleeTask = preparedTask;
1650
+ const callerMemoryIdx = callerTask.getReturnMemoryIdx();
1651
+ const callerComponentIdx = callerTask.componentIdx();
1652
+
1653
+ // If a helper function was provided we are likely in a fused guest->guest call,
1654
+ // and the result will be delivered (lift/lowered) via helper function
1655
+ if (subtaskCallMeta.returnFn) {
1656
+ _debugLog('[_asyncStartCall()] return function present while ahndling subtask result, returning early (skipping lower)');
1657
+ return;
1658
+ }
1659
+
1660
+ // If there is no where to lower the results, exit early
1661
+ if (!subtaskCallMeta.resultPtr) {
1662
+ _debugLog('[_asyncStartCall()] no result ptr during subtask result handling, returning early (skipping lower)');
1663
+ return;
1664
+ }
1665
+
1666
+ let callerMemory;
1667
+ if (callerMemoryIdx) {
1668
+ callerMemory = GlobalComponentMemories.getMemory(callerComponentIdx, callerMemoryIdx);
1669
+ } else {
1670
+ const callerMemories = GlobalComponentMemories.getMemoriesForComponentIdx(callerComponentIdx);
1671
+ if (callerMemories.length != 1) { throw new Error(`unsupported amount of caller memories`); }
1672
+ callerMemory = callerMemories[0];
1673
+ }
1674
+
1675
+ if (!callerMemory) {
1676
+ throw new Error(`missing memory for to guest->guest call result (subtask [${subtask.id()}])`);
1677
+ }
1678
+
1679
+ const lowerFns = calleeTask.getReturnLowerFns();
1680
+ if (!lowerFns || lowerFns.length === 0) {
1681
+ throw new Error(`missing result lower metadata for guest->guests call (subtask [${subtask.id()}])`);
1682
+ }
1683
+
1684
+ if (lowerFns.length !== 1) {
1685
+ throw new Error(`only single result supported for guest->guest calls (subtask [${subtask.id()}])`);
1686
+ }
1687
+
1688
+ lowerFns[0]({
1689
+ realloc: undefined,
1690
+ memory: callerMemory,
1691
+ vals: [res],
1692
+ storagePtr: subtaskCallMeta.resultPtr,
1693
+ componentIdx: callerComponentIdx
1694
+ });
1695
+
1696
+ });
1697
+
1698
+ // Build call params
1699
+ const subtaskCallMeta = subtask.getCallMetadata();
1700
+ let startFnParams = [];
1701
+ let calleeParams = [];
1702
+ if (subtaskCallMeta.startFn && subtaskCallMeta.resultPtr) {
1703
+ // If we're using a fused component start fn and a result pointer is present,
1704
+ // then we need to pass the result pointer and other params to the start fn
1705
+ startFnParams.push(subtaskCallMeta.resultPtr, ...params);
1706
+ } else {
1707
+ // if not we need to pass params to the callee instead
1708
+ startFnParams.push(...params);
1709
+ calleeParams.push(...params);
1710
+ }
1711
+
1712
+ preparedTask.registerOnResolveHandler((res) => {
1713
+ _debugLog('[_asyncStartCall()] signaling subtask completion due to task completion', {
1714
+ childTaskID: preparedTask.id(),
1715
+ subtaskID: subtask.id(),
1716
+ parentTaskID: subtask.getParentTask().id(),
1717
+ });
1718
+ subtask.onResolve(res);
1719
+ });
1720
+
1721
+ // TODO(fix): start fns sometimes produce results, how should they be used?
1722
+ // the result should theoretically be used for flat lowering, but fused components do
1723
+ // this automatically!
1724
+ subtask.onStart({ startFnParams });
1725
+
1726
+ _debugLog("[_asyncStartCall()] initial call", {
1727
+ task: preparedTask.id(),
1728
+ subtaskID: subtask.id(),
1729
+ calleeFnName: callee.name,
1730
+ });
1731
+
1732
+ const callbackResult = callee.apply(null, calleeParams);
1733
+
1734
+ _debugLog("[_asyncStartCall()] after initial call", {
1735
+ task: preparedTask.id(),
1736
+ subtaskID: subtask.id(),
1737
+ calleeFnName: callee.name,
1738
+ });
1739
+
1740
+ const doSubtaskResolve = () => {
1741
+ subtask.deliverResolve();
1742
+ };
1743
+
1744
+ // If a single call resolved the subtask and there is no backpressure in the guest,
1745
+ // we can return immediately
1746
+ if (subtask.resolved() && !calleeBackpressure) {
1747
+ _debugLog("[_asyncStartCall()] instantly resolved", {
1748
+ calleeComponentIdx: preparedTask.componentIdx(),
1749
+ task: preparedTask.id(),
1750
+ subtaskID: subtask.id(),
1751
+ callerComponentIdx: subtask.componentIdx(),
1752
+ });
1753
+
1754
+ // If a fused component return function was specified for the subtask,
1755
+ // we've likely already called it during resolution of the task.
1756
+ //
1757
+ // In this case, we do not want to actually return 2 AKA "RETURNED",
1758
+ // but the normal started task state, because the fused component expects to get
1759
+ // the waitable + the original subtask state (0 AKA "STARTING")
1760
+ //
1761
+ if (subtask.getCallMetadata().returnFn) {
1762
+ return Number(subtask.waitableRep()) << 4 | subtaskState;
1763
+ }
1764
+
1765
+ doSubtaskResolve();
1766
+ return AsyncSubtask.State.RETURNED;
1767
+ }
1768
+
1769
+ // Start the (event) driver loop that will resolve the task
1770
+ new Promise(async (resolve, reject) => {
1771
+ if (subtask.resolved() && calleeBackpressure) {
1772
+ await calleeComponentState.waitForBackpressure();
1773
+
1774
+ _debugLog("[_asyncStartCall()] instantly resolved after cleared backpressure", {
1775
+ calleeComponentIdx: preparedTask.componentIdx(),
1776
+ task: preparedTask.id(),
1777
+ subtaskID: subtask.id(),
1778
+ callerComponentIdx: subtask.componentIdx(),
1779
+ });
1780
+ return;
1781
+ }
1782
+
1783
+ const started = await preparedTask.enter();
1784
+ if (!started) {
1785
+ _debugLog('[_asyncStartCall()] task failed early', {
1786
+ taskID: preparedTask.id(),
1787
+ subtaskID: subtask.id(),
1788
+ });
1789
+ throw new Error("task failed to start");
1790
+ return;
1791
+ }
1792
+
1793
+ // TODO: retrieve/pass along actual fn name the callback corresponds to
1794
+ // (at least something like `<lifted fn name>_callback`)
1795
+ const fnName = [
1796
+ '<task ',
1797
+ subtask.parentTaskID(),
1798
+ '/subtask ',
1799
+ subtask.id(),
1800
+ '/task ',
1801
+ preparedTask.id(),
1802
+ '>',
1803
+ ].join("");
1804
+
1805
+ try {
1806
+ _debugLog("[_asyncStartCall()] starting driver loop", { fnName, componentIdx: preparedTask.componentIdx(), });
1807
+ await _driverLoop({
1808
+ componentState: calleeComponentState,
1809
+ task: preparedTask,
1810
+ fnName,
1811
+ isAsync: true,
1812
+ callbackResult,
1813
+ resolve,
1814
+ reject
1815
+ });
1816
+ } catch (err) {
1817
+ _debugLog("[AsyncStartCall] drive loop call failure", { err });
1818
+ }
1819
+
1820
+ });
1821
+
1822
+ return Number(subtask.waitableRep()) << 4 | subtaskState;
1823
+ }
1824
+
1825
+ function _syncStartCall(callbackIdx) {
1826
+ _debugLog('[_syncStartCall()] args', { callbackIdx });
1827
+ throw new Error('synchronous start call not implemented!');
1828
+ }
1829
+
1830
+ function promiseWithResolvers() {
1831
+ if (Promise.withResolvers) {
1832
+ return Promise.withResolvers();
1833
+ } else {
1834
+ let resolve;
1835
+ let reject;
1836
+ const promise = new Promise((res, rej) => {
1837
+ resolve = res;
1838
+ reject = rej;
1839
+ });
1840
+ return { promise, resolve, reject };
1841
+ }
1842
+ }
1843
+
1844
+ const _debugLog = (...args) => {
1845
+ if (!globalThis?.process?.env?.JCO_DEBUG) { return; }
1846
+ console.debug(...args);
1847
+ }
1848
+ const ASYNC_DETERMINISM = 'random';
1849
+ const _coinFlip = () => { return Math.random() > 0.5; };
1850
+ const I32_MAX = 2_147_483_647;
1851
+ const I32_MIN = -2_147_483_648;
1852
+ const _typeCheckValidI32 = (n) => typeof n === 'number' && n >= I32_MIN && n <= I32_MAX;
1853
+
1854
+ const _typeCheckAsyncFn= (f) => {
1855
+ return f instanceof ASYNC_FN_CTOR;
1856
+ };
1857
+
1858
+ const ASYNC_FN_CTOR = (async () => {}).constructor;
1859
+
1860
+ const base64Compile = str => WebAssembly.compile(Uint8Array.from(atob(str), b => b.charCodeAt(0)));
1861
+
1862
+ const fetchCompile = url => fetch(url).then(WebAssembly.compileStreaming);
1863
+
1864
+ const symbolCabiDispose = Symbol.for('cabiDispose');
1865
+
1866
+ const symbolRscHandle = Symbol('handle');
1867
+
1868
+ const symbolRscRep = Symbol.for('cabiRep');
1869
+
1870
+ const symbolDispose = Symbol.dispose || Symbol.for('dispose');
1871
+
1872
+ const handleTables = [];
1873
+
1874
+ function finalizationRegistryCreate (unregister) {
1875
+ if (typeof FinalizationRegistry === 'undefined') {
1876
+ return { unregister () {} };
1877
+ }
1878
+ return new FinalizationRegistry(unregister);
1879
+ }
1880
+
1881
+ class ComponentError extends Error {
1882
+ constructor (value) {
1883
+ const enumerable = typeof value !== 'string';
1884
+ super(enumerable ? `${String(value)} (see error.payload)` : value);
1885
+ Object.defineProperty(this, 'payload', { value, enumerable });
1886
+ }
1887
+ }
1888
+
1889
+ function getErrorPayload(e) {
1890
+ if (e && hasOwnProperty.call(e, 'payload')) return e.payload;
1891
+ if (e instanceof Error) throw e;
1892
+ return e;
1893
+ }
1894
+
1895
+ class RepTable {
1896
+ #data = [0, null];
1897
+ #target;
1898
+
1899
+ constructor(args) {
1900
+ if (args?.target) { this.target = args.target }
1901
+ }
1902
+
1903
+ insert(val) {
1904
+ _debugLog('[RepTable#insert()] args', { val, target: this.target });
1905
+ const freeIdx = this.#data[0];
1906
+ if (freeIdx === 0) {
1907
+ this.#data.push(val);
1908
+ this.#data.push(null);
1909
+ return (this.#data.length >> 1) - 1;
1910
+ }
1911
+ this.#data[0] = this.#data[freeIdx << 1];
1912
+ const placementIdx = freeIdx << 1;
1913
+ this.#data[placementIdx] = val;
1914
+ this.#data[placementIdx + 1] = null;
1915
+ return freeIdx;
1916
+ }
1917
+
1918
+ get(rep) {
1919
+ _debugLog('[RepTable#get()] args', { rep, target: this.target });
1920
+ const baseIdx = rep << 1;
1921
+ const val = this.#data[baseIdx];
1922
+ return val;
1923
+ }
1924
+
1925
+ contains(rep) {
1926
+ _debugLog('[RepTable#contains()] args', { rep, target: this.target });
1927
+ const baseIdx = rep << 1;
1928
+ return !!this.#data[baseIdx];
1929
+ }
1930
+
1931
+ remove(rep) {
1932
+ _debugLog('[RepTable#remove()] args', { rep, target: this.target });
1933
+ if (this.#data.length === 2) { throw new Error('invalid'); }
1934
+
1935
+ const baseIdx = rep << 1;
1936
+ const val = this.#data[baseIdx];
1937
+ if (val === 0) { throw new Error('invalid resource rep (cannot be 0)'); }
1938
+
1939
+ this.#data[baseIdx] = this.#data[0];
1940
+ this.#data[0] = rep;
1941
+
1942
+ return val;
1943
+ }
1944
+
1945
+ clear() {
1946
+ _debugLog('[RepTable#clear()] args', { rep, target: this.target });
1947
+ this.#data = [0, null];
1948
+ }
1949
+ }
1950
+
1951
+ const hasOwnProperty = Object.prototype.hasOwnProperty;
1952
+
1953
+ const instantiateCore = WebAssembly.instantiate;
1954
+
1955
+ class GlobalComponentAsyncLowers {
1956
+ static map = new Map();
1957
+
1958
+ constructor() { throw new Error('GlobalComponentAsyncLowers should not be constructed'); }
1959
+
1960
+ static define(args) {
1961
+ const { componentIdx, qualifiedImportFn, fn } = args;
1962
+ let inner = GlobalComponentAsyncLowers.map.get(componentIdx);
1963
+ if (!inner) {
1964
+ inner = new Map();
1965
+ GlobalComponentAsyncLowers.map.set(componentIdx, inner);
1966
+ }
1967
+
1968
+ inner.set(qualifiedImportFn, fn);
1969
+ }
1970
+
1971
+ static lookup(componentIdx, qualifiedImportFn) {
1972
+ let inner = GlobalComponentAsyncLowers.map.get(componentIdx);
1973
+ if (!inner) {
1974
+ inner = new Map();
1975
+ GlobalComponentAsyncLowers.map.set(componentIdx, inner);
1976
+ }
1977
+
1978
+ const found = inner.get(qualifiedImportFn);
1979
+ if (found) { return found; }
1980
+
1981
+ return (...args) => {
1982
+ const [originalFn, ...params] = args;
1983
+ return originalFn(...params);
1984
+ };
1985
+ }
1986
+ }
1987
+
1988
+ class GlobalComponentMemories {
1989
+ static map = new Map();
1990
+
1991
+ constructor() { throw new Error('GlobalComponentMemories should not be constructed'); }
1992
+
1993
+ static save(args) {
1994
+ const { idx, componentIdx, memory } = args;
1995
+ let inner = GlobalComponentMemories.map.get(componentIdx);
1996
+ if (!inner) {
1997
+ inner = [];
1998
+ GlobalComponentMemories.map.set(componentIdx, inner);
1999
+ }
2000
+ inner.push({ memory, idx });
2001
+ }
2002
+
2003
+ static getMemoriesForComponentIdx(componentIdx) {
2004
+ const metas = GlobalComponentMemories.map.get(componentIdx);
2005
+ return metas.map(meta => meta.memory);
2006
+ }
2007
+
2008
+ static getMemory(componentIdx, idx) {
2009
+ const metas = GlobalComponentMemories.map.get(componentIdx);
2010
+ return metas.find(meta => meta.idx === idx)?.memory;
2011
+ }
2012
+ }
2013
+
2014
+
2015
+ let exports0;
2016
+
2017
+ let lowered_import_0_metadata = {
2018
+ qualifiedImportFn: 'wasi:random/random@0.2.6#get-random-u64',
2019
+ moduleIdx: null,
2020
+ };
2021
+
2022
+
2023
+ function trampoline0() {
2024
+ _debugLog('[iface="wasi:random/random@0.2.6", function="get-random-u64"] [Instruction::CallInterface] (sync, @ enter)');
2025
+ const hostProvided = getRandomU64._isHostProvided;
2026
+
2027
+ let parentTask;
2028
+ let task;
2029
+ let subtask;
2030
+
2031
+ const createTask = () => {
2032
+ const results = createNewCurrentTask({
2033
+ componentIdx: 0,
2034
+ isAsync: false,
2035
+ entryFnName: 'getRandomU64',
2036
+ getCallbackFn: () => null,
2037
+ callbackFnName: 'null',
2038
+ errHandling: 'none',
2039
+ callingWasmExport: false,
2040
+ });
2041
+ task = results[0];
2042
+ };
2043
+
2044
+ taskCreation: {
2045
+ parentTask = getCurrentTask(0)?.task;
2046
+ if (!parentTask) {
2047
+ createTask();
2048
+ break taskCreation;
2049
+ }
2050
+
2051
+ createTask();
2052
+
2053
+ const isHostAsyncImport = hostProvided && false;
2054
+ if (isHostAsyncImport) {
2055
+ subtask = parentTask.getLatestSubtask();
2056
+ if (!subtask) {
2057
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2058
+ }
2059
+ subtask.setChildTask(task);
2060
+ task.setParentSubtask(subtask);
2061
+ }
2062
+ }
2063
+
2064
+ let ret = getRandomU64();
2065
+ endCurrentTask(0);
2066
+ _debugLog('[iface="wasi:random/random@0.2.6", function="get-random-u64"][Instruction::Return]', {
2067
+ funcName: 'get-random-u64',
2068
+ paramCount: 1,
2069
+ async: false,
2070
+ postReturn: false
2071
+ });
2072
+ return toUint64(ret);
2073
+ }
2074
+
2075
+
2076
+ let lowered_import_1_metadata = {
2077
+ qualifiedImportFn: 'wasi:cli/exit@0.2.6#exit',
2078
+ moduleIdx: null,
2079
+ };
2080
+
2081
+
2082
+ function trampoline10(arg0) {
2083
+ let variant0;
2084
+ switch (arg0) {
2085
+ case 0: {
2086
+ variant0= {
2087
+ tag: 'ok',
2088
+ val: undefined
2089
+ };
2090
+ break;
2091
+ }
2092
+ case 1: {
2093
+ variant0= {
2094
+ tag: 'err',
2095
+ val: undefined
2096
+ };
2097
+ break;
2098
+ }
2099
+ default: {
2100
+ throw new TypeError('invalid variant discriminant for expected');
2101
+ }
2102
+ }
2103
+ _debugLog('[iface="wasi:cli/exit@0.2.6", function="exit"] [Instruction::CallInterface] (sync, @ enter)');
2104
+ const hostProvided = exit._isHostProvided;
2105
+
2106
+ let parentTask;
2107
+ let task;
2108
+ let subtask;
2109
+
2110
+ const createTask = () => {
2111
+ const results = createNewCurrentTask({
2112
+ componentIdx: 0,
2113
+ isAsync: false,
2114
+ entryFnName: 'exit',
2115
+ getCallbackFn: () => null,
2116
+ callbackFnName: 'null',
2117
+ errHandling: 'none',
2118
+ callingWasmExport: false,
2119
+ });
2120
+ task = results[0];
2121
+ };
2122
+
2123
+ taskCreation: {
2124
+ parentTask = getCurrentTask(0)?.task;
2125
+ if (!parentTask) {
2126
+ createTask();
2127
+ break taskCreation;
2128
+ }
2129
+
2130
+ createTask();
2131
+
2132
+ const isHostAsyncImport = hostProvided && false;
2133
+ if (isHostAsyncImport) {
2134
+ subtask = parentTask.getLatestSubtask();
2135
+ if (!subtask) {
2136
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2137
+ }
2138
+ subtask.setChildTask(task);
2139
+ task.setParentSubtask(subtask);
2140
+ }
2141
+ }
2142
+
2143
+ let ret; exit(variant0);
2144
+ endCurrentTask(0);
2145
+ _debugLog('[iface="wasi:cli/exit@0.2.6", function="exit"][Instruction::Return]', {
2146
+ funcName: 'exit',
2147
+ paramCount: 0,
2148
+ async: false,
2149
+ postReturn: false
2150
+ });
2151
+ }
2152
+
2153
+
2154
+ let lowered_import_2_metadata = {
2155
+ qualifiedImportFn: 'wasi:io/poll@0.2.6#[method]pollable.block',
2156
+ moduleIdx: null,
2157
+ };
2158
+
2159
+ const handleTable0 = [T_FLAG, 0];
2160
+ const captureTable0= new Map();
2161
+ let captureCnt0 = 0;
2162
+ handleTables[0] = handleTable0;
2163
+
2164
+ function trampoline11(arg0) {
2165
+ var handle1 = arg0;
2166
+ var rep2 = handleTable0[(handle1 << 1) + 1] & ~T_FLAG;
2167
+ var rsc0 = captureTable0.get(rep2);
2168
+ if (!rsc0) {
2169
+ rsc0 = Object.create(Pollable.prototype);
2170
+ Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1});
2171
+ Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2});
2172
+ }
2173
+ curResourceBorrows.push(rsc0);
2174
+ _debugLog('[iface="wasi:io/poll@0.2.6", function="[method]pollable.block"] [Instruction::CallInterface] (sync, @ enter)');
2175
+ const hostProvided = rsc0.block._isHostProvided;
2176
+
2177
+ let parentTask;
2178
+ let task;
2179
+ let subtask;
2180
+
2181
+ const createTask = () => {
2182
+ const results = createNewCurrentTask({
2183
+ componentIdx: 0,
2184
+ isAsync: false,
2185
+ entryFnName: 'block',
2186
+ getCallbackFn: () => null,
2187
+ callbackFnName: 'null',
2188
+ errHandling: 'none',
2189
+ callingWasmExport: false,
2190
+ });
2191
+ task = results[0];
2192
+ };
2193
+
2194
+ taskCreation: {
2195
+ parentTask = getCurrentTask(0)?.task;
2196
+ if (!parentTask) {
2197
+ createTask();
2198
+ break taskCreation;
2199
+ }
2200
+
2201
+ createTask();
2202
+
2203
+ const isHostAsyncImport = hostProvided && false;
2204
+ if (isHostAsyncImport) {
2205
+ subtask = parentTask.getLatestSubtask();
2206
+ if (!subtask) {
2207
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2208
+ }
2209
+ subtask.setChildTask(task);
2210
+ task.setParentSubtask(subtask);
2211
+ }
2212
+ }
2213
+
2214
+ let ret; rsc0.block();
2215
+ for (const rsc of curResourceBorrows) {
2216
+ rsc[symbolRscHandle] = undefined;
2217
+ }
2218
+ curResourceBorrows = [];
2219
+ endCurrentTask(0);
2220
+ _debugLog('[iface="wasi:io/poll@0.2.6", function="[method]pollable.block"][Instruction::Return]', {
2221
+ funcName: '[method]pollable.block',
2222
+ paramCount: 0,
2223
+ async: false,
2224
+ postReturn: false
2225
+ });
2226
+ }
2227
+
2228
+
2229
+ let lowered_import_3_metadata = {
2230
+ qualifiedImportFn: 'wasi:io/streams@0.2.6#[method]output-stream.subscribe',
2231
+ moduleIdx: null,
2232
+ };
2233
+
2234
+ const handleTable3 = [T_FLAG, 0];
2235
+ const captureTable3= new Map();
2236
+ let captureCnt3 = 0;
2237
+ handleTables[3] = handleTable3;
2238
+
2239
+ function trampoline12(arg0) {
2240
+ var handle1 = arg0;
2241
+ var rep2 = handleTable3[(handle1 << 1) + 1] & ~T_FLAG;
2242
+ var rsc0 = captureTable3.get(rep2);
2243
+ if (!rsc0) {
2244
+ rsc0 = Object.create(OutputStream.prototype);
2245
+ Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1});
2246
+ Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2});
2247
+ }
2248
+ curResourceBorrows.push(rsc0);
2249
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.subscribe"] [Instruction::CallInterface] (sync, @ enter)');
2250
+ const hostProvided = rsc0.subscribe._isHostProvided;
2251
+
2252
+ let parentTask;
2253
+ let task;
2254
+ let subtask;
2255
+
2256
+ const createTask = () => {
2257
+ const results = createNewCurrentTask({
2258
+ componentIdx: 0,
2259
+ isAsync: false,
2260
+ entryFnName: 'subscribe',
2261
+ getCallbackFn: () => null,
2262
+ callbackFnName: 'null',
2263
+ errHandling: 'none',
2264
+ callingWasmExport: false,
2265
+ });
2266
+ task = results[0];
2267
+ };
2268
+
2269
+ taskCreation: {
2270
+ parentTask = getCurrentTask(0)?.task;
2271
+ if (!parentTask) {
2272
+ createTask();
2273
+ break taskCreation;
2274
+ }
2275
+
2276
+ createTask();
2277
+
2278
+ const isHostAsyncImport = hostProvided && false;
2279
+ if (isHostAsyncImport) {
2280
+ subtask = parentTask.getLatestSubtask();
2281
+ if (!subtask) {
2282
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2283
+ }
2284
+ subtask.setChildTask(task);
2285
+ task.setParentSubtask(subtask);
2286
+ }
2287
+ }
2288
+
2289
+ let ret = rsc0.subscribe();
2290
+ for (const rsc of curResourceBorrows) {
2291
+ rsc[symbolRscHandle] = undefined;
2292
+ }
2293
+ curResourceBorrows = [];
2294
+ endCurrentTask(0);
2295
+ if (!(ret instanceof Pollable)) {
2296
+ throw new TypeError('Resource error: Not a valid "Pollable" resource.');
2297
+ }
2298
+ var handle3 = ret[symbolRscHandle];
2299
+ if (!handle3) {
2300
+ const rep = ret[symbolRscRep] || ++captureCnt0;
2301
+ captureTable0.set(rep, ret);
2302
+ handle3 = rscTableCreateOwn(handleTable0, rep);
2303
+ }
2304
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.subscribe"][Instruction::Return]', {
2305
+ funcName: '[method]output-stream.subscribe',
2306
+ paramCount: 1,
2307
+ async: false,
2308
+ postReturn: false
2309
+ });
2310
+ return handle3;
2311
+ }
2312
+
2313
+
2314
+ let lowered_import_4_metadata = {
2315
+ qualifiedImportFn: 'wasi:cli/stdin@0.2.6#get-stdin',
2316
+ moduleIdx: null,
2317
+ };
2318
+
2319
+ const handleTable2 = [T_FLAG, 0];
2320
+ const captureTable2= new Map();
2321
+ let captureCnt2 = 0;
2322
+ handleTables[2] = handleTable2;
2323
+
2324
+ function trampoline13() {
2325
+ _debugLog('[iface="wasi:cli/stdin@0.2.6", function="get-stdin"] [Instruction::CallInterface] (sync, @ enter)');
2326
+ const hostProvided = getStdin._isHostProvided;
2327
+
2328
+ let parentTask;
2329
+ let task;
2330
+ let subtask;
2331
+
2332
+ const createTask = () => {
2333
+ const results = createNewCurrentTask({
2334
+ componentIdx: 0,
2335
+ isAsync: false,
2336
+ entryFnName: 'getStdin',
2337
+ getCallbackFn: () => null,
2338
+ callbackFnName: 'null',
2339
+ errHandling: 'none',
2340
+ callingWasmExport: false,
2341
+ });
2342
+ task = results[0];
2343
+ };
2344
+
2345
+ taskCreation: {
2346
+ parentTask = getCurrentTask(0)?.task;
2347
+ if (!parentTask) {
2348
+ createTask();
2349
+ break taskCreation;
2350
+ }
2351
+
2352
+ createTask();
2353
+
2354
+ const isHostAsyncImport = hostProvided && false;
2355
+ if (isHostAsyncImport) {
2356
+ subtask = parentTask.getLatestSubtask();
2357
+ if (!subtask) {
2358
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2359
+ }
2360
+ subtask.setChildTask(task);
2361
+ task.setParentSubtask(subtask);
2362
+ }
2363
+ }
2364
+
2365
+ let ret = getStdin();
2366
+ endCurrentTask(0);
2367
+ if (!(ret instanceof InputStream)) {
2368
+ throw new TypeError('Resource error: Not a valid "InputStream" resource.');
2369
+ }
2370
+ var handle0 = ret[symbolRscHandle];
2371
+ if (!handle0) {
2372
+ const rep = ret[symbolRscRep] || ++captureCnt2;
2373
+ captureTable2.set(rep, ret);
2374
+ handle0 = rscTableCreateOwn(handleTable2, rep);
2375
+ }
2376
+ _debugLog('[iface="wasi:cli/stdin@0.2.6", function="get-stdin"][Instruction::Return]', {
2377
+ funcName: 'get-stdin',
2378
+ paramCount: 1,
2379
+ async: false,
2380
+ postReturn: false
2381
+ });
2382
+ return handle0;
2383
+ }
2384
+
2385
+
2386
+ let lowered_import_5_metadata = {
2387
+ qualifiedImportFn: 'wasi:cli/stdout@0.2.6#get-stdout',
2388
+ moduleIdx: null,
2389
+ };
2390
+
2391
+
2392
+ function trampoline14() {
2393
+ _debugLog('[iface="wasi:cli/stdout@0.2.6", function="get-stdout"] [Instruction::CallInterface] (sync, @ enter)');
2394
+ const hostProvided = getStdout._isHostProvided;
2395
+
2396
+ let parentTask;
2397
+ let task;
2398
+ let subtask;
2399
+
2400
+ const createTask = () => {
2401
+ const results = createNewCurrentTask({
2402
+ componentIdx: 0,
2403
+ isAsync: false,
2404
+ entryFnName: 'getStdout',
2405
+ getCallbackFn: () => null,
2406
+ callbackFnName: 'null',
2407
+ errHandling: 'none',
2408
+ callingWasmExport: false,
2409
+ });
2410
+ task = results[0];
2411
+ };
2412
+
2413
+ taskCreation: {
2414
+ parentTask = getCurrentTask(0)?.task;
2415
+ if (!parentTask) {
2416
+ createTask();
2417
+ break taskCreation;
2418
+ }
2419
+
2420
+ createTask();
2421
+
2422
+ const isHostAsyncImport = hostProvided && false;
2423
+ if (isHostAsyncImport) {
2424
+ subtask = parentTask.getLatestSubtask();
2425
+ if (!subtask) {
2426
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2427
+ }
2428
+ subtask.setChildTask(task);
2429
+ task.setParentSubtask(subtask);
2430
+ }
2431
+ }
2432
+
2433
+ let ret = getStdout();
2434
+ endCurrentTask(0);
2435
+ if (!(ret instanceof OutputStream)) {
2436
+ throw new TypeError('Resource error: Not a valid "OutputStream" resource.');
2437
+ }
2438
+ var handle0 = ret[symbolRscHandle];
2439
+ if (!handle0) {
2440
+ const rep = ret[symbolRscRep] || ++captureCnt3;
2441
+ captureTable3.set(rep, ret);
2442
+ handle0 = rscTableCreateOwn(handleTable3, rep);
2443
+ }
2444
+ _debugLog('[iface="wasi:cli/stdout@0.2.6", function="get-stdout"][Instruction::Return]', {
2445
+ funcName: 'get-stdout',
2446
+ paramCount: 1,
2447
+ async: false,
2448
+ postReturn: false
2449
+ });
2450
+ return handle0;
2451
+ }
2452
+
2453
+
2454
+ let lowered_import_6_metadata = {
2455
+ qualifiedImportFn: 'wasi:cli/stderr@0.2.6#get-stderr',
2456
+ moduleIdx: null,
2457
+ };
2458
+
2459
+
2460
+ function trampoline15() {
2461
+ _debugLog('[iface="wasi:cli/stderr@0.2.6", function="get-stderr"] [Instruction::CallInterface] (sync, @ enter)');
2462
+ const hostProvided = getStderr._isHostProvided;
2463
+
2464
+ let parentTask;
2465
+ let task;
2466
+ let subtask;
2467
+
2468
+ const createTask = () => {
2469
+ const results = createNewCurrentTask({
2470
+ componentIdx: 0,
2471
+ isAsync: false,
2472
+ entryFnName: 'getStderr',
2473
+ getCallbackFn: () => null,
2474
+ callbackFnName: 'null',
2475
+ errHandling: 'none',
2476
+ callingWasmExport: false,
2477
+ });
2478
+ task = results[0];
2479
+ };
2480
+
2481
+ taskCreation: {
2482
+ parentTask = getCurrentTask(0)?.task;
2483
+ if (!parentTask) {
2484
+ createTask();
2485
+ break taskCreation;
2486
+ }
2487
+
2488
+ createTask();
2489
+
2490
+ const isHostAsyncImport = hostProvided && false;
2491
+ if (isHostAsyncImport) {
2492
+ subtask = parentTask.getLatestSubtask();
2493
+ if (!subtask) {
2494
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2495
+ }
2496
+ subtask.setChildTask(task);
2497
+ task.setParentSubtask(subtask);
2498
+ }
2499
+ }
2500
+
2501
+ let ret = getStderr();
2502
+ endCurrentTask(0);
2503
+ if (!(ret instanceof OutputStream)) {
2504
+ throw new TypeError('Resource error: Not a valid "OutputStream" resource.');
2505
+ }
2506
+ var handle0 = ret[symbolRscHandle];
2507
+ if (!handle0) {
2508
+ const rep = ret[symbolRscRep] || ++captureCnt3;
2509
+ captureTable3.set(rep, ret);
2510
+ handle0 = rscTableCreateOwn(handleTable3, rep);
2511
+ }
2512
+ _debugLog('[iface="wasi:cli/stderr@0.2.6", function="get-stderr"][Instruction::Return]', {
2513
+ funcName: 'get-stderr',
2514
+ paramCount: 1,
2515
+ async: false,
2516
+ postReturn: false
2517
+ });
2518
+ return handle0;
2519
+ }
2520
+
2521
+ let exports1;
2522
+ let memory0;
2523
+ let realloc0;
2524
+
2525
+ let lowered_import_7_metadata = {
2526
+ qualifiedImportFn: 'wasi:random/insecure-seed@0.2.6#insecure-seed',
2527
+ moduleIdx: null,
2528
+ };
2529
+
2530
+
2531
+ function trampoline16(arg0) {
2532
+ _debugLog('[iface="wasi:random/insecure-seed@0.2.6", function="insecure-seed"] [Instruction::CallInterface] (sync, @ enter)');
2533
+ const hostProvided = insecureSeed._isHostProvided;
2534
+
2535
+ let parentTask;
2536
+ let task;
2537
+ let subtask;
2538
+
2539
+ const createTask = () => {
2540
+ const results = createNewCurrentTask({
2541
+ componentIdx: 0,
2542
+ isAsync: false,
2543
+ entryFnName: 'insecureSeed',
2544
+ getCallbackFn: () => null,
2545
+ callbackFnName: 'null',
2546
+ errHandling: 'none',
2547
+ callingWasmExport: false,
2548
+ });
2549
+ task = results[0];
2550
+ };
2551
+
2552
+ taskCreation: {
2553
+ parentTask = getCurrentTask(0)?.task;
2554
+ if (!parentTask) {
2555
+ createTask();
2556
+ break taskCreation;
2557
+ }
2558
+
2559
+ createTask();
2560
+
2561
+ const isHostAsyncImport = hostProvided && false;
2562
+ if (isHostAsyncImport) {
2563
+ subtask = parentTask.getLatestSubtask();
2564
+ if (!subtask) {
2565
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2566
+ }
2567
+ subtask.setChildTask(task);
2568
+ task.setParentSubtask(subtask);
2569
+ }
2570
+ }
2571
+
2572
+ let ret = insecureSeed();
2573
+ endCurrentTask(0);
2574
+ var [tuple0_0, tuple0_1] = ret;
2575
+ dataView(memory0).setBigInt64(arg0 + 0, toUint64(tuple0_0), true);
2576
+ dataView(memory0).setBigInt64(arg0 + 8, toUint64(tuple0_1), true);
2577
+ _debugLog('[iface="wasi:random/insecure-seed@0.2.6", function="insecure-seed"][Instruction::Return]', {
2578
+ funcName: 'insecure-seed',
2579
+ paramCount: 0,
2580
+ async: false,
2581
+ postReturn: false
2582
+ });
2583
+ }
2584
+
2585
+
2586
+ let lowered_import_8_metadata = {
2587
+ qualifiedImportFn: 'wasi:io/streams@0.2.6#[method]output-stream.check-write',
2588
+ moduleIdx: null,
2589
+ };
2590
+
2591
+ const handleTable1 = [T_FLAG, 0];
2592
+ const captureTable1= new Map();
2593
+ let captureCnt1 = 0;
2594
+ handleTables[1] = handleTable1;
2595
+
2596
+ function trampoline17(arg0, arg1) {
2597
+ var handle1 = arg0;
2598
+ var rep2 = handleTable3[(handle1 << 1) + 1] & ~T_FLAG;
2599
+ var rsc0 = captureTable3.get(rep2);
2600
+ if (!rsc0) {
2601
+ rsc0 = Object.create(OutputStream.prototype);
2602
+ Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1});
2603
+ Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2});
2604
+ }
2605
+ curResourceBorrows.push(rsc0);
2606
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.check-write"] [Instruction::CallInterface] (sync, @ enter)');
2607
+ const hostProvided = rsc0.checkWrite._isHostProvided;
2608
+
2609
+ let parentTask;
2610
+ let task;
2611
+ let subtask;
2612
+
2613
+ const createTask = () => {
2614
+ const results = createNewCurrentTask({
2615
+ componentIdx: 0,
2616
+ isAsync: false,
2617
+ entryFnName: 'checkWrite',
2618
+ getCallbackFn: () => null,
2619
+ callbackFnName: 'null',
2620
+ errHandling: 'result-catch-handler',
2621
+ callingWasmExport: false,
2622
+ });
2623
+ task = results[0];
2624
+ };
2625
+
2626
+ taskCreation: {
2627
+ parentTask = getCurrentTask(0)?.task;
2628
+ if (!parentTask) {
2629
+ createTask();
2630
+ break taskCreation;
2631
+ }
2632
+
2633
+ createTask();
2634
+
2635
+ const isHostAsyncImport = hostProvided && false;
2636
+ if (isHostAsyncImport) {
2637
+ subtask = parentTask.getLatestSubtask();
2638
+ if (!subtask) {
2639
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2640
+ }
2641
+ subtask.setChildTask(task);
2642
+ task.setParentSubtask(subtask);
2643
+ }
2644
+ }
2645
+
2646
+
2647
+ let ret;
2648
+ try {
2649
+ ret = { tag: 'ok', val: rsc0.checkWrite()};
2650
+ } catch (e) {
2651
+ ret = { tag: 'err', val: getErrorPayload(e) };
2652
+ }
2653
+
2654
+ for (const rsc of curResourceBorrows) {
2655
+ rsc[symbolRscHandle] = undefined;
2656
+ }
2657
+ curResourceBorrows = [];
2658
+ endCurrentTask(0);
2659
+ var variant5 = ret;
2660
+ switch (variant5.tag) {
2661
+ case 'ok': {
2662
+ const e = variant5.val;
2663
+ dataView(memory0).setInt8(arg1 + 0, 0, true);
2664
+ dataView(memory0).setBigInt64(arg1 + 8, toUint64(e), true);
2665
+ break;
2666
+ }
2667
+ case 'err': {
2668
+ const e = variant5.val;
2669
+ dataView(memory0).setInt8(arg1 + 0, 1, true);
2670
+ var variant4 = e;
2671
+ switch (variant4.tag) {
2672
+ case 'last-operation-failed': {
2673
+ const e = variant4.val;
2674
+ dataView(memory0).setInt8(arg1 + 8, 0, true);
2675
+ if (!(e instanceof Error$1)) {
2676
+ throw new TypeError('Resource error: Not a valid "Error" resource.');
2677
+ }
2678
+ var handle3 = e[symbolRscHandle];
2679
+ if (!handle3) {
2680
+ const rep = e[symbolRscRep] || ++captureCnt1;
2681
+ captureTable1.set(rep, e);
2682
+ handle3 = rscTableCreateOwn(handleTable1, rep);
2683
+ }
2684
+ dataView(memory0).setInt32(arg1 + 12, handle3, true);
2685
+ break;
2686
+ }
2687
+ case 'closed': {
2688
+ dataView(memory0).setInt8(arg1 + 8, 1, true);
2689
+ break;
2690
+ }
2691
+ default: {
2692
+ throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant4.tag)}\` (received \`${variant4}\`) specified for \`StreamError\``);
2693
+ }
2694
+ }
2695
+ break;
2696
+ }
2697
+ default: {
2698
+ throw new TypeError('invalid variant specified for result');
2699
+ }
2700
+ }
2701
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.check-write"][Instruction::Return]', {
2702
+ funcName: '[method]output-stream.check-write',
2703
+ paramCount: 0,
2704
+ async: false,
2705
+ postReturn: false
2706
+ });
2707
+ }
2708
+
2709
+
2710
+ let lowered_import_9_metadata = {
2711
+ qualifiedImportFn: 'wasi:io/streams@0.2.6#[method]output-stream.write',
2712
+ moduleIdx: null,
2713
+ };
2714
+
2715
+
2716
+ function trampoline18(arg0, arg1, arg2, arg3) {
2717
+ var handle1 = arg0;
2718
+ var rep2 = handleTable3[(handle1 << 1) + 1] & ~T_FLAG;
2719
+ var rsc0 = captureTable3.get(rep2);
2720
+ if (!rsc0) {
2721
+ rsc0 = Object.create(OutputStream.prototype);
2722
+ Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1});
2723
+ Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2});
2724
+ }
2725
+ curResourceBorrows.push(rsc0);
2726
+ var ptr3 = arg1;
2727
+ var len3 = arg2;
2728
+ var result3 = new Uint8Array(memory0.buffer.slice(ptr3, ptr3 + len3 * 1));
2729
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.write"] [Instruction::CallInterface] (sync, @ enter)');
2730
+ const hostProvided = rsc0.write._isHostProvided;
2731
+
2732
+ let parentTask;
2733
+ let task;
2734
+ let subtask;
2735
+
2736
+ const createTask = () => {
2737
+ const results = createNewCurrentTask({
2738
+ componentIdx: 0,
2739
+ isAsync: false,
2740
+ entryFnName: 'write',
2741
+ getCallbackFn: () => null,
2742
+ callbackFnName: 'null',
2743
+ errHandling: 'result-catch-handler',
2744
+ callingWasmExport: false,
2745
+ });
2746
+ task = results[0];
2747
+ };
2748
+
2749
+ taskCreation: {
2750
+ parentTask = getCurrentTask(0)?.task;
2751
+ if (!parentTask) {
2752
+ createTask();
2753
+ break taskCreation;
2754
+ }
2755
+
2756
+ createTask();
2757
+
2758
+ const isHostAsyncImport = hostProvided && false;
2759
+ if (isHostAsyncImport) {
2760
+ subtask = parentTask.getLatestSubtask();
2761
+ if (!subtask) {
2762
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2763
+ }
2764
+ subtask.setChildTask(task);
2765
+ task.setParentSubtask(subtask);
2766
+ }
2767
+ }
2768
+
2769
+
2770
+ let ret;
2771
+ try {
2772
+ ret = { tag: 'ok', val: rsc0.write(result3)};
2773
+ } catch (e) {
2774
+ ret = { tag: 'err', val: getErrorPayload(e) };
2775
+ }
2776
+
2777
+ for (const rsc of curResourceBorrows) {
2778
+ rsc[symbolRscHandle] = undefined;
2779
+ }
2780
+ curResourceBorrows = [];
2781
+ endCurrentTask(0);
2782
+ var variant6 = ret;
2783
+ switch (variant6.tag) {
2784
+ case 'ok': {
2785
+ const e = variant6.val;
2786
+ dataView(memory0).setInt8(arg3 + 0, 0, true);
2787
+ break;
2788
+ }
2789
+ case 'err': {
2790
+ const e = variant6.val;
2791
+ dataView(memory0).setInt8(arg3 + 0, 1, true);
2792
+ var variant5 = e;
2793
+ switch (variant5.tag) {
2794
+ case 'last-operation-failed': {
2795
+ const e = variant5.val;
2796
+ dataView(memory0).setInt8(arg3 + 4, 0, true);
2797
+ if (!(e instanceof Error$1)) {
2798
+ throw new TypeError('Resource error: Not a valid "Error" resource.');
2799
+ }
2800
+ var handle4 = e[symbolRscHandle];
2801
+ if (!handle4) {
2802
+ const rep = e[symbolRscRep] || ++captureCnt1;
2803
+ captureTable1.set(rep, e);
2804
+ handle4 = rscTableCreateOwn(handleTable1, rep);
2805
+ }
2806
+ dataView(memory0).setInt32(arg3 + 8, handle4, true);
2807
+ break;
2808
+ }
2809
+ case 'closed': {
2810
+ dataView(memory0).setInt8(arg3 + 4, 1, true);
2811
+ break;
2812
+ }
2813
+ default: {
2814
+ throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant5.tag)}\` (received \`${variant5}\`) specified for \`StreamError\``);
2815
+ }
2816
+ }
2817
+ break;
2818
+ }
2819
+ default: {
2820
+ throw new TypeError('invalid variant specified for result');
2821
+ }
2822
+ }
2823
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.write"][Instruction::Return]', {
2824
+ funcName: '[method]output-stream.write',
2825
+ paramCount: 0,
2826
+ async: false,
2827
+ postReturn: false
2828
+ });
2829
+ }
2830
+
2831
+
2832
+ let lowered_import_10_metadata = {
2833
+ qualifiedImportFn: 'wasi:io/streams@0.2.6#[method]output-stream.blocking-flush',
2834
+ moduleIdx: null,
2835
+ };
2836
+
2837
+
2838
+ function trampoline19(arg0, arg1) {
2839
+ var handle1 = arg0;
2840
+ var rep2 = handleTable3[(handle1 << 1) + 1] & ~T_FLAG;
2841
+ var rsc0 = captureTable3.get(rep2);
2842
+ if (!rsc0) {
2843
+ rsc0 = Object.create(OutputStream.prototype);
2844
+ Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1});
2845
+ Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2});
2846
+ }
2847
+ curResourceBorrows.push(rsc0);
2848
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.blocking-flush"] [Instruction::CallInterface] (sync, @ enter)');
2849
+ const hostProvided = rsc0.blockingFlush._isHostProvided;
2850
+
2851
+ let parentTask;
2852
+ let task;
2853
+ let subtask;
2854
+
2855
+ const createTask = () => {
2856
+ const results = createNewCurrentTask({
2857
+ componentIdx: 0,
2858
+ isAsync: false,
2859
+ entryFnName: 'blockingFlush',
2860
+ getCallbackFn: () => null,
2861
+ callbackFnName: 'null',
2862
+ errHandling: 'result-catch-handler',
2863
+ callingWasmExport: false,
2864
+ });
2865
+ task = results[0];
2866
+ };
2867
+
2868
+ taskCreation: {
2869
+ parentTask = getCurrentTask(0)?.task;
2870
+ if (!parentTask) {
2871
+ createTask();
2872
+ break taskCreation;
2873
+ }
2874
+
2875
+ createTask();
2876
+
2877
+ const isHostAsyncImport = hostProvided && false;
2878
+ if (isHostAsyncImport) {
2879
+ subtask = parentTask.getLatestSubtask();
2880
+ if (!subtask) {
2881
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2882
+ }
2883
+ subtask.setChildTask(task);
2884
+ task.setParentSubtask(subtask);
2885
+ }
2886
+ }
2887
+
2888
+
2889
+ let ret;
2890
+ try {
2891
+ ret = { tag: 'ok', val: rsc0.blockingFlush()};
2892
+ } catch (e) {
2893
+ ret = { tag: 'err', val: getErrorPayload(e) };
2894
+ }
2895
+
2896
+ for (const rsc of curResourceBorrows) {
2897
+ rsc[symbolRscHandle] = undefined;
2898
+ }
2899
+ curResourceBorrows = [];
2900
+ endCurrentTask(0);
2901
+ var variant5 = ret;
2902
+ switch (variant5.tag) {
2903
+ case 'ok': {
2904
+ const e = variant5.val;
2905
+ dataView(memory0).setInt8(arg1 + 0, 0, true);
2906
+ break;
2907
+ }
2908
+ case 'err': {
2909
+ const e = variant5.val;
2910
+ dataView(memory0).setInt8(arg1 + 0, 1, true);
2911
+ var variant4 = e;
2912
+ switch (variant4.tag) {
2913
+ case 'last-operation-failed': {
2914
+ const e = variant4.val;
2915
+ dataView(memory0).setInt8(arg1 + 4, 0, true);
2916
+ if (!(e instanceof Error$1)) {
2917
+ throw new TypeError('Resource error: Not a valid "Error" resource.');
2918
+ }
2919
+ var handle3 = e[symbolRscHandle];
2920
+ if (!handle3) {
2921
+ const rep = e[symbolRscRep] || ++captureCnt1;
2922
+ captureTable1.set(rep, e);
2923
+ handle3 = rscTableCreateOwn(handleTable1, rep);
2924
+ }
2925
+ dataView(memory0).setInt32(arg1 + 8, handle3, true);
2926
+ break;
2927
+ }
2928
+ case 'closed': {
2929
+ dataView(memory0).setInt8(arg1 + 4, 1, true);
2930
+ break;
2931
+ }
2932
+ default: {
2933
+ throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant4.tag)}\` (received \`${variant4}\`) specified for \`StreamError\``);
2934
+ }
2935
+ }
2936
+ break;
2937
+ }
2938
+ default: {
2939
+ throw new TypeError('invalid variant specified for result');
2940
+ }
2941
+ }
2942
+ _debugLog('[iface="wasi:io/streams@0.2.6", function="[method]output-stream.blocking-flush"][Instruction::Return]', {
2943
+ funcName: '[method]output-stream.blocking-flush',
2944
+ paramCount: 0,
2945
+ async: false,
2946
+ postReturn: false
2947
+ });
2948
+ }
2949
+
2950
+
2951
+ let lowered_import_11_metadata = {
2952
+ qualifiedImportFn: 'wasi:cli/environment@0.2.6#get-environment',
2953
+ moduleIdx: null,
2954
+ };
2955
+
2956
+
2957
+ function trampoline20(arg0) {
2958
+ _debugLog('[iface="wasi:cli/environment@0.2.6", function="get-environment"] [Instruction::CallInterface] (sync, @ enter)');
2959
+ const hostProvided = getEnvironment._isHostProvided;
2960
+
2961
+ let parentTask;
2962
+ let task;
2963
+ let subtask;
2964
+
2965
+ const createTask = () => {
2966
+ const results = createNewCurrentTask({
2967
+ componentIdx: 0,
2968
+ isAsync: false,
2969
+ entryFnName: 'getEnvironment',
2970
+ getCallbackFn: () => null,
2971
+ callbackFnName: 'null',
2972
+ errHandling: 'none',
2973
+ callingWasmExport: false,
2974
+ });
2975
+ task = results[0];
2976
+ };
2977
+
2978
+ taskCreation: {
2979
+ parentTask = getCurrentTask(0)?.task;
2980
+ if (!parentTask) {
2981
+ createTask();
2982
+ break taskCreation;
2983
+ }
2984
+
2985
+ createTask();
2986
+
2987
+ const isHostAsyncImport = hostProvided && false;
2988
+ if (isHostAsyncImport) {
2989
+ subtask = parentTask.getLatestSubtask();
2990
+ if (!subtask) {
2991
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
2992
+ }
2993
+ subtask.setChildTask(task);
2994
+ task.setParentSubtask(subtask);
2995
+ }
2996
+ }
2997
+
2998
+ let ret = getEnvironment();
2999
+ endCurrentTask(0);
3000
+ var vec3 = ret;
3001
+ var len3 = vec3.length;
3002
+ var result3 = realloc0(0, 0, 4, len3 * 16);
3003
+ for (let i = 0; i < vec3.length; i++) {
3004
+ const e = vec3[i];
3005
+ const base = result3 + i * 16;var [tuple0_0, tuple0_1] = e;
3006
+
3007
+ var encodeRes = _utf8AllocateAndEncode(tuple0_0, realloc0, memory0);
3008
+ var ptr1= encodeRes.ptr;
3009
+ var len1 = encodeRes.len;
3010
+
3011
+ dataView(memory0).setUint32(base + 4, len1, true);
3012
+ dataView(memory0).setUint32(base + 0, ptr1, true);
3013
+
3014
+ var encodeRes = _utf8AllocateAndEncode(tuple0_1, realloc0, memory0);
3015
+ var ptr2= encodeRes.ptr;
3016
+ var len2 = encodeRes.len;
3017
+
3018
+ dataView(memory0).setUint32(base + 12, len2, true);
3019
+ dataView(memory0).setUint32(base + 8, ptr2, true);
3020
+ }
3021
+ dataView(memory0).setUint32(arg0 + 4, len3, true);
3022
+ dataView(memory0).setUint32(arg0 + 0, result3, true);
3023
+ _debugLog('[iface="wasi:cli/environment@0.2.6", function="get-environment"][Instruction::Return]', {
3024
+ funcName: 'get-environment',
3025
+ paramCount: 0,
3026
+ async: false,
3027
+ postReturn: false
3028
+ });
3029
+ }
3030
+
3031
+
3032
+ let lowered_import_12_metadata = {
3033
+ qualifiedImportFn: 'wasi:cli/terminal-stdin@0.2.6#get-terminal-stdin',
3034
+ moduleIdx: null,
3035
+ };
3036
+
3037
+ const handleTable4 = [T_FLAG, 0];
3038
+ const captureTable4= new Map();
3039
+ let captureCnt4 = 0;
3040
+ handleTables[4] = handleTable4;
3041
+
3042
+ function trampoline21(arg0) {
3043
+ _debugLog('[iface="wasi:cli/terminal-stdin@0.2.6", function="get-terminal-stdin"] [Instruction::CallInterface] (sync, @ enter)');
3044
+ const hostProvided = getTerminalStdin._isHostProvided;
3045
+
3046
+ let parentTask;
3047
+ let task;
3048
+ let subtask;
3049
+
3050
+ const createTask = () => {
3051
+ const results = createNewCurrentTask({
3052
+ componentIdx: 0,
3053
+ isAsync: false,
3054
+ entryFnName: 'getTerminalStdin',
3055
+ getCallbackFn: () => null,
3056
+ callbackFnName: 'null',
3057
+ errHandling: 'none',
3058
+ callingWasmExport: false,
3059
+ });
3060
+ task = results[0];
3061
+ };
3062
+
3063
+ taskCreation: {
3064
+ parentTask = getCurrentTask(0)?.task;
3065
+ if (!parentTask) {
3066
+ createTask();
3067
+ break taskCreation;
3068
+ }
3069
+
3070
+ createTask();
3071
+
3072
+ const isHostAsyncImport = hostProvided && false;
3073
+ if (isHostAsyncImport) {
3074
+ subtask = parentTask.getLatestSubtask();
3075
+ if (!subtask) {
3076
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
3077
+ }
3078
+ subtask.setChildTask(task);
3079
+ task.setParentSubtask(subtask);
3080
+ }
3081
+ }
3082
+
3083
+ let ret = getTerminalStdin();
3084
+ endCurrentTask(0);
3085
+ var variant1 = ret;
3086
+ if (variant1 === null || variant1=== undefined) {
3087
+ dataView(memory0).setInt8(arg0 + 0, 0, true);
3088
+ } else {
3089
+ const e = variant1;
3090
+ dataView(memory0).setInt8(arg0 + 0, 1, true);
3091
+ if (!(e instanceof TerminalInput)) {
3092
+ throw new TypeError('Resource error: Not a valid "TerminalInput" resource.');
3093
+ }
3094
+ var handle0 = e[symbolRscHandle];
3095
+ if (!handle0) {
3096
+ const rep = e[symbolRscRep] || ++captureCnt4;
3097
+ captureTable4.set(rep, e);
3098
+ handle0 = rscTableCreateOwn(handleTable4, rep);
3099
+ }
3100
+ dataView(memory0).setInt32(arg0 + 4, handle0, true);
3101
+ }
3102
+ _debugLog('[iface="wasi:cli/terminal-stdin@0.2.6", function="get-terminal-stdin"][Instruction::Return]', {
3103
+ funcName: 'get-terminal-stdin',
3104
+ paramCount: 0,
3105
+ async: false,
3106
+ postReturn: false
3107
+ });
3108
+ }
3109
+
3110
+
3111
+ let lowered_import_13_metadata = {
3112
+ qualifiedImportFn: 'wasi:cli/terminal-stdout@0.2.6#get-terminal-stdout',
3113
+ moduleIdx: null,
3114
+ };
3115
+
3116
+ const handleTable5 = [T_FLAG, 0];
3117
+ const captureTable5= new Map();
3118
+ let captureCnt5 = 0;
3119
+ handleTables[5] = handleTable5;
3120
+
3121
+ function trampoline22(arg0) {
3122
+ _debugLog('[iface="wasi:cli/terminal-stdout@0.2.6", function="get-terminal-stdout"] [Instruction::CallInterface] (sync, @ enter)');
3123
+ const hostProvided = getTerminalStdout._isHostProvided;
3124
+
3125
+ let parentTask;
3126
+ let task;
3127
+ let subtask;
3128
+
3129
+ const createTask = () => {
3130
+ const results = createNewCurrentTask({
3131
+ componentIdx: 0,
3132
+ isAsync: false,
3133
+ entryFnName: 'getTerminalStdout',
3134
+ getCallbackFn: () => null,
3135
+ callbackFnName: 'null',
3136
+ errHandling: 'none',
3137
+ callingWasmExport: false,
3138
+ });
3139
+ task = results[0];
3140
+ };
3141
+
3142
+ taskCreation: {
3143
+ parentTask = getCurrentTask(0)?.task;
3144
+ if (!parentTask) {
3145
+ createTask();
3146
+ break taskCreation;
3147
+ }
3148
+
3149
+ createTask();
3150
+
3151
+ const isHostAsyncImport = hostProvided && false;
3152
+ if (isHostAsyncImport) {
3153
+ subtask = parentTask.getLatestSubtask();
3154
+ if (!subtask) {
3155
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
3156
+ }
3157
+ subtask.setChildTask(task);
3158
+ task.setParentSubtask(subtask);
3159
+ }
3160
+ }
3161
+
3162
+ let ret = getTerminalStdout();
3163
+ endCurrentTask(0);
3164
+ var variant1 = ret;
3165
+ if (variant1 === null || variant1=== undefined) {
3166
+ dataView(memory0).setInt8(arg0 + 0, 0, true);
3167
+ } else {
3168
+ const e = variant1;
3169
+ dataView(memory0).setInt8(arg0 + 0, 1, true);
3170
+ if (!(e instanceof TerminalOutput)) {
3171
+ throw new TypeError('Resource error: Not a valid "TerminalOutput" resource.');
3172
+ }
3173
+ var handle0 = e[symbolRscHandle];
3174
+ if (!handle0) {
3175
+ const rep = e[symbolRscRep] || ++captureCnt5;
3176
+ captureTable5.set(rep, e);
3177
+ handle0 = rscTableCreateOwn(handleTable5, rep);
3178
+ }
3179
+ dataView(memory0).setInt32(arg0 + 4, handle0, true);
3180
+ }
3181
+ _debugLog('[iface="wasi:cli/terminal-stdout@0.2.6", function="get-terminal-stdout"][Instruction::Return]', {
3182
+ funcName: 'get-terminal-stdout',
3183
+ paramCount: 0,
3184
+ async: false,
3185
+ postReturn: false
3186
+ });
3187
+ }
3188
+
3189
+
3190
+ let lowered_import_14_metadata = {
3191
+ qualifiedImportFn: 'wasi:cli/terminal-stderr@0.2.6#get-terminal-stderr',
3192
+ moduleIdx: null,
3193
+ };
3194
+
3195
+
3196
+ function trampoline23(arg0) {
3197
+ _debugLog('[iface="wasi:cli/terminal-stderr@0.2.6", function="get-terminal-stderr"] [Instruction::CallInterface] (sync, @ enter)');
3198
+ const hostProvided = getTerminalStderr._isHostProvided;
3199
+
3200
+ let parentTask;
3201
+ let task;
3202
+ let subtask;
3203
+
3204
+ const createTask = () => {
3205
+ const results = createNewCurrentTask({
3206
+ componentIdx: 0,
3207
+ isAsync: false,
3208
+ entryFnName: 'getTerminalStderr',
3209
+ getCallbackFn: () => null,
3210
+ callbackFnName: 'null',
3211
+ errHandling: 'none',
3212
+ callingWasmExport: false,
3213
+ });
3214
+ task = results[0];
3215
+ };
3216
+
3217
+ taskCreation: {
3218
+ parentTask = getCurrentTask(0)?.task;
3219
+ if (!parentTask) {
3220
+ createTask();
3221
+ break taskCreation;
3222
+ }
3223
+
3224
+ createTask();
3225
+
3226
+ const isHostAsyncImport = hostProvided && false;
3227
+ if (isHostAsyncImport) {
3228
+ subtask = parentTask.getLatestSubtask();
3229
+ if (!subtask) {
3230
+ throw new Error("Missing subtask for host import, has the import been lowered? (ensure asyncImports are set properly)");
3231
+ }
3232
+ subtask.setChildTask(task);
3233
+ task.setParentSubtask(subtask);
3234
+ }
3235
+ }
3236
+
3237
+ let ret = getTerminalStderr();
3238
+ endCurrentTask(0);
3239
+ var variant1 = ret;
3240
+ if (variant1 === null || variant1=== undefined) {
3241
+ dataView(memory0).setInt8(arg0 + 0, 0, true);
3242
+ } else {
3243
+ const e = variant1;
3244
+ dataView(memory0).setInt8(arg0 + 0, 1, true);
3245
+ if (!(e instanceof TerminalOutput)) {
3246
+ throw new TypeError('Resource error: Not a valid "TerminalOutput" resource.');
3247
+ }
3248
+ var handle0 = e[symbolRscHandle];
3249
+ if (!handle0) {
3250
+ const rep = e[symbolRscRep] || ++captureCnt5;
3251
+ captureTable5.set(rep, e);
3252
+ handle0 = rscTableCreateOwn(handleTable5, rep);
3253
+ }
3254
+ dataView(memory0).setInt32(arg0 + 4, handle0, true);
3255
+ }
3256
+ _debugLog('[iface="wasi:cli/terminal-stderr@0.2.6", function="get-terminal-stderr"][Instruction::Return]', {
3257
+ funcName: 'get-terminal-stderr',
3258
+ paramCount: 0,
3259
+ async: false,
3260
+ postReturn: false
3261
+ });
3262
+ }
3263
+
3264
+ let exports2;
3265
+ let postReturn0;
3266
+ let postReturn1;
3267
+
3268
+ GlobalComponentAsyncLowers.define({
3269
+ componentIdx: lowered_import_0_metadata.moduleIdx,
3270
+ qualifiedImportFn: lowered_import_0_metadata.qualifiedImportFn,
3271
+ fn: _lowerImport.bind(
3272
+ null,
3273
+ {
3274
+ trampolineIdx: 0,
3275
+ componentIdx: 0,
3276
+ isAsync: false,
3277
+ paramLiftFns: [],
3278
+ metadata: lowered_import_0_metadata,
3279
+ resultLowerFns: [_lowerFlatU64],
3280
+ getCallbackFn: () => null,
3281
+ getPostReturnFn: () => null,
3282
+ isCancellable: false,
3283
+ memoryIdx: null,
3284
+ getMemoryFn: () => null,
3285
+ getReallocFn: () => null,
3286
+ },
3287
+ ),
3288
+ });
3289
+
3290
+ const handleTable6 = [T_FLAG, 0];
3291
+ const finalizationRegistry6 = finalizationRegistryCreate((handle) => {
3292
+ const { rep } = rscTableRemove(handleTable6, handle);
3293
+ exports0['8'](rep);
3294
+ });
3295
+
3296
+ handleTables[6] = handleTable6;
3297
+ const trampoline1 = rscTableCreateOwn.bind(null, handleTable6);
3298
+ const handleTable7 = [T_FLAG, 0];
3299
+ const finalizationRegistry7 = finalizationRegistryCreate((handle) => {
3300
+ const { rep } = rscTableRemove(handleTable7, handle);
3301
+ exports0['9'](rep);
3302
+ });
3303
+
3304
+ handleTables[7] = handleTable7;
3305
+ const trampoline2 = rscTableCreateOwn.bind(null, handleTable7);
3306
+ function trampoline3(handle) {
3307
+ const handleEntry = rscTableRemove(handleTable7, handle);
3308
+ if (handleEntry.own) {
3309
+
3310
+ exports0['9'](handleEntry.rep);
3311
+ }
3312
+ }
3313
+ function trampoline4(handle) {
3314
+ const handleEntry = rscTableRemove(handleTable1, handle);
3315
+ if (handleEntry.own) {
3316
+
3317
+ const rsc = captureTable1.get(handleEntry.rep);
3318
+ if (rsc) {
3319
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3320
+ captureTable1.delete(handleEntry.rep);
3321
+ } else if (Error$1[symbolCabiDispose]) {
3322
+ Error$1[symbolCabiDispose](handleEntry.rep);
3323
+ }
3324
+ }
3325
+ }
3326
+ function trampoline5(handle) {
3327
+ const handleEntry = rscTableRemove(handleTable0, handle);
3328
+ if (handleEntry.own) {
3329
+
3330
+ const rsc = captureTable0.get(handleEntry.rep);
3331
+ if (rsc) {
3332
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3333
+ captureTable0.delete(handleEntry.rep);
3334
+ } else if (Pollable[symbolCabiDispose]) {
3335
+ Pollable[symbolCabiDispose](handleEntry.rep);
3336
+ }
3337
+ }
3338
+ }
3339
+ function trampoline6(handle) {
3340
+ const handleEntry = rscTableRemove(handleTable2, handle);
3341
+ if (handleEntry.own) {
3342
+
3343
+ const rsc = captureTable2.get(handleEntry.rep);
3344
+ if (rsc) {
3345
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3346
+ captureTable2.delete(handleEntry.rep);
3347
+ } else if (InputStream[symbolCabiDispose]) {
3348
+ InputStream[symbolCabiDispose](handleEntry.rep);
3349
+ }
3350
+ }
3351
+ }
3352
+ function trampoline7(handle) {
3353
+ const handleEntry = rscTableRemove(handleTable3, handle);
3354
+ if (handleEntry.own) {
3355
+
3356
+ const rsc = captureTable3.get(handleEntry.rep);
3357
+ if (rsc) {
3358
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3359
+ captureTable3.delete(handleEntry.rep);
3360
+ } else if (OutputStream[symbolCabiDispose]) {
3361
+ OutputStream[symbolCabiDispose](handleEntry.rep);
3362
+ }
3363
+ }
3364
+ }
3365
+ function trampoline8(handle) {
3366
+ const handleEntry = rscTableRemove(handleTable4, handle);
3367
+ if (handleEntry.own) {
3368
+
3369
+ const rsc = captureTable4.get(handleEntry.rep);
3370
+ if (rsc) {
3371
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3372
+ captureTable4.delete(handleEntry.rep);
3373
+ } else if (TerminalInput[symbolCabiDispose]) {
3374
+ TerminalInput[symbolCabiDispose](handleEntry.rep);
3375
+ }
3376
+ }
3377
+ }
3378
+ function trampoline9(handle) {
3379
+ const handleEntry = rscTableRemove(handleTable5, handle);
3380
+ if (handleEntry.own) {
3381
+
3382
+ const rsc = captureTable5.get(handleEntry.rep);
3383
+ if (rsc) {
3384
+ if (rsc[symbolDispose]) rsc[symbolDispose]();
3385
+ captureTable5.delete(handleEntry.rep);
3386
+ } else if (TerminalOutput[symbolCabiDispose]) {
3387
+ TerminalOutput[symbolCabiDispose](handleEntry.rep);
3388
+ }
3389
+ }
3390
+ }
3391
+
3392
+ GlobalComponentAsyncLowers.define({
3393
+ componentIdx: lowered_import_1_metadata.moduleIdx,
3394
+ qualifiedImportFn: lowered_import_1_metadata.qualifiedImportFn,
3395
+ fn: _lowerImport.bind(
3396
+ null,
3397
+ {
3398
+ trampolineIdx: 10,
3399
+ componentIdx: 0,
3400
+ isAsync: false,
3401
+ paramLiftFns: [_liftFlatResult([['ok', null, null],['error', null, null],])],
3402
+ metadata: lowered_import_1_metadata,
3403
+ resultLowerFns: [],
3404
+ getCallbackFn: () => null,
3405
+ getPostReturnFn: () => null,
3406
+ isCancellable: false,
3407
+ memoryIdx: null,
3408
+ getMemoryFn: () => null,
3409
+ getReallocFn: () => null,
3410
+ },
3411
+ ),
3412
+ });
3413
+
3414
+
3415
+ GlobalComponentAsyncLowers.define({
3416
+ componentIdx: lowered_import_2_metadata.moduleIdx,
3417
+ qualifiedImportFn: lowered_import_2_metadata.qualifiedImportFn,
3418
+ fn: _lowerImport.bind(
3419
+ null,
3420
+ {
3421
+ trampolineIdx: 11,
3422
+ componentIdx: 0,
3423
+ isAsync: false,
3424
+ paramLiftFns: [_liftFlatOwn.bind(null, 0)],
3425
+ metadata: lowered_import_2_metadata,
3426
+ resultLowerFns: [],
3427
+ getCallbackFn: () => null,
3428
+ getPostReturnFn: () => null,
3429
+ isCancellable: false,
3430
+ memoryIdx: null,
3431
+ getMemoryFn: () => null,
3432
+ getReallocFn: () => null,
3433
+ },
3434
+ ),
3435
+ });
3436
+
3437
+
3438
+ GlobalComponentAsyncLowers.define({
3439
+ componentIdx: lowered_import_3_metadata.moduleIdx,
3440
+ qualifiedImportFn: lowered_import_3_metadata.qualifiedImportFn,
3441
+ fn: _lowerImport.bind(
3442
+ null,
3443
+ {
3444
+ trampolineIdx: 12,
3445
+ componentIdx: 0,
3446
+ isAsync: false,
3447
+ paramLiftFns: [_liftFlatOwn.bind(null, 3)],
3448
+ metadata: lowered_import_3_metadata,
3449
+ resultLowerFns: [_lowerFlatOwn.bind(null, 0)],
3450
+ getCallbackFn: () => null,
3451
+ getPostReturnFn: () => null,
3452
+ isCancellable: false,
3453
+ memoryIdx: null,
3454
+ getMemoryFn: () => null,
3455
+ getReallocFn: () => null,
3456
+ },
3457
+ ),
3458
+ });
3459
+
3460
+
3461
+ GlobalComponentAsyncLowers.define({
3462
+ componentIdx: lowered_import_4_metadata.moduleIdx,
3463
+ qualifiedImportFn: lowered_import_4_metadata.qualifiedImportFn,
3464
+ fn: _lowerImport.bind(
3465
+ null,
3466
+ {
3467
+ trampolineIdx: 13,
3468
+ componentIdx: 0,
3469
+ isAsync: false,
3470
+ paramLiftFns: [],
3471
+ metadata: lowered_import_4_metadata,
3472
+ resultLowerFns: [_lowerFlatOwn.bind(null, 2)],
3473
+ getCallbackFn: () => null,
3474
+ getPostReturnFn: () => null,
3475
+ isCancellable: false,
3476
+ memoryIdx: null,
3477
+ getMemoryFn: () => null,
3478
+ getReallocFn: () => null,
3479
+ },
3480
+ ),
3481
+ });
3482
+
3483
+
3484
+ GlobalComponentAsyncLowers.define({
3485
+ componentIdx: lowered_import_5_metadata.moduleIdx,
3486
+ qualifiedImportFn: lowered_import_5_metadata.qualifiedImportFn,
3487
+ fn: _lowerImport.bind(
3488
+ null,
3489
+ {
3490
+ trampolineIdx: 14,
3491
+ componentIdx: 0,
3492
+ isAsync: false,
3493
+ paramLiftFns: [],
3494
+ metadata: lowered_import_5_metadata,
3495
+ resultLowerFns: [_lowerFlatOwn.bind(null, 3)],
3496
+ getCallbackFn: () => null,
3497
+ getPostReturnFn: () => null,
3498
+ isCancellable: false,
3499
+ memoryIdx: null,
3500
+ getMemoryFn: () => null,
3501
+ getReallocFn: () => null,
3502
+ },
3503
+ ),
3504
+ });
3505
+
3506
+
3507
+ GlobalComponentAsyncLowers.define({
3508
+ componentIdx: lowered_import_6_metadata.moduleIdx,
3509
+ qualifiedImportFn: lowered_import_6_metadata.qualifiedImportFn,
3510
+ fn: _lowerImport.bind(
3511
+ null,
3512
+ {
3513
+ trampolineIdx: 15,
3514
+ componentIdx: 0,
3515
+ isAsync: false,
3516
+ paramLiftFns: [],
3517
+ metadata: lowered_import_6_metadata,
3518
+ resultLowerFns: [_lowerFlatOwn.bind(null, 3)],
3519
+ getCallbackFn: () => null,
3520
+ getPostReturnFn: () => null,
3521
+ isCancellable: false,
3522
+ memoryIdx: null,
3523
+ getMemoryFn: () => null,
3524
+ getReallocFn: () => null,
3525
+ },
3526
+ ),
3527
+ });
3528
+
3529
+
3530
+ GlobalComponentAsyncLowers.define({
3531
+ componentIdx: lowered_import_7_metadata.moduleIdx,
3532
+ qualifiedImportFn: lowered_import_7_metadata.qualifiedImportFn,
3533
+ fn: _lowerImport.bind(
3534
+ null,
3535
+ {
3536
+ trampolineIdx: 16,
3537
+ componentIdx: 0,
3538
+ isAsync: false,
3539
+ paramLiftFns: [],
3540
+ metadata: lowered_import_7_metadata,
3541
+ resultLowerFns: [_lowerFlatTuple.bind(null, 15)],
3542
+ getCallbackFn: () => null,
3543
+ getPostReturnFn: () => null,
3544
+ isCancellable: false,
3545
+ memoryIdx: 0,
3546
+ getMemoryFn: () => memory0,
3547
+ getReallocFn: () => null,
3548
+ },
3549
+ ),
3550
+ });
3551
+
3552
+
3553
+ GlobalComponentAsyncLowers.define({
3554
+ componentIdx: lowered_import_8_metadata.moduleIdx,
3555
+ qualifiedImportFn: lowered_import_8_metadata.qualifiedImportFn,
3556
+ fn: _lowerImport.bind(
3557
+ null,
3558
+ {
3559
+ trampolineIdx: 17,
3560
+ componentIdx: 0,
3561
+ isAsync: false,
3562
+ paramLiftFns: [_liftFlatOwn.bind(null, 3)],
3563
+ metadata: lowered_import_8_metadata,
3564
+ resultLowerFns: [_lowerFlatResult([{ discriminant: 0, tag: 'ok', lowerFn: _lowerFlatU64, align32: 8 },{ discriminant: 1, tag: 'error', lowerFn: _lowerFlatVariant({ discriminantSizeBytes: 1, lowerMetas: [{ discriminant: 0, tag: 'last-operation-failed', lowerFn: _lowerFlatOwn.bind(null, 1), align32: 4, },{ discriminant: 1, tag: 'closed', lowerFn: null, align32: null, },] }), align32: 4 },])],
3565
+ getCallbackFn: () => null,
3566
+ getPostReturnFn: () => null,
3567
+ isCancellable: false,
3568
+ memoryIdx: 0,
3569
+ getMemoryFn: () => memory0,
3570
+ getReallocFn: () => null,
3571
+ },
3572
+ ),
3573
+ });
3574
+
3575
+
3576
+ GlobalComponentAsyncLowers.define({
3577
+ componentIdx: lowered_import_9_metadata.moduleIdx,
3578
+ qualifiedImportFn: lowered_import_9_metadata.qualifiedImportFn,
3579
+ fn: _lowerImport.bind(
3580
+ null,
3581
+ {
3582
+ trampolineIdx: 18,
3583
+ componentIdx: 0,
3584
+ isAsync: false,
3585
+ paramLiftFns: [_liftFlatOwn.bind(null, 3),_liftFlatList.bind(null, 0)],
3586
+ metadata: lowered_import_9_metadata,
3587
+ resultLowerFns: [_lowerFlatResult([{ discriminant: 0, tag: 'ok', lowerFn: null, align32: null },{ discriminant: 1, tag: 'error', lowerFn: _lowerFlatVariant({ discriminantSizeBytes: 1, lowerMetas: [{ discriminant: 0, tag: 'last-operation-failed', lowerFn: _lowerFlatOwn.bind(null, 1), align32: 4, },{ discriminant: 1, tag: 'closed', lowerFn: null, align32: null, },] }), align32: 4 },])],
3588
+ getCallbackFn: () => null,
3589
+ getPostReturnFn: () => null,
3590
+ isCancellable: false,
3591
+ memoryIdx: 0,
3592
+ getMemoryFn: () => memory0,
3593
+ getReallocFn: () => null,
3594
+ },
3595
+ ),
3596
+ });
3597
+
3598
+
3599
+ GlobalComponentAsyncLowers.define({
3600
+ componentIdx: lowered_import_10_metadata.moduleIdx,
3601
+ qualifiedImportFn: lowered_import_10_metadata.qualifiedImportFn,
3602
+ fn: _lowerImport.bind(
3603
+ null,
3604
+ {
3605
+ trampolineIdx: 19,
3606
+ componentIdx: 0,
3607
+ isAsync: false,
3608
+ paramLiftFns: [_liftFlatOwn.bind(null, 3)],
3609
+ metadata: lowered_import_10_metadata,
3610
+ resultLowerFns: [_lowerFlatResult([{ discriminant: 0, tag: 'ok', lowerFn: null, align32: null },{ discriminant: 1, tag: 'error', lowerFn: _lowerFlatVariant({ discriminantSizeBytes: 1, lowerMetas: [{ discriminant: 0, tag: 'last-operation-failed', lowerFn: _lowerFlatOwn.bind(null, 1), align32: 4, },{ discriminant: 1, tag: 'closed', lowerFn: null, align32: null, },] }), align32: 4 },])],
3611
+ getCallbackFn: () => null,
3612
+ getPostReturnFn: () => null,
3613
+ isCancellable: false,
3614
+ memoryIdx: 0,
3615
+ getMemoryFn: () => memory0,
3616
+ getReallocFn: () => null,
3617
+ },
3618
+ ),
3619
+ });
3620
+
3621
+
3622
+ GlobalComponentAsyncLowers.define({
3623
+ componentIdx: lowered_import_11_metadata.moduleIdx,
3624
+ qualifiedImportFn: lowered_import_11_metadata.qualifiedImportFn,
3625
+ fn: _lowerImport.bind(
3626
+ null,
3627
+ {
3628
+ trampolineIdx: 20,
3629
+ componentIdx: 0,
3630
+ isAsync: false,
3631
+ paramLiftFns: [],
3632
+ metadata: lowered_import_11_metadata,
3633
+ resultLowerFns: [_lowerFlatList.bind(null, 1)],
3634
+ getCallbackFn: () => null,
3635
+ getPostReturnFn: () => null,
3636
+ isCancellable: false,
3637
+ memoryIdx: 0,
3638
+ getMemoryFn: () => memory0,
3639
+ getReallocFn: () => realloc0,
3640
+ },
3641
+ ),
3642
+ });
3643
+
3644
+
3645
+ GlobalComponentAsyncLowers.define({
3646
+ componentIdx: lowered_import_12_metadata.moduleIdx,
3647
+ qualifiedImportFn: lowered_import_12_metadata.qualifiedImportFn,
3648
+ fn: _lowerImport.bind(
3649
+ null,
3650
+ {
3651
+ trampolineIdx: 21,
3652
+ componentIdx: 0,
3653
+ isAsync: false,
3654
+ paramLiftFns: [],
3655
+ metadata: lowered_import_12_metadata,
3656
+ resultLowerFns: [_lowerFlatOption.bind(null, 0)],
3657
+ getCallbackFn: () => null,
3658
+ getPostReturnFn: () => null,
3659
+ isCancellable: false,
3660
+ memoryIdx: 0,
3661
+ getMemoryFn: () => memory0,
3662
+ getReallocFn: () => null,
3663
+ },
3664
+ ),
3665
+ });
3666
+
3667
+
3668
+ GlobalComponentAsyncLowers.define({
3669
+ componentIdx: lowered_import_13_metadata.moduleIdx,
3670
+ qualifiedImportFn: lowered_import_13_metadata.qualifiedImportFn,
3671
+ fn: _lowerImport.bind(
3672
+ null,
3673
+ {
3674
+ trampolineIdx: 22,
3675
+ componentIdx: 0,
3676
+ isAsync: false,
3677
+ paramLiftFns: [],
3678
+ metadata: lowered_import_13_metadata,
3679
+ resultLowerFns: [_lowerFlatOption.bind(null, 1)],
3680
+ getCallbackFn: () => null,
3681
+ getPostReturnFn: () => null,
3682
+ isCancellable: false,
3683
+ memoryIdx: 0,
3684
+ getMemoryFn: () => memory0,
3685
+ getReallocFn: () => null,
3686
+ },
3687
+ ),
3688
+ });
3689
+
3690
+
3691
+ GlobalComponentAsyncLowers.define({
3692
+ componentIdx: lowered_import_14_metadata.moduleIdx,
3693
+ qualifiedImportFn: lowered_import_14_metadata.qualifiedImportFn,
3694
+ fn: _lowerImport.bind(
3695
+ null,
3696
+ {
3697
+ trampolineIdx: 23,
3698
+ componentIdx: 0,
3699
+ isAsync: false,
3700
+ paramLiftFns: [],
3701
+ metadata: lowered_import_14_metadata,
3702
+ resultLowerFns: [_lowerFlatOption.bind(null, 1)],
3703
+ getCallbackFn: () => null,
3704
+ getPostReturnFn: () => null,
3705
+ isCancellable: false,
3706
+ memoryIdx: 0,
3707
+ getMemoryFn: () => memory0,
3708
+ getReallocFn: () => null,
3709
+ },
3710
+ ),
3711
+ });
3712
+
3713
+ let specStaticFrameFromJson;
3714
+
3715
+ class Frame{
3716
+ constructor () {
3717
+ throw new Error('"Frame" resource does not define a constructor');
3718
+ }
3719
+ }
3720
+
3721
+ Frame.fromJson = function fromJson(arg0) {
3722
+
3723
+ var encodeRes = _utf8AllocateAndEncode(arg0, realloc0, memory0);
3724
+ var ptr0= encodeRes.ptr;
3725
+ var len0 = encodeRes.len;
3726
+
3727
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]frame.from-json"][Instruction::CallWasm] enter', {
3728
+ funcName: '[static]frame.from-json',
3729
+ paramCount: 2,
3730
+ async: false,
3731
+ postReturn: true,
3732
+ });
3733
+ const hostProvided = false;
3734
+
3735
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
3736
+ componentIdx: 0,
3737
+ isAsync: false,
3738
+ entryFnName: 'specStaticFrameFromJson',
3739
+ getCallbackFn: () => null,
3740
+ callbackFnName: 'null',
3741
+ errHandling: 'throw-result-err',
3742
+ callingWasmExport: true,
3743
+ });
3744
+
3745
+ let ret = specStaticFrameFromJson(ptr0, len0);
3746
+ endCurrentTask(0);
3747
+ let variant4;
3748
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
3749
+ case 0: {
3750
+ var handle2 = dataView(memory0).getInt32(ret + 4, true);
3751
+ var rsc1 = new.target === Frame ? this : Object.create(Frame.prototype);
3752
+ Object.defineProperty(rsc1, symbolRscHandle, { writable: true, value: handle2});
3753
+ finalizationRegistry7.register(rsc1, handle2, rsc1);
3754
+ Object.defineProperty(rsc1, symbolDispose, { writable: true, value: function () {
3755
+ finalizationRegistry7.unregister(rsc1);
3756
+ rscTableRemove(handleTable7, handle2);
3757
+ rsc1[symbolDispose] = emptyFunc;
3758
+ rsc1[symbolRscHandle] = undefined;
3759
+ exports0['9'](handleTable7[(handle2 << 1) + 1] & ~T_FLAG);
3760
+ }});
3761
+ variant4= {
3762
+ tag: 'ok',
3763
+ val: rsc1
3764
+ };
3765
+ break;
3766
+ }
3767
+ case 1: {
3768
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
3769
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
3770
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
3771
+ variant4= {
3772
+ tag: 'err',
3773
+ val: result3
3774
+ };
3775
+ break;
3776
+ }
3777
+ default: {
3778
+ throw new TypeError('invalid variant discriminant for expected');
3779
+ }
3780
+ }
3781
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]frame.from-json"][Instruction::Return]', {
3782
+ funcName: '[static]frame.from-json',
3783
+ paramCount: 1,
3784
+ async: false,
3785
+ postReturn: true
3786
+ });
3787
+ const retCopy = variant4;
3788
+
3789
+ let cstate = getOrCreateAsyncState(0);
3790
+ cstate.mayLeave = false;
3791
+ postReturn0(ret);
3792
+ cstate.mayLeave = true;
3793
+
3794
+
3795
+
3796
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
3797
+ throw new ComponentError(retCopy.val);
3798
+ }
3799
+ return retCopy.val;
3800
+
3801
+ };
3802
+ let specStaticFrameDeleteColumns;
3803
+
3804
+ Frame.deleteColumns = function deleteColumns(arg0) {
3805
+
3806
+ var encodeRes = _utf8AllocateAndEncode(arg0, realloc0, memory0);
3807
+ var ptr0= encodeRes.ptr;
3808
+ var len0 = encodeRes.len;
3809
+
3810
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]frame.delete-columns"][Instruction::CallWasm] enter', {
3811
+ funcName: '[static]frame.delete-columns',
3812
+ paramCount: 2,
3813
+ async: false,
3814
+ postReturn: true,
3815
+ });
3816
+ const hostProvided = false;
3817
+
3818
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
3819
+ componentIdx: 0,
3820
+ isAsync: false,
3821
+ entryFnName: 'specStaticFrameDeleteColumns',
3822
+ getCallbackFn: () => null,
3823
+ callbackFnName: 'null',
3824
+ errHandling: 'throw-result-err',
3825
+ callingWasmExport: true,
3826
+ });
3827
+
3828
+ let ret = specStaticFrameDeleteColumns(ptr0, len0);
3829
+ endCurrentTask(0);
3830
+ let variant3;
3831
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
3832
+ case 0: {
3833
+ var ptr1 = dataView(memory0).getUint32(ret + 4, true);
3834
+ var len1 = dataView(memory0).getUint32(ret + 8, true);
3835
+ var result1 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr1, len1));
3836
+ variant3= {
3837
+ tag: 'ok',
3838
+ val: result1
3839
+ };
3840
+ break;
3841
+ }
3842
+ case 1: {
3843
+ var ptr2 = dataView(memory0).getUint32(ret + 4, true);
3844
+ var len2 = dataView(memory0).getUint32(ret + 8, true);
3845
+ var result2 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr2, len2));
3846
+ variant3= {
3847
+ tag: 'err',
3848
+ val: result2
3849
+ };
3850
+ break;
3851
+ }
3852
+ default: {
3853
+ throw new TypeError('invalid variant discriminant for expected');
3854
+ }
3855
+ }
3856
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]frame.delete-columns"][Instruction::Return]', {
3857
+ funcName: '[static]frame.delete-columns',
3858
+ paramCount: 1,
3859
+ async: false,
3860
+ postReturn: true
3861
+ });
3862
+ const retCopy = variant3;
3863
+
3864
+ let cstate = getOrCreateAsyncState(0);
3865
+ cstate.mayLeave = false;
3866
+ postReturn1(ret);
3867
+ cstate.mayLeave = true;
3868
+
3869
+
3870
+
3871
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
3872
+ throw new ComponentError(retCopy.val);
3873
+ }
3874
+ return retCopy.val;
3875
+
3876
+ };
3877
+ let specMethodFrameFindColumns;
3878
+
3879
+ Frame.prototype.findColumns = function findColumns(arg1) {
3880
+ var handle1 = this[symbolRscHandle];
3881
+ if (!handle1 || (handleTable7[(handle1 << 1) + 1] & T_FLAG) === 0) {
3882
+ throw new TypeError('Resource error: Not a valid "Frame" resource.');
3883
+ }
3884
+ var handle0 = handleTable7[(handle1 << 1) + 1] & ~T_FLAG;
3885
+
3886
+ var encodeRes = _utf8AllocateAndEncode(arg1, realloc0, memory0);
3887
+ var ptr2= encodeRes.ptr;
3888
+ var len2 = encodeRes.len;
3889
+
3890
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.find-columns"][Instruction::CallWasm] enter', {
3891
+ funcName: '[method]frame.find-columns',
3892
+ paramCount: 3,
3893
+ async: false,
3894
+ postReturn: true,
3895
+ });
3896
+ const hostProvided = false;
3897
+
3898
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
3899
+ componentIdx: 0,
3900
+ isAsync: false,
3901
+ entryFnName: 'specMethodFrameFindColumns',
3902
+ getCallbackFn: () => null,
3903
+ callbackFnName: 'null',
3904
+ errHandling: 'throw-result-err',
3905
+ callingWasmExport: true,
3906
+ });
3907
+
3908
+ let ret = specMethodFrameFindColumns(handle0, ptr2, len2);
3909
+ endCurrentTask(0);
3910
+ let variant5;
3911
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
3912
+ case 0: {
3913
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
3914
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
3915
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
3916
+ variant5= {
3917
+ tag: 'ok',
3918
+ val: result3
3919
+ };
3920
+ break;
3921
+ }
3922
+ case 1: {
3923
+ var ptr4 = dataView(memory0).getUint32(ret + 4, true);
3924
+ var len4 = dataView(memory0).getUint32(ret + 8, true);
3925
+ var result4 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr4, len4));
3926
+ variant5= {
3927
+ tag: 'err',
3928
+ val: result4
3929
+ };
3930
+ break;
3931
+ }
3932
+ default: {
3933
+ throw new TypeError('invalid variant discriminant for expected');
3934
+ }
3935
+ }
3936
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.find-columns"][Instruction::Return]', {
3937
+ funcName: '[method]frame.find-columns',
3938
+ paramCount: 1,
3939
+ async: false,
3940
+ postReturn: true
3941
+ });
3942
+ const retCopy = variant5;
3943
+
3944
+ let cstate = getOrCreateAsyncState(0);
3945
+ cstate.mayLeave = false;
3946
+ postReturn1(ret);
3947
+ cstate.mayLeave = true;
3948
+
3949
+
3950
+
3951
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
3952
+ throw new ComponentError(retCopy.val);
3953
+ }
3954
+ return retCopy.val;
3955
+
3956
+ };
3957
+ let specMethodFrameEvaluateQuery;
3958
+
3959
+ Frame.prototype.evaluateQuery = function evaluateQuery(arg1) {
3960
+ var handle1 = this[symbolRscHandle];
3961
+ if (!handle1 || (handleTable7[(handle1 << 1) + 1] & T_FLAG) === 0) {
3962
+ throw new TypeError('Resource error: Not a valid "Frame" resource.');
3963
+ }
3964
+ var handle0 = handleTable7[(handle1 << 1) + 1] & ~T_FLAG;
3965
+
3966
+ var encodeRes = _utf8AllocateAndEncode(arg1, realloc0, memory0);
3967
+ var ptr2= encodeRes.ptr;
3968
+ var len2 = encodeRes.len;
3969
+
3970
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.evaluate-query"][Instruction::CallWasm] enter', {
3971
+ funcName: '[method]frame.evaluate-query',
3972
+ paramCount: 3,
3973
+ async: false,
3974
+ postReturn: true,
3975
+ });
3976
+ const hostProvided = false;
3977
+
3978
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
3979
+ componentIdx: 0,
3980
+ isAsync: false,
3981
+ entryFnName: 'specMethodFrameEvaluateQuery',
3982
+ getCallbackFn: () => null,
3983
+ callbackFnName: 'null',
3984
+ errHandling: 'throw-result-err',
3985
+ callingWasmExport: true,
3986
+ });
3987
+
3988
+ let ret = specMethodFrameEvaluateQuery(handle0, ptr2, len2);
3989
+ endCurrentTask(0);
3990
+ let variant5;
3991
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
3992
+ case 0: {
3993
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
3994
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
3995
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
3996
+ variant5= {
3997
+ tag: 'ok',
3998
+ val: result3
3999
+ };
4000
+ break;
4001
+ }
4002
+ case 1: {
4003
+ var ptr4 = dataView(memory0).getUint32(ret + 4, true);
4004
+ var len4 = dataView(memory0).getUint32(ret + 8, true);
4005
+ var result4 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr4, len4));
4006
+ variant5= {
4007
+ tag: 'err',
4008
+ val: result4
4009
+ };
4010
+ break;
4011
+ }
4012
+ default: {
4013
+ throw new TypeError('invalid variant discriminant for expected');
4014
+ }
4015
+ }
4016
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.evaluate-query"][Instruction::Return]', {
4017
+ funcName: '[method]frame.evaluate-query',
4018
+ paramCount: 1,
4019
+ async: false,
4020
+ postReturn: true
4021
+ });
4022
+ const retCopy = variant5;
4023
+
4024
+ let cstate = getOrCreateAsyncState(0);
4025
+ cstate.mayLeave = false;
4026
+ postReturn1(ret);
4027
+ cstate.mayLeave = true;
4028
+
4029
+
4030
+
4031
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4032
+ throw new ComponentError(retCopy.val);
4033
+ }
4034
+ return retCopy.val;
4035
+
4036
+ };
4037
+ let specMethodFrameRewriteLegacyQuery;
4038
+
4039
+ Frame.prototype.rewriteLegacyQuery = function rewriteLegacyQuery(arg1) {
4040
+ var handle1 = this[symbolRscHandle];
4041
+ if (!handle1 || (handleTable7[(handle1 << 1) + 1] & T_FLAG) === 0) {
4042
+ throw new TypeError('Resource error: Not a valid "Frame" resource.');
4043
+ }
4044
+ var handle0 = handleTable7[(handle1 << 1) + 1] & ~T_FLAG;
4045
+
4046
+ var encodeRes = _utf8AllocateAndEncode(arg1, realloc0, memory0);
4047
+ var ptr2= encodeRes.ptr;
4048
+ var len2 = encodeRes.len;
4049
+
4050
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.rewrite-legacy-query"][Instruction::CallWasm] enter', {
4051
+ funcName: '[method]frame.rewrite-legacy-query',
4052
+ paramCount: 3,
4053
+ async: false,
4054
+ postReturn: true,
4055
+ });
4056
+ const hostProvided = false;
4057
+
4058
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
4059
+ componentIdx: 0,
4060
+ isAsync: false,
4061
+ entryFnName: 'specMethodFrameRewriteLegacyQuery',
4062
+ getCallbackFn: () => null,
4063
+ callbackFnName: 'null',
4064
+ errHandling: 'throw-result-err',
4065
+ callingWasmExport: true,
4066
+ });
4067
+
4068
+ let ret = specMethodFrameRewriteLegacyQuery(handle0, ptr2, len2);
4069
+ endCurrentTask(0);
4070
+ let variant5;
4071
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4072
+ case 0: {
4073
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
4074
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
4075
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
4076
+ variant5= {
4077
+ tag: 'ok',
4078
+ val: result3
4079
+ };
4080
+ break;
4081
+ }
4082
+ case 1: {
4083
+ var ptr4 = dataView(memory0).getUint32(ret + 4, true);
4084
+ var len4 = dataView(memory0).getUint32(ret + 8, true);
4085
+ var result4 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr4, len4));
4086
+ variant5= {
4087
+ tag: 'err',
4088
+ val: result4
4089
+ };
4090
+ break;
4091
+ }
4092
+ default: {
4093
+ throw new TypeError('invalid variant discriminant for expected');
4094
+ }
4095
+ }
4096
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]frame.rewrite-legacy-query"][Instruction::Return]', {
4097
+ funcName: '[method]frame.rewrite-legacy-query',
4098
+ paramCount: 1,
4099
+ async: false,
4100
+ postReturn: true
4101
+ });
4102
+ const retCopy = variant5;
4103
+
4104
+ let cstate = getOrCreateAsyncState(0);
4105
+ cstate.mayLeave = false;
4106
+ postReturn1(ret);
4107
+ cstate.mayLeave = true;
4108
+
4109
+
4110
+
4111
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4112
+ throw new ComponentError(retCopy.val);
4113
+ }
4114
+ return retCopy.val;
4115
+
4116
+ };
4117
+ let specStaticAxesFromJson;
4118
+
4119
+ class Axes{
4120
+ constructor () {
4121
+ throw new Error('"Axes" resource does not define a constructor');
4122
+ }
4123
+ }
4124
+
4125
+ Axes.fromJson = function fromJson(arg0) {
4126
+
4127
+ var encodeRes = _utf8AllocateAndEncode(arg0, realloc0, memory0);
4128
+ var ptr0= encodeRes.ptr;
4129
+ var len0 = encodeRes.len;
4130
+
4131
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]axes.from-json"][Instruction::CallWasm] enter', {
4132
+ funcName: '[static]axes.from-json',
4133
+ paramCount: 2,
4134
+ async: false,
4135
+ postReturn: true,
4136
+ });
4137
+ const hostProvided = false;
4138
+
4139
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
4140
+ componentIdx: 0,
4141
+ isAsync: false,
4142
+ entryFnName: 'specStaticAxesFromJson',
4143
+ getCallbackFn: () => null,
4144
+ callbackFnName: 'null',
4145
+ errHandling: 'throw-result-err',
4146
+ callingWasmExport: true,
4147
+ });
4148
+
4149
+ let ret = specStaticAxesFromJson(ptr0, len0);
4150
+ endCurrentTask(0);
4151
+ let variant4;
4152
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4153
+ case 0: {
4154
+ var handle2 = dataView(memory0).getInt32(ret + 4, true);
4155
+ var rsc1 = new.target === Axes ? this : Object.create(Axes.prototype);
4156
+ Object.defineProperty(rsc1, symbolRscHandle, { writable: true, value: handle2});
4157
+ finalizationRegistry6.register(rsc1, handle2, rsc1);
4158
+ Object.defineProperty(rsc1, symbolDispose, { writable: true, value: function () {
4159
+ finalizationRegistry6.unregister(rsc1);
4160
+ rscTableRemove(handleTable6, handle2);
4161
+ rsc1[symbolDispose] = emptyFunc;
4162
+ rsc1[symbolRscHandle] = undefined;
4163
+ exports0['8'](handleTable6[(handle2 << 1) + 1] & ~T_FLAG);
4164
+ }});
4165
+ variant4= {
4166
+ tag: 'ok',
4167
+ val: rsc1
4168
+ };
4169
+ break;
4170
+ }
4171
+ case 1: {
4172
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
4173
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
4174
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
4175
+ variant4= {
4176
+ tag: 'err',
4177
+ val: result3
4178
+ };
4179
+ break;
4180
+ }
4181
+ default: {
4182
+ throw new TypeError('invalid variant discriminant for expected');
4183
+ }
4184
+ }
4185
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]axes.from-json"][Instruction::Return]', {
4186
+ funcName: '[static]axes.from-json',
4187
+ paramCount: 1,
4188
+ async: false,
4189
+ postReturn: true
4190
+ });
4191
+ const retCopy = variant4;
4192
+
4193
+ let cstate = getOrCreateAsyncState(0);
4194
+ cstate.mayLeave = false;
4195
+ postReturn0(ret);
4196
+ cstate.mayLeave = true;
4197
+
4198
+
4199
+
4200
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4201
+ throw new ComponentError(retCopy.val);
4202
+ }
4203
+ return retCopy.val;
4204
+
4205
+ };
4206
+ let specStaticAxesCollapse;
4207
+
4208
+ Axes.collapse = function collapse(arg0) {
4209
+
4210
+ var encodeRes = _utf8AllocateAndEncode(arg0, realloc0, memory0);
4211
+ var ptr0= encodeRes.ptr;
4212
+ var len0 = encodeRes.len;
4213
+
4214
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]axes.collapse"][Instruction::CallWasm] enter', {
4215
+ funcName: '[static]axes.collapse',
4216
+ paramCount: 2,
4217
+ async: false,
4218
+ postReturn: true,
4219
+ });
4220
+ const hostProvided = false;
4221
+
4222
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
4223
+ componentIdx: 0,
4224
+ isAsync: false,
4225
+ entryFnName: 'specStaticAxesCollapse',
4226
+ getCallbackFn: () => null,
4227
+ callbackFnName: 'null',
4228
+ errHandling: 'throw-result-err',
4229
+ callingWasmExport: true,
4230
+ });
4231
+
4232
+ let ret = specStaticAxesCollapse(ptr0, len0);
4233
+ endCurrentTask(0);
4234
+ let variant3;
4235
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4236
+ case 0: {
4237
+ var ptr1 = dataView(memory0).getUint32(ret + 4, true);
4238
+ var len1 = dataView(memory0).getUint32(ret + 8, true);
4239
+ var result1 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr1, len1));
4240
+ variant3= {
4241
+ tag: 'ok',
4242
+ val: result1
4243
+ };
4244
+ break;
4245
+ }
4246
+ case 1: {
4247
+ var ptr2 = dataView(memory0).getUint32(ret + 4, true);
4248
+ var len2 = dataView(memory0).getUint32(ret + 8, true);
4249
+ var result2 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr2, len2));
4250
+ variant3= {
4251
+ tag: 'err',
4252
+ val: result2
4253
+ };
4254
+ break;
4255
+ }
4256
+ default: {
4257
+ throw new TypeError('invalid variant discriminant for expected');
4258
+ }
4259
+ }
4260
+ _debugLog('[iface="milaboratories:pframes/spec", function="[static]axes.collapse"][Instruction::Return]', {
4261
+ funcName: '[static]axes.collapse',
4262
+ paramCount: 1,
4263
+ async: false,
4264
+ postReturn: true
4265
+ });
4266
+ const retCopy = variant3;
4267
+
4268
+ let cstate = getOrCreateAsyncState(0);
4269
+ cstate.mayLeave = false;
4270
+ postReturn1(ret);
4271
+ cstate.mayLeave = true;
4272
+
4273
+
4274
+
4275
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4276
+ throw new ComponentError(retCopy.val);
4277
+ }
4278
+ return retCopy.val;
4279
+
4280
+ };
4281
+ let specMethodAxesExpand;
4282
+
4283
+ Axes.prototype.expand = function expand() {
4284
+ var handle1 = this[symbolRscHandle];
4285
+ if (!handle1 || (handleTable6[(handle1 << 1) + 1] & T_FLAG) === 0) {
4286
+ throw new TypeError('Resource error: Not a valid "Axes" resource.');
4287
+ }
4288
+ var handle0 = handleTable6[(handle1 << 1) + 1] & ~T_FLAG;
4289
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]axes.expand"][Instruction::CallWasm] enter', {
4290
+ funcName: '[method]axes.expand',
4291
+ paramCount: 1,
4292
+ async: false,
4293
+ postReturn: true,
4294
+ });
4295
+ const hostProvided = false;
4296
+
4297
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
4298
+ componentIdx: 0,
4299
+ isAsync: false,
4300
+ entryFnName: 'specMethodAxesExpand',
4301
+ getCallbackFn: () => null,
4302
+ callbackFnName: 'null',
4303
+ errHandling: 'throw-result-err',
4304
+ callingWasmExport: true,
4305
+ });
4306
+
4307
+ let ret = specMethodAxesExpand(handle0);
4308
+ endCurrentTask(0);
4309
+ let variant4;
4310
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4311
+ case 0: {
4312
+ var ptr2 = dataView(memory0).getUint32(ret + 4, true);
4313
+ var len2 = dataView(memory0).getUint32(ret + 8, true);
4314
+ var result2 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr2, len2));
4315
+ variant4= {
4316
+ tag: 'ok',
4317
+ val: result2
4318
+ };
4319
+ break;
4320
+ }
4321
+ case 1: {
4322
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
4323
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
4324
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
4325
+ variant4= {
4326
+ tag: 'err',
4327
+ val: result3
4328
+ };
4329
+ break;
4330
+ }
4331
+ default: {
4332
+ throw new TypeError('invalid variant discriminant for expected');
4333
+ }
4334
+ }
4335
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]axes.expand"][Instruction::Return]', {
4336
+ funcName: '[method]axes.expand',
4337
+ paramCount: 1,
4338
+ async: false,
4339
+ postReturn: true
4340
+ });
4341
+ const retCopy = variant4;
4342
+
4343
+ let cstate = getOrCreateAsyncState(0);
4344
+ cstate.mayLeave = false;
4345
+ postReturn1(ret);
4346
+ cstate.mayLeave = true;
4347
+
4348
+
4349
+
4350
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4351
+ throw new ComponentError(retCopy.val);
4352
+ }
4353
+ return retCopy.val;
4354
+
4355
+ };
4356
+ let specMethodAxesFind;
4357
+
4358
+ Axes.prototype.find = function find(arg1) {
4359
+ var handle1 = this[symbolRscHandle];
4360
+ if (!handle1 || (handleTable6[(handle1 << 1) + 1] & T_FLAG) === 0) {
4361
+ throw new TypeError('Resource error: Not a valid "Axes" resource.');
4362
+ }
4363
+ var handle0 = handleTable6[(handle1 << 1) + 1] & ~T_FLAG;
4364
+
4365
+ var encodeRes = _utf8AllocateAndEncode(arg1, realloc0, memory0);
4366
+ var ptr2= encodeRes.ptr;
4367
+ var len2 = encodeRes.len;
4368
+
4369
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]axes.find"][Instruction::CallWasm] enter', {
4370
+ funcName: '[method]axes.find',
4371
+ paramCount: 3,
4372
+ async: false,
4373
+ postReturn: true,
4374
+ });
4375
+ const hostProvided = false;
4376
+
4377
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
4378
+ componentIdx: 0,
4379
+ isAsync: false,
4380
+ entryFnName: 'specMethodAxesFind',
4381
+ getCallbackFn: () => null,
4382
+ callbackFnName: 'null',
4383
+ errHandling: 'throw-result-err',
4384
+ callingWasmExport: true,
4385
+ });
4386
+
4387
+ let ret = specMethodAxesFind(handle0, ptr2, len2);
4388
+ endCurrentTask(0);
4389
+ let variant5;
4390
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
4391
+ case 0: {
4392
+ var ptr3 = dataView(memory0).getUint32(ret + 4, true);
4393
+ var len3 = dataView(memory0).getUint32(ret + 8, true);
4394
+ var result3 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr3, len3));
4395
+ variant5= {
4396
+ tag: 'ok',
4397
+ val: result3
4398
+ };
4399
+ break;
4400
+ }
4401
+ case 1: {
4402
+ var ptr4 = dataView(memory0).getUint32(ret + 4, true);
4403
+ var len4 = dataView(memory0).getUint32(ret + 8, true);
4404
+ var result4 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr4, len4));
4405
+ variant5= {
4406
+ tag: 'err',
4407
+ val: result4
4408
+ };
4409
+ break;
4410
+ }
4411
+ default: {
4412
+ throw new TypeError('invalid variant discriminant for expected');
4413
+ }
4414
+ }
4415
+ _debugLog('[iface="milaboratories:pframes/spec", function="[method]axes.find"][Instruction::Return]', {
4416
+ funcName: '[method]axes.find',
4417
+ paramCount: 1,
4418
+ async: false,
4419
+ postReturn: true
4420
+ });
4421
+ const retCopy = variant5;
4422
+
4423
+ let cstate = getOrCreateAsyncState(0);
4424
+ cstate.mayLeave = false;
4425
+ postReturn1(ret);
4426
+ cstate.mayLeave = true;
4427
+
4428
+
4429
+
4430
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
4431
+ throw new ComponentError(retCopy.val);
4432
+ }
4433
+ return retCopy.val;
4434
+
4435
+ };
4436
+
4437
+ const $init = (() => {
4438
+ let gen = (function* _initGenerator () {
4439
+ const module0 = fetchCompile(new URL('./pframes_rs_wasm.core.wasm', import.meta.url));
4440
+ const module1 = base64Compile('AGFzbQEAAAABEQNgAX8AYAJ/fwBgBH9/f38AAwsKAAECAQAAAAAAAAQFAXABCgoHNAsBMAAAATEAAQEyAAIBMwADATQABAE1AAUBNgAGATcABwE4AAgBOQAJCCRpbXBvcnRzAQAKbwoJACAAQQARAAALCwAgACABQQERAQALDwAgACABIAIgA0ECEQIACwsAIAAgAUEDEQEACwkAIABBBBEAAAsJACAAQQURAAALCQAgAEEGEQAACwkAIABBBxEAAAsJACAAQQgRAAALCQAgAEEJEQAACwAvCXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AQ13aXQtY29tcG9uZW50BzAuMjQxLjI');
4441
+ const module2 = base64Compile('AGFzbQEAAAABEQNgAX8AYAJ/fwBgBH9/f38AAkILAAEwAAAAATEAAQABMgACAAEzAAEAATQAAAABNQAAAAE2AAAAATcAAAABOAAAAAE5AAAACCRpbXBvcnRzAXABCgoJEAEAQQALCgABAgMEBQYHCAkALwlwcm9kdWNlcnMBDHByb2Nlc3NlZC1ieQENd2l0LWNvbXBvbmVudAcwLjI0MS4y');
4442
+ ({ exports: exports0 } = yield instantiateCore(yield module1));
4443
+ ({ exports: exports1 } = yield instantiateCore(yield module0, {
4444
+ '[export]milaboratories:pframes/spec': {
4445
+ '[resource-drop]frame': trampoline3,
4446
+ '[resource-new]axes': trampoline1,
4447
+ '[resource-new]frame': trampoline2,
4448
+ },
4449
+ 'wasi:cli/environment@0.2.0': {
4450
+ 'get-environment': exports0['4'],
4451
+ },
4452
+ 'wasi:cli/exit@0.2.0': {
4453
+ exit: trampoline10,
4454
+ },
4455
+ 'wasi:cli/stderr@0.2.0': {
4456
+ 'get-stderr': trampoline15,
4457
+ },
4458
+ 'wasi:cli/stdin@0.2.0': {
4459
+ 'get-stdin': trampoline13,
4460
+ },
4461
+ 'wasi:cli/stdout@0.2.0': {
4462
+ 'get-stdout': trampoline14,
4463
+ },
4464
+ 'wasi:cli/terminal-input@0.2.0': {
4465
+ '[resource-drop]terminal-input': trampoline8,
4466
+ },
4467
+ 'wasi:cli/terminal-output@0.2.0': {
4468
+ '[resource-drop]terminal-output': trampoline9,
4469
+ },
4470
+ 'wasi:cli/terminal-stderr@0.2.0': {
4471
+ 'get-terminal-stderr': exports0['7'],
4472
+ },
4473
+ 'wasi:cli/terminal-stdin@0.2.0': {
4474
+ 'get-terminal-stdin': exports0['5'],
4475
+ },
4476
+ 'wasi:cli/terminal-stdout@0.2.0': {
4477
+ 'get-terminal-stdout': exports0['6'],
4478
+ },
4479
+ 'wasi:io/error@0.2.0': {
4480
+ '[resource-drop]error': trampoline4,
4481
+ },
4482
+ 'wasi:io/poll@0.2.0': {
4483
+ '[method]pollable.block': trampoline11,
4484
+ '[resource-drop]pollable': trampoline5,
4485
+ },
4486
+ 'wasi:io/streams@0.2.0': {
4487
+ '[method]output-stream.blocking-flush': exports0['3'],
4488
+ '[method]output-stream.check-write': exports0['1'],
4489
+ '[method]output-stream.subscribe': trampoline12,
4490
+ '[method]output-stream.write': exports0['2'],
4491
+ '[resource-drop]input-stream': trampoline6,
4492
+ '[resource-drop]output-stream': trampoline7,
4493
+ },
4494
+ 'wasi:random/insecure-seed@0.2.4': {
4495
+ 'insecure-seed': exports0['0'],
4496
+ },
4497
+ 'wasi:random/random@0.2.4': {
4498
+ 'get-random-u64': trampoline0,
4499
+ },
4500
+ }));
4501
+ memory0 = exports1.memory;
4502
+ GlobalComponentMemories.save({ idx: 0, componentIdx: 1, memory: memory0 });
4503
+ realloc0 = exports1.cabi_realloc;
4504
+ ({ exports: exports2 } = yield instantiateCore(yield module2, {
4505
+ '': {
4506
+ $imports: exports0.$imports,
4507
+ '0': trampoline16,
4508
+ '1': trampoline17,
4509
+ '2': trampoline18,
4510
+ '3': trampoline19,
4511
+ '4': trampoline20,
4512
+ '5': trampoline21,
4513
+ '6': trampoline22,
4514
+ '7': trampoline23,
4515
+ '8': exports1['milaboratories:pframes/spec#[dtor]axes'],
4516
+ '9': exports1['milaboratories:pframes/spec#[dtor]frame'],
4517
+ },
4518
+ }));
4519
+ postReturn0 = exports1['cabi_post_milaboratories:pframes/spec#[static]axes.from-json'];
4520
+ postReturn1 = exports1['cabi_post_milaboratories:pframes/spec#[method]axes.expand'];
4521
+ specStaticFrameFromJson = exports1['milaboratories:pframes/spec#[static]frame.from-json'];
4522
+ specStaticFrameDeleteColumns = exports1['milaboratories:pframes/spec#[static]frame.delete-columns'];
4523
+ specMethodFrameFindColumns = exports1['milaboratories:pframes/spec#[method]frame.find-columns'];
4524
+ specMethodFrameEvaluateQuery = exports1['milaboratories:pframes/spec#[method]frame.evaluate-query'];
4525
+ specMethodFrameRewriteLegacyQuery = exports1['milaboratories:pframes/spec#[method]frame.rewrite-legacy-query'];
4526
+ specStaticAxesFromJson = exports1['milaboratories:pframes/spec#[static]axes.from-json'];
4527
+ specStaticAxesCollapse = exports1['milaboratories:pframes/spec#[static]axes.collapse'];
4528
+ specMethodAxesExpand = exports1['milaboratories:pframes/spec#[method]axes.expand'];
4529
+ specMethodAxesFind = exports1['milaboratories:pframes/spec#[method]axes.find'];
4530
+ })();
4531
+ let promise, resolve, reject;
4532
+ function runNext (value) {
4533
+ try {
4534
+ let done;
4535
+ do {
4536
+ ({ value, done } = gen.next(value));
4537
+ } while (!(value instanceof Promise) && !done);
4538
+ if (done) {
4539
+ if (resolve) resolve(value);
4540
+ else return value;
4541
+ }
4542
+ if (!promise) promise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));
4543
+ value.then(runNext, reject);
4544
+ }
4545
+ catch (e) {
4546
+ if (reject) reject(e);
4547
+ else throw e;
4548
+ }
4549
+ }
4550
+ const maybeSyncReturn = runNext(null);
4551
+ return promise || maybeSyncReturn;
4552
+ })();
4553
+
4554
+ await $init;
4555
+ const spec = {
4556
+ Axes: Axes,
4557
+ Frame: Frame,
4558
+
4559
+ };
4560
+
4561
+ export { spec, }