@ai-ecoverse/slicc-kernel 1.102.6 → 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.
Files changed (185) hide show
  1. package/README.md +3 -3
  2. package/dist/index.js.map +2 -2
  3. package/dist/kernel-worker.js +118 -29
  4. package/dist/kernel-worker.js.map +4 -4
  5. package/dist/meta.js.map +2 -2
  6. package/dist/node-process-worker.js +29 -44
  7. package/dist/node-process-worker.js.map +3 -3
  8. package/dist/node.js +123 -34
  9. package/dist/node.js.map +4 -4
  10. package/dist/process-worker.js +44 -59
  11. package/dist/process-worker.js.map +3 -3
  12. package/dist/types/body-idle.d.ts +3 -0
  13. package/dist/types/bytes.d.ts +1 -0
  14. package/dist/types/cdp/facade.d.ts +27 -0
  15. package/dist/types/cdp/hosts.d.ts +14 -0
  16. package/dist/types/cdp/port.d.ts +24 -0
  17. package/dist/types/cdp/types.d.ts +12 -0
  18. package/dist/types/cdp/websocket.d.ts +61 -0
  19. package/dist/types/client/attach.d.ts +132 -0
  20. package/dist/types/client/dial-stream.d.ts +23 -0
  21. package/dist/types/client/loopback-fetch.d.ts +5 -0
  22. package/dist/types/client/protocol.d.ts +153 -0
  23. package/dist/types/client/serve-client.d.ts +18 -0
  24. package/dist/types/clipboard-relay.d.ts +25 -0
  25. package/dist/types/commands.d.ts +38 -0
  26. package/dist/types/cron/clock.d.ts +13 -0
  27. package/dist/types/driver.d.ts +3 -0
  28. package/dist/types/facade/hosts.d.ts +12 -0
  29. package/dist/types/facade/port.d.ts +16 -0
  30. package/dist/types/facade/types.d.ts +23 -0
  31. package/dist/types/fs/access.d.ts +29 -0
  32. package/dist/types/fs/attest.d.ts +41 -0
  33. package/dist/types/fs/changes.d.ts +19 -0
  34. package/dist/types/fs/commands.d.ts +4 -0
  35. package/dist/types/fs/dac.d.ts +64 -0
  36. package/dist/types/fs/dev-removal.d.ts +9 -0
  37. package/dist/types/fs/fresh-modules.d.ts +9 -0
  38. package/dist/types/fs/integrity.d.ts +53 -0
  39. package/dist/types/fs/meta.d.ts +86 -0
  40. package/dist/types/fs/opfs.d.ts +141 -0
  41. package/dist/types/fs/owners.d.ts +17 -0
  42. package/dist/types/fs/pages.d.ts +41 -0
  43. package/dist/types/fs/path-map.d.ts +16 -0
  44. package/dist/types/fs/physical-path.d.ts +14 -0
  45. package/dist/types/fs/protect.d.ts +27 -0
  46. package/dist/types/fs/ranged.d.ts +73 -0
  47. package/dist/types/fs/remote.d.ts +45 -0
  48. package/dist/types/fs/types.d.ts +117 -0
  49. package/dist/types/fs/unlinked.d.ts +75 -0
  50. package/dist/types/fs/view.d.ts +1 -0
  51. package/dist/types/fs/walk.d.ts +12 -0
  52. package/dist/types/fs/watch.d.ts +23 -0
  53. package/dist/types/index.d.ts +159 -0
  54. package/dist/types/integrity-relay.d.ts +18 -0
  55. package/dist/types/kernel/children.d.ts +90 -0
  56. package/dist/types/kernel/clipboard.d.ts +49 -0
  57. package/dist/types/kernel/cpu-clock.d.ts +56 -0
  58. package/dist/types/kernel/cred.d.ts +17 -0
  59. package/dist/types/kernel/dgram.d.ts +56 -0
  60. package/dist/types/kernel/dial.d.ts +20 -0
  61. package/dist/types/kernel/epoll.d.ts +67 -0
  62. package/dist/types/kernel/eventfd.d.ts +19 -0
  63. package/dist/types/kernel/exec-ticket.d.ts +25 -0
  64. package/dist/types/kernel/fd-table.d.ts +107 -0
  65. package/dist/types/kernel/host-ops.d.ts +98 -0
  66. package/dist/types/kernel/host.d.ts +116 -0
  67. package/dist/types/kernel/jobs.d.ts +50 -0
  68. package/dist/types/kernel/locks.d.ts +40 -0
  69. package/dist/types/kernel/net/datagram-wire.d.ts +8 -0
  70. package/dist/types/kernel/net/http-syscalls.d.ts +58 -0
  71. package/dist/types/kernel/net/http1.d.ts +48 -0
  72. package/dist/types/kernel/net/loopback-names.d.ts +14 -0
  73. package/dist/types/kernel/net/loopback-transport.d.ts +13 -0
  74. package/dist/types/kernel/net/network.d.ts +29 -0
  75. package/dist/types/kernel/net/proxy-service.d.ts +70 -0
  76. package/dist/types/kernel/net/realm-ca.d.ts +28 -0
  77. package/dist/types/kernel/net/redirect-hops.d.ts +5 -0
  78. package/dist/types/kernel/net/remote-transport.d.ts +98 -0
  79. package/dist/types/kernel/net/resolver.d.ts +29 -0
  80. package/dist/types/kernel/net/routes.d.ts +15 -0
  81. package/dist/types/kernel/net/tls-engine.d.ts +46 -0
  82. package/dist/types/kernel/net/tls-tunnel.d.ts +35 -0
  83. package/dist/types/kernel/net/transport.d.ts +64 -0
  84. package/dist/types/kernel/net/uplink-socket.d.ts +11 -0
  85. package/dist/types/kernel/net/uplink.d.ts +163 -0
  86. package/dist/types/kernel/net/ws-queue.d.ts +21 -0
  87. package/dist/types/kernel/net/ws-syscalls.d.ts +45 -0
  88. package/dist/types/kernel/net/x509.d.ts +34 -0
  89. package/dist/types/kernel/pipe.d.ts +29 -0
  90. package/dist/types/kernel/proc-info.d.ts +44 -0
  91. package/dist/types/kernel/process.d.ts +525 -0
  92. package/dist/types/kernel/protocol.d.ts +126 -0
  93. package/dist/types/kernel/pty.d.ts +84 -0
  94. package/dist/types/kernel/run-child.d.ts +39 -0
  95. package/dist/types/kernel/scrub-file.d.ts +13 -0
  96. package/dist/types/kernel/sealed.d.ts +74 -0
  97. package/dist/types/kernel/select.d.ts +7 -0
  98. package/dist/types/kernel/sem.d.ts +72 -0
  99. package/dist/types/kernel/settling.d.ts +16 -0
  100. package/dist/types/kernel/signals.d.ts +44 -0
  101. package/dist/types/kernel/socket-nodes.d.ts +20 -0
  102. package/dist/types/kernel/socket-syscalls.d.ts +76 -0
  103. package/dist/types/kernel/socket.d.ts +131 -0
  104. package/dist/types/kernel/timer.d.ts +4 -0
  105. package/dist/types/kernel/tty.d.ts +53 -0
  106. package/dist/types/kernel/vfs-file.d.ts +149 -0
  107. package/dist/types/launcher.d.ts +359 -0
  108. package/dist/types/local-proxy-transport.d.ts +39 -0
  109. package/dist/types/meta.d.ts +11 -0
  110. package/dist/types/mount/chunked.d.ts +9 -0
  111. package/dist/types/mount/connection.d.ts +35 -0
  112. package/dist/types/mount/driver.d.ts +50 -0
  113. package/dist/types/mount/fsa.d.ts +26 -0
  114. package/dist/types/mount/fstab.d.ts +17 -0
  115. package/dist/types/mount/host.d.ts +24 -0
  116. package/dist/types/mount/hostfs.d.ts +129 -0
  117. package/dist/types/mount/media.d.ts +8 -0
  118. package/dist/types/mount/medium.d.ts +12 -0
  119. package/dist/types/mount/mount-fs.d.ts +136 -0
  120. package/dist/types/mount/protocol.d.ts +140 -0
  121. package/dist/types/mount/syscall.d.ts +27 -0
  122. package/dist/types/mount/tmpfs.d.ts +2 -0
  123. package/dist/types/node/loopback.d.ts +11 -0
  124. package/dist/types/node/memory-root.d.ts +2 -0
  125. package/dist/types/node/ws-diagnose.d.ts +4 -0
  126. package/dist/types/node.d.ts +85 -0
  127. package/dist/types/process/fd-metadata.d.ts +4 -0
  128. package/dist/types/process/js/async-sab.d.ts +15 -0
  129. package/dist/types/process/js/js-children.d.ts +63 -0
  130. package/dist/types/process/js/js-context.d.ts +133 -0
  131. package/dist/types/process/js/js-dev.d.ts +50 -0
  132. package/dist/types/process/js/js-exit.d.ts +15 -0
  133. package/dist/types/process/js/js-fetch.d.ts +2 -0
  134. package/dist/types/process/js/js-io.d.ts +81 -0
  135. package/dist/types/process/js/js-kernel.d.ts +61 -0
  136. package/dist/types/process/js/js-net.d.ts +42 -0
  137. package/dist/types/process/js/js-proc.d.ts +31 -0
  138. package/dist/types/process/js/js-run.d.ts +35 -0
  139. package/dist/types/process/js/js-sync.d.ts +86 -0
  140. package/dist/types/process/js/js-tty.d.ts +30 -0
  141. package/dist/types/process/js/js-websocket.d.ts +21 -0
  142. package/dist/types/process/kernel-streams.d.ts +196 -0
  143. package/dist/types/process/process-fds.d.ts +95 -0
  144. package/dist/types/process/process-locks.d.ts +29 -0
  145. package/dist/types/process/process-pty.d.ts +20 -0
  146. package/dist/types/process/process-signals.d.ts +33 -0
  147. package/dist/types/process/procfs.d.ts +41 -0
  148. package/dist/types/process/wasi/dylink.d.ts +9 -0
  149. package/dist/types/process/wasi/slicc-lock.d.ts +26 -0
  150. package/dist/types/process/wasi/slicc-sem.d.ts +3 -0
  151. package/dist/types/process/wasi/wasi-abi.d.ts +156 -0
  152. package/dist/types/process/wasi/wasi-fds.d.ts +130 -0
  153. package/dist/types/process/wasi/wasi-files.d.ts +99 -0
  154. package/dist/types/process/wasi/wasi-host.d.ts +104 -0
  155. package/dist/types/process/wasi/wasi-memory.d.ts +16 -0
  156. package/dist/types/process/wasi/wasi-module.d.ts +13 -0
  157. package/dist/types/process/wasi/wasi-poll.d.ts +13 -0
  158. package/dist/types/process/wasi/wasi-procfs.d.ts +36 -0
  159. package/dist/types/process/wasi/wasi-sigmask.d.ts +19 -0
  160. package/dist/types/process/wasi/wasi-signals.d.ts +43 -0
  161. package/dist/types/process/wasi/wasi-termios.d.ts +10 -0
  162. package/dist/types/process/wasi/wasix-fork.d.ts +63 -0
  163. package/dist/types/process/wasi/wasix-linker.d.ts +108 -0
  164. package/dist/types/process/wasi/wasix-sockets.d.ts +9 -0
  165. package/dist/types/process/wasi/wasix-trampoline.d.ts +18 -0
  166. package/dist/types/process/wasi/wasm-functypes.d.ts +25 -0
  167. package/dist/types/process/wasi-errno.d.ts +1 -0
  168. package/dist/types/realm/emscripten-vfs-hook.d.ts +19 -0
  169. package/dist/types/realm/live-vfs-fs.d.ts +186 -0
  170. package/dist/types/realm/sync-fs-dispatch.d.ts +27 -0
  171. package/dist/types/realm/sync-fs-token-registry.d.ts +36 -0
  172. package/dist/types/realm/sync-fs-wire.d.ts +119 -0
  173. package/dist/types/realm/sync-sab-bridge.d.ts +21 -0
  174. package/dist/types/realm/sync-sab-responder.d.ts +16 -0
  175. package/dist/types/realm/sync-sab-wire.d.ts +64 -0
  176. package/dist/types/sealed-relay.d.ts +26 -0
  177. package/dist/types/serve.d.ts +190 -0
  178. package/dist/types/sudo-command.d.ts +4 -0
  179. package/dist/types/sudo.d.ts +105 -0
  180. package/dist/types/testing.d.ts +46 -0
  181. package/dist/types/transport.d.ts +25 -0
  182. package/dist/types/users.d.ts +86 -0
  183. package/dist/types/version.d.ts +3 -0
  184. package/dist/types/websocket-transport.d.ts +12 -0
  185. package/package.json +24 -8
