@forgeax/engine-assets-runtime 0.1.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.
Files changed (71) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +213 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/asset-graph-red.integration.test.d.ts +2 -0
  5. package/dist/__tests__/asset-graph-red.integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/asset-kind.test.d.ts +2 -0
  7. package/dist/__tests__/asset-kind.test.d.ts.map +1 -0
  8. package/dist/__tests__/asset-registry-core.integration.test.d.ts +2 -0
  9. package/dist/__tests__/asset-registry-core.integration.test.d.ts.map +1 -0
  10. package/dist/__tests__/asset-registry-public-api.test-d.d.ts +2 -0
  11. package/dist/__tests__/asset-registry-public-api.test-d.d.ts.map +1 -0
  12. package/dist/__tests__/asset-runtime-core-lifecycle.integration.test.d.ts +2 -0
  13. package/dist/__tests__/asset-runtime-core-lifecycle.integration.test.d.ts.map +1 -0
  14. package/dist/__tests__/asset-runtime-snapshot.unit.test.d.ts +2 -0
  15. package/dist/__tests__/asset-runtime-snapshot.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/catalog-session-red.unit.test.d.ts +2 -0
  17. package/dist/__tests__/catalog-session-red.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/decode-image-mime-owner.test.d.ts +2 -0
  19. package/dist/__tests__/decode-image-mime-owner.test.d.ts.map +1 -0
  20. package/dist/__tests__/registry-lifecycle-red.integration.test.d.ts +2 -0
  21. package/dist/__tests__/registry-lifecycle-red.integration.test.d.ts.map +1 -0
  22. package/dist/asset-kind.d.ts +4 -0
  23. package/dist/asset-kind.d.ts.map +1 -0
  24. package/dist/catalog-source.d.ts +23 -0
  25. package/dist/catalog-source.d.ts.map +1 -0
  26. package/dist/index.d.ts +5 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.mjs +1240 -0
  29. package/dist/index.mjs.map +1 -0
  30. package/dist/internal/artifact-cache.d.ts +17 -0
  31. package/dist/internal/artifact-cache.d.ts.map +1 -0
  32. package/dist/internal/asset-graph.d.ts +70 -0
  33. package/dist/internal/asset-graph.d.ts.map +1 -0
  34. package/dist/internal/catalog-session.d.ts +60 -0
  35. package/dist/internal/catalog-session.d.ts.map +1 -0
  36. package/dist/internal/decoder-registry.d.ts +19 -0
  37. package/dist/internal/decoder-registry.d.ts.map +1 -0
  38. package/dist/internal/immutable-payload.d.ts +9 -0
  39. package/dist/internal/immutable-payload.d.ts.map +1 -0
  40. package/dist/internal/load-asset.d.ts +31 -0
  41. package/dist/internal/load-asset.d.ts.map +1 -0
  42. package/dist/internal/pack-reader.d.ts +18 -0
  43. package/dist/internal/pack-reader.d.ts.map +1 -0
  44. package/dist/internal/validate-runtime-row.d.ts +7 -0
  45. package/dist/internal/validate-runtime-row.d.ts.map +1 -0
  46. package/dist/internal.d.ts +2 -0
  47. package/dist/internal.d.ts.map +1 -0
  48. package/dist/internal.mjs +15 -0
  49. package/dist/internal.mjs.map +1 -0
  50. package/package.json +63 -0
  51. package/src/__tests__/asset-graph-red.integration.test.ts +113 -0
  52. package/src/__tests__/asset-kind.test.ts +14 -0
  53. package/src/__tests__/asset-registry-core.integration.test.ts +161 -0
  54. package/src/__tests__/asset-registry-public-api.test-d.ts +31 -0
  55. package/src/__tests__/asset-runtime-core-lifecycle.integration.test.ts +79 -0
  56. package/src/__tests__/asset-runtime-snapshot.unit.test.ts +23 -0
  57. package/src/__tests__/catalog-session-red.unit.test.ts +276 -0
  58. package/src/__tests__/decode-image-mime-owner.test.ts +41 -0
  59. package/src/__tests__/registry-lifecycle-red.integration.test.ts +80 -0
  60. package/src/asset-kind.ts +6 -0
  61. package/src/catalog-source.ts +145 -0
  62. package/src/index.ts +22 -0
  63. package/src/internal/artifact-cache.ts +65 -0
  64. package/src/internal/asset-graph.ts +420 -0
  65. package/src/internal/catalog-session.ts +345 -0
  66. package/src/internal/decoder-registry.ts +175 -0
  67. package/src/internal/immutable-payload.ts +20 -0
  68. package/src/internal/load-asset.ts +254 -0
  69. package/src/internal/pack-reader.ts +183 -0
  70. package/src/internal/validate-runtime-row.ts +51 -0
  71. package/src/internal.ts +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/asset-kind.ts","../src/catalog-source.ts","../src/internal/artifact-cache.ts","../src/internal/immutable-payload.ts","../src/internal/asset-graph.ts","../src/internal/validate-runtime-row.ts","../src/internal/catalog-session.ts","../src/internal/decoder-registry.ts","../src/internal/pack-reader.ts","../src/internal/load-asset.ts"],"names":["err","ok","freezeSnapshot","key"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { AssetKind } from '@forgeax/engine-types';\n\n/** Create the type witness shared by one custom decoder lease and its loads. */\nexport function defineAssetKind<P, K extends string = string>(kind: K): AssetKind<P, K> {\n return Object.freeze({ kind }) as AssetKind<P, K>;\n}\n","import {\n ASSET_ERROR_HINTS,\n AssetError,\n type CatalogDelta,\n type CatalogEntry,\n err,\n ok,\n type ResourceRevision,\n type Result,\n type RuntimeAssetBinding,\n} from '@forgeax/engine-types';\nexport type CatalogListener = (delta: CatalogDelta) => void;\n\n/** Read-only catalog source backed by static entries or a canonical URL. */\nexport interface CatalogSource {\n enumerate(): Promise<Result<readonly CatalogEntry[], AssetError>>;\n subscribe(listener: CatalogListener): () => void;\n readonly expectedScope?: Pick<RuntimeAssetBinding, 'scopeId' | 'generation'>;\n}\n\n/**\n * Create a read-only catalog source while preserving the schema SSOT.\n *\n * Static and fetched sources use the same `CatalogEntry` and revision fields;\n * an expected revision rejects unverified data before it reaches consumers.\n */\nexport function createCatalogSource(options: {\n readonly url?: string;\n readonly entries?: readonly CatalogEntry[];\n readonly fetch?: typeof globalThis.fetch;\n readonly expectedRevision?: ResourceRevision;\n readonly expectedScope?: Pick<RuntimeAssetBinding, 'scopeId' | 'generation'>;\n readonly subscribe?: (listener: CatalogListener) => () => void;\n}): CatalogSource {\n const entries = options.entries;\n return {\n async enumerate() {\n if (entries !== undefined) {\n if (options.expectedRevision === undefined) return ok(entries);\n const actualRevisions = entries.flatMap((entry) =>\n entry.revision === undefined ? [] : [entry.revision],\n );\n const matches =\n actualRevisions.length > 0 &&\n actualRevisions.every(\n (revision) =>\n revision.digest === options.expectedRevision?.digest &&\n revision.observedAt === options.expectedRevision?.observedAt &&\n revision.rootId === options.expectedRevision?.rootId,\n );\n if (!matches) {\n return err(\n new AssetError({\n code: 'asset-parse-failed',\n expected: 'static catalog entries to carry the expected producer revision',\n hint: 'restore a verified catalog revision before applying the source',\n detail: { expectedRevision: options.expectedRevision, actualRevisions } as never,\n }),\n );\n }\n return ok(entries);\n }\n if (options.url === undefined) {\n return err(\n new AssetError({\n code: 'catalog-source-unconfigured',\n expected: 'a configured catalog source',\n hint: ASSET_ERROR_HINTS['catalog-source-unconfigured'],\n }),\n );\n }\n const response = await (options.fetch ?? globalThis.fetch)(options.url);\n if (!response.ok) {\n return err(\n new AssetError({\n code: 'asset-fetch-failed',\n expected: 'the configured Catalog URL to return HTTP 200',\n hint: 'verify the producer Catalog URL and republish the current snapshot',\n detail: { sourcePath: options.url },\n }),\n );\n }\n let raw: unknown;\n try {\n raw = await response.json();\n } catch {\n return err(\n new AssetError({\n code: 'asset-parse-failed',\n expected: 'the configured Catalog URL to return JSON',\n hint: 'repair the producer Catalog before loading the current publication',\n }),\n );\n }\n const rows = scopedRows(raw, options.expectedScope);\n if (!rows.ok) return rows;\n const result = rows.value.map((row) => ({ ...row }));\n return ok(result);\n },\n subscribe(listener) {\n return options.subscribe?.(listener) ?? (() => {});\n },\n ...(options.expectedScope === undefined ? {} : { expectedScope: options.expectedScope }),\n };\n}\n\nfunction scopedRows(\n raw: unknown,\n expectedScope: Pick<RuntimeAssetBinding, 'scopeId' | 'generation'> | undefined,\n): Result<readonly CatalogEntry[], AssetError> {\n if (Array.isArray(raw)) return ok(raw as readonly CatalogEntry[]);\n if (raw === null || typeof raw !== 'object') return parseRowsError('Catalog JSON rows');\n const snapshot = raw as Record<string, unknown>;\n if (!Array.isArray(snapshot.entries)) return parseRowsError('Catalog JSON entries');\n if (expectedScope !== undefined) {\n if (\n snapshot.scopeId !== expectedScope.scopeId ||\n snapshot.generation !== expectedScope.generation ||\n snapshot.authority !== 'authoritative'\n ) {\n return err(\n new AssetError({\n code: 'asset-parse-failed',\n expected: 'the Catalog snapshot to match the active scope and generation',\n hint: 'restore the authoritative producer Catalog for the active runtime scope',\n detail: {\n expectedScope,\n actualScope: { scopeId: snapshot.scopeId, generation: snapshot.generation },\n } as never,\n }),\n );\n }\n }\n return ok(snapshot.entries as readonly CatalogEntry[]);\n}\n\nfunction parseRowsError(expected: string): Result<never, AssetError> {\n return err(\n new AssetError({\n code: 'asset-parse-failed',\n expected,\n hint: 'repair the producer Catalog before loading the current publication',\n }),\n );\n}\n","import type { AssetLoadError, Result } from '@forgeax/engine-types';\n\nexport interface ArtifactCacheSnapshot {\n readonly entries: number;\n readonly pending: number;\n readonly hits: number;\n readonly misses: number;\n}\n\nexport class ArtifactCache {\n private readonly values = new Map<string, Uint8Array>();\n private readonly pending = new Map<string, Promise<Result<Uint8Array, AssetLoadError>>>();\n private hits = 0;\n private misses = 0;\n\n read(\n contentAddress: string,\n reader: () => Promise<Result<Uint8Array, AssetLoadError>>,\n ): Promise<Result<Uint8Array, AssetLoadError>> {\n const value = this.values.get(contentAddress);\n if (value !== undefined) {\n this.hits += 1;\n return Promise.resolve({ ok: true, value: new Uint8Array(value) } as Result<\n Uint8Array,\n AssetLoadError\n >);\n }\n const pending = this.pending.get(contentAddress);\n if (pending !== undefined) {\n this.hits += 1;\n return pending;\n }\n this.misses += 1;\n const request = Promise.resolve()\n .then(reader)\n .then((result) => {\n if (result.ok) this.values.set(contentAddress, new Uint8Array(result.value));\n return result;\n })\n .finally(() => {\n if (this.pending.get(contentAddress) === request) this.pending.delete(contentAddress);\n });\n this.pending.set(contentAddress, request);\n return request;\n }\n\n clear(contentAddress?: string): void {\n if (contentAddress === undefined) {\n this.values.clear();\n this.pending.clear();\n return;\n }\n this.values.delete(contentAddress);\n this.pending.delete(contentAddress);\n }\n\n snapshot(): ArtifactCacheSnapshot {\n return Object.freeze({\n entries: this.values.size,\n pending: this.pending.size,\n hits: this.hits,\n misses: this.misses,\n });\n }\n}\n","/**\n * Decoder output becomes an owner fact at this boundary. Freeze the ordinary\n * POD graph so a caller cannot mutate the cached payload between loads.\n * Typed-array storage is deliberately left as an opaque byte/vector carrier:\n * JavaScript cannot freeze a non-empty typed array without changing its public\n * engine type, so owners must treat those carriers as read-only by contract.\n */\nexport function freezeRuntimePayload<T>(value: T): T {\n const seen = new WeakSet<object>();\n return freeze(value, seen);\n}\n\nfunction freeze<T>(value: T, seen: WeakSet<object>): T {\n if (value === null || typeof value !== 'object') return value;\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n for (const child of Object.values(value as Record<string, unknown>)) freeze(child, seen);\n return Object.freeze(value);\n}\n","import type { AssetLoadError, Result } from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport { freezeRuntimePayload } from './immutable-payload.js';\n\nexport interface AssetGraphValue<P> {\n readonly value: P;\n readonly refs: readonly string[];\n}\n\nexport interface AssetGraphOptions<\n P extends { readonly value: unknown; readonly refs: readonly string[] },\n> {\n readonly read: (guid: string, signal: AbortSignal) => Promise<Result<P, AssetLoadError>>;\n readonly maxConcurrentReads?: number;\n}\n\nexport interface AssetGraphCounters {\n readonly loads: number;\n readonly cacheHits: number;\n readonly readErrors: number;\n readonly noChange: number;\n readonly listenerFailures: number;\n}\n\nexport interface AssetGraphSnapshot {\n readonly epoch: number;\n readonly ready: readonly string[];\n readonly pending: number;\n readonly resources: number;\n readonly sccs: readonly (readonly string[])[];\n readonly counters: AssetGraphCounters;\n}\n\ntype GraphResult<P> = Result<P, AssetLoadError>;\ntype GraphListener = (snapshot: AssetGraphSnapshot) => void;\n\nfunction cancelled(guid: string): AssetLoadError {\n return {\n code: 'asset-load-cancelled',\n expected: 'the request AbortSignal to remain live until asset closure completes',\n hint: 'retry with a live AbortSignal when the request is still needed',\n detail: { guid },\n };\n}\n\nfunction disposed(scopeId = 'asset-runtime'): AssetLoadError {\n return {\n code: 'asset-runtime-disposed',\n expected: 'an active asset runtime scope',\n hint: 'obtain a new Registry from the current realm',\n detail: { scopeId },\n };\n}\n\nfunction superseded(guid: string, generation: number): AssetLoadError {\n return {\n code: 'asset-superseded',\n expected: 'the load ticket to remain current until promotion',\n hint: 'load the current publication after the Catalog change',\n detail: { guid, generation },\n };\n}\n\nfunction thrown(guid: string): AssetLoadError {\n return {\n code: 'asset-decode-failed',\n expected: 'the graph reader to return a Result',\n hint: 'repair the owner reader and retry the current publication',\n detail: { guid, kind: 'asset-graph-reader' },\n };\n}\n\nfunction freezeSnapshot(snapshot: AssetGraphSnapshot): AssetGraphSnapshot {\n return Object.freeze({\n ...snapshot,\n ready: Object.freeze([...snapshot.ready]),\n sccs: Object.freeze(snapshot.sccs.map((scc) => Object.freeze([...scc]))),\n counters: Object.freeze({ ...snapshot.counters }),\n });\n}\n\nexport class AssetGraph<P extends { readonly value: unknown; readonly refs: readonly string[] }> {\n private readonly read: AssetGraphOptions<P>['read'];\n private readonly limit: number;\n private readonly ready = new Map<string, P>();\n private readonly forward = new Map<string, Set<string>>();\n private readonly reverse = new Map<string, Set<string>>();\n private readonly reads = new Map<string, Promise<GraphResult<P>>>();\n private readonly requests = new Map<string, Promise<GraphResult<P>>>();\n private readonly listeners = new Set<GraphListener>();\n private readonly sccs: (readonly string[])[] = [];\n private activeReads = 0;\n private readWaiters: (() => void)[] = [];\n private disposed = false;\n private epoch = 0;\n private counters: AssetGraphCounters = {\n loads: 0,\n cacheHits: 0,\n readErrors: 0,\n noChange: 0,\n listenerFailures: 0,\n };\n private currentSnapshot: AssetGraphSnapshot;\n\n constructor(options: AssetGraphOptions<P>) {\n this.read = options.read;\n this.limit = Math.max(1, Math.floor(options.maxConcurrentReads ?? 8));\n this.currentSnapshot = freezeSnapshot({\n epoch: 0,\n ready: [],\n pending: 0,\n resources: 0,\n sccs: [],\n counters: this.counters,\n });\n }\n\n load(guid: string, signal = new AbortController().signal): Promise<GraphResult<P>> {\n const canonicalGuid = guid.toLowerCase();\n if (this.disposed) return Promise.resolve(err(disposed()));\n if (signal.aborted) return Promise.resolve(err(cancelled(canonicalGuid)));\n const cached = this.ready.get(canonicalGuid);\n if (cached !== undefined) {\n this.counters = {\n ...this.counters,\n cacheHits: this.counters.cacheHits + 1,\n noChange: this.counters.noChange + 1,\n };\n this.publish();\n return Promise.resolve(ok(cached));\n }\n const existing = this.requests.get(canonicalGuid);\n if (existing !== undefined) {\n this.counters = { ...this.counters, cacheHits: this.counters.cacheHits + 1 };\n return existing;\n }\n this.counters = { ...this.counters, loads: this.counters.loads + 1 };\n const ticketEpoch = this.epoch;\n const request = this.loadClosure(canonicalGuid, signal, ticketEpoch).finally(() => {\n if (this.requests.get(canonicalGuid) === request) this.requests.delete(canonicalGuid);\n this.publish();\n });\n this.requests.set(canonicalGuid, request);\n this.publish();\n return request;\n }\n\n invalidate(guid: string): readonly string[] {\n const affected = this.collectAffected([guid.toLowerCase()]);\n this.drop(affected);\n this.epoch += 1;\n this.publish();\n return [...affected].sort();\n }\n\n invalidateForCatalogChange(guids?: readonly string[]): void {\n if (this.disposed) return;\n const affected =\n guids === undefined || guids.length === 0\n ? new Set([...this.ready.keys(), ...this.requests.keys(), ...this.reads.keys()])\n : this.collectAffected(guids.map((item) => item.toLowerCase()));\n this.drop(affected);\n this.epoch += 1;\n this.publish();\n }\n\n subscribe(listener: GraphListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n snapshot(): AssetGraphSnapshot {\n return this.currentSnapshot;\n }\n\n lookup(guid: string): P['value'] | undefined {\n return this.ready.get(guid.toLowerCase())?.value;\n }\n\n guidOf(value: P['value']): string | undefined {\n for (const [guid, entry] of this.ready) {\n if (entry.value === value) return guid;\n }\n return undefined;\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.epoch += 1;\n this.ready.clear();\n this.forward.clear();\n this.reverse.clear();\n this.reads.clear();\n const waiters = this.readWaiters;\n this.readWaiters = [];\n for (const resolve of waiters) resolve();\n this.publish();\n }\n\n private async loadClosure(\n root: string,\n signal: AbortSignal,\n ticketEpoch: number,\n ): Promise<GraphResult<P>> {\n const values = new Map<string, P>();\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const group = new Set<string>();\n const result = await this.visit(root, signal, visiting, visited, values, group);\n if (!result.ok) return result;\n if (this.disposed) return err(disposed());\n if (signal.aborted) return err(cancelled(root));\n if (ticketEpoch !== this.epoch) return err(superseded(root, ticketEpoch));\n for (const [guid, value] of values) this.promote(guid, value);\n this.recordScc();\n return ok(values.get(root) as P);\n }\n\n private async visit(\n guid: string,\n signal: AbortSignal,\n visiting: Set<string>,\n visited: Set<string>,\n values: Map<string, P>,\n group: Set<string>,\n ): Promise<GraphResult<P>> {\n if (visiting.has(guid)) {\n group.add(guid);\n return ok({ value: undefined as unknown as P, refs: [] } as unknown as P);\n }\n if (visited.has(guid)) return ok(values.get(guid) as P);\n const cached = this.ready.get(guid);\n if (cached !== undefined) {\n values.set(guid, cached);\n visited.add(guid);\n return ok(cached);\n }\n visiting.add(guid);\n const read = await this.readOnce(guid, signal);\n if (!read.ok) {\n visiting.delete(guid);\n return read;\n }\n values.set(guid, read.value);\n group.add(guid);\n this.link(guid, read.value.refs);\n for (const ref of read.value.refs) {\n const child = await this.visit(ref, signal, visiting, visited, values, group);\n if (!child.ok) {\n visiting.delete(guid);\n return err({\n code: 'asset-dependency-failed',\n expected: 'every referenced asset to load successfully',\n hint: 'repair the dependency publication and retry the root asset',\n detail: { guid, dependencyGuid: ref },\n });\n }\n }\n visiting.delete(guid);\n visited.add(guid);\n return ok(read.value);\n }\n\n private readOnce(guid: string, signal: AbortSignal): Promise<GraphResult<P>> {\n const existing = this.reads.get(guid);\n if (existing !== undefined) return existing;\n const request = this.withPermit(async () => {\n if (this.disposed) return err(disposed());\n if (signal.aborted) return err(cancelled(guid));\n try {\n const result = await this.read(guid, signal);\n if (signal.aborted) return err(cancelled(guid));\n if (!result.ok)\n this.counters = { ...this.counters, readErrors: this.counters.readErrors + 1 };\n return result;\n } catch {\n this.counters = { ...this.counters, readErrors: this.counters.readErrors + 1 };\n return err(thrown(guid));\n }\n });\n this.reads.set(guid, request);\n void request.finally(() => {\n if (this.reads.get(guid) === request) this.reads.delete(guid);\n });\n return request;\n }\n\n private async withPermit<T>(operation: () => Promise<T>): Promise<T> {\n if (this.activeReads >= this.limit) {\n await new Promise<void>((resolve) => this.readWaiters.push(resolve));\n }\n this.activeReads += 1;\n try {\n return await operation();\n } finally {\n this.activeReads -= 1;\n this.readWaiters.shift()?.();\n }\n }\n\n private link(guid: string, refs: readonly string[]): void {\n const previous = this.forward.get(guid) ?? new Set<string>();\n for (const ref of previous) this.reverse.get(ref)?.delete(guid);\n const next = new Set(refs.map((ref) => ref.toLowerCase()));\n this.forward.set(guid, next);\n for (const ref of next) {\n const dependents = this.reverse.get(ref) ?? new Set<string>();\n dependents.add(guid);\n this.reverse.set(ref, dependents);\n }\n }\n\n private collectAffected(guids: readonly string[]): Set<string> {\n const affected = new Set<string>();\n const queue = [...guids];\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined || affected.has(current)) continue;\n affected.add(current);\n for (const dependent of this.reverse.get(current) ?? []) queue.push(dependent);\n }\n return affected;\n }\n\n private drop(affected: ReadonlySet<string>): void {\n for (const item of affected) {\n for (const ref of this.forward.get(item) ?? []) this.reverse.get(ref)?.delete(item);\n for (const dependent of this.reverse.get(item) ?? []) {\n this.forward.get(dependent)?.delete(item);\n }\n }\n for (const item of affected) {\n this.ready.delete(item);\n this.requests.delete(item);\n this.reads.delete(item);\n this.forward.delete(item);\n this.reverse.delete(item);\n }\n this.sccs.splice(0, this.sccs.length);\n }\n\n private promote(guid: string, value: P): void {\n if (value === undefined) return;\n this.ready.set(\n guid,\n Object.freeze({\n ...value,\n value: freezeRuntimePayload(value.value),\n refs: Object.freeze([...value.refs]),\n }) as P,\n );\n }\n\n private recordScc(): void {\n const indexByGuid = new Map<string, number>();\n const lowByGuid = new Map<string, number>();\n const stack: string[] = [];\n const onStack = new Set<string>();\n let nextIndex = 0;\n const components: string[][] = [];\n const visit = (guid: string): void => {\n indexByGuid.set(guid, nextIndex);\n lowByGuid.set(guid, nextIndex);\n nextIndex += 1;\n stack.push(guid);\n onStack.add(guid);\n for (const ref of this.forward.get(guid) ?? []) {\n if (!indexByGuid.has(ref)) {\n visit(ref);\n lowByGuid.set(guid, Math.min(lowByGuid.get(guid) ?? 0, lowByGuid.get(ref) ?? 0));\n } else if (onStack.has(ref)) {\n lowByGuid.set(guid, Math.min(lowByGuid.get(guid) ?? 0, indexByGuid.get(ref) ?? 0));\n }\n }\n if (lowByGuid.get(guid) !== indexByGuid.get(guid)) return;\n const component: string[] = [];\n let member: string | undefined;\n do {\n member = stack.pop();\n if (member === undefined) break;\n onStack.delete(member);\n component.push(member);\n } while (member !== guid);\n if (component.length > 1 || this.forward.get(guid)?.has(guid) === true)\n components.push(component.sort());\n };\n for (const guid of this.forward.keys()) if (!indexByGuid.has(guid)) visit(guid);\n this.sccs.splice(\n 0,\n this.sccs.length,\n ...components.map((component) => Object.freeze(component)),\n );\n }\n\n private publish(): void {\n this.currentSnapshot = freezeSnapshot({\n epoch: this.epoch,\n ready: [...this.ready.keys()].sort(),\n pending: this.requests.size + this.reads.size,\n resources: this.ready.size,\n sccs: this.sccs,\n counters: this.counters,\n });\n for (const listener of [...this.listeners]) {\n try {\n listener(this.currentSnapshot);\n } catch {\n this.counters = {\n ...this.counters,\n listenerFailures: Math.min(1024, this.counters.listenerFailures + 1),\n };\n this.currentSnapshot = freezeSnapshot({\n ...this.currentSnapshot,\n counters: this.counters,\n });\n }\n }\n }\n}\n","import type { CatalogEntry } from '@forgeax/engine-types';\nimport { type AssetLoadError, err, ok, type Result } from '@forgeax/engine-types';\n\nexport interface RuntimeCatalogRow extends CatalogEntry {\n readonly publication: NonNullable<CatalogEntry['publication']>;\n}\n\nfunction invalidRow(guid: string, reason: string): Result<never, AssetLoadError> {\n return err({\n code: 'asset-package-invalid',\n expected: 'one complete current runtime Catalog row',\n hint: 'rebuild the producer Catalog and publish one Pack v2 tuple',\n detail: { guid, reason },\n });\n}\n\nexport function validateRuntimeRow(row: CatalogEntry): Result<RuntimeCatalogRow, AssetLoadError> {\n if (row === null || typeof row !== 'object') return invalidRow('', 'row');\n const candidate = row as Partial<CatalogEntry>;\n const guid = typeof candidate.guid === 'string' ? candidate.guid : '';\n if (guid.trim().length === 0) return invalidRow(guid, 'guid');\n if (typeof candidate.kind !== 'string' || candidate.kind.trim().length === 0)\n return invalidRow(guid, 'kind');\n if (typeof candidate.packageUrl !== 'string' || candidate.packageUrl.trim().length === 0)\n return invalidRow(guid, 'packageUrl');\n if (typeof candidate.sourcePath !== 'string' || candidate.sourcePath.trim().length === 0)\n return invalidRow(guid, 'sourcePath');\n if (!Number.isSafeInteger(candidate.publication?.generation))\n return invalidRow(guid, 'publication generation');\n if (candidate.publication === undefined) return invalidRow(guid, 'publication');\n const publication = candidate.publication;\n if (\n publication.schemaVersion !== 'asset-publication/1' ||\n typeof publication.sourcePath !== 'string' ||\n publication.sourcePath.trim().length === 0 ||\n typeof publication.sourceRevision !== 'string' ||\n publication.sourceRevision.trim().length === 0 ||\n publication.generation < 0 ||\n typeof publication.digest !== 'string' ||\n publication.digest.trim().length === 0 ||\n typeof publication.outputSetDigest !== 'string' ||\n publication.outputSetDigest.trim().length === 0 ||\n !Array.isArray(publication.outputs) ||\n publication.receipt === null ||\n typeof publication.receipt !== 'object' ||\n !Array.isArray(publication.externalEvidence)\n ) {\n return invalidRow(guid, 'publication tuple');\n }\n return ok(Object.freeze({ ...candidate, guid, publication }) as RuntimeCatalogRow);\n}\n","import type {\n CatalogDelta,\n CatalogDiagnostic,\n CatalogEntry,\n ResourceRevision,\n} from '@forgeax/engine-types';\nimport { type AssetLoadError, err, ok, type Result } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { type RuntimeCatalogRow, validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface CatalogSessionOptions {\n readonly scopeId?: string;\n readonly generation?: number;\n}\n\nexport interface CatalogSessionSnapshot {\n readonly scopeId: string;\n readonly generation: number;\n readonly epoch: number;\n readonly revision?: ResourceRevision;\n readonly entries: readonly RuntimeCatalogRow[];\n readonly changed: readonly string[];\n readonly removed: readonly string[];\n readonly diagnostics: readonly CatalogDiagnostic[];\n readonly listenerFailures: number;\n readonly stale: boolean;\n}\n\ntype SessionResult = Result<CatalogSessionSnapshot, AssetLoadError>;\ntype SessionListener = (snapshot: CatalogSessionSnapshot) => void;\n\nfunction runtimeError(\n code: AssetLoadError['code'],\n guid: string,\n detail: Record<string, unknown>,\n): AssetLoadError {\n if (code === 'catalog-discontinuous') {\n return {\n code,\n expected: 'an ordered catalog revision window',\n hint: 'reconcile the current Catalog before consuming this delta',\n detail: {\n scopeId: String(detail.scopeId ?? 'unknown'),\n expectedGeneration: Number(detail.expectedGeneration ?? 0),\n actualGeneration: Number(detail.actualGeneration ?? 0),\n },\n };\n }\n return {\n code: 'asset-package-invalid',\n expected: 'a verified Catalog source',\n hint: 'repair the producer Catalog and retry with the current publication',\n detail: { guid, reason: String(detail.reason ?? 'catalog source failed') },\n };\n}\n\nfunction freezeSnapshot(snapshot: CatalogSessionSnapshot): CatalogSessionSnapshot {\n return Object.freeze({\n ...snapshot,\n entries: Object.freeze([...snapshot.entries]),\n changed: Object.freeze([...snapshot.changed]),\n removed: Object.freeze([...snapshot.removed]),\n diagnostics: Object.freeze([...snapshot.diagnostics]),\n });\n}\n\nfunction sameEntry(left: CatalogEntry, right: CatalogEntry): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction key(guid: string): string {\n return guid.toLowerCase();\n}\n\nexport class CatalogSession {\n private readonly source: CatalogSource;\n private readonly scopeId: string;\n private readonly generation: number;\n private readonly entries = new Map<string, RuntimeCatalogRow>();\n private readonly listeners = new Set<SessionListener>();\n private unsubscribe: (() => void) | undefined;\n private baselinePromise: Promise<SessionResult> | undefined;\n private reconcilePromise: Promise<SessionResult> | undefined;\n private pending: CatalogDelta[] = [];\n private currentSnapshot: CatalogSessionSnapshot;\n private revision: ResourceRevision | undefined;\n private diagnostics: CatalogDiagnostic[] = [];\n private listenerFailures = 0;\n private changed = new Set<string>();\n private removed = new Set<string>();\n private epoch = 0;\n private stale = false;\n private staleGeneration = 0;\n private started = false;\n private disposed = false;\n\n constructor(source: CatalogSource, options: CatalogSessionOptions = {}) {\n this.source = source;\n this.scopeId = options.scopeId ?? source.expectedScope?.scopeId ?? 'asset-runtime';\n this.generation = options.generation ?? source.expectedScope?.generation ?? 0;\n this.currentSnapshot = freezeSnapshot({\n scopeId: this.scopeId,\n generation: this.generation,\n epoch: 0,\n entries: [],\n changed: [],\n removed: [],\n diagnostics: [],\n listenerFailures: 0,\n stale: false,\n });\n }\n\n start(): Promise<SessionResult> {\n if (this.baselinePromise !== undefined) return this.baselinePromise;\n if (this.disposed) return Promise.resolve(err(this.disposedError()));\n this.unsubscribe = this.source.subscribe((delta) => this.receive(delta));\n const promise = this.source\n .enumerate()\n .then((result) => {\n if (!result.ok) {\n this.markStale();\n this.publish();\n return err(runtimeError('asset-package-invalid', '', { reason: result.error.code }));\n }\n this.entries.clear();\n for (const entry of result.value) {\n const validated = validateRuntimeRow(entry);\n if (!validated.ok) {\n this.markStale();\n this.publish();\n return err(validated.error);\n }\n this.entries.set(key(validated.value.guid), validated.value);\n }\n this.started = true;\n this.stale = false;\n this.staleGeneration = this.generation;\n this.diagnostics = [];\n for (const delta of this.pending) this.fold(delta, false);\n this.pending = [];\n this.publish();\n return ok(this.currentSnapshot);\n })\n .catch((cause: unknown) => {\n this.markStale();\n this.addDiagnostic('catalog-degraded-rows', 'Catalog enumeration must resolve a Result');\n this.publish();\n return err(\n runtimeError('asset-package-invalid', '', {\n reason: cause instanceof Error ? cause.message : String(cause),\n }),\n );\n });\n this.baselinePromise = promise;\n void promise.then(\n (result) => {\n if (!result.ok) this.baselinePromise = undefined;\n },\n () => {\n this.baselinePromise = undefined;\n },\n );\n return promise;\n }\n\n reconcile(): Promise<SessionResult> {\n if (this.disposed) return Promise.resolve(err(this.disposedError()));\n if (this.reconcilePromise !== undefined) return this.reconcilePromise;\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.started = false;\n this.pending = [];\n this.baselinePromise = undefined;\n this.epoch += 1;\n const promise = this.start();\n this.reconcilePromise = promise;\n void promise.then(\n () => {\n if (this.reconcilePromise === promise) this.reconcilePromise = undefined;\n },\n () => {\n if (this.reconcilePromise === promise) this.reconcilePromise = undefined;\n },\n );\n return promise;\n }\n\n current(guid: string): RuntimeCatalogRow | undefined {\n return this.entries.get(key(guid));\n }\n\n snapshot(): CatalogSessionSnapshot {\n return this.currentSnapshot;\n }\n\n discontinuity(): AssetLoadError | undefined {\n if (!this.stale) return undefined;\n return {\n code: 'catalog-discontinuous',\n expected: 'an ordered, authoritative catalog revision window',\n hint: 'reconcile the Catalog source and retry the current publication',\n detail: {\n scopeId: this.scopeId,\n expectedGeneration: this.generation,\n actualGeneration: this.staleGeneration,\n },\n };\n }\n\n subscribe(listener: SessionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.pending = [];\n this.listeners.clear();\n }\n\n private receive(delta: CatalogDelta): void {\n if (this.disposed) return;\n if (!this.started) {\n this.pending.push(delta);\n return;\n }\n this.fold(delta, true);\n }\n\n private fold(delta: CatalogDelta, publish: boolean): void {\n if (\n (delta.scopeId !== undefined && delta.scopeId !== this.scopeId) ||\n (delta.generation !== undefined && delta.generation !== this.generation)\n ) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-scope-mismatch', 'delta scope does not match the session');\n if (publish) this.publish();\n return;\n }\n if (delta.authority === 'degraded') {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-degraded-rows', 'degraded rows are not identity-bearing');\n if (publish) this.publish();\n return;\n }\n if (delta.revisions !== undefined) {\n const baseline = delta.revisions.baseline;\n const current = delta.revisions.current;\n const valid =\n baseline.length === current.length &&\n current.every((point) => {\n const prior = baseline.find((item) => item.rootId === point.rootId);\n return prior !== undefined && point.revision === prior.revision + 1;\n });\n if (!valid) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-gap', 'delta revision window is not contiguous');\n if (publish) this.publish();\n return;\n }\n }\n let changed = false;\n for (const entry of [...delta.added, ...delta.changed]) {\n const validated = validateRuntimeRow(entry);\n if (!validated.ok) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-degraded-rows', 'delta contains an invalid runtime row');\n if (publish) this.publish();\n return;\n }\n const entryKey = key(validated.value.guid);\n const prior = this.entries.get(entryKey);\n if (prior === undefined || !sameEntry(prior, validated.value)) {\n this.entries.set(entryKey, validated.value);\n this.changed.add(entryKey);\n changed = true;\n if (validated.value.revision !== undefined) this.revision = validated.value.revision;\n }\n }\n for (const guid of delta.removed) {\n const entryKey = key(guid);\n if (this.entries.delete(entryKey)) {\n this.removed.add(entryKey);\n changed = true;\n }\n }\n if (changed) this.epoch += 1;\n if (publish) this.publish();\n }\n\n private addDiagnostic(code: CatalogDiagnostic['code'], expected: string): void {\n if (this.diagnostics.some((diagnostic) => diagnostic.code === code)) return;\n this.diagnostics.push({\n code,\n severity: 'blocking',\n expected,\n hint: 'reconcile the Catalog before loading the affected publication',\n authority: 'catalog',\n });\n }\n\n private markStale(actualGeneration = this.generation): void {\n this.stale = true;\n this.staleGeneration = actualGeneration;\n this.epoch += 1;\n }\n\n private publish(): void {\n this.currentSnapshot = freezeSnapshot({\n scopeId: this.scopeId,\n generation: this.generation,\n epoch: this.epoch,\n ...(this.revision === undefined ? {} : { revision: this.revision }),\n entries: [...this.entries.values()].sort((left, right) =>\n key(left.guid).localeCompare(key(right.guid)),\n ),\n changed: [...this.changed].sort(),\n removed: [...this.removed].sort(),\n diagnostics: this.diagnostics,\n listenerFailures: this.listenerFailures,\n stale: this.stale,\n });\n this.changed.clear();\n this.removed.clear();\n for (const listener of [...this.listeners]) {\n try {\n listener(this.currentSnapshot);\n } catch {\n this.listenerFailures = Math.min(1024, this.listenerFailures + 1);\n this.currentSnapshot = freezeSnapshot({\n ...this.currentSnapshot,\n listenerFailures: this.listenerFailures,\n });\n }\n }\n }\n\n private disposedError(): AssetLoadError {\n return runtimeError('asset-runtime-disposed', '', { scopeId: this.scopeId });\n }\n}\n","import type {\n AssetDecoder,\n AssetDecoderInput,\n AssetDecoderLease,\n AssetKind,\n AssetLoadError,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport { freezeRuntimePayload } from './immutable-payload.js';\n\ninterface DecoderEntry {\n readonly identity: symbol;\n readonly decoder: AssetDecoder<unknown>;\n readonly decode: (input: AssetDecoderInput<unknown>) => Promise<Result<unknown, AssetLoadError>>;\n references: number;\n}\n\nexport interface DecoderRegistryOptions {\n readonly scopeId?: string;\n}\n\nexport class DecoderRegistry {\n private readonly dispatch = new Map<string, DecoderEntry>();\n private readonly scopeId: string;\n private disposed = false;\n\n constructor(options: DecoderRegistryOptions = {}) {\n this.scopeId = options.scopeId ?? 'asset-runtime';\n }\n\n install<P, K extends string>(kind: AssetKind<P, K>, decoder: AssetDecoder<P>): AssetDecoderLease {\n if (this.disposed) throw new TypeError('asset runtime decoder registry is disposed');\n const normalizedDecoder = decoder as AssetDecoder<unknown>;\n const existing = this.dispatch.get(kind.kind);\n if (existing !== undefined) {\n if (existing.decoder !== normalizedDecoder) {\n throw new TypeError(`duplicate decoder kind \"${kind.kind}\"`);\n }\n existing.references += 1;\n return this.createLease(kind.kind, existing);\n }\n const identity = Symbol(kind.kind);\n const entry: DecoderEntry = {\n identity,\n decoder: normalizedDecoder,\n decode: (input) =>\n decoder.decode(input as AssetDecoderInput<P>) as Promise<Result<unknown, AssetLoadError>>,\n references: 1,\n };\n this.dispatch.set(kind.kind, entry);\n return this.createLease(kind.kind, entry);\n }\n\n private createLease(kind: string, entry: DecoderEntry): AssetDecoderLease {\n let released = false;\n return {\n kind,\n dispose: () => {\n if (released) return;\n released = true;\n entry.references -= 1;\n if (entry.references === 0 && this.dispatch.get(kind)?.identity === entry.identity) {\n this.dispatch.delete(kind);\n }\n },\n };\n }\n\n has<P, K extends string>(kind: AssetKind<P, K>): boolean {\n return this.dispatch.has(kind.kind);\n }\n\n load<P, K extends string>(\n kind: AssetKind<P, K>,\n input: AssetDecoderInput<P>,\n ): Promise<Result<P, AssetLoadError>> {\n return this.decode(kind, input);\n }\n\n loadByKind(\n kind: string,\n input: AssetDecoderInput<unknown>,\n ): Promise<Result<unknown, AssetLoadError>> {\n if (this.disposed) return Promise.resolve(err(disposedError(this.scopeId)));\n const entry = this.dispatch.get(kind);\n if (entry === undefined) {\n return Promise.resolve(\n err({\n code: 'asset-decoder-missing',\n expected: `an active decoder for kind \"${kind}\"`,\n hint: 'install the owner decoder lease before loading this kind',\n detail: { kind },\n }),\n );\n }\n return this.decodeEntry(kind, entry, input);\n }\n\n async decode<P, K extends string>(\n kind: AssetKind<P, K>,\n input: AssetDecoderInput<P>,\n ): Promise<Result<P, AssetLoadError>> {\n if (this.disposed) return err(disposedError(this.scopeId));\n if (input.signal.aborted) return err(cancelledError(input.envelope.guid));\n const entry = this.dispatch.get(kind.kind);\n if (entry === undefined) {\n return err({\n code: 'asset-decoder-missing',\n expected: `an active decoder for kind \"${kind.kind}\"`,\n hint: 'install the owner decoder lease before loading this kind',\n detail: { kind: kind.kind },\n });\n }\n return (await this.decodeEntry(kind.kind, entry, input)) as Result<P, AssetLoadError>;\n }\n\n private async decodeEntry(\n kind: string,\n entry: DecoderEntry,\n input: AssetDecoderInput<unknown>,\n ): Promise<Result<unknown, AssetLoadError>> {\n if (this.disposed) return err(disposedError(this.scopeId));\n if (input.signal.aborted) return err(cancelledError(input.envelope.guid));\n try {\n const result = await entry.decode(input);\n if (this.disposed) return err(disposedError(this.scopeId));\n if (this.dispatch.get(kind)?.identity !== entry.identity) {\n return err(supersededError(input.envelope.guid, kind));\n }\n if (input.signal.aborted) return err(cancelledError(input.envelope.guid));\n return result.ok ? ok(freezeRuntimePayload(result.value)) : result;\n } catch {\n return err({\n code: 'asset-decode-failed',\n expected: `decoder for kind \"${kind}\" to return a Result`,\n hint: 'inspect the owner decoder and retry the current publication',\n detail: { guid: input.envelope.guid, kind },\n });\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.dispatch.clear();\n }\n}\n\nfunction cancelledError(guid: string): AssetLoadError {\n return {\n code: 'asset-load-cancelled',\n expected: 'the request AbortSignal to remain live until decode completes',\n hint: 'retry with a live AbortSignal when the request is still needed',\n detail: { guid },\n };\n}\n\nfunction disposedError(scopeId: string): AssetLoadError {\n return {\n code: 'asset-runtime-disposed',\n expected: 'an active asset runtime decoder scope',\n hint: 'obtain a new Registry from the current realm',\n detail: { scopeId },\n };\n}\n\nfunction supersededError(guid: string, kind: string): AssetLoadError {\n return {\n code: 'asset-superseded',\n expected: `the decoder lease for kind \"${kind}\" to remain current until decode completes`,\n hint: 'retry the current publication after reinstalling its owner decoder',\n detail: { guid, generation: 0 },\n };\n}\n","import type {\n AssetEnvelopeV2,\n AssetLoadError,\n AssetPublicationTuple,\n PackV2,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\n\nexport interface PackReaderOptions {\n readonly fetcher?: typeof globalThis.fetch;\n}\n\nexport type VerifiedPack = PackV2<unknown>;\n\nfunction invalid(guid: string, reason: string): Result<never, AssetLoadError> {\n return err({\n code: 'asset-package-invalid',\n expected: 'a verified Pack v2 envelope with complete runtime artifacts',\n hint: 're-cook the Pack v2 publication and retry the current tuple',\n detail: { guid, reason },\n });\n}\n\nfunction frozen<T>(value: T): T {\n if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {\n Object.freeze(value);\n for (const child of Object.values(value as Record<string, unknown>)) frozen(child);\n }\n return value;\n}\n\nfunction sameTuple(left: AssetPublicationTuple, right: AssetPublicationTuple): boolean {\n return (\n left.scopeId === right.scopeId &&\n left.generation === right.generation &&\n left.digest === right.digest &&\n left.outputSetDigest === right.outputSetDigest\n );\n}\n\nexport class PackReader {\n private readonly fetcher: typeof globalThis.fetch | undefined;\n private readonly verified = new Map<string, VerifiedPack>();\n private readonly pending = new Map<string, Promise<Result<VerifiedPack, AssetLoadError>>>();\n\n constructor(options: PackReaderOptions = {}) {\n // An injected fetcher is an explicit transport lease and is fixed for the\n // reader lifetime. With no injection, resolve the host fetch at read time:\n // App assembly can precede a dev/test host installing its transport.\n this.fetcher = options.fetcher?.bind(globalThis);\n }\n\n async read(\n packageUrl: string,\n expected: AssetPublicationTuple,\n signal: AbortSignal,\n ): Promise<Result<VerifiedPack, AssetLoadError>> {\n if (signal.aborted) return err(this.cancelled(packageUrl));\n const key = this.key(packageUrl, expected);\n const cached = this.verified.get(key);\n if (cached !== undefined) return ok(cached);\n const active = this.pending.get(key);\n if (active !== undefined) return active;\n const request = this.fetchAndVerify(packageUrl, expected, signal);\n this.pending.set(key, request);\n const result = await request;\n this.pending.delete(key);\n if (result.ok) this.verified.set(key, result.value);\n return result;\n }\n\n private async fetchAndVerify(\n packageUrl: string,\n expected: AssetPublicationTuple,\n signal: AbortSignal,\n ): Promise<Result<VerifiedPack, AssetLoadError>> {\n let response: Response;\n try {\n const fetcher = this.fetcher ?? globalThis.fetch.bind(globalThis);\n response = await fetcher(packageUrl, { signal });\n } catch (_cause) {\n if (signal.aborted) return err(this.cancelled(packageUrl));\n return err({\n code: 'asset-fetch-failed',\n expected: 'HTTP 200 for the current Pack URL',\n hint: 'verify the package locator and republish the Pack',\n detail: { guid: packageUrl, packageUrl },\n });\n }\n if (!response.ok) {\n return err({\n code: 'asset-fetch-failed',\n expected: 'HTTP 200 for the current Pack URL',\n hint: 'verify the package locator and republish the Pack',\n detail: { guid: packageUrl, packageUrl },\n });\n }\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n return invalid(packageUrl, 'invalid JSON');\n }\n return this.verify(value, expected);\n }\n\n private key(packageUrl: string, tuple: AssetPublicationTuple): string {\n return `${packageUrl}\\u0000${tuple.scopeId}\\u0000${tuple.generation}\\u0000${tuple.digest}\\u0000${tuple.outputSetDigest}`;\n }\n\n verify(value: unknown, expected: AssetPublicationTuple): Result<VerifiedPack, AssetLoadError> {\n if (value === null || typeof value !== 'object') return invalid('', 'Pack is not an object');\n const pack = value as Partial<PackV2<unknown>>;\n if (pack.schemaVersion !== '2.0.0' || pack.kind !== 'internal-text-package') {\n return invalid('', 'schemaVersion or kind');\n }\n if (\n typeof pack.scopeId !== 'string' ||\n !Number.isSafeInteger(pack.generation) ||\n typeof pack.digest !== 'string' ||\n typeof pack.outputSetDigest !== 'string' ||\n !sameTuple(pack as AssetPublicationTuple, expected)\n ) {\n return invalid('', 'publication tuple mismatch');\n }\n if (!Array.isArray(pack.assets)) return invalid('', 'assets');\n const guids = new Set<string>();\n for (const raw of pack.assets) {\n const asset = raw as Partial<AssetEnvelopeV2<unknown>>;\n const guid = typeof asset.guid === 'string' ? asset.guid : '';\n if (guid.length === 0 || guids.has(guid.toLowerCase()))\n return invalid(guid, 'duplicate guid');\n guids.add(guid.toLowerCase());\n if (\n typeof asset.kind !== 'string' ||\n asset.payload === undefined ||\n !Array.isArray(asset.refs) ||\n asset.refs.some((ref) => typeof ref !== 'string') ||\n asset.artifacts === null ||\n typeof asset.artifacts !== 'object'\n ) {\n return invalid(guid, 'asset envelope fields');\n }\n for (const [artifactKey, descriptor] of Object.entries(asset.artifacts)) {\n if (!this.validArtifact(guid, artifactKey, descriptor)) {\n return invalid(guid, `artifact ${artifactKey}`);\n }\n }\n }\n return ok(frozen(pack as VerifiedPack));\n }\n\n private validArtifact(_guid: string, key: string, value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const descriptor = value as Record<string, unknown>;\n const integrity = descriptor.integrity;\n return (\n key.length > 0 &&\n typeof descriptor.path === 'string' &&\n descriptor.path.length > 0 &&\n typeof descriptor.mediaType === 'string' &&\n descriptor.mediaType.length > 0 &&\n (descriptor.contentEncoding === 'identity' || descriptor.contentEncoding === 'zstd') &&\n Number.isSafeInteger(descriptor.byteLength) &&\n Number(descriptor.byteLength) >= 0 &&\n integrity !== null &&\n typeof integrity === 'object' &&\n (integrity as Record<string, unknown>).algorithm === 'sha256' &&\n typeof (integrity as Record<string, unknown>).digest === 'string' &&\n /^sha256:[0-9a-f]{64}$/i.test(String((integrity as Record<string, unknown>).digest))\n );\n }\n\n private cancelled(guid: string): AssetLoadError {\n return {\n code: 'asset-load-cancelled',\n expected: 'the request AbortSignal to remain live while reading the Pack',\n hint: 'retry with a live AbortSignal when the request is still needed',\n detail: { guid },\n };\n }\n}\n","import type {\n Asset,\n AssetArtifactReader,\n AssetDecoder,\n AssetDecoderInput,\n AssetDecoderLease,\n AssetKind,\n AssetLoadError,\n BuiltinAssetKind,\n BuiltinAssetPayload,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { ArtifactCache } from './artifact-cache.js';\nimport { AssetGraph, type AssetGraphSnapshot } from './asset-graph.js';\nimport { CatalogSession, type CatalogSessionOptions } from './catalog-session.js';\nimport { DecoderRegistry } from './decoder-registry.js';\nimport { freezeRuntimePayload } from './immutable-payload.js';\nimport { PackReader } from './pack-reader.js';\nimport { validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface AssetRegistryOptions extends CatalogSessionOptions {\n readonly catalog: CatalogSource;\n readonly fetcher?: typeof globalThis.fetch;\n readonly maxConcurrentReads?: number;\n}\n\nexport interface AssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport type AssetRegistrySnapshot = AssetGraphSnapshot;\n\nexport type AssetRegistrySnapshotCounters = AssetRegistrySnapshot['counters'];\n\nexport interface AssetRegistry {\n installDecoder<P, K extends string>(\n kind: AssetKind<P, K>,\n decoder: AssetDecoder<P>,\n ): AssetDecoderLease;\n load<K extends BuiltinAssetKind>(\n guid: string,\n kind: K,\n options?: AssetLoadOptions,\n ): Promise<Result<BuiltinAssetPayload<K>, AssetLoadError>>;\n load<P, K extends string>(\n guid: string,\n kind: AssetKind<P, K>,\n options?: AssetLoadOptions,\n ): Promise<Result<P, AssetLoadError>>;\n snapshot(): AssetRegistrySnapshot;\n subscribe(listener: (snapshot: AssetRegistrySnapshot) => void): () => void;\n dispose(): void;\n}\n\n/** Internal render projection; the root Registry keeps only its five actions. */\nexport interface AssetRegistryResolver {\n readonly epoch: number;\n lookup<T extends Asset>(guid: string): T | undefined;\n guidOf(asset: Asset): string | undefined;\n}\n\nconst REGISTRY_RESOLVER = Symbol.for('forgeax.assets-runtime.registry-resolver');\ntype RegistryWithResolver = AssetRegistry & {\n [REGISTRY_RESOLVER]?: AssetRegistryResolver;\n};\n\nexport function getAssetRegistryResolver(registry: AssetRegistry): AssetRegistryResolver {\n const resolver = (registry as RegistryWithResolver)[REGISTRY_RESOLVER];\n if (resolver === undefined) {\n throw new TypeError('AssetRegistry resolver is not owned by this asset runtime');\n }\n return resolver;\n}\n\nfunction missing(guid: string): AssetLoadError {\n return {\n code: 'asset-not-found',\n expected: `the current Catalog to contain GUID \"${guid}\"`,\n hint: 'inspect the producer Catalog and rebuild the missing publication',\n detail: { guid },\n };\n}\n\nfunction mismatch(guid: string, expectedKind: string, actualKind: string): AssetLoadError {\n return {\n code: 'asset-kind-mismatch',\n expected: `Catalog kind \"${actualKind}\" to match \"${expectedKind}\"`,\n hint: 'pass the Catalog kind or the matching custom AssetKind token',\n detail: { guid, expectedKind, actualKind },\n };\n}\n\nfunction artifactError(guid: string, reason: string): AssetLoadError {\n return {\n code: 'asset-integrity-failed',\n expected: 'the verified artifact byte length and digest',\n hint: 'verify the artifact digest and recook the Pack',\n detail: {\n guid,\n artifactKey: reason,\n expectedDigest: 'descriptor integrity',\n actualDigest: reason,\n },\n };\n}\n\nconst ASSET_GUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction invalidGuid(guid: string): AssetLoadError {\n return {\n code: 'asset-guid-invalid',\n expected: 'a 36-character dash-form asset GUID',\n hint: 'pass the producer GUID from the current Catalog row',\n detail: { guid },\n };\n}\n\nexport function createAssetRegistry(options: AssetRegistryOptions): AssetRegistry {\n const session = new CatalogSession(options.catalog, options);\n const reader = new PackReader(options.fetcher === undefined ? {} : { fetcher: options.fetcher });\n const cache = new ArtifactCache();\n const decoders = new DecoderRegistry(\n options.scopeId === undefined ? {} : { scopeId: options.scopeId },\n );\n const graph = new AssetGraph<{ readonly value: unknown; readonly refs: readonly string[] }>({\n ...(options.maxConcurrentReads === undefined\n ? {}\n : { maxConcurrentReads: options.maxConcurrentReads }),\n read: async (guid, signal) => {\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n const validated = validateRuntimeRow(row);\n if (!validated.ok) return validated;\n const publication = validated.value.publication;\n const tuple = {\n scopeId: session.snapshot().scopeId,\n generation: publication.generation,\n digest: publication.digest,\n outputSetDigest: publication.outputSetDigest,\n };\n const pack = await reader.read(row.packageUrl, tuple, signal);\n if (!pack.ok) return pack;\n const envelope = pack.value.assets.find(\n (asset) => asset.guid.toLowerCase() === guid.toLowerCase(),\n );\n if (envelope === undefined) return err(missing(guid));\n const artifacts: AssetArtifactReader = {\n read: (descriptor) => {\n const integrity = descriptor.integrity;\n if (integrity === undefined)\n return Promise.resolve(err(artifactError(guid, descriptor.path)));\n const key = `${tuple.scopeId}:${tuple.generation}:${tuple.outputSetDigest}:${integrity.digest}`;\n return cache.read(key, async () => {\n const url = resolveArtifactUrl(row.packageUrl, descriptor.path);\n let response: Response;\n try {\n response = await (options.fetcher ?? globalThis.fetch)(url, { signal });\n } catch {\n return err(artifactError(guid, descriptor.path));\n }\n if (!response.ok) return err(artifactError(guid, descriptor.path));\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (descriptor.byteLength === undefined || bytes.byteLength !== descriptor.byteLength) {\n return err(artifactError(guid, descriptor.path));\n }\n const actualDigest = await sha256(bytes);\n if (actualDigest !== descriptor.integrity?.digest.toLowerCase()) {\n return err(artifactError(guid, `${descriptor.path}:${actualDigest}`));\n }\n return ok(bytes);\n });\n },\n };\n const input: AssetDecoderInput<unknown> = { envelope, artifacts, signal };\n const decoded = await decoders.loadByKind(envelope.kind, input);\n if (!decoded.ok) return decoded;\n return ok({ value: freezeRuntimePayload(decoded.value), refs: envelope.refs });\n },\n });\n\n let catalogEpoch = session.snapshot().epoch;\n const unsubscribeCatalog = session.subscribe((snapshot) => {\n if (snapshot.epoch === catalogEpoch) return;\n catalogEpoch = snapshot.epoch;\n graph.invalidateForCatalogChange(\n snapshot.stale ? undefined : [...snapshot.changed, ...snapshot.removed],\n );\n });\n\n const registry: AssetRegistry = {\n installDecoder: (kind, decoder) => decoders.install(kind, decoder),\n load: (async (\n guid: string,\n kind: BuiltinAssetKind | AssetKind<unknown, string>,\n loadOptions: AssetLoadOptions = {},\n ): Promise<Result<unknown, AssetLoadError>> => {\n if (!ASSET_GUID_PATTERN.test(guid)) return err(invalidGuid(guid));\n const expectedKind = typeof kind === 'string' ? kind : kind.kind;\n const started = await session.start();\n if (!started.ok) return err(started.error);\n if (session.snapshot().stale) {\n const reconciled = await session.reconcile();\n if (!reconciled.ok) return err(reconciled.error);\n const discontinuity = session.discontinuity();\n if (discontinuity !== undefined) return err(discontinuity);\n }\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n if (row.kind !== expectedKind) return err(mismatch(guid, expectedKind, row.kind));\n const result = await graph.load(guid, loadOptions.signal);\n return result.ok ? ok(result.value.value) : result;\n }) as AssetRegistry['load'],\n snapshot: () => graph.snapshot(),\n subscribe: (listener) => graph.subscribe(listener),\n dispose: () => {\n graph.dispose();\n unsubscribeCatalog();\n decoders.dispose();\n cache.clear();\n session.dispose();\n },\n };\n const resolver: AssetRegistryResolver = {\n get epoch() {\n return graph.snapshot().epoch;\n },\n lookup: <T extends Asset>(guid: string) => graph.lookup(guid) as T | undefined,\n guidOf: (asset: Asset) => graph.guidOf(asset),\n };\n Object.defineProperty(registry, REGISTRY_RESOLVER, {\n value: resolver,\n enumerable: false,\n });\n return registry;\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes as unknown as BufferSource);\n return `sha256:${Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('')}`;\n}\n\nfunction resolveArtifactUrl(packageUrl: string, path: string): string {\n const separator = packageUrl.lastIndexOf('/');\n const packageDirectory = separator < 0 ? '' : packageUrl.slice(0, separator + 1);\n try {\n return new URL(path, packageDirectory).toString();\n } catch {\n return `${packageDirectory}${path.replace(/^\\//, '')}`;\n }\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { AssetLoadError, Result } from '@forgeax/engine-types';
