@ai-ecoverse/slicc-kernel 1.158.1 → 1.159.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.
@@ -0,0 +1,32 @@
1
+ import { type FdTable, type KernelErrno, type KernelFile, type OpenFile } from './fd-table.js';
2
+ import type { PipeMark } from './pipe.js';
3
+ export declare const RIGHTS_MAX = 253;
4
+ export declare const RIGHTS_IN_FLIGHT = 1024;
5
+ interface Passed {
6
+ file: OpenFile;
7
+ status: number | undefined;
8
+ }
9
+ export declare class RightsMark implements PipeMark {
10
+ readonly at: number;
11
+ readonly passed: Passed[];
12
+ constructor(at: number, passed: Passed[]);
13
+ get count(): number;
14
+ drop(): void;
15
+ }
16
+ export declare function refusal(file: KernelFile): KernelErrno | undefined;
17
+ export interface SendRights {
18
+ fd: number;
19
+ body: Uint8Array;
20
+ fds: number[];
21
+ nonblock: boolean;
22
+ }
23
+ export declare function sendRights(fds: FdTable, req: SendRights, signal?: AbortSignal): Promise<number>;
24
+ export interface ReceiveRights {
25
+ fd: number;
26
+ max: number;
27
+ cloexec: boolean;
28
+ nonblock: boolean;
29
+ }
30
+ export declare function encodeRights(bytes: Uint8Array, got: number[], truncated: boolean): Uint8Array;
31
+ export declare function receiveRights(fds: FdTable, req: ReceiveRights, signal?: AbortSignal): Promise<Uint8Array>;
32
+ export {};
@@ -1,4 +1,4 @@
1
- import { type FdTable } from '../fd-table.js';
1
+ import { type FdTable, type KernelFile } from '../fd-table.js';
2
2
  import type { KernelSocket } from '../socket.js';
3
3
  import type { TlsCipher } from './tls-ciphers.js';
4
4
  import { type ServerOffer } from './tls-client.js';