@@ -978,6 +978,7 @@ function view(target, overrides) {
978
978
  var S_IFDIR = 16384;
979
979
  var S_IFREG = 32768;
980
980
  var S_IFLNK = 40960;
981
+ var S_IFSOCK = 49152;
981
982
  var PERM_MASK = 4095;
982
983
  var S_ISGID2 = 1024;
983
984
  var READ_ATTEMPTS = 3;
@@ -1245,7 +1246,8 @@ var OpfsFs = class {
1245
1246
  return Object.keys(fields).length > 0 ? fields : void 0;
1246
1247
  }
1247
1248
  async stampNew(path, owner, directory) {
1248
- const fields = await this.newFields(path, owner, directory);
1249
+ const owned4 = await this.newFields(path, owner, directory);
1250
+ const fields = owner?.socket && !directory ? { ...owned4, socket: true } : owned4;
1249
1251
  if (fields) await this.meta.update(path, (entry) => ({ ...entry, path, ...fields }));
1250
1252
  }
1251
1253
  guarded = [];
@@ -1445,7 +1447,8 @@ var OpfsFs = class {
1445
1447
  }
1446
1448
  mode(path, directory, meta) {
1447
1449
  const fallback = directory || EXECUTABLE.test(path) ? 493 : 420;
1448
- return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);
1450
+ const type = directory ? S_IFDIR : meta?.socket ? S_IFSOCK : S_IFREG;
1451
+ return type | (meta?.mode ?? fallback);
1449
1452
  }
