@secure-exec/core 0.0.0-main.bccb3a2
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 +7 -0
- package/commands/[ +0 -0
- package/commands/_stubs +0 -0
- package/commands/arch +0 -0
- package/commands/awk +0 -0
- package/commands/b2sum +0 -0
- package/commands/base32 +0 -0
- package/commands/base64 +0 -0
- package/commands/basename +0 -0
- package/commands/basenc +0 -0
- package/commands/bash +0 -0
- package/commands/cat +0 -0
- package/commands/chcon +0 -0
- package/commands/chgrp +0 -0
- package/commands/chmod +0 -0
- package/commands/chown +0 -0
- package/commands/chroot +0 -0
- package/commands/cksum +0 -0
- package/commands/codex +0 -0
- package/commands/codex-exec +0 -0
- package/commands/column +0 -0
- package/commands/comm +0 -0
- package/commands/cp +0 -0
- package/commands/curl +0 -0
- package/commands/cut +0 -0
- package/commands/date +0 -0
- package/commands/dd +0 -0
- package/commands/df +0 -0
- package/commands/diff +0 -0
- package/commands/dir +0 -0
- package/commands/dircolors +0 -0
- package/commands/dirname +0 -0
- package/commands/du +0 -0
- package/commands/echo +0 -0
- package/commands/egrep +0 -0
- package/commands/env +0 -0
- package/commands/expand +0 -0
- package/commands/expr +0 -0
- package/commands/factor +0 -0
- package/commands/false +0 -0
- package/commands/fd +0 -0
- package/commands/fgrep +0 -0
- package/commands/file +0 -0
- package/commands/find +0 -0
- package/commands/fmt +0 -0
- package/commands/fold +0 -0
- package/commands/git +0 -0
- package/commands/grep +0 -0
- package/commands/groups +0 -0
- package/commands/gunzip +0 -0
- package/commands/gzip +0 -0
- package/commands/head +0 -0
- package/commands/hostid +0 -0
- package/commands/hostname +0 -0
- package/commands/http-test +0 -0
- package/commands/id +0 -0
- package/commands/install +0 -0
- package/commands/join +0 -0
- package/commands/jq +0 -0
- package/commands/kill +0 -0
- package/commands/link +0 -0
- package/commands/ln +0 -0
- package/commands/logname +0 -0
- package/commands/ls +0 -0
- package/commands/md5sum +0 -0
- package/commands/mkdir +0 -0
- package/commands/mkfifo +0 -0
- package/commands/mknod +0 -0
- package/commands/mktemp +0 -0
- package/commands/more +0 -0
- package/commands/mv +0 -0
- package/commands/nice +0 -0
- package/commands/nl +0 -0
- package/commands/nohup +0 -0
- package/commands/nproc +0 -0
- package/commands/numfmt +0 -0
- package/commands/od +0 -0
- package/commands/paste +0 -0
- package/commands/pathchk +0 -0
- package/commands/pinky +0 -0
- package/commands/printenv +0 -0
- package/commands/printf +0 -0
- package/commands/ptx +0 -0
- package/commands/pwd +0 -0
- package/commands/readlink +0 -0
- package/commands/realpath +0 -0
- package/commands/rev +0 -0
- package/commands/rg +0 -0
- package/commands/rm +0 -0
- package/commands/rmdir +0 -0
- package/commands/runcon +0 -0
- package/commands/sed +0 -0
- package/commands/seq +0 -0
- package/commands/sh +0 -0
- package/commands/sha1sum +0 -0
- package/commands/sha224sum +0 -0
- package/commands/sha256sum +0 -0
- package/commands/sha384sum +0 -0
- package/commands/sha512sum +0 -0
- package/commands/shred +0 -0
- package/commands/shuf +0 -0
- package/commands/sleep +0 -0
- package/commands/sort +0 -0
- package/commands/spawn-test-host +0 -0
- package/commands/split +0 -0
- package/commands/stat +0 -0
- package/commands/stdbuf +0 -0
- package/commands/strings +0 -0
- package/commands/stty +0 -0
- package/commands/sum +0 -0
- package/commands/sync +0 -0
- package/commands/tac +0 -0
- package/commands/tail +0 -0
- package/commands/tar +0 -0
- package/commands/tee +0 -0
- package/commands/test +0 -0
- package/commands/timeout +0 -0
- package/commands/touch +0 -0
- package/commands/tr +0 -0
- package/commands/tree +0 -0
- package/commands/true +0 -0
- package/commands/truncate +0 -0
- package/commands/tsort +0 -0
- package/commands/tty +0 -0
- package/commands/uname +0 -0
- package/commands/unexpand +0 -0
- package/commands/uniq +0 -0
- package/commands/unlink +0 -0
- package/commands/uptime +0 -0
- package/commands/users +0 -0
- package/commands/vdir +0 -0
- package/commands/wc +0 -0
- package/commands/which +0 -0
- package/commands/who +0 -0
- package/commands/whoami +0 -0
- package/commands/xargs +0 -0
- package/commands/xu +0 -0
- package/commands/yes +0 -0
- package/commands/yq +0 -0
- package/commands/zcat +0 -0
- 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/CreateVmConfig.js +1 -0
- package/dist/generated/FsPermissionRule.d.ts +6 -0
- package/dist/generated/FsPermissionRule.js +1 -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 +8 -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 +6 -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 +26 -0
- package/dist/index.js +25 -0
- package/dist/json.d.ts +2 -0
- package/dist/json.js +20 -0
- package/dist/kernel-proxy.d.ts +151 -0
- package/dist/kernel-proxy.js +1737 -0
- package/dist/native-client.d.ts +41 -0
- package/dist/native-client.js +124 -0
- package/dist/node-runtime.d.ts +516 -0
- package/dist/node-runtime.js +794 -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 +534 -0
- package/dist/test-runtime.js +2146 -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 +197 -0
package/dist/ext.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { toExactArrayBuffer } from "./bytes.js";
|
|
2
|
+
export function toGeneratedExtEnvelope(envelope) {
|
|
3
|
+
return {
|
|
4
|
+
namespace: envelope.namespace,
|
|
5
|
+
payload: toExactArrayBuffer(envelope.payload),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function fromGeneratedExtEnvelope(envelope) {
|
|
9
|
+
return {
|
|
10
|
+
namespace: envelope.namespace,
|
|
11
|
+
payload: Buffer.from(envelope.payload),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as protocol from "./generated-protocol.js";
|
|
2
|
+
import { type LiveRootFilesystemEntryEncoding } from "./protocol-maps.js";
|
|
3
|
+
export type { LiveRootFilesystemEntryEncoding } from "./protocol-maps.js";
|
|
4
|
+
export type GuestFilesystemContentEncoding = "utf8" | "base64";
|
|
5
|
+
export interface GuestFilesystemContentResult {
|
|
6
|
+
path: string;
|
|
7
|
+
content?: string;
|
|
8
|
+
encoding?: GuestFilesystemContentEncoding;
|
|
9
|
+
}
|
|
10
|
+
export type LiveRootFilesystemEntry = {
|
|
11
|
+
path: string;
|
|
12
|
+
kind: "file" | "directory" | "symlink";
|
|
13
|
+
mode?: number;
|
|
14
|
+
uid?: number;
|
|
15
|
+
gid?: number;
|
|
16
|
+
content?: string;
|
|
17
|
+
encoding?: LiveRootFilesystemEntryEncoding;
|
|
18
|
+
target?: string;
|
|
19
|
+
executable?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export type LiveRootFilesystemLowerDescriptor = {
|
|
22
|
+
kind: "snapshot";
|
|
23
|
+
entries: LiveRootFilesystemEntry[];
|
|
24
|
+
} | {
|
|
25
|
+
kind: "bundled_base_filesystem";
|
|
26
|
+
};
|
|
27
|
+
export type LiveRootFilesystemDescriptor = {
|
|
28
|
+
mode?: "ephemeral" | "read_only";
|
|
29
|
+
disable_default_base_layer?: boolean;
|
|
30
|
+
lowers?: LiveRootFilesystemLowerDescriptor[];
|
|
31
|
+
bootstrap_entries?: LiveRootFilesystemEntry[];
|
|
32
|
+
};
|
|
33
|
+
export declare function encodeGuestFilesystemContent(content: string | Uint8Array): {
|
|
34
|
+
content: string;
|
|
35
|
+
encoding?: GuestFilesystemContentEncoding;
|
|
36
|
+
};
|
|
37
|
+
export declare function decodeGuestFilesystemContent(response: GuestFilesystemContentResult): Uint8Array;
|
|
38
|
+
export declare function toGeneratedRootFilesystemDescriptor(descriptor: LiveRootFilesystemDescriptor): protocol.RootFilesystemDescriptor;
|
|
39
|
+
export declare function toGeneratedRootFilesystemLower(lower: LiveRootFilesystemLowerDescriptor): protocol.RootFilesystemLowerDescriptor;
|
|
40
|
+
export declare function toGeneratedRootFilesystemEntry(entry: LiveRootFilesystemEntry): protocol.RootFilesystemEntry;
|
|
41
|
+
export declare function fromGeneratedRootFilesystemEntry(entry: protocol.RootFilesystemEntry): LiveRootFilesystemEntry;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { fromGeneratedRootFilesystemEntryEncoding, fromGeneratedRootFilesystemEntryKind, toGeneratedRootFilesystemEntryEncoding, toGeneratedRootFilesystemEntryKind, toGeneratedRootFilesystemMode, } from "./protocol-maps.js";
|
|
2
|
+
export function encodeGuestFilesystemContent(content) {
|
|
3
|
+
if (typeof content === "string") {
|
|
4
|
+
return { content };
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
content: Buffer.from(content).toString("base64"),
|
|
8
|
+
encoding: "base64",
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function decodeGuestFilesystemContent(response) {
|
|
12
|
+
if (response.content === undefined) {
|
|
13
|
+
throw new Error(`sidecar returned no file content for ${response.path}`);
|
|
14
|
+
}
|
|
15
|
+
if (response.encoding === "base64") {
|
|
16
|
+
return Buffer.from(response.content, "base64");
|
|
17
|
+
}
|
|
18
|
+
return Buffer.from(response.content, "utf8");
|
|
19
|
+
}
|
|
20
|
+
export function toGeneratedRootFilesystemDescriptor(descriptor) {
|
|
21
|
+
return {
|
|
22
|
+
mode: toGeneratedRootFilesystemMode(descriptor.mode ?? "ephemeral"),
|
|
23
|
+
disableDefaultBaseLayer: descriptor.disable_default_base_layer ?? false,
|
|
24
|
+
lowers: (descriptor.lowers ?? []).map(toGeneratedRootFilesystemLower),
|
|
25
|
+
bootstrapEntries: (descriptor.bootstrap_entries ?? []).map(toGeneratedRootFilesystemEntry),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function toGeneratedRootFilesystemLower(lower) {
|
|
29
|
+
switch (lower.kind) {
|
|
30
|
+
case "snapshot":
|
|
31
|
+
return {
|
|
32
|
+
tag: "SnapshotRootFilesystemLower",
|
|
33
|
+
val: {
|
|
34
|
+
entries: (lower.entries ?? []).map(toGeneratedRootFilesystemEntry),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
case "bundled_base_filesystem":
|
|
38
|
+
return { tag: "BundledBaseFilesystemLower", val: null };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function toGeneratedRootFilesystemEntry(entry) {
|
|
42
|
+
return {
|
|
43
|
+
path: entry.path,
|
|
44
|
+
kind: toGeneratedRootFilesystemEntryKind(entry.kind),
|
|
45
|
+
mode: entry.mode ?? null,
|
|
46
|
+
uid: entry.uid ?? null,
|
|
47
|
+
gid: entry.gid ?? null,
|
|
48
|
+
content: entry.content ?? null,
|
|
49
|
+
encoding: entry.encoding === undefined
|
|
50
|
+
? null
|
|
51
|
+
: toGeneratedRootFilesystemEntryEncoding(entry.encoding),
|
|
52
|
+
target: entry.target ?? null,
|
|
53
|
+
executable: entry.executable ?? false,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function fromGeneratedRootFilesystemEntry(entry) {
|
|
57
|
+
return {
|
|
58
|
+
path: entry.path,
|
|
59
|
+
kind: fromGeneratedRootFilesystemEntryKind(entry.kind),
|
|
60
|
+
...(entry.mode !== null ? { mode: entry.mode } : {}),
|
|
61
|
+
...(entry.uid !== null ? { uid: entry.uid } : {}),
|
|
62
|
+
...(entry.gid !== null ? { gid: entry.gid } : {}),
|
|
63
|
+
...(entry.content !== null ? { content: entry.content } : {}),
|
|
64
|
+
...(entry.encoding !== null
|
|
65
|
+
? { encoding: fromGeneratedRootFilesystemEntryEncoding(entry.encoding) }
|
|
66
|
+
: {}),
|
|
67
|
+
...(entry.target !== null ? { target: entry.target } : {}),
|
|
68
|
+
executable: entry.executable,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type TransportPayloadCodec = "bare" | "json";
|
|
2
|
+
export declare function encodeJsonFramePayload(frame: unknown): Buffer;
|
|
3
|
+
export declare function decodeJsonFramePayload<TFrame extends {
|
|
4
|
+
payload?: {
|
|
5
|
+
type?: string;
|
|
6
|
+
chunk?: unknown;
|
|
7
|
+
};
|
|
8
|
+
}>(payload: Uint8Array): TFrame;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function encodeJsonFramePayload(frame) {
|
|
2
|
+
// BARE `data` fields are Uint8Array; JSON.stringify renders those as objects, so encode them
|
|
3
|
+
// as number arrays to match serde_json's Vec<u8> representation on the Rust side.
|
|
4
|
+
return Buffer.from(JSON.stringify(frame, (_key, value) => value instanceof Uint8Array ? Array.from(value) : value), "utf8");
|
|
5
|
+
}
|
|
6
|
+
export function decodeJsonFramePayload(payload) {
|
|
7
|
+
const frame = JSON.parse(Buffer.from(payload).toString("utf8"));
|
|
8
|
+
const decodedPayload = frame.payload;
|
|
9
|
+
if (decodedPayload?.type === "process_output" &&
|
|
10
|
+
Array.isArray(decodedPayload.chunk)) {
|
|
11
|
+
decodedPayload.chunk = Uint8Array.from(decodedPayload.chunk);
|
|
12
|
+
}
|
|
13
|
+
return frame;
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
export type ClassifiedFrame<TResponseFrame, TEventFrame, TSidecarRequestFrame> = {
|
|
3
|
+
kind: "response";
|
|
4
|
+
requestId: number;
|
|
5
|
+
frame: TResponseFrame;
|
|
6
|
+
} | {
|
|
7
|
+
kind: "event";
|
|
8
|
+
frame: TEventFrame;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "sidecarRequest";
|
|
11
|
+
frame: TSidecarRequestFrame;
|
|
12
|
+
};
|
|
13
|
+
export interface FrameRpcTransportOptions<TReadFrame, TWriteFrame, TResponseFrame, TEventFrame, TSidecarRequestFrame> {
|
|
14
|
+
stdin: Writable;
|
|
15
|
+
stdout: Readable;
|
|
16
|
+
encodeFrame: (frame: TWriteFrame) => Uint8Array;
|
|
17
|
+
decodeFrame: (payload: Uint8Array) => TReadFrame;
|
|
18
|
+
classifyFrame: (frame: TReadFrame) => ClassifiedFrame<TResponseFrame, TEventFrame, TSidecarRequestFrame>;
|
|
19
|
+
}
|
|
20
|
+
export declare class FrameRpcTransport<TReadFrame, TWriteFrame, TResponseFrame, TEventFrame, TSidecarRequestFrame> {
|
|
21
|
+
private readonly frameTransport;
|
|
22
|
+
private readonly pendingResponses;
|
|
23
|
+
private readonly eventListeners;
|
|
24
|
+
private readonly sidecarRequestListeners;
|
|
25
|
+
constructor(options: FrameRpcTransportOptions<TReadFrame, TWriteFrame, TResponseFrame, TEventFrame, TSidecarRequestFrame>);
|
|
26
|
+
onEvent(handler: (event: TEventFrame) => void): () => void;
|
|
27
|
+
onSidecarRequest(handler: (request: TSidecarRequestFrame) => void): () => void;
|
|
28
|
+
onError(handler: (error: Error) => void): () => void;
|
|
29
|
+
onEnd(handler: () => void): () => void;
|
|
30
|
+
sendFrame(requestId: number, frame: TWriteFrame, options: {
|
|
31
|
+
timeoutMs: number;
|
|
32
|
+
timeoutMessage: () => string;
|
|
33
|
+
}): Promise<TResponseFrame>;
|
|
34
|
+
writeFrame(frame: TWriteFrame): Promise<void>;
|
|
35
|
+
rejectAll(error: Error): void;
|
|
36
|
+
dispose(): void;
|
|
37
|
+
private dispatchFrame;
|
|
38
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PendingResponseRegistry } from "./correlation.js";
|
|
2
|
+
import { StdioFrameTransport } from "./frame-stream.js";
|
|
3
|
+
export class FrameRpcTransport {
|
|
4
|
+
frameTransport;
|
|
5
|
+
pendingResponses = new PendingResponseRegistry();
|
|
6
|
+
eventListeners = new Set();
|
|
7
|
+
sidecarRequestListeners = new Set();
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.frameTransport = new StdioFrameTransport({
|
|
10
|
+
stdin: options.stdin,
|
|
11
|
+
stdout: options.stdout,
|
|
12
|
+
encodeFrame: options.encodeFrame,
|
|
13
|
+
decodeFrame: options.decodeFrame,
|
|
14
|
+
});
|
|
15
|
+
this.frameTransport.onFrame((frame) => {
|
|
16
|
+
this.dispatchFrame(options.classifyFrame(frame));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
onEvent(handler) {
|
|
20
|
+
this.eventListeners.add(handler);
|
|
21
|
+
return () => {
|
|
22
|
+
this.eventListeners.delete(handler);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
onSidecarRequest(handler) {
|
|
26
|
+
this.sidecarRequestListeners.add(handler);
|
|
27
|
+
return () => {
|
|
28
|
+
this.sidecarRequestListeners.delete(handler);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
onError(handler) {
|
|
32
|
+
return this.frameTransport.onError(handler);
|
|
33
|
+
}
|
|
34
|
+
onEnd(handler) {
|
|
35
|
+
return this.frameTransport.onEnd(handler);
|
|
36
|
+
}
|
|
37
|
+
async sendFrame(requestId, frame, options) {
|
|
38
|
+
const response = this.pendingResponses.waitForResponse(requestId, options);
|
|
39
|
+
void this.writeFrame(frame).catch((error) => {
|
|
40
|
+
this.pendingResponses.reject(requestId, error instanceof Error ? error : new Error(String(error)));
|
|
41
|
+
});
|
|
42
|
+
return await response;
|
|
43
|
+
}
|
|
44
|
+
async writeFrame(frame) {
|
|
45
|
+
await this.frameTransport.writeFrame(frame);
|
|
46
|
+
}
|
|
47
|
+
rejectAll(error) {
|
|
48
|
+
this.pendingResponses.rejectAll(error);
|
|
49
|
+
}
|
|
50
|
+
dispose() {
|
|
51
|
+
this.frameTransport.dispose();
|
|
52
|
+
this.pendingResponses.rejectAll(new Error("frame rpc transport disposed"));
|
|
53
|
+
this.eventListeners.clear();
|
|
54
|
+
this.sidecarRequestListeners.clear();
|
|
55
|
+
}
|
|
56
|
+
dispatchFrame(classified) {
|
|
57
|
+
switch (classified.kind) {
|
|
58
|
+
case "response":
|
|
59
|
+
this.pendingResponses.resolve(classified.requestId, classified.frame);
|
|
60
|
+
return;
|
|
61
|
+
case "event":
|
|
62
|
+
for (const listener of this.eventListeners) {
|
|
63
|
+
listener(classified.frame);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
case "sidecarRequest":
|
|
67
|
+
for (const listener of this.sidecarRequestListeners) {
|
|
68
|
+
listener(classified.frame);
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
export interface StdioFrameTransportOptions<TReadFrame, TWriteFrame> {
|
|
3
|
+
stdin: Writable;
|
|
4
|
+
stdout: Readable;
|
|
5
|
+
encodeFrame: (frame: TWriteFrame) => Uint8Array;
|
|
6
|
+
decodeFrame: (payload: Uint8Array) => TReadFrame;
|
|
7
|
+
}
|
|
8
|
+
export declare class StdioFrameTransport<TReadFrame, TWriteFrame = TReadFrame> {
|
|
9
|
+
private readonly stdin;
|
|
10
|
+
private readonly stdout;
|
|
11
|
+
private readonly encodeFrame;
|
|
12
|
+
private readonly decodeFrame;
|
|
13
|
+
private readonly frameListeners;
|
|
14
|
+
private readonly errorListeners;
|
|
15
|
+
private readonly endListeners;
|
|
16
|
+
private stdoutBuffer;
|
|
17
|
+
constructor(options: StdioFrameTransportOptions<TReadFrame, TWriteFrame>);
|
|
18
|
+
onFrame(handler: (frame: TReadFrame) => void): () => void;
|
|
19
|
+
onError(handler: (error: Error) => void): () => void;
|
|
20
|
+
onEnd(handler: () => void): () => void;
|
|
21
|
+
writeFrame(frame: TWriteFrame): Promise<void>;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
private readonly handleData;
|
|
24
|
+
private readonly handleEnd;
|
|
25
|
+
private readonly handleError;
|
|
26
|
+
private drainFrames;
|
|
27
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { encodeLengthPrefixedPayload, tryDecodeLengthPrefixedPayload, } from "./framing.js";
|
|
2
|
+
export class StdioFrameTransport {
|
|
3
|
+
stdin;
|
|
4
|
+
stdout;
|
|
5
|
+
encodeFrame;
|
|
6
|
+
decodeFrame;
|
|
7
|
+
frameListeners = new Set();
|
|
8
|
+
errorListeners = new Set();
|
|
9
|
+
endListeners = new Set();
|
|
10
|
+
stdoutBuffer = Buffer.alloc(0);
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.stdin = options.stdin;
|
|
13
|
+
this.stdout = options.stdout;
|
|
14
|
+
this.encodeFrame = options.encodeFrame;
|
|
15
|
+
this.decodeFrame = options.decodeFrame;
|
|
16
|
+
this.stdout.on("data", this.handleData);
|
|
17
|
+
this.stdout.on("end", this.handleEnd);
|
|
18
|
+
this.stdout.on("error", this.handleError);
|
|
19
|
+
}
|
|
20
|
+
onFrame(handler) {
|
|
21
|
+
this.frameListeners.add(handler);
|
|
22
|
+
return () => {
|
|
23
|
+
this.frameListeners.delete(handler);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
onError(handler) {
|
|
27
|
+
this.errorListeners.add(handler);
|
|
28
|
+
return () => {
|
|
29
|
+
this.errorListeners.delete(handler);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
onEnd(handler) {
|
|
33
|
+
this.endListeners.add(handler);
|
|
34
|
+
return () => {
|
|
35
|
+
this.endListeners.delete(handler);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async writeFrame(frame) {
|
|
39
|
+
const payload = this.encodeFrame(frame);
|
|
40
|
+
const encoded = encodeLengthPrefixedPayload(payload);
|
|
41
|
+
await new Promise((resolve, reject) => {
|
|
42
|
+
this.stdin.write(encoded, (error) => {
|
|
43
|
+
if (error) {
|
|
44
|
+
reject(error);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
resolve();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
dispose() {
|
|
52
|
+
this.stdout.off("data", this.handleData);
|
|
53
|
+
this.stdout.off("end", this.handleEnd);
|
|
54
|
+
this.stdout.off("error", this.handleError);
|
|
55
|
+
this.frameListeners.clear();
|
|
56
|
+
this.errorListeners.clear();
|
|
57
|
+
this.endListeners.clear();
|
|
58
|
+
}
|
|
59
|
+
handleData = (chunk) => {
|
|
60
|
+
const bytes = typeof chunk === "string"
|
|
61
|
+
? Buffer.from(chunk)
|
|
62
|
+
: Buffer.isBuffer(chunk)
|
|
63
|
+
? chunk
|
|
64
|
+
: Buffer.from(chunk);
|
|
65
|
+
this.stdoutBuffer = Buffer.concat([this.stdoutBuffer, bytes]);
|
|
66
|
+
this.drainFrames();
|
|
67
|
+
};
|
|
68
|
+
handleEnd = () => {
|
|
69
|
+
for (const listener of this.endListeners) {
|
|
70
|
+
listener();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
handleError = (error) => {
|
|
74
|
+
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
75
|
+
for (const listener of this.errorListeners) {
|
|
76
|
+
listener(normalized);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
drainFrames() {
|
|
80
|
+
for (;;) {
|
|
81
|
+
const decoded = tryDecodeLengthPrefixedPayload(this.stdoutBuffer);
|
|
82
|
+
if (!decoded) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.stdoutBuffer = decoded.remaining;
|
|
86
|
+
let frame;
|
|
87
|
+
try {
|
|
88
|
+
frame = this.decodeFrame(decoded.payload);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.handleError(error);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
for (const listener of this.frameListeners) {
|
|
95
|
+
listener(frame);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const LENGTH_PREFIX_BYTES = 4;
|
|
2
|
+
export interface LengthPrefixedPayload {
|
|
3
|
+
payload: Buffer;
|
|
4
|
+
remaining: Buffer;
|
|
5
|
+
}
|
|
6
|
+
export declare function encodeLengthPrefixedPayload(payload: Uint8Array): Buffer;
|
|
7
|
+
export declare function tryDecodeLengthPrefixedPayload(buffer: Uint8Array): LengthPrefixedPayload | null;
|
package/dist/framing.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const LENGTH_PREFIX_BYTES = 4;
|
|
2
|
+
export function encodeLengthPrefixedPayload(payload) {
|
|
3
|
+
const encoded = Buffer.allocUnsafe(LENGTH_PREFIX_BYTES + payload.length);
|
|
4
|
+
encoded.writeUInt32BE(payload.length, 0);
|
|
5
|
+
encoded.set(payload, LENGTH_PREFIX_BYTES);
|
|
6
|
+
return encoded;
|
|
7
|
+
}
|
|
8
|
+
export function tryDecodeLengthPrefixedPayload(buffer) {
|
|
9
|
+
const source = Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer);
|
|
10
|
+
if (source.length < LENGTH_PREFIX_BYTES) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const declaredLength = source.readUInt32BE(0);
|
|
14
|
+
const frameEnd = LENGTH_PREFIX_BYTES + declaredLength;
|
|
15
|
+
if (source.length < frameEnd) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
payload: source.subarray(LENGTH_PREFIX_BYTES, frameEnd),
|
|
20
|
+
remaining: source.subarray(frameEnd),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { JsRuntimeConfig } from "./JsRuntimeConfig.js";
|
|
2
|
+
import type { NativeRootFilesystemConfig } from "./NativeRootFilesystemConfig.js";
|
|
3
|
+
import type { PermissionsPolicy } from "./PermissionsPolicy.js";
|
|
4
|
+
import type { RootFilesystemConfig } from "./RootFilesystemConfig.js";
|
|
5
|
+
import type { VmDnsConfig } from "./VmDnsConfig.js";
|
|
6
|
+
import type { VmLimitsConfig } from "./VmLimitsConfig.js";
|
|
7
|
+
import type { VmListenPolicyConfig } from "./VmListenPolicyConfig.js";
|
|
8
|
+
export type CreateVmConfig = {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
env: Record<string, string>;
|
|
11
|
+
rootFilesystem: RootFilesystemConfig;
|
|
12
|
+
permissions?: PermissionsPolicy;
|
|
13
|
+
limits?: VmLimitsConfig;
|
|
14
|
+
dns?: VmDnsConfig;
|
|
15
|
+
nativeRoot?: NativeRootFilesystemConfig;
|
|
16
|
+
listen?: VmListenPolicyConfig;
|
|
17
|
+
loopbackExemptPorts: Array<number>;
|
|
18
|
+
jsRuntime?: JsRuntimeConfig;
|
|
19
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type JsModuleResolution = "node" | "relative" | "none";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { JsModuleResolution } from "./JsModuleResolution.js";
|
|
2
|
+
import type { JsRuntimePlatform } from "./JsRuntimePlatform.js";
|
|
3
|
+
/**
|
|
4
|
+
* Guest JavaScript host-environment configuration.
|
|
5
|
+
*
|
|
6
|
+
* Selects which globals/builtins/module-resolution surface guest JS sees,
|
|
7
|
+
* modeled on esbuild's `platform`. Omitting this preserves full Node.js
|
|
8
|
+
* emulation (`platform = node`).
|
|
9
|
+
*/
|
|
10
|
+
export type JsRuntimeConfig = {
|
|
11
|
+
/**
|
|
12
|
+
* Which host environment to emulate for guest JS. Default `node`.
|
|
13
|
+
*/
|
|
14
|
+
platform: JsRuntimePlatform;
|
|
15
|
+
/**
|
|
16
|
+
* How bare import specifiers resolve. Independent of `platform`.
|
|
17
|
+
* Default `node`.
|
|
18
|
+
*/
|
|
19
|
+
moduleResolution: JsModuleResolution;
|
|
20
|
+
/**
|
|
21
|
+
* Node builtin-module allow-list. Only valid when `platform = node`.
|
|
22
|
+
* `None` => engine default allow-list. `Some([])` => deny all builtins.
|
|
23
|
+
* `Some([..])` => exactly those.
|
|
24
|
+
*/
|
|
25
|
+
allowedBuiltins?: Array<string>;
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type JsRuntimePlatform = "node" | "browser" | "neutral" | "bare";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type PermissionMode = "allow" | "ask" | "deny";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FsPermissionScope } from "./FsPermissionScope.js";
|
|
2
|
+
import type { PatternPermissionScope } from "./PatternPermissionScope.js";
|
|
3
|
+
export type PermissionsPolicy = {
|
|
4
|
+
fs?: FsPermissionScope;
|
|
5
|
+
network?: PatternPermissionScope;
|
|
6
|
+
childProcess?: PatternPermissionScope;
|
|
7
|
+
process?: PatternPermissionScope;
|
|
8
|
+
env?: PatternPermissionScope;
|
|
9
|
+
tool?: PatternPermissionScope;
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|