@secure-exec/core 0.2.1-rc.1 → 0.3.0-rc.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 (248) hide show
  1. package/README.md +5 -5
  2. package/dist/binary.d.ts +4 -0
  3. package/dist/binary.js +25 -0
  4. package/dist/bytes.d.ts +2 -0
  5. package/dist/bytes.js +6 -0
  6. package/dist/callbacks.d.ts +41 -0
  7. package/dist/callbacks.js +94 -0
  8. package/dist/cargo.d.ts +2 -0
  9. package/dist/cargo.js +142 -0
  10. package/dist/correlation.d.ts +10 -0
  11. package/dist/correlation.js +49 -0
  12. package/dist/descriptors.d.ts +34 -0
  13. package/dist/descriptors.js +37 -0
  14. package/dist/event-buffer.d.ts +90 -0
  15. package/dist/event-buffer.js +313 -0
  16. package/dist/ext.d.ts +7 -0
  17. package/dist/ext.js +13 -0
  18. package/dist/filesystem.d.ts +41 -0
  19. package/dist/filesystem.js +70 -0
  20. package/dist/frame-payload-codec.d.ts +8 -0
  21. package/dist/frame-payload-codec.js +14 -0
  22. package/dist/frame-rpc.d.ts +38 -0
  23. package/dist/frame-rpc.js +73 -0
  24. package/dist/frame-stream.d.ts +27 -0
  25. package/dist/frame-stream.js +99 -0
  26. package/dist/framing.d.ts +7 -0
  27. package/dist/framing.js +22 -0
  28. package/dist/generated/AcpLimitsConfig.d.ts +4 -0
  29. package/dist/generated/AcpLimitsConfig.js +2 -0
  30. package/dist/generated/CreateVmConfig.d.ts +19 -0
  31. package/dist/generated/FsPermissionRule.d.ts +6 -0
  32. package/dist/generated/FsPermissionRuleSet.d.ts +6 -0
  33. package/dist/generated/FsPermissionRuleSet.js +1 -0
  34. package/dist/generated/FsPermissionScope.d.ts +3 -0
  35. package/dist/generated/FsPermissionScope.js +1 -0
  36. package/dist/generated/HttpLimitsConfig.d.ts +3 -0
  37. package/dist/generated/HttpLimitsConfig.js +2 -0
  38. package/dist/generated/JsModuleResolution.d.ts +1 -0
  39. package/dist/generated/JsModuleResolution.js +2 -0
  40. package/dist/generated/JsRuntimeConfig.d.ts +26 -0
  41. package/dist/generated/JsRuntimeConfig.js +1 -0
  42. package/dist/generated/JsRuntimeLimitsConfig.d.ts +7 -0
  43. package/dist/generated/JsRuntimeLimitsConfig.js +2 -0
  44. package/dist/generated/JsRuntimePlatform.d.ts +1 -0
  45. package/dist/generated/JsRuntimePlatform.js +2 -0
  46. package/dist/generated/MountPluginDescriptor.d.ts +4 -0
  47. package/dist/generated/MountPluginDescriptor.js +2 -0
  48. package/dist/generated/NativeRootFilesystemConfig.d.ts +5 -0
  49. package/dist/generated/NativeRootFilesystemConfig.js +1 -0
  50. package/dist/generated/PatternPermissionRule.d.ts +6 -0
  51. package/dist/generated/PatternPermissionRule.js +1 -0
  52. package/dist/generated/PatternPermissionRuleSet.d.ts +6 -0
  53. package/dist/generated/PatternPermissionRuleSet.js +1 -0
  54. package/dist/generated/PatternPermissionScope.d.ts +3 -0
  55. package/dist/generated/PatternPermissionScope.js +1 -0
  56. package/dist/generated/PermissionMode.d.ts +1 -0
  57. package/dist/generated/PermissionMode.js +2 -0
  58. package/dist/generated/PermissionsPolicy.d.ts +10 -0
  59. package/dist/generated/PermissionsPolicy.js +1 -0
  60. package/dist/generated/PluginLimitsConfig.d.ts +4 -0
  61. package/dist/generated/PluginLimitsConfig.js +2 -0
  62. package/dist/generated/PythonLimitsConfig.d.ts +5 -0
  63. package/dist/generated/PythonLimitsConfig.js +2 -0
  64. package/dist/generated/ResourceLimitsConfig.d.ts +22 -0
  65. package/dist/generated/ResourceLimitsConfig.js +2 -0
  66. package/dist/generated/RootFilesystemConfig.d.ts +9 -0
  67. package/dist/generated/RootFilesystemConfig.js +1 -0
  68. package/dist/generated/RootFilesystemEntry.d.ts +13 -0
  69. package/dist/generated/RootFilesystemEntry.js +1 -0
  70. package/dist/generated/RootFilesystemEntryEncoding.d.ts +1 -0
  71. package/dist/generated/RootFilesystemEntryEncoding.js +2 -0
  72. package/dist/generated/RootFilesystemEntryKind.d.ts +1 -0
  73. package/dist/generated/RootFilesystemEntryKind.js +2 -0
  74. package/dist/generated/RootFilesystemLowerDescriptor.d.ts +7 -0
  75. package/dist/generated/RootFilesystemLowerDescriptor.js +1 -0
  76. package/dist/generated/RootFilesystemMode.d.ts +1 -0
  77. package/dist/generated/RootFilesystemMode.js +2 -0
  78. package/dist/generated/ToolLimitsConfig.d.ts +10 -0
  79. package/dist/generated/ToolLimitsConfig.js +2 -0
  80. package/dist/generated/VmDnsConfig.d.ts +6 -0
  81. package/dist/generated/VmDnsConfig.js +2 -0
  82. package/dist/generated/VmLimitsConfig.d.ts +18 -0
  83. package/dist/generated/VmLimitsConfig.js +1 -0
  84. package/dist/generated/VmListenPolicyConfig.d.ts +5 -0
  85. package/dist/generated/VmListenPolicyConfig.js +2 -0
  86. package/dist/generated/WasmLimitsConfig.d.ts +5 -0
  87. package/dist/generated/WasmLimitsConfig.js +2 -0
  88. package/dist/generated-protocol.d.ts +1037 -0
  89. package/dist/generated-protocol.js +2887 -0
  90. package/dist/index.d.ts +24 -62
  91. package/dist/index.js +24 -53
  92. package/dist/json.d.ts +2 -0
  93. package/dist/json.js +20 -0
  94. package/dist/kernel-proxy.d.ts +149 -0
  95. package/dist/kernel-proxy.js +1733 -0
  96. package/dist/native-client.d.ts +41 -0
  97. package/dist/native-client.js +124 -0
  98. package/dist/node-runtime.d.ts +443 -0
  99. package/dist/node-runtime.js +569 -0
  100. package/dist/numbers.d.ts +1 -0
  101. package/dist/numbers.js +8 -0
  102. package/dist/ownership.d.ts +18 -0
  103. package/dist/ownership.js +77 -0
  104. package/dist/permissions.d.ts +29 -0
  105. package/dist/permissions.js +68 -0
  106. package/dist/process.d.ts +35 -0
  107. package/dist/process.js +125 -0
  108. package/dist/protocol-client.d.ts +46 -0
  109. package/dist/protocol-client.js +180 -0
  110. package/dist/protocol-frames.d.ts +68 -0
  111. package/dist/protocol-frames.js +139 -0
  112. package/dist/protocol-maps.d.ts +28 -0
  113. package/dist/protocol-maps.js +217 -0
  114. package/dist/protocol-schema.d.ts +10 -0
  115. package/dist/protocol-schema.js +11 -0
  116. package/dist/request-payloads.d.ts +137 -0
  117. package/dist/request-payloads.js +210 -0
  118. package/dist/response-payloads.d.ts +107 -0
  119. package/dist/response-payloads.js +161 -0
  120. package/dist/sidecar-client.d.ts +242 -0
  121. package/dist/sidecar-client.js +797 -0
  122. package/dist/state.d.ts +40 -0
  123. package/dist/state.js +44 -0
  124. package/dist/test-runtime.d.ts +526 -0
  125. package/dist/test-runtime.js +2119 -0
  126. package/dist/vm-config.d.ts +31 -0
  127. package/dist/vm-config.js +1 -0
  128. package/fixtures/alpine-defaults.json +520 -0
  129. package/fixtures/base-filesystem.json +528 -0
  130. package/package.json +193 -115
  131. package/LICENSE +0 -191
  132. package/dist/bridge-setup.d.ts +0 -6
  133. package/dist/bridge-setup.js +0 -9
  134. package/dist/esm-compiler.d.ts +0 -18
  135. package/dist/esm-compiler.js +0 -72
  136. package/dist/fs-helpers.d.ts +0 -23
  137. package/dist/fs-helpers.js +0 -41
  138. package/dist/generated/isolate-runtime.d.ts +0 -19
  139. package/dist/generated/isolate-runtime.js +0 -21
  140. package/dist/generated/polyfills.d.ts +0 -82
  141. package/dist/generated/polyfills.js +0 -82
  142. package/dist/isolate-runtime/apply-custom-global-policy.js +0 -53
  143. package/dist/isolate-runtime/apply-timing-mitigation-freeze.js +0 -130
  144. package/dist/isolate-runtime/apply-timing-mitigation-off.js +0 -14
  145. package/dist/isolate-runtime/bridge-attach.js +0 -29
  146. package/dist/isolate-runtime/bridge-initial-globals.js +0 -385
  147. package/dist/isolate-runtime/eval-script-result.js +0 -8
  148. package/dist/isolate-runtime/global-exposure-helpers.js +0 -36
  149. package/dist/isolate-runtime/init-commonjs-module-globals.js +0 -28
  150. package/dist/isolate-runtime/override-process-cwd.js +0 -8
  151. package/dist/isolate-runtime/override-process-env.js +0 -8
  152. package/dist/isolate-runtime/require-setup.js +0 -4153
  153. package/dist/isolate-runtime/set-commonjs-file-globals.js +0 -36
  154. package/dist/isolate-runtime/set-stdin-data.js +0 -10
  155. package/dist/isolate-runtime/setup-dynamic-import.js +0 -123
  156. package/dist/isolate-runtime/setup-fs-facade.js +0 -87
  157. package/dist/kernel/command-registry.d.ts +0 -44
  158. package/dist/kernel/command-registry.js +0 -114
  159. package/dist/kernel/device-backend.d.ts +0 -14
  160. package/dist/kernel/device-backend.js +0 -251
  161. package/dist/kernel/device-layer.d.ts +0 -12
  162. package/dist/kernel/device-layer.js +0 -271
  163. package/dist/kernel/dns-cache.d.ts +0 -29
  164. package/dist/kernel/dns-cache.js +0 -52
  165. package/dist/kernel/fd-table.d.ts +0 -84
  166. package/dist/kernel/fd-table.js +0 -278
  167. package/dist/kernel/file-lock.d.ts +0 -34
  168. package/dist/kernel/file-lock.js +0 -122
  169. package/dist/kernel/host-adapter.d.ts +0 -50
  170. package/dist/kernel/host-adapter.js +0 -8
  171. package/dist/kernel/index.d.ts +0 -36
  172. package/dist/kernel/index.js +0 -34
  173. package/dist/kernel/kernel.d.ts +0 -9
  174. package/dist/kernel/kernel.js +0 -1415
  175. package/dist/kernel/mount-table.d.ts +0 -75
  176. package/dist/kernel/mount-table.js +0 -353
  177. package/dist/kernel/permissions.d.ts +0 -36
  178. package/dist/kernel/permissions.js +0 -150
  179. package/dist/kernel/pipe-manager.d.ts +0 -64
  180. package/dist/kernel/pipe-manager.js +0 -267
  181. package/dist/kernel/proc-backend.d.ts +0 -30
  182. package/dist/kernel/proc-backend.js +0 -428
  183. package/dist/kernel/proc-layer.d.ts +0 -11
  184. package/dist/kernel/proc-layer.js +0 -507
  185. package/dist/kernel/process-table.d.ts +0 -126
  186. package/dist/kernel/process-table.js +0 -651
  187. package/dist/kernel/pty.d.ts +0 -109
  188. package/dist/kernel/pty.js +0 -552
  189. package/dist/kernel/socket-table.d.ts +0 -312
  190. package/dist/kernel/socket-table.js +0 -1188
  191. package/dist/kernel/timer-table.d.ts +0 -54
  192. package/dist/kernel/timer-table.js +0 -108
  193. package/dist/kernel/types.d.ts +0 -541
  194. package/dist/kernel/types.js +0 -98
  195. package/dist/kernel/user.d.ts +0 -29
  196. package/dist/kernel/user.js +0 -35
  197. package/dist/kernel/vfs.d.ts +0 -82
  198. package/dist/kernel/vfs.js +0 -25
  199. package/dist/kernel/wait.d.ts +0 -45
  200. package/dist/kernel/wait.js +0 -112
  201. package/dist/kernel/wstatus.d.ts +0 -21
  202. package/dist/kernel/wstatus.js +0 -33
  203. package/dist/module-resolver.d.ts +0 -29
  204. package/dist/module-resolver.js +0 -314
  205. package/dist/package-bundler.d.ts +0 -41
  206. package/dist/package-bundler.js +0 -497
  207. package/dist/runtime-driver.d.ts +0 -66
  208. package/dist/shared/api-types.d.ts +0 -83
  209. package/dist/shared/bridge-contract.d.ts +0 -772
  210. package/dist/shared/bridge-contract.js +0 -169
  211. package/dist/shared/console-formatter.d.ts +0 -22
  212. package/dist/shared/console-formatter.js +0 -161
  213. package/dist/shared/constants.d.ts +0 -3
  214. package/dist/shared/constants.js +0 -3
  215. package/dist/shared/errors.d.ts +0 -16
  216. package/dist/shared/errors.js +0 -21
  217. package/dist/shared/esm-utils.d.ts +0 -28
  218. package/dist/shared/esm-utils.js +0 -97
  219. package/dist/shared/global-exposure.d.ts +0 -38
  220. package/dist/shared/global-exposure.js +0 -876
  221. package/dist/shared/in-memory-fs.d.ts +0 -16
  222. package/dist/shared/in-memory-fs.js +0 -115
  223. package/dist/shared/permissions.d.ts +0 -36
  224. package/dist/shared/permissions.js +0 -314
  225. package/dist/shared/require-setup.d.ts +0 -6
  226. package/dist/shared/require-setup.js +0 -9
  227. package/dist/test/block-store-conformance.d.ts +0 -34
  228. package/dist/test/block-store-conformance.js +0 -251
  229. package/dist/test/metadata-store-conformance.d.ts +0 -37
  230. package/dist/test/metadata-store-conformance.js +0 -646
  231. package/dist/test/vfs-conformance.d.ts +0 -65
  232. package/dist/test/vfs-conformance.js +0 -842
  233. package/dist/types.d.ts +0 -98
  234. package/dist/types.js +0 -6
  235. package/dist/vfs/chunked-vfs.d.ts +0 -66
  236. package/dist/vfs/chunked-vfs.js +0 -1290
  237. package/dist/vfs/host-block-store.d.ts +0 -19
  238. package/dist/vfs/host-block-store.js +0 -97
  239. package/dist/vfs/memory-block-store.d.ts +0 -16
  240. package/dist/vfs/memory-block-store.js +0 -45
  241. package/dist/vfs/memory-metadata.d.ts +0 -75
  242. package/dist/vfs/memory-metadata.js +0 -528
  243. package/dist/vfs/sqlite-metadata.d.ts +0 -91
  244. package/dist/vfs/sqlite-metadata.js +0 -582
  245. package/dist/vfs/types.d.ts +0 -210
  246. package/dist/vfs/types.js +0 -8
  247. /package/dist/{runtime-driver.js → generated/CreateVmConfig.js} +0 -0
  248. /package/dist/{shared/api-types.js → generated/FsPermissionRule.js} +0 -0
