@ai-ecoverse/slicc-kernel 1.102.6 → 1.103.0
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 +1 -1
- package/dist/kernel-worker.js +1 -1
- package/dist/node-process-worker.js +1 -1
- package/dist/node.js +1 -1
- package/dist/process-worker.js +1 -1
- package/dist/types/body-idle.d.ts +3 -0
- package/dist/types/bytes.d.ts +1 -0
- package/dist/types/cdp/facade.d.ts +27 -0
- package/dist/types/cdp/hosts.d.ts +14 -0
- package/dist/types/cdp/port.d.ts +24 -0
- package/dist/types/cdp/types.d.ts +12 -0
- package/dist/types/cdp/websocket.d.ts +61 -0
- package/dist/types/client/attach.d.ts +132 -0
- package/dist/types/client/dial-stream.d.ts +23 -0
- package/dist/types/client/loopback-fetch.d.ts +5 -0
- package/dist/types/client/protocol.d.ts +153 -0
- package/dist/types/client/serve-client.d.ts +18 -0
- package/dist/types/clipboard-relay.d.ts +25 -0
- package/dist/types/commands.d.ts +38 -0
- package/dist/types/cron/clock.d.ts +13 -0
- package/dist/types/driver.d.ts +3 -0
- package/dist/types/facade/hosts.d.ts +12 -0
- package/dist/types/facade/port.d.ts +16 -0
- package/dist/types/facade/types.d.ts +23 -0
- package/dist/types/fs/access.d.ts +29 -0
- package/dist/types/fs/attest.d.ts +41 -0
- package/dist/types/fs/changes.d.ts +19 -0
- package/dist/types/fs/commands.d.ts +4 -0
- package/dist/types/fs/dac.d.ts +64 -0
- package/dist/types/fs/dev-removal.d.ts +9 -0
- package/dist/types/fs/fresh-modules.d.ts +9 -0
- package/dist/types/fs/integrity.d.ts +53 -0
- package/dist/types/fs/meta.d.ts +85 -0
- package/dist/types/fs/opfs.d.ts +141 -0
- package/dist/types/fs/owners.d.ts +17 -0
- package/dist/types/fs/pages.d.ts +41 -0
- package/dist/types/fs/path-map.d.ts +16 -0
- package/dist/types/fs/physical-path.d.ts +14 -0
- package/dist/types/fs/protect.d.ts +27 -0
- package/dist/types/fs/ranged.d.ts +73 -0
- package/dist/types/fs/remote.d.ts +45 -0
- package/dist/types/fs/types.d.ts +115 -0
- package/dist/types/fs/unlinked.d.ts +75 -0
- package/dist/types/fs/view.d.ts +1 -0
- package/dist/types/fs/walk.d.ts +12 -0
- package/dist/types/fs/watch.d.ts +23 -0
- package/dist/types/index.d.ts +159 -0
- package/dist/types/integrity-relay.d.ts +18 -0
- package/dist/types/kernel/children.d.ts +90 -0
- package/dist/types/kernel/clipboard.d.ts +49 -0
- package/dist/types/kernel/cpu-clock.d.ts +56 -0
- package/dist/types/kernel/cred.d.ts +17 -0
- package/dist/types/kernel/dgram.d.ts +56 -0
- package/dist/types/kernel/dial.d.ts +20 -0
- package/dist/types/kernel/epoll.d.ts +67 -0
- package/dist/types/kernel/eventfd.d.ts +19 -0
- package/dist/types/kernel/exec-ticket.d.ts +25 -0
- package/dist/types/kernel/fd-table.d.ts +107 -0
- package/dist/types/kernel/host-ops.d.ts +98 -0
- package/dist/types/kernel/host.d.ts +116 -0
- package/dist/types/kernel/jobs.d.ts +50 -0
- package/dist/types/kernel/locks.d.ts +40 -0
- package/dist/types/kernel/net/datagram-wire.d.ts +8 -0
- package/dist/types/kernel/net/http-syscalls.d.ts +58 -0
- package/dist/types/kernel/net/http1.d.ts +48 -0
- package/dist/types/kernel/net/loopback-names.d.ts +14 -0
- package/dist/types/kernel/net/loopback-transport.d.ts +13 -0
- package/dist/types/kernel/net/network.d.ts +29 -0
- package/dist/types/kernel/net/proxy-service.d.ts +70 -0
- package/dist/types/kernel/net/realm-ca.d.ts +28 -0
- package/dist/types/kernel/net/redirect-hops.d.ts +5 -0
- package/dist/types/kernel/net/remote-transport.d.ts +98 -0
- package/dist/types/kernel/net/resolver.d.ts +29 -0
- package/dist/types/kernel/net/routes.d.ts +15 -0
- package/dist/types/kernel/net/tls-engine.d.ts +46 -0
- package/dist/types/kernel/net/tls-tunnel.d.ts +35 -0
- package/dist/types/kernel/net/transport.d.ts +64 -0
- package/dist/types/kernel/net/uplink-socket.d.ts +11 -0
- package/dist/types/kernel/net/uplink.d.ts +163 -0
- package/dist/types/kernel/net/ws-queue.d.ts +21 -0
- package/dist/types/kernel/net/ws-syscalls.d.ts +45 -0
- package/dist/types/kernel/net/x509.d.ts +34 -0
- package/dist/types/kernel/pipe.d.ts +29 -0
- package/dist/types/kernel/proc-info.d.ts +44 -0
- package/dist/types/kernel/process.d.ts +525 -0
- package/dist/types/kernel/protocol.d.ts +126 -0
- package/dist/types/kernel/pty.d.ts +84 -0
- package/dist/types/kernel/run-child.d.ts +39 -0
- package/dist/types/kernel/scrub-file.d.ts +13 -0
- package/dist/types/kernel/sealed.d.ts +74 -0
- package/dist/types/kernel/select.d.ts +7 -0
- package/dist/types/kernel/sem.d.ts +72 -0
- package/dist/types/kernel/settling.d.ts +16 -0
- package/dist/types/kernel/signals.d.ts +44 -0
- package/dist/types/kernel/socket-syscalls.d.ts +74 -0
- package/dist/types/kernel/socket.d.ts +125 -0
- package/dist/types/kernel/timer.d.ts +4 -0
- package/dist/types/kernel/tty.d.ts +53 -0
- package/dist/types/kernel/vfs-file.d.ts +149 -0
- package/dist/types/launcher.d.ts +359 -0
- package/dist/types/local-proxy-transport.d.ts +39 -0
- package/dist/types/meta.d.ts +11 -0
- package/dist/types/mount/chunked.d.ts +9 -0
- package/dist/types/mount/connection.d.ts +35 -0
- package/dist/types/mount/driver.d.ts +50 -0
- package/dist/types/mount/fsa.d.ts +26 -0
- package/dist/types/mount/fstab.d.ts +17 -0
- package/dist/types/mount/host.d.ts +24 -0
- package/dist/types/mount/hostfs.d.ts +129 -0
- package/dist/types/mount/media.d.ts +8 -0
- package/dist/types/mount/medium.d.ts +12 -0
- package/dist/types/mount/mount-fs.d.ts +136 -0
- package/dist/types/mount/protocol.d.ts +140 -0
- package/dist/types/mount/syscall.d.ts +27 -0
- package/dist/types/mount/tmpfs.d.ts +2 -0
- package/dist/types/node/loopback.d.ts +11 -0
- package/dist/types/node/memory-root.d.ts +2 -0
- package/dist/types/node/ws-diagnose.d.ts +4 -0
- package/dist/types/node.d.ts +85 -0
- package/dist/types/process/fd-metadata.d.ts +4 -0
- package/dist/types/process/js/async-sab.d.ts +15 -0
- package/dist/types/process/js/js-children.d.ts +63 -0
- package/dist/types/process/js/js-context.d.ts +133 -0
- package/dist/types/process/js/js-dev.d.ts +50 -0
- package/dist/types/process/js/js-exit.d.ts +15 -0
- package/dist/types/process/js/js-fetch.d.ts +2 -0
- package/dist/types/process/js/js-io.d.ts +81 -0
- package/dist/types/process/js/js-kernel.d.ts +61 -0
- package/dist/types/process/js/js-net.d.ts +42 -0
- package/dist/types/process/js/js-proc.d.ts +31 -0
- package/dist/types/process/js/js-run.d.ts +35 -0
- package/dist/types/process/js/js-sync.d.ts +86 -0
- package/dist/types/process/js/js-tty.d.ts +30 -0
- package/dist/types/process/js/js-websocket.d.ts +21 -0
- package/dist/types/process/kernel-streams.d.ts +196 -0
- package/dist/types/process/process-fds.d.ts +95 -0
- package/dist/types/process/process-locks.d.ts +29 -0
- package/dist/types/process/process-pty.d.ts +20 -0
- package/dist/types/process/process-signals.d.ts +33 -0
- package/dist/types/process/procfs.d.ts +41 -0
- package/dist/types/process/wasi/dylink.d.ts +9 -0
- package/dist/types/process/wasi/slicc-lock.d.ts +26 -0
- package/dist/types/process/wasi/slicc-sem.d.ts +3 -0
- package/dist/types/process/wasi/wasi-abi.d.ts +156 -0
- package/dist/types/process/wasi/wasi-fds.d.ts +130 -0
- package/dist/types/process/wasi/wasi-files.d.ts +99 -0
- package/dist/types/process/wasi/wasi-host.d.ts +104 -0
- package/dist/types/process/wasi/wasi-memory.d.ts +16 -0
- package/dist/types/process/wasi/wasi-module.d.ts +13 -0
- package/dist/types/process/wasi/wasi-poll.d.ts +13 -0
- package/dist/types/process/wasi/wasi-procfs.d.ts +36 -0
- package/dist/types/process/wasi/wasi-sigmask.d.ts +19 -0
- package/dist/types/process/wasi/wasi-signals.d.ts +43 -0
- package/dist/types/process/wasi/wasi-termios.d.ts +10 -0
- package/dist/types/process/wasi/wasix-fork.d.ts +63 -0
- package/dist/types/process/wasi/wasix-linker.d.ts +108 -0
- package/dist/types/process/wasi/wasix-sockets.d.ts +9 -0
- package/dist/types/process/wasi/wasix-trampoline.d.ts +18 -0
- package/dist/types/process/wasi/wasm-functypes.d.ts +25 -0
- package/dist/types/process/wasi-errno.d.ts +1 -0
- package/dist/types/realm/emscripten-vfs-hook.d.ts +19 -0
- package/dist/types/realm/live-vfs-fs.d.ts +186 -0
- package/dist/types/realm/sync-fs-dispatch.d.ts +26 -0
- package/dist/types/realm/sync-fs-token-registry.d.ts +36 -0
- package/dist/types/realm/sync-fs-wire.d.ts +118 -0
- package/dist/types/realm/sync-sab-bridge.d.ts +21 -0
- package/dist/types/realm/sync-sab-responder.d.ts +16 -0
- package/dist/types/realm/sync-sab-wire.d.ts +64 -0
- package/dist/types/sealed-relay.d.ts +26 -0
- package/dist/types/serve.d.ts +190 -0
- package/dist/types/sudo-command.d.ts +4 -0
- package/dist/types/sudo.d.ts +105 -0
- package/dist/types/testing.d.ts +46 -0
- package/dist/types/transport.d.ts +25 -0
- package/dist/types/users.d.ts +86 -0
- package/dist/types/version.d.ts +3 -0
- package/dist/types/websocket-transport.d.ts +12 -0
- package/package.json +22 -6
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { SyncFsResult } from '../../realm/sync-fs-wire.js';
|
|
2
|
+
import { type KernelLoopback } from './loopback-transport.js';
|
|
3
|
+
import type { HeaderList, RealmTransport } from './transport.js';
|
|
4
|
+
import { type WsSyscall } from './ws-syscalls.js';
|
|
5
|
+
export interface HttpRequestBody {
|
|
6
|
+
url: string;
|
|
7
|
+
method: string;
|
|
8
|
+
headers: HeaderList;
|
|
9
|
+
body?: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
export type HttpSyscall = ({
|
|
12
|
+
op: 'net-request';
|
|
13
|
+
} & HttpRequestBody) | ({
|
|
14
|
+
op: 'net-open';
|
|
15
|
+
} & HttpRequestBody) | {
|
|
16
|
+
op: 'net-head';
|
|
17
|
+
handle: number;
|
|
18
|
+
} | {
|
|
19
|
+
op: 'net-read';
|
|
20
|
+
handle: number;
|
|
21
|
+
max: number;
|
|
22
|
+
} | {
|
|
23
|
+
op: 'net-close';
|
|
24
|
+
handle: number;
|
|
25
|
+
} | {
|
|
26
|
+
op: 'net-traits';
|
|
27
|
+
url?: string;
|
|
28
|
+
} | WsSyscall;
|
|
29
|
+
export declare const HTTP_OPS: readonly string[];
|
|
30
|
+
export interface HttpHead {
|
|
31
|
+
handle: number;
|
|
32
|
+
status: number;
|
|
33
|
+
statusText: string;
|
|
34
|
+
url: string;
|
|
35
|
+
redirected?: boolean;
|
|
36
|
+
headers: HeaderList;
|
|
37
|
+
}
|
|
38
|
+
export declare class HttpHandles {
|
|
39
|
+
private readonly transport;
|
|
40
|
+
private readonly open;
|
|
41
|
+
private nextHandle;
|
|
42
|
+
private readonly ws;
|
|
43
|
+
private readonly owner;
|
|
44
|
+
private readonly local;
|
|
45
|
+
constructor(transport: RealmTransport, owner?: number, local?: KernelLoopback);
|
|
46
|
+
syscall(req: HttpSyscall): Promise<SyncFsResult>;
|
|
47
|
+
private traits;
|
|
48
|
+
private request;
|
|
49
|
+
private opened;
|
|
50
|
+
private start;
|
|
51
|
+
private respond;
|
|
52
|
+
private headOf;
|
|
53
|
+
private head;
|
|
54
|
+
private read;
|
|
55
|
+
private take;
|
|
56
|
+
private close;
|
|
57
|
+
closeAll(): Promise<void>;
|
|
58
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { HeaderList } from './transport.js';
|
|
2
|
+
export interface ByteSource {
|
|
3
|
+
read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
|
|
4
|
+
}
|
|
5
|
+
export declare class HttpError extends Error {
|
|
6
|
+
readonly status: number;
|
|
7
|
+
constructor(status: number, message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare const REASON: Readonly<Record<number, string>>;
|
|
10
|
+
export declare class Incoming {
|
|
11
|
+
private readonly source;
|
|
12
|
+
private buf;
|
|
13
|
+
private eof;
|
|
14
|
+
constructor(source: ByteSource);
|
|
15
|
+
get buffered(): number;
|
|
16
|
+
private fill;
|
|
17
|
+
private take;
|
|
18
|
+
peek(signal?: AbortSignal): Promise<number | undefined>;
|
|
19
|
+
some(max: number, signal?: AbortSignal): Promise<Uint8Array>;
|
|
20
|
+
head(limit: number, signal?: AbortSignal): Promise<Uint8Array | null>;
|
|
21
|
+
line(limit: number, signal?: AbortSignal): Promise<string>;
|
|
22
|
+
exactly(n: number, signal?: AbortSignal): Promise<Uint8Array>;
|
|
23
|
+
}
|
|
24
|
+
export declare function latin1(bytes: Uint8Array): string;
|
|
25
|
+
export declare function latin1Bytes(text: string): Uint8Array;
|
|
26
|
+
export interface RequestHead {
|
|
27
|
+
method: string;
|
|
28
|
+
target: string;
|
|
29
|
+
minor: number;
|
|
30
|
+
headers: HeaderList;
|
|
31
|
+
}
|
|
32
|
+
export declare function parseRequestHead(bytes: Uint8Array): RequestHead;
|
|
33
|
+
export declare function fieldValues(headers: HeaderList, name: string): string[];
|
|
34
|
+
export declare function fieldTokens(headers: HeaderList, name: string): string[];
|
|
35
|
+
export type BodyFraming = {
|
|
36
|
+
kind: 'none';
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'length';
|
|
39
|
+
length: number;
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'chunked';
|
|
42
|
+
};
|
|
43
|
+
export declare function requestFraming(headers: HeaderList): BodyFraming;
|
|
44
|
+
export declare function readBody(incoming: Incoming, framing: BodyFraming, cap: number, signal?: AbortSignal): Promise<Uint8Array | undefined>;
|
|
45
|
+
export declare function concat(chunks: Uint8Array[], total?: number): Uint8Array<ArrayBuffer>;
|
|
46
|
+
export declare function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array;
|
|
47
|
+
export declare function chunk(bytes: Uint8Array): Uint8Array;
|
|
48
|
+
export declare const LAST_CHUNK: Uint8Array<ArrayBufferLike>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const HOST_LOOPBACK = "host.slicc.internal";
|
|
2
|
+
export declare const HOST_LOOPBACK_ADDRESS: readonly [10, 0, 2, 2];
|
|
3
|
+
export declare const PAGE_LOOPBACK = "kernel.localhost";
|
|
4
|
+
export declare const PAGE_LOOPBACK_URL = "http://{port}.kernel.localhost";
|
|
5
|
+
export declare function toHostLoopback(href: string): string;
|
|
6
|
+
export declare function isKernelLoopbackHost(hostname: string): boolean;
|
|
7
|
+
export declare function kernelLoopbackPort(href: string): number | undefined;
|
|
8
|
+
export declare const DEFAULT_HOSTNAME = "slicc";
|
|
9
|
+
export declare const HOSTNAME_ADDRESS = "127.0.1.1";
|
|
10
|
+
export declare const LIBC_HOSTNAMES: readonly string[];
|
|
11
|
+
export declare function isHostname(name: unknown): name is string;
|
|
12
|
+
export declare function hostnameOf(env: Readonly<Record<string, string>>): string;
|
|
13
|
+
export declare function ownNames(hostname: string): string[];
|
|
14
|
+
export declare function hostsFile(hostname?: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConnectorStamp, LoopbackNet, PeerCred } from '../socket.js';
|
|
2
|
+
import type { RealmTransportRequest, RealmTransportResponse, RealmTransportTraits, RealmWebSocket, RealmWebSocketRequest } from './transport.js';
|
|
3
|
+
export declare const LOOPBACK_TRAITS: RealmTransportTraits;
|
|
4
|
+
export declare class KernelLoopback {
|
|
5
|
+
private readonly net;
|
|
6
|
+
private readonly cred;
|
|
7
|
+
private readonly stamp?;
|
|
8
|
+
constructor(net: LoopbackNet, cred: () => PeerCred, stamp?: () => Promise<ConnectorStamp>);
|
|
9
|
+
port(url: string): number | undefined;
|
|
10
|
+
private connect;
|
|
11
|
+
fetch(req: RealmTransportRequest, port: number): Promise<RealmTransportResponse>;
|
|
12
|
+
websocket(req: RealmWebSocketRequest, port: number): Promise<RealmWebSocket>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { KernelFs } from '../../fs/types.js';
|
|
2
|
+
import type { LoopbackNet } from '../socket.js';
|
|
3
|
+
import { RealmProxy } from './proxy-service.js';
|
|
4
|
+
import { type CaStore, type RealmCa } from './realm-ca.js';
|
|
5
|
+
import { type TlsEngine, type TlsEngineModule } from './tls-engine.js';
|
|
6
|
+
import type { RealmTransport } from './transport.js';
|
|
7
|
+
export declare const NO_TRANSPORT = "slicc-kernel: no network transport (createKernel({ network: { transport } }))";
|
|
8
|
+
export declare const TLS_ENGINE_PACKAGE = "@ai-ecoverse/wasm-tls-engine";
|
|
9
|
+
export declare const CA_PATH = "/etc/ssl/certs/slicc-kernel-ca.pem";
|
|
10
|
+
export declare const CA_DB = "slicc-kernel-ca";
|
|
11
|
+
export declare function networkEnv(hostname?: string): Record<string, string>;
|
|
12
|
+
export declare function missingTransport(): RealmTransport;
|
|
13
|
+
export declare function memoryCaStore(): CaStore;
|
|
14
|
+
export declare function caStore(name: string | false): CaStore;
|
|
15
|
+
export declare function packageTlsEngine(fs: KernelFs, modules: string): () => Promise<TlsEngineModule>;
|
|
16
|
+
export interface NetworkOptions {
|
|
17
|
+
transport?: RealmTransport;
|
|
18
|
+
engine: () => Promise<TlsEngine>;
|
|
19
|
+
ca: () => Promise<RealmCa>;
|
|
20
|
+
now?: () => number;
|
|
21
|
+
}
|
|
22
|
+
export declare function kernelCa(store: CaStore): () => Promise<RealmCa>;
|
|
23
|
+
export declare function kernelTlsEngine(load: () => Promise<TlsEngineModule>): () => Promise<TlsEngine>;
|
|
24
|
+
export declare const CA_BUNDLE_MAX = 16;
|
|
25
|
+
export interface LockLike {
|
|
26
|
+
request<T>(name: string, run: () => Promise<T>): Promise<T>;
|
|
27
|
+
}
|
|
28
|
+
export declare function writeCaFile(fs: KernelFs, ca: () => Promise<RealmCa>, locks?: LockLike | undefined): Promise<void>;
|
|
29
|
+
export declare function enableNetwork(net: LoopbackNet, options: NetworkOptions): () => RealmProxy | undefined;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { KernelSocket, LoopbackNet } from '../socket.js';
|
|
2
|
+
import { type ByteSource, Incoming, type RequestHead } from './http1.js';
|
|
3
|
+
import type { HeaderList, RealmTransport } from './transport.js';
|
|
4
|
+
export declare const NO_WEBSOCKET = "WebSocket not supported by this transport (fetchTransport needs { webSocket: true })";
|
|
5
|
+
export declare const REALM_PROXY_PORT = 3128;
|
|
6
|
+
export interface ProxyLimits {
|
|
7
|
+
maxConnections: number;
|
|
8
|
+
maxHead: number;
|
|
9
|
+
idleMs: number;
|
|
10
|
+
bodyBudget: number;
|
|
11
|
+
closeWaitMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface TunnelTarget {
|
|
14
|
+
host: string;
|
|
15
|
+
port: number;
|
|
16
|
+
}
|
|
17
|
+
export interface HttpSink {
|
|
18
|
+
write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
export type ServeHttp = (source: ByteSource, sink: HttpSink, origin: string) => Promise<void>;
|
|
21
|
+
export type TunnelHandler = (conn: KernelSocket, incoming: Incoming, target: TunnelTarget, signal: AbortSignal, serveHttp: ServeHttp) => Promise<void>;
|
|
22
|
+
export interface RealmProxyOptions {
|
|
23
|
+
net: LoopbackNet;
|
|
24
|
+
transport: RealmTransport;
|
|
25
|
+
host?: string;
|
|
26
|
+
port?: number;
|
|
27
|
+
tunnel?: TunnelHandler;
|
|
28
|
+
tunnelReady?: () => Promise<void>;
|
|
29
|
+
limits?: Partial<ProxyLimits>;
|
|
30
|
+
}
|
|
31
|
+
export declare function canonicalHost(host: string): string | undefined;
|
|
32
|
+
export declare function isLoopbackHost(hostname: string): boolean;
|
|
33
|
+
export declare function forwardRequestHeaders(headers: HeaderList): HeaderList;
|
|
34
|
+
export declare function forwardResponseHeaders(headers: HeaderList, opts: {
|
|
35
|
+
encodedBodies: boolean;
|
|
36
|
+
bodiless: boolean;
|
|
37
|
+
}): Array<readonly [string, string]>;
|
|
38
|
+
export declare function tunnelRequestUrl(req: RequestHead, origin: string): string;
|
|
39
|
+
export declare function requestUrl(req: RequestHead): string;
|
|
40
|
+
export declare function tunnelTarget(req: RequestHead): TunnelTarget;
|
|
41
|
+
export declare function watchHangup(conn: KernelSocket, abort: AbortController, until: AbortSignal): Promise<void>;
|
|
42
|
+
export declare function webSocketTarget(req: RequestHead): RequestHead;
|
|
43
|
+
export declare class RealmProxy {
|
|
44
|
+
private readonly options;
|
|
45
|
+
private readonly listener;
|
|
46
|
+
private readonly stop;
|
|
47
|
+
private readonly limits;
|
|
48
|
+
private readonly slots;
|
|
49
|
+
private readonly bodies;
|
|
50
|
+
private readonly connections;
|
|
51
|
+
private warnedWebSocket;
|
|
52
|
+
readonly closed: Promise<void>;
|
|
53
|
+
readonly port: number;
|
|
54
|
+
constructor(options: RealmProxyOptions);
|
|
55
|
+
get stopped(): boolean;
|
|
56
|
+
close(): void;
|
|
57
|
+
private acceptLoop;
|
|
58
|
+
private serve;
|
|
59
|
+
private requests;
|
|
60
|
+
private refuse;
|
|
61
|
+
private exchange;
|
|
62
|
+
private cap;
|
|
63
|
+
private expectContinue;
|
|
64
|
+
private upstream;
|
|
65
|
+
private relay;
|
|
66
|
+
private connect;
|
|
67
|
+
private tunnelReady;
|
|
68
|
+
private websocket;
|
|
69
|
+
private bridge;
|
|
70
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type DistinguishedName } from './x509.js';
|
|
2
|
+
export interface CaRecord {
|
|
3
|
+
key: CryptoKey;
|
|
4
|
+
cert: Uint8Array;
|
|
5
|
+
spki: Uint8Array;
|
|
6
|
+
notAfter: number;
|
|
7
|
+
name: DistinguishedName;
|
|
8
|
+
}
|
|
9
|
+
export interface CaStore {
|
|
10
|
+
get(owner: string): Promise<CaRecord | undefined>;
|
|
11
|
+
swap(owner: string, expected: CaRecord | undefined, record: CaRecord): Promise<CaRecord>;
|
|
12
|
+
}
|
|
13
|
+
export declare function winner(current: CaRecord | undefined, expected: CaRecord | undefined, record: CaRecord): CaRecord | undefined;
|
|
14
|
+
export declare const LEAF_LIFETIME: number;
|
|
15
|
+
export declare function indexedDbCaStore(dbName?: string): CaStore;
|
|
16
|
+
export declare class LeafNameError extends Error {
|
|
17
|
+
}
|
|
18
|
+
export declare function validLeafName(host: string): boolean;
|
|
19
|
+
export declare class RealmCa {
|
|
20
|
+
private readonly record;
|
|
21
|
+
private constructor();
|
|
22
|
+
static open(owner: string, store: CaStore, now?: number): Promise<RealmCa>;
|
|
23
|
+
private static create;
|
|
24
|
+
get cert(): Uint8Array;
|
|
25
|
+
get pem(): string;
|
|
26
|
+
issue(host: string, spki: Uint8Array, now?: number): Promise<Uint8Array>;
|
|
27
|
+
}
|
|
28
|
+
export declare function realmCa(owner: string, store: CaStore): Promise<RealmCa>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { HeaderList, RealmRedirectHop, RealmTransport, RealmTransportRequest, RealmTransportResponse, RealmTransportTraits, RealmWebSocket, RealmWebSocketMessage, RealmWebSocketRequest } from './transport.js';
|
|
2
|
+
export type TransportCall = {
|
|
3
|
+
net: 'fetch';
|
|
4
|
+
nid: number;
|
|
5
|
+
url: string;
|
|
6
|
+
method: string;
|
|
7
|
+
headers: HeaderList;
|
|
8
|
+
body?: Uint8Array;
|
|
9
|
+
} | {
|
|
10
|
+
net: 'read';
|
|
11
|
+
nid: number;
|
|
12
|
+
} | {
|
|
13
|
+
net: 'cancel';
|
|
14
|
+
nid: number;
|
|
15
|
+
} | {
|
|
16
|
+
net: 'ws-open';
|
|
17
|
+
nid: number;
|
|
18
|
+
url: string;
|
|
19
|
+
protocols: string[];
|
|
20
|
+
headers: HeaderList;
|
|
21
|
+
} | {
|
|
22
|
+
net: 'ws-send';
|
|
23
|
+
nid: number;
|
|
24
|
+
data: RealmWebSocketMessage;
|
|
25
|
+
} | {
|
|
26
|
+
net: 'ws-close';
|
|
27
|
+
nid: number;
|
|
28
|
+
code?: number;
|
|
29
|
+
reason?: string;
|
|
30
|
+
} | {
|
|
31
|
+
net: 'ws-consumed';
|
|
32
|
+
nid: number;
|
|
33
|
+
n: number;
|
|
34
|
+
};
|
|
35
|
+
export type TransportReply = {
|
|
36
|
+
net: 'head';
|
|
37
|
+
nid: number;
|
|
38
|
+
status: number;
|
|
39
|
+
statusText: string;
|
|
40
|
+
headers: HeaderList;
|
|
41
|
+
url?: string;
|
|
42
|
+
redirected?: boolean;
|
|
43
|
+
redirects?: readonly RealmRedirectHop[];
|
|
44
|
+
} | {
|
|
45
|
+
net: 'chunk';
|
|
46
|
+
nid: number;
|
|
47
|
+
bytes: Uint8Array;
|
|
48
|
+
} | {
|
|
49
|
+
net: 'end';
|
|
50
|
+
nid: number;
|
|
51
|
+
} | {
|
|
52
|
+
net: 'error';
|
|
53
|
+
nid: number;
|
|
54
|
+
message: string;
|
|
55
|
+
status?: number;
|
|
56
|
+
code?: string;
|
|
57
|
+
} | {
|
|
58
|
+
net: 'ws-opened';
|
|
59
|
+
nid: number;
|
|
60
|
+
protocol: string;
|
|
61
|
+
} | {
|
|
62
|
+
net: 'ws-message';
|
|
63
|
+
nid: number;
|
|
64
|
+
data: RealmWebSocketMessage;
|
|
65
|
+
} | {
|
|
66
|
+
net: 'ws-acked';
|
|
67
|
+
nid: number;
|
|
68
|
+
n: number;
|
|
69
|
+
} | {
|
|
70
|
+
net: 'ws-closed';
|
|
71
|
+
nid: number;
|
|
72
|
+
code: number;
|
|
73
|
+
reason: string;
|
|
74
|
+
};
|
|
75
|
+
export interface TransportPort {
|
|
76
|
+
postMessage(message: TransportCall): void;
|
|
77
|
+
}
|
|
78
|
+
export declare class TransportError extends Error {
|
|
79
|
+
readonly status: number | undefined;
|
|
80
|
+
readonly code: string | undefined;
|
|
81
|
+
constructor(message: string, status?: number, code?: string);
|
|
82
|
+
}
|
|
83
|
+
export declare class RemoteTransport implements RealmTransport {
|
|
84
|
+
traits: RealmTransportTraits;
|
|
85
|
+
private readonly port;
|
|
86
|
+
private readonly waiting;
|
|
87
|
+
private nextId;
|
|
88
|
+
private readonly sockets;
|
|
89
|
+
private failure;
|
|
90
|
+
constructor(port: TransportPort, traits: RealmTransportTraits);
|
|
91
|
+
receive(reply: TransportReply): void;
|
|
92
|
+
private toSocket;
|
|
93
|
+
fail(error: Error): void;
|
|
94
|
+
private ask;
|
|
95
|
+
private cancel;
|
|
96
|
+
fetch(request: RealmTransportRequest): Promise<RealmTransportResponse>;
|
|
97
|
+
websocket(request: RealmWebSocketRequest): Promise<RealmWebSocket>;
|
|
98
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Routes } from './routes.js';
|
|
2
|
+
import { type NetworkUplink, type ResolveFamily } from './uplink.js';
|
|
3
|
+
export declare const RESOLVE_TTL_MAX = 60;
|
|
4
|
+
export declare const RESOLVE_TIMEOUT_MS = 10000;
|
|
5
|
+
export declare const RESOLVE_CACHE_MAX = 256;
|
|
6
|
+
export interface ResolverOptions {
|
|
7
|
+
uplink?: NetworkUplink | undefined;
|
|
8
|
+
routes: Routes;
|
|
9
|
+
now?: () => number;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
log?: (message: string) => void;
|
|
12
|
+
hostname?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function hostsEntry(name: string, own?: readonly string[]): string | undefined;
|
|
15
|
+
export declare class Resolver {
|
|
16
|
+
private readonly uplink;
|
|
17
|
+
private readonly routes;
|
|
18
|
+
private readonly now;
|
|
19
|
+
private readonly timeoutMs;
|
|
20
|
+
private readonly log;
|
|
21
|
+
private readonly own;
|
|
22
|
+
private readonly cache;
|
|
23
|
+
private readonly pending;
|
|
24
|
+
constructor(options: ResolverOptions);
|
|
25
|
+
resolve(name: string, family: ResolveFamily, blocking?: () => AbortSignal): Promise<string[]>;
|
|
26
|
+
private lookup;
|
|
27
|
+
private usable;
|
|
28
|
+
private remember;
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RouteTable {
|
|
2
|
+
prefixes: readonly string[];
|
|
3
|
+
exit: boolean;
|
|
4
|
+
}
|
|
5
|
+
export type Destination = 'loopback' | 'host' | 'reserved' | 'uplink' | 'unreachable';
|
|
6
|
+
export declare function ipv4Bytes(text: string): number[] | undefined;
|
|
7
|
+
export declare function ipv6Groups(text: string): number[] | undefined;
|
|
8
|
+
export declare class Routes {
|
|
9
|
+
private table;
|
|
10
|
+
private exit;
|
|
11
|
+
readonly ipv6: boolean;
|
|
12
|
+
constructor(ipv6?: boolean);
|
|
13
|
+
set(table: RouteTable): void;
|
|
14
|
+
classify(host: string): Destination;
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
type TlsExport = 'malloc' | 'free' | 'tls_last_error' | 'tls_strerror' | 'tls_leaf_new' | 'tls_leaf_spki' | 'tls_leaf_add_cert' | 'tls_leaf_free' | 'tls_session_new' | 'tls_feed' | 'tls_feed_eof' | 'tls_in_room' | 'tls_read' | 'tls_write' | 'tls_out_size' | 'tls_out_take' | 'tls_close' | 'tls_alpn_http11' | 'tls_session_free';
|
|
2
|
+
export type TlsEngineModule = {
|
|
3
|
+
readonly HEAPU8: Uint8Array;
|
|
4
|
+
} & {
|
|
5
|
+
readonly [K in TlsExport as `_${K}`]: (...args: number[]) => number;
|
|
6
|
+
};
|
|
7
|
+
export declare class TlsError extends Error {
|
|
8
|
+
readonly code: number;
|
|
9
|
+
constructor(code: number, message: string);
|
|
10
|
+
}
|
|
11
|
+
export declare class TlsEngine {
|
|
12
|
+
private readonly m;
|
|
13
|
+
private readonly scratch;
|
|
14
|
+
constructor(m: TlsEngineModule);
|
|
15
|
+
private put;
|
|
16
|
+
private taken;
|
|
17
|
+
error(code: number, what: string): TlsError;
|
|
18
|
+
leaf(): TlsLeaf;
|
|
19
|
+
session(leaf: TlsLeaf, host: string): TlsSession;
|
|
20
|
+
withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T;
|
|
21
|
+
intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array;
|
|
22
|
+
}
|
|
23
|
+
export declare class TlsLeaf {
|
|
24
|
+
private readonly engine;
|
|
25
|
+
private readonly m;
|
|
26
|
+
readonly ptr: number;
|
|
27
|
+
constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number);
|
|
28
|
+
spki(): Uint8Array;
|
|
29
|
+
addCert(der: Uint8Array): void;
|
|
30
|
+
release(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare class TlsSession {
|
|
33
|
+
private readonly engine;
|
|
34
|
+
private readonly m;
|
|
35
|
+
private readonly ptr;
|
|
36
|
+
constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number);
|
|
37
|
+
feed(bytes: Uint8Array): number;
|
|
38
|
+
feedEnd(): void;
|
|
39
|
+
read(): Uint8Array | 'more' | 'eof';
|
|
40
|
+
write(bytes: Uint8Array): number;
|
|
41
|
+
take(): Uint8Array;
|
|
42
|
+
close(): void;
|
|
43
|
+
free(): void;
|
|
44
|
+
}
|
|
45
|
+
export declare function loadTlsEngine(load: () => Promise<TlsEngineModule>): Promise<TlsEngine>;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { KernelSocket } from '../socket.js';
|
|
2
|
+
import type { ByteSource } from './http1.js';
|
|
3
|
+
import type { HttpSink, TunnelHandler, TunnelTarget } from './proxy-service.js';
|
|
4
|
+
import { type RealmCa } from './realm-ca.js';
|
|
5
|
+
import type { TlsEngine, TlsSession } from './tls-engine.js';
|
|
6
|
+
export declare class TlsStream implements ByteSource, HttpSink {
|
|
7
|
+
private readonly session;
|
|
8
|
+
private readonly cipherIn;
|
|
9
|
+
private readonly cipherOut;
|
|
10
|
+
private pending;
|
|
11
|
+
private ended;
|
|
12
|
+
constructor(session: TlsSession, cipherIn: ByteSource, cipherOut: KernelSocket);
|
|
13
|
+
private flush;
|
|
14
|
+
private feedPending;
|
|
15
|
+
read(_max: number, signal?: AbortSignal): Promise<Uint8Array>;
|
|
16
|
+
write(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
|
|
17
|
+
close(signal?: AbortSignal): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface TlsTerminatorOptions {
|
|
20
|
+
ca: () => Promise<RealmCa>;
|
|
21
|
+
engine: () => Promise<TlsEngine>;
|
|
22
|
+
now?: () => number;
|
|
23
|
+
}
|
|
24
|
+
export declare class TlsTerminator {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private readonly leaves;
|
|
27
|
+
private readonly now;
|
|
28
|
+
constructor(options: TlsTerminatorOptions);
|
|
29
|
+
private leafFor;
|
|
30
|
+
private drop;
|
|
31
|
+
private issue;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
readonly handler: TunnelHandler;
|
|
34
|
+
}
|
|
35
|
+
export declare function authority(target: TunnelTarget): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export type HeaderList = ReadonlyArray<readonly [name: string, value: string]>;
|
|
2
|
+
export interface RealmTransportRequest {
|
|
3
|
+
url: string;
|
|
4
|
+
method: string;
|
|
5
|
+
headers: HeaderList;
|
|
6
|
+
body?: Uint8Array;
|
|
7
|
+
signal: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
export interface RealmRedirectHop {
|
|
10
|
+
status: number;
|
|
11
|
+
url: string;
|
|
12
|
+
headers: HeaderList;
|
|
13
|
+
}
|
|
14
|
+
export interface RealmTransportResponse {
|
|
15
|
+
url?: string;
|
|
16
|
+
redirected?: boolean;
|
|
17
|
+
redirects?: readonly RealmRedirectHop[];
|
|
18
|
+
status: number;
|
|
19
|
+
statusText: string;
|
|
20
|
+
headers: HeaderList;
|
|
21
|
+
body: AsyncIterable<Uint8Array>;
|
|
22
|
+
cancel(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export interface RealmTransportExit {
|
|
25
|
+
kind: 'local' | 'remote' | 'tailnet' | (string & {});
|
|
26
|
+
caps: readonly string[];
|
|
27
|
+
[detail: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface RealmTransportTraits {
|
|
30
|
+
manualRedirects: boolean;
|
|
31
|
+
encodedBodies: boolean;
|
|
32
|
+
maxRequestBody: number;
|
|
33
|
+
crossOrigin?: 'cors' | 'any';
|
|
34
|
+
unavailable?: true;
|
|
35
|
+
websocket?: true;
|
|
36
|
+
redirectHops?: true;
|
|
37
|
+
exit?: RealmTransportExit;
|
|
38
|
+
[trait: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
export interface RealmWebSocketRequest {
|
|
41
|
+
url: string;
|
|
42
|
+
protocols: string[];
|
|
43
|
+
headers: HeaderList;
|
|
44
|
+
signal: AbortSignal;
|
|
45
|
+
}
|
|
46
|
+
export interface RealmWebSocketClose {
|
|
47
|
+
code: number;
|
|
48
|
+
reason: string;
|
|
49
|
+
wasClean?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export type RealmWebSocketMessage = string | Uint8Array;
|
|
52
|
+
export interface RealmWebSocket {
|
|
53
|
+
readonly protocol: string;
|
|
54
|
+
readonly buffered: number;
|
|
55
|
+
send(data: RealmWebSocketMessage): void;
|
|
56
|
+
readonly messages: AsyncIterable<RealmWebSocketMessage>;
|
|
57
|
+
close(code?: number, reason?: string): void;
|
|
58
|
+
readonly closed: Promise<RealmWebSocketClose>;
|
|
59
|
+
}
|
|
60
|
+
export interface RealmTransport {
|
|
61
|
+
readonly traits: RealmTransportTraits;
|
|
62
|
+
fetch(request: RealmTransportRequest, owner?: number): Promise<RealmTransportResponse>;
|
|
63
|
+
websocket?(request: RealmWebSocketRequest): Promise<RealmWebSocket>;
|
|
64
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { KernelPipe } from '../pipe.js';
|
|
2
|
+
import type { UplinkConn } from './uplink.js';
|
|
3
|
+
export interface UplinkLink {
|
|
4
|
+
rx: KernelPipe;
|
|
5
|
+
tx: KernelPipe;
|
|
6
|
+
}
|
|
7
|
+
export declare function hostPort(text: string): {
|
|
8
|
+
host: string;
|
|
9
|
+
port: number;
|
|
10
|
+
} | undefined;
|
|
11
|
+
export declare function uplinkLink(conn: UplinkConn, onReset: () => void): UplinkLink;
|