@secure-exec/core 0.2.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.
- package/README.md +5 -5
- package/dist/binary.d.ts +4 -0
- package/dist/binary.js +25 -0
- package/dist/bytes.d.ts +2 -0
- package/dist/bytes.js +6 -0
- package/dist/callbacks.d.ts +41 -0
- package/dist/callbacks.js +94 -0
- package/dist/cargo.d.ts +2 -0
- package/dist/cargo.js +142 -0
- package/dist/correlation.d.ts +10 -0
- package/dist/correlation.js +49 -0
- package/dist/descriptors.d.ts +34 -0
- package/dist/descriptors.js +37 -0
- package/dist/event-buffer.d.ts +90 -0
- package/dist/event-buffer.js +313 -0
- package/dist/ext.d.ts +7 -0
- package/dist/ext.js +13 -0
- package/dist/filesystem.d.ts +41 -0
- package/dist/filesystem.js +70 -0
- package/dist/frame-payload-codec.d.ts +8 -0
- package/dist/frame-payload-codec.js +14 -0
- package/dist/frame-rpc.d.ts +38 -0
- package/dist/frame-rpc.js +73 -0
- package/dist/frame-stream.d.ts +27 -0
- package/dist/frame-stream.js +99 -0
- package/dist/framing.d.ts +7 -0
- package/dist/framing.js +22 -0
- package/dist/generated/AcpLimitsConfig.d.ts +4 -0
- package/dist/generated/AcpLimitsConfig.js +2 -0
- package/dist/generated/CreateVmConfig.d.ts +19 -0
- package/dist/generated/FsPermissionRule.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.js +1 -0
- package/dist/generated/FsPermissionScope.d.ts +3 -0
- package/dist/generated/FsPermissionScope.js +1 -0
- package/dist/generated/HttpLimitsConfig.d.ts +3 -0
- package/dist/generated/HttpLimitsConfig.js +2 -0
- package/dist/generated/JsModuleResolution.d.ts +1 -0
- package/dist/generated/JsModuleResolution.js +2 -0
- package/dist/generated/JsRuntimeConfig.d.ts +26 -0
- package/dist/generated/JsRuntimeConfig.js +1 -0
- package/dist/generated/JsRuntimeLimitsConfig.d.ts +7 -0
- package/dist/generated/JsRuntimeLimitsConfig.js +2 -0
- package/dist/generated/JsRuntimePlatform.d.ts +1 -0
- package/dist/generated/JsRuntimePlatform.js +2 -0
- package/dist/generated/MountPluginDescriptor.d.ts +4 -0
- package/dist/generated/MountPluginDescriptor.js +2 -0
- package/dist/generated/NativeRootFilesystemConfig.d.ts +5 -0
- package/dist/generated/NativeRootFilesystemConfig.js +1 -0
- package/dist/generated/PatternPermissionRule.d.ts +6 -0
- package/dist/generated/PatternPermissionRule.js +1 -0
- package/dist/generated/PatternPermissionRuleSet.d.ts +6 -0
- package/dist/generated/PatternPermissionRuleSet.js +1 -0
- package/dist/generated/PatternPermissionScope.d.ts +3 -0
- package/dist/generated/PatternPermissionScope.js +1 -0
- package/dist/generated/PermissionMode.d.ts +1 -0
- package/dist/generated/PermissionMode.js +2 -0
- package/dist/generated/PermissionsPolicy.d.ts +10 -0
- package/dist/generated/PermissionsPolicy.js +1 -0
- package/dist/generated/PluginLimitsConfig.d.ts +4 -0
- package/dist/generated/PluginLimitsConfig.js +2 -0
- package/dist/generated/PythonLimitsConfig.d.ts +5 -0
- package/dist/generated/PythonLimitsConfig.js +2 -0
- package/dist/generated/ResourceLimitsConfig.d.ts +22 -0
- package/dist/generated/ResourceLimitsConfig.js +2 -0
- package/dist/generated/RootFilesystemConfig.d.ts +9 -0
- package/dist/generated/RootFilesystemConfig.js +1 -0
- package/dist/generated/RootFilesystemEntry.d.ts +13 -0
- package/dist/generated/RootFilesystemEntry.js +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.js +2 -0
- package/dist/generated/RootFilesystemEntryKind.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryKind.js +2 -0
- package/dist/generated/RootFilesystemLowerDescriptor.d.ts +7 -0
- package/dist/generated/RootFilesystemLowerDescriptor.js +1 -0
- package/dist/generated/RootFilesystemMode.d.ts +1 -0
- package/dist/generated/RootFilesystemMode.js +2 -0
- package/dist/generated/ToolLimitsConfig.d.ts +10 -0
- package/dist/generated/ToolLimitsConfig.js +2 -0
- package/dist/generated/VmDnsConfig.d.ts +6 -0
- package/dist/generated/VmDnsConfig.js +2 -0
- package/dist/generated/VmLimitsConfig.d.ts +18 -0
- package/dist/generated/VmLimitsConfig.js +1 -0
- package/dist/generated/VmListenPolicyConfig.d.ts +5 -0
- package/dist/generated/VmListenPolicyConfig.js +2 -0
- package/dist/generated/WasmLimitsConfig.d.ts +5 -0
- package/dist/generated/WasmLimitsConfig.js +2 -0
- package/dist/generated-protocol.d.ts +1037 -0
- package/dist/generated-protocol.js +2887 -0
- package/dist/index.d.ts +24 -62
- package/dist/index.js +24 -53
- package/dist/json.d.ts +2 -0
- package/dist/json.js +20 -0
- package/dist/kernel-proxy.d.ts +149 -0
- package/dist/kernel-proxy.js +1733 -0
- package/dist/native-client.d.ts +41 -0
- package/dist/native-client.js +124 -0
- package/dist/node-runtime.d.ts +443 -0
- package/dist/node-runtime.js +569 -0
- package/dist/numbers.d.ts +1 -0
- package/dist/numbers.js +8 -0
- package/dist/ownership.d.ts +18 -0
- package/dist/ownership.js +77 -0
- package/dist/permissions.d.ts +29 -0
- package/dist/permissions.js +68 -0
- package/dist/process.d.ts +35 -0
- package/dist/process.js +125 -0
- package/dist/protocol-client.d.ts +46 -0
- package/dist/protocol-client.js +180 -0
- package/dist/protocol-frames.d.ts +68 -0
- package/dist/protocol-frames.js +139 -0
- package/dist/protocol-maps.d.ts +28 -0
- package/dist/protocol-maps.js +217 -0
- package/dist/protocol-schema.d.ts +10 -0
- package/dist/protocol-schema.js +11 -0
- package/dist/request-payloads.d.ts +137 -0
- package/dist/request-payloads.js +210 -0
- package/dist/response-payloads.d.ts +107 -0
- package/dist/response-payloads.js +161 -0
- package/dist/sidecar-client.d.ts +242 -0
- package/dist/sidecar-client.js +797 -0
- package/dist/state.d.ts +40 -0
- package/dist/state.js +44 -0
- package/dist/test-runtime.d.ts +526 -0
- package/dist/test-runtime.js +2119 -0
- package/dist/vm-config.d.ts +31 -0
- package/dist/vm-config.js +1 -0
- package/fixtures/alpine-defaults.json +520 -0
- package/fixtures/base-filesystem.json +528 -0
- package/package.json +193 -115
- package/LICENSE +0 -191
- package/dist/bridge-setup.d.ts +0 -6
- package/dist/bridge-setup.js +0 -9
- package/dist/esm-compiler.d.ts +0 -18
- package/dist/esm-compiler.js +0 -72
- package/dist/fs-helpers.d.ts +0 -23
- package/dist/fs-helpers.js +0 -41
- package/dist/generated/isolate-runtime.d.ts +0 -19
- package/dist/generated/isolate-runtime.js +0 -21
- package/dist/generated/polyfills.d.ts +0 -82
- package/dist/generated/polyfills.js +0 -82
- package/dist/isolate-runtime/apply-custom-global-policy.js +0 -53
- package/dist/isolate-runtime/apply-timing-mitigation-freeze.js +0 -130
- package/dist/isolate-runtime/apply-timing-mitigation-off.js +0 -14
- package/dist/isolate-runtime/bridge-attach.js +0 -29
- package/dist/isolate-runtime/bridge-initial-globals.js +0 -385
- package/dist/isolate-runtime/eval-script-result.js +0 -8
- package/dist/isolate-runtime/global-exposure-helpers.js +0 -36
- package/dist/isolate-runtime/init-commonjs-module-globals.js +0 -28
- package/dist/isolate-runtime/override-process-cwd.js +0 -8
- package/dist/isolate-runtime/override-process-env.js +0 -8
- package/dist/isolate-runtime/require-setup.js +0 -4153
- package/dist/isolate-runtime/set-commonjs-file-globals.js +0 -36
- package/dist/isolate-runtime/set-stdin-data.js +0 -10
- package/dist/isolate-runtime/setup-dynamic-import.js +0 -123
- package/dist/isolate-runtime/setup-fs-facade.js +0 -87
- package/dist/kernel/command-registry.d.ts +0 -44
- package/dist/kernel/command-registry.js +0 -114
- package/dist/kernel/device-backend.d.ts +0 -14
- package/dist/kernel/device-backend.js +0 -251
- package/dist/kernel/device-layer.d.ts +0 -12
- package/dist/kernel/device-layer.js +0 -271
- package/dist/kernel/dns-cache.d.ts +0 -29
- package/dist/kernel/dns-cache.js +0 -52
- package/dist/kernel/fd-table.d.ts +0 -84
- package/dist/kernel/fd-table.js +0 -278
- package/dist/kernel/file-lock.d.ts +0 -34
- package/dist/kernel/file-lock.js +0 -122
- package/dist/kernel/host-adapter.d.ts +0 -50
- package/dist/kernel/host-adapter.js +0 -8
- package/dist/kernel/index.d.ts +0 -36
- package/dist/kernel/index.js +0 -34
- package/dist/kernel/kernel.d.ts +0 -9
- package/dist/kernel/kernel.js +0 -1415
- package/dist/kernel/mount-table.d.ts +0 -75
- package/dist/kernel/mount-table.js +0 -353
- package/dist/kernel/permissions.d.ts +0 -36
- package/dist/kernel/permissions.js +0 -150
- package/dist/kernel/pipe-manager.d.ts +0 -64
- package/dist/kernel/pipe-manager.js +0 -267
- package/dist/kernel/proc-backend.d.ts +0 -30
- package/dist/kernel/proc-backend.js +0 -428
- package/dist/kernel/proc-layer.d.ts +0 -11
- package/dist/kernel/proc-layer.js +0 -507
- package/dist/kernel/process-table.d.ts +0 -126
- package/dist/kernel/process-table.js +0 -651
- package/dist/kernel/pty.d.ts +0 -109
- package/dist/kernel/pty.js +0 -552
- package/dist/kernel/socket-table.d.ts +0 -312
- package/dist/kernel/socket-table.js +0 -1188
- package/dist/kernel/timer-table.d.ts +0 -54
- package/dist/kernel/timer-table.js +0 -108
- package/dist/kernel/types.d.ts +0 -541
- package/dist/kernel/types.js +0 -98
- package/dist/kernel/user.d.ts +0 -29
- package/dist/kernel/user.js +0 -35
- package/dist/kernel/vfs.d.ts +0 -82
- package/dist/kernel/vfs.js +0 -25
- package/dist/kernel/wait.d.ts +0 -45
- package/dist/kernel/wait.js +0 -112
- package/dist/kernel/wstatus.d.ts +0 -21
- package/dist/kernel/wstatus.js +0 -33
- package/dist/module-resolver.d.ts +0 -29
- package/dist/module-resolver.js +0 -314
- package/dist/package-bundler.d.ts +0 -41
- package/dist/package-bundler.js +0 -497
- package/dist/runtime-driver.d.ts +0 -66
- package/dist/shared/api-types.d.ts +0 -83
- package/dist/shared/bridge-contract.d.ts +0 -772
- package/dist/shared/bridge-contract.js +0 -169
- package/dist/shared/console-formatter.d.ts +0 -22
- package/dist/shared/console-formatter.js +0 -161
- package/dist/shared/constants.d.ts +0 -3
- package/dist/shared/constants.js +0 -3
- package/dist/shared/errors.d.ts +0 -16
- package/dist/shared/errors.js +0 -21
- package/dist/shared/esm-utils.d.ts +0 -28
- package/dist/shared/esm-utils.js +0 -97
- package/dist/shared/global-exposure.d.ts +0 -38
- package/dist/shared/global-exposure.js +0 -876
- package/dist/shared/in-memory-fs.d.ts +0 -16
- package/dist/shared/in-memory-fs.js +0 -115
- package/dist/shared/permissions.d.ts +0 -36
- package/dist/shared/permissions.js +0 -314
- package/dist/shared/require-setup.d.ts +0 -6
- package/dist/shared/require-setup.js +0 -9
- package/dist/test/block-store-conformance.d.ts +0 -34
- package/dist/test/block-store-conformance.js +0 -251
- package/dist/test/metadata-store-conformance.d.ts +0 -37
- package/dist/test/metadata-store-conformance.js +0 -646
- package/dist/test/vfs-conformance.d.ts +0 -65
- package/dist/test/vfs-conformance.js +0 -842
- package/dist/types.d.ts +0 -98
- package/dist/types.js +0 -6
- package/dist/vfs/chunked-vfs.d.ts +0 -66
- package/dist/vfs/chunked-vfs.js +0 -1290
- package/dist/vfs/host-block-store.d.ts +0 -19
- package/dist/vfs/host-block-store.js +0 -97
- package/dist/vfs/memory-block-store.d.ts +0 -16
- package/dist/vfs/memory-block-store.js +0 -45
- package/dist/vfs/memory-metadata.d.ts +0 -75
- package/dist/vfs/memory-metadata.js +0 -528
- package/dist/vfs/sqlite-metadata.d.ts +0 -91
- package/dist/vfs/sqlite-metadata.js +0 -582
- package/dist/vfs/types.d.ts +0 -210
- package/dist/vfs/types.js +0 -8
- /package/dist/{runtime-driver.js → generated/CreateVmConfig.js} +0 -0
- /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;
|