@ai-ecoverse/slicc-kernel 1.102.6 → 1.103.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 +3 -3
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +118 -29
- package/dist/kernel-worker.js.map +4 -4
- package/dist/meta.js.map +2 -2
- package/dist/node-process-worker.js +29 -44
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +123 -34
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +44 -59
- package/dist/process-worker.js.map +3 -3
- 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 +86 -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 +117 -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-nodes.d.ts +20 -0
- package/dist/types/kernel/socket-syscalls.d.ts +76 -0
- package/dist/types/kernel/socket.d.ts +131 -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 +27 -0
- package/dist/types/realm/sync-fs-token-registry.d.ts +36 -0
- package/dist/types/realm/sync-fs-wire.d.ts +119 -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 +24 -8
|
@@ -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;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { type RouteTable } from './routes.js';
|
|
2
|
+
export interface UplinkTraits {
|
|
3
|
+
tcp: true;
|
|
4
|
+
udp: boolean;
|
|
5
|
+
ipv6: boolean;
|
|
6
|
+
}
|
|
7
|
+
export type ResolveFamily = 0 | 4 | 6;
|
|
8
|
+
export interface ResolveAnswer {
|
|
9
|
+
addresses: string[];
|
|
10
|
+
ttl?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface UplinkConn {
|
|
13
|
+
readonly localAddr: string;
|
|
14
|
+
readonly remoteAddr: string;
|
|
15
|
+
read(): Promise<Uint8Array | null>;
|
|
16
|
+
write(bytes: Uint8Array): Promise<number>;
|
|
17
|
+
closeWrite(): void;
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|
|
20
|
+
export interface UplinkDial {
|
|
21
|
+
network: 'tcp';
|
|
22
|
+
host: string;
|
|
23
|
+
port: number;
|
|
24
|
+
signal: AbortSignal;
|
|
25
|
+
}
|
|
26
|
+
export interface UplinkDatagram {
|
|
27
|
+
bytes: Uint8Array;
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
}
|
|
31
|
+
export interface UplinkUnreachable {
|
|
32
|
+
error: string;
|
|
33
|
+
host: string;
|
|
34
|
+
port: number;
|
|
35
|
+
}
|
|
36
|
+
export type UplinkMessage = UplinkDatagram | UplinkUnreachable;
|
|
37
|
+
export interface UplinkUdpOpen {
|
|
38
|
+
family: 4 | 6;
|
|
39
|
+
signal: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
export interface UplinkUdp {
|
|
42
|
+
readonly localAddr: string;
|
|
43
|
+
send(bytes: Uint8Array, host: string, port: number): Promise<void>;
|
|
44
|
+
readonly messages: AsyncIterable<UplinkMessage>;
|
|
45
|
+
close(): void;
|
|
46
|
+
}
|
|
47
|
+
export interface NetworkUplink {
|
|
48
|
+
readonly traits: UplinkTraits;
|
|
49
|
+
readonly routes?: RouteTable;
|
|
50
|
+
resolve(name: string, family: ResolveFamily, signal?: AbortSignal): Promise<string[] | ResolveAnswer>;
|
|
51
|
+
dial(req: UplinkDial): Promise<UplinkConn>;
|
|
52
|
+
udp?(req: UplinkUdpOpen): Promise<UplinkUdp>;
|
|
53
|
+
}
|
|
54
|
+
export declare function carriesUdp(uplink: NetworkUplink): boolean;
|
|
55
|
+
export type UplinkCall = {
|
|
56
|
+
uplink: 'resolve';
|
|
57
|
+
uid: number;
|
|
58
|
+
name: string;
|
|
59
|
+
family: ResolveFamily;
|
|
60
|
+
} | {
|
|
61
|
+
uplink: 'dial';
|
|
62
|
+
uid: number;
|
|
63
|
+
host: string;
|
|
64
|
+
port: number;
|
|
65
|
+
} | {
|
|
66
|
+
uplink: 'cancel';
|
|
67
|
+
uid: number;
|
|
68
|
+
} | {
|
|
69
|
+
uplink: 'read';
|
|
70
|
+
uid: number;
|
|
71
|
+
cid: number;
|
|
72
|
+
} | {
|
|
73
|
+
uplink: 'write';
|
|
74
|
+
uid: number;
|
|
75
|
+
cid: number;
|
|
76
|
+
bytes: Uint8Array;
|
|
77
|
+
} | {
|
|
78
|
+
uplink: 'close-write';
|
|
79
|
+
cid: number;
|
|
80
|
+
} | {
|
|
81
|
+
uplink: 'close';
|
|
82
|
+
cid: number;
|
|
83
|
+
} | {
|
|
84
|
+
uplink: 'udp-open';
|
|
85
|
+
uid: number;
|
|
86
|
+
family: 4 | 6;
|
|
87
|
+
} | {
|
|
88
|
+
uplink: 'udp-send';
|
|
89
|
+
uid: number;
|
|
90
|
+
cid: number;
|
|
91
|
+
bytes: Uint8Array;
|
|
92
|
+
host: string;
|
|
93
|
+
port: number;
|
|
94
|
+
} | {
|
|
95
|
+
uplink: 'udp-recv';
|
|
96
|
+
uid: number;
|
|
97
|
+
cid: number;
|
|
98
|
+
} | {
|
|
99
|
+
uplink: 'udp-close';
|
|
100
|
+
cid: number;
|
|
101
|
+
};
|
|
102
|
+
export type UplinkReply = {
|
|
103
|
+
uplink: 'resolved';
|
|
104
|
+
uid: number;
|
|
105
|
+
addresses: string[];
|
|
106
|
+
ttl?: number;
|
|
107
|
+
} | {
|
|
108
|
+
uplink: 'dialled';
|
|
109
|
+
uid: number;
|
|
110
|
+
cid: number;
|
|
111
|
+
localAddr: string;
|
|
112
|
+
remoteAddr: string;
|
|
113
|
+
} | {
|
|
114
|
+
uplink: 'data';
|
|
115
|
+
uid: number;
|
|
116
|
+
bytes: Uint8Array | null;
|
|
117
|
+
} | {
|
|
118
|
+
uplink: 'written';
|
|
119
|
+
uid: number;
|
|
120
|
+
n: number;
|
|
121
|
+
} | {
|
|
122
|
+
uplink: 'udp-opened';
|
|
123
|
+
uid: number;
|
|
124
|
+
cid: number;
|
|
125
|
+
localAddr: string;
|
|
126
|
+
} | {
|
|
127
|
+
uplink: 'udp-sent';
|
|
128
|
+
uid: number;
|
|
129
|
+
} | {
|
|
130
|
+
uplink: 'udp-message';
|
|
131
|
+
uid: number;
|
|
132
|
+
message: UplinkMessage | null;
|
|
133
|
+
} | {
|
|
134
|
+
uplink: 'error';
|
|
135
|
+
uid: number;
|
|
136
|
+
message: string;
|
|
137
|
+
code?: string;
|
|
138
|
+
};
|
|
139
|
+
export interface UplinkPeer {
|
|
140
|
+
postMessage(message: UplinkReply, transfer?: Transferable[]): void;
|
|
141
|
+
}
|
|
142
|
+
export interface UplinkPort {
|
|
143
|
+
postMessage(message: UplinkCall, transfer?: Transferable[]): void;
|
|
144
|
+
}
|
|
145
|
+
export interface UplinkServer {
|
|
146
|
+
answer(call: UplinkCall): void;
|
|
147
|
+
close(): void;
|
|
148
|
+
}
|
|
149
|
+
export declare function answerOf(result: string[] | ResolveAnswer): ResolveAnswer;
|
|
150
|
+
export declare function serveUplink(peer: UplinkPeer, uplink: NetworkUplink): UplinkServer;
|
|
151
|
+
export declare class RemoteUplink implements NetworkUplink {
|
|
152
|
+
readonly traits: UplinkTraits;
|
|
153
|
+
readonly routes: RouteTable | undefined;
|
|
154
|
+
private readonly port;
|
|
155
|
+
private readonly waiting;
|
|
156
|
+
private nextId;
|
|
157
|
+
constructor(port: UplinkPort, traits: UplinkTraits, routes?: RouteTable);
|
|
158
|
+
receive(reply: UplinkReply): void;
|
|
159
|
+
private ask;
|
|
160
|
+
resolve(name: string, family: ResolveFamily, signal?: AbortSignal): Promise<ResolveAnswer>;
|
|
161
|
+
dial(req: UplinkDial): Promise<UplinkConn>;
|
|
162
|
+
udp(req: UplinkUdpOpen): Promise<UplinkUdp>;
|
|
163
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RealmWebSocketClose, RealmWebSocketMessage } from './transport.js';
|
|
2
|
+
export declare const INBOUND_LIMIT: number;
|
|
3
|
+
export declare const MESSAGE_LIMIT: number;
|
|
4
|
+
export declare const TOO_BIG = 1009;
|
|
5
|
+
export declare function payloadSize(message: RealmWebSocketMessage): number;
|
|
6
|
+
export declare class MessageQueue implements AsyncIterable<RealmWebSocketMessage> {
|
|
7
|
+
private readonly items;
|
|
8
|
+
private readonly limit;
|
|
9
|
+
private waiter;
|
|
10
|
+
private size;
|
|
11
|
+
private ended;
|
|
12
|
+
private readonly overflow;
|
|
13
|
+
private readonly taken;
|
|
14
|
+
readonly closed: Promise<RealmWebSocketClose>;
|
|
15
|
+
private settle;
|
|
16
|
+
constructor(overflow: () => void, limit?: number, taken?: (n: number) => void);
|
|
17
|
+
push(message: RealmWebSocketMessage): void;
|
|
18
|
+
end(close: RealmWebSocketClose): void;
|
|
19
|
+
private wake;
|
|
20
|
+
[Symbol.asyncIterator](): AsyncIterator<RealmWebSocketMessage>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
export type WsSyscall = {
|
|
5
|
+
op: 'net-ws-open';
|
|
6
|
+
url: string;
|
|
7
|
+
protocols: string[];
|
|
8
|
+
headers: HeaderList;
|
|
9
|
+
} | {
|
|
10
|
+
op: 'net-ws-ready';
|
|
11
|
+
handle: number;
|
|
12
|
+
} | {
|
|
13
|
+
op: 'net-ws-recv';
|
|
14
|
+
handle: number;
|
|
15
|
+
} | {
|
|
16
|
+
op: 'net-ws-wait';
|
|
17
|
+
handle: number;
|
|
18
|
+
} | {
|
|
19
|
+
op: 'net-ws-send';
|
|
20
|
+
handle: number;
|
|
21
|
+
text?: string;
|
|
22
|
+
body?: Uint8Array;
|
|
23
|
+
} | {
|
|
24
|
+
op: 'net-ws-close';
|
|
25
|
+
handle: number;
|
|
26
|
+
code?: number;
|
|
27
|
+
reason?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const WS_OPS: readonly string[];
|
|
30
|
+
export declare class WsHandles {
|
|
31
|
+
private readonly transport;
|
|
32
|
+
private readonly open;
|
|
33
|
+
private readonly next;
|
|
34
|
+
private readonly local;
|
|
35
|
+
constructor(transport: RealmTransport, next: () => number, local?: KernelLoopback);
|
|
36
|
+
owns(handle: number): boolean;
|
|
37
|
+
syscall(req: WsSyscall): Promise<SyncFsResult>;
|
|
38
|
+
private start;
|
|
39
|
+
private connect;
|
|
40
|
+
private recv;
|
|
41
|
+
private closed;
|
|
42
|
+
private send;
|
|
43
|
+
close(handle: number): void;
|
|
44
|
+
closeAll(): void;
|
|
45
|
+
}
|