@volter/browser-wali 0.1.166 → 0.1.167

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 (215) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +9 -0
  3. package/dist/browser-wali-command.d.ts +7 -0
  4. package/dist/browser-wali-command.d.ts.map +1 -1
  5. package/dist/browser-wali-command.js +70 -18
  6. package/dist/browser-wali-command.js.map +1 -1
  7. package/dist/bulk-memory.d.ts +4 -2
  8. package/dist/bulk-memory.d.ts.map +1 -1
  9. package/dist/bulk-memory.js +32 -9
  10. package/dist/bulk-memory.js.map +1 -1
  11. package/dist/capabilities.d.ts +1 -1
  12. package/dist/capabilities.d.ts.map +1 -1
  13. package/dist/capabilities.js +5 -2
  14. package/dist/capabilities.js.map +1 -1
  15. package/dist/child-processes.d.ts +2 -0
  16. package/dist/child-processes.d.ts.map +1 -1
  17. package/dist/child-processes.js +9 -1
  18. package/dist/child-processes.js.map +1 -1
  19. package/dist/clocks.d.ts +3 -0
  20. package/dist/clocks.d.ts.map +1 -0
  21. package/dist/clocks.js +44 -0
  22. package/dist/clocks.js.map +1 -0
  23. package/dist/coherent-file-locks.d.ts.map +1 -1
  24. package/dist/coherent-file-locks.js +2 -1
  25. package/dist/coherent-file-locks.js.map +1 -1
  26. package/dist/credentials.d.ts +4 -0
  27. package/dist/credentials.d.ts.map +1 -0
  28. package/dist/credentials.js +46 -0
  29. package/dist/credentials.js.map +1 -0
  30. package/dist/descriptors.d.ts +14 -0
  31. package/dist/descriptors.d.ts.map +1 -1
  32. package/dist/descriptors.js +45 -5
  33. package/dist/descriptors.js.map +1 -1
  34. package/dist/environment.d.ts +4 -0
  35. package/dist/environment.d.ts.map +1 -0
  36. package/dist/environment.js +23 -0
  37. package/dist/environment.js.map +1 -0
  38. package/dist/epoll-ready.d.ts +27 -0
  39. package/dist/epoll-ready.d.ts.map +1 -0
  40. package/dist/epoll-ready.js +88 -0
  41. package/dist/epoll-ready.js.map +1 -0
  42. package/dist/events.d.ts +1 -0
  43. package/dist/events.d.ts.map +1 -1
  44. package/dist/events.js +55 -24
  45. package/dist/events.js.map +1 -1
  46. package/dist/filesystem-host-session.d.ts +65 -0
  47. package/dist/filesystem-host-session.d.ts.map +1 -0
  48. package/dist/filesystem-host-session.js +951 -0
  49. package/dist/filesystem-host-session.js.map +1 -0
  50. package/dist/filesystem-host.d.ts +13 -81
  51. package/dist/filesystem-host.d.ts.map +1 -1
  52. package/dist/filesystem-host.js +14 -882
  53. package/dist/filesystem-host.js.map +1 -1
  54. package/dist/filesystem-protocol.d.ts +3 -1
  55. package/dist/filesystem-protocol.d.ts.map +1 -1
  56. package/dist/filesystem-remote.d.ts +8 -3
  57. package/dist/filesystem-remote.d.ts.map +1 -1
  58. package/dist/filesystem-remote.js +42 -20
  59. package/dist/filesystem-remote.js.map +1 -1
  60. package/dist/filesystem-service-client.d.ts +4 -0
  61. package/dist/filesystem-service-client.d.ts.map +1 -0
  62. package/dist/filesystem-service-client.js +16 -0
  63. package/dist/filesystem-service-client.js.map +1 -0
  64. package/dist/filesystem.d.ts +25 -4
  65. package/dist/filesystem.d.ts.map +1 -1
  66. package/dist/filesystem.js +548 -169
  67. package/dist/filesystem.js.map +1 -1
  68. package/dist/fork-memory.d.ts +23 -0
  69. package/dist/fork-memory.d.ts.map +1 -0
  70. package/dist/fork-memory.js +93 -0
  71. package/dist/fork-memory.js.map +1 -0
  72. package/dist/fork-worker.js +32 -11
  73. package/dist/fork-worker.js.map +1 -1
  74. package/dist/jumps.d.ts +7 -0
  75. package/dist/jumps.d.ts.map +1 -1
  76. package/dist/jumps.js +19 -1
  77. package/dist/jumps.js.map +1 -1
  78. package/dist/kernel-filesystem-worker.d.ts +2 -0
  79. package/dist/kernel-filesystem-worker.d.ts.map +1 -0
  80. package/dist/kernel-filesystem-worker.js +28 -0
  81. package/dist/kernel-filesystem-worker.js.map +1 -0
  82. package/dist/kernel-filesystem.d.ts +12 -0
  83. package/dist/kernel-filesystem.d.ts.map +1 -0
  84. package/dist/kernel-filesystem.js +45 -0
  85. package/dist/kernel-filesystem.js.map +1 -0
  86. package/dist/kernel-network-worker.d.ts +2 -0
  87. package/dist/kernel-network-worker.d.ts.map +1 -0
  88. package/dist/kernel-network-worker.js +14 -0
  89. package/dist/kernel-network-worker.js.map +1 -0
  90. package/dist/kernel-network.d.ts +14 -0
  91. package/dist/kernel-network.d.ts.map +1 -0
  92. package/dist/kernel-network.js +50 -0
  93. package/dist/kernel-network.js.map +1 -0
  94. package/dist/kernel-process-client.d.ts +6 -1
  95. package/dist/kernel-process-client.d.ts.map +1 -1
  96. package/dist/kernel-process-client.js +10 -1
  97. package/dist/kernel-process-client.js.map +1 -1
  98. package/dist/module-layout.d.ts +8 -0
  99. package/dist/module-layout.d.ts.map +1 -1
  100. package/dist/module-layout.js +263 -2
  101. package/dist/module-layout.js.map +1 -1
  102. package/dist/network-host.d.ts +6 -0
  103. package/dist/network-host.d.ts.map +1 -0
  104. package/dist/network-host.js +1582 -0
  105. package/dist/network-host.js.map +1 -0
  106. package/dist/network-protocol.d.ts +9 -2
  107. package/dist/network-protocol.d.ts.map +1 -1
  108. package/dist/network-protocol.js +3 -0
  109. package/dist/network-protocol.js.map +1 -1
  110. package/dist/network-service-client.d.ts +4 -0
  111. package/dist/network-service-client.d.ts.map +1 -0
  112. package/dist/network-service-client.js +16 -0
  113. package/dist/network-service-client.js.map +1 -0
  114. package/dist/network-worker.js +5 -1150
  115. package/dist/network-worker.js.map +1 -1
  116. package/dist/network.d.ts +13 -1
  117. package/dist/network.d.ts.map +1 -1
  118. package/dist/network.js +175 -48
  119. package/dist/network.js.map +1 -1
  120. package/dist/paths.d.ts +11 -0
  121. package/dist/paths.d.ts.map +1 -0
  122. package/dist/paths.js +97 -0
  123. package/dist/paths.js.map +1 -0
  124. package/dist/process-bridge.d.ts +12 -4
  125. package/dist/process-bridge.d.ts.map +1 -1
  126. package/dist/process-bridge.js +53 -17
  127. package/dist/process-bridge.js.map +1 -1
  128. package/dist/program.d.ts.map +1 -1
  129. package/dist/program.js +8 -0
  130. package/dist/program.js.map +1 -1
  131. package/dist/runtime.d.ts.map +1 -1
  132. package/dist/runtime.js +150 -92
  133. package/dist/runtime.js.map +1 -1
  134. package/dist/shared-buffer-pool.d.ts +18 -5
  135. package/dist/shared-buffer-pool.d.ts.map +1 -1
  136. package/dist/shared-buffer-pool.js +86 -14
  137. package/dist/shared-buffer-pool.js.map +1 -1
  138. package/dist/shared-file-layer.d.ts +3 -1
  139. package/dist/shared-file-layer.d.ts.map +1 -1
  140. package/dist/shared-file-layer.js +150 -35
  141. package/dist/shared-file-layer.js.map +1 -1
  142. package/dist/shared-pipes.d.ts +3 -1
  143. package/dist/shared-pipes.d.ts.map +1 -1
  144. package/dist/shared-pipes.js +105 -33
  145. package/dist/shared-pipes.js.map +1 -1
  146. package/dist/signal-interruption.d.ts +9 -0
  147. package/dist/signal-interruption.d.ts.map +1 -0
  148. package/dist/signal-interruption.js +6 -0
  149. package/dist/signal-interruption.js.map +1 -0
  150. package/dist/signals.d.ts +17 -6
  151. package/dist/signals.d.ts.map +1 -1
  152. package/dist/signals.js +101 -22
  153. package/dist/signals.js.map +1 -1
  154. package/dist/snapshot-filesystem.d.ts +1 -0
  155. package/dist/snapshot-filesystem.d.ts.map +1 -1
  156. package/dist/snapshot-filesystem.js +3 -0
  157. package/dist/snapshot-filesystem.js.map +1 -1
  158. package/dist/socket-flags.d.ts +3 -0
  159. package/dist/socket-flags.d.ts.map +1 -0
  160. package/dist/socket-flags.js +9 -0
  161. package/dist/socket-flags.js.map +1 -0
  162. package/dist/special-files.d.ts +6 -0
  163. package/dist/special-files.d.ts.map +1 -0
  164. package/dist/special-files.js +56 -0
  165. package/dist/special-files.js.map +1 -0
  166. package/dist/stdin.d.ts.map +1 -1
  167. package/dist/stdin.js +13 -5
  168. package/dist/stdin.js.map +1 -1
  169. package/dist/symlink.d.ts +2 -1
  170. package/dist/symlink.d.ts.map +1 -1
  171. package/dist/symlink.js +25 -93
  172. package/dist/symlink.js.map +1 -1
  173. package/dist/system.d.ts +2 -4
  174. package/dist/system.d.ts.map +1 -1
  175. package/dist/system.js +46 -29
  176. package/dist/system.js.map +1 -1
  177. package/dist/thread-coordinator-worker.js +58 -24
  178. package/dist/thread-coordinator-worker.js.map +1 -1
  179. package/dist/thread-lifecycle.d.ts +9 -0
  180. package/dist/thread-lifecycle.d.ts.map +1 -0
  181. package/dist/thread-lifecycle.js +30 -0
  182. package/dist/thread-lifecycle.js.map +1 -0
  183. package/dist/thread-worker.js +125 -44
  184. package/dist/thread-worker.js.map +1 -1
  185. package/dist/threads.d.ts +6 -0
  186. package/dist/threads.d.ts.map +1 -1
  187. package/dist/threads.js +46 -6
  188. package/dist/threads.js.map +1 -1
  189. package/dist/tty-job-control.d.ts +13 -0
  190. package/dist/tty-job-control.d.ts.map +1 -0
  191. package/dist/tty-job-control.js +56 -0
  192. package/dist/tty-job-control.js.map +1 -0
  193. package/dist/tty-settings.d.ts +3 -0
  194. package/dist/tty-settings.d.ts.map +1 -0
  195. package/dist/tty-settings.js +25 -0
  196. package/dist/tty-settings.js.map +1 -0
  197. package/dist/types.d.ts +12 -0
  198. package/dist/types.d.ts.map +1 -1
  199. package/dist/wait-state.d.ts +8 -0
  200. package/dist/wait-state.d.ts.map +1 -1
  201. package/dist/wait-state.js +15 -0
  202. package/dist/wait-state.js.map +1 -1
  203. package/dist/worker-program-protocol.d.ts +22 -2
  204. package/dist/worker-program-protocol.d.ts.map +1 -1
  205. package/dist/worker-program-worker.js +31 -9
  206. package/dist/worker-program-worker.js.map +1 -1
  207. package/dist/worker-program.d.ts +12 -2
  208. package/dist/worker-program.d.ts.map +1 -1
  209. package/dist/worker-program.js +214 -36
  210. package/dist/worker-program.js.map +1 -1
  211. package/dist/write-vector.d.ts +3 -0
  212. package/dist/write-vector.d.ts.map +1 -0
  213. package/dist/write-vector.js +35 -0
  214. package/dist/write-vector.js.map +1 -0
  215. package/package.json +1 -1
