@ai-ecoverse/slicc-kernel 1.54.2 → 1.54.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/kernel-worker.js +759 -358
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +176 -46
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +861 -460
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +176 -46
- package/dist/process-worker.js.map +3 -3
- package/package.json +3 -3
|
@@ -1022,7 +1022,7 @@ function openAccess(existing, oflags, rights) {
|
|
|
1022
1022
|
return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable2, writable: writable2 };
|
|
1023
1023
|
}
|
|
1024
1024
|
function promoteRequest(fd, f, handed) {
|
|
1025
|
-
const orphan = f.buffer.isOrphan();
|
|
1025
|
+
const orphan = f.buffer.isOrphan() || (f.buffer.handle ?? 0) < 0;
|
|
1026
1026
|
if (!orphan && f.buffer.isRanged) f.buffer.flush();
|
|
1027
1027
|
const joins = !orphan && (handed.has(f.buffer) || f.buffer.isRanged);
|
|
1028
1028
|
return {
|
|
@@ -8713,60 +8713,201 @@ var init_wasi_module = __esm({
|
|
|
8713
8713
|
function inProc(path) {
|
|
8714
8714
|
return path === "/proc" || path.startsWith("/proc/");
|
|
8715
8715
|
}
|
|
8716
|
+
function* procWalk(path, follow2) {
|
|
8717
|
+
let done = [];
|
|
8718
|
+
let todo = path.split("/").filter((part) => part !== "");
|
|
8719
|
+
let hops = 0;
|
|
8720
|
+
while (todo.length > 0) {
|
|
8721
|
+
const part = todo.shift();
|
|
8722
|
+
if (part === ".") continue;
|
|
8723
|
+
if (part === "..") {
|
|
8724
|
+
done.pop();
|
|
8725
|
+
continue;
|
|
8726
|
+
}
|
|
8727
|
+
const at = `/${[...done, part].join("/")}`;
|
|
8728
|
+
const whole = normalize(`/${[...done, part, ...todo].join("/")}`);
|
|
8729
|
+
if (inProc(at) && inProc(whole)) return whole;
|
|
8730
|
+
if (!follow2 && todo.length === 0) return void 0;
|
|
8731
|
+
const target = yield at;
|
|
8732
|
+
if (target === null) return void 0;
|
|
8733
|
+
if (target === void 0) done.push(part);
|
|
8734
|
+
else {
|
|
8735
|
+
if (++hops > MAX_HOPS2) return void 0;
|
|
8736
|
+
if (target.startsWith("/")) done = [];
|
|
8737
|
+
todo = [...target.split("/").filter((part2) => part2 !== ""), ...todo];
|
|
8738
|
+
}
|
|
8739
|
+
}
|
|
8740
|
+
return void 0;
|
|
8741
|
+
}
|
|
8742
|
+
function procPath(fs, path, follow2) {
|
|
8743
|
+
const walk = procWalk(path, follow2);
|
|
8744
|
+
let step = walk.next();
|
|
8745
|
+
while (!step.done) {
|
|
8746
|
+
let target;
|
|
8747
|
+
try {
|
|
8748
|
+
target = fs.lstat(step.value).isSymbolicLink ? fs.readlink(step.value) : void 0;
|
|
8749
|
+
} catch {
|
|
8750
|
+
target = null;
|
|
8751
|
+
}
|
|
8752
|
+
step = walk.next(target);
|
|
8753
|
+
}
|
|
8754
|
+
return step.value;
|
|
8755
|
+
}
|
|
8756
|
+
function frozen(bytes) {
|
|
8757
|
+
const refuse = () => {
|
|
8758
|
+
throw syncError("EROFS", "/proc");
|
|
8759
|
+
};
|
|
8760
|
+
return {
|
|
8761
|
+
readFile: () => bytes,
|
|
8762
|
+
pread: (_p, at, n) => bytes.subarray(at, at + n),
|
|
8763
|
+
writeFile: refuse,
|
|
8764
|
+
pwrite: refuse,
|
|
8765
|
+
truncate: refuse
|
|
8766
|
+
};
|
|
8767
|
+
}
|
|
8716
8768
|
function procfsBridge(fs, tree) {
|
|
8769
|
+
const toProc = (path, follow2) => procPath(fs, path, follow2);
|
|
8770
|
+
const shadowing = () => {
|
|
8771
|
+
try {
|
|
8772
|
+
return fs.exists("/proc");
|
|
8773
|
+
} catch {
|
|
8774
|
+
return false;
|
|
8775
|
+
}
|
|
8776
|
+
};
|
|
8777
|
+
const via = (p, proc, own, follow2 = true) => {
|
|
8778
|
+
if (inProc(p)) return proc(p);
|
|
8779
|
+
if (shadowing()) {
|
|
8780
|
+
const real = toProc(p, follow2);
|
|
8781
|
+
if (real !== void 0) return proc(real);
|
|
8782
|
+
}
|
|
8783
|
+
try {
|
|
8784
|
+
return own();
|
|
8785
|
+
} catch (err) {
|
|
8786
|
+
const real = toProc(p, follow2);
|
|
8787
|
+
if (real === void 0) throw err;
|
|
8788
|
+
return proc(real);
|
|
8789
|
+
}
|
|
8790
|
+
};
|
|
8791
|
+
const readOnly = (paths, run) => {
|
|
8792
|
+
const physical = shadowing();
|
|
8793
|
+
for (const [p, follow2] of paths) {
|
|
8794
|
+
if (inProc(p) || physical && toProc(p, follow2) !== void 0) throw syncError("EROFS", p);
|
|
8795
|
+
}
|
|
8796
|
+
return run();
|
|
8797
|
+
};
|
|
8798
|
+
const snapshots = /* @__PURE__ */ new Map();
|
|
8799
|
+
let lastSnapshot = 0;
|
|
8800
|
+
const snapshot = (q) => {
|
|
8801
|
+
lastSnapshot--;
|
|
8802
|
+
snapshots.set(lastSnapshot, tree.read(q));
|
|
8803
|
+
return lastSnapshot;
|
|
8804
|
+
};
|
|
8805
|
+
const late = (p) => {
|
|
8806
|
+
const q = toProc(p, true);
|
|
8807
|
+
return q === void 0 ? void 0 : snapshot(q);
|
|
8808
|
+
};
|
|
8717
8809
|
const over = {
|
|
8718
|
-
readFile: (p) =>
|
|
8719
|
-
|
|
8720
|
-
|
|
8721
|
-
|
|
8722
|
-
|
|
8723
|
-
|
|
8724
|
-
|
|
8725
|
-
|
|
8726
|
-
|
|
8727
|
-
|
|
8728
|
-
|
|
8729
|
-
|
|
8730
|
-
|
|
8731
|
-
|
|
8732
|
-
|
|
8810
|
+
readFile: (p) => via(
|
|
8811
|
+
p,
|
|
8812
|
+
(q) => tree.read(q),
|
|
8813
|
+
() => fs.readFile(p)
|
|
8814
|
+
),
|
|
8815
|
+
stat: (p) => via(
|
|
8816
|
+
p,
|
|
8817
|
+
(q) => tree.stat(q),
|
|
8818
|
+
() => fs.stat(p)
|
|
8819
|
+
),
|
|
8820
|
+
lstat: (p) => via(
|
|
8821
|
+
p,
|
|
8822
|
+
(q) => tree.stat(q, false),
|
|
8823
|
+
() => fs.lstat(p),
|
|
8824
|
+
false
|
|
8825
|
+
),
|
|
8826
|
+
readdir: (p) => via(
|
|
8827
|
+
p,
|
|
8828
|
+
(q) => tree.readdir(q),
|
|
8829
|
+
() => {
|
|
8830
|
+
const names = fs.readdir(p);
|
|
8831
|
+
return p === "/" && !names.includes("proc") ? [...names, "proc"] : names;
|
|
8733
8832
|
}
|
|
8734
|
-
|
|
8833
|
+
),
|
|
8834
|
+
exists: (p) => {
|
|
8835
|
+
if (inProc(p)) return tree.exists(p);
|
|
8836
|
+
const real = shadowing() ? toProc(p, true) : void 0;
|
|
8837
|
+
if (real !== void 0) return tree.exists(real);
|
|
8838
|
+
if (fs.exists(p)) return true;
|
|
8839
|
+
const late2 = toProc(p, true);
|
|
8840
|
+
return late2 !== void 0 && tree.exists(late2);
|
|
8841
|
+
},
|
|
8842
|
+
readlink: (p) => via(
|
|
8843
|
+
p,
|
|
8844
|
+
(q) => tree.readlink(q),
|
|
8845
|
+
() => fs.readlink(p),
|
|
8846
|
+
false
|
|
8847
|
+
),
|
|
8848
|
+
readdirStat: (p) => via(
|
|
8849
|
+
p,
|
|
8850
|
+
(q) => tree.readdir(q).map((name2) => {
|
|
8735
8851
|
try {
|
|
8736
|
-
return [name2, tree.stat(`${
|
|
8852
|
+
return [name2, tree.stat(`${q}/${name2}`, false)];
|
|
8737
8853
|
} catch {
|
|
8738
8854
|
return [name2, null];
|
|
8739
8855
|
}
|
|
8740
|
-
})
|
|
8856
|
+
}),
|
|
8857
|
+
() => {
|
|
8858
|
+
const listed = fs.readdirStat(p);
|
|
8859
|
+
if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
|
|
8860
|
+
return [...listed, ["proc", tree.stat("/proc")]];
|
|
8861
|
+
}
|
|
8862
|
+
),
|
|
8863
|
+
rename: (from, to) => readOnly(
|
|
8864
|
+
[
|
|
8865
|
+
[from, false],
|
|
8866
|
+
[to, false]
|
|
8867
|
+
],
|
|
8868
|
+
() => fs.rename(from, to)
|
|
8869
|
+
),
|
|
8870
|
+
symlink: (target, link) => readOnly([[link, false]], () => fs.symlink(target, link)),
|
|
8871
|
+
hold: (p, held, open, handle) => {
|
|
8872
|
+
if (handle !== void 0 && snapshots.delete(handle)) return void 0;
|
|
8873
|
+
if (!held) return fs.hold?.(p, held, open, handle);
|
|
8874
|
+
return via(p, snapshot, () => fs.hold?.(p, held, open) ?? late(p));
|
|
8741
8875
|
},
|
|
8742
|
-
|
|
8743
|
-
|
|
8744
|
-
|
|
8876
|
+
kept: (handle) => snapshots.has(handle) || fs.kept?.(handle) === true,
|
|
8877
|
+
pinned: (handle) => {
|
|
8878
|
+
const bytes = snapshots.get(handle);
|
|
8879
|
+
return bytes ? frozen(bytes) : fs.pinned?.(handle) ?? fs;
|
|
8745
8880
|
},
|
|
8746
|
-
hold: (p, ...rest2) => inProc(p) ? void 0 : fs.hold?.(p, ...rest2),
|
|
8747
8881
|
...fs.pread ? {
|
|
8748
|
-
pread: (p, at, n, version) =>
|
|
8882
|
+
pread: (p, at, n, version) => via(
|
|
8883
|
+
p,
|
|
8884
|
+
(q) => tree.read(q).subarray(at, at + n),
|
|
8885
|
+
() => fs.pread(p, at, n, version)
|
|
8886
|
+
)
|
|
8749
8887
|
} : {}
|
|
8750
8888
|
};
|
|
8751
|
-
for (const
|
|
8752
|
-
|
|
8753
|
-
|
|
8754
|
-
|
|
8755
|
-
|
|
8756
|
-
|
|
8757
|
-
|
|
8889
|
+
for (const [names, follow2] of [
|
|
8890
|
+
[FOLLOWING, true],
|
|
8891
|
+
[NOT_FOLLOWING, false]
|
|
8892
|
+
]) {
|
|
8893
|
+
for (const name2 of names) {
|
|
8894
|
+
const fn = fs[name2];
|
|
8895
|
+
if (!fn) continue;
|
|
8896
|
+
over[name2] = (p, ...rest2) => readOnly([[p, follow2]], () => fn.call(fs, p, ...rest2));
|
|
8897
|
+
}
|
|
8758
8898
|
}
|
|
8759
8899
|
return new Proxy(fs, {
|
|
8760
8900
|
get: (target, key, receiver) => key in over ? over[key] : Reflect.get(target, key, receiver)
|
|
8761
8901
|
});
|
|
8762
8902
|
}
|
|
8763
|
-
var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree,
|
|
8903
|
+
var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree, FOLLOWING, NOT_FOLLOWING, MAX_HOPS2;
|
|
8764
8904
|
var init_wasi_procfs = __esm({
|
|
8765
8905
|
"src/process/wasi/wasi-procfs.ts"() {
|
|
8766
8906
|
"use strict";
|
|
8767
8907
|
init_sync_fs_wire();
|
|
8768
8908
|
init_process_fds();
|
|
8769
8909
|
init_procfs();
|
|
8910
|
+
init_wasi_files();
|
|
8770
8911
|
DIR_MODE3 = 16749;
|
|
8771
8912
|
FILE_MODE2 = 33060;
|
|
8772
8913
|
LINK_MODE3 = 41471;
|
|
@@ -8877,20 +9018,9 @@ var init_wasi_procfs = __esm({
|
|
|
8877
9018
|
}
|
|
8878
9019
|
}
|
|
8879
9020
|
};
|
|
8880
|
-
|
|
8881
|
-
|
|
8882
|
-
|
|
8883
|
-
"rm",
|
|
8884
|
-
"unlink",
|
|
8885
|
-
"rmdir",
|
|
8886
|
-
"symlink",
|
|
8887
|
-
"chmod",
|
|
8888
|
-
"utimes",
|
|
8889
|
-
"lutimes",
|
|
8890
|
-
"create",
|
|
8891
|
-
"pwrite",
|
|
8892
|
-
"truncate"
|
|
8893
|
-
];
|
|
9021
|
+
FOLLOWING = ["writeFile", "chmod", "utimes", "pwrite", "truncate"];
|
|
9022
|
+
NOT_FOLLOWING = ["mkdir", "rm", "unlink", "rmdir", "lutimes", "create"];
|
|
9023
|
+
MAX_HOPS2 = 40;
|
|
8894
9024
|
}
|
|
8895
9025
|
});
|
|
8896
9026
|
|