@ai-ecoverse/slicc-kernel 1.151.1 → 1.152.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.
@@ -1,6 +1,6 @@
1
1
  import { type MetaStore } from './meta.js';
2
2
  import { type LockManagerLike, type RemoteListener } from './remote.js';
3
- import { type CopyOptions, type FsStat, type KernelFs, type NewOwner, type OwnerChange, type Peers, type Perm } from './types.js';
3
+ import { type CopyOptions, type FsStat, type KernelFs, type NewOwner, type OwnerChange, type Peers, type Perm, type PwriteOptions } from './types.js';
4
4
  export type OpfsOp = 'lookup' | 'read' | 'write' | 'commit' | 'sidecar';
5
5
  export declare function translate(err: unknown, path: string, op?: OpfsOp, mapped?: boolean): Error;
6
6
  export interface WriteSession {
@@ -84,6 +84,8 @@ export declare class OpfsFs implements KernelFs {
84
84
  private calls;
85
85
  private others;
86
86
  opfsCalls(): number;
87
+ private idWrites;
88
+ fileIdWrites(): number;
87
89
  opfsOps(): number;
88
90
  private io;
89
91
  private fresh;
@@ -141,7 +143,7 @@ export declare class OpfsFs implements KernelFs {
141
143
  }>;
142
144
  version(path: string, cached?: boolean): Promise<string>;
143
145
  pread(path: string, offset: number, length: number): Promise<Uint8Array>;
144
- pwrite(path: string, offset: number, bytes: Uint8Array): Promise<void>;
146
+ pwrite(path: string, offset: number, bytes: Uint8Array, _transfer?: boolean, options?: PwriteOptions): Promise<void>;
145
147
  private keptFor;
146
148
  private writeAt;
147
149
  private readonly fileWrites;
@@ -112,7 +112,7 @@ export interface KernelFs {
112
112
  utimes(path: string, atime: Date, mtime: Date): Promise<void>;
113
113
  lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;
114
114
  pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;
115
- pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;
115
+ pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean, options?: PwriteOptions): Promise<void>;
116
116
  truncate?(path: string, size: number): Promise<void>;
117
117
  protect?(prefixes: readonly string[], versions?: boolean): void;
118
118
  unguarded?(): KernelFs;
@@ -133,6 +133,10 @@ export interface KernelFs {
133
133
  ackMs: readonly number[];
134
134
  };
135
135
  opfsOps?(): number;
136
+ fileIdWrites?(): number;
137
+ }
138
+ export interface PwriteOptions {
139
+ create?: false;
136
140
  }
137
141
  export type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;
138
142
  export declare function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined;
@@ -36,7 +36,7 @@ export type { ProcessMountPolicy, ProcessMountRequest } from './mount/syscall.js
36
36
  export type { JsChild, JsExited, JsSpawnOptions, JsStdio } from './process/js/js-children.js';
37
37
  export type { JsCrontabAnswer, JsCrontabCall, JsFdStatus, JsFdType, JsFile, JsOpenOptions, JsProgramContext, JsSelected, JsSelectSets, JsSignal, JsSudoAnswer, JsWriteOptions, } from './process/js/js-context.js';
38
38
  export type { JsStatFs } from './process/js/js-io.js';
39
- export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, JsResolveOptions, JsTlsCipher, JsTlsOptions, JsTlsSession, } from './process/js/js-net.js';
39
+ export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, JsResolveOptions, JsTlsChoice, JsTlsCipher, JsTlsContext, JsTlsContextOptions, JsTlsOffer, JsTlsOptions, JsTlsSelect, JsTlsServerSession, JsTlsSession, } from './process/js/js-net.js';
40
40
  export type { JsRunOptions, JsRunResult, JsRunStdio } from './process/js/js-run.js';
41
41
  export type { JsCred, JsSyncContext, JsSyncFile } from './process/js/js-sync.js';
42
42
  export type { JsThread, JsThreadContext, JsThreadSpawnOptions } from './process/js/js-thread.js';
@@ -93,6 +93,7 @@ export interface SpawnWasmOptions {
93
93
  now: number;
94
94
  renames: Array<[string, string]>;
95
95
  };
96
+ fileId?: (path: string) => Promise<string> | undefined;
96
97
  renameSeq?: (from: string, to: string) => number | undefined;
97
98
  mounts?: () => MountLine[];
98
99
  mount?: WasmProcessOptions['mount'];
@@ -1,5 +1,5 @@
1
1
  import { type TlsCipher } from './tls-ciphers.js';
2
- import { type TlsEngine, type TlsSession, type TlsStore } from './tls-engine.js';
2
+ import { type TlsEngine, type TlsLeaf, type TlsSession, type TlsStore } from './tls-engine.js';
3
3
  import type { UplinkConn } from './uplink.js';
