@ai-ecoverse/slicc-kernel 1.129.0 → 1.130.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -3
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +256 -59
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +236 -79
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +256 -59
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +216 -62
- package/dist/process-worker.js.map +4 -4
- package/dist/types/fs/changes.d.ts +1 -0
- package/dist/types/fs/remote.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kernel/js-threads.d.ts +38 -0
- package/dist/types/kernel/protocol.d.ts +35 -0
- package/dist/types/launcher.d.ts +1 -0
- package/dist/types/process/js/js-context.d.ts +3 -0
- package/dist/types/process/js/js-thread.d.ts +22 -0
- package/dist/types/process/wasi/wasi-files.d.ts +1 -0
- package/package.json +2 -2
|
@@ -103,6 +103,28 @@ var init_lockdown = __esm({
|
|
|
103
103
|
}
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
+
// src/kernel/protocol.ts
|
|
107
|
+
var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_PROCESS_READY, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS, JS_THREAD_SPAWN, JS_THREAD_INIT, JS_THREAD_EXIT, JS_THREAD_NO_MEMORY, JS_THREAD_CRASHED;
|
|
108
|
+
var init_protocol = __esm({
|
|
109
|
+
"src/kernel/protocol.ts"() {
|
|
110
|
+
"use strict";
|
|
111
|
+
WASM_PROCESS_INIT = "wasm-process-init";
|
|
112
|
+
WASM_PROCESS_EXIT = "wasm-process-exit";
|
|
113
|
+
WASM_PROCESS_ERROR = "wasm-process-error";
|
|
114
|
+
WASM_PROCESS_READY = "wasm-process-ready";
|
|
115
|
+
WASM_THREAD_SPAWN = "wasm-thread-spawn";
|
|
116
|
+
WASM_THREAD_INIT = "wasm-thread-init";
|
|
117
|
+
WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
118
|
+
WASM_MAX_THREADS = 256;
|
|
119
|
+
WASM_DEFAULT_THREADS = 64;
|
|
120
|
+
JS_THREAD_SPAWN = "js-thread-spawn";
|
|
121
|
+
JS_THREAD_INIT = "js-thread-init";
|
|
122
|
+
JS_THREAD_EXIT = "js-thread-exit";
|
|
123
|
+
JS_THREAD_NO_MEMORY = 256;
|
|
124
|
+
JS_THREAD_CRASHED = 257;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
106
128
|
// src/process/wasi/wasi-abi.ts
|
|
107
129
|
function wasiErrnoOf(code2) {
|
|
108
130
|
if (!code2) return E.IO;
|
|
@@ -766,35 +788,64 @@ function copying(bridge, mutating, entry) {
|
|
|
766
788
|
copy: (from, to, mode, exclusive) => mutating(() => copy2.call(bridge, from, to, mode, exclusive), ...entry(to))
|
|
767
789
|
};
|
|
768
790
|
}
|
|
791
|
+
function listed({ cache, seen, filled }, p, list, gen, asked) {
|
|
792
|
+
const base = p === "/" ? "" : p;
|
|
793
|
+
for (const [name2, st] of list) {
|
|
794
|
+
if (!st) continue;
|
|
795
|
+
filled.set(st, asked);
|
|
796
|
+
const at = `${base}/${name2}`;
|
|
797
|
+
cache.put(cache.lstats, at, st);
|
|
798
|
+
if (gen !== void 0) seen.saw(cache.lstats, at, gen);
|
|
799
|
+
if (st.isSymbolicLink) continue;
|
|
800
|
+
cache.put(cache.stats, at, st);
|
|
801
|
+
if (gen !== void 0) seen.saw(cache.stats, at, gen);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
function fetched({
|
|
805
|
+
view,
|
|
806
|
+
now,
|
|
807
|
+
seen,
|
|
808
|
+
filled,
|
|
809
|
+
cache
|
|
810
|
+
}, map, path, get) {
|
|
811
|
+
const gen = view?.now();
|
|
812
|
+
const asked = now();
|
|
813
|
+
let hit;
|
|
814
|
+
try {
|
|
815
|
+
hit = get();
|
|
816
|
+
if (gen !== void 0) seen.saw(map, path, gen);
|
|
817
|
+
} catch (e) {
|
|
818
|
+
hit = { error: e, until: asked + MISS_TTL_MS, ...gen !== void 0 ? { gen } : {} };
|
|
819
|
+
}
|
|
820
|
+
filled.set(hit, asked);
|
|
821
|
+
cache.put(map, path, hit);
|
|
822
|
+
return hit;
|
|
823
|
+
}
|
|
769
824
|
function cachingBridge(bridge, now = () => performance.now(), shared) {
|
|
770
825
|
const blind = shared !== void 0 && shared.length * 4 < SHARED_IDS_BYTES;
|
|
771
826
|
const cache = new StatCache(blind ? void 0 : shared);
|
|
772
827
|
const { stats, lstats } = cache;
|
|
773
828
|
const view = bridge.changes;
|
|
774
|
-
const
|
|
829
|
+
const filled = new Fills(view, now);
|
|
830
|
+
const young = (entry2) => filled.young(entry2);
|
|
831
|
+
const live = (miss, path) => miss.until > now() && young(miss) && (view === void 0 || miss.gen === void 0 || !view.changedSince(miss.gen, path).changed);
|
|
775
832
|
const seen = new SeenAt(view, lstats);
|
|
776
|
-
const kept = remember(cache, seen, blind);
|
|
833
|
+
const kept = remember(cache, seen, blind, (entry2) => filled.set(entry2));
|
|
777
834
|
const gone = (path) => goneAbove([lstats, stats], live, path);
|
|
835
|
+
const usable = (map, path) => {
|
|
836
|
+
const hit = map.get(path);
|
|
837
|
+
if (hit === void 0) return void 0;
|
|
838
|
+
if ("until" in hit) return live(hit, path) ? hit : void 0;
|
|
839
|
+
return young(hit) && !seen.changed(map, path) ? hit : void 0;
|
|
840
|
+
};
|
|
778
841
|
const cached = (map, path, get) => {
|
|
779
|
-
if (blind
|
|
842
|
+
if (blind) return get();
|
|
780
843
|
cache.fresh();
|
|
781
|
-
let hit = map
|
|
782
|
-
if (hit
|
|
783
|
-
if (hit === void 0 || "until" in hit && !live(hit, path)) {
|
|
844
|
+
let hit = usable(map, path);
|
|
845
|
+
if (hit === void 0) {
|
|
784
846
|
const missing2 = gone(path);
|
|
785
847
|
if (missing2) throw missing2.error;
|
|
786
|
-
|
|
787
|
-
try {
|
|
788
|
-
hit = get();
|
|
789
|
-
if (gen !== void 0) seen.saw(map, path, gen);
|
|
790
|
-
} catch (e) {
|
|
791
|
-
hit = {
|
|
792
|
-
error: e,
|
|
793
|
-
until: now() + MISS_TTL_MS,
|
|
794
|
-
...gen !== void 0 ? { gen } : {}
|
|
795
|
-
};
|
|
796
|
-
}
|
|
797
|
-
cache.put(map, path, hit);
|
|
848
|
+
hit = fetched({ view, now, seen, filled, cache }, map, path, get);
|
|
798
849
|
}
|
|
799
850
|
if ("until" in hit) throw hit.error;
|
|
800
851
|
return hit;
|
|
@@ -851,24 +902,16 @@ function cachingBridge(bridge, now = () => performance.now(), shared) {
|
|
|
851
902
|
readdir: (p) => bridge.readdir(p),
|
|
852
903
|
readdirStat: (p) => {
|
|
853
904
|
const gen = view?.now();
|
|
905
|
+
const asked = now();
|
|
854
906
|
const list = bridge.readdirStat(p);
|
|
855
|
-
|
|
856
|
-
for (const [name2, st] of list) {
|
|
857
|
-
if (!st || blind) continue;
|
|
858
|
-
const at = `${base}/${name2}`;
|
|
859
|
-
cache.put(lstats, at, st);
|
|
860
|
-
if (gen !== void 0) seen.saw(lstats, at, gen);
|
|
861
|
-
if (st.isSymbolicLink) continue;
|
|
862
|
-
cache.put(stats, at, st);
|
|
863
|
-
if (gen !== void 0) seen.saw(stats, at, gen);
|
|
864
|
-
}
|
|
907
|
+
if (!blind) listed({ cache, seen, filled }, p, list, gen, asked);
|
|
865
908
|
return list;
|
|
866
909
|
},
|
|
867
910
|
readlink: (p) => {
|
|
868
911
|
const known = blind ? void 0 : (cache.fresh(), lstats.get(p));
|
|
869
912
|
const gen = seen.lstat(p);
|
|
870
913
|
const current = view !== void 0 && gen !== void 0 && !view.changedSince(gen, p).changed;
|
|
871
|
-
if (known && current && !("until" in known) && !known.isSymbolicLink) {
|
|
914
|
+
if (known && current && !("until" in known) && young(known) && !known.isSymbolicLink) {
|
|
872
915
|
throw syncError("EINVAL", `'${p}' is not a symbolic link`);
|
|
873
916
|
}
|
|
874
917
|
return bridge.readlink(p);
|
|
@@ -941,7 +984,7 @@ function pinnedIo(bridge, handle, rewriting) {
|
|
|
941
984
|
} : {}
|
|
942
985
|
};
|
|
943
986
|
}
|
|
944
|
-
var WasiError, FileBuffer, LocalFile, MAX_LINKS, MISS_TTL_MS, CACHE_CAP, FS_GEN, CRED_GEN, UMASK, RING, RING_SIZE, SLOT, FD_RING, FD_RING_SIZE, SHARED_IDS_BYTES, StatCache, SEEN_CAP, SeenAt, remember;
|
|
987
|
+
var WasiError, FileBuffer, LocalFile, MAX_LINKS, MISS_TTL_MS, SHARED_TTL_MS, CACHE_CAP, FS_GEN, CRED_GEN, UMASK, RING, RING_SIZE, SLOT, FD_RING, FD_RING_SIZE, SHARED_IDS_BYTES, StatCache, SEEN_CAP, SeenAt, remember, Fills;
|
|
945
988
|
var init_wasi_files = __esm({
|
|
946
989
|
"src/process/wasi/wasi-files.ts"() {
|
|
947
990
|
"use strict";
|
|
@@ -1168,6 +1211,7 @@ var init_wasi_files = __esm({
|
|
|
1168
1211
|
};
|
|
1169
1212
|
MAX_LINKS = 40;
|
|
1170
1213
|
MISS_TTL_MS = 20;
|
|
1214
|
+
SHARED_TTL_MS = 100;
|
|
1171
1215
|
CACHE_CAP = 8192;
|
|
1172
1216
|
FS_GEN = 4;
|
|
1173
1217
|
CRED_GEN = 5;
|
|
@@ -1332,30 +1376,30 @@ var init_wasi_files = __esm({
|
|
|
1332
1376
|
return since.changed;
|
|
1333
1377
|
}
|
|
1334
1378
|
};
|
|
1335
|
-
remember = (cache, seen, blind) => (path, made) => {
|
|
1379
|
+
remember = (cache, seen, blind, fill) => (path, made) => {
|
|
1336
1380
|
if (!made || blind) return made;
|
|
1337
1381
|
const { seen: at, ...st } = made;
|
|
1382
|
+
fill(st);
|
|
1338
1383
|
cache.put(cache.stats, path, st);
|
|
1339
1384
|
if (at !== void 0) seen.saw(cache.stats, path, at);
|
|
1340
1385
|
return made;
|
|
1341
1386
|
};
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
WASM_DEFAULT_THREADS = 64;
|
|
1387
|
+
Fills = class {
|
|
1388
|
+
at = /* @__PURE__ */ new WeakMap();
|
|
1389
|
+
view;
|
|
1390
|
+
now;
|
|
1391
|
+
constructor(view, now) {
|
|
1392
|
+
this.view = view;
|
|
1393
|
+
this.now = now;
|
|
1394
|
+
}
|
|
1395
|
+
set(entry, at = this.now()) {
|
|
1396
|
+
this.at.set(entry, at);
|
|
1397
|
+
}
|
|
1398
|
+
young(entry) {
|
|
1399
|
+
if (!this.view?.foreign()) return true;
|
|
1400
|
+
return this.now() - (this.at.get(entry) ?? Number.NEGATIVE_INFINITY) < SHARED_TTL_MS;
|
|
1401
|
+
}
|
|
1402
|
+
};
|
|
1359
1403
|
}
|
|
1360
1404
|
});
|
|
1361
1405
|
|
|
@@ -5920,8 +5964,8 @@ var init_wasi_host = __esm({
|
|
|
5920
5964
|
}
|
|
5921
5965
|
list(path) {
|
|
5922
5966
|
const { fs } = this.o;
|
|
5923
|
-
const
|
|
5924
|
-
return { names: [".", "..", ...
|
|
5967
|
+
const listed2 = fs.readdirStat(path);
|
|
5968
|
+
return { names: [".", "..", ...listed2.map(([name2]) => name2)], stats: new Map(listed2) };
|
|
5925
5969
|
}
|
|
5926
5970
|
lstatOrNull(path) {
|
|
5927
5971
|
try {
|
|
@@ -6435,7 +6479,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
6435
6479
|
var init_version = __esm({
|
|
6436
6480
|
"src/version.ts"() {
|
|
6437
6481
|
"use strict";
|
|
6438
|
-
KERNEL_VERSION = true ? "1.
|
|
6482
|
+
KERNEL_VERSION = true ? "1.130.1" : "0.0.0-dev";
|
|
6439
6483
|
OS_RELEASE = "6.0.0-slicc";
|
|
6440
6484
|
}
|
|
6441
6485
|
});
|
|
@@ -8343,9 +8387,9 @@ function createNodeOps(h) {
|
|
|
8343
8387
|
node.live.stat = void 0;
|
|
8344
8388
|
},
|
|
8345
8389
|
lookup(parent, name2) {
|
|
8346
|
-
const
|
|
8390
|
+
const listed2 = parent.live.listed?.get(name2);
|
|
8347
8391
|
parent.live.listed?.delete(name2);
|
|
8348
|
-
const st =
|
|
8392
|
+
const st = listed2 ?? call2(() => bridgeOf(parent).lstat(childPath(parent, name2)));
|
|
8349
8393
|
return makeNode(parent, name2, st);
|
|
8350
8394
|
},
|
|
8351
8395
|
mknod(parent, name2, mode) {
|
|
@@ -8419,10 +8463,10 @@ function createNodeOps(h) {
|
|
|
8419
8463
|
call2(() => bridgeOf(parent).rmdir(childPath(parent, name2)));
|
|
8420
8464
|
},
|
|
8421
8465
|
readdir(node) {
|
|
8422
|
-
const
|
|
8466
|
+
const listed2 = call2(() => bridgeOf(node).readdirStat(liveNodePath(node)));
|
|
8423
8467
|
node.live.listed = /* @__PURE__ */ new Map();
|
|
8424
|
-
for (const [name2, st] of
|
|
8425
|
-
return [".", "..", ...
|
|
8468
|
+
for (const [name2, st] of listed2) if (st) node.live.listed.set(name2, st);
|
|
8469
|
+
return [".", "..", ...listed2.map(([name2]) => name2)];
|
|
8426
8470
|
},
|
|
8427
8471
|
symlink(parent, newName, target) {
|
|
8428
8472
|
parent.live.listed = void 0;
|
|
@@ -10456,7 +10500,7 @@ function useProcfs(Fs, sys, pid, memory = memorySource()) {
|
|
|
10456
10500
|
return dir;
|
|
10457
10501
|
};
|
|
10458
10502
|
const scans = /* @__PURE__ */ new Map();
|
|
10459
|
-
const
|
|
10503
|
+
const listed2 = (target) => {
|
|
10460
10504
|
let found = false;
|
|
10461
10505
|
for (const [stream, pids] of scans) {
|
|
10462
10506
|
if (Fs.streams && Fs.streams[stream.fd ?? -1] !== stream) scans.delete(stream);
|
|
@@ -10477,7 +10521,7 @@ function useProcfs(Fs, sys, pid, memory = memorySource()) {
|
|
|
10477
10521
|
...procOps2,
|
|
10478
10522
|
lookup: (parent, name2) => {
|
|
10479
10523
|
if (/^[1-9]\d*$/.test(name2)) {
|
|
10480
|
-
if (!infoOf(Number(name2)) && !
|
|
10524
|
+
if (!infoOf(Number(name2)) && !listed2(Number(name2))) throw error();
|
|
10481
10525
|
return pidDir(name2, Number(name2));
|
|
10482
10526
|
}
|
|
10483
10527
|
if (name2 === "mounts") return file(parent, name2, () => mountTable(sys.mountList?.() ?? []));
|
|
@@ -10793,9 +10837,9 @@ function procfsBridge(fs, tree) {
|
|
|
10793
10837
|
}
|
|
10794
10838
|
}),
|
|
10795
10839
|
() => {
|
|
10796
|
-
const
|
|
10797
|
-
if (p !== "/" ||
|
|
10798
|
-
return [...
|
|
10840
|
+
const listed2 = fs.readdirStat(p);
|
|
10841
|
+
if (p !== "/" || listed2.some(([name2]) => name2 === "proc")) return listed2;
|
|
10842
|
+
return [...listed2, ["proc", tree.stat("/proc")]];
|
|
10799
10843
|
}
|
|
10800
10844
|
),
|
|
10801
10845
|
rename: (from, to) => readOnly2(
|
|
@@ -12255,9 +12299,7 @@ function createContext(o) {
|
|
|
12255
12299
|
argv: o.argv,
|
|
12256
12300
|
env: o.env,
|
|
12257
12301
|
pid: o.pid,
|
|
12258
|
-
async
|
|
12259
|
-
return identityOf(await kernel.json({ op: "proc-identity" }), o).ppid;
|
|
12260
|
-
},
|
|
12302
|
+
ppid: async () => identityOf(await kernel.json({ op: "proc-identity" }), o).ppid,
|
|
12261
12303
|
cwd: o.cwd,
|
|
12262
12304
|
stdin: readable2(read2),
|
|
12263
12305
|
stdout: writable2(1),
|
|
@@ -12302,6 +12344,7 @@ function createContext(o) {
|
|
|
12302
12344
|
websocket: websocketOp(kernel),
|
|
12303
12345
|
tty: terminal.tty,
|
|
12304
12346
|
exit,
|
|
12347
|
+
thread: o.thread,
|
|
12305
12348
|
onUncaught: (listener) => listen(strays.exception, listener),
|
|
12306
12349
|
onUnhandledRejection: (listener) => listen(strays.rejection, listener)
|
|
12307
12350
|
};
|
|
@@ -12533,11 +12576,100 @@ var init_js_context = __esm({
|
|
|
12533
12576
|
}
|
|
12534
12577
|
});
|
|
12535
12578
|
|
|
12579
|
+
// src/process/js/js-thread.ts
|
|
12580
|
+
function outOfMemory(err) {
|
|
12581
|
+
return err instanceof RangeError && OOM.test(err.message);
|
|
12582
|
+
}
|
|
12583
|
+
function optionsOf(options) {
|
|
12584
|
+
if (options === void 0) return {};
|
|
12585
|
+
if (typeof options !== "object" || options === null || Array.isArray(options)) {
|
|
12586
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
12587
|
+
}
|
|
12588
|
+
const { transfer } = options;
|
|
12589
|
+
if (transfer !== void 0 && !Array.isArray(transfer)) {
|
|
12590
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
12591
|
+
}
|
|
12592
|
+
return options;
|
|
12593
|
+
}
|
|
12594
|
+
function started(port3, control) {
|
|
12595
|
+
const exited = Promise.withResolvers();
|
|
12596
|
+
return new Promise((resolve, reject) => {
|
|
12597
|
+
const thread = (tid) => Object.freeze({
|
|
12598
|
+
tid,
|
|
12599
|
+
port: port3,
|
|
12600
|
+
exited: exited.promise,
|
|
12601
|
+
async terminate() {
|
|
12602
|
+
control.postMessage({ terminate: true });
|
|
12603
|
+
await exited.promise;
|
|
12604
|
+
}
|
|
12605
|
+
});
|
|
12606
|
+
control.onmessage = (event) => {
|
|
12607
|
+
const said = event.data;
|
|
12608
|
+
if ("tid" in said) resolve(thread(said.tid));
|
|
12609
|
+
else if ("errno" in said) {
|
|
12610
|
+
control.close();
|
|
12611
|
+
port3.close();
|
|
12612
|
+
reject(new JsCallError(said.errno, "thread.spawn", said.message));
|
|
12613
|
+
} else if ("exited" in said) {
|
|
12614
|
+
control.close();
|
|
12615
|
+
exited.resolve(said.exited);
|
|
12616
|
+
}
|
|
12617
|
+
};
|
|
12618
|
+
});
|
|
12619
|
+
}
|
|
12620
|
+
function threadContext(post2, start2) {
|
|
12621
|
+
const spawn = (options) => {
|
|
12622
|
+
let asked;
|
|
12623
|
+
try {
|
|
12624
|
+
asked = optionsOf(options);
|
|
12625
|
+
} catch (err) {
|
|
12626
|
+
return Promise.reject(err);
|
|
12627
|
+
}
|
|
12628
|
+
const channel = new NativeChannel();
|
|
12629
|
+
const control = new NativeChannel();
|
|
12630
|
+
const transfer = [...asked.transfer ?? []];
|
|
12631
|
+
const msg = {
|
|
12632
|
+
type: JS_THREAD_SPAWN,
|
|
12633
|
+
data: asked.data,
|
|
12634
|
+
port: channel.port2,
|
|
12635
|
+
control: control.port2,
|
|
12636
|
+
transfer
|
|
12637
|
+
};
|
|
12638
|
+
try {
|
|
12639
|
+
post2.postMessage(msg, [channel.port2, control.port2, ...transfer]);
|
|
12640
|
+
} catch (err) {
|
|
12641
|
+
channel.port1.close();
|
|
12642
|
+
control.port1.close();
|
|
12643
|
+
return Promise.reject(err);
|
|
12644
|
+
}
|
|
12645
|
+
return started(channel.port1, control.port1);
|
|
12646
|
+
};
|
|
12647
|
+
return Object.freeze({
|
|
12648
|
+
tid: start2?.tid ?? 0,
|
|
12649
|
+
port: start2?.port,
|
|
12650
|
+
data: start2?.data,
|
|
12651
|
+
NO_MEMORY: JS_THREAD_NO_MEMORY,
|
|
12652
|
+
CRASHED: JS_THREAD_CRASHED,
|
|
12653
|
+
spawn
|
|
12654
|
+
});
|
|
12655
|
+
}
|
|
12656
|
+
var NativeChannel, OOM;
|
|
12657
|
+
var init_js_thread = __esm({
|
|
12658
|
+
"src/process/js/js-thread.ts"() {
|
|
12659
|
+
"use strict";
|
|
12660
|
+
init_protocol();
|
|
12661
|
+
init_js_kernel();
|
|
12662
|
+
NativeChannel = globalThis.MessageChannel;
|
|
12663
|
+
OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory/i;
|
|
12664
|
+
}
|
|
12665
|
+
});
|
|
12666
|
+
|
|
12536
12667
|
// src/process/js/js-runtime.ts
|
|
12537
12668
|
var js_runtime_exports = {};
|
|
12538
12669
|
__export(js_runtime_exports, {
|
|
12539
12670
|
mainOf: () => mainOf,
|
|
12540
12671
|
runJsProcess: () => runJsProcess,
|
|
12672
|
+
runJsThread: () => runJsThread,
|
|
12541
12673
|
trapStrays: () => trapStrays
|
|
12542
12674
|
});
|
|
12543
12675
|
function trapStrays(scope2, stray) {
|
|
@@ -12568,7 +12700,15 @@ function mainOf(module) {
|
|
|
12568
12700
|
const main = typeof module.default === "function" ? module.default : module.main;
|
|
12569
12701
|
return typeof main === "function" ? main : void 0;
|
|
12570
12702
|
}
|
|
12571
|
-
|
|
12703
|
+
function runJsProcess(init, port3, deps = {}) {
|
|
12704
|
+
return runJs(init, port3, deps, void 0);
|
|
12705
|
+
}
|
|
12706
|
+
function runJsThread(init, port3, deps = {}) {
|
|
12707
|
+
const { thread, ...rest2 } = init;
|
|
12708
|
+
return runJs(rest2, port3, deps, thread);
|
|
12709
|
+
}
|
|
12710
|
+
async function runJs(init, port3, deps, thread) {
|
|
12711
|
+
const failed5 = (err) => thread && outOfMemory(err) ? JS_THREAD_NO_MEMORY : 1;
|
|
12572
12712
|
const transport = createAsyncSabTransport(init.sab, port3, deps.waitAsync);
|
|
12573
12713
|
let resolveExit;
|
|
12574
12714
|
const exit = new Promise((resolve) => resolveExit = resolve);
|
|
@@ -12580,7 +12720,7 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12580
12720
|
let failing;
|
|
12581
12721
|
const fail = (err) => {
|
|
12582
12722
|
if (err instanceof JsExit) return;
|
|
12583
|
-
failing ??= say(message(err)).then(() => exited(
|
|
12723
|
+
failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed5(err)));
|
|
12584
12724
|
};
|
|
12585
12725
|
const kernel = new JsKernel({
|
|
12586
12726
|
sab: init.sab,
|
|
@@ -12601,7 +12741,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12601
12741
|
cwd: init.cwd,
|
|
12602
12742
|
exit: (status3) => exited(statusOf(status3)),
|
|
12603
12743
|
lane: laneOf(init.lane),
|
|
12604
|
-
strays
|
|
12744
|
+
strays,
|
|
12745
|
+
thread: threadContext(port3, thread)
|
|
12605
12746
|
});
|
|
12606
12747
|
const say = (text) => ctx.write(2, `${init.argv0}: ${text}
|
|
12607
12748
|
`).catch(() => void 0);
|
|
@@ -12632,8 +12773,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12632
12773
|
const program = main;
|
|
12633
12774
|
const ran = Promise.resolve().then(() => program(ctx)).then(statusOf, async (err) => {
|
|
12634
12775
|
if (err instanceof JsExit) return err.status;
|
|
12635
|
-
await say(message(err));
|
|
12636
|
-
return
|
|
12776
|
+
if (!thread) await say(message(err));
|
|
12777
|
+
return failed5(err);
|
|
12637
12778
|
});
|
|
12638
12779
|
const status2 = await Promise.race([ran, exit]);
|
|
12639
12780
|
await drain2();
|
|
@@ -12646,11 +12787,13 @@ var NOT_RUNNABLE;
|
|
|
12646
12787
|
var init_js_runtime = __esm({
|
|
12647
12788
|
"src/process/js/js-runtime.ts"() {
|
|
12648
12789
|
"use strict";
|
|
12790
|
+
init_protocol();
|
|
12649
12791
|
init_wasi_imports();
|
|
12650
12792
|
init_async_sab();
|
|
12651
12793
|
init_js_context();
|
|
12652
12794
|
init_js_kernel();
|
|
12653
12795
|
init_js_sync();
|
|
12796
|
+
init_js_thread();
|
|
12654
12797
|
init_lockdown();
|
|
12655
12798
|
NOT_RUNNABLE = 126;
|
|
12656
12799
|
}
|
|
@@ -15150,17 +15293,17 @@ function ptsBridge(fs, call2) {
|
|
|
15150
15293
|
},
|
|
15151
15294
|
readdir: (p) => {
|
|
15152
15295
|
if (p === PTS) return names();
|
|
15153
|
-
const
|
|
15154
|
-
return p === "/dev" && !
|
|
15296
|
+
const listed2 = fs.readdir(p);
|
|
15297
|
+
return p === "/dev" && !listed2.includes("pts") ? [...listed2, "pts"] : listed2;
|
|
15155
15298
|
},
|
|
15156
15299
|
readdirStat: (p) => {
|
|
15157
15300
|
if (p === PTS) {
|
|
15158
15301
|
const known = open();
|
|
15159
15302
|
return names(known).map((name2) => listedEntry(name2, known));
|
|
15160
15303
|
}
|
|
15161
|
-
const
|
|
15162
|
-
if (p !== "/dev" ||
|
|
15163
|
-
return [...
|
|
15304
|
+
const listed2 = fs.readdirStat(p);
|
|
15305
|
+
if (p !== "/dev" || listed2.some(([name2]) => name2 === "pts")) return listed2;
|
|
15306
|
+
return [...listed2, ["pts", dir()]];
|
|
15164
15307
|
}
|
|
15165
15308
|
};
|
|
15166
15309
|
return new Proxy(fs, {
|
|
@@ -17746,7 +17889,7 @@ init_process_runtime();
|
|
|
17746
17889
|
var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
|
|
17747
17890
|
var loadJs = () => Promise.resolve().then(() => (init_js_runtime(), js_runtime_exports));
|
|
17748
17891
|
var NOT_RUNNABLE2 = 126;
|
|
17749
|
-
function
|
|
17892
|
+
function started2(init, port3, run, wasi, js) {
|
|
17750
17893
|
if (init.program?.abi === "js") {
|
|
17751
17894
|
const jsInit = init;
|
|
17752
17895
|
return js().then((m) => m.runJsProcess(jsInit, port3));
|
|
@@ -17776,8 +17919,19 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17776
17919
|
};
|
|
17777
17920
|
return (data) => {
|
|
17778
17921
|
const type = data?.type;
|
|
17779
|
-
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;
|
|
17922
|
+
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT && type !== JS_THREAD_INIT) return;
|
|
17780
17923
|
const refusal2 = sealOnce();
|
|
17924
|
+
if (type === JS_THREAD_INIT) {
|
|
17925
|
+
if (refusal2) return failed5(refusal2.error);
|
|
17926
|
+
js().then((m) => {
|
|
17927
|
+
if (!m.runJsThread) throw new Error("this process worker runs no JS threads");
|
|
17928
|
+
return m.runJsThread(data, port3);
|
|
17929
|
+
}).then(
|
|
17930
|
+
(code2) => port3.postMessage({ type: JS_THREAD_EXIT, code: code2 }),
|
|
17931
|
+
failed5
|
|
17932
|
+
);
|
|
17933
|
+
return;
|
|
17934
|
+
}
|
|
17781
17935
|
const init = data;
|
|
17782
17936
|
if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
|
|
17783
17937
|
if (type === WASM_THREAD_INIT) {
|
|
@@ -17786,7 +17940,7 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17786
17940
|
return;
|
|
17787
17941
|
}
|
|
17788
17942
|
if (refusal2) return failed5(refusal2.error, NOT_RUNNABLE2);
|
|
17789
|
-
|
|
17943
|
+
started2(data, port3, run, wasi, js).then(
|
|
17790
17944
|
(code2) => port3.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
|
|
17791
17945
|
failed5
|
|
17792
17946
|
);
|
|
@@ -17800,14 +17954,17 @@ scope.require ??= createRequire(import.meta.url);
|
|
|
17800
17954
|
scope.__filename ??= new URL(import.meta.url).pathname;
|
|
17801
17955
|
scope.__dirname ??= new URL(".", import.meta.url).pathname;
|
|
17802
17956
|
var port2 = parentPort;
|
|
17803
|
-
var post = {
|
|
17957
|
+
var post = {
|
|
17958
|
+
postMessage: (message2, transfer) => port2.postMessage(message2, transfer)
|
|
17959
|
+
};
|
|
17804
17960
|
var strayScope = nodeProcess ? { process: nodeProcess } : {};
|
|
17805
17961
|
var onMessage = processEntry(
|
|
17806
17962
|
post,
|
|
17807
17963
|
void 0,
|
|
17808
17964
|
async () => wasi_runtime_exports,
|
|
17809
17965
|
async () => ({
|
|
17810
|
-
runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
|
|
17966
|
+
runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope }),
|
|
17967
|
+
runJsThread: (init, at) => runJsThread(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
|
|
17811
17968
|
}),
|
|
17812
17969
|
() => nodeLockdown()
|
|
17813
17970
|
);
|