@ai-ecoverse/slicc-kernel 1.103.0 → 1.103.2
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 +146 -31
- package/dist/kernel-worker.js.map +4 -4
- package/dist/meta.js.map +2 -2
- package/dist/node-process-worker.js +39 -46
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +151 -36
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +54 -61
- package/dist/process-worker.js.map +3 -3
- package/dist/types/fs/meta.d.ts +1 -0
- package/dist/types/fs/types.d.ts +2 -0
- package/dist/types/kernel/children.d.ts +1 -0
- package/dist/types/kernel/process.d.ts +1 -0
- package/dist/types/kernel/run-child.d.ts +1 -0
- package/dist/types/kernel/socket-nodes.d.ts +20 -0
- package/dist/types/kernel/socket-syscalls.d.ts +2 -0
- package/dist/types/kernel/socket.d.ts +11 -5
- package/dist/types/launcher.d.ts +1 -0
- package/dist/types/realm/emscripten-vfs-hook.d.ts +1 -0
- package/dist/types/realm/sync-fs-dispatch.d.ts +1 -0
- package/dist/types/realm/sync-fs-wire.d.ts +1 -0
- package/package.json +3 -3
package/dist/meta.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/fs/path-map.ts", "../src/fs/meta.ts", "../src/fs/types.ts", "../src/meta.ts"],
|
|
4
|
-
"sourcesContent": ["function parentOf(path: string): string | undefined {\n if (path === '/' || path === '') return undefined;\n const at = path.lastIndexOf('/');\n return at <= 0 ? '/' : path.slice(0, at);\n}\n\nexport class PathMap<V> {\n private readonly values = new Map<string, V>();\n private readonly children = new Map<string, Set<string>>();\n\n get size(): number {\n return this.values.size;\n }\n\n has(path: string): boolean {\n return this.values.has(path);\n }\n\n get(path: string): V | undefined {\n return this.values.get(path);\n }\n\n keys(): IterableIterator<string> {\n return this.values.keys();\n }\n\n set(path: string, value: V): this {\n if (!this.values.has(path)) this.link(path);\n this.values.set(path, value);\n return this;\n }\n\n delete(path: string): boolean {\n if (!this.values.delete(path)) return false;\n this.prune(path);\n return true;\n }\n\n subtree(root: string): string[] {\n const out: string[] = [];\n const stack = [root];\n for (let path = stack.pop(); path !== undefined; path = stack.pop()) {\n if (this.values.has(path)) out.push(path);\n const below = this.children.get(path);\n if (below) for (const child of below) stack.push(child);\n }\n return out;\n }\n\n entries(): IterableIterator<[string, V]> {\n return this.values.entries();\n }\n\n deleteTree(root: string): void {\n const stack = [root];\n for (let path = stack.pop(); path !== undefined; path = stack.pop()) {\n this.values.delete(path);\n const below = this.children.get(path);\n if (below) for (const child of below) stack.push(child);\n this.children.delete(path);\n }\n this.prune(root);\n }\n\n clear(): void {\n this.values.clear();\n this.children.clear();\n }\n\n private link(path: string): void {\n for (let child = path, parent = parentOf(path); parent !== undefined; ) {\n const set = this.children.get(parent);\n if (set?.has(child)) return;\n if (set) set.add(child);\n else this.children.set(parent, new Set([child]));\n child = parent;\n parent = parentOf(parent);\n }\n }\n\n private prune(path: string): void {\n for (let child = path, parent = parentOf(path); parent !== undefined; ) {\n if (this.values.has(child) || this.children.has(child)) return;\n const set = this.children.get(parent);\n set?.delete(child);\n if (set && set.size > 0) return;\n this.children.delete(parent);\n child = parent;\n parent = parentOf(parent);\n }\n }\n}\n", "import { PathMap } from './path-map.ts';\nexport interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n timesAt?: number;\n timesBy?: string;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n dir?: string;\n uid?: number;\n gid?: number;\n heir?: [number, number];\n writes?: number;\n epoch?: number;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n fresh?(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n absent?(path: string): boolean;\n removeFile?(path: string): Promise<void>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new PathMap<MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async fresh(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return this.get(paths);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = this.entries.subtree(from).map((path) => this.entries.get(path) as MetaEntry);\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const path of paths) this.entries.deleteTree(path);\n }\n\n absent(path: string): boolean {\n return !this.entries.has(path);\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e).filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e).filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e);\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nconst REMOVE_BATCH = 256;\nconst REMOVE_WAIT_MS = 5;\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new PathMap<MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n private readonly listeners = new Set<(change: Invalidation) => void>();\n\n listen(listener: (change: Invalidation) => void): void {\n this.listeners.add(listener);\n }\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => {\n this.drop(data as Invalidation);\n for (const listener of this.listeners) listener(data as Invalidation);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const tree of trees) this.cache.deleteTree(tree);\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n this.settleRemoves();\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async fresh(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const [transaction, store] = this.transaction('readonly');\n const requests = paths.map((path) => store.get(path));\n return settle(transaction, () =>\n requests.map((request) => (request.result as MetaEntry | undefined) ?? undefined)\n );\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async updateMany(\n changes: ReadonlyArray<{ path: string; change: (entry: MetaEntry | undefined) => MetaEntry }>\n ): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const { path, change } of changes) {\n const request = store.get(path);\n request.onsuccess = () => store.put(change(request.result));\n }\n await settle(transaction, () => undefined);\n this.changed({ paths: changes.map(({ path }) => path) });\n }\n\n close(): void {\n this.channel.close();\n this.db.close();\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n absent(path: string): boolean {\n return this.cache.has(path) && this.cache.get(path) === null;\n }\n\n private removing = new Map<string, string>();\n private removeTimer: ReturnType<typeof setTimeout> | undefined;\n\n async remove(paths: readonly string[]): Promise<void> {\n this.settleRemoves();\n return this.removeNow(paths);\n }\n\n async removeFile(path: string): Promise<void> {\n const known = this.cache.get(path);\n if (!known) return this.remove([path]);\n this.generation++;\n this.cache.set(path, null);\n this.removing.set(path, JSON.stringify(known));\n if (this.removing.size >= REMOVE_BATCH) return this.flushRemoves();\n this.removeTimer ??= setTimeout(\n () => void this.flushRemoves().catch(() => undefined),\n REMOVE_WAIT_MS\n );\n }\n\n private async removeNow(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n private settleRemoves(): void {\n if (this.removing.size > 0) void this.flushRemoves().catch(() => undefined);\n }\n\n private flushRemoves(): Promise<void> {\n clearTimeout(this.removeTimer);\n this.removeTimer = undefined;\n const batch = this.removing;\n if (batch.size === 0) return Promise.resolve();\n this.removing = new Map();\n const [transaction, store] = this.transaction('readwrite');\n for (const [path, seen] of batch) {\n const request = store.get(path);\n request.onsuccess = () => {\n if (request.result && JSON.stringify(request.result) === seen) store.delete(path);\n };\n }\n const paths = [...batch.keys()];\n return settle(transaction, () => void this.channel.postMessage({ paths }));\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type UsersMode = 'off' | 'report' | 'enforce';\n\nexport const DEFAULT_USERS: UsersMode = 'enforce';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport interface Perm {\n uid: number;\n gid: number;\n mode?: number;\n link?: string;\n}\n\nexport interface NewOwner extends Owner {\n mode?: number;\n parents?: number;\n}\n\nexport interface OwnerChange {\n uid?: number;\n gid?: number;\n follow?: boolean;\n kind?: 'chown' | 'adopt' | 'new';\n mode?: number;\n}\n\nexport interface HeldEntry {\n writeFile: KernelFs['writeFile'];\n direct: boolean;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n exclusive?<T>(path: string, run: (held: HeldEntry) => Promise<T>, follow?: boolean): Promise<T>;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string, owner?: NewOwner): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean; owner?: NewOwner }): Promise<void>;\n rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean; file?: boolean }\n ): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string, follow?: boolean): Promise<void>;\n links?(path: string): boolean;\n symlink(target: string, path: string, owner?: NewOwner): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string, owner?: NewOwner): Promise<void>;\n chown?(path: string, change: OwnerChange): Promise<void>;\n trackOwners?(): void;\n crossings?(mounted: (path: string) => boolean): void;\n ancestry?(path: string): Promise<Array<Perm | undefined>>;\n hasOwner?(path: string): Promise<boolean>;\n chmod(path: string, mode: number): Promise<void>;\n append?(path: string, bytes: Uint8Array): Promise<number>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n protect?(prefixes: readonly string[], versions?: boolean): void;\n unguarded?(): KernelFs;\n noLinks?(): KernelFs;\n mayChange?(path: string, follow: boolean, whole?: boolean): Promise<void>;\n readVersioned?(path: string, cached?: boolean): Promise<{ bytes: Uint8Array; version: string }>;\n version?(path: string, cached?: boolean): Promise<string>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function mayLink(fs: { links?(path: string): boolean }, path: string): boolean {\n return fs.links?.(path) ?? true;\n}\n\nexport function modeOption(mode: unknown): number {\n if (!Number.isInteger(mode) || (mode as number) < 0 || (mode as number) > 0o7777) {\n throw fsError('EINVAL', `not a mode: ${String(mode)}`);\n }\n return mode as number;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n\nexport interface Redirect {\n of: string;\n to: string;\n}\n\nexport function redirected(of: string, to: string): Error {\n return Object.assign(fsError('EXDEV', `${of} leads to the mount at ${to}`), {\n redirect: { of: normalizePath(of), to: normalizePath(to) },\n });\n}\n\nexport function redirectOf(err: unknown): Redirect | undefined {\n return (err as { redirect?: Redirect } | null)?.redirect;\n}\n", "import { META_DB, type MetaEntry, openMeta } from './fs/meta.ts';\nimport { fsError, normalizePath } from './fs/types.ts';\n\nexport interface MetadataEntry {\n path: string;\n mode?: number;\n uid?: number;\n gid?: number;\n}\n\nexport interface WriteMetadataOptions {\n metadata?: string;\n indexedDB?: IDBFactory;\n}\n\nconst MAX_ID = 0xfffffffe;\n\nfunction id(value: unknown, what: string): number {\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_ID) {\n throw fsError('EINVAL', `not a ${what}: ${String(value)}`);\n }\n return value as number;\n}\n\nfunction checked(entry: MetadataEntry): MetadataEntry {\n if (!String(entry.path).startsWith('/'))\n throw fsError('EINVAL', `not an absolute path: ${entry.path}`);\n const path = normalizePath(String(entry.path));\n if ((entry.uid === undefined) !== (entry.gid === undefined)) {\n throw fsError('EINVAL', `${path}: give both uid and gid, or neither`);\n }\n const mode = entry.mode;\n if (mode !== undefined && (!Number.isInteger(mode) || mode < 0 || mode > 0o7777)) {\n throw fsError('EINVAL', `${path}: not a mode: ${String(mode)}`);\n }\n return {\n path,\n ...(mode !== undefined ? { mode } : {}),\n ...(entry.uid !== undefined ? { uid: id(entry.uid, 'uid'), gid: id(entry.gid, 'gid') } : {}),\n };\n}\n\nasync function present(root: FileSystemDirectoryHandle, path: string): Promise<boolean> {\n const parts = path.split('/').filter(Boolean);\n let dir = root;\n for (const [i, name] of parts.entries()) {\n const last = i === parts.length - 1;\n try {\n dir = await dir.getDirectoryHandle(name);\n } catch {\n if (!last) return false;\n return dir.getFileHandle(name).then(\n () => true,\n () => false\n );\n }\n }\n return true;\n}\n\nexport async function writeMetadata(\n root: FileSystemDirectoryHandle,\n entries: readonly MetadataEntry[],\n options: WriteMetadataOptions = {}\n): Promise<void> {\n const merged = new Map<string, MetadataEntry>();\n for (const want of entries.map(checked))\n merged.set(want.path, { ...merged.get(want.path), ...want });\n const wanted = [...merged.values()];\n for (const { path } of wanted) {\n if (!(await present(root, path))) throw fsError('ENOENT', path);\n }\n const factory = options.indexedDB ?? globalThis.indexedDB;\n const store = await openMeta(options.metadata ?? META_DB, factory);\n const ctimeMs = Date.now();\n try {\n await store.updateMany(\n wanted.map((want) => ({\n path: want.path,\n change: (entry: MetaEntry | undefined): MetaEntry => ({\n ...entry,\n path: want.path,\n ...(want.mode !== undefined ? { mode: want.mode } : {}),\n ...(want.uid !== undefined ? { uid: want.uid, gid: want.gid as number } : {}),\n ctimeMs,\n }),\n }))\n );\n } finally {\n store.close();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["function parentOf(path: string): string | undefined {\n if (path === '/' || path === '') return undefined;\n const at = path.lastIndexOf('/');\n return at <= 0 ? '/' : path.slice(0, at);\n}\n\nexport class PathMap<V> {\n private readonly values = new Map<string, V>();\n private readonly children = new Map<string, Set<string>>();\n\n get size(): number {\n return this.values.size;\n }\n\n has(path: string): boolean {\n return this.values.has(path);\n }\n\n get(path: string): V | undefined {\n return this.values.get(path);\n }\n\n keys(): IterableIterator<string> {\n return this.values.keys();\n }\n\n set(path: string, value: V): this {\n if (!this.values.has(path)) this.link(path);\n this.values.set(path, value);\n return this;\n }\n\n delete(path: string): boolean {\n if (!this.values.delete(path)) return false;\n this.prune(path);\n return true;\n }\n\n subtree(root: string): string[] {\n const out: string[] = [];\n const stack = [root];\n for (let path = stack.pop(); path !== undefined; path = stack.pop()) {\n if (this.values.has(path)) out.push(path);\n const below = this.children.get(path);\n if (below) for (const child of below) stack.push(child);\n }\n return out;\n }\n\n entries(): IterableIterator<[string, V]> {\n return this.values.entries();\n }\n\n deleteTree(root: string): void {\n const stack = [root];\n for (let path = stack.pop(); path !== undefined; path = stack.pop()) {\n this.values.delete(path);\n const below = this.children.get(path);\n if (below) for (const child of below) stack.push(child);\n this.children.delete(path);\n }\n this.prune(root);\n }\n\n clear(): void {\n this.values.clear();\n this.children.clear();\n }\n\n private link(path: string): void {\n for (let child = path, parent = parentOf(path); parent !== undefined; ) {\n const set = this.children.get(parent);\n if (set?.has(child)) return;\n if (set) set.add(child);\n else this.children.set(parent, new Set([child]));\n child = parent;\n parent = parentOf(parent);\n }\n }\n\n private prune(path: string): void {\n for (let child = path, parent = parentOf(path); parent !== undefined; ) {\n if (this.values.has(child) || this.children.has(child)) return;\n const set = this.children.get(parent);\n set?.delete(child);\n if (set && set.size > 0) return;\n this.children.delete(parent);\n child = parent;\n parent = parentOf(parent);\n }\n }\n}\n", "import { PathMap } from './path-map.ts';\nexport interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n timesAt?: number;\n timesBy?: string;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n socket?: true;\n dir?: string;\n uid?: number;\n gid?: number;\n heir?: [number, number];\n writes?: number;\n epoch?: number;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n fresh?(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n absent?(path: string): boolean;\n removeFile?(path: string): Promise<void>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new PathMap<MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async fresh(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return this.get(paths);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = this.entries.subtree(from).map((path) => this.entries.get(path) as MetaEntry);\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const path of paths) this.entries.deleteTree(path);\n }\n\n absent(path: string): boolean {\n return !this.entries.has(path);\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e).filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e).filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.entries()].map(([, e]) => e);\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nconst REMOVE_BATCH = 256;\nconst REMOVE_WAIT_MS = 5;\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new PathMap<MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n private readonly listeners = new Set<(change: Invalidation) => void>();\n\n listen(listener: (change: Invalidation) => void): void {\n this.listeners.add(listener);\n }\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => {\n this.drop(data as Invalidation);\n for (const listener of this.listeners) listener(data as Invalidation);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const tree of trees) this.cache.deleteTree(tree);\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n this.settleRemoves();\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async fresh(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const [transaction, store] = this.transaction('readonly');\n const requests = paths.map((path) => store.get(path));\n return settle(transaction, () =>\n requests.map((request) => (request.result as MetaEntry | undefined) ?? undefined)\n );\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async updateMany(\n changes: ReadonlyArray<{ path: string; change: (entry: MetaEntry | undefined) => MetaEntry }>\n ): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const { path, change } of changes) {\n const request = store.get(path);\n request.onsuccess = () => store.put(change(request.result));\n }\n await settle(transaction, () => undefined);\n this.changed({ paths: changes.map(({ path }) => path) });\n }\n\n close(): void {\n this.channel.close();\n this.db.close();\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n absent(path: string): boolean {\n return this.cache.has(path) && this.cache.get(path) === null;\n }\n\n private removing = new Map<string, string>();\n private removeTimer: ReturnType<typeof setTimeout> | undefined;\n\n async remove(paths: readonly string[]): Promise<void> {\n this.settleRemoves();\n return this.removeNow(paths);\n }\n\n async removeFile(path: string): Promise<void> {\n const known = this.cache.get(path);\n if (!known) return this.remove([path]);\n this.generation++;\n this.cache.set(path, null);\n this.removing.set(path, JSON.stringify(known));\n if (this.removing.size >= REMOVE_BATCH) return this.flushRemoves();\n this.removeTimer ??= setTimeout(\n () => void this.flushRemoves().catch(() => undefined),\n REMOVE_WAIT_MS\n );\n }\n\n private async removeNow(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n private settleRemoves(): void {\n if (this.removing.size > 0) void this.flushRemoves().catch(() => undefined);\n }\n\n private flushRemoves(): Promise<void> {\n clearTimeout(this.removeTimer);\n this.removeTimer = undefined;\n const batch = this.removing;\n if (batch.size === 0) return Promise.resolve();\n this.removing = new Map();\n const [transaction, store] = this.transaction('readwrite');\n for (const [path, seen] of batch) {\n const request = store.get(path);\n request.onsuccess = () => {\n if (request.result && JSON.stringify(request.result) === seen) store.delete(path);\n };\n }\n const paths = [...batch.keys()];\n return settle(transaction, () => void this.channel.postMessage({ paths }));\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n this.settleRemoves();\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n isSocket?: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n nlink?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n linkable?: boolean;\n version?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type UsersMode = 'off' | 'report' | 'enforce';\n\nexport const DEFAULT_USERS: UsersMode = 'enforce';\n\nexport interface Owner {\n uid: number;\n gid: number;\n}\n\nexport interface Perm {\n uid: number;\n gid: number;\n mode?: number;\n link?: string;\n}\n\nexport interface NewOwner extends Owner {\n mode?: number;\n parents?: number;\n socket?: boolean;\n}\n\nexport interface OwnerChange {\n uid?: number;\n gid?: number;\n follow?: boolean;\n kind?: 'chown' | 'adopt' | 'new';\n mode?: number;\n}\n\nexport interface HeldEntry {\n writeFile: KernelFs['writeFile'];\n direct: boolean;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n exclusive?<T>(path: string, run: (held: HeldEntry) => Promise<T>, follow?: boolean): Promise<T>;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string, owner?: NewOwner): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean; owner?: NewOwner }): Promise<void>;\n rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean; file?: boolean }\n ): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n link(from: string, to: string, follow?: boolean): Promise<void>;\n links?(path: string): boolean;\n symlink(target: string, path: string, owner?: NewOwner): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string, owner?: NewOwner): Promise<void>;\n chown?(path: string, change: OwnerChange): Promise<void>;\n trackOwners?(): void;\n crossings?(mounted: (path: string) => boolean): void;\n ancestry?(path: string): Promise<Array<Perm | undefined>>;\n hasOwner?(path: string): Promise<boolean>;\n chmod(path: string, mode: number): Promise<void>;\n append?(path: string, bytes: Uint8Array): Promise<number>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n protect?(prefixes: readonly string[], versions?: boolean): void;\n unguarded?(): KernelFs;\n noLinks?(): KernelFs;\n mayChange?(path: string, follow: boolean, whole?: boolean): Promise<void>;\n readVersioned?(path: string, cached?: boolean): Promise<{ bytes: Uint8Array; version: string }>;\n version?(path: string, cached?: boolean): Promise<string>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function mayLink(fs: { links?(path: string): boolean }, path: string): boolean {\n return fs.links?.(path) ?? true;\n}\n\nexport function modeOption(mode: unknown): number {\n if (!Number.isInteger(mode) || (mode as number) < 0 || (mode as number) > 0o7777) {\n throw fsError('EINVAL', `not a mode: ${String(mode)}`);\n }\n return mode as number;\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n\nexport interface Redirect {\n of: string;\n to: string;\n}\n\nexport function redirected(of: string, to: string): Error {\n return Object.assign(fsError('EXDEV', `${of} leads to the mount at ${to}`), {\n redirect: { of: normalizePath(of), to: normalizePath(to) },\n });\n}\n\nexport function redirectOf(err: unknown): Redirect | undefined {\n return (err as { redirect?: Redirect } | null)?.redirect;\n}\n", "import { META_DB, type MetaEntry, openMeta } from './fs/meta.ts';\nimport { fsError, normalizePath } from './fs/types.ts';\n\nexport interface MetadataEntry {\n path: string;\n mode?: number;\n uid?: number;\n gid?: number;\n}\n\nexport interface WriteMetadataOptions {\n metadata?: string;\n indexedDB?: IDBFactory;\n}\n\nconst MAX_ID = 0xfffffffe;\n\nfunction id(value: unknown, what: string): number {\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_ID) {\n throw fsError('EINVAL', `not a ${what}: ${String(value)}`);\n }\n return value as number;\n}\n\nfunction checked(entry: MetadataEntry): MetadataEntry {\n if (!String(entry.path).startsWith('/'))\n throw fsError('EINVAL', `not an absolute path: ${entry.path}`);\n const path = normalizePath(String(entry.path));\n if ((entry.uid === undefined) !== (entry.gid === undefined)) {\n throw fsError('EINVAL', `${path}: give both uid and gid, or neither`);\n }\n const mode = entry.mode;\n if (mode !== undefined && (!Number.isInteger(mode) || mode < 0 || mode > 0o7777)) {\n throw fsError('EINVAL', `${path}: not a mode: ${String(mode)}`);\n }\n return {\n path,\n ...(mode !== undefined ? { mode } : {}),\n ...(entry.uid !== undefined ? { uid: id(entry.uid, 'uid'), gid: id(entry.gid, 'gid') } : {}),\n };\n}\n\nasync function present(root: FileSystemDirectoryHandle, path: string): Promise<boolean> {\n const parts = path.split('/').filter(Boolean);\n let dir = root;\n for (const [i, name] of parts.entries()) {\n const last = i === parts.length - 1;\n try {\n dir = await dir.getDirectoryHandle(name);\n } catch {\n if (!last) return false;\n return dir.getFileHandle(name).then(\n () => true,\n () => false\n );\n }\n }\n return true;\n}\n\nexport async function writeMetadata(\n root: FileSystemDirectoryHandle,\n entries: readonly MetadataEntry[],\n options: WriteMetadataOptions = {}\n): Promise<void> {\n const merged = new Map<string, MetadataEntry>();\n for (const want of entries.map(checked))\n merged.set(want.path, { ...merged.get(want.path), ...want });\n const wanted = [...merged.values()];\n for (const { path } of wanted) {\n if (!(await present(root, path))) throw fsError('ENOENT', path);\n }\n const factory = options.indexedDB ?? globalThis.indexedDB;\n const store = await openMeta(options.metadata ?? META_DB, factory);\n const ctimeMs = Date.now();\n try {\n await store.updateMany(\n wanted.map((want) => ({\n path: want.path,\n change: (entry: MetaEntry | undefined): MetaEntry => ({\n ...entry,\n path: want.path,\n ...(want.mode !== undefined ? { mode: want.mode } : {}),\n ...(want.uid !== undefined ? { uid: want.uid, gid: want.gid as number } : {}),\n ctimeMs,\n }),\n }))\n );\n } finally {\n store.close();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["parentOf"]
|
|
7
7
|
}
|
|
@@ -1649,6 +1649,7 @@ function parseSyncFsStat(json2) {
|
|
|
1649
1649
|
isFile: s.isFile,
|
|
1650
1650
|
isDirectory: s.isDirectory,
|
|
1651
1651
|
isSymbolicLink: s.isSymbolicLink,
|
|
1652
|
+
...s.isSocket === true ? { isSocket: true } : {},
|
|
1652
1653
|
size: s.size,
|
|
1653
1654
|
...typeof s.mode === "number" ? { mode: s.mode } : {},
|
|
1654
1655
|
...typeof s.mtimeMs === "number" ? { mtimeMs: s.mtimeMs } : {},
|
|
@@ -2964,6 +2965,10 @@ function openRequest(af, type) {
|
|
|
2964
2965
|
...type === DGRAM ? { type: "dgram" } : {}
|
|
2965
2966
|
};
|
|
2966
2967
|
}
|
|
2968
|
+
function absolute(cwd, addr) {
|
|
2969
|
+
if (addr.family !== "unix" || addr.path === "" || addr.path.startsWith("\0")) return addr;
|
|
2970
|
+
return addr.path.startsWith("/") ? addr : { family: "unix", path: `${cwd}/${addr.path}` };
|
|
2971
|
+
}
|
|
2967
2972
|
function optionalAddr(view, ptr) {
|
|
2968
2973
|
if (ptr === 0 || view.getUint8(ptr) === 0) return void 0;
|
|
2969
2974
|
return readAddr(view, ptr);
|
|
@@ -3032,7 +3037,7 @@ function wasixSocketImports(host, preview1) {
|
|
|
3032
3037
|
},
|
|
3033
3038
|
sock_bind: (fd, addr) => {
|
|
3034
3039
|
socket(fd);
|
|
3035
|
-
call2({ op: "sock-bind", fd, addr: readAddr(mem.view(), addr) });
|
|
3040
|
+
call2({ op: "sock-bind", fd, addr: absolute(host.cwd, readAddr(mem.view(), addr)) });
|
|
3036
3041
|
},
|
|
3037
3042
|
sock_listen: (fd, backlog) => {
|
|
3038
3043
|
socket(fd);
|
|
@@ -3040,7 +3045,8 @@ function wasixSocketImports(host, preview1) {
|
|
|
3040
3045
|
},
|
|
3041
3046
|
sock_connect: (fd, addr) => {
|
|
3042
3047
|
const e = socket(fd);
|
|
3043
|
-
|
|
3048
|
+
const to = absolute(host.cwd, readAddr(mem.view(), addr));
|
|
3049
|
+
call2({ op: "sock-connect", fd, addr: to, nonblock: e.nonblock });
|
|
3044
3050
|
},
|
|
3045
3051
|
sock_accept_v2: (fd, flags, outFd, outAddr) => {
|
|
3046
3052
|
const e = socket(fd);
|
|
@@ -3186,6 +3192,7 @@ function filetypeOf(s) {
|
|
|
3186
3192
|
if (!s) return FILETYPE.UNKNOWN;
|
|
3187
3193
|
if (s.isSymbolicLink) return FILETYPE.SYMBOLIC_LINK;
|
|
3188
3194
|
if (s.isDirectory) return FILETYPE.DIRECTORY;
|
|
3195
|
+
if (s.isSocket) return FILETYPE.SOCKET_STREAM;
|
|
3189
3196
|
return s.isFile ? FILETYPE.REGULAR_FILE : FILETYPE.UNKNOWN;
|
|
3190
3197
|
}
|
|
3191
3198
|
function filestatOf(path, s) {
|
|
@@ -4293,7 +4300,9 @@ var init_wasix_process = __esm({
|
|
|
4293
4300
|
});
|
|
4294
4301
|
}
|
|
4295
4302
|
spawn(req, exec = false) {
|
|
4296
|
-
const
|
|
4303
|
+
const ops = req.ops ?? [];
|
|
4304
|
+
const { stdio, inherit, cwd, opened: opened2 } = this.childFds(ops);
|
|
4305
|
+
const moved = ops.some((op) => op.cmd === "chdir" || op.cmd === "fchdir");
|
|
4297
4306
|
try {
|
|
4298
4307
|
const spawn = {
|
|
4299
4308
|
op: "proc-spawn",
|
|
@@ -4301,6 +4310,7 @@ var init_wasix_process = __esm({
|
|
|
4301
4310
|
argv: req.argv.length > 0 ? req.argv : [req.name],
|
|
4302
4311
|
env: req.env ?? this.environment(),
|
|
4303
4312
|
cwd,
|
|
4313
|
+
...moved ? { chdir: true } : {},
|
|
4304
4314
|
stdio,
|
|
4305
4315
|
inherit,
|
|
4306
4316
|
...exec ? { exec } : {},
|
|
@@ -4583,6 +4593,7 @@ function processes(host, call2, inThread) {
|
|
|
4583
4593
|
argv: o.argv,
|
|
4584
4594
|
env: o.env ?? { ...host.o.env },
|
|
4585
4595
|
cwd: o.cwd ?? host.cwd,
|
|
4596
|
+
...o.cwd !== void 0 ? { chdir: true } : {},
|
|
4586
4597
|
stdio,
|
|
4587
4598
|
...inThread ? {} : { restart: true }
|
|
4588
4599
|
};
|
|
@@ -4774,7 +4785,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
4774
4785
|
var init_version = __esm({
|
|
4775
4786
|
"src/version.ts"() {
|
|
4776
4787
|
"use strict";
|
|
4777
|
-
KERNEL_VERSION = true ? "1.103.
|
|
4788
|
+
KERNEL_VERSION = true ? "1.103.2" : "0.0.0-dev";
|
|
4778
4789
|
OS_RELEASE = "6.0.0-slicc";
|
|
4779
4790
|
}
|
|
4780
4791
|
});
|
|
@@ -5084,6 +5095,7 @@ function childOps(kernel, io, defaults, sync) {
|
|
|
5084
5095
|
...named,
|
|
5085
5096
|
env: { ...o.env ?? defaults.env },
|
|
5086
5097
|
cwd: o.cwd ?? defaults.cwd,
|
|
5098
|
+
...o.cwd !== void 0 ? { chdir: true } : {},
|
|
5087
5099
|
stdio,
|
|
5088
5100
|
...group,
|
|
5089
5101
|
...death
|
|
@@ -6712,7 +6724,7 @@ function exactIn(node) {
|
|
|
6712
6724
|
return node?.mount.opts.bridge.owners === true;
|
|
6713
6725
|
}
|
|
6714
6726
|
function modeFromStat(st, exact = false) {
|
|
6715
|
-
const type = st.isSymbolicLink ? S_IFLNK : st.isDirectory ? S_IFDIR : S_IFREG;
|
|
6727
|
+
const type = st.isSymbolicLink ? S_IFLNK : st.isDirectory ? S_IFDIR : st.isSocket ? S_IFSOCK : S_IFREG;
|
|
6716
6728
|
const fallback = st.isDirectory || st.isSymbolicLink ? 511 : 438;
|
|
6717
6729
|
const perm = (st.mode ?? fallback) & PERM_MASK;
|
|
6718
6730
|
return type | (exact ? perm : perm || fallback);
|
|
@@ -7258,6 +7270,10 @@ function createStreamOps(h) {
|
|
|
7258
7270
|
return want;
|
|
7259
7271
|
};
|
|
7260
7272
|
const directory = (stream) => {
|
|
7273
|
+
if ((stream.node.mode & S_IFMT2) === S_IFSOCK && !(stream.flags & O_PATH)) {
|
|
7274
|
+
if (stream.fd !== void 0) Fs.closeStream?.(stream.fd);
|
|
7275
|
+
throw new Fs.ErrnoError(wasiErrno("ENXIO"));
|
|
7276
|
+
}
|
|
7261
7277
|
const bridge = bridgeOf(stream.node);
|
|
7262
7278
|
if (!bridge.owners || !Fs.isDir(stream.node.mode) || stream.flags & O_PATH) return;
|
|
7263
7279
|
try {
|
|
@@ -7735,7 +7751,7 @@ function readingLinks(Fs) {
|
|
|
7735
7751
|
}
|
|
7736
7752
|
};
|
|
7737
7753
|
}
|
|
7738
|
-
var S_IFDIR, S_IFREG, S_IFLNK, PERM_MASK, DEFAULT_DIR_PERM, UMASK, SEEK_CUR2, SEEK_END2, EARLY_WHOLE_FILE, O_APPEND4, O_ACCMODE, O_TRUNC, O_PATH, stale, opening;
|
|
7754
|
+
var S_IFDIR, S_IFREG, S_IFLNK, S_IFSOCK, S_IFMT2, PERM_MASK, DEFAULT_DIR_PERM, UMASK, SEEK_CUR2, SEEK_END2, EARLY_WHOLE_FILE, O_APPEND4, O_ACCMODE, O_TRUNC, O_PATH, stale, opening;
|
|
7739
7755
|
var init_live_vfs_fs = __esm({
|
|
7740
7756
|
"src/realm/live-vfs-fs.ts"() {
|
|
7741
7757
|
"use strict";
|
|
@@ -7748,6 +7764,8 @@ var init_live_vfs_fs = __esm({
|
|
|
7748
7764
|
S_IFDIR = 16384;
|
|
7749
7765
|
S_IFREG = 32768;
|
|
7750
7766
|
S_IFLNK = 40960;
|
|
7767
|
+
S_IFSOCK = 49152;
|
|
7768
|
+
S_IFMT2 = 61440;
|
|
7751
7769
|
PERM_MASK = 4095;
|
|
7752
7770
|
DEFAULT_DIR_PERM = 493;
|
|
7753
7771
|
UMASK = 18;
|
|
@@ -8658,6 +8676,7 @@ function kernelUname(imports, hostname, memory, glue) {
|
|
|
8658
8676
|
function kernelChdir(Fs) {
|
|
8659
8677
|
const { chdir, lookupPath, ErrnoError } = Fs;
|
|
8660
8678
|
if (!chdir || !lookupPath || !ErrnoError) return;
|
|
8679
|
+
Fs.sliccChdirAt = chdir;
|
|
8661
8680
|
Fs.chdir = (path) => {
|
|
8662
8681
|
const { node } = lookupPath.call(Fs, path, { follow: true });
|
|
8663
8682
|
const directory = Fs.isDir?.(node.mode) === true;
|
|
@@ -9735,6 +9754,7 @@ function runSync(kernel, d, o) {
|
|
|
9735
9754
|
...named,
|
|
9736
9755
|
env: { ...o.env ?? d.env },
|
|
9737
9756
|
cwd: o.cwd === void 0 ? d.cwd : d.resolve(o.cwd),
|
|
9757
|
+
...o.cwd === void 0 ? {} : { chdir: true },
|
|
9738
9758
|
...group,
|
|
9739
9759
|
stdin: stdioOf(o.stdin),
|
|
9740
9760
|
...input ? { input } : {},
|
|
@@ -11029,7 +11049,7 @@ function mountVfsIntoEmscripten(Fs, deps) {
|
|
|
11029
11049
|
linuxRmdir(Fs);
|
|
11030
11050
|
if (deps.cred) Fs.sliccCred = deps.cred;
|
|
11031
11051
|
try {
|
|
11032
|
-
Fs.chdir(deps.cwd);
|
|
11052
|
+
(Fs.sliccChdirAt ?? Fs.chdir).call(Fs, deps.cwd);
|
|
11033
11053
|
} catch (err) {
|
|
11034
11054
|
warn(`cannot chdir to ${deps.cwd}: errno ${err.errno}`);
|
|
11035
11055
|
}
|
|
@@ -11608,13 +11628,13 @@ var init_kernel_streams = __esm({
|
|
|
11608
11628
|
const name2 = path.slice(path.lastIndexOf("/") + 1);
|
|
11609
11629
|
if (!TTY_NAME.test(name2)) return void 0;
|
|
11610
11630
|
const { lookupPath, cwd } = this.Fs;
|
|
11611
|
-
const
|
|
11612
|
-
const dir =
|
|
11631
|
+
const absolute2 = path.startsWith("/") ? path : `${cwd?.call(this.Fs) ?? "/"}/${path}`;
|
|
11632
|
+
const dir = absolute2.slice(0, absolute2.lastIndexOf("/")) || "/";
|
|
11613
11633
|
try {
|
|
11614
11634
|
const real = lookupPath?.call(this.Fs, dir, { follow: true }).path ?? dir;
|
|
11615
11635
|
return `${real === "/" ? "" : real}/${name2}`;
|
|
11616
11636
|
} catch {
|
|
11617
|
-
return
|
|
11637
|
+
return absolute2;
|
|
11618
11638
|
}
|
|
11619
11639
|
}
|
|
11620
11640
|
terminalExists(path) {
|
|
@@ -12054,7 +12074,7 @@ function createProcessKernel(deps) {
|
|
|
12054
12074
|
if (!stream) return { none: true };
|
|
12055
12075
|
promote?.(stream);
|
|
12056
12076
|
if (stream.sliccKernelFd !== void 0) return { fd: stream.sliccKernelFd };
|
|
12057
|
-
if (((stream.node?.mode ?? 0) &
|
|
12077
|
+
if (((stream.node?.mode ?? 0) & S_IFMT3) === S_IFDIR2 && stream.path) return { dir: stream.path };
|
|
12058
12078
|
const device2 = deviceOfStream(stream);
|
|
12059
12079
|
if (device2) return device2;
|
|
12060
12080
|
return n === 0 ? { input: drain(Fs, stream) } : { capture: true };
|
|
@@ -12106,6 +12126,7 @@ function createProcessKernel(deps) {
|
|
|
12106
12126
|
argv,
|
|
12107
12127
|
env: env ?? deps.env,
|
|
12108
12128
|
cwd: cwd ?? Fs.cwd(),
|
|
12129
|
+
...cwd !== null ? { chdir: true } : {},
|
|
12109
12130
|
stdio,
|
|
12110
12131
|
...inherit.length > 0 ? { inherit } : {},
|
|
12111
12132
|
...exec ? { exec } : {},
|
|
@@ -12201,14 +12222,14 @@ function createProcessKernel(deps) {
|
|
|
12201
12222
|
}
|
|
12202
12223
|
};
|
|
12203
12224
|
}
|
|
12204
|
-
var
|
|
12225
|
+
var S_IFMT3, S_IFDIR2, POLLIN2, POLLOUT2, POLLERR2, POLLHUP2, POLLNVAL, SELECT_SLICE_MS, WUNTRACED, WCONTINUED;
|
|
12205
12226
|
var init_process_children = __esm({
|
|
12206
12227
|
"src/process/process-children.ts"() {
|
|
12207
12228
|
"use strict";
|
|
12208
12229
|
init_signals();
|
|
12209
12230
|
init_process_fork();
|
|
12210
12231
|
init_wasi_errno();
|
|
12211
|
-
|
|
12232
|
+
S_IFMT3 = 61440;
|
|
12212
12233
|
S_IFDIR2 = 16384;
|
|
12213
12234
|
POLLIN2 = 1;
|
|
12214
12235
|
POLLOUT2 = 4;
|
|
@@ -12375,22 +12396,6 @@ function resolved(Fs, addr) {
|
|
|
12375
12396
|
const path = addr.path.startsWith("/") ? addr.path : `${Fs.cwd()}/${addr.path}`;
|
|
12376
12397
|
return { family: "unix", path: normalizePath(path) };
|
|
12377
12398
|
}
|
|
12378
|
-
function socketNode(Fs, addr) {
|
|
12379
|
-
if (addr.family !== "unix" || !addr.path || addr.path.startsWith("\0")) return void 0;
|
|
12380
|
-
const fs = Fs;
|
|
12381
|
-
let stream;
|
|
12382
|
-
try {
|
|
12383
|
-
stream = Fs.open(addr.path, O_WRONLY6 | O_CREAT4 | O_EXCL3, 493);
|
|
12384
|
-
} catch (e) {
|
|
12385
|
-
if (e?.errno === wasiErrno("EEXIST")) {
|
|
12386
|
-
throw new SyscallError("EADDRINUSE");
|
|
12387
|
-
}
|
|
12388
|
-
throw e;
|
|
12389
|
-
}
|
|
12390
|
-
if (Fs.close) Fs.close(stream);
|
|
12391
|
-
else Fs.closeStream(stream.fd);
|
|
12392
|
-
return { remove: () => fs.unlink?.(addr.path) };
|
|
12393
|
-
}
|
|
12394
12399
|
function createSocketKernel(deps) {
|
|
12395
12400
|
const { transport, Fs, sys, streams } = deps;
|
|
12396
12401
|
const call2 = (req) => {
|
|
@@ -12457,16 +12462,7 @@ function createSocketKernel(deps) {
|
|
|
12457
12462
|
throw e;
|
|
12458
12463
|
}
|
|
12459
12464
|
}),
|
|
12460
|
-
bind: (fd, given) => guard(() => {
|
|
12461
|
-
const addr = resolved(Fs, given);
|
|
12462
|
-
const node = socketNode(Fs, addr);
|
|
12463
|
-
try {
|
|
12464
|
-
return done({ op: "sock-bind", fd: kfd(fd), addr });
|
|
12465
|
-
} catch (e) {
|
|
12466
|
-
node?.remove();
|
|
12467
|
-
throw e;
|
|
12468
|
-
}
|
|
12469
|
-
}),
|
|
12465
|
+
bind: (fd, given) => guard(() => done({ op: "sock-bind", fd: kfd(fd), addr: resolved(Fs, given) })),
|
|
12470
12466
|
listen: (fd, backlog) => guard(() => done({ op: "sock-listen", fd: kfd(fd), backlog })),
|
|
12471
12467
|
accept: (fd, nonblock, cloexec) => guard(() => {
|
|
12472
12468
|
const listener = socketAt(fd);
|
|
@@ -12512,7 +12508,7 @@ function createSocketKernel(deps) {
|
|
|
12512
12508
|
})
|
|
12513
12509
|
};
|
|
12514
12510
|
}
|
|
12515
|
-
var O_RDWR5, KILLED_BY_SIGPIPE2
|
|
12511
|
+
var O_RDWR5, KILLED_BY_SIGPIPE2;
|
|
12516
12512
|
var init_process_sockets = __esm({
|
|
12517
12513
|
"src/process/process-sockets.ts"() {
|
|
12518
12514
|
"use strict";
|
|
@@ -12522,9 +12518,6 @@ var init_process_sockets = __esm({
|
|
|
12522
12518
|
init_wasi_errno();
|
|
12523
12519
|
O_RDWR5 = 2;
|
|
12524
12520
|
KILLED_BY_SIGPIPE2 = 128 + 13;
|
|
12525
|
-
O_WRONLY6 = 1;
|
|
12526
|
-
O_CREAT4 = 64;
|
|
12527
|
-
O_EXCL3 = 128;
|
|
12528
12521
|
}
|
|
12529
12522
|
});
|
|
12530
12523
|
|
|
@@ -13099,7 +13092,7 @@ function runMain(running, init) {
|
|
|
13099
13092
|
return status2;
|
|
13100
13093
|
}
|
|
13101
13094
|
}
|
|
13102
|
-
var FS_OPS, O_RDONLY2,
|
|
13095
|
+
var FS_OPS, O_RDONLY2, O_WRONLY6, O_RDWR6, O_ACCMODE5, O_DIRECTORY2, accessMode, PLACED, GLUE_TRAILER, evaluateGlue, EVAL_BLOCKED;
|
|
13103
13096
|
var init_process_runtime = __esm({
|
|
13104
13097
|
"src/process/process-runtime.ts"() {
|
|
13105
13098
|
"use strict";
|
|
@@ -13123,11 +13116,11 @@ var init_process_runtime = __esm({
|
|
|
13123
13116
|
init_kernel_streams();
|
|
13124
13117
|
FS_OPS = new Set(SYNC_FS_OPS);
|
|
13125
13118
|
O_RDONLY2 = 0;
|
|
13126
|
-
|
|
13119
|
+
O_WRONLY6 = 1;
|
|
13127
13120
|
O_RDWR6 = 2;
|
|
13128
13121
|
O_ACCMODE5 = 3;
|
|
13129
13122
|
O_DIRECTORY2 = 65536;
|
|
13130
|
-
accessMode = (access) => access === "read" ? O_RDONLY2 : access === "write" ?
|
|
13123
|
+
accessMode = (access) => access === "read" ? O_RDONLY2 : access === "write" ? O_WRONLY6 : O_RDWR6;
|
|
13131
13124
|
PLACED = /* @__PURE__ */ new Set(["stream", "file", "socket", "clipboard", "sealed"]);
|
|
13132
13125
|
GLUE_TRAILER = [
|
|
13133
13126
|
"if (typeof ENV !== 'undefined') Object.assign(ENV, Module.sliccEnv);",
|