4
4
  export declare function verifyCode(flags: number): string | undefined;
5
5
  export interface TlsClientInfo {
@@ -47,7 +47,18 @@ export interface TlsServerInfo {
47
47
  peerCertificates: Uint8Array[];
48
48
  cipher: TlsCipher;
49
49
  }
50
- export declare function tlsServer(conn: UplinkConn, session: TlsSession, clientCerts: boolean): Promise<{
50
+ export interface ServerOffer {
51
+ servername: string;
52
+ protocols: string[];
53
+ }
54
+ export interface ServerChoice {
55
+ leaf?: TlsLeaf;
56
+ alpn?: string;
57
+ refuse?: number;
58
+ done?: () => void;
59
+ }
60
+ export type ServerSelect = (offer: ServerOffer) => Promise<ServerChoice>;
61
+ export declare function tlsServer(conn: UplinkConn, session: TlsSession, clientCerts: boolean, select?: ServerSelect): Promise<{
51
62
  conn: UplinkConn;
52
63
  info: TlsServerInfo;
53
64
  }>;
@@ -1,6 +1,6 @@
1
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
2
  type TlsClientExport = 'tls_ca_new' | 'tls_ca_add_der' | 'tls_ca_add_bundle' | 'tls_ca_free' | 'tls_client_new' | 'tls_handshake' | 'tls_verify_result' | 'tls_verify_info' | 'tls_alpn' | 'tls_version' | 'tls_peer_count' | 'tls_peer_der';
3
- type TlsSessionExport = 'tls_leaf_import' | 'tls_server_new' | 'tls_sni' | 'tls_client_cert' | 'tls_ciphersuite' | 'tls_name_mismatch' | 'tls_last_alert' | 'tls_chain_verify';
3
+ type TlsSessionExport = 'tls_leaf_import' | 'tls_server_new' | 'tls_sni' | 'tls_server_select' | 'tls_server_refuse' | 'tls_client_alpn' | 'tls_client_cert' | 'tls_ciphersuite' | 'tls_name_mismatch' | 'tls_last_alert' | 'tls_chain_verify';
4
4
  export type TlsEngineModule = {
5
5
  readonly HEAPU8: Uint8Array;
6
6
  } & {
@@ -18,6 +18,8 @@ export declare const TLS_CLIENT_NO_SNI = 2;
18
18
  export declare const TLS_CLIENT_VERIFY_CHAIN_ONLY = 4;
19
19
  export declare const TLS_SERVER_REQUEST_CERT = 1;
20
20
  export declare const TLS_SERVER_REQUIRE_CERT = 2;
21
+ export declare const TLS_SERVER_SELECT = 4;
22
+ export declare const TLS_HANDSHAKE_SELECT = 2;
21
23
  export declare class TlsError extends Error {
22
24
  readonly code: number;
23
25
  constructor(code: number, message: string);
@@ -33,7 +35,8 @@ export declare class TlsEngine {
33
35
  session(leaf: TlsLeaf, host: string): TlsSession;
34
36
  get serverSessions(): boolean;
35
37
  importLeaf(chain: Uint8Array, key: Uint8Array, pass: Uint8Array): TlsLeaf;
36
- serverSession(leaf: TlsLeaf, alpn: readonly string[], clientCa: TlsStore | undefined, flags: number): TlsSession;
38
+ get serverSelect(): boolean;
39
+ serverSession(leaf: TlsLeaf | undefined, alpn: readonly string[], clientCa: TlsStore | undefined, flags: number): TlsSession;
37
40
  withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T;
38
41
  withSecret<T>(bytes: Uint8Array, fn: (ptr: number) => T): T;
39
42
  intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array;
@@ -78,6 +81,10 @@ export declare class TlsSession {
78
81
  free(): void;
79
82
  private get c();
80
83
  handshake(): boolean;
84
+ step(): number;
85
+ clientAlpn(): string[];
86
+ select(leaf: TlsLeaf | undefined, alpn: string | undefined): void;
87
+ refuse(alert: number): void;
81
88
  get verifyResult(): number;
82
89
  get version(): number;
83
90
  get sni(): string;
@@ -1,5 +1,7 @@
1
+ import { type FdTable } from '../fd-table.js';
1
2
  import type { KernelSocket } from '../socket.js';
2
3
  import type { TlsCipher } from './tls-ciphers.js';
4
+ import { type ServerOffer } from './tls-client.js';
3
5
  import { type TlsEngine, type TlsLeaf, type TlsStore } from './tls-engine.js';
4
6
  import { type ClientCertRequest, type SecureProcess } from './tls-uplink.js';
5
7
  export interface ServeRequest {
@@ -9,8 +11,14 @@ export interface ServeRequest {
9
11
  rejectUnauthorized?: boolean;
10
12
  alpn?: string[];
11
13
  handshakeTimeout?: number;
14
+ select?: boolean;
12
15
  listener?: KernelSocket;
13
16
  }
17
+ export interface SelectRequest {
18
+ context?: number;
19
+ alpn?: string;
20
+ refuse?: number;
21
+ }
14
22
  export interface ServedSession {
15
23
  path: 'kernel';
16
24
  protocol: 'TLSv1.2' | 'TLSv1.3';
@@ -23,7 +31,7 @@ export interface ServedSession {
23
31
  }
24
32
  interface Server {
25
33
  engine: TlsEngine;
26
- leaf: TlsLeaf;
34
+ leaf: TlsLeaf | undefined;
27
35
  store: TlsStore | undefined;
28
36
  alpn: string[];
29
37
  flags: number;
@@ -32,5 +40,12 @@ interface Server {
32
40
  }
33
41
  export declare function serverOf(proc: SecureProcess, req: ServeRequest): Promise<Server>;
34
42
  export declare function listenSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<void>;
35
- export declare function serveSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<ServedSession>;
43
+ export declare function serveSecure(proc: SecureProcess, socket: KernelSocket, req: ServeRequest): Promise<ServedSession | {
44
+ select: ServerOffer;
45
+ }>;
46
+ export declare const TLS_CONTEXTS_MAX = 64;
47
+ export declare function contextSecure(proc: SecureProcess & {
48
+ fds: FdTable;
49
+ }, cert: ClientCertRequest | undefined): Promise<number>;
50
+ export declare function selectSecure(fds: FdTable, socket: KernelSocket, req: SelectRequest): Promise<ServedSession>;
36
51
  export {};
@@ -55,6 +55,7 @@ export interface ProcessListing {
55
55
  opfsOps?: number;
56
56
  cwdChecks?: number;
57
57
  staleFds?: number;
58
+ fileIds?: number;
58
59
  renameAcks?: {
59
60
  acks: number;
60
61
  busy: number;
@@ -91,6 +91,16 @@ export type SocketSyscall = {
91
91
  rejectUnauthorized?: boolean;
92
92
  alpn?: string[];
93
93
  handshakeTimeout?: number;
94
+ select?: boolean;
95
+ } | {
96
+ op: 'sock-tls-context';
97
+ cert?: ClientCertRequest;
98
+ } | {
99
+ op: 'sock-tls-select';
100
+ fd: number;
101
+ context?: number;
102
+ alpn?: string;
103
+ refuse?: number;
94
104
  } | {
95
105
  op: 'sock-recvfrom';
96
106
  fd: number;
@@ -94,6 +94,7 @@ export declare class KernelSocket implements KernelFile {
94
94
  serving: {
95
95
  release(): void;
96
96
  } | undefined;
97
+ pending: (() => void) | undefined;
97
98
  private served;
98
99
  get loopbackLinked(): boolean;
99
100
  secureLink<T>(make: (raw: UplinkConn) => Promise<{
@@ -422,6 +422,7 @@ export declare class Launcher {
422
422
  fsFor(tag: string | undefined): KernelFs;
423
423
  isWriter(tags: readonly string[] | undefined, base?: number): boolean;
424
424
  private stackFor;
425
+ private rootFileId;
425
426
  private flushingPeers;
426
427
  private rewritten;
427
428
  private flushOpen;
@@ -54,6 +54,7 @@ export declare class HeldSet extends Set<HeldPaths> {
54
54
  constructor(idle: (path: string) => void);
55
55
  add(holds: HeldPaths): this;
56
56
  doubt(paths: readonly string[], over?: string): void;
57
+ bindIds(id: (path: string) => Promise<string> | undefined): Promise<void>;
57
58
  delete(holds: HeldPaths): boolean;
58
59
  }
59
60
  export declare function heldUnder(held: Iterable<Map<string, number>>, target: string): boolean;
@@ -80,8 +81,10 @@ export declare class HeldPaths extends Map<string, number> implements UnlinkHold
80
81
  doubt(over: string, exact?: boolean): void;
81
82
  boundIno(handle: number): {
82
83
  ino: number;
84
+ fid?: string;
83
85
  doubt: number;
84
86
  } | undefined;
87
+ bindIds(id: (path: string) => Promise<string> | undefined): Promise<void>;
85
88
  trust(handle: number, doubt: number): void;
86
89
  keptFor(handle: number): KeptFile | undefined;
87
90
  holdsHandle(handle: number): boolean;
@@ -90,7 +93,7 @@ export declare class HeldPaths extends Map<string, number> implements UnlinkHold
90
93
  unkeep(path: string, file: KeptFile): void;
91
94
  private letGo;
92
95
  releaseAll(): void;
93
- hold(path: string, on: boolean, open?: boolean, real?: string, handle?: number, ino?: number): number | undefined;
96
+ hold(path: string, on: boolean, open?: boolean, real?: string, handle?: number, ino?: number, fid?: string): number | undefined;
94
97
  private holdOpen;
95
98
  private holdWrite;
96
99
  own<T>(path: string, op: () => Promise<T>): Promise<T>;
@@ -42,6 +42,26 @@ export interface JsTlsOptions {
42
42
  server?: boolean;
43
43
  requestCert?: boolean;
44
44
  handshakeTimeout?: number;
45
+ select?: JsTlsSelect;
46
+ }
47
+ export interface JsTlsOffer {
48
+ servername: string;
49
+ protocols: string[];
50
+ }
51
+ export interface JsTlsChoice {
52
+ context?: JsTlsContext | number;
53
+ alpn?: string;
54
+ refuse?: string | number;
55
+ }
56
+ export type JsTlsSelect = (offer: JsTlsOffer) => JsTlsChoice | undefined | Promise<JsTlsChoice | undefined>;
57
+ export interface JsTlsContext {
58
+ readonly fd: number;
59
+ close(): Promise<void>;
60
+ }
61
+ export interface JsTlsContextOptions {
62
+ cert: unknown;
63
+ key: unknown;
64
+ passphrase?: string;
45
65
  }
46
66
  export interface JsTlsServerSession {
47
67
  readonly path: 'kernel';
@@ -92,6 +112,7 @@ export interface JsNet {
92
112
  listen(options?: JsListenOptions): Promise<JsListener>;
93
113
  connect(options: JsConnectOptions): Promise<JsConnection>;
94
114
  secure(conn: JsConnection, tls: JsTlsOptions): Promise<JsConnection>;
115
+ tlsContext(options: JsTlsContextOptions): Promise<JsTlsContext>;
95
116
  resolve(name: string, options?: JsResolveOptions): Promise<string[]>;
96
117
  }
97
118
  export interface NetIo {
@@ -3,7 +3,7 @@ import type { HeldCwd } from '../../kernel/held-cwd.js';
3
3
  import type { WasmSyscall } from '../../kernel/process.js';
4
4
  import { type SyncFsBridgeStat, type SyncFsPosixBridge } from '../../realm/sync-fs-wire.js';
5
5
  import type { ProcessSys } from '../kernel-streams.js';
6
- import { FileBuffer, type WasiEntry } from './wasi-files.js';
6
+ import { FileBuffer, LocalFile, type WasiEntry } from './wasi-files.js';
7
7
  export interface WasiKernel {
8
8
  sys: ProcessSys;
9
9
  call(req: WasmSyscall): unknown;
@@ -109,6 +109,7 @@ export declare class WasiFds {
109
109
  type: 'kernel';
110
110
  }>): boolean;
111
111
  flushAll(): void;
112
+ synced(file: LocalFile): void;
112
113
  flushEarly(): void;
113
114
  reread(fd: number): void;
114
115
  flushPath(path: string): void;
@@ -34,6 +34,9 @@ export declare class FileBuffer {
34
34
  keep(): void;
35
35
  prefetch(): void;
36
36
  load(): Uint8Array;
37
+ private spoiled;
38
+ spoil(): void;
39
+ private live;
37
40
  size(): number;
38
41
  pread(max: number, at: number): Uint8Array;
39
42
  fits(end: number): void;
@@ -10,12 +10,14 @@ export interface SyncFsTokenEntry {
10
10
  quota: number;
11
11
  usage: number;
12
12
  } | undefined>;
13
- hold?: (path: string, held: boolean, open: boolean, real?: string, handle?: number, ino?: number) => number | undefined;
13
+ hold?: (path: string, held: boolean, open: boolean, real?: string, handle?: number, ino?: number, fid?: string) => number | undefined;
14
14
  keptFor?: (handle: number) => KeptFile | undefined;
15
15
  boundIno?: (handle: number) => {
16
16
  ino: number;
17
+ fid?: string;
17
18
  doubt: number;
18
19
  } | undefined;
20
+ fileId?: (path: string) => Promise<string> | undefined;
19
21
  trust?: (handle: number, doubt: number) => void;
20
22
  gate?: <T>(path: string, op: () => Promise<T>) => Promise<T>;
21
23
  unlinked?: (path: string) => KeptFile | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.151.1",
3
+ "version": "1.152.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",