@@ -0,0 +1,46 @@
1
+ const USER_ID = 1000;
2
+ const GROUP_ID = 1000;
3
+ const UNCHANGED_ID = 0xffffffff;
4
+ const id = (value) => Number(BigInt.asUintN(32, BigInt(value)));
5
+ /** Immutable single-user credentials shared by every process and pthread. */
6
+ export function waliCredentialImports(memory) {
7
+ const writeIds = (value, pointers) => {
8
+ const buffer = memory().buffer;
9
+ if (pointers.some(pointer => !Number.isSafeInteger(pointer) || pointer <= 0 || pointer + 4 > buffer.byteLength))
10
+ return -14n;
11
+ const view = new DataView(buffer);
12
+ for (const pointer of pointers)
13
+ view.setUint32(pointer, value, true);
14
+ return 0n;
15
+ };
16
+ const setIds = (value, requested, allowUnchanged) => requested.every(request => id(request) === value || (allowUnchanged && id(request) === UNCHANGED_ID)) ? 0n : -1n;
17
+ return {
18
+ SYS_getuid: () => BigInt(USER_ID),
19
+ SYS_geteuid: () => BigInt(USER_ID),
20
+ SYS_getgid: () => BigInt(GROUP_ID),
21
+ SYS_getegid: () => BigInt(GROUP_ID),
22
+ SYS_getresuid: (real, effective, saved) => writeIds(USER_ID, [Number(real), Number(effective), Number(saved)]),
23
+ SYS_getresgid: (real, effective, saved) => writeIds(GROUP_ID, [Number(real), Number(effective), Number(saved)]),
24
+ SYS_getgroups: (count, list) => {
25
+ const size = Number(BigInt.asIntN(32, BigInt(count)));
26
+ if (size < 0)
27
+ return -22n;
28
+ if (size === 0)
29
+ return 1n; // Linux size query, unlike upstream's EINVAL.
30
+ const result = writeIds(GROUP_ID, [Number(list)]);
31
+ return result < 0n ? result : 1n;
32
+ },
33
+ SYS_setuid: value => setIds(USER_ID, [value], false),
34
+ SYS_setgid: value => setIds(GROUP_ID, [value], false),
35
+ SYS_setreuid: (real, effective) => setIds(USER_ID, [real, effective], true),
36
+ SYS_setregid: (real, effective) => setIds(GROUP_ID, [real, effective], true),
37
+ SYS_setresuid: (real, effective, saved) => setIds(USER_ID, [real, effective, saved], true),
38
+ SYS_setresgid: (real, effective, saved) => setIds(GROUP_ID, [real, effective, saved], true),
39
+ // Linux setfsuid/setfsgid return the previous ID even when a change is denied.
40
+ SYS_setfsuid: () => BigInt(USER_ID),
41
+ SYS_setfsgid: () => BigInt(GROUP_ID),
42
+ // Changing supplementary groups requires privilege, even to the same set.
43
+ SYS_setgroups: () => -1n,
44
+ };
45
+ }
46
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type WaliSharedBufferRelease } from "./shared-buffer-pool.js";
1
2
  /** An open description outlives any one descriptor naming it. Owned by the coordinator. */
