@ai-ecoverse/slicc-kernel 1.103.0 → 1.103.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/node.js CHANGED
@@ -1549,6 +1549,7 @@ var KernelSocket = class _KernelSocket {
1549
1549
  queue = [];
1550
1550
  backlog = 0;
1551
1551
  boundAt;
1552
+ named;
1552
1553
  changes = new Changes();
1553
1554
  room = new Changes();
1554
1555
  options = /* @__PURE__ */ new Map();
@@ -1614,10 +1615,13 @@ var KernelSocket = class _KernelSocket {
1614
1615
  for (const wait2 of waits) wait2.catch(() => void 0);
1615
1616
  return pipeCall(() => Promise.race(waits));
1616
1617
  }
1617
- bind(addr, kernel = false) {
1618
+ bindable(addr) {
1618
1619
  if (this.state !== "open" || this.local) throw new KernelError("EINVAL");
1619
1620
  if (addr.family !== this.domain) throw new KernelError("EAFNOSUPPORT");
1620
- this.local = this.net.bind(this, addr, kernel);
1621
+ }
1622
+ bind(addr, kernel = false, name2) {
1623
+ this.bindable(addr);
1624
+ this.local = this.net.bind(this, addr, kernel, name2);
1621
1625
  this.boundAt = this.local;
1622
1626
  }
1623
1627
  listen(backlog, cred) {
@@ -1655,7 +1659,7 @@ var KernelSocket = class _KernelSocket {
1655
1659
  waitRoom(signal) {
1656
1660
  return this.room.wait(signal);
1657
1661
  }
1658
- connect(addr, viaUplink = true, cred, stamp, waits = true) {
1662
+ connect(addr, viaUplink = true, cred, stamp, waits = true, name2) {
1659
1663
  if (this.state === "connected") throw new KernelError("EISCONN");
1660
1664
  if (this.state === "connecting") throw new KernelError("EALREADY");
1661
1665
  if (this.state !== "open") throw new KernelError("EINVAL");
@@ -1663,7 +1667,7 @@ var KernelSocket = class _KernelSocket {
1663
1667
  this.failed = void 0;
1664
1668
  const route = viaUplink && addr.family === "inet" ? this.net.uplinkFor(addr.host) : void 0;
1665
1669
  if (route) return this.dial(addr, route);
1666
- const target = this.net.target(addr);
1670
+ const target = this.net.target(addr, name2);
1667
1671
  if (!this.local) {
1668
1672
  if (addr.family === "inet") {
1669
1673
  this.local = this.net.bind(this, { family: "inet", host: "127.0.0.1", port: 0 });
@@ -1824,7 +1828,7 @@ var KernelSocket = class _KernelSocket {
1824
1828
  this.readShut = true;
1825
1829
  this.writeShut = true;
1826
1830
  }
1827
- if (this.boundAt) this.net.release(this.boundAt, this);
1831
+ if (this.boundAt) this.net.release(this.boundAt, this, this.named);
1828
1832
  this.boundAt = void 0;
1829
1833
  this.changes.wake();
1830
1834
  }
@@ -1841,7 +1845,8 @@ var KernelSocket = class _KernelSocket {
1841
1845
  function canonicalHost(host) {
1842
1846
  return host === "0.0.0.0" ? "127.0.0.1" : host;
1843
1847
  }
1844
- function keyOf(addr) {
1848
+ function keyOf(addr, name2) {
1849
+ if (name2) return `node:${name2.key}`;
1845
1850
  return addr.family === "inet" ? `inet:${addr.port}` : `unix:${addr.path}`;
1846
1851
  }
1847
1852
  var LOCAL_ONLY = new Routes();
@@ -1920,28 +1925,30 @@ var LoopbackNet = class {
1920
1925
  void socket.connect(addr, false, void 0, void 0, false);
1921
1926
  return socket;
1922
1927
  }
1923
- bind(socket, addr, kernel = false) {
1928
+ bind(socket, addr, kernel = false, name2) {
1924
1929
  if (addr.family === "unix") {
1925
1930
  if (addr.path === "") throw new KernelError("EINVAL");
1926
1931
  } else this.bindable(addr, kernel);
1927
1932
  const named = addr.family === "inet" && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;
1928
- const key = keyOf(named);
1929
- if (this.bound.has(key)) throw new KernelError("EADDRINUSE");
1933
+ const key = keyOf(named, name2);
1934
+ if (this.bound.has(key) && !name2) throw new KernelError("EADDRINUSE");
1930
1935
  this.bound.set(key, socket);
1936
+ socket.named = name2;
1931
1937
  return named;
1932
1938
  }
1933
- release(addr, socket) {
1934
- const key = keyOf(addr);
1939
+ release(addr, socket, name2) {
1940
+ const key = keyOf(addr, name2);
1935
1941
  if (this.bound.get(key) === socket) this.bound.delete(key);
1936
1942
  }
1937
- target(addr) {
1943
+ target(addr, name2) {
1938
1944
  if (addr.family === "inet" && !isLoopback(canonicalHost(addr.host))) {
1939
1945
  throw new KernelError("ENETUNREACH");
1940
1946
  }
1941
- const key = keyOf(addr);
1947
+ const key = keyOf(addr, name2);
1942
1948
  if (!this.bound.has(key)) this.activators.get(key)?.();
1943
1949
  const socket = this.bound.get(key);
1944
1950
  if (!socket?.listening) throw new KernelError("ECONNREFUSED");
1951
+ if (name2 && socket.named?.typed && !name2.typed) throw new KernelError("ECONNREFUSED");
1945
1952
  return socket;
1946
1953
  }
1947
1954
  ephemeral() {
@@ -4016,6 +4023,7 @@ function view(target, overrides) {
4016
4023
  var S_IFDIR = 16384;
4017
4024
  var S_IFREG = 32768;
4018
4025
  var S_IFLNK = 40960;
4026
+ var S_IFSOCK = 49152;
4019
4027
  var PERM_MASK = 4095;
4020
4028
  var S_ISGID3 = 1024;
4021
4029
  var READ_ATTEMPTS = 3;
@@ -4279,7 +4287,8 @@ var OpfsFs = class {
4279
4287
  return Object.keys(fields).length > 0 ? fields : void 0;
4280
4288
  }
4281
4289
  async stampNew(path, owner, directory) {
4282
- const fields = await this.newFields(path, owner, directory);
4290
+ const owned4 = await this.newFields(path, owner, directory);
4291
+ const fields = owner?.socket && !directory ? { ...owned4, socket: true } : owned4;
4283
4292
  if (fields) await this.meta.update(path, (entry) => ({ ...entry, path, ...fields }));
4284
4293
  }
4285
4294
  guarded = [];
@@ -4479,7 +4488,8 @@ var OpfsFs = class {
4479
4488
  }
4480
4489
  mode(path, directory, meta) {
4481
4490
  const fallback = directory || EXECUTABLE.test(path) ? 493 : 420;
4482
- return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);
4491
+ const type = directory ? S_IFDIR : meta?.socket ? S_IFSOCK : S_IFREG;
4492
+ return type | (meta?.mode ?? fallback);
4483
4493
  }
4484
4494
  id = crypto.randomUUID();
4485
4495
  dirTimes = /* @__PURE__ */ new Map();
@@ -4558,10 +4568,12 @@ var OpfsFs = class {
4558
4568
  const modified = file?.lastModified ?? 0;
4559
4569
  const kept = meta?.mtimeMs !== void 0 && meta.mtimeFor === modified ? meta.mtimeMs : modified;
4560
4570
  const mtime = touched ?? kept;
4571
+ const socket = !directory && meta?.socket === true;
4561
4572
  return {
4562
- isFile: !directory,
4573
+ isFile: !directory && !socket,
4563
4574
  isDirectory: directory,
4564
4575
  isSymbolicLink: false,
4576
+ ...socket ? { isSocket: true } : {},
4565
4577
  size: file?.size ?? 0,
4566
4578
  mode: this.mode(path, directory, meta),
4567
4579
  mtime: new Date(mtime),
@@ -9793,6 +9805,7 @@ function statJson(s) {
9793
9805
  isDirectory: s.isDirectory,
9794
9806
  isFile: s.isFile,
9795
9807
  isSymbolicLink: s.isSymbolicLink,
9808
+ ...s.isSocket ? { isSocket: true } : {},
9796
9809
  size: s.size,
9797
9810
  mode: s.mode,
9798
9811
  mtimeMs: s.mtime.getTime(),
@@ -11177,7 +11190,7 @@ var PATH_OPS = new Set(SYNC_FS_OPS);
11177
11190
  var EARLY_WHOLE_FILE = 64 * 1024;
11178
11191
 
11179
11192
  // src/version.ts
11180
- var KERNEL_VERSION = true ? "1.103.0" : "0.0.0-dev";
11193
+ var KERNEL_VERSION = true ? "1.103.1" : "0.0.0-dev";
11181
11194
  var OS_RELEASE = "6.0.0-slicc";
11182
11195
  function procVersion() {
11183
11196
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -14546,6 +14559,47 @@ async function semSyscall(req, proc) {
14546
14559
  }
14547
14560
  }
14548
14561
 
14562
+ // src/kernel/socket-nodes.ts
14563
+ function filePath(addr) {
14564
+ if (addr.family !== "unix" || addr.path === "" || addr.path.startsWith("\0")) return void 0;
14565
+ return normalizePath(addr.path);
14566
+ }
14567
+ function nameOf(st) {
14568
+ return { key: `${st.dev ?? 0}:${st.ino}`, typed: st.isSocket === true };
14569
+ }
14570
+ function codeOf3(err) {
14571
+ return err?.code;
14572
+ }
14573
+ function socketNames(deps) {
14574
+ const { fs } = deps;
14575
+ return {
14576
+ async make(path) {
14577
+ const g = deps.guard();
14578
+ if (g) await inParent(g, "bind", path);
14579
+ const owner = deps.owner();
14580
+ try {
14581
+ await deps.create(path, owner);
14582
+ } catch (err) {
14583
+ if (codeOf3(err) === "EEXIST") throw new KernelError("EADDRINUSE");
14584
+ throw err;
14585
+ }
14586
+ const remove = () => fs.rm(path, { file: true }).catch(() => void 0);
14587
+ try {
14588
+ if (!deps.owners && owner.mode !== void 0) await fs.chmod(path, owner.mode);
14589
+ return { ...nameOf(await fs.lstat(path)), remove };
14590
+ } catch (err) {
14591
+ await remove();
14592
+ throw err;
14593
+ }
14594
+ },
14595
+ async find(path) {
14596
+ const g = deps.guard();
14597
+ if (g) await need(g, "connect", path, W_OK, { directory: false });
14598
+ return nameOf(await fs.stat(path));
14599
+ }
14600
+ };
14601
+ }
14602
+
14549
14603
  // src/kernel/net/datagram-wire.ts
14550
14604
  function encodeReceived(got) {
14551
14605
  const host = new TextEncoder().encode(got.host);
@@ -14612,7 +14666,7 @@ async function socketSyscall(req, proc) {
14612
14666
  }
14613
14667
  }
14614
14668
  case "sock-bind":
14615
- anySocketAt(fds, req.fd).bind(req.addr);
14669
+ await bind(proc, req.fd, req.addr);
14616
14670
  return ok3();
14617
14671
  case "sock-listen":
14618
14672
  socketAt(fds, req.fd).listen(req.backlog, proc.cred?.());
@@ -14650,8 +14704,10 @@ async function connect(req, proc) {
14650
14704
  target.connectTo(req.addr);
14651
14705
  return ok3();
14652
14706
  }
14707
+ const path = filePath(req.addr);
14708
+ const name2 = path !== void 0 ? await proc.names?.find(path) : void 0;
14653
14709
  const stamp = proc.net.facadeAt(req.addr) && await proc.stamp?.();
14654
- const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0);
14710
+ const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0, true, name2);
14655
14711
  if (req.nonblock) {
14656
14712
  dialing?.catch(() => void 0);
14657
14713
  throw new KernelError("EINPROGRESS");
@@ -14659,6 +14715,22 @@ async function connect(req, proc) {
14659
14715
  if (dialing !== void 0) await interruptible2(dialing, proc.blocking());
14660
14716
  return ok3();
14661
14717
  }
14718
+ async function bind(proc, fd, addr) {
14719
+ const socket = anySocketAt(proc.fds, fd);
14720
+ const path = filePath(addr);
14721
+ if (!(socket instanceof KernelSocket) || path === void 0 || !proc.names) {
14722
+ socket.bind(addr);
14723
+ return;
14724
+ }
14725
+ socket.bindable(addr);
14726
+ const name2 = await proc.names.make(path);
14727
+ try {
14728
+ socket.bind({ family: "unix", path }, false, name2);
14729
+ } catch (err) {
14730
+ await name2.remove();
14731
+ throw err;
14732
+ }
14733
+ }
14662
14734
  async function datagram(req, proc) {
14663
14735
  const dgram = dgramAt(proc.fds, req.fd);
14664
14736
  if (req.op === "sock-sendto") {
@@ -15266,6 +15338,11 @@ function heldIo(fs, nodes, changed) {
15266
15338
  const held = st.isFile ? await node(path) : void 0;
15267
15339
  return held ? { ...st, size: await held.serial(() => held.size()) } : st;
15268
15340
  },
15341
+ async lstat(path) {
15342
+ const st = await fs.lstat(path);
15343
+ const held = st.isFile && !st.isSymbolicLink ? await node(path) : void 0;
15344
+ return held ? { ...st, size: await held.serial(() => held.size()) } : st;
15345
+ },
15269
15346
  async readFileBuffer(path) {
15270
15347
  const held = await node(path);
15271
15348
  if (!held) return fs.readFileBuffer(path);
@@ -16552,7 +16629,19 @@ var WasmProcess = class {
16552
16629
  blocking: () => this.blockingSignal(cancelled),
16553
16630
  resolve: (name2, family, blocking) => resolver.resolve(name2, family, blocking),
16554
16631
  cred: () => ({ pid: this.pid, uid: this.cred.euid, gid: this.cred.egid }),
16555
- stamp: () => this.connectorStamp()
16632
+ stamp: () => this.connectorStamp(),
16633
+ names: socketNames({
16634
+ fs: this.heldFs(),
16635
+ guard: () => this.guarded(),
16636
+ create: (path, owner) => this.nodes.createExclusive(path, owner),
16637
+ owner: () => ({
16638
+ uid: this.cred.euid,
16639
+ gid: this.cred.egid,
16640
+ mode: 511 & ~this.umask,
16641
+ socket: true
16642
+ }),
16643
+ owners: this.options.owners === true
16644
+ })
16556
16645
  });
16557
16646
  }
16558
16647
  tty(fd) {
@@ -18626,8 +18715,8 @@ var FSA_CAPABILITIES = {
18626
18715
  ranges: true,
18627
18716
  sessions: true
18628
18717
  };
18629
- var codeOf3 = (err) => err?.code;
18630
- var denied = (err) => codeOf3(err) === "EACCES" || err?.name === "NotAllowedError";
18718
+ var codeOf4 = (err) => err?.code;
18719
+ var denied = (err) => codeOf4(err) === "EACCES" || err?.name === "NotAllowedError";
18631
18720
  function attrOf(st) {
18632
18721
  return {
18633
18722
  kind: st.isDirectory ? "directory" : st.isSymbolicLink ? "symlink" : "file",
@@ -18649,7 +18738,7 @@ function kernelFsHandlers(fs) {
18649
18738
  try {
18650
18739
  return await fs.stat(path);
18651
18740
  } catch (err) {
18652
- if (codeOf3(err) === "ENOENT") return void 0;
18741
+ if (codeOf4(err) === "ENOENT") return void 0;
18653
18742
  throw err;
18654
18743
  }
18655
18744
  }
@@ -18842,7 +18931,7 @@ function parseFstab(text) {
18842
18931
  });
18843
18932
  return lines2;
18844
18933
  }
18845
- function codeOf4(err) {
18934
+ function codeOf5(err) {
18846
18935
  const code = err?.code;
18847
18936
  return typeof code === "string" ? code : "EIO";
18848
18937
  }
@@ -18880,18 +18969,18 @@ async function mountLine({ line, spec, invalid }, mount, signal, retries, discar
18880
18969
  break;
18881
18970
  } catch (err) {
18882
18971
  failed3 = err;
18883
- if (FINAL.has(codeOf4(err)) || attempt === retries.length) break;
18972
+ if (FINAL.has(codeOf5(err)) || attempt === retries.length) break;
18884
18973
  await wait(retries[attempt], signal);
18885
18974
  }
18886
18975
  }
18887
- const code = codeOf4(failed3);
18976
+ const code = codeOf5(failed3);
18888
18977
  return { line, target: spec.target, code, error: String(failed3?.message ?? code) };
18889
18978
  }
18890
18979
 
18891
18980
  // src/mount/hostfs.ts
18892
18981
  var HOSTFS_IO = 16 * 1024 * 1024;
18893
- var codeOf5 = (err) => err?.code;
18894
- var unreachable = (err) => codeOf5(err) === "ENOTCONN";
18982
+ var codeOf6 = (err) => err?.code;
18983
+ var unreachable = (err) => codeOf6(err) === "ENOTCONN";
18895
18984
  function rel(path) {
18896
18985
  return path.replace(/^\/+/, "");
18897
18986
  }
@@ -19068,7 +19157,7 @@ function hostfsHandlers(current, againMs = RESTORE_AGAIN_MS) {
19068
19157
  try {
19069
19158
  return { opened: await opening2(), restore: void 0 };
19070
19159
  } catch (err) {
19071
- if (!flags2.write || codeOf5(err) !== "EACCES") throw err;
19160
+ if (!flags2.write || codeOf6(err) !== "EACCES") throw err;
19072
19161
  const was = await client.call("stat", { path: rel(path) });
19073
19162
  const mode = was.mode ?? 0;
19074
19163
  if (mode & 128) throw err;
@@ -19493,7 +19582,7 @@ var PortTransport = class {
19493
19582
  }
19494
19583
  };
19495
19584
  var errorOf = (err) => ({
19496
- code: typeof codeOf5(err) === "string" ? codeOf5(err) : "EIO",
19585
+ code: typeof codeOf6(err) === "string" ? codeOf6(err) : "EIO",
19497
19586
  message: err?.message ?? String(err)
19498
19587
  });
19499
19588
  function serveHostfsPort(port, transport) {
@@ -22912,7 +23001,7 @@ import { connect as tls } from "node:tls";
22912
23001
  var PROBE_MS = 3e3;
22913
23002
  var PASSED = /* @__PURE__ */ new Set(["ECONNREFUSED", "EHOSTUNREACH", "ENETUNREACH", "ETIMEDOUT", "ECONNRESET"]);
22914
23003
  var NO_NAME = /* @__PURE__ */ new Set(["ENOTFOUND", "EAI_AGAIN", "EAI_NONAME", "EAI_FAIL", "ENODATA"]);
22915
- function codeOf6(e) {
23004
+ function codeOf7(e) {
22916
23005
  const code = e?.code;
22917
23006
  return typeof code === "string" ? code : void 0;
22918
23007
  }
@@ -22941,7 +23030,7 @@ function probe(secure, host, port, ms, signal) {
22941
23030
  signal?.addEventListener("abort", stop, { once: true });
22942
23031
  socket.once(secure ? "secureConnect" : "connect", () => done4("EPROTO"));
22943
23032
  socket.once("error", (e) => {
22944
- const code = codeOf6(e) ?? "";
23033
+ const code = codeOf7(e) ?? "";
22945
23034
  done4(PASSED.has(code) ? code : "EPROTO");
22946
23035
  });
22947
23036
  });
@@ -22956,7 +23045,7 @@ async function diagnose(url, ms = PROBE_MS, signal) {
22956
23045
  await abortable(lookup3(host), signal);
22957
23046
  } catch (e) {
22958
23047
  if (signal?.aborted) throw signal.reason;
22959
- return NO_NAME.has(codeOf6(e) ?? "") ? "EAI_NONAME" : void 0;
23048
+ return NO_NAME.has(codeOf7(e) ?? "") ? "EAI_NONAME" : void 0;
22960
23049
  }
22961
23050
  const code = await probe(secure, host, port, ms, signal);
22962
23051
  signal?.throwIfAborted();
@@ -22975,7 +23064,7 @@ function diagnosing(transport, check = byDefault) {
22975
23064
  try {
22976
23065
  return await open(request);
22977
23066
  } catch (e) {
22978
- if (request.signal.aborted || !(e instanceof Error) || codeOf6(e)) throw e;
23067
+ if (request.signal.aborted || !(e instanceof Error) || codeOf7(e)) throw e;
22979
23068
  const code = await abortable(
22980
23069
  check(request.url, request.signal).catch(() => void 0),
22981
23070
  request.signal