@ai-ecoverse/slicc-kernel 1.118.0 → 1.119.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.
@@ -30,6 +30,7 @@ export declare class OpfsFs implements KernelFs {
30
30
  private readonly mounts;
31
31
  private readonly locks;
32
32
  private readonly lockPrefix;
33
+ readonly rootName: string | undefined;
33
34
  constructor(root: FileSystemDirectoryHandle, meta?: MetaStore, channel?: string, options?: {
34
35
  ranged?: boolean;
35
36
  locks?: LockManagerLike | null;
@@ -76,6 +76,7 @@ export interface KernelFs {
76
76
  readlink(path: string): Promise<string>;
77
77
  realpath?(path: string, follow: boolean): Promise<string>;
78
78
  createExclusive?(path: string, owner?: NewOwner): Promise<void>;
79
+ readonly rootName?: string;
79
80
  chown?(path: string, change: OwnerChange): Promise<void>;
80
81
  trackOwners?(): void;
81
82
  crossings?(mounted: (path: string) => boolean): void;
@@ -1,5 +1,6 @@
1
1
  import type { SyncFsResult } from '../realm/sync-fs-wire.js';
2
- import { type FlockKind, type LockKind, type LockTable } from './locks.js';
2
+ import type { KernelLocks } from './lock-service.js';
3
+ import { type FlockKind, type LockKind } from './locks.js';
3
4
  export interface LockTarget {
4
5
  path?: string;
5
6
  fd?: number;
@@ -96,7 +97,7 @@ export interface HostOpsContext {
96
97
  key: string;
97
98
  owner: object;
98
99
  }>;
99
- locks: LockTable | undefined;
100
+ locks: KernelLocks | undefined;
100
101
  ops: AsyncOps;
101
102
  blocking: () => AbortSignal;
102
103
  valid: (req: {
@@ -10,7 +10,7 @@ import { type Cred } from './cred.js';
10
10
  import { type FdTable, type OpenFile } from './fd-table.js';
11
11
  import type { FifoTable } from './fifo.js';
12
12
  import type { JobTable } from './jobs.js';
13
- import type { LockTable } from './locks.js';
13
+ import type { KernelLocks } from './lock-service.js';
14
14
  import type { HttpHandles } from './net/http-syscalls.js';
15
15
  import type { Resolver } from './net/resolver.js';
16
16
  import type { MountLine, ProcessListing } from './proc-info.js';
@@ -85,7 +85,7 @@ export interface SpawnWasmOptions {
85
85
  ptys?: PtyTable;
86
86
  net?: LoopbackNet;
87
87
  http?: HttpHandles;
88
- locks?: LockTable;
88
+ locks?: KernelLocks;
89
89
  fifos?: FifoTable;
90
90
  sems?: SemTable;
91
91
  onReap?: (pid: number) => void;
@@ -0,0 +1,92 @@
1
+ import { type LockManagerLike } from '../fs/remote.js';
2
+ import { type FlockKind, type LockKind, type RecordLock } from './locks.js';
3
+ export declare const PRUNE_MS = 1000;
4
+ export declare const LOCKS_PROTOCOL = "v1";
5
+ type Range = {
6
+ start: number;
7
+ end: number;
8
+ };
9
+ type Want = {
10
+ key: string;
11
+ kind: LockKind;
12
+ } & Range;
13
+ export interface KernelLocks {
14
+ readonly flocks: {
15
+ set(key: string, owner: object, kind: FlockKind | 'unlock'): boolean | Promise<boolean>;
16
+ wait(key: string, owner: object, kind: FlockKind, blocking: () => AbortSignal): Promise<void>;
17
+ drop(owner: object): void;
18
+ };
19
+ holder(key: string, owner: number, want: Want): RecordLock | undefined | Promise<RecordLock | undefined>;
20
+ set(key: string, owner: number, kind: LockKind | 'unlock', start: number, end: number): boolean | Promise<boolean>;
21
+ wait(key: string, owner: number, kind: LockKind, range: Range, blocking: () => AbortSignal): Promise<void>;
22
+ holds(owner: number): boolean;
23
+ dropFile(key: string, owner: number): void;
24
+ release(pid: number): void;
25
+ lock(pid: number, path: string, exclusive: boolean, fd: number): boolean;
26
+ unlock(pid: number, path: string): void;
27
+ closed(pid: number, fd: number): void;
28
+ }
29
+ export interface LockServiceOptions {
30
+ root: string;
31
+ locks: LockManagerLike & {
32
+ request(name: string, options: {
33
+ ifAvailable: true;
34
+ }, cb: (lock: unknown) => Promise<void>): Promise<unknown>;
35
+ };
36
+ channel?: (name: string) => BroadcastChannel;
37
+ }
38
+ export declare class LockService implements KernelLocks {
39
+ readonly kernel: `${string}-${string}-${string}-${string}-${string}`;
40
+ private table;
41
+ private leader;
42
+ private readonly role;
43
+ private readonly channel;
44
+ private readonly locks;
45
+ private readonly root;
46
+ private readonly pending;
47
+ private next;
48
+ private readonly owners;
49
+ private readonly ownerOf;
50
+ private nextRemote;
51
+ private readonly tokens;
52
+ private readonly flockIds;
53
+ private readonly flockOwners;
54
+ private nextFlock;
55
+ private readonly granted;
56
+ private readonly waiting;
57
+ private settled;
58
+ private pruner;
59
+ readonly flocks: KernelLocks['flocks'];
60
+ constructor(options: LockServiceOptions);
61
+ private aliveOf;
62
+ private elect;
63
+ private lead;
64
+ private receive;
65
+ private answered;
66
+ private request;
67
+ private ownerFor;
68
+ private tokenFor;
69
+ private serve;
70
+ private signalOf;
71
+ private blockFor;
72
+ private watchRemotes;
73
+ prune(): Promise<void>;
74
+ private reassert;
75
+ private adopt;
76
+ private flockIdOf;
77
+ private ask;
78
+ holder(key: string, owner: number, want: Want): Promise<RecordLock | undefined>;
79
+ set(key: string, owner: number, kind: LockKind | 'unlock', start: number, end: number): Promise<boolean>;
80
+ wait(key: string, owner: number, kind: LockKind, range: Range, blocking: () => AbortSignal): Promise<void>;
81
+ holds(owner: number): boolean;
82
+ dropFile(key: string, owner: number): void;
83
+ release(pid: number): void;
84
+ private flockSet;
85
+ private flockWait;
86
+ private flockDrop;
87
+ lock(pid: number, path: string, exclusive: boolean, fd: number): boolean;
88
+ unlock(pid: number, path: string): void;
89
+ closed(pid: number, fd: number): void;
90
+ }
91
+ export declare function kernelLocks(root: string | undefined): KernelLocks;
92
+ export {};
@@ -23,6 +23,7 @@ export declare class FlockTable {
23
23
  private free;
24
24
  set(key: string, owner: object, kind: FlockKind | 'unlock'): boolean;
25
25
  wait(key: string, owner: object, kind: FlockKind, blocking: () => AbortSignal): Promise<void>;
26
+ entries(): Array<[string, object, FlockKind]>;
26
27
  drop(owner: object): void;
27
28
  }
28
29
  export declare class LockTable {
@@ -41,6 +42,7 @@ export declare class LockTable {
41
42
  private changed;
42
43
  private wake;
43
44
  private store;
45
+ entries(): Array<[string, RecordLock[]]>;
44
46
  holds(owner: number): boolean;
45
47
  dropFile(key: string, owner: number): void;
46
48
  lock(pid: number, path: string, exclusive: boolean, fd: number): boolean;
@@ -14,7 +14,7 @@ import { type DeviceAccess, type FdTable, type HeldMeta, type KernelFdKind, type
14
14
  import type { FifoTable } from './fifo.js';
15
15
  import { type HostSyscall } from './host-ops.js';
16
16
  import type { JobTable } from './jobs.js';
17
- import type { LockTable } from './locks.js';
17
+ import type { KernelLocks } from './lock-service.js';
18
18
  import { type HttpHandles, type HttpSyscall } from './net/http-syscalls.js';
19
19
  import { Resolver } from './net/resolver.js';
20
20
  import type { MountLine, ProcessListing } from './proc-info.js';
@@ -342,6 +342,7 @@ export interface FdInfo {
342
342
  access?: DeviceAccess;
343
343
  name?: string;
344
344
  terminal?: string;
345
+ fifo?: string;
345
346
  }
346
347
  export declare function isWasmSyscall(req: object): req is WasmSyscall;
347
348
  export declare const DEFAULT_UMASK = 18;
@@ -399,7 +400,7 @@ export interface WasmProcessOptions {
399
400
  ptys?: PtyTable;
400
401
  net?: LoopbackNet;
401
402
  http?: HttpHandles;
402
- locks?: LockTable;
403
+ locks?: KernelLocks;
403
404
  fifos?: FifoTable;
404
405
  sems?: SemTable;
405
406
  resolver?: Resolver;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.118.0",
3
+ "version": "1.119.0",
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",