2
3
  export interface WaliOpenDescription<T = unknown> {
3
4
  readonly id: number;
@@ -16,6 +17,7 @@ export declare class WaliDescriptionRegistry {
16
17
  retain(id: number): void;
17
18
  release(id: number): void;
18
19
  }
20
+ export declare function createWaliDescriptorLimits(): SharedArrayBuffer;
19
21
  export interface WaliDescriptorEntry {
20
22
  description: number;
21
23
  flags: number;
@@ -26,8 +28,18 @@ export declare class WaliProcessDescriptorTable {
26
28
  readonly entries: Array<WaliDescriptorEntry | undefined>;
27
29
  /** How many of this table's descriptors name each open description. */
28
30
  private readonly named;
31
+ private readonly caches;
32
+ registerCache(cache: {
33
+ forget(fd: number): void;
34
+ }): void;
35
+ descriptorLimits: SharedArrayBuffer;
36
+ get descriptorLimit(): number;
37
+ attachDescriptorLimits(buffer: SharedArrayBuffer): void;
29
38
  sharedEntries: Int32Array;
39
+ private sharedLease;
30
40
  constructor(registry: WaliDescriptionRegistry, buffer?: SharedArrayBuffer);
41
+ /** Publish inherited descriptors into a channel's leased table, tracking every write. */
42
+ attachSharedEntries(buffer: SharedArrayBuffer, lease: WaliSharedBufferRelease | SharedArrayBuffer | undefined): void;
31
43
  get(fd: number): WaliOpenDescription | undefined;
32
44
  set(fd: number, description: WaliOpenDescription, flags?: number): void;
33
45
  close(fd: number): boolean;
@@ -56,6 +68,8 @@ export declare class WaliDescriptionView<T> {
56
68
  private readonly resolvedEntries;
57
69
  private readonly resolvedValues;
58
70
  private readonly resolvedOwn;
71
+ /** No cached projection may retain a closed description or its callbacks. */
72
+ forget(fd: number): void;
59
73
  private resolve;
60
74
  get(fd: number): T | undefined;
61
75
  has(fd: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../src/descriptors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../src/descriptors.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
+ // Open-description reference rules adapted from The Emscripten Authors,
2
+ // wasmfs/file_table.cpp/h (Copyright 2021, MIT/NCSA), pinned at
3
+ // 862dc0d48acc4134a0088d27ac8f5dd18baba1cd; see ../LICENSE.
4
+ // Kernel ownership and process fd flags replace their singleton table.
5
+ import { markWaliSharedBufferWritten } from "./shared-buffer-pool.js";
1
6
  export class WaliDescriptionRegistry {
2
7
  nextId = 1;
3
8
  pipeMetadata;
@@ -17,7 +22,7 @@ export class WaliDescriptionRegistry {
17
22
  const description = { id: this.nextId++, kind, value, references: 0, release };
18
23
  this.descriptions.set(description.id, description);
19
24
  if (kind === "special" && typeof value === "object" && value !== null && "stdio" in value)
20
- Atomics.store(this.pipeMetadata, description.id * 3 + 2, Number(value.stdio) + 1);
25
+ Atomics.store(this.pipeMetadata, description.id * 3 + 2, "terminal" in value && value.terminal === true ? 4 : Number(value.stdio) + 1);
21
26
  return description;
22
27
  }
23
28
  get(id) { return this.descriptions.get(id); }
@@ -40,17 +45,42 @@ export class WaliDescriptionRegistry {
40
45
  }
41
46
  }
42
47
  }
48
+ export function createWaliDescriptorLimits() {
49
+ const buffer = new SharedArrayBuffer(2 * Uint32Array.BYTES_PER_ELEMENT);
50
+ new Uint32Array(buffer).set([65_536, 65_536]); // capacity of the Linux fd table
51
+ return buffer;
52
+ }
43
53
  /** Each process owns one table. Threads use that process's table. */
44
54
  export class WaliProcessDescriptorTable {
45
55
  registry;
46
56
  entries = [];
47
57
  /** How many of this table's descriptors name each open description. */
48
58
  named = new Map();
59
+ caches = [];
60
+ registerCache(cache) { this.caches.push(cache); }
61
+ descriptorLimits = createWaliDescriptorLimits();
62
+ get descriptorLimit() { return Atomics.load(new Uint32Array(this.descriptorLimits), 0); }
63
+ attachDescriptorLimits(buffer) {
64
+ Atomics.store(new BigUint64Array(buffer), 0, Atomics.load(new BigUint64Array(this.descriptorLimits), 0));
65
+ this.descriptorLimits = buffer;
66
+ }
49
67
  sharedEntries;
68
+ sharedLease;
50
69
  constructor(registry, buffer = new SharedArrayBuffer(65_536 * 4)) {
51
70
  this.registry = registry;
52
71
  this.sharedEntries = new Int32Array(buffer);
53
72
  }
73
+ /** Publish inherited descriptors into a channel's leased table, tracking every write. */
74
+ attachSharedEntries(buffer, lease) {
75
+ this.sharedEntries = new Int32Array(buffer);
76
+ this.sharedLease = lease;
77
+ this.entries.forEach((entry, fd) => {
78
+ if (!entry)
79
+ return;
80
+ markWaliSharedBufferWritten(this.sharedLease, 2, (fd + 1) * Int32Array.BYTES_PER_ELEMENT);
81
+ Atomics.store(this.sharedEntries, fd, entry.description);
82
+ });
83
+ }
54
84
  get(fd) {
55
85
  const entry = this.entries[fd];
56
86
  return entry && this.registry.get(entry.description);
@@ -60,6 +90,7 @@ export class WaliProcessDescriptorTable {
60
90
  this.close(fd);
61
91
  this.entries[fd] = { description: description.id, flags };
62
92
  this.named.set(description.id, (this.named.get(description.id) ?? 0) + 1);
93
+ markWaliSharedBufferWritten(this.sharedLease, 2, (fd + 1) * Int32Array.BYTES_PER_ELEMENT);
63
94
  Atomics.store(this.sharedEntries, fd, description.id);
64
95
  }
65
96
  close(fd) {
@@ -67,11 +98,14 @@ export class WaliProcessDescriptorTable {
67
98
  if (!entry)
68
99
  return false;
69
100
  delete this.entries[fd];
101
+ for (const cache of this.caches)
102
+ cache.forget(fd);
70
103
  const left = (this.named.get(entry.description) ?? 1) - 1;
71
104
  if (left > 0)
72
105
  this.named.set(entry.description, left);
73
106
  else
74
107
  this.named.delete(entry.description);
108
+ markWaliSharedBufferWritten(this.sharedLease, 2, (fd + 1) * Int32Array.BYTES_PER_ELEMENT);
75
109
  Atomics.store(this.sharedEntries, fd, 0);
76
110
  this.registry.release(entry.description);
77
111
  return true;
@@ -80,6 +114,7 @@ export class WaliProcessDescriptorTable {
80
114
  names(description) { return this.named.has(description); }
81
115
  copy() {
82
116
  const child = new WaliProcessDescriptorTable(this.registry);
117
+ Atomics.store(new BigUint64Array(child.descriptorLimits), 0, Atomics.load(new BigUint64Array(this.descriptorLimits), 0));
83
118
  this.entries.forEach((entry, fd) => {
84
119
  if (entry)
85
120
  child.set(fd, this.registry.get(entry.description), entry.flags);
@@ -105,6 +140,7 @@ export class WaliDescriptionView {
105
140
  this.table = table;
106
141
  this.kind = kind;
107
142
  this.release = release;
143
+ table.registerCache(this);
108
144
  }
109
145
  /**
110
146
  * What each descriptor resolved to, and the table entry it was resolved
@@ -118,13 +154,17 @@ export class WaliDescriptionView {
118
154
  resolvedEntries = [];
119
155
  resolvedValues = [];
120
156
  resolvedOwn = [];
157
+ /** No cached projection may retain a closed description or its callbacks. */
158
+ forget(fd) {
159
+ this.resolvedEntries[fd] = undefined;
160
+ this.resolvedValues[fd] = undefined;
161
+ this.resolvedOwn[fd] = false;
162
+ }
121
163
  resolve(fd) {
122
164
  const entry = this.table.entries[fd];
123
165
  if (entry === undefined) {
124
- if (this.resolvedEntries[fd] !== undefined) {
125
- this.resolvedEntries[fd] = undefined;
126
- this.resolvedValues[fd] = undefined;
127
- }
166
+ if (this.resolvedEntries[fd] !== undefined)
167
+ this.forget(fd);
128
168
  return false;
129
169
  }
130
170
  if (this.resolvedEntries[fd] !== entry) {
@@ -1 +1 @@
1
- {"version":3,"file":"descriptors.js","sourceRoot":"","sources":["../src/descriptors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,uBAAuB;IAC1B,MAAM,GAAG,CAAC,CAAC;IACV,YAAY,CAAa;IAClC,YAAY,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,YAAY,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEvE,MAAM,CAAI,IAAY,EAAE,KAAQ,EAAE,OAAoB;QACpD,OAAO,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACjF,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,iGAAiG;QACjG,MAAM,WAAW,GAA2B,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;QACvG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK;YACvF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,EAAU,IAAqC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtF,MAAM,CAAC,EAAU;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QACpE,WAAW,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,UAAU,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACzG,IAAI,EAAE,WAAW,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AAID,qEAAqE;AACrE,MAAM,OAAO,0BAA0B;IAKhB;IAJZ,OAAO,GAA2C,EAAE,CAAC;IAC9D,uEAAuE;IACtD,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,aAAa,CAAa;IAC1B,YAAqB,QAAiC,EAAE,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;QAA7E,aAAQ,GAAR,QAAQ,CAAyB;QAAgD,IAAI,CAAC,aAAa,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAEpJ,GAAG,CAAC,EAAU;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,OAAO,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,EAAU,EAAE,WAAgC,EAAE,KAAK,GAAG,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,EAAU;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;;YAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iIAAiI;IACjI,KAAK,CAAC,WAAmB,IAAa,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE3E,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACjC,IAAI,KAAK;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,KAAW,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,KAAK;QAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErF,IAAI,CAAI,IAAY,EAAE,OAA4B;QAChD,OAAO,IAAI,mBAAmB,CAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAED,wEAAwE;AACxE,MAAM,OAAO,mBAAmB;IACD;IAAoD;IAC9D;IADnB,YAA6B,KAAiC,EAAmB,IAAY,EAC1E,OAA4B;QADlB,UAAK,GAAL,KAAK,CAA4B;QAAmB,SAAI,GAAJ,IAAI,CAAQ;QAC1E,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IACnD;;;;;;;;OAQG;IACc,eAAe,GAA2C,EAAE,CAAC;IAC7D,cAAc,GAAyB,EAAE,CAAC;IAC1C,WAAW,GAAc,EAAE,CAAC;IACrC,OAAO,CAAC,EAAU;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;gBAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;YAAC,CAAC;YAC1H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/D,MAAM,GAAG,GAAG,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;YAC5C,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAY,CAAC,KAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,EAAU,IAAmB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACjG,GAAG,CAAC,EAAU,IAAa,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,EAAU,EAAE,KAAQ;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,uGAAuG;QACvG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;QAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,CAAC,MAAM;QACL,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QACxC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"descriptors.js","sourceRoot":"","sources":["../src/descriptors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WaliImportHandler } from "./types.js";
2
+ /** The exec environment is a vector of NUL-terminated strings, not shell syntax. */
3
+ export declare function createWaliEnvironmentImports(env: Readonly<Record<string, string>>, memory: () => WebAssembly.Memory): Record<string, WaliImportHandler>;
4
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,oFAAoF;AACpF,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrC,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,GAC/B,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAmBnC"}
@@ -0,0 +1,23 @@
1
+ /** The exec environment is a vector of NUL-terminated strings, not shell syntax. */
2
+ export function createWaliEnvironmentImports(env, memory) {
3
+ const encoder = new TextEncoder();
4
+ const entries = Object.entries(env).map(([name, value]) => {
5
+ if (name.includes("=") || name.includes("\0") || value.includes("\0"))
6
+ throw new TypeError("WALI environment names cannot contain '=' or NUL, and values cannot contain NUL");
7
+ return encoder.encode(`${name}=${value}\0`);
8
+ });
9
+ return {
10
+ __cl_get_envc: () => entries.length,
11
+ __cl_get_env_len: (index) => entries[Number(index)]?.byteLength ?? 0,
12
+ __cl_copy_env: (pointer, index) => {
13
+ const entry = entries[Number(index)];
14
+ const offset = Number(pointer);
15
+ const buffer = memory().buffer;
16
+ if (!entry || !Number.isInteger(offset) || offset <= 0 || offset + entry.byteLength > buffer.byteLength)
17
+ return -1;
18
+ new Uint8Array(buffer, offset, entry.byteLength).set(entry);
19
+ return 0;
20
+ },
21
+ };
22
+ }
23
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,GAAqC,EACrC,MAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnE,MAAM,IAAI,SAAS,CAAC,iFAAiF,CAAC,CAAC;QACzG,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO;QACL,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM;QACnC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC;QACpE,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;gBAAE,OAAO,CAAC,CAAC,CAAC;YACnH,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5D,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface WaliEpollRegistration {
2
+ fd: number;
3
+ events: number;
4
+ data: Uint8Array;
5
+ }
6
+ export type WaliEpollEntry<T extends WaliEpollRegistration> = T & {
7
+ onList: boolean;
8
+ disabled: boolean;
9
+ previous: WaliEpollEntry<T> | undefined;
10
+ next: WaliEpollEntry<T> | undefined;
11
+ };
12
+ /** One interest map and ready list per open epoll description, shared by dup. */
13
+ export declare class WaliEpollSet<T extends WaliEpollRegistration> {
14
+ readonly registrations: Map<number, WaliEpollEntry<T>>;
15
+ private head;
16
+ private tail;
17
+ set(registration: T): WaliEpollEntry<T>;
18
+ notify(entry: WaliEpollEntry<T>): void;
19
+ evict(entry: WaliEpollEntry<T>): void;
20
+ wouldBlock(derive: (entry: WaliEpollEntry<T>) => number): boolean;
21
+ /** libepoll doEpollWait: detach, drain once, then put unserved entries first. */
22
+ take(maximum: number, derive: (entry: WaliEpollEntry<T>) => number): Array<{
23
+ entry: WaliEpollEntry<T>;
24
+ ready: number;
25
+ }>;
26
+ }
27
+ //# sourceMappingURL=epoll-ready.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoll-ready.d.ts","sourceRoot":"","sources":["../src/epoll-ready.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CAClB;AACD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,qBAAqB,IAAI,CAAC,GAAG;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACrC,CAAC;AAIF,iFAAiF;AACjF,qBAAa,YAAY,CAAC,CAAC,SAAS,qBAAqB;IACvD,QAAQ,CAAC,aAAa,iCAAwC;IAC9D,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,IAAI,CAAgC;IAE5C,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAQvC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAUtC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAYrC,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO;IAOjE,iFAAiF;IACjF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CA4BxH"}
@@ -0,0 +1,88 @@
1
+ // Ready-list rules translated from The Emscripten Authors, libepoll.js,
2
+ // Copyright 2026, SPDX-License-Identifier: MIT; pinned at
3
+ // 862dc0d48acc4134a0088d27ac8f5dd18baba1cd; see ../LICENSE.
4
+ // Only the kernel owns this state; backend readiness notifications remain ours.
5
+ const EPOLLET = 0x80000000;
6
+ const EPOLLONESHOT = 0x40000000;
7
+ /** One interest map and ready list per open epoll description, shared by dup. */
8
+ export class WaliEpollSet {
9
+ registrations = new Map();
10
+ head;
11
+ tail;
12
+ set(registration) {
13
+ const old = this.registrations.get(registration.fd);
14
+ if (old)
15
+ this.evict(old);
16
+ const entry = { ...registration, onList: false, disabled: false, previous: undefined, next: undefined };
17
+ this.registrations.set(entry.fd, entry);
18
+ return entry;
19
+ }
20
+ notify(entry) {
21
+ if (entry.disabled || entry.onList)
22
+ return;
23
+ entry.onList = true;
24
+ entry.previous = this.tail;
25
+ entry.next = undefined;
26
+ if (this.tail)
27
+ this.tail.next = entry;
28
+ else
29
+ this.head = entry;
30
+ this.tail = entry;
31
+ }
32
+ evict(entry) {
33
+ if (entry.onList) {
34
+ if (entry.previous)
35
+ entry.previous.next = entry.next;
36
+ else
37
+ this.head = entry.next;
38
+ if (entry.next)
39
+ entry.next.previous = entry.previous;
40
+ else
41
+ this.tail = entry.previous;
42
+ }
43
+ entry.onList = false;
44
+ entry.previous = entry.next = undefined;
45
+ this.registrations.delete(entry.fd);
46
+ }
47
+ wouldBlock(derive) {
48
+ for (let entry = this.head; entry; entry = entry.next) {
49
+ if (!entry.disabled && derive(entry))
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ /** libepoll doEpollWait: detach, drain once, then put unserved entries first. */
55
+ take(maximum, derive) {
56
+ let entry = this.head;
57
+ const tail = this.tail;
58
+ this.head = this.tail = undefined;
59
+ const delivered = [];
60
+ while (entry && delivered.length < maximum) {
61
+ const next = entry.next;
62
+ entry.onList = false;
63
+ entry.previous = entry.next = undefined;
64
+ const ready = entry.disabled ? 0 : derive(entry);
65
+ if (ready) {
66
+ delivered.push({ entry, ready });
67
+ if (entry.events & EPOLLONESHOT)
68
+ entry.disabled = true;
69
+ else if (!(entry.events & EPOLLET))
70
+ this.notify(entry);
71
+ }
72
+ entry = next;
73
+ }
74
+ if (entry && tail) {
75
+ // notify() during the drain may have started a new list; TS narrowed head to the cleared value.
76
+ const head = this.head;
77
+ entry.previous = undefined;
78
+ tail.next = head;
79
+ if (head)
80
+ head.previous = tail;
81
+ else
82
+ this.tail = tail;
83
+ this.head = entry;
84
+ }
85
+ return delivered;
86
+ }
87
+ }
88
+ //# sourceMappingURL=epoll-ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoll-ready.js","sourceRoot":"","sources":["../src/epoll-ready.ts"],"names":[],"mappings":"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"}
package/dist/events.d.ts CHANGED
@@ -14,6 +14,7 @@ export declare class WaliEventHost {
14
14
  private createEpoll;
15
15
  private registerEpoll;
16
16
  private epollControl;
17
+ private sampleEpoll;
17
18
  private epollReady;
18
19
  private epollWait;
19
20
  private readyEvents;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAyCpD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IANhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGxC,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,WAAW,EAAE,uBAAuB,EACpC,YAAY,CAAC,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,aAAA;IAGpF,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAsB5C,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,IAAI;IAEZ,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAyCpD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IANhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGxC,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,WAAW,EAAE,uBAAuB,EACpC,YAAY,CAAC,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,aAAA;IAGpF,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAsB5C,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,IAAI;IAEZ,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,cAAc;CAQvB"}
package/dist/events.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { WaliEpollSet } from "./epoll-ready.js";
1
2
  import { WaliFileDescriptorTable } from "./filesystem.js";
2
3
  import { monotonicMilliseconds } from "./monotonic-clock.js";
3
4
  const EBADF = 9n;
@@ -33,7 +34,7 @@ export class WaliEventHost {
33
34
  imports() {
34
35
  return {
35
36
  SYS_epoll_create: (size) => Number(size) > 0 ? this.createEpoll() : -EINVAL,
36
- SYS_epoll_create1: () => this.createEpoll(),
37
+ SYS_epoll_create1: (flags) => (Number(flags) & ~TFD_CLOEXEC) ? -EINVAL : this.createEpoll(Number(flags)),
37
38
  SYS_epoll_ctl: (epollFd, operation, fd, event) => this.epollControl(Number(epollFd), Number(operation), Number(fd), Number(event)),
38
39
  SYS_epoll_wait: (epollFd, events, count, timeout) => this.epollWait(Number(epollFd), Number(events), Number(count), Number(timeout)),
39
40
  SYS_epoll_pwait: (epollFd, events, count, timeout) => this.epollWait(Number(epollFd), Number(events), Number(count), Number(timeout)),
@@ -50,8 +51,11 @@ export class WaliEventHost {
50
51
  throw new WebAssembly.RuntimeError("WALI event memory access is out of bounds.");
51
52
  }
52
53
  }
53
- createEpoll() {
54
- return BigInt(this.registerEpoll({ registrations: new Map() }));
54
+ createEpoll(flags = 0) {
55
+ const fd = this.registerEpoll(new WaliEpollSet());
56
+ if (flags & TFD_CLOEXEC)
57
+ this.descriptors.descriptors.entries[fd].flags = 1;
58
+ return BigInt(fd);
55
59
  }
56
60
  registerEpoll(epoll, minimum = 3) {
57
61
  let fd = -1;
@@ -69,11 +73,21 @@ export class WaliEventHost {
69
73
  const epoll = this.epolls.get(epollFd);
70
74
  if (!epoll)
71
75
  return -EBADF;
72
- const current = epoll.registrations.get(fd);
76
+ const descriptor = this.descriptors.descriptors.get(fd);
77
+ const external = this.externalPoll?.(fd, 0);
78
+ if (!descriptor && external === undefined)
79
+ return -EBADF;
80
+ if (epoll === this.epolls.get(fd))
81
+ return -EINVAL;
82
+ let current = epoll.registrations.get(fd);
83
+ if (current && current.identity !== descriptor) {
84
+ epoll.evict(current);
85
+ current = undefined;
86
+ }
73
87
  if (operation === EPOLL_CTL_DEL) {
74
88
  if (!current)
75
89
  return -ENOENT;
76
- epoll.registrations.delete(fd);
90
+ epoll.evict(current);
77
91
  return 0n;
78
92
  }
79
93
  if (operation !== EPOLL_CTL_ADD && operation !== EPOLL_CTL_MOD)
@@ -82,41 +96,58 @@ export class WaliEventHost {
82
96
  return -EEXIST;
83
97
  if (operation === EPOLL_CTL_MOD && !current)
84
98
  return -ENOENT;
85
- this.range(eventPointer, EPOLL_EVENT_BYTES);
86
- epoll.registrations.set(fd, {
99
+ if (this.descriptors.ownsFile(fd))
100
+ return -1n; // Regular files have no readiness wait queue.
101
+ if (eventPointer <= 0 || eventPointer + EPOLL_EVENT_BYTES > this.memory().buffer.byteLength)
102
+ return -14n;
103
+ const entry = epoll.set({
87
104
  fd,
88
105
  events: this.view().getUint32(eventPointer, true),
89
106
  data: this.bytes().slice(eventPointer + EPOLL_DATA_OFFSET, eventPointer + EPOLL_EVENT_BYTES),
107
+ lastReady: 0,
108
+ identity: descriptor,
90
109
  });
110
+ if (this.readyEvents(entry))
111
+ epoll.notify(entry);
91
112
  return 0n;
92
113
  }
114
+ sampleEpoll(epoll) {
115
+ for (const entry of epoll.registrations.values()) {
116
+ if (entry.identity !== this.descriptors.descriptors.get(entry.fd)
117
+ || (!entry.identity && this.externalPoll?.(entry.fd, 0) === undefined)) {
118
+ epoll.evict(entry);
119
+ continue;
120
+ }
121
+ const ready = this.readyEvents(entry);
122
+ if (ready && (!(entry.events & 0x80000000) || (ready & ~entry.lastReady)))
123
+ epoll.notify(entry);
124
+ entry.lastReady = ready;
125
+ }
126
+ }
93
127
  epollReady(epollFd) {
94
128
  const epoll = this.epolls.get(epollFd);
95
129
  if (!epoll)
96
130
  return false;
97
- return [...epoll.registrations.values()].some((entry) => this.readyEvents(entry) !== 0);
131
+ this.sampleEpoll(epoll);
132
+ return !epoll.wouldBlock(entry => this.readyEvents(entry));
98
133
  }
99
134
  epollWait(epollFd, pointer, count, _timeout) {
100
135
  const epoll = this.epolls.get(epollFd);
101
136
  if (!epoll)
102
137
  return -EBADF;
103
- if (count <= 0)
138
+ if (!Number.isSafeInteger(count) || count <= 0 || count > 0x7fffffff / EPOLL_EVENT_BYTES)
104
139
  return -EINVAL;
105
- let written = 0;
106
- for (const registration of epoll.registrations.values()) {
107
- if (written >= count)
108
- break;
109
- const ready = this.readyEvents(registration);
110
- if (ready === 0)
111
- continue;
112
- const eventPointer = pointer + written * EPOLL_EVENT_BYTES;
113
- this.range(eventPointer, EPOLL_EVENT_BYTES);
114
- this.bytes().fill(0, eventPointer, eventPointer + EPOLL_EVENT_BYTES);
115
- this.view().setUint32(eventPointer, ready, true);
116
- this.bytes().set(registration.data, eventPointer + EPOLL_DATA_OFFSET);
117
- written += 1;
118
- }
119
- return BigInt(written);
140
+ if (pointer <= 0 || pointer + count * EPOLL_EVENT_BYTES > this.memory().buffer.byteLength)
141
+ return -14n;
142
+ this.sampleEpoll(epoll);
143
+ const delivered = epoll.take(count, entry => this.readyEvents(entry));
144
+ delivered.forEach(({ entry, ready }, index) => {
145
+ const at = pointer + index * EPOLL_EVENT_BYTES;
146
+ this.bytes().fill(0, at, at + EPOLL_EVENT_BYTES);
147
+ this.view().setUint32(at, ready, true);
148
+ this.bytes().set(entry.data, at + EPOLL_DATA_OFFSET);
149
+ });
150
+ return BigInt(delivered.length);
120
151
  }
121
152
  readyEvents(registration) {
122
153
  const pollEvents = ((registration.events & 0x1) ? 0x1 : 0)