2
+ export interface ArtifactCacheSnapshot {
3
+ readonly entries: number;
4
+ readonly pending: number;
5
+ readonly hits: number;
6
+ readonly misses: number;
7
+ }
8
+ export declare class ArtifactCache {
9
+ private readonly values;
10
+ private readonly pending;
11
+ private hits;
12
+ private misses;
13
+ read(contentAddress: string, reader: () => Promise<Result<Uint8Array, AssetLoadError>>): Promise<Result<Uint8Array, AssetLoadError>>;
14
+ clear(contentAddress?: string): void;
15
+ snapshot(): ArtifactCacheSnapshot;
16
+ }
17
+ //# sourceMappingURL=artifact-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-cache.d.ts","sourceRoot":"","sources":["../../src/internal/artifact-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkE;IAC1F,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IAEnB,IAAI,CACF,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,GACxD,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IA4B9C,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAUpC,QAAQ,IAAI,qBAAqB;CAQlC"}
@@ -0,0 +1,70 @@
1
+ import type { AssetLoadError, Result } from '@forgeax/engine-types';
2
+ export interface AssetGraphValue<P> {
3
+ readonly value: P;
4
+ readonly refs: readonly string[];
5
+ }
6
+ export interface AssetGraphOptions<P extends {
7
+ readonly value: unknown;
8
+ readonly refs: readonly string[];
9
+ }> {
10
+ readonly read: (guid: string, signal: AbortSignal) => Promise<Result<P, AssetLoadError>>;
11
+ readonly maxConcurrentReads?: number;
12
+ }
13
+ export interface AssetGraphCounters {
14
+ readonly loads: number;
15
+ readonly cacheHits: number;
16
+ readonly readErrors: number;
17
+ readonly noChange: number;
18
+ readonly listenerFailures: number;
19
+ }
20
+ export interface AssetGraphSnapshot {
21
+ readonly epoch: number;
22
+ readonly ready: readonly string[];
23
+ readonly pending: number;
24
+ readonly resources: number;
25
+ readonly sccs: readonly (readonly string[])[];
26
+ readonly counters: AssetGraphCounters;
27
+ }
28
+ type GraphResult<P> = Result<P, AssetLoadError>;
29
+ type GraphListener = (snapshot: AssetGraphSnapshot) => void;
30
+ export declare class AssetGraph<P extends {
31
+ readonly value: unknown;
32
+ readonly refs: readonly string[];
33
+ }> {
34
+ private readonly read;
35
+ private readonly limit;
36
+ private readonly ready;
37
+ private readonly forward;
38
+ private readonly reverse;
39
+ private readonly reads;
40
+ private readonly requests;
41
+ private readonly listeners;
42
+ private readonly sccs;
43
+ private activeReads;
44
+ private readWaiters;
45
+ private disposed;
46
+ private epoch;
47
+ private counters;
48
+ private currentSnapshot;
49
+ constructor(options: AssetGraphOptions<P>);
50
+ load(guid: string, signal?: AbortSignal): Promise<GraphResult<P>>;
51
+ invalidate(guid: string): readonly string[];
52
+ invalidateForCatalogChange(guids?: readonly string[]): void;
53
+ subscribe(listener: GraphListener): () => void;
54
+ snapshot(): AssetGraphSnapshot;
55
+ lookup(guid: string): P['value'] | undefined;
56
+ guidOf(value: P['value']): string | undefined;
57
+ dispose(): void;
58
+ private loadClosure;
59
+ private visit;
60
+ private readOnce;
61
+ private withPermit;
62
+ private link;
63
+ private collectAffected;
64
+ private drop;
65
+ private promote;
66
+ private recordScc;
67
+ private publish;
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=asset-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-graph.d.ts","sourceRoot":"","sources":["../../src/internal/asset-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { CatalogDiagnostic, ResourceRevision } from '@forgeax/engine-types';
2
+ import { type AssetLoadError, type Result } from '@forgeax/engine-types';
3
+ import type { CatalogSource } from '../catalog-source.js';
4
+ import { type RuntimeCatalogRow } from './validate-runtime-row.js';
5
+ export interface CatalogSessionOptions {
6
+ readonly scopeId?: string;
7
+ readonly generation?: number;
8
+ }
9
+ export interface CatalogSessionSnapshot {
10
+ readonly scopeId: string;
11
+ readonly generation: number;
12
+ readonly epoch: number;
13
+ readonly revision?: ResourceRevision;
14
+ readonly entries: readonly RuntimeCatalogRow[];
15
+ readonly changed: readonly string[];
16
+ readonly removed: readonly string[];
17
+ readonly diagnostics: readonly CatalogDiagnostic[];
18
+ readonly listenerFailures: number;
19
+ readonly stale: boolean;
20
+ }
21
+ type SessionResult = Result<CatalogSessionSnapshot, AssetLoadError>;
22
+ type SessionListener = (snapshot: CatalogSessionSnapshot) => void;
23
+ export declare class CatalogSession {
24
+ private readonly source;
25
+ private readonly scopeId;
26
+ private readonly generation;
27
+ private readonly entries;
28
+ private readonly listeners;
29
+ private unsubscribe;
30
+ private baselinePromise;
31
+ private reconcilePromise;
32
+ private pending;
33
+ private currentSnapshot;
34
+ private revision;
35
+ private diagnostics;
36
+ private listenerFailures;
37
+ private changed;
38
+ private removed;
39
+ private epoch;
40
+ private stale;
41
+ private staleGeneration;
42
+ private started;
43
+ private disposed;
44
+ constructor(source: CatalogSource, options?: CatalogSessionOptions);
45
+ start(): Promise<SessionResult>;
46
+ reconcile(): Promise<SessionResult>;
47
+ current(guid: string): RuntimeCatalogRow | undefined;
48
+ snapshot(): CatalogSessionSnapshot;
49
+ discontinuity(): AssetLoadError | undefined;
50
+ subscribe(listener: SessionListener): () => void;
51
+ dispose(): void;
52
+ private receive;
53
+ private fold;
54
+ private addDiagnostic;
55
+ private markStale;
56
+ private publish;
57
+ private disposedError;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=catalog-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-session.d.ts","sourceRoot":"","sources":["../../src/internal/catalog-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,cAAc,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,iBAAiB,EAAsB,MAAM,2BAA2B,CAAC;AAEvF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,KAAK,aAAa,GAAG,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC;AACpE,KAAK,eAAe,GAAG,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;AA6ClE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,qBAA0B;IAiBtE,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAqD/B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAsBnC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIpD,QAAQ,IAAI,sBAAsB;IAIlC,aAAa,IAAI,cAAc,GAAG,SAAS;IAc3C,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAKhD,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;IA6DZ,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,19 @@
1
+ import type { AssetDecoder, AssetDecoderInput, AssetDecoderLease, AssetKind, AssetLoadError, Result } from '@forgeax/engine-types';
2
+ export interface DecoderRegistryOptions {
3
+ readonly scopeId?: string;
4
+ }
5
+ export declare class DecoderRegistry {
6
+ private readonly dispatch;
7
+ private readonly scopeId;
8
+ private disposed;
9
+ constructor(options?: DecoderRegistryOptions);
10
+ install<P, K extends string>(kind: AssetKind<P, K>, decoder: AssetDecoder<P>): AssetDecoderLease;
11
+ private createLease;
12
+ has<P, K extends string>(kind: AssetKind<P, K>): boolean;
13
+ load<P, K extends string>(kind: AssetKind<P, K>, input: AssetDecoderInput<P>): Promise<Result<P, AssetLoadError>>;
14
+ loadByKind(kind: string, input: AssetDecoderInput<unknown>): Promise<Result<unknown, AssetLoadError>>;
15
+ decode<P, K extends string>(kind: AssetKind<P, K>, input: AssetDecoderInput<P>): Promise<Result<P, AssetLoadError>>;
16
+ private decodeEntry;
17
+ dispose(): void;
18
+ }
19
+ //# sourceMappingURL=decoder-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder-registry.d.ts","sourceRoot":"","sources":["../../src/internal/decoder-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,MAAM,EACP,MAAM,uBAAuB,CAAC;AAW/B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,sBAA2B;IAIhD,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,iBAAiB;IAuBhG,OAAO,CAAC,WAAW;IAenB,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO;IAIxD,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EACtB,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAIrC,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAgBrC,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAC9B,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAevB,WAAW;IAyBzB,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Decoder output becomes an owner fact at this boundary. Freeze the ordinary
3
+ * POD graph so a caller cannot mutate the cached payload between loads.
4
+ * Typed-array storage is deliberately left as an opaque byte/vector carrier:
5
+ * JavaScript cannot freeze a non-empty typed array without changing its public
6
+ * engine type, so owners must treat those carriers as read-only by contract.
7
+ */
8
+ export declare function freezeRuntimePayload<T>(value: T): T;
9
+ //# sourceMappingURL=immutable-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable-payload.d.ts","sourceRoot":"","sources":["../../src/internal/immutable-payload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAGnD"}
@@ -0,0 +1,31 @@
1
+ import type { Asset, AssetDecoder, AssetDecoderLease, AssetKind, AssetLoadError, BuiltinAssetKind, BuiltinAssetPayload, Result } from '@forgeax/engine-types';
2
+ import type { CatalogSource } from '../catalog-source.js';
3
+ import { type AssetGraphSnapshot } from './asset-graph.js';
4
+ import { type CatalogSessionOptions } from './catalog-session.js';
5
+ export interface AssetRegistryOptions extends CatalogSessionOptions {
6
+ readonly catalog: CatalogSource;
7
+ readonly fetcher?: typeof globalThis.fetch;
8
+ readonly maxConcurrentReads?: number;
9
+ }
10
+ export interface AssetLoadOptions {
11
+ readonly signal?: AbortSignal;
12
+ }
13
+ export type AssetRegistrySnapshot = AssetGraphSnapshot;
14
+ export type AssetRegistrySnapshotCounters = AssetRegistrySnapshot['counters'];
15
+ export interface AssetRegistry {
16
+ installDecoder<P, K extends string>(kind: AssetKind<P, K>, decoder: AssetDecoder<P>): AssetDecoderLease;
17
+ load<K extends BuiltinAssetKind>(guid: string, kind: K, options?: AssetLoadOptions): Promise<Result<BuiltinAssetPayload<K>, AssetLoadError>>;
18
+ load<P, K extends string>(guid: string, kind: AssetKind<P, K>, options?: AssetLoadOptions): Promise<Result<P, AssetLoadError>>;
19
+ snapshot(): AssetRegistrySnapshot;
20
+ subscribe(listener: (snapshot: AssetRegistrySnapshot) => void): () => void;
21
+ dispose(): void;
22
+ }
23
+ /** Internal render projection; the root Registry keeps only its five actions. */
24
+ export interface AssetRegistryResolver {
25
+ readonly epoch: number;
26
+ lookup<T extends Asset>(guid: string): T | undefined;
27
+ guidOf(asset: Asset): string | undefined;
28
+ }
29
+ export declare function getAssetRegistryResolver(registry: AssetRegistry): AssetRegistryResolver;
30
+ export declare function createAssetRegistry(options: AssetRegistryOptions): AssetRegistry;
31
+ //# sourceMappingURL=load-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.d.ts","sourceRoot":"","sources":["../../src/internal/load-asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EAEL,YAAY,EAEZ,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,MAAM,EACP,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMlF,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,MAAM,6BAA6B,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAChC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACvB,iBAAiB,CAAC;IACrB,IAAI,CAAC,CAAC,SAAS,gBAAgB,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACtC,QAAQ,IAAI,qBAAqB,CAAC;IAClC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1C;AAOD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAMvF;AA6CD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAqHhF"}
@@ -0,0 +1,18 @@
1
+ import type { AssetLoadError, AssetPublicationTuple, PackV2, Result } from '@forgeax/engine-types';
2
+ export interface PackReaderOptions {
3
+ readonly fetcher?: typeof globalThis.fetch;
4
+ }
5
+ export type VerifiedPack = PackV2<unknown>;
6
+ export declare class PackReader {
7
+ private readonly fetcher;
8
+ private readonly verified;
9
+ private readonly pending;
10
+ constructor(options?: PackReaderOptions);
11
+ read(packageUrl: string, expected: AssetPublicationTuple, signal: AbortSignal): Promise<Result<VerifiedPack, AssetLoadError>>;
12
+ private fetchAndVerify;
13
+ private key;
14
+ verify(value: unknown, expected: AssetPublicationTuple): Result<VerifiedPack, AssetLoadError>;
15
+ private validArtifact;
16
+ private cancelled;
17
+ }
18
+ //# sourceMappingURL=pack-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-reader.d.ts","sourceRoot":"","sources":["../../src/internal/pack-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,MAAM,EACP,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAC5C;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AA4B3C,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoE;gBAEhF,OAAO,GAAE,iBAAsB;IAOrC,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAelC,cAAc;IAmC5B,OAAO,CAAC,GAAG;IAIX,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;IA0C7F,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,SAAS;CAQlB"}
@@ -0,0 +1,7 @@
1
+ import type { CatalogEntry } from '@forgeax/engine-types';
2
+ import { type AssetLoadError, type Result } from '@forgeax/engine-types';
3
+ export interface RuntimeCatalogRow extends CatalogEntry {
4
+ readonly publication: NonNullable<CatalogEntry['publication']>;
5
+ }
6
+ export declare function validateRuntimeRow(row: CatalogEntry): Result<RuntimeCatalogRow, AssetLoadError>;
7
+ //# sourceMappingURL=validate-runtime-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-runtime-row.d.ts","sourceRoot":"","sources":["../../src/internal/validate-runtime-row.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,cAAc,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAElF,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;CAChE;AAWD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAkC/F"}
@@ -0,0 +1,2 @@
1
+ export { type AssetRegistryResolver, getAssetRegistryResolver, } from './internal/load-asset.js';
2
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAC1B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import '@forgeax/engine-types';
2
+
3
+ // src/internal/load-asset.ts
4
+ var REGISTRY_RESOLVER = /* @__PURE__ */ Symbol.for("forgeax.assets-runtime.registry-resolver");
5
+ function getAssetRegistryResolver(registry) {
6
+ const resolver = registry[REGISTRY_RESOLVER];
7
+ if (resolver === void 0) {
8
+ throw new TypeError("AssetRegistry resolver is not owned by this asset runtime");
9
+ }
10
+ return resolver;
11
+ }
12
+
13
+ export { getAssetRegistryResolver };
14
+ //# sourceMappingURL=internal.mjs.map
15
+ //# sourceMappingURL=internal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/load-asset.ts"],"names":[],"mappings":";;;AA+DA,IAAM,iBAAA,mBAAoB,MAAA,CAAO,GAAA,CAAI,0CAA0C,CAAA;AAKxE,SAAS,yBAAyB,QAAA,EAAgD;AACvF,EAAA,MAAM,QAAA,GAAY,SAAkC,iBAAiB,CAAA;AACrE,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAM,IAAI,UAAU,2DAA2D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,QAAA;AACT","file":"internal.mjs","sourcesContent":["import type {\n Asset,\n AssetArtifactReader,\n AssetDecoder,\n AssetDecoderInput,\n AssetDecoderLease,\n AssetKind,\n AssetLoadError,\n BuiltinAssetKind,\n BuiltinAssetPayload,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { ArtifactCache } from './artifact-cache.js';\nimport { AssetGraph, type AssetGraphSnapshot } from './asset-graph.js';\nimport { CatalogSession, type CatalogSessionOptions } from './catalog-session.js';\nimport { DecoderRegistry } from './decoder-registry.js';\nimport { freezeRuntimePayload } from './immutable-payload.js';\nimport { PackReader } from './pack-reader.js';\nimport { validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface AssetRegistryOptions extends CatalogSessionOptions {\n readonly catalog: CatalogSource;\n readonly fetcher?: typeof globalThis.fetch;\n readonly maxConcurrentReads?: number;\n}\n\nexport interface AssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport type AssetRegistrySnapshot = AssetGraphSnapshot;\n\nexport type AssetRegistrySnapshotCounters = AssetRegistrySnapshot['counters'];\n\nexport interface AssetRegistry {\n installDecoder<P, K extends string>(\n kind: AssetKind<P, K>,\n decoder: AssetDecoder<P>,\n ): AssetDecoderLease;\n load<K extends BuiltinAssetKind>(\n guid: string,\n kind: K,\n options?: AssetLoadOptions,\n ): Promise<Result<BuiltinAssetPayload<K>, AssetLoadError>>;\n load<P, K extends string>(\n guid: string,\n kind: AssetKind<P, K>,\n options?: AssetLoadOptions,\n ): Promise<Result<P, AssetLoadError>>;\n snapshot(): AssetRegistrySnapshot;\n subscribe(listener: (snapshot: AssetRegistrySnapshot) => void): () => void;\n dispose(): void;\n}\n\n/** Internal render projection; the root Registry keeps only its five actions. */\nexport interface AssetRegistryResolver {\n readonly epoch: number;\n lookup<T extends Asset>(guid: string): T | undefined;\n guidOf(asset: Asset): string | undefined;\n}\n\nconst REGISTRY_RESOLVER = Symbol.for('forgeax.assets-runtime.registry-resolver');\ntype RegistryWithResolver = AssetRegistry & {\n [REGISTRY_RESOLVER]?: AssetRegistryResolver;\n};\n\nexport function getAssetRegistryResolver(registry: AssetRegistry): AssetRegistryResolver {\n const resolver = (registry as RegistryWithResolver)[REGISTRY_RESOLVER];\n if (resolver === undefined) {\n throw new TypeError('AssetRegistry resolver is not owned by this asset runtime');\n }\n return resolver;\n}\n\nfunction missing(guid: string): AssetLoadError {\n return {\n code: 'asset-not-found',\n expected: `the current Catalog to contain GUID \"${guid}\"`,\n hint: 'inspect the producer Catalog and rebuild the missing publication',\n detail: { guid },\n };\n}\n\nfunction mismatch(guid: string, expectedKind: string, actualKind: string): AssetLoadError {\n return {\n code: 'asset-kind-mismatch',\n expected: `Catalog kind \"${actualKind}\" to match \"${expectedKind}\"`,\n hint: 'pass the Catalog kind or the matching custom AssetKind token',\n detail: { guid, expectedKind, actualKind },\n };\n}\n\nfunction artifactError(guid: string, reason: string): AssetLoadError {\n return {\n code: 'asset-integrity-failed',\n expected: 'the verified artifact byte length and digest',\n hint: 'verify the artifact digest and recook the Pack',\n detail: {\n guid,\n artifactKey: reason,\n expectedDigest: 'descriptor integrity',\n actualDigest: reason,\n },\n };\n}\n\nconst ASSET_GUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction invalidGuid(guid: string): AssetLoadError {\n return {\n code: 'asset-guid-invalid',\n expected: 'a 36-character dash-form asset GUID',\n hint: 'pass the producer GUID from the current Catalog row',\n detail: { guid },\n };\n}\n\nexport function createAssetRegistry(options: AssetRegistryOptions): AssetRegistry {\n const session = new CatalogSession(options.catalog, options);\n const reader = new PackReader(options.fetcher === undefined ? {} : { fetcher: options.fetcher });\n const cache = new ArtifactCache();\n const decoders = new DecoderRegistry(\n options.scopeId === undefined ? {} : { scopeId: options.scopeId },\n );\n const graph = new AssetGraph<{ readonly value: unknown; readonly refs: readonly string[] }>({\n ...(options.maxConcurrentReads === undefined\n ? {}\n : { maxConcurrentReads: options.maxConcurrentReads }),\n read: async (guid, signal) => {\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n const validated = validateRuntimeRow(row);\n if (!validated.ok) return validated;\n const publication = validated.value.publication;\n const tuple = {\n scopeId: session.snapshot().scopeId,\n generation: publication.generation,\n digest: publication.digest,\n outputSetDigest: publication.outputSetDigest,\n };\n const pack = await reader.read(row.packageUrl, tuple, signal);\n if (!pack.ok) return pack;\n const envelope = pack.value.assets.find(\n (asset) => asset.guid.toLowerCase() === guid.toLowerCase(),\n );\n if (envelope === undefined) return err(missing(guid));\n const artifacts: AssetArtifactReader = {\n read: (descriptor) => {\n const integrity = descriptor.integrity;\n if (integrity === undefined)\n return Promise.resolve(err(artifactError(guid, descriptor.path)));\n const key = `${tuple.scopeId}:${tuple.generation}:${tuple.outputSetDigest}:${integrity.digest}`;\n return cache.read(key, async () => {\n const url = resolveArtifactUrl(row.packageUrl, descriptor.path);\n let response: Response;\n try {\n response = await (options.fetcher ?? globalThis.fetch)(url, { signal });\n } catch {\n return err(artifactError(guid, descriptor.path));\n }\n if (!response.ok) return err(artifactError(guid, descriptor.path));\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (descriptor.byteLength === undefined || bytes.byteLength !== descriptor.byteLength) {\n return err(artifactError(guid, descriptor.path));\n }\n const actualDigest = await sha256(bytes);\n if (actualDigest !== descriptor.integrity?.digest.toLowerCase()) {\n return err(artifactError(guid, `${descriptor.path}:${actualDigest}`));\n }\n return ok(bytes);\n });\n },\n };\n const input: AssetDecoderInput<unknown> = { envelope, artifacts, signal };\n const decoded = await decoders.loadByKind(envelope.kind, input);\n if (!decoded.ok) return decoded;\n return ok({ value: freezeRuntimePayload(decoded.value), refs: envelope.refs });\n },\n });\n\n let catalogEpoch = session.snapshot().epoch;\n const unsubscribeCatalog = session.subscribe((snapshot) => {\n if (snapshot.epoch === catalogEpoch) return;\n catalogEpoch = snapshot.epoch;\n graph.invalidateForCatalogChange(\n snapshot.stale ? undefined : [...snapshot.changed, ...snapshot.removed],\n );\n });\n\n const registry: AssetRegistry = {\n installDecoder: (kind, decoder) => decoders.install(kind, decoder),\n load: (async (\n guid: string,\n kind: BuiltinAssetKind | AssetKind<unknown, string>,\n loadOptions: AssetLoadOptions = {},\n ): Promise<Result<unknown, AssetLoadError>> => {\n if (!ASSET_GUID_PATTERN.test(guid)) return err(invalidGuid(guid));\n const expectedKind = typeof kind === 'string' ? kind : kind.kind;\n const started = await session.start();\n if (!started.ok) return err(started.error);\n if (session.snapshot().stale) {\n const reconciled = await session.reconcile();\n if (!reconciled.ok) return err(reconciled.error);\n const discontinuity = session.discontinuity();\n if (discontinuity !== undefined) return err(discontinuity);\n }\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n if (row.kind !== expectedKind) return err(mismatch(guid, expectedKind, row.kind));\n const result = await graph.load(guid, loadOptions.signal);\n return result.ok ? ok(result.value.value) : result;\n }) as AssetRegistry['load'],\n snapshot: () => graph.snapshot(),\n subscribe: (listener) => graph.subscribe(listener),\n dispose: () => {\n graph.dispose();\n unsubscribeCatalog();\n decoders.dispose();\n cache.clear();\n session.dispose();\n },\n };\n const resolver: AssetRegistryResolver = {\n get epoch() {\n return graph.snapshot().epoch;\n },\n lookup: <T extends Asset>(guid: string) => graph.lookup(guid) as T | undefined,\n guidOf: (asset: Asset) => graph.guidOf(asset),\n };\n Object.defineProperty(registry, REGISTRY_RESOLVER, {\n value: resolver,\n enumerable: false,\n });\n return registry;\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes as unknown as BufferSource);\n return `sha256:${Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('')}`;\n}\n\nfunction resolveArtifactUrl(packageUrl: string, path: string): string {\n const separator = packageUrl.lastIndexOf('/');\n const packageDirectory = separator < 0 ? '' : packageUrl.slice(0, separator + 1);\n try {\n return new URL(path, packageDirectory).toString();\n } catch {\n return `${packageDirectory}${path.replace(/^\\//, '')}`;\n }\n}\n"]}