@@ -45,6 +45,11 @@ export declare function listenSecure(proc: SecureProcess, socket: KernelSocket,
45
45
  export declare function serveSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<ServedSession | {
46
46
  select: ServerOffer;
47
47
  }>;
48
+ export declare class TlsContext implements KernelFile {
49
+ readonly leaf: TlsLeaf;
50
+ constructor(leaf: TlsLeaf);
51
+ close(): void;
52
+ }
48
53
  export declare const TLS_CONTEXTS_MAX = 64;
49
54
  export declare function contextSecure(proc: SecureProcess & {
50
55
  fds: FdTable;
@@ -1,7 +1,12 @@
1
1
  export declare const PIPE_CAPACITY: number;
2
+ export interface PipeMark {
3
+ readonly at: number;
4
+ readonly count: number;
5
+ drop(): void;
6
+ }
2
7
  export declare class PipeError extends Error {
3
- readonly code: 'EPIPE' | 'EINTR';
4
- constructor(code: 'EPIPE' | 'EINTR');
8
+ readonly code: 'EPIPE' | 'EINTR' | 'EAGAIN';
9
+ constructor(code: 'EPIPE' | 'EINTR' | 'EAGAIN');
5
10
  }
6
11
  export declare class KernelPipe {
7
12
  private chunks;
@@ -9,6 +14,9 @@ export declare class KernelPipe {
9
14
  private readers;
10
15
  private writers;
11
16
  private waiters;
17
+ private pushed;
18
+ private taken;
19
+ private marks;
12
20
  readonly capacity: number;
13
21
  constructor(capacity?: number);
14
22
  get buffered(): number;
@@ -21,6 +29,15 @@ export declare class KernelPipe {
21
29
  closeRead(): void;
22
30
  closeWrite(): void;
23
31
  read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
32
+ get inFlight(): number;
33
+ receive(max: number, nonblock: boolean, signal?: AbortSignal): Promise<{
34
+ bytes: Uint8Array;
35
+ marks: PipeMark[];
36
+ }>;
37
+ writeMarked(bytes: Uint8Array, mark: (at: number) => PipeMark, nonblock: boolean, signal?: AbortSignal): Promise<number>;
38
+ private orphan;
39
+ private bounded;
40
+ private dropMarks;
24
41
  peek(max: number, signal?: AbortSignal): Promise<Uint8Array>;
25
42
  write(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
26
43
  private take;
@@ -37,6 +37,18 @@ export type SocketSyscall = {
37
37
  } | {
38
38
  op: 'sock-reset';
39
39
  fd: number;
40
+ } | {
41
+ op: 'sock-sendmsg';
42
+ fd: number;
43
+ body: Uint8Array;
44
+ fds: number[];
45
+ nonblock: boolean;
46
+ } | {
47
+ op: 'sock-recvmsg';
48
+ fd: number;
49
+ max: number;
50
+ cloexec: boolean;
51
+ nonblock: boolean;
40
52
  } | {
41
53
  op: 'sock-name';
42
54
  fd: number;
@@ -4,7 +4,7 @@ import { type Destination, Routes } from './net/routes.js';
4
4
  import { SwitchConn } from './net/switch-conn.js';
5
5
  import type { TlsClientSupport } from './net/tls-uplink.js';
6
6
  import type { NetworkUplink, UplinkConn } from './net/uplink.js';
7
- import { KernelPipe } from './pipe.js';
7
+ import { KernelPipe, type PipeMark } from './pipe.js';
8
8
  import type { SealedCaller } from './sealed.js';
9
9
  import type { UnixDgram } from './unix-dgram.js';
10
10
  export type SockAddr = {
@@ -77,6 +77,13 @@ export declare class KernelSocket implements KernelFile {
77
77
  private connection;
78
78
  read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
79
79
  peek(max: number, signal?: AbortSignal): Promise<Uint8Array>;
80
+ private rightsLink;
81
+ sendRights(bytes: Uint8Array, mark: (at: number, inFlight: number) => PipeMark, nonblock: boolean, signal?: AbortSignal): Promise<number>;
82
+ receiveRights(max: number, nonblock: boolean, signal?: AbortSignal): Promise<{
83
+ bytes: Uint8Array;
84
+ marks: PipeMark[];
85
+ }>;
86
+ get secured(): boolean;
80
87
  write(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
81
88
  poll(): PollState;
82
89
  changed(signal?: AbortSignal): Promise<void>;
@@ -99,6 +106,7 @@ export declare class KernelSocket implements KernelFile {
99
106
  } | undefined;
100
107
  pending: (() => void) | undefined;
101
108
  private served;
109
+ private tlsDial;
102
110
  get loopbackLinked(): boolean;
103
111
  secureLink<T>(make: (raw: UplinkConn) => Promise<{
104
112
  conn: UplinkConn;
@@ -4,6 +4,7 @@ import { type JsChild, type JsExited, type JsSpawnOptions, type JsWaitOptions }
4
4
  import { type JsFdType, type JsOpenOptions, type JsStatFs, type JsWriteOptions } from './js-io.js';
5
5
  import { type JsKernel } from './js-kernel.js';
6
6
  import { type JsNet } from './js-net.js';
7
+ import { type JsReceived, type JsRecvmsgOptions, type JsSendmsgOptions } from './js-rights.js';
7
8
  import { type JsSyncContext, type SyncCall } from './js-sync.js';
8
9
  import type { JsThreadContext } from './js-thread.js';
9
10
  import { type JsTty } from './js-tty.js';
@@ -49,6 +50,11 @@ export interface JsScriptResult {
49
50
  completion: boolean;
50
51
  }
51
52
  export type JsRunScript = (source: string, filename: string) => JsScriptResult;
53
+ export interface JsPromiseState {
54
+ state: 'pending' | 'fulfilled' | 'rejected';
55
+ value: unknown;
56
+ }
57
+ export type JsPromiseProbe = (promise: unknown) => JsPromiseState | undefined;
52
58
  export interface JsProgramContext {
53
59
  readonly kernel: JsKernelInfo;
54
60
  memory(): JsMemory;
@@ -65,6 +71,8 @@ export interface JsProgramContext {
65
71
  write(fd: number, data: Uint8Array | string, options?: JsWriteOptions): Promise<number>;
66
72
  close(fd: number): Promise<void>;
67
73
  socketpair(): Promise<[number, number]>;
74
+ sendmsg(fd: number, data: Uint8Array | string, options?: JsSendmsgOptions): Promise<number>;
75
+ recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): Promise<JsReceived>;
68
76
  pipe(): Promise<[number, number]>;
69
77
  select(sets: JsSelectSets, options?: {
70
78
  signal?: AbortSignal;
@@ -172,6 +180,7 @@ export interface ContextOptions {
172
180
  memory?: (() => JsMemory) | undefined;
173
181
  asyncContext?: (() => JsAsyncContext) | undefined;
174
182
  runScript?: JsRunScript | undefined;
183
+ promiseState?: JsPromiseProbe | undefined;
175
184
  fs?: {
176
185
  owners: boolean;
177
186
  links: boolean;
@@ -118,6 +118,7 @@ export interface JsNet {
118
118
  secure(conn: JsConnection, tls: JsTlsOptions): Promise<JsConnection>;
119
119
  tlsContext(options: JsTlsContextOptions): Promise<JsTlsContext>;
120
120
  resolve(name: string, options?: JsResolveOptions): Promise<string[]>;
121
+ adopt(fd: number): Promise<JsConnection | JsListener>;
121
122
  }
122
123
  export interface NetIo {
123
124
  read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;
@@ -0,0 +1,46 @@
1
+ import type { WasmSyscall } from '../../kernel/process.js';
2
+ import type { SyncFsResult } from '../../realm/sync-fs-wire.js';
3
+ import type { SyncSabRequestBody } from '../../realm/sync-sab-wire.js';
4
+ export interface JsSendmsgOptions {
5
+ fds?: number[];
6
+ nonblock?: boolean;
7
+ }
8
+ export interface JsRecvmsgOptions {
9
+ cloexec?: boolean;
10
+ nonblock?: boolean;
11
+ }
12
+ export interface JsReceived {
13
+ bytes: Uint8Array;
14
+ fds: number[];
15
+ ctrunc: boolean;
16
+ }
17
+ export declare function sendmsgRequest(fd: number, data: Uint8Array | string, options?: JsSendmsgOptions): {
18
+ op: 'sock-sendmsg';
19
+ fd: number;
20
+ body: Uint8Array<ArrayBufferLike>;
21
+ fds: number[];
22
+ nonblock: boolean;
23
+ };
24
+ export declare function recvmsgRequest(fd: number, max?: number, options?: JsRecvmsgOptions): {
25
+ op: 'sock-recvmsg';
26
+ fd: number;
27
+ max: number;
28
+ cloexec: boolean;
29
+ nonblock: boolean;
30
+ };
31
+ export declare function decodeReceived(frame: Uint8Array): JsReceived;
32
+ interface AsyncKernel {
33
+ json(req: SyncSabRequestBody): Promise<unknown>;
34
+ blocking(req: WasmSyscall, signal?: AbortSignal): Promise<SyncFsResult>;
35
+ call(req: SyncSabRequestBody): Promise<SyncFsResult>;
36
+ }
37
+ type Watch = (fd: number) => {
38
+ signal: AbortSignal;
39
+ done(): void;
40
+ };
41
+ export declare function rightsAsync(kernel: AsyncKernel, forget: (fd: number) => void, watch: Watch): {
42
+ socketpair: () => Promise<[number, number]>;
43
+ sendmsg: (fd: number, data: Uint8Array | string, options?: JsSendmsgOptions) => Promise<number>;
44
+ recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): Promise<JsReceived>;
45
+ };
46
+ export {};
@@ -6,6 +6,7 @@ import type { JsChild, JsSpawnOptions } from './js-children.js';
6
6
  import { type FdInfo, type JsOpenOptions, type JsStatFs, type JsWriteOptions } from './js-io.js';
7
7
  import { type JsKernel } from './js-kernel.js';
8
8
  import type { JsSyncNet } from './js-net.js';
9
+ import { type JsReceived, type JsRecvmsgOptions, type JsSendmsgOptions } from './js-rights.js';
9
10
  import type { JsRunOptions, JsRunResult } from './js-run.js';
10
11
  import type { JsSyncTty } from './js-tty.js';
11
12
  import type { JsWasi, JsWasiOptions } from './js-wasi.js';
@@ -49,10 +50,16 @@ export interface JsSyncContext {
49
50
  value: unknown;
50
51
  completion: boolean;
51
52
  } | undefined;
53
+ promiseState(promise: unknown): {
54
+ state: 'pending' | 'fulfilled' | 'rejected';
55
+ value: unknown;
56
+ } | undefined;
52
57
  read(fd: number, max?: number): Uint8Array;
53
58
  write(fd: number, data: Uint8Array | string, options?: JsWriteOptions): number;
54
59
  close(fd: number): void;
55
60
  socketpair(): [number, number];
61
+ sendmsg(fd: number, data: Uint8Array | string, options?: JsSendmsgOptions): number;
62
+ recvmsg(fd: number, max?: number, options?: JsRecvmsgOptions): JsReceived;
56
63
  pipe(): [number, number];
57
64
  open(path: string, options?: JsOpenOptions): JsSyncFile;
58
65
  wasi: {
@@ -104,6 +111,6 @@ export declare class JsSyncKernel {
104
111
  bytes(req: SyncSabRequestBody): Uint8Array;
105
112
  blocking(req: SyncSabRequestBody): SyncFsResult;
106
113
  }
107
- export declare function syncOps(kernel: JsSyncKernel, shared: SyncShared): Omit<JsSyncContext, 'run' | 'spawn' | 'exit' | 'kill' | 'cred' | 'setcred' | 'kernel' | 'umask' | 'fs' | 'tty' | 'wasi' | 'net' | 'runScript'> & {
114
+ export declare function syncOps(kernel: JsSyncKernel, shared: SyncShared): Omit<JsSyncContext, 'run' | 'spawn' | 'exit' | 'kill' | 'cred' | 'setcred' | 'kernel' | 'umask' | 'fs' | 'tty' | 'wasi' | 'net' | 'runScript' | 'promiseState'> & {
108
115
  fs: Omit<JsSyncContext['fs'], 'watch'>;
109
116
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.158.1",
3
+ "version": "1.159.1",
4
4
  "description": "SLICC's wasm-realm kernel: run Emscripten programs in the browser against OPFS, with fork, spawn, pipes and waitpid",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  "devDependencies": {
66
66
  "@ai-ecoverse/py-numpy": "2.5.4-4",
67
- "@ai-ecoverse/slicc-cdp": "1.41.1",
67
+ "@ai-ecoverse/slicc-cdp": "1.41.3",
68
68
  "@ai-ecoverse/slicc-node": "2.5.2",
69
69
  "@ai-ecoverse/slicc-scrub": "1.1.0",
70
70
  "@ai-ecoverse/slicc-shared-web": "2.12.0",
@@ -82,7 +82,7 @@
82
82
  "@ai-ecoverse/wasm-procps": "4.0.7-5",
83
83
  "@ai-ecoverse/wasm-sqlite3": "3.54.1-1",
84
84
  "@ai-ecoverse/wasm-tar": "1.35.0-9",
85
- "@ai-ecoverse/wasm-tls-engine": "4.2.0-11",
85
+ "@ai-ecoverse/wasm-tls-engine": "4.2.0-12",
86
86
  "@ai-ecoverse/wasm-util-linux": "2.42.4-7",
87
87
  "@biomejs/biome": "2.5.15",
88
88
  "@types/node": "24.19.2",