@ai-ecoverse/slicc-kernel 1.73.2 → 1.73.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 +38 -7
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +20 -5
- package/dist/node-process-worker.js.map +2 -2
- package/dist/node.js +38 -7
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +234 -219
- package/dist/process-worker.js.map +4 -4
- package/package.json +1 -1
package/dist/process-worker.js
CHANGED
|
@@ -857,6 +857,227 @@ var init_sync_fs_wire = __esm({
|
|
|
857
857
|
}
|
|
858
858
|
});
|
|
859
859
|
|
|
860
|
+
// src/realm/sync-sab-bridge.ts
|
|
861
|
+
function syncCallCount() {
|
|
862
|
+
return calls;
|
|
863
|
+
}
|
|
864
|
+
function createSyncSabTransport(sab, port2, deps = {}) {
|
|
865
|
+
const views = sabViews(sab);
|
|
866
|
+
const { header, window } = views;
|
|
867
|
+
const wait2 = deps.wait ?? ((a, i, v, t) => rawWait(a, i, v, t));
|
|
868
|
+
const now = deps.now ?? (() => performance.now());
|
|
869
|
+
let seq = 0;
|
|
870
|
+
function awaitReady(id, deadline, label) {
|
|
871
|
+
for (; ; ) {
|
|
872
|
+
const published = Atomics.load(header, SAB_I_PUB);
|
|
873
|
+
if (Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY && Atomics.load(header, SAB_I_SEQ) === id) {
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
const remaining = deadline - now();
|
|
877
|
+
if (remaining <= 0) throw syncError("ETIMEDOUT", label);
|
|
878
|
+
wait2(header, SAB_I_PUB, published, remaining);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
return {
|
|
882
|
+
call(req, timeoutMs, label, transfer = []) {
|
|
883
|
+
if (deps.memory) publishMemory(sab, deps.memory());
|
|
884
|
+
const id = ++seq;
|
|
885
|
+
calls += Number(!PATH_OPS.has(req.op));
|
|
886
|
+
const deadline = now() + timeoutMs;
|
|
887
|
+
let out = null;
|
|
888
|
+
let status2 = 0;
|
|
889
|
+
let offset = 0;
|
|
890
|
+
Atomics.store(header, SAB_I_REQ, id);
|
|
891
|
+
try {
|
|
892
|
+
for (; ; ) {
|
|
893
|
+
Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);
|
|
894
|
+
const msg = offset === 0 ? { type: SYNC_SAB_REQ_MSG, id, req } : { type: SYNC_SAB_NEXT_MSG, id, offset };
|
|
895
|
+
try {
|
|
896
|
+
if (offset === 0 && transfer.length > 0) port2.postMessage(msg, transfer);
|
|
897
|
+
else port2.postMessage(msg);
|
|
898
|
+
} catch {
|
|
899
|
+
throw syncError("EIO", label);
|
|
900
|
+
}
|
|
901
|
+
awaitReady(id, deadline, label);
|
|
902
|
+
const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);
|
|
903
|
+
const chunk = Atomics.load(header, SAB_I_CHUNK);
|
|
904
|
+
const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);
|
|
905
|
+
if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {
|
|
906
|
+
throw syncError("EIO", label);
|
|
907
|
+
}
|
|
908
|
+
if (out === null) {
|
|
909
|
+
status2 = Atomics.load(header, SAB_I_STATUS);
|
|
910
|
+
out = new Uint8Array(total);
|
|
911
|
+
}
|
|
912
|
+
out.set(window.subarray(0, chunk), offset);
|
|
913
|
+
offset += chunk;
|
|
914
|
+
if (offset >= total) break;
|
|
915
|
+
if (chunk === 0) throw syncError("EIO", label);
|
|
916
|
+
}
|
|
917
|
+
} finally {
|
|
918
|
+
Atomics.store(header, SAB_I_REQ, 0);
|
|
919
|
+
Atomics.store(header, SAB_I_STATE, SAB_STATE_IDLE);
|
|
920
|
+
}
|
|
921
|
+
return decodeSabResult(status2, out);
|
|
922
|
+
}
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
function errnoError(code2, path) {
|
|
926
|
+
return syncError(code2, `sync-sab bridge, '${path}'`);
|
|
927
|
+
}
|
|
928
|
+
function createSyncFsSabBridge(transport, opts = {}) {
|
|
929
|
+
const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;
|
|
930
|
+
let identity = {};
|
|
931
|
+
let last = null;
|
|
932
|
+
function run(req, path, transfer) {
|
|
933
|
+
last = null;
|
|
934
|
+
const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`, transfer);
|
|
935
|
+
if (!result.ok) throw errnoError(result.errno, path);
|
|
936
|
+
return result;
|
|
937
|
+
}
|
|
938
|
+
function bytes(req, path) {
|
|
939
|
+
const r = run(req, path);
|
|
940
|
+
if (r.ok && r.kind === "bytes") return r.bytes;
|
|
941
|
+
throw errnoError("EIO", path);
|
|
942
|
+
}
|
|
943
|
+
function json2(req, path) {
|
|
944
|
+
const r = run(req, path);
|
|
945
|
+
if (r.ok && r.kind === "json") return r.json;
|
|
946
|
+
throw errnoError("EIO", path);
|
|
947
|
+
}
|
|
948
|
+
const changing = (req, path, transfer) => {
|
|
949
|
+
const r = run({ ...req, ...identity }, path, transfer);
|
|
950
|
+
if (r.ok && r.kind === "json") last = parseSyncFsStat(r.json);
|
|
951
|
+
};
|
|
952
|
+
const io = (id) => ({
|
|
953
|
+
readFile: (path) => bytes({ op: "read", path, ...id }, path),
|
|
954
|
+
writeFile: (path, data, open) => {
|
|
955
|
+
changing({ op: "write", path, body: data, ...open ? { mode: 1 } : {}, ...id }, path);
|
|
956
|
+
},
|
|
957
|
+
pread: (path, offset, length, version) => bytes({ op: "pread", path, offset, length, ...version ? { version } : {}, ...id }, path),
|
|
958
|
+
pwrite: (path, offset, body, transfer) => {
|
|
959
|
+
const whole = body.byteOffset === 0 && body.byteLength === body.buffer.byteLength;
|
|
960
|
+
const owned = transfer && whole && body.buffer instanceof ArrayBuffer;
|
|
961
|
+
const transferred = owned ? [body.buffer] : [];
|
|
962
|
+
changing({ op: "pwrite", path, offset, body, ...id }, path, transferred);
|
|
963
|
+
},
|
|
964
|
+
truncate: (path, length) => {
|
|
965
|
+
changing({ op: "truncate", path, length, ...id }, path);
|
|
966
|
+
}
|
|
967
|
+
});
|
|
968
|
+
return {
|
|
969
|
+
...io({}),
|
|
970
|
+
pinned: (handle) => io({ handle }),
|
|
971
|
+
kept: (handle) => json2({ op: "kept", path: "/", handle }, "/") === true,
|
|
972
|
+
keptStat: (handle) => {
|
|
973
|
+
const s = parseSyncFsStat(json2({ op: "stat", path: "/", handle }, "/"));
|
|
974
|
+
if (!s) throw errnoError("EIO", "/");
|
|
975
|
+
return s;
|
|
976
|
+
},
|
|
977
|
+
stat: (path) => {
|
|
978
|
+
const s = parseSyncFsStat(json2({ op: "stat", path }, path));
|
|
979
|
+
if (!s) throw errnoError("EIO", path);
|
|
980
|
+
return s;
|
|
981
|
+
},
|
|
982
|
+
lstat: (path) => {
|
|
983
|
+
const s = parseSyncFsStat(json2({ op: "lstat", path }, path));
|
|
984
|
+
if (!s) throw errnoError("EIO", path);
|
|
985
|
+
return s;
|
|
986
|
+
},
|
|
987
|
+
readdir: (path) => {
|
|
988
|
+
const list = json2({ op: "readdir", path }, path);
|
|
989
|
+
if (!Array.isArray(list) || !list.every((s) => typeof s === "string")) {
|
|
990
|
+
throw errnoError("EIO", path);
|
|
991
|
+
}
|
|
992
|
+
return list;
|
|
993
|
+
},
|
|
994
|
+
readdirStat: (path) => {
|
|
995
|
+
const list = json2({ op: "readdir-stat", path }, path);
|
|
996
|
+
if (!Array.isArray(list)) throw errnoError("EIO", path);
|
|
997
|
+
return list.map((entry) => {
|
|
998
|
+
if (!Array.isArray(entry) || typeof entry[0] !== "string") throw errnoError("EIO", path);
|
|
999
|
+
if (entry[1] === null) return [entry[0], null];
|
|
1000
|
+
const stat = parseSyncFsStat(entry[1]);
|
|
1001
|
+
if (!stat) throw errnoError("EIO", path);
|
|
1002
|
+
return [entry[0], stat];
|
|
1003
|
+
});
|
|
1004
|
+
},
|
|
1005
|
+
exists: (path) => {
|
|
1006
|
+
const v = json2({ op: "exists", path }, path);
|
|
1007
|
+
if (typeof v !== "boolean") throw errnoError("EIO", path);
|
|
1008
|
+
return v;
|
|
1009
|
+
},
|
|
1010
|
+
mkdir: (path, mode) => {
|
|
1011
|
+
run({ op: "mkdir", path, exclusive: true, ...mode !== void 0 ? { mode } : {} }, path);
|
|
1012
|
+
},
|
|
1013
|
+
rm: (path) => {
|
|
1014
|
+
run({ op: "rm", path }, path);
|
|
1015
|
+
},
|
|
1016
|
+
rename: (from, to) => {
|
|
1017
|
+
run({ op: "rename", path: from, arg2: to }, from);
|
|
1018
|
+
},
|
|
1019
|
+
link: (from, to, follow2) => {
|
|
1020
|
+
run({ op: "link", path: from, arg2: to, ...follow2 ? { mode: 1 } : {} }, from);
|
|
1021
|
+
},
|
|
1022
|
+
unlink: (path) => {
|
|
1023
|
+
run({ op: "unlink", path }, path);
|
|
1024
|
+
},
|
|
1025
|
+
rmdir: (path) => {
|
|
1026
|
+
run({ op: "rmdir", path }, path);
|
|
1027
|
+
},
|
|
1028
|
+
symlink: (target, linkPath) => {
|
|
1029
|
+
run({ op: "symlink", path: linkPath, arg2: target }, linkPath);
|
|
1030
|
+
},
|
|
1031
|
+
readlink: (path) => {
|
|
1032
|
+
const target = json2({ op: "readlink", path }, path);
|
|
1033
|
+
if (typeof target !== "string") throw errnoError("EIO", path);
|
|
1034
|
+
return target;
|
|
1035
|
+
},
|
|
1036
|
+
chmod: (path, mode) => {
|
|
1037
|
+
changing({ op: "chmod", path, mode }, path);
|
|
1038
|
+
},
|
|
1039
|
+
utimes: (path, atimeMs, mtimeMs, now) => {
|
|
1040
|
+
changing({ op: "utimes", path, atimeMs, mtimeMs, ...now ? { now } : {} }, path);
|
|
1041
|
+
},
|
|
1042
|
+
identify: () => {
|
|
1043
|
+
identity = { identity: true };
|
|
1044
|
+
},
|
|
1045
|
+
identified: () => last,
|
|
1046
|
+
lutimes: (path, atimeMs, mtimeMs, now) => {
|
|
1047
|
+
run({ op: "lutimes", path, atimeMs, mtimeMs, ...now ? { now } : {} }, path);
|
|
1048
|
+
},
|
|
1049
|
+
create: (path, mode) => {
|
|
1050
|
+
run({ op: "create", path, ...mode !== void 0 ? { mode } : {} }, path);
|
|
1051
|
+
},
|
|
1052
|
+
chown: (path, uid, gid, follow2) => {
|
|
1053
|
+
const ids = { ...uid !== void 0 ? { uid } : {}, ...gid !== void 0 ? { gid } : {} };
|
|
1054
|
+
changing({ op: follow2 ? "chown" : "lchown", path, ...ids }, path);
|
|
1055
|
+
},
|
|
1056
|
+
...opts.owners ? { owners: true } : {},
|
|
1057
|
+
access: (path, mode, kind = "access", nofollow) => {
|
|
1058
|
+
run({ op: "access", path, mode, arg2: kind, ...nofollow ? { nofollow } : {} }, path);
|
|
1059
|
+
},
|
|
1060
|
+
hold: (path, held, open, handle, want = 0) => {
|
|
1061
|
+
const mode = (held ? 1 : 0) | (open ? 2 : 0);
|
|
1062
|
+
if (mode === 3) return json2({ op: "hold", path, mode: mode | want }, path);
|
|
1063
|
+
run({ op: "hold", path, mode, ...handle !== void 0 ? { handle } : {} }, path);
|
|
1064
|
+
return void 0;
|
|
1065
|
+
},
|
|
1066
|
+
statfs: (path = "/") => parseSyncFsUsage(json2({ op: "statfs", path }, path))
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
var PATH_OPS, calls;
|
|
1070
|
+
var init_sync_sab_bridge = __esm({
|
|
1071
|
+
"src/realm/sync-sab-bridge.ts"() {
|
|
1072
|
+
"use strict";
|
|
1073
|
+
init_cpu_clock();
|
|
1074
|
+
init_sync_fs_wire();
|
|
1075
|
+
init_sync_sab_wire();
|
|
1076
|
+
PATH_OPS = new Set(SYNC_FS_OPS);
|
|
1077
|
+
calls = 0;
|
|
1078
|
+
}
|
|
1079
|
+
});
|
|
1080
|
+
|
|
860
1081
|
// src/realm/live-vfs-fs.ts
|
|
861
1082
|
function toErrno(Fs, err) {
|
|
862
1083
|
if (err?.errno !== void 0 && err instanceof Fs.ErrnoError) {
|
|
@@ -898,6 +1119,9 @@ function refusal(err) {
|
|
|
898
1119
|
const code2 = err?.code;
|
|
899
1120
|
return code2 === "EACCES" || code2 === "EPERM";
|
|
900
1121
|
}
|
|
1122
|
+
function cachedStat(s, dir) {
|
|
1123
|
+
return s.stat !== void 0 && (!dir || s.statAt === syncCallCount());
|
|
1124
|
+
}
|
|
901
1125
|
function linkedStates(bridgeOf) {
|
|
902
1126
|
const opens = /* @__PURE__ */ new Map();
|
|
903
1127
|
const byId = /* @__PURE__ */ new Map();
|
|
@@ -980,7 +1204,8 @@ function createHelpers(Fs, ops) {
|
|
|
980
1204
|
}
|
|
981
1205
|
}
|
|
982
1206
|
function freshState(stat) {
|
|
983
|
-
|
|
1207
|
+
const statAt = syncCallCount();
|
|
1208
|
+
return { ...stat ? { stat, statAt } : {}, len: 0, loaded: false, dirty: false, openCount: 0 };
|
|
984
1209
|
}
|
|
985
1210
|
function makeNode(parent, name2, st) {
|
|
986
1211
|
const node = Fs.createNode(parent, name2, modeFromStat(st), 0);
|
|
@@ -994,9 +1219,9 @@ function createHelpers(Fs, ops) {
|
|
|
994
1219
|
const size = node.live.ranged?.size() ?? node.live.len;
|
|
995
1220
|
return { ...node.live.stat, size };
|
|
996
1221
|
}
|
|
997
|
-
if (!node.live.
|
|
1222
|
+
if (!cachedStat(node.live, Fs.isDir(node.mode))) {
|
|
998
1223
|
const st = call2(() => bridgeOf(node).lstat(liveNodePath(linked.holder(node))));
|
|
999
|
-
node.live
|
|
1224
|
+
Object.assign(node.live, { stat: st, statAt: syncCallCount() });
|
|
1000
1225
|
node.mode = modeFromStat(st);
|
|
1001
1226
|
}
|
|
1002
1227
|
return node.live.stat;
|
|
@@ -1145,8 +1370,9 @@ function createNodeOps(h) {
|
|
|
1145
1370
|
flushNode(node);
|
|
1146
1371
|
metadataCall(() => bridgeOf(node).utimes(path, atime, mtime, now));
|
|
1147
1372
|
};
|
|
1373
|
+
const stamped = typeof Fs.doSetAttr !== "function";
|
|
1148
1374
|
const timesOf = (node, attr2) => {
|
|
1149
|
-
const mtime = toMs(attr2.mtime) ?? attr2.timestamp;
|
|
1375
|
+
const mtime = toMs(attr2.mtime) ?? (stamped ? attr2.timestamp : void 0);
|
|
1150
1376
|
const atime = toMs(attr2.atime);
|
|
1151
1377
|
if (mtime !== void 0 && attr2.atime !== null) return [atime ?? mtime, mtime];
|
|
1152
1378
|
if (atime === void 0 && mtime === void 0) return void 0;
|
|
@@ -1155,8 +1381,10 @@ function createNodeOps(h) {
|
|
|
1155
1381
|
};
|
|
1156
1382
|
return {
|
|
1157
1383
|
getattr(node) {
|
|
1158
|
-
const st = statOf(node);
|
|
1159
1384
|
const owned = bridgeOf(node).owners === true;
|
|
1385
|
+
if (owned && Fs.isLink(node.mode) && statOf(node).uid === void 0)
|
|
1386
|
+
node.live.stat = void 0;
|
|
1387
|
+
const st = statOf(node);
|
|
1160
1388
|
const s = node.live;
|
|
1161
1389
|
const size = Fs.isDir(node.mode) ? 4096 : s.ranged?.size() ?? (s.loaded ? s.len : st.size);
|
|
1162
1390
|
const mtime = new Date(st.mtimeMs ?? 0);
|
|
@@ -1683,6 +1911,7 @@ var init_live_vfs_fs = __esm({
|
|
|
1683
1911
|
init_types();
|
|
1684
1912
|
init_wasi_errno();
|
|
1685
1913
|
init_sync_fs_wire();
|
|
1914
|
+
init_sync_sab_bridge();
|
|
1686
1915
|
S_IFDIR = 16384;
|
|
1687
1916
|
S_IFREG = 32768;
|
|
1688
1917
|
S_IFLNK = 40960;
|
|
@@ -1746,220 +1975,6 @@ var init_emscripten_vfs_hook = __esm({
|
|
|
1746
1975
|
}
|
|
1747
1976
|
});
|
|
1748
1977
|
|
|
1749
|
-
// src/realm/sync-sab-bridge.ts
|
|
1750
|
-
function createSyncSabTransport(sab, port2, deps = {}) {
|
|
1751
|
-
const views = sabViews(sab);
|
|
1752
|
-
const { header, window } = views;
|
|
1753
|
-
const wait2 = deps.wait ?? ((a, i, v, t) => rawWait(a, i, v, t));
|
|
1754
|
-
const now = deps.now ?? (() => performance.now());
|
|
1755
|
-
let seq = 0;
|
|
1756
|
-
function awaitReady(id, deadline, label) {
|
|
1757
|
-
for (; ; ) {
|
|
1758
|
-
const published = Atomics.load(header, SAB_I_PUB);
|
|
1759
|
-
if (Atomics.load(header, SAB_I_STATE) === SAB_STATE_READY && Atomics.load(header, SAB_I_SEQ) === id) {
|
|
1760
|
-
return;
|
|
1761
|
-
}
|
|
1762
|
-
const remaining = deadline - now();
|
|
1763
|
-
if (remaining <= 0) throw syncError("ETIMEDOUT", label);
|
|
1764
|
-
wait2(header, SAB_I_PUB, published, remaining);
|
|
1765
|
-
}
|
|
1766
|
-
}
|
|
1767
|
-
return {
|
|
1768
|
-
call(req, timeoutMs, label, transfer = []) {
|
|
1769
|
-
if (deps.memory) publishMemory(sab, deps.memory());
|
|
1770
|
-
const id = ++seq;
|
|
1771
|
-
const deadline = now() + timeoutMs;
|
|
1772
|
-
let out = null;
|
|
1773
|
-
let status2 = 0;
|
|
1774
|
-
let offset = 0;
|
|
1775
|
-
Atomics.store(header, SAB_I_REQ, id);
|
|
1776
|
-
try {
|
|
1777
|
-
for (; ; ) {
|
|
1778
|
-
Atomics.store(header, SAB_I_STATE, SAB_STATE_PENDING);
|
|
1779
|
-
const msg = offset === 0 ? { type: SYNC_SAB_REQ_MSG, id, req } : { type: SYNC_SAB_NEXT_MSG, id, offset };
|
|
1780
|
-
try {
|
|
1781
|
-
if (offset === 0 && transfer.length > 0) port2.postMessage(msg, transfer);
|
|
1782
|
-
else port2.postMessage(msg);
|
|
1783
|
-
} catch {
|
|
1784
|
-
throw syncError("EIO", label);
|
|
1785
|
-
}
|
|
1786
|
-
awaitReady(id, deadline, label);
|
|
1787
|
-
const total = loadU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI);
|
|
1788
|
-
const chunk = Atomics.load(header, SAB_I_CHUNK);
|
|
1789
|
-
const at = loadU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI);
|
|
1790
|
-
if (at !== offset || chunk < 0 || total < 0 || offset + chunk > total) {
|
|
1791
|
-
throw syncError("EIO", label);
|
|
1792
|
-
}
|
|
1793
|
-
if (out === null) {
|
|
1794
|
-
status2 = Atomics.load(header, SAB_I_STATUS);
|
|
1795
|
-
out = new Uint8Array(total);
|
|
1796
|
-
}
|
|
1797
|
-
out.set(window.subarray(0, chunk), offset);
|
|
1798
|
-
offset += chunk;
|
|
1799
|
-
if (offset >= total) break;
|
|
1800
|
-
if (chunk === 0) throw syncError("EIO", label);
|
|
1801
|
-
}
|
|
1802
|
-
} finally {
|
|
1803
|
-
Atomics.store(header, SAB_I_REQ, 0);
|
|
1804
|
-
Atomics.store(header, SAB_I_STATE, SAB_STATE_IDLE);
|
|
1805
|
-
}
|
|
1806
|
-
return decodeSabResult(status2, out);
|
|
1807
|
-
}
|
|
1808
|
-
};
|
|
1809
|
-
}
|
|
1810
|
-
function errnoError(code2, path) {
|
|
1811
|
-
return syncError(code2, `sync-sab bridge, '${path}'`);
|
|
1812
|
-
}
|
|
1813
|
-
function createSyncFsSabBridge(transport, opts = {}) {
|
|
1814
|
-
const timeoutMs = opts.timeoutMs ?? SYNC_FS_REQUEST_TIMEOUT_MS;
|
|
1815
|
-
let identity = {};
|
|
1816
|
-
let last = null;
|
|
1817
|
-
function run(req, path, transfer) {
|
|
1818
|
-
last = null;
|
|
1819
|
-
const result = transport.call(req, timeoutMs, `sync-sab bridge, '${path}'`, transfer);
|
|
1820
|
-
if (!result.ok) throw errnoError(result.errno, path);
|
|
1821
|
-
return result;
|
|
1822
|
-
}
|
|
1823
|
-
function bytes(req, path) {
|
|
1824
|
-
const r = run(req, path);
|
|
1825
|
-
if (r.ok && r.kind === "bytes") return r.bytes;
|
|
1826
|
-
throw errnoError("EIO", path);
|
|
1827
|
-
}
|
|
1828
|
-
function json2(req, path) {
|
|
1829
|
-
const r = run(req, path);
|
|
1830
|
-
if (r.ok && r.kind === "json") return r.json;
|
|
1831
|
-
throw errnoError("EIO", path);
|
|
1832
|
-
}
|
|
1833
|
-
const changing = (req, path, transfer) => {
|
|
1834
|
-
const r = run({ ...req, ...identity }, path, transfer);
|
|
1835
|
-
if (r.ok && r.kind === "json") last = parseSyncFsStat(r.json);
|
|
1836
|
-
};
|
|
1837
|
-
const io = (id) => ({
|
|
1838
|
-
readFile: (path) => bytes({ op: "read", path, ...id }, path),
|
|
1839
|
-
writeFile: (path, data, open) => {
|
|
1840
|
-
changing({ op: "write", path, body: data, ...open ? { mode: 1 } : {}, ...id }, path);
|
|
1841
|
-
},
|
|
1842
|
-
pread: (path, offset, length, version) => bytes({ op: "pread", path, offset, length, ...version ? { version } : {}, ...id }, path),
|
|
1843
|
-
pwrite: (path, offset, body, transfer) => {
|
|
1844
|
-
const whole = body.byteOffset === 0 && body.byteLength === body.buffer.byteLength;
|
|
1845
|
-
const owned = transfer && whole && body.buffer instanceof ArrayBuffer;
|
|
1846
|
-
const transferred = owned ? [body.buffer] : [];
|
|
1847
|
-
changing({ op: "pwrite", path, offset, body, ...id }, path, transferred);
|
|
1848
|
-
},
|
|
1849
|
-
truncate: (path, length) => {
|
|
1850
|
-
changing({ op: "truncate", path, length, ...id }, path);
|
|
1851
|
-
}
|
|
1852
|
-
});
|
|
1853
|
-
return {
|
|
1854
|
-
...io({}),
|
|
1855
|
-
pinned: (handle) => io({ handle }),
|
|
1856
|
-
kept: (handle) => json2({ op: "kept", path: "/", handle }, "/") === true,
|
|
1857
|
-
keptStat: (handle) => {
|
|
1858
|
-
const s = parseSyncFsStat(json2({ op: "stat", path: "/", handle }, "/"));
|
|
1859
|
-
if (!s) throw errnoError("EIO", "/");
|
|
1860
|
-
return s;
|
|
1861
|
-
},
|
|
1862
|
-
stat: (path) => {
|
|
1863
|
-
const s = parseSyncFsStat(json2({ op: "stat", path }, path));
|
|
1864
|
-
if (!s) throw errnoError("EIO", path);
|
|
1865
|
-
return s;
|
|
1866
|
-
},
|
|
1867
|
-
lstat: (path) => {
|
|
1868
|
-
const s = parseSyncFsStat(json2({ op: "lstat", path }, path));
|
|
1869
|
-
if (!s) throw errnoError("EIO", path);
|
|
1870
|
-
return s;
|
|
1871
|
-
},
|
|
1872
|
-
readdir: (path) => {
|
|
1873
|
-
const list = json2({ op: "readdir", path }, path);
|
|
1874
|
-
if (!Array.isArray(list) || !list.every((s) => typeof s === "string")) {
|
|
1875
|
-
throw errnoError("EIO", path);
|
|
1876
|
-
}
|
|
1877
|
-
return list;
|
|
1878
|
-
},
|
|
1879
|
-
readdirStat: (path) => {
|
|
1880
|
-
const list = json2({ op: "readdir-stat", path }, path);
|
|
1881
|
-
if (!Array.isArray(list)) throw errnoError("EIO", path);
|
|
1882
|
-
return list.map((entry) => {
|
|
1883
|
-
if (!Array.isArray(entry) || typeof entry[0] !== "string") throw errnoError("EIO", path);
|
|
1884
|
-
if (entry[1] === null) return [entry[0], null];
|
|
1885
|
-
const stat = parseSyncFsStat(entry[1]);
|
|
1886
|
-
if (!stat) throw errnoError("EIO", path);
|
|
1887
|
-
return [entry[0], stat];
|
|
1888
|
-
});
|
|
1889
|
-
},
|
|
1890
|
-
exists: (path) => {
|
|
1891
|
-
const v = json2({ op: "exists", path }, path);
|
|
1892
|
-
if (typeof v !== "boolean") throw errnoError("EIO", path);
|
|
1893
|
-
return v;
|
|
1894
|
-
},
|
|
1895
|
-
mkdir: (path, mode) => {
|
|
1896
|
-
run({ op: "mkdir", path, exclusive: true, ...mode !== void 0 ? { mode } : {} }, path);
|
|
1897
|
-
},
|
|
1898
|
-
rm: (path) => {
|
|
1899
|
-
run({ op: "rm", path }, path);
|
|
1900
|
-
},
|
|
1901
|
-
rename: (from, to) => {
|
|
1902
|
-
run({ op: "rename", path: from, arg2: to }, from);
|
|
1903
|
-
},
|
|
1904
|
-
link: (from, to, follow2) => {
|
|
1905
|
-
run({ op: "link", path: from, arg2: to, ...follow2 ? { mode: 1 } : {} }, from);
|
|
1906
|
-
},
|
|
1907
|
-
unlink: (path) => {
|
|
1908
|
-
run({ op: "unlink", path }, path);
|
|
1909
|
-
},
|
|
1910
|
-
rmdir: (path) => {
|
|
1911
|
-
run({ op: "rmdir", path }, path);
|
|
1912
|
-
},
|
|
1913
|
-
symlink: (target, linkPath) => {
|
|
1914
|
-
run({ op: "symlink", path: linkPath, arg2: target }, linkPath);
|
|
1915
|
-
},
|
|
1916
|
-
readlink: (path) => {
|
|
1917
|
-
const target = json2({ op: "readlink", path }, path);
|
|
1918
|
-
if (typeof target !== "string") throw errnoError("EIO", path);
|
|
1919
|
-
return target;
|
|
1920
|
-
},
|
|
1921
|
-
chmod: (path, mode) => {
|
|
1922
|
-
changing({ op: "chmod", path, mode }, path);
|
|
1923
|
-
},
|
|
1924
|
-
utimes: (path, atimeMs, mtimeMs, now) => {
|
|
1925
|
-
changing({ op: "utimes", path, atimeMs, mtimeMs, ...now ? { now } : {} }, path);
|
|
1926
|
-
},
|
|
1927
|
-
identify: () => {
|
|
1928
|
-
identity = { identity: true };
|
|
1929
|
-
},
|
|
1930
|
-
identified: () => last,
|
|
1931
|
-
lutimes: (path, atimeMs, mtimeMs, now) => {
|
|
1932
|
-
run({ op: "lutimes", path, atimeMs, mtimeMs, ...now ? { now } : {} }, path);
|
|
1933
|
-
},
|
|
1934
|
-
create: (path, mode) => {
|
|
1935
|
-
run({ op: "create", path, ...mode !== void 0 ? { mode } : {} }, path);
|
|
1936
|
-
},
|
|
1937
|
-
chown: (path, uid, gid, follow2) => {
|
|
1938
|
-
const ids = { ...uid !== void 0 ? { uid } : {}, ...gid !== void 0 ? { gid } : {} };
|
|
1939
|
-
changing({ op: follow2 ? "chown" : "lchown", path, ...ids }, path);
|
|
1940
|
-
},
|
|
1941
|
-
...opts.owners ? { owners: true } : {},
|
|
1942
|
-
access: (path, mode, kind = "access", nofollow) => {
|
|
1943
|
-
run({ op: "access", path, mode, arg2: kind, ...nofollow ? { nofollow } : {} }, path);
|
|
1944
|
-
},
|
|
1945
|
-
hold: (path, held, open, handle, want = 0) => {
|
|
1946
|
-
const mode = (held ? 1 : 0) | (open ? 2 : 0);
|
|
1947
|
-
if (mode === 3) return json2({ op: "hold", path, mode: mode | want }, path);
|
|
1948
|
-
run({ op: "hold", path, mode, ...handle !== void 0 ? { handle } : {} }, path);
|
|
1949
|
-
return void 0;
|
|
1950
|
-
},
|
|
1951
|
-
statfs: (path = "/") => parseSyncFsUsage(json2({ op: "statfs", path }, path))
|
|
1952
|
-
};
|
|
1953
|
-
}
|
|
1954
|
-
var init_sync_sab_bridge = __esm({
|
|
1955
|
-
"src/realm/sync-sab-bridge.ts"() {
|
|
1956
|
-
"use strict";
|
|
1957
|
-
init_cpu_clock();
|
|
1958
|
-
init_sync_fs_wire();
|
|
1959
|
-
init_sync_sab_wire();
|
|
1960
|
-
}
|
|
1961
|
-
});
|
|
1962
|
-
|
|
1963
1978
|
// src/process/kernel-streams.ts
|
|
1964
1979
|
function isPtyPath(path) {
|
|
1965
1980
|
return PTY_PATH.test(path);
|