@@ -1,267 +0,0 @@
1
- /**
2
- * Pipe manager.
3
- *
4
- * Creates and manages pipes for inter-process communication.
5
- * Supports cross-runtime pipes: data flows through kernel-managed buffers.
6
- * SharedArrayBuffer ring buffers are deferred — this uses buffered pipes.
7
- */
8
- import { FILETYPE_PIPE, O_NONBLOCK, O_RDONLY, O_WRONLY, KernelError } from "./types.js";
9
- import { WaitQueue } from "./wait.js";
10
- /** Maximum buffered bytes per pipe before writers block or O_NONBLOCK returns EAGAIN. */
11
- export const MAX_PIPE_BUFFER_BYTES = 65_536; // 64 KB — matches Linux default
12
- export class PipeManager {
13
- pipes = new Map();
14
- /** Map description ID → pipe ID for routing reads/writes */
15
- descToPipe = new Map();
16
- nextPipeId = 1;
17
- nextDescId = 100_000; // High range to avoid FD table collisions
18
- /** Called before EPIPE when a write hits a closed read end. Receives writer PID. */
19
- onBrokenPipe = null;
20
- /**
21
- * Create a pipe. Returns two FileDescriptions:
22
- * one for reading and one for writing.
23
- */
24
- createPipe() {
25
- const id = this.nextPipeId++;
26
- const readDesc = {
27
- id: this.nextDescId++,
28
- path: `pipe:${id}:read`,
29
- cursor: 0n,
30
- flags: O_RDONLY,
31
- refCount: 0, // Not in any FD table yet — openWith() will bump
32
- };
33
- const writeDesc = {
34
- id: this.nextDescId++,
35
- path: `pipe:${id}:write`,
36
- cursor: 0n,
37
- flags: O_WRONLY,
38
- refCount: 0, // Not in any FD table yet — openWith() will bump
39
- };
40
- const state = {
41
- id,
42
- buffer: [],
43
- closed: { read: false, write: false },
44
- readDescription: readDesc,
45
- writeDescription: writeDesc,
46
- readWaiters: [],
47
- writeWaiters: new WaitQueue(),
48
- pollWaiters: new WaitQueue(),
49
- };
50
- this.pipes.set(id, state);
51
- this.descToPipe.set(readDesc.id, { pipeId: id, end: "read" });
52
- this.descToPipe.set(writeDesc.id, { pipeId: id, end: "write" });
53
- return {
54
- read: { description: readDesc, filetype: FILETYPE_PIPE },
55
- write: { description: writeDesc, filetype: FILETYPE_PIPE },
56
- };
57
- }
58
- /** Write data to a pipe's write end. Delivers SIGPIPE via onBrokenPipe when read end is closed. */
59
- write(descriptionId, data, writerPid) {
60
- const ref = this.descToPipe.get(descriptionId);
61
- if (!ref || ref.end !== "write")
62
- throw new KernelError("EBADF", "not a pipe write end");
63
- const state = this.pipes.get(ref.pipeId);
64
- if (!state)
65
- throw new KernelError("EBADF", "pipe not found");
66
- const nonBlocking = (state.writeDescription.flags & O_NONBLOCK) !== 0;
67
- const written = this.writeAvailable(state, data, writerPid);
68
- if (written === data.length) {
69
- return data.length;
70
- }
71
- if (nonBlocking) {
72
- if (written === 0) {
73
- throw new KernelError("EAGAIN", "pipe buffer full");
74
- }
75
- return written;
76
- }
77
- return this.writeBlocking(state, data, written, writerPid);
78
- }
79
- /** Read data from a pipe's read end. Returns null on EOF. */
80
- read(descriptionId, length) {
81
- const ref = this.descToPipe.get(descriptionId);
82
- if (!ref || ref.end !== "read")
83
- throw new KernelError("EBADF", "not a pipe read end");
84
- const state = this.pipes.get(ref.pipeId);
85
- if (!state)
86
- throw new KernelError("EBADF", "pipe not found");
87
- // Data available in buffer
88
- if (state.buffer.length > 0) {
89
- const data = this.drainBuffer(state, length);
90
- state.writeWaiters.wakeOne();
91
- state.pollWaiters.wakeAll();
92
- return Promise.resolve(data);
93
- }
94
- // Write end closed — EOF
95
- if (state.closed.write) {
96
- return Promise.resolve(null);
97
- }
98
- // Block until data or EOF
99
- return new Promise((resolve) => {
100
- state.readWaiters.push(resolve);
101
- });
102
- }
103
- /** Close one end of a pipe. */
104
- close(descriptionId) {
105
- const ref = this.descToPipe.get(descriptionId);
106
- if (!ref)
107
- return;
108
- const state = this.pipes.get(ref.pipeId);
109
- if (!state)
110
- return;
111
- if (ref.end === "read") {
112
- state.closed.read = true;
113
- state.writeWaiters.wakeAll();
114
- }
115
- else {
116
- state.closed.write = true;
117
- // Notify any blocked readers with EOF
118
- for (const waiter of state.readWaiters) {
119
- waiter(null);
120
- }
121
- state.readWaiters.length = 0;
122
- state.writeWaiters.wakeAll();
123
- }
124
- state.pollWaiters.wakeAll();
125
- this.descToPipe.delete(descriptionId);
126
- // Clean up when both ends are closed
127
- if (state.closed.read && state.closed.write) {
128
- this.pipes.delete(ref.pipeId);
129
- }
130
- }
131
- /** Check if a description ID belongs to a pipe */
132
- isPipe(descriptionId) {
133
- return this.descToPipe.has(descriptionId);
134
- }
135
- /** Query poll state for a pipe end (used by poll/select syscalls). */
136
- pollState(descriptionId) {
137
- const ref = this.descToPipe.get(descriptionId);
138
- if (!ref)
139
- return null;
140
- const state = this.pipes.get(ref.pipeId);
141
- if (!state)
142
- return null;
143
- if (ref.end === "read") {
144
- const hasData = this.bufferSize(state) > 0;
145
- return {
146
- readable: hasData || state.closed.write,
147
- writable: false,
148
- hangup: state.closed.write,
149
- };
150
- }
151
- else {
152
- return {
153
- readable: false,
154
- writable: !state.closed.read && this.bufferSize(state) < MAX_PIPE_BUFFER_BYTES,
155
- hangup: state.closed.read,
156
- };
157
- }
158
- }
159
- /** Get the pipe ID for a description, or undefined if not a pipe */
160
- pipeIdFor(descriptionId) {
161
- return this.descToPipe.get(descriptionId)?.pipeId;
162
- }
163
- /** Wait for a pipe poll state change (data, capacity, or hangup). */
164
- async waitForPoll(descriptionId, timeoutMs) {
165
- const ref = this.descToPipe.get(descriptionId);
166
- if (!ref)
167
- throw new KernelError("EBADF", "not a pipe description");
168
- const state = this.pipes.get(ref.pipeId);
169
- if (!state)
170
- throw new KernelError("EBADF", "pipe not found");
171
- const handle = state.pollWaiters.enqueue(timeoutMs);
172
- try {
173
- await handle.wait();
174
- }
175
- finally {
176
- state.pollWaiters.remove(handle);
177
- }
178
- }
179
- /**
180
- * Create pipe FDs in the given FD table.
181
- * Returns the FD numbers for {read, write}.
182
- */
183
- createPipeFDs(fdTable) {
184
- const { read, write } = this.createPipe();
185
- const readFd = fdTable.openWith(read.description, read.filetype);
186
- const writeFd = fdTable.openWith(write.description, write.filetype);
187
- return { readFd, writeFd };
188
- }
189
- bufferSize(state) {
190
- let size = 0;
191
- for (const chunk of state.buffer)
192
- size += chunk.length;
193
- return size;
194
- }
195
- drainBuffer(state, length) {
196
- // Concatenate buffered chunks up to `length` bytes
197
- const chunks = [];
198
- let remaining = length;
199
- while (remaining > 0 && state.buffer.length > 0) {
200
- const chunk = state.buffer[0];
201
- if (chunk.length <= remaining) {
202
- chunks.push(chunk);
203
- remaining -= chunk.length;
204
- state.buffer.shift();
205
- }
206
- else {
207
- chunks.push(chunk.subarray(0, remaining));
208
- state.buffer[0] = chunk.subarray(remaining);
209
- remaining = 0;
210
- }
211
- }
212
- if (chunks.length === 1)
213
- return chunks[0];
214
- const total = chunks.reduce((sum, c) => sum + c.length, 0);
215
- const result = new Uint8Array(total);
216
- let offset = 0;
217
- for (const chunk of chunks) {
218
- result.set(chunk, offset);
219
- offset += chunk.length;
220
- }
221
- return result;
222
- }
223
- async writeBlocking(state, data, offset, writerPid) {
224
- while (offset < data.length) {
225
- const handle = state.writeWaiters.enqueue();
226
- try {
227
- await handle.wait();
228
- }
229
- finally {
230
- state.writeWaiters.remove(handle);
231
- }
232
- offset += this.writeAvailable(state, data.subarray(offset), writerPid);
233
- }
234
- return data.length;
235
- }
236
- writeAvailable(state, data, writerPid) {
237
- this.assertWriteOpen(state, writerPid);
238
- if (data.length === 0)
239
- return 0;
240
- // If readers are waiting, deliver directly without growing the buffer.
241
- if (state.readWaiters.length > 0 && state.buffer.length === 0) {
242
- const waiter = state.readWaiters.shift();
243
- waiter(new Uint8Array(data));
244
- state.pollWaiters.wakeAll();
245
- return data.length;
246
- }
247
- const capacity = MAX_PIPE_BUFFER_BYTES - this.bufferSize(state);
248
- if (capacity <= 0) {
249
- return 0;
250
- }
251
- const bytesToWrite = Math.min(capacity, data.length);
252
- state.buffer.push(new Uint8Array(data.subarray(0, bytesToWrite)));
253
- state.pollWaiters.wakeAll();
254
- return bytesToWrite;
255
- }
256
- assertWriteOpen(state, writerPid) {
257
- if (state.closed.write)
258
- throw new KernelError("EPIPE", "write end closed");
259
- if (state.closed.read) {
260
- // Deliver SIGPIPE before EPIPE (POSIX: signal first, then errno)
261
- if (writerPid !== undefined && this.onBrokenPipe) {
262
- this.onBrokenPipe(writerPid);
263
- }
264
- throw new KernelError("EPIPE", "read end closed");
265
- }
266
- }
267
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Proc backend.
3
- *
4
- * Standalone VirtualFileSystem that handles /proc paths.
5
- * Receives relative paths (e.g. "self/fd" not "/proc/self/fd").
6
- * Designed to be mounted at /proc via MountTable.
7
- */
8
- import type { FDTableManager } from "./fd-table.js";
9
- import type { MountEntry } from "./mount-table.js";
10
- import type { ProcessTable } from "./process-table.js";
11
- import type { VirtualFileSystem } from "./vfs.js";
12
- export interface ProcBackendOptions {
13
- processTable: ProcessTable;
14
- fdTableManager: FDTableManager;
15
- hostname?: string;
16
- mountTable?: {
17
- getMounts(): ReadonlyArray<MountEntry>;
18
- };
19
- }
20
- /**
21
- * Resolve /proc/self references to the given PID.
22
- * Paths are relative (no /proc prefix).
23
- */
24
- export declare function resolveProcSelfPath(path: string, pid: number): string;
25
- /**
26
- * Create a standalone proc backend VFS.
27
- * All paths are relative to /proc (e.g. "self/fd", "1/environ", "mounts").
28
- * Mount at /proc via MountTable.
29
- */
30
- export declare function createProcBackend(options: ProcBackendOptions): VirtualFileSystem;