1450
1453
  id = crypto.randomUUID();
1451
1454
  dirTimes = /* @__PURE__ */ new Map();
@@ -1524,10 +1527,12 @@ var OpfsFs = class {
1524
1527
  const modified = file?.lastModified ?? 0;
1525
1528
  const kept = meta?.mtimeMs !== void 0 && meta.mtimeFor === modified ? meta.mtimeMs : modified;
1526
1529
  const mtime = touched ?? kept;
1530
+ const socket = !directory && meta?.socket === true;
1527
1531
  return {
1528
- isFile: !directory,
1532
+ isFile: !directory && !socket,
1529
1533
  isDirectory: directory,
1530
1534
  isSymbolicLink: false,
1535
+ ...socket ? { isSocket: true } : {},
1531
1536
  size: file?.size ?? 0,
1532
1537
  mode: this.mode(path, directory, meta),
1533
1538
  mtime: new Date(mtime),
@@ -3563,6 +3568,7 @@ var KernelSocket = class _KernelSocket {
3563
3568
  queue = [];
3564
3569
  backlog = 0;
3565
3570
  boundAt;
3571
+ named;
3566
3572
  changes = new Changes();
3567
3573
  room = new Changes();
3568
3574
  options = /* @__PURE__ */ new Map();
@@ -3628,10 +3634,13 @@ var KernelSocket = class _KernelSocket {
3628
3634
  for (const wait2 of waits) wait2.catch(() => void 0);
3629
3635
  return pipeCall(() => Promise.race(waits));
3630
3636
  }
3631
- bind(addr, kernel = false) {
3637
+ bindable(addr) {
3632
3638
  if (this.state !== "open" || this.local) throw new KernelError("EINVAL");
3633
3639
  if (addr.family !== this.domain) throw new KernelError("EAFNOSUPPORT");
3634
- this.local = this.net.bind(this, addr, kernel);
3640
+ }
3641
+ bind(addr, kernel = false, name2) {
3642
+ this.bindable(addr);
3643
+ this.local = this.net.bind(this, addr, kernel, name2);
3635
3644
  this.boundAt = this.local;
3636
3645
  }
3637
3646
  listen(backlog, cred) {
@@ -3669,7 +3678,7 @@ var KernelSocket = class _KernelSocket {
3669
3678
  waitRoom(signal) {
3670
3679
  return this.room.wait(signal);
3671
3680
  }
3672
- connect(addr, viaUplink = true, cred, stamp, waits = true) {
3681
+ connect(addr, viaUplink = true, cred, stamp, waits = true, name2) {
3673
3682
  if (this.state === "connected") throw new KernelError("EISCONN");
3674
3683
  if (this.state === "connecting") throw new KernelError("EALREADY");
3675
3684
  if (this.state !== "open") throw new KernelError("EINVAL");
@@ -3677,7 +3686,7 @@ var KernelSocket = class _KernelSocket {
3677
3686
  this.failed = void 0;
3678
3687
  const route = viaUplink && addr.family === "inet" ? this.net.uplinkFor(addr.host) : void 0;
3679
3688
  if (route) return this.dial(addr, route);
3680
- const target = this.net.target(addr);
3689
+ const target = this.net.target(addr, name2);
3681
3690
  if (!this.local) {
3682
3691
  if (addr.family === "inet") {
3683
3692
  this.local = this.net.bind(this, { family: "inet", host: "127.0.0.1", port: 0 });
@@ -3838,7 +3847,7 @@ var KernelSocket = class _KernelSocket {
3838
3847
  this.readShut = true;
3839
3848
  this.writeShut = true;
3840
3849
  }
3841
- if (this.boundAt) this.net.release(this.boundAt, this);
3850
+ if (this.boundAt) this.net.release(this.boundAt, this, this.named);
3842
3851
  this.boundAt = void 0;
3843
3852
  this.changes.wake();
3844
3853
  }
@@ -3855,7 +3864,8 @@ var KernelSocket = class _KernelSocket {
3855
3864
  function canonicalHost(host) {
3856
3865
  return host === "0.0.0.0" ? "127.0.0.1" : host;
3857
3866
  }
3858
- function keyOf(addr) {
3867
+ function keyOf(addr, name2) {
3868
+ if (name2) return `node:${name2.key}`;
3859
3869
  return addr.family === "inet" ? `inet:${addr.port}` : `unix:${addr.path}`;
3860
3870
  }
3861
3871
  var LOCAL_ONLY = new Routes();
@@ -3934,28 +3944,30 @@ var LoopbackNet = class {
3934
3944
  void socket.connect(addr, false, void 0, void 0, false);
3935
3945
  return socket;
3936
3946
  }
3937
- bind(socket, addr, kernel = false) {
3947
+ bind(socket, addr, kernel = false, name2) {
3938
3948
  if (addr.family === "unix") {
3939
3949
  if (addr.path === "") throw new KernelError("EINVAL");
3940
3950
  } else this.bindable(addr, kernel);
3941
3951
  const named = addr.family === "inet" && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;
3942
- const key = keyOf(named);
3943
- if (this.bound.has(key)) throw new KernelError("EADDRINUSE");
3952
+ const key = keyOf(named, name2);
3953
+ if (this.bound.has(key) && !name2) throw new KernelError("EADDRINUSE");
3944
3954
  this.bound.set(key, socket);
3955
+ socket.named = name2;
3945
3956
  return named;
3946
3957
  }
3947
- release(addr, socket) {
3948
- const key = keyOf(addr);
3958
+ release(addr, socket, name2) {
3959
+ const key = keyOf(addr, name2);
3949
3960
  if (this.bound.get(key) === socket) this.bound.delete(key);
3950
3961
  }
3951
- target(addr) {
3962
+ target(addr, name2) {
3952
3963
  if (addr.family === "inet" && !isLoopback(canonicalHost(addr.host))) {
3953
3964
  throw new KernelError("ENETUNREACH");
3954
3965
  }
3955
- const key = keyOf(addr);
3966
+ const key = keyOf(addr, name2);
3956
3967
  if (!this.bound.has(key)) this.activators.get(key)?.();
3957
3968
  const socket = this.bound.get(key);
3958
3969
  if (!socket?.listening) throw new KernelError("ECONNREFUSED");
3970
+ if (name2 && socket.named?.typed && !name2.typed) throw new KernelError("ECONNREFUSED");
3959
3971
  return socket;
3960
3972
  }
3961
3973
  ephemeral() {
@@ -10814,6 +10826,7 @@ function statJson(s) {
10814
10826
  isDirectory: s.isDirectory,
10815
10827
  isFile: s.isFile,
10816
10828
  isSymbolicLink: s.isSymbolicLink,
10829
+ ...s.isSocket ? { isSocket: true } : {},
10817
10830
  size: s.size,
10818
10831
  mode: s.mode,
10819
10832
  mtimeMs: s.mtime.getTime(),
@@ -12184,7 +12197,7 @@ var PATH_OPS = new Set(SYNC_FS_OPS);
12184
12197
  var EARLY_WHOLE_FILE = 64 * 1024;
12185
12198
 
12186
12199
  // src/version.ts
12187
- var KERNEL_VERSION = true ? "1.102.6" : "0.0.0-dev";
12200
+ var KERNEL_VERSION = true ? "1.103.1" : "0.0.0-dev";
12188
12201
  var OS_RELEASE = "6.0.0-slicc";
12189
12202
  function procVersion() {
12190
12203
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -14889,6 +14902,47 @@ async function semSyscall(req, proc) {
14889
14902
  }
14890
14903
  }
14891
14904
 
14905
+ // src/kernel/socket-nodes.ts
14906
+ function filePath(addr) {
14907
+ if (addr.family !== "unix" || addr.path === "" || addr.path.startsWith("\0")) return void 0;
14908
+ return normalizePath(addr.path);
14909
+ }
14910
+ function nameOf(st) {
14911
+ return { key: `${st.dev ?? 0}:${st.ino}`, typed: st.isSocket === true };
14912
+ }
14913
+ function codeOf3(err) {
14914
+ return err?.code;
14915
+ }
14916
+ function socketNames(deps) {
14917
+ const { fs } = deps;
14918
+ return {
14919
+ async make(path) {
14920
+ const g = deps.guard();
14921
+ if (g) await inParent(g, "bind", path);
14922
+ const owner = deps.owner();
14923
+ try {
14924
+ await deps.create(path, owner);
14925
+ } catch (err) {
14926
+ if (codeOf3(err) === "EEXIST") throw new KernelError("EADDRINUSE");
14927
+ throw err;
14928
+ }
14929
+ const remove = () => fs.rm(path, { file: true }).catch(() => void 0);
14930
+ try {
14931
+ if (!deps.owners && owner.mode !== void 0) await fs.chmod(path, owner.mode);
14932
+ return { ...nameOf(await fs.lstat(path)), remove };
14933
+ } catch (err) {
14934
+ await remove();
14935
+ throw err;
14936
+ }
14937
+ },
14938
+ async find(path) {
14939
+ const g = deps.guard();
14940
+ if (g) await need(g, "connect", path, W_OK, { directory: false });
14941
+ return nameOf(await fs.stat(path));
14942
+ }
14943
+ };
14944
+ }
14945
+
14892
14946
  // src/kernel/net/datagram-wire.ts
14893
14947
  function encodeReceived(got) {
14894
14948
  const host = new TextEncoder().encode(got.host);
@@ -14955,7 +15009,7 @@ async function socketSyscall(req, proc) {
14955
15009
  }
14956
15010
  }
14957
15011
  case "sock-bind":
14958
- anySocketAt(fds, req.fd).bind(req.addr);
15012
+ await bind(proc, req.fd, req.addr);
14959
15013
  return ok3();
14960
15014
  case "sock-listen":
14961
15015
  socketAt(fds, req.fd).listen(req.backlog, proc.cred?.());
@@ -14993,8 +15047,10 @@ async function connect(req, proc) {
14993
15047
  target.connectTo(req.addr);
14994
15048
  return ok3();
14995
15049
  }
15050
+ const path = filePath(req.addr);
15051
+ const name2 = path !== void 0 ? await proc.names?.find(path) : void 0;
14996
15052
  const stamp = proc.net.facadeAt(req.addr) && await proc.stamp?.();
14997
- const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0);
15053
+ const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0, true, name2);
14998
15054
  if (req.nonblock) {
14999
15055
  dialing?.catch(() => void 0);
15000
15056
  throw new KernelError("EINPROGRESS");
@@ -15002,6 +15058,22 @@ async function connect(req, proc) {
15002
15058
  if (dialing !== void 0) await interruptible2(dialing, proc.blocking());
15003
15059
  return ok3();
15004
15060
  }
15061
+ async function bind(proc, fd, addr) {
15062
+ const socket = anySocketAt(proc.fds, fd);
15063
+ const path = filePath(addr);
15064
+ if (!(socket instanceof KernelSocket) || path === void 0 || !proc.names) {
15065
+ socket.bind(addr);
15066
+ return;
15067
+ }
15068
+ socket.bindable(addr);
15069
+ const name2 = await proc.names.make(path);
15070
+ try {
15071
+ socket.bind({ family: "unix", path }, false, name2);
15072
+ } catch (err) {
15073
+ await name2.remove();
15074
+ throw err;
15075
+ }
15076
+ }
15005
15077
  async function datagram(req, proc) {
15006
15078
  const dgram = dgramAt(proc.fds, req.fd);
15007
15079
  if (req.op === "sock-sendto") {
@@ -15609,6 +15681,11 @@ function heldIo(fs, nodes, changed) {
15609
15681
  const held = st.isFile ? await node(path) : void 0;
15610
15682
  return held ? { ...st, size: await held.serial(() => held.size()) } : st;
15611
15683
  },
15684
+ async lstat(path) {
15685
+ const st = await fs.lstat(path);
15686
+ const held = st.isFile && !st.isSymbolicLink ? await node(path) : void 0;
15687
+ return held ? { ...st, size: await held.serial(() => held.size()) } : st;
15688
+ },
15612
15689
  async readFileBuffer(path) {
15613
15690
  const held = await node(path);
15614
15691
  if (!held) return fs.readFileBuffer(path);
@@ -16895,7 +16972,19 @@ var WasmProcess = class {
16895
16972
  blocking: () => this.blockingSignal(cancelled),
16896
16973
  resolve: (name2, family, blocking) => resolver.resolve(name2, family, blocking),
16897
16974
  cred: () => ({ pid: this.pid, uid: this.cred.euid, gid: this.cred.egid }),
16898
- stamp: () => this.connectorStamp()
16975
+ stamp: () => this.connectorStamp(),
16976
+ names: socketNames({
16977
+ fs: this.heldFs(),
16978
+ guard: () => this.guarded(),
16979
+ create: (path, owner) => this.nodes.createExclusive(path, owner),
16980
+ owner: () => ({
16981
+ uid: this.cred.euid,
16982
+ gid: this.cred.egid,
16983
+ mode: 511 & ~this.umask,
16984
+ socket: true
16985
+ }),
16986
+ owners: this.options.owners === true
16987
+ })
16899
16988
  });
16900
16989
  }
16901
16990
  tty(fd) {
@@ -18969,8 +19058,8 @@ var FSA_CAPABILITIES = {
18969
19058
  ranges: true,
18970
19059
  sessions: true
18971
19060
  };
18972
- var codeOf3 = (err) => err?.code;
18973
- var denied = (err) => codeOf3(err) === "EACCES" || err?.name === "NotAllowedError";
19061
+ var codeOf4 = (err) => err?.code;
19062
+ var denied = (err) => codeOf4(err) === "EACCES" || err?.name === "NotAllowedError";
18974
19063
  function attrOf(st) {
18975
19064
  return {
18976
19065
  kind: st.isDirectory ? "directory" : st.isSymbolicLink ? "symlink" : "file",
@@ -18992,7 +19081,7 @@ function kernelFsHandlers(fs) {
18992
19081
  try {
18993
19082
  return await fs.stat(path);
18994
19083
  } catch (err) {
18995
- if (codeOf3(err) === "ENOENT") return void 0;
19084
+ if (codeOf4(err) === "ENOENT") return void 0;
18996
19085
  throw err;
18997
19086
  }
18998
19087
  }
@@ -19185,7 +19274,7 @@ function parseFstab(text) {
19185
19274
  });
19186
19275
  return lines2;
19187
19276
  }
19188
- function codeOf4(err) {
19277
+ function codeOf5(err) {
19189
19278
  const code = err?.code;
19190
19279
  return typeof code === "string" ? code : "EIO";
19191
19280
  }
@@ -19223,18 +19312,18 @@ async function mountLine({ line, spec, invalid }, mount, signal, retries, discar
19223
19312
  break;
19224
19313
  } catch (err) {
19225
19314
  failed3 = err;
19226
- if (FINAL.has(codeOf4(err)) || attempt === retries.length) break;
19315
+ if (FINAL.has(codeOf5(err)) || attempt === retries.length) break;
19227
19316
  await wait(retries[attempt], signal);
19228
19317
  }
19229
19318
  }
19230
- const code = codeOf4(failed3);
19319
+ const code = codeOf5(failed3);
19231
19320
  return { line, target: spec.target, code, error: String(failed3?.message ?? code) };
19232
19321
  }
19233
19322
 
19234
19323
  // src/mount/hostfs.ts
19235
19324
  var HOSTFS_IO = 16 * 1024 * 1024;
19236
- var codeOf5 = (err) => err?.code;
19237
- var unreachable = (err) => codeOf5(err) === "ENOTCONN";
19325
+ var codeOf6 = (err) => err?.code;
19326
+ var unreachable = (err) => codeOf6(err) === "ENOTCONN";
19238
19327
  function rel(path) {
19239
19328
  return path.replace(/^\/+/, "");
19240
19329
  }
@@ -19411,7 +19500,7 @@ function hostfsHandlers(current, againMs = RESTORE_AGAIN_MS) {
19411
19500
  try {
19412
19501
  return { opened: await opening2(), restore: void 0 };
19413
19502
  } catch (err) {
19414
- if (!flags2.write || codeOf5(err) !== "EACCES") throw err;
19503
+ if (!flags2.write || codeOf6(err) !== "EACCES") throw err;
19415
19504
  const was = await client.call("stat", { path: rel(path) });
19416
19505
  const mode = was.mode ?? 0;
19417
19506
  if (mode & 128) throw err;