@secure-exec/core 0.1.1-rc.2 → 0.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/esm-compiler.d.ts +5 -1
  2. package/dist/esm-compiler.js +5 -1
  3. package/dist/fs-helpers.d.ts +1 -1
  4. package/dist/generated/isolate-runtime.d.ts +15 -15
  5. package/dist/generated/isolate-runtime.js +15 -15
  6. package/dist/index.d.ts +25 -6
  7. package/dist/index.js +23 -3
  8. package/dist/isolate-runtime/apply-custom-global-policy.js +3 -3
  9. package/dist/isolate-runtime/apply-timing-mitigation-freeze.js +10 -8
  10. package/dist/isolate-runtime/apply-timing-mitigation-off.js +2 -2
  11. package/dist/isolate-runtime/bridge-attach.js +2 -2
  12. package/dist/isolate-runtime/bridge-initial-globals.js +3 -3
  13. package/dist/isolate-runtime/eval-script-result.js +1 -1
  14. package/dist/isolate-runtime/global-exposure-helpers.js +2 -2
  15. package/dist/isolate-runtime/init-commonjs-module-globals.js +2 -2
  16. package/dist/isolate-runtime/override-process-cwd.js +1 -1
  17. package/dist/isolate-runtime/override-process-env.js +1 -1
  18. package/dist/isolate-runtime/require-setup.js +2236 -19
  19. package/dist/isolate-runtime/set-commonjs-file-globals.js +2 -2
  20. package/dist/isolate-runtime/set-stdin-data.js +1 -1
  21. package/dist/isolate-runtime/setup-dynamic-import.js +47 -15
  22. package/dist/isolate-runtime/setup-fs-facade.js +2 -2
  23. package/dist/kernel/command-registry.d.ts +44 -0
  24. package/dist/kernel/command-registry.js +114 -0
  25. package/dist/kernel/device-layer.d.ts +12 -0
  26. package/dist/kernel/device-layer.js +262 -0
  27. package/dist/kernel/dns-cache.d.ts +29 -0
  28. package/dist/kernel/dns-cache.js +52 -0
  29. package/dist/kernel/fd-table.d.ts +84 -0
  30. package/dist/kernel/fd-table.js +278 -0
  31. package/dist/kernel/file-lock.d.ts +34 -0
  32. package/dist/kernel/file-lock.js +123 -0
  33. package/dist/kernel/host-adapter.d.ts +50 -0
  34. package/dist/kernel/host-adapter.js +8 -0
  35. package/dist/kernel/index.d.ts +36 -0
  36. package/dist/kernel/index.js +34 -0
  37. package/dist/kernel/inode-table.d.ts +43 -0
  38. package/dist/kernel/inode-table.js +85 -0
  39. package/dist/kernel/kernel.d.ts +9 -0
  40. package/dist/kernel/kernel.js +1396 -0
  41. package/dist/kernel/permissions.d.ts +27 -0
  42. package/dist/kernel/permissions.js +118 -0
  43. package/dist/kernel/pipe-manager.d.ts +64 -0
  44. package/dist/kernel/pipe-manager.js +267 -0
  45. package/dist/kernel/proc-layer.d.ts +11 -0
  46. package/dist/kernel/proc-layer.js +501 -0
  47. package/dist/kernel/process-table.d.ts +124 -0
  48. package/dist/kernel/process-table.js +631 -0
  49. package/dist/kernel/pty.d.ts +108 -0
  50. package/dist/kernel/pty.js +541 -0
  51. package/dist/kernel/socket-table.d.ts +305 -0
  52. package/dist/kernel/socket-table.js +1124 -0
  53. package/dist/kernel/timer-table.d.ts +54 -0
  54. package/dist/kernel/timer-table.js +108 -0
  55. package/dist/kernel/types.d.ts +500 -0
  56. package/dist/kernel/types.js +89 -0
  57. package/dist/kernel/user.d.ts +29 -0
  58. package/dist/kernel/user.js +35 -0
  59. package/dist/kernel/vfs.d.ts +54 -0
  60. package/dist/kernel/vfs.js +8 -0
  61. package/dist/kernel/wait.d.ts +45 -0
  62. package/dist/kernel/wait.js +112 -0
  63. package/dist/kernel/wstatus.d.ts +21 -0
  64. package/dist/kernel/wstatus.js +33 -0
  65. package/dist/module-resolver.d.ts +4 -0
  66. package/dist/module-resolver.js +4 -0
  67. package/dist/package-bundler.d.ts +6 -1
  68. package/dist/runtime-driver.d.ts +3 -1
  69. package/dist/shared/bridge-contract.d.ts +529 -94
  70. package/dist/shared/bridge-contract.js +86 -3
  71. package/dist/shared/console-formatter.js +4 -0
  72. package/dist/shared/global-exposure.js +345 -0
  73. package/dist/shared/in-memory-fs.d.ts +30 -11
  74. package/dist/shared/in-memory-fs.js +383 -109
  75. package/dist/shared/permissions.d.ts +4 -6
  76. package/dist/shared/permissions.js +24 -28
  77. package/dist/types.d.ts +20 -130
  78. package/dist/types.js +5 -0
  79. package/package.json +12 -22
  80. package/dist/bridge/active-handles.d.ts +0 -22
  81. package/dist/bridge/active-handles.js +0 -55
  82. package/dist/bridge/child-process.d.ts +0 -99
  83. package/dist/bridge/child-process.js +0 -656
  84. package/dist/bridge/fs.d.ts +0 -281
  85. package/dist/bridge/fs.js +0 -2231
  86. package/dist/bridge/index.d.ts +0 -10
  87. package/dist/bridge/index.js +0 -41
  88. package/dist/bridge/module.d.ts +0 -75
  89. package/dist/bridge/module.js +0 -299
  90. package/dist/bridge/network.d.ts +0 -250
  91. package/dist/bridge/network.js +0 -1433
  92. package/dist/bridge/os.d.ts +0 -13
  93. package/dist/bridge/os.js +0 -256
  94. package/dist/bridge/polyfills.d.ts +0 -2
  95. package/dist/bridge/polyfills.js +0 -11
  96. package/dist/bridge/process.d.ts +0 -89
  97. package/dist/bridge/process.js +0 -994
  98. package/dist/bridge.js +0 -11766
  99. package/dist/python-runtime.d.ts +0 -16
  100. package/dist/python-runtime.js +0 -45
  101. package/dist/runtime.d.ts +0 -31
  102. package/dist/runtime.js +0 -69
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Virtual socket table.
3
+ *
4
+ * Manages kernel-level sockets: create, bind, listen, accept, connect,
5
+ * send, recv, close, poll, per-process isolation, and resource limits.
6
+ * Loopback connections are routed entirely in-kernel without touching
7
+ * the host network stack.
8
+ */
9
+ import { WaitQueue } from "./wait.js";
10
+ import type { NetworkAccessRequest, PermissionCheck } from "./types.js";
11
+ import type { ProcessSignalState } from "./types.js";
12
+ import type { HostNetworkAdapter, HostSocket, HostListener, HostUdpSocket } from "./host-adapter.js";
13
+ import type { VirtualFileSystem } from "./vfs.js";
14
+ export declare const AF_INET = 2;
15
+ export declare const AF_INET6 = 10;
16
+ export declare const AF_UNIX = 1;
17
+ export declare const SOCK_STREAM = 1;
18
+ export declare const SOCK_DGRAM = 2;
19
+ export declare const SOL_SOCKET = 1;
20
+ export declare const IPPROTO_TCP = 6;
21
+ export declare const SO_REUSEADDR = 2;
22
+ export declare const SO_KEEPALIVE = 9;
23
+ export declare const SO_RCVBUF = 8;
24
+ export declare const SO_SNDBUF = 7;
25
+ export declare const TCP_NODELAY = 1;
26
+ export declare const MSG_PEEK = 2;
27
+ export declare const MSG_DONTWAIT = 64;
28
+ export declare const MSG_NOSIGNAL = 16384;
29
+ export declare const MAX_DATAGRAM_SIZE = 65535;
30
+ export declare const MAX_UDP_QUEUE_DEPTH = 128;
31
+ export declare const S_IFSOCK = 49152;
32
+ export type InetAddr = {
33
+ host: string;
34
+ port: number;
35
+ };
36
+ export type UnixAddr = {
37
+ path: string;
38
+ };
39
+ export type SockAddr = InetAddr | UnixAddr;
40
+ export declare function isInetAddr(addr: SockAddr): addr is InetAddr;
41
+ export declare function isUnixAddr(addr: SockAddr): addr is UnixAddr;
42
+ export interface UdpDatagram {
43
+ data: Uint8Array;
44
+ srcAddr: SockAddr;
45
+ }
46
+ /** Canonical string key for a socket address ("host:port" or unix path). */
47
+ export declare function addrKey(addr: SockAddr): string;
48
+ /** Canonical string key for a socket option ("level:optname"). */
49
+ export declare function optKey(level: number, optname: number): string;
50
+ export type SocketState = "created" | "bound" | "listening" | "connecting" | "connected" | "read-closed" | "write-closed" | "closed";
51
+ export interface KernelSocket {
52
+ readonly id: number;
53
+ readonly domain: number;
54
+ readonly type: number;
55
+ readonly protocol: number;
56
+ state: SocketState;
57
+ nonBlocking: boolean;
58
+ localAddr?: SockAddr;
59
+ remoteAddr?: SockAddr;
60
+ options: Map<string, number>;
61
+ readonly pid: number;
62
+ readBuffer: Uint8Array[];
63
+ readWaiters: WaitQueue;
64
+ backlog: number[];
65
+ backlogLimit: number;
66
+ acceptWaiters: WaitQueue;
67
+ /** Peer socket ID for connected loopback/socketpair sockets. */
68
+ peerId?: number;
69
+ /** True when the peer has shut down its write side (half-close EOF). */
70
+ peerWriteClosed?: boolean;
71
+ /** True when connected via host adapter (external network). */
72
+ external?: boolean;
73
+ /** Host socket for external connections (data relay). */
74
+ hostSocket?: HostSocket;
75
+ /** Host listener for external-facing server sockets. */
76
+ hostListener?: HostListener;
77
+ /** Queued datagrams for UDP sockets (preserves message boundaries). */
78
+ datagramQueue: UdpDatagram[];
79
+ /** Host UDP socket for external datagram routing. */
80
+ hostUdpSocket?: HostUdpSocket;
81
+ /** Tracks whether bind() was originally requested with port 0. */
82
+ requestedEphemeralPort?: boolean;
83
+ }
84
+ type BlockingSocketWait = {
85
+ block: true;
86
+ pid: number;
87
+ };
88
+ export declare class SocketTable {
89
+ private sockets;
90
+ private nextSocketId;
91
+ private readonly maxSockets;
92
+ private readonly networkCheck?;
93
+ private readonly hostAdapter?;
94
+ private readonly vfs?;
95
+ private readonly getSignalState?;
96
+ /** Bound/listening address → socket ID. Used for EADDRINUSE and TCP routing. */
97
+ private listeners;
98
+ /** Bound UDP address → socket ID. Separate from TCP listeners. */
99
+ private udpBindings;
100
+ constructor(options?: {
101
+ maxSockets?: number;
102
+ networkCheck?: PermissionCheck<NetworkAccessRequest>;
103
+ hostAdapter?: HostNetworkAdapter;
104
+ vfs?: VirtualFileSystem;
105
+ getSignalState?: (pid: number) => ProcessSignalState;
106
+ });
107
+ /**
108
+ * Create a new socket owned by the given process.
109
+ * Returns the kernel socket ID.
110
+ */
111
+ create(domain: number, type: number, protocol: number, pid: number): number;
112
+ /**
113
+ * Get a socket by ID. Returns null if not found.
114
+ */
115
+ get(socketId: number): KernelSocket | null;
116
+ /**
117
+ * Check network permission for an operation. Throws EACCES if the
118
+ * configured policy denies the request or if no policy is set
119
+ * (deny-by-default). Loopback callers should skip this method.
120
+ */
121
+ checkNetworkPermission(op: NetworkAccessRequest["op"], addr?: SockAddr): void;
122
+ /**
123
+ * Bind a socket to an address. Transitions to 'bound' and registers
124
+ * the address in the listeners map for port reservation.
125
+ *
126
+ * For Unix domain sockets (UnixAddr), creates a socket file in the
127
+ * VFS if one is configured.
128
+ */
129
+ bind(socketId: number, addr: SockAddr, options?: {
130
+ mode?: number;
131
+ }): Promise<void>;
132
+ /**
133
+ * Mark a bound socket as listening. The socket must already be bound.
134
+ * Checks network permission before transitioning.
135
+ *
136
+ * When `external` is true and a host adapter is available, creates a
137
+ * real TCP listener via `hostAdapter.tcpListen()` and starts an accept
138
+ * pump that feeds incoming connections into the kernel backlog.
139
+ */
140
+ listen(socketId: number, backlogSize?: number, options?: {
141
+ external?: boolean;
142
+ }): Promise<void>;
143
+ /**
144
+ * Accept a pending connection from a listening socket's backlog.
145
+ * Returns the connected socket ID, or null if backlog is empty (EAGAIN).
146
+ */
147
+ accept(socketId: number): number | null;
148
+ accept(socketId: number, options: BlockingSocketWait): Promise<number | null>;
149
+ /**
150
+ * Find a listening socket that matches the given address.
151
+ * Checks exact match first, then wildcard (0.0.0.0 / ::).
152
+ */
153
+ findListener(addr: SockAddr): KernelSocket | null;
154
+ /**
155
+ * Shut down part of a full-duplex connection.
156
+ * - 'write': peer recv() gets EOF, local send() returns EPIPE
157
+ * - 'read': local recv() returns EOF immediately
158
+ * - 'both': equivalent to shutdown('read') + shutdown('write')
159
+ */
160
+ shutdown(socketId: number, how: "read" | "write" | "both"): void;
161
+ /** Signal EOF to the peer by waking their readWaiters. */
162
+ private shutdownWrite;
163
+ /** Discard unread data and mark the read side as closed. */
164
+ private shutdownRead;
165
+ /**
166
+ * Create a pair of connected sockets atomically (for IPC).
167
+ * Returns [socketId1, socketId2]. Both are pre-connected with
168
+ * peerId linking, so data written to one appears in the other's
169
+ * readBuffer via send/recv.
170
+ */
171
+ socketpair(domain: number, type: number, protocol: number, pid: number): [number, number];
172
+ /**
173
+ * Set a socket option. Stores the value keyed by "level:optname".
174
+ */
175
+ setsockopt(socketId: number, level: number, optname: number, optval: number): void;
176
+ /** Toggle non-blocking behavior for an existing socket. */
177
+ setNonBlocking(socketId: number, nonBlocking: boolean): void;
178
+ /**
179
+ * Get a socket option. Returns the value, or undefined if not set.
180
+ */
181
+ getsockopt(socketId: number, level: number, optname: number): number | undefined;
182
+ /** Get the bound/local address for a socket. */
183
+ getLocalAddr(socketId: number): SockAddr;
184
+ /** Get the connected peer address for a socket. */
185
+ getRemoteAddr(socketId: number): SockAddr;
186
+ /**
187
+ * Connect a socket to a remote address. For loopback (addr matches a
188
+ * kernel listener), creates a paired server-side socket and queues it
189
+ * in the listener's backlog — loopback is always allowed regardless of
190
+ * permission policy. External addresses are checked against the network
191
+ * permission policy and routed through the host adapter.
192
+ */
193
+ connect(socketId: number, addr: SockAddr): Promise<void>;
194
+ /**
195
+ * Send data to the connected peer. Writes to the peer's readBuffer
196
+ * and wakes one pending reader. Returns bytes written.
197
+ *
198
+ * Flags: MSG_NOSIGNAL suppresses SIGPIPE — returns EPIPE error
199
+ * instead of raising SIGPIPE on a broken connection.
200
+ *
201
+ * For external sockets, checks network permission before sending.
202
+ */
203
+ send(socketId: number, data: Uint8Array, flags?: number): number;
204
+ /**
205
+ * Receive data from the socket's readBuffer. Returns null if no data
206
+ * is available and the socket is non-blocking, or if the peer has
207
+ * closed (EOF).
208
+ *
209
+ * Flags:
210
+ * - MSG_PEEK: read data without consuming it from the buffer
211
+ * - MSG_DONTWAIT: return EAGAIN if no data (even on blocking socket)
212
+ */
213
+ recv(socketId: number, maxBytes: number, flags?: number): Uint8Array | null;
214
+ recv(socketId: number, maxBytes: number, flags: number, options: BlockingSocketWait): Promise<Uint8Array | null>;
215
+ /**
216
+ * Send a datagram to a specific address (UDP only).
217
+ * For loopback, delivers to the kernel-bound UDP socket. For external
218
+ * addresses, routes through the host adapter (fire-and-forget). Sends
219
+ * to unbound ports are silently dropped (UDP semantics).
220
+ *
221
+ * Returns bytes "sent" (always data.length for UDP — drops are silent).
222
+ */
223
+ sendTo(socketId: number, data: Uint8Array, flags: number, destAddr: SockAddr): number;
224
+ private getUdpSourceAddr;
225
+ /**
226
+ * Receive a datagram from a UDP socket. Returns the datagram and the
227
+ * source address, or null if no datagram is queued.
228
+ *
229
+ * Message boundaries are preserved: each sendTo produces exactly one
230
+ * recvFrom result. If the datagram exceeds maxBytes, excess is
231
+ * discarded (UDP truncation semantics).
232
+ *
233
+ * Flags: MSG_PEEK reads without consuming, MSG_DONTWAIT throws EAGAIN.
234
+ */
235
+ recvFrom(socketId: number, maxBytes: number, flags?: number): {
236
+ data: Uint8Array;
237
+ srcAddr: SockAddr;
238
+ } | null;
239
+ /**
240
+ * Set up external UDP routing for a bound datagram socket.
241
+ * Creates a host UDP socket via the host adapter and starts a recv
242
+ * pump that feeds incoming datagrams into the kernel datagramQueue.
243
+ */
244
+ bindExternalUdp(socketId: number): Promise<void>;
245
+ /**
246
+ * Close a socket. The caller must own the socket (per-process isolation).
247
+ * Wakes all pending waiters and frees resources.
248
+ */
249
+ close(socketId: number, pid: number): void;
250
+ /**
251
+ * Poll a socket for readability, writability, and hangup.
252
+ */
253
+ poll(socketId: number): {
254
+ readable: boolean;
255
+ writable: boolean;
256
+ hangup: boolean;
257
+ };
258
+ /**
259
+ * Clean up all sockets owned by a process (called on process exit).
260
+ */
261
+ closeAllForProcess(pid: number): void;
262
+ /**
263
+ * Clean up all sockets (called on kernel dispose).
264
+ */
265
+ disposeAll(): void;
266
+ /** Number of open sockets. */
267
+ get size(): number;
268
+ /** Create a socket file in the VFS with S_IFSOCK mode. */
269
+ private createSocketFile;
270
+ private requireSocket;
271
+ /** Wait for an inbound connection, restarting when SA_RESTART applies. */
272
+ private acceptBlocking;
273
+ private destroySocket;
274
+ /** Background pump: reads from host socket and feeds kernel readBuffer. */
275
+ private startReadPump;
276
+ /** Complete a non-blocking external connect in the background. */
277
+ private startExternalConnect;
278
+ /** Background pump: accepts incoming connections from host listener and feeds kernel backlog. */
279
+ private startAcceptPump;
280
+ /** Look up a listening socket by exact address key. */
281
+ private getListeningSocket;
282
+ /** Peek up to maxBytes from a socket's readBuffer without consuming. */
283
+ private peekFromBuffer;
284
+ /** Consume up to maxBytes from a socket's readBuffer. */
285
+ private consumeFromBuffer;
286
+ /** Wait for readable data, restarting when SA_RESTART applies. */
287
+ private recvBlocking;
288
+ /** Check whether recv() could still yield data later instead of EOF. */
289
+ private canBlockForRecv;
290
+ /** Wait for socket readiness or an interrupting signal. */
291
+ private waitForSocketWake;
292
+ /** Find a bound UDP socket that matches the given address (exact + wildcard). */
293
+ findBoundUdp(addr: SockAddr): KernelSocket | null;
294
+ /** Look up a bound UDP socket by exact address key. */
295
+ private getBoundUdpSocket;
296
+ /** Check if a UDP address conflicts with an existing UDP binding. */
297
+ private isUdpAddrInUse;
298
+ /** Background pump: receives datagrams from host UDP socket and feeds kernel datagramQueue. */
299
+ private startUdpRecvPump;
300
+ /** Check if an address conflicts with an existing TCP binding. */
301
+ private isAddrInUse;
302
+ /** Assign a kernel-managed ephemeral port for bind(port=0). */
303
+ private assignEphemeralPort;
304
+ }
305
+ export {};