@ariestools/aries-dapp-core 0.1.15 → 0.1.17

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 (44) hide show
  1. package/dist/bin/dappServer.mjs +77 -290
  2. package/dist/node/DappActor.d.ts +27 -23
  3. package/dist/node/DappActor.d.ts.map +1 -1
  4. package/dist/node/actor/types.d.ts +14 -28
  5. package/dist/node/actor/types.d.ts.map +1 -1
  6. package/dist/node/bin/loadReducer.d.ts +3 -1
  7. package/dist/node/bin/loadReducer.d.ts.map +1 -1
  8. package/dist/node/boot/bootDappActors.d.ts +4 -3
  9. package/dist/node/boot/bootDappActors.d.ts.map +1 -1
  10. package/dist/node/consumer.mjs.map +2 -2
  11. package/dist/node/index.d.ts +1 -2
  12. package/dist/node/index.d.ts.map +1 -1
  13. package/dist/node/index.mjs +51 -264
  14. package/dist/node/index.mjs.map +4 -4
  15. package/dist/node/providers/DappBucketStore.d.ts +3 -1
  16. package/dist/node/providers/DappBucketStore.d.ts.map +1 -1
  17. package/dist/node/providers/capabilities.d.ts +3 -1
  18. package/dist/node/providers/capabilities.d.ts.map +1 -1
  19. package/dist/node/providers/hashBytes.d.ts +3 -1
  20. package/dist/node/providers/hashBytes.d.ts.map +1 -1
  21. package/dist/node/providers/joinKey.d.ts +6 -2
  22. package/dist/node/providers/joinKey.d.ts.map +1 -1
  23. package/dist/node/providers/types.d.ts +21 -7
  24. package/dist/node/providers/types.d.ts.map +1 -1
  25. package/dist/node/publication/constants.d.ts +24 -8
  26. package/dist/node/publication/constants.d.ts.map +1 -1
  27. package/dist/node/publication/gc.d.ts +6 -2
  28. package/dist/node/publication/gc.d.ts.map +1 -1
  29. package/dist/node/publication/incremental.d.ts +9 -3
  30. package/dist/node/publication/incremental.d.ts.map +1 -1
  31. package/dist/node/publication/releases.d.ts +12 -4
  32. package/dist/node/publication/releases.d.ts.map +1 -1
  33. package/dist/node/publication/status.d.ts +3 -1
  34. package/dist/node/publication/status.d.ts.map +1 -1
  35. package/dist/node/publication/statusPatch.d.ts +9 -3
  36. package/dist/node/publication/statusPatch.d.ts.map +1 -1
  37. package/dist/node/publication/types.d.ts +42 -14
  38. package/dist/node/publication/types.d.ts.map +1 -1
  39. package/dist/node/reducer/DappReducer.d.ts +9 -3
  40. package/dist/node/reducer/DappReducer.d.ts.map +1 -1
  41. package/examples/countFactsReducer.mjs +3 -1
  42. package/package.json +17 -9
  43. package/dist/node/actor/AbstractActor.d.ts +0 -53
  44. package/dist/node/actor/AbstractActor.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bootDappActors.d.ts","sourceRoot":"","sources":["../../../src/boot/bootDappActors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAiCtB"}
1
+ {"version":3,"file":"bootDappActors.d.ts","sourceRoot":"","sources":["../../../src/boot/bootDappActors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAkBtB"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/publication/canonicalHead.ts", "../../src/publication/constants.ts", "../../src/publication/shard.ts", "../../src/consumer/hash.ts", "../../src/consumer/parse.ts", "../../src/consumer/api.ts"],
4
- "sourcesContent": ["import type { HeadManifest } from './types.ts'\n\n/**\n * Canonical UTF-8 JSON bytes for head signing/verification. Excludes\n * `signature` and uses a fixed field order so Node and browser agree.\n */\nexport function canonicalHeadBytes(head: HeadManifest): Uint8Array {\n const payload: Record<string, unknown> = {\n schema: head.schema,\n generation: head.generation,\n manifestKey: head.manifestKey,\n manifestHash: head.manifestHash,\n publishedAt: head.publishedAt,\n }\n if (head.previousGeneration !== undefined) {\n payload.previousGeneration = head.previousGeneration\n }\n if (head.revision !== undefined) payload.revision = head.revision\n if (head.trust !== undefined) payload.trust = head.trust\n if (head.layout !== undefined) payload.layout = head.layout\n // Stable key order via explicit construction above (not Object key enum order).\n const ordered: Record<string, unknown> = {}\n for (const key of [\n 'schema',\n 'generation',\n 'manifestKey',\n 'manifestHash',\n 'publishedAt',\n 'previousGeneration',\n 'revision',\n 'trust',\n 'layout',\n ]) {\n if (key in payload) ordered[key] = payload[key]\n }\n return new TextEncoder().encode(`${JSON.stringify(ordered)}\\n`)\n}\n", "/** Well-known relative keys published by the coherent generation protocol. */\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/** Content-addressed object bodies (incremental layout). */\nexport const CAS_PREFIX = 'cas/sha256'\n/** Sharded logical map roots (incremental layout). */\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/** Sharded logical map shards (incremental layout). */\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/** Small generation receipts for incremental layout. */\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/** CDN caching: immutable generation objects and manifests. */\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/** CDN caching: mutable head and status objects that must revalidate. */\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/** Default shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards. */\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import { DEFAULT_SHARD_HEX_CHARS } from './constants.ts'\n\n/**\n * Shard routing id for a logical key. FNV-1a 32-bit, hex-padded \u2014 used only to\n * partition the logical map (not for content integrity). Must match between\n * writer and browser consumer (no crypto required).\n */\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n let h = 0x81_1C_9D_C5\n for (let i = 0; i < logicalKey.length; i++) {\n h ^= logicalKey.codePointAt(i)!\n h = Math.imul(h, 0x01_00_01_93)\n }\n return (h >>> 0).toString(16).padStart(8, '0').slice(0, hexChars)\n}\n", "/**\n * Browser-neutral SHA-256 via Web Crypto (`crypto.subtle`).\n * Available in modern browsers and Node \u226518 without Node crypto modules.\n */\n\nfunction bytesOf(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = ''\n for (const b of bytes) out += b.toString(16).padStart(2, '0')\n return out\n}\n\nfunction requireSubtle(): SubtleCrypto {\n const subtle = globalThis.crypto?.subtle\n if (subtle === undefined) {\n throw new Error('Web Crypto subtle API is required for consumer hashing')\n }\n return subtle\n}\n\nexport async function hashBytesAsync(body: string | Uint8Array): Promise<string> {\n const data = bytesOf(body)\n const digest = await requireSubtle().digest(\n 'SHA-256',\n data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer,\n )\n return toHex(new Uint8Array(digest))\n}\n", "import {\n GENERATION_MANIFEST_SCHEMA,\n HEAD_MANIFEST_SCHEMA,\n INDEXER_STATUS_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_SHARD_SCHEMA,\n} from '../publication/constants.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${label}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key]\n if (typeof v !== 'string' || v.length === 0) {\n throw new Error(`Invalid ${label}: missing string \"${key}\"`)\n }\n return v\n}\n\nexport function parseHead(json: unknown): HeadManifest {\n const obj = asRecord(json, 'head')\n if (obj.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(obj.schema)}`)\n }\n return {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: requireString(obj, 'generation', 'head'),\n manifestKey: requireString(obj, 'manifestKey', 'head'),\n manifestHash: requireString(obj, 'manifestHash', 'head'),\n publishedAt: requireString(obj, 'publishedAt', 'head'),\n ...(typeof obj.previousGeneration === 'string'\n && { previousGeneration: obj.previousGeneration }),\n ...(typeof obj.revision === 'number' && { revision: obj.revision }),\n ...(obj.trust === 'trusted-origin' || obj.trust === 'signed'\n ? { trust: obj.trust }\n : {}),\n ...(typeof obj.signature === 'string' && { signature: obj.signature }),\n ...(obj.layout === 'full' || obj.layout === 'incremental-cas'\n ? { layout: obj.layout }\n : {}),\n }\n}\n\nexport function parseGenerationManifest(json: unknown): GenerationManifest {\n const obj = asRecord(json, 'manifest')\n if (obj.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(obj.schema)}`)\n }\n if (!Array.isArray(obj.objects)) {\n throw new TypeError('Invalid generation manifest: objects must be an array')\n }\n return obj as unknown as GenerationManifest\n}\n\nexport function parseIndexerStatus(json: unknown): IndexerStatus {\n const obj = asRecord(json, 'status')\n if (obj.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid status schema: ${String(obj.schema)}`)\n }\n return obj as unknown as IndexerStatus\n}\n\nexport function parseMapRoot(json: unknown): {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n} {\n const obj = asRecord(json, 'map root')\n if (obj.schema !== MAP_ROOT_SCHEMA) {\n throw new Error(`Invalid map root schema: ${String(obj.schema)}`)\n }\n if (obj.shards === null || typeof obj.shards !== 'object') {\n throw new Error('Invalid map root: shards must be an object')\n }\n return obj as {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n }\n}\n\nexport function parseMapShard(json: unknown): {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n} {\n const obj = asRecord(json, 'map shard')\n if (obj.schema !== MAP_SHARD_SCHEMA) {\n throw new Error(`Invalid map shard schema: ${String(obj.schema)}`)\n }\n return obj as {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n }\n}\n", "import { canonicalHeadBytes } from '../publication/canonicalHead.ts'\nimport {\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_SHARDS_PREFIX,\n STATUS_KEY,\n} from '../publication/constants.ts'\nimport { shardIdForKey as routeShard } from '../publication/shard.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\nimport { hashBytesAsync } from './hash.ts'\nimport {\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n} from './parse.ts'\n\nexport type FetchLike = (input: string, init?: { method?: string }) => Promise<{\n ok: boolean\n status: number\n arrayBuffer(): Promise<ArrayBuffer>\n json(): Promise<unknown>\n text(): Promise<string>\n}>\n\nexport interface PublicBases {\n index?: string\n state: string\n}\n\nexport interface VerifyPublishedViewResult {\n head: HeadManifest\n layout: 'full' | 'incremental-cas'\n manifest?: GenerationManifest\n rootShards?: Record<string, string>\n source?: GenerationManifest['source']\n status?: IndexerStatus\n}\n\nexport interface ResolveObjectResult {\n body: Uint8Array\n contentType?: string\n hash: string\n logicalKey: string\n publicUrl: string\n}\n\nfunction joinUrl(base: string, key: string): string {\n const b = base.replace(/\\/+$/, '')\n const k = key.replace(/^\\/+/, '')\n return `${b}/${k}`\n}\n\nasync function fetchJson(fetchImpl: FetchLike, url: string): Promise<unknown> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return await res.json()\n}\n\nasync function fetchBytes(fetchImpl: FetchLike, url: string): Promise<Uint8Array> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return new Uint8Array(await res.arrayBuffer())\n}\n\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n return routeShard(logicalKey, hexChars)\n}\n\nexport {\n hashBytesAsync,\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n}\n\nasync function loadFullManifest(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<GenerationManifest> {\n const manifestUrl = joinUrl(bases.state, head.manifestKey)\n const manifestBytes = await fetchBytes(fetchImpl, manifestUrl)\n const actual = await hashBytesAsync(manifestBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n const manifest = parseGenerationManifest(JSON.parse(new TextDecoder().decode(manifestBytes)))\n if (manifest.generation !== head.generation) {\n throw new Error('Manifest generation does not match head')\n }\n return manifest\n}\n\nasync function loadRootShards(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<Record<string, string>> {\n const rootUrl = joinUrl(bases.state, head.manifestKey)\n const rootBytes = await fetchBytes(fetchImpl, rootUrl)\n const actual = await hashBytesAsync(rootBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n return parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes))).shards\n}\n\n/**\n * Fetch head (+ optional status), verify manifest/root integrity, optional\n * signature check. Does not download the full object set.\n */\nexport async function verifyPublishedView(options: {\n bases: PublicBases\n fetch: FetchLike\n includeStatus?: boolean\n verifySignature?: (canonical: Uint8Array, signature: string) => boolean | Promise<boolean>\n}): Promise<VerifyPublishedViewResult> {\n const headUrl = joinUrl(options.bases.state, HEAD_KEY)\n const head = parseHead(await fetchJson(options.fetch, headUrl))\n if (head.trust === 'signed') {\n if (options.verifySignature === undefined) {\n throw new Error('Signed head requires verifySignature callback')\n }\n if (head.signature === undefined) throw new Error('Signed head missing signature')\n const ok = await options.verifySignature(canonicalHeadBytes(head), head.signature)\n if (!ok) throw new Error('Head signature verification failed')\n }\n\n const layout = head.layout === 'incremental-cas' ? 'incremental-cas' : 'full'\n let manifest: GenerationManifest | undefined\n let rootShards: Record<string, string> | undefined\n let source: GenerationManifest['source'] | undefined\n\n if (layout === 'full') {\n manifest = await loadFullManifest(options.fetch, options.bases, head)\n source = manifest.source\n } else {\n rootShards = await loadRootShards(options.fetch, options.bases, head)\n }\n\n let status: IndexerStatus | undefined\n if (options.includeStatus === true) {\n try {\n status = parseIndexerStatus(\n await fetchJson(options.fetch, joinUrl(options.bases.state, STATUS_KEY)),\n )\n } catch {\n // status optional\n }\n }\n\n return {\n head,\n layout,\n ...(manifest !== undefined && { manifest }),\n ...(rootShards !== undefined && { rootShards }),\n ...(source !== undefined && { source }),\n ...(status !== undefined && { status }),\n }\n}\n\nasync function resolveIncrementalObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head: HeadManifest\n logicalKey: string\n role: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const base = options.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const rootBytes = await fetchBytes(\n options.fetch,\n joinUrl(options.bases.state, options.head.manifestKey),\n )\n if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {\n throw new Error('Map root hash mismatch')\n }\n const root = parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes)))\n const sid = shardIdForKey(options.logicalKey, options.shardHexChars)\n const shardHash = root.shards[sid]\n if (shardHash === undefined) throw new Error(`No shard for key \"${options.logicalKey}\"`)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey))\n if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error('Shard hash mismatch')\n const shard = parseMapShard(JSON.parse(new TextDecoder().decode(shardBytes)))\n const entry = shard.entries[options.logicalKey]\n if (entry === undefined) throw new Error(`Key not found: ${options.logicalKey}`)\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n const publicUrl = joinUrl(base, casKey)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== entry.hash) {\n throw new Error(`Object hash mismatch for ${options.logicalKey}`)\n }\n return {\n body,\n hash: entry.hash,\n logicalKey: options.logicalKey,\n publicUrl,\n ...(entry.contentType !== undefined && { contentType: entry.contentType }),\n }\n}\n\n/**\n * Resolve and verify a single logical object under the current head without\n * downloading a full-generation object list (incremental: root+shard+cas).\n */\nexport async function resolveObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head?: HeadManifest\n logicalKey: string\n role?: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const role = options.role ?? 'index'\n const head = options.head\n ?? parseHead(await fetchJson(options.fetch, joinUrl(options.bases.state, HEAD_KEY)))\n const logicalKey = options.logicalKey.replaceAll(/^\\/+/g, '')\n\n if (head.layout === 'incremental-cas') {\n return await resolveIncrementalObject({\n bases: options.bases,\n fetch: options.fetch,\n head,\n logicalKey,\n role,\n ...(options.shardHexChars !== undefined && { shardHexChars: options.shardHexChars }),\n })\n }\n\n const manifest = await loadFullManifest(options.fetch, options.bases, head)\n const ref = manifest.objects.find(o =>\n o.role === role && (o.key === logicalKey || o.key.endsWith(`/${logicalKey}`)\n || o.key === `${GENERATIONS_PREFIX}/${head.generation}/${logicalKey}`))\n if (ref === undefined) throw new Error(`Key not found in full manifest: ${logicalKey}`)\n const objectBase = ref.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const publicUrl = ref.publicUrl ?? joinUrl(objectBase, ref.key)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== ref.hash) {\n throw new Error(`Object hash mismatch for ${logicalKey}`)\n }\n return {\n body,\n hash: ref.hash,\n logicalKey,\n publicUrl,\n ...(ref.contentType !== undefined && { contentType: ref.contentType }),\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { HeadManifest } from './types.ts'\n\n/**\n * Canonical UTF-8 JSON bytes for head signing/verification. Excludes\n * `signature` and uses a fixed field order so Node and browser agree.\n */\nexport function canonicalHeadBytes(head: HeadManifest): Uint8Array {\n const payload: Record<string, unknown> = {\n schema: head.schema,\n generation: head.generation,\n manifestKey: head.manifestKey,\n manifestHash: head.manifestHash,\n publishedAt: head.publishedAt,\n }\n if (head.previousGeneration !== undefined) {\n payload.previousGeneration = head.previousGeneration\n }\n if (head.revision !== undefined) payload.revision = head.revision\n if (head.trust !== undefined) payload.trust = head.trust\n if (head.layout !== undefined) payload.layout = head.layout\n // Stable key order via explicit construction above (not Object key enum order).\n const ordered: Record<string, unknown> = {}\n for (const key of [\n 'schema',\n 'generation',\n 'manifestKey',\n 'manifestHash',\n 'publishedAt',\n 'previousGeneration',\n 'revision',\n 'trust',\n 'layout',\n ]) {\n if (key in payload) ordered[key] = payload[key]\n }\n return new TextEncoder().encode(`${JSON.stringify(ordered)}\\n`)\n}\n", "/**\nWell-known relative keys published by the coherent generation protocol.\n*/\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/**\nContent-addressed object bodies (incremental layout).\n*/\nexport const CAS_PREFIX = 'cas/sha256'\n/**\nSharded logical map roots (incremental layout).\n*/\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/**\nSharded logical map shards (incremental layout).\n*/\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/**\nSmall generation receipts for incremental layout.\n*/\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/**\nCDN caching: immutable generation objects and manifests.\n*/\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/**\nCDN caching: mutable head and status objects that must revalidate.\n*/\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/**\nDefault shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards.\n*/\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import { DEFAULT_SHARD_HEX_CHARS } from './constants.ts'\n\n/**\n * Shard routing id for a logical key. FNV-1a 32-bit, hex-padded \u2014 used only to\n * partition the logical map (not for content integrity). Must match between\n * writer and browser consumer (no crypto required).\n */\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n let h = 0x81_1C_9D_C5\n for (let i = 0; i < logicalKey.length; i++) {\n h ^= logicalKey.codePointAt(i)!\n h = Math.imul(h, 0x01_00_01_93)\n }\n return (h >>> 0).toString(16).padStart(8, '0').slice(0, hexChars)\n}\n", "/**\n * Browser-neutral SHA-256 via Web Crypto (`crypto.subtle`).\n * Available in modern browsers and Node \u226518 without Node crypto modules.\n */\n\nfunction bytesOf(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = ''\n for (const b of bytes) out += b.toString(16).padStart(2, '0')\n return out\n}\n\nfunction requireSubtle(): SubtleCrypto {\n const subtle = globalThis.crypto?.subtle\n if (subtle === undefined) {\n throw new Error('Web Crypto subtle API is required for consumer hashing')\n }\n return subtle\n}\n\nexport async function hashBytesAsync(body: string | Uint8Array): Promise<string> {\n const data = bytesOf(body)\n const digest = await requireSubtle().digest(\n 'SHA-256',\n data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer,\n )\n return toHex(new Uint8Array(digest))\n}\n", "import {\n GENERATION_MANIFEST_SCHEMA,\n HEAD_MANIFEST_SCHEMA,\n INDEXER_STATUS_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_SHARD_SCHEMA,\n} from '../publication/constants.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${label}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key]\n if (typeof v !== 'string' || v.length === 0) {\n throw new Error(`Invalid ${label}: missing string \"${key}\"`)\n }\n return v\n}\n\nexport function parseHead(json: unknown): HeadManifest {\n const obj = asRecord(json, 'head')\n if (obj.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(obj.schema)}`)\n }\n return {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: requireString(obj, 'generation', 'head'),\n manifestKey: requireString(obj, 'manifestKey', 'head'),\n manifestHash: requireString(obj, 'manifestHash', 'head'),\n publishedAt: requireString(obj, 'publishedAt', 'head'),\n ...(typeof obj.previousGeneration === 'string'\n && { previousGeneration: obj.previousGeneration }),\n ...(typeof obj.revision === 'number' && { revision: obj.revision }),\n ...(obj.trust === 'trusted-origin' || obj.trust === 'signed'\n ? { trust: obj.trust }\n : {}),\n ...(typeof obj.signature === 'string' && { signature: obj.signature }),\n ...(obj.layout === 'full' || obj.layout === 'incremental-cas'\n ? { layout: obj.layout }\n : {}),\n }\n}\n\nexport function parseGenerationManifest(json: unknown): GenerationManifest {\n const obj = asRecord(json, 'manifest')\n if (obj.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(obj.schema)}`)\n }\n if (!Array.isArray(obj.objects)) {\n throw new TypeError('Invalid generation manifest: objects must be an array')\n }\n return obj as unknown as GenerationManifest\n}\n\nexport function parseIndexerStatus(json: unknown): IndexerStatus {\n const obj = asRecord(json, 'status')\n if (obj.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid status schema: ${String(obj.schema)}`)\n }\n return obj as unknown as IndexerStatus\n}\n\nexport function parseMapRoot(json: unknown): {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n} {\n const obj = asRecord(json, 'map root')\n if (obj.schema !== MAP_ROOT_SCHEMA) {\n throw new Error(`Invalid map root schema: ${String(obj.schema)}`)\n }\n if (obj.shards === null || typeof obj.shards !== 'object') {\n throw new Error('Invalid map root: shards must be an object')\n }\n return obj as {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n }\n}\n\nexport function parseMapShard(json: unknown): {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n} {\n const obj = asRecord(json, 'map shard')\n if (obj.schema !== MAP_SHARD_SCHEMA) {\n throw new Error(`Invalid map shard schema: ${String(obj.schema)}`)\n }\n return obj as {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n }\n}\n", "import { canonicalHeadBytes } from '../publication/canonicalHead.ts'\nimport {\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_SHARDS_PREFIX,\n STATUS_KEY,\n} from '../publication/constants.ts'\nimport { shardIdForKey as routeShard } from '../publication/shard.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\nimport { hashBytesAsync } from './hash.ts'\nimport {\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n} from './parse.ts'\n\nexport type FetchLike = (input: string, init?: { method?: string }) => Promise<{\n ok: boolean\n status: number\n arrayBuffer(): Promise<ArrayBuffer>\n json(): Promise<unknown>\n text(): Promise<string>\n}>\n\nexport interface PublicBases {\n index?: string\n state: string\n}\n\nexport interface VerifyPublishedViewResult {\n head: HeadManifest\n layout: 'full' | 'incremental-cas'\n manifest?: GenerationManifest\n rootShards?: Record<string, string>\n source?: GenerationManifest['source']\n status?: IndexerStatus\n}\n\nexport interface ResolveObjectResult {\n body: Uint8Array\n contentType?: string\n hash: string\n logicalKey: string\n publicUrl: string\n}\n\nfunction joinUrl(base: string, key: string): string {\n const b = base.replace(/\\/+$/, '')\n const k = key.replace(/^\\/+/, '')\n return `${b}/${k}`\n}\n\nasync function fetchJson(fetchImpl: FetchLike, url: string): Promise<unknown> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return await res.json()\n}\n\nasync function fetchBytes(fetchImpl: FetchLike, url: string): Promise<Uint8Array> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return new Uint8Array(await res.arrayBuffer())\n}\n\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n return routeShard(logicalKey, hexChars)\n}\n\nexport {\n hashBytesAsync,\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n}\n\nasync function loadFullManifest(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<GenerationManifest> {\n const manifestUrl = joinUrl(bases.state, head.manifestKey)\n const manifestBytes = await fetchBytes(fetchImpl, manifestUrl)\n const actual = await hashBytesAsync(manifestBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n const manifest = parseGenerationManifest(JSON.parse(new TextDecoder().decode(manifestBytes)))\n if (manifest.generation !== head.generation) {\n throw new Error('Manifest generation does not match head')\n }\n return manifest\n}\n\nasync function loadRootShards(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<Record<string, string>> {\n const rootUrl = joinUrl(bases.state, head.manifestKey)\n const rootBytes = await fetchBytes(fetchImpl, rootUrl)\n const actual = await hashBytesAsync(rootBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n return parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes))).shards\n}\n\n/**\n * Fetch head (+ optional status), verify manifest/root integrity, optional\n * signature check. Does not download the full object set.\n */\nexport async function verifyPublishedView(options: {\n bases: PublicBases\n fetch: FetchLike\n includeStatus?: boolean\n verifySignature?: (canonical: Uint8Array, signature: string) => boolean | Promise<boolean>\n}): Promise<VerifyPublishedViewResult> {\n const headUrl = joinUrl(options.bases.state, HEAD_KEY)\n const head = parseHead(await fetchJson(options.fetch, headUrl))\n if (head.trust === 'signed') {\n if (options.verifySignature === undefined) {\n throw new Error('Signed head requires verifySignature callback')\n }\n if (head.signature === undefined) throw new Error('Signed head missing signature')\n const ok = await options.verifySignature(canonicalHeadBytes(head), head.signature)\n if (!ok) throw new Error('Head signature verification failed')\n }\n\n const layout = head.layout === 'incremental-cas' ? 'incremental-cas' : 'full'\n let manifest: GenerationManifest | undefined\n let rootShards: Record<string, string> | undefined\n let source: GenerationManifest['source'] | undefined\n\n if (layout === 'full') {\n manifest = await loadFullManifest(options.fetch, options.bases, head)\n source = manifest.source\n } else {\n rootShards = await loadRootShards(options.fetch, options.bases, head)\n }\n\n let status: IndexerStatus | undefined\n if (options.includeStatus === true) {\n try {\n status = parseIndexerStatus(\n await fetchJson(options.fetch, joinUrl(options.bases.state, STATUS_KEY)),\n )\n } catch {\n // status optional\n }\n }\n\n return {\n head,\n layout,\n ...(manifest !== undefined && { manifest }),\n ...(rootShards !== undefined && { rootShards }),\n ...(source !== undefined && { source }),\n ...(status !== undefined && { status }),\n }\n}\n\nasync function resolveIncrementalObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head: HeadManifest\n logicalKey: string\n role: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const base = options.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const rootBytes = await fetchBytes(\n options.fetch,\n joinUrl(options.bases.state, options.head.manifestKey),\n )\n if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {\n throw new Error('Map root hash mismatch')\n }\n const root = parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes)))\n const sid = shardIdForKey(options.logicalKey, options.shardHexChars)\n const shardHash = root.shards[sid]\n if (shardHash === undefined) throw new Error(`No shard for key \"${options.logicalKey}\"`)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey))\n if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error('Shard hash mismatch')\n const shard = parseMapShard(JSON.parse(new TextDecoder().decode(shardBytes)))\n const entry = shard.entries[options.logicalKey]\n if (entry === undefined) throw new Error(`Key not found: ${options.logicalKey}`)\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n const publicUrl = joinUrl(base, casKey)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== entry.hash) {\n throw new Error(`Object hash mismatch for ${options.logicalKey}`)\n }\n return {\n body,\n hash: entry.hash,\n logicalKey: options.logicalKey,\n publicUrl,\n ...(entry.contentType !== undefined && { contentType: entry.contentType }),\n }\n}\n\n/**\n * Resolve and verify a single logical object under the current head without\n * downloading a full-generation object list (incremental: root+shard+cas).\n */\nexport async function resolveObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head?: HeadManifest\n logicalKey: string\n role?: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const role = options.role ?? 'index'\n const head = options.head\n ?? parseHead(await fetchJson(options.fetch, joinUrl(options.bases.state, HEAD_KEY)))\n const logicalKey = options.logicalKey.replaceAll(/^\\/+/g, '')\n\n if (head.layout === 'incremental-cas') {\n return await resolveIncrementalObject({\n bases: options.bases,\n fetch: options.fetch,\n head,\n logicalKey,\n role,\n ...(options.shardHexChars !== undefined && { shardHexChars: options.shardHexChars }),\n })\n }\n\n const manifest = await loadFullManifest(options.fetch, options.bases, head)\n const ref = manifest.objects.find(o =>\n o.role === role && (o.key === logicalKey || o.key.endsWith(`/${logicalKey}`)\n || o.key === `${GENERATIONS_PREFIX}/${head.generation}/${logicalKey}`))\n if (ref === undefined) throw new Error(`Key not found in full manifest: ${logicalKey}`)\n const objectBase = ref.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const publicUrl = ref.publicUrl ?? joinUrl(objectBase, ref.key)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== ref.hash) {\n throw new Error(`Object hash mismatch for ${logicalKey}`)\n }\n return {\n body,\n hash: ref.hash,\n logicalKey,\n publicUrl,\n ...(ref.contentType !== undefined && { contentType: ref.contentType }),\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["shardIdForKey", "shardIdForKey"]
7
7
  }
@@ -1,5 +1,4 @@
1
- export { AbstractActor } from './actor/AbstractActor.ts';
2
- export type { ActorParams, DappContext, DappMoniker, DappProviderLocator, ReadyState, } from './actor/types.ts';
1
+ export type { DappContext, DappMoniker, DappProviderLocator, } from './actor/types.ts';
3
2
  export type { DappActorSpec } from './boot/bootDappActors.ts';
4
3
  export { bootDappActors } from './boot/bootDappActors.ts';
5
4
  export type { DappActorParams } from './DappActor.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -11,163 +11,12 @@ var __decorateClass = (decorators, target, key, kind) => {
11
11
  };
12
12
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
13
13
 
14
- // src/actor/AbstractActor.ts
15
- import {
16
- AbstractCreatable,
17
- assertEx,
18
- IdLogger
19
- } from "@ariestools/sdk";
20
- function createDeferred() {
21
- let resolve;
22
- let reject;
23
- const promise = new Promise((res, rej) => {
24
- resolve = res;
25
- reject = rej;
26
- });
27
- void promise.catch(() => {
28
- });
29
- return {
30
- promise,
31
- reject,
32
- resolve
33
- };
34
- }
35
- var AbstractActor = class extends AbstractCreatable {
36
- _intervals = /* @__PURE__ */ new Map();
37
- _timeouts = /* @__PURE__ */ new Map();
38
- _abortController = new AbortController();
39
- _idLogger;
40
- _inFlight = /* @__PURE__ */ new Map();
41
- _readyDeferred = createDeferred();
42
- _readyError;
43
- _readyState = "pending";
44
- get logger() {
45
- this._idLogger ??= new IdLogger(
46
- assertEx(this.context.logger, () => `Logger is required in context for actor ${this.name}.`),
47
- () => this.name
48
- );
49
- return this._idLogger;
50
- }
51
- get readyError() {
52
- return this._readyError;
53
- }
54
- get readyState() {
55
- return this._readyState;
56
- }
57
- get context() {
58
- return this.locator.context;
59
- }
60
- get locator() {
61
- return this.params.locator;
62
- }
63
- /** Abort signal cancelled when the actor stops (or is replaced on restart). */
64
- get signal() {
65
- return this._abortController.signal;
66
- }
67
- static async paramsHandler(params) {
68
- const inParams = params ?? {};
69
- const baseParams = await super.paramsHandler({ ...inParams, name: inParams.name ?? "UnknownActor" });
70
- const locator = assertEx(inParams.locator, () => `params.locator is required for actor ${String(baseParams.name)}.`);
71
- return { ...baseParams, locator };
72
- }
73
- /** Override to prove the actor can do useful work. Default: no-op. */
74
- async readyHandler() {
75
- }
76
- /**
77
- * Register a recurring task. The first invocation fires after `dueTimeMs`
78
- * (the documented first-run delay); subsequent invocations fire every
79
- * `periodMs` while the actor is `started`. A run is skipped if the previous
80
- * one is still in flight, so a slow pass can never stack on top of itself.
81
- * Must be called from `startHandler` (guards on `starting` status).
82
- */
83
- registerTimer(timerName, callback, dueTimeMs, periodMs) {
84
- if (this.status !== "starting") {
85
- this.logger.warn(`Cannot register timer '${timerName}' because actor is not starting.`);
86
- return;
87
- }
88
- const tick = () => {
89
- if (this.status !== "started") return;
90
- if (this._inFlight.has(timerName)) {
91
- this.logger.warn(`Skipping timer '${this.name}:${timerName}' because the previous run is still in flight.`);
92
- return;
93
- }
94
- const run = (async () => {
95
- const startTime = Date.now();
96
- try {
97
- await callback();
98
- } catch (error) {
99
- const err = error instanceof Error ? error : new Error(String(error));
100
- this.logger.error(`Error in timer '${this.name}:${timerName}': ${err.message}`);
101
- } finally {
102
- const duration = Date.now() - startTime;
103
- if (duration > periodMs) {
104
- this.logger.warn(`Timer '${this.name}:${timerName}' took ${duration}ms, longer than its ${periodMs}ms period.`);
105
- }
106
- }
107
- })();
108
- this._inFlight.set(timerName, run.finally(() => {
109
- this._inFlight.delete(timerName);
110
- }));
111
- };
112
- const timeoutId = setTimeout(() => {
113
- if (this.status !== "started") return;
114
- this._intervals.set(timerName, setInterval(tick, periodMs));
115
- tick();
116
- }, dueTimeMs);
117
- this._timeouts.set(timerName, timeoutId);
118
- }
119
- /**
120
- * Run the warm-pass once. The standard boot path invokes this after
121
- * `start()` so readiness either resolves or rejects.
122
- */
123
- async runReadyHandler() {
124
- if (this._readyState !== "pending") return;
125
- try {
126
- await this.readyHandler();
127
- this._readyState = "ready";
128
- this._readyDeferred.resolve();
129
- } catch (error) {
130
- const err = error instanceof Error ? error : new Error(String(error));
131
- this._readyState = "failed";
132
- this._readyError = err;
133
- this._readyDeferred.reject(err);
134
- throw err;
135
- }
136
- }
137
- async startHandler() {
138
- if (this._abortController.signal.aborted) {
139
- this._abortController = new AbortController();
140
- }
141
- await super.startHandler();
142
- }
143
- async stopHandler() {
144
- await super.stopHandler();
145
- this._abortController.abort();
146
- for (const timeoutRef of this._timeouts.values()) clearTimeout(timeoutRef);
147
- this._timeouts.clear();
148
- for (const intervalRef of this._intervals.values()) clearInterval(intervalRef);
149
- this._intervals.clear();
150
- const inFlight = [...this._inFlight.values()];
151
- this._inFlight.clear();
152
- const timeoutMs = this.params.shutdownTimeoutMs;
153
- if (timeoutMs === void 0) {
154
- await Promise.allSettled(inFlight);
155
- return;
156
- }
157
- await Promise.race([
158
- Promise.allSettled(inFlight),
159
- new Promise((resolve) => {
160
- setTimeout(resolve, timeoutMs);
161
- })
162
- ]);
163
- }
164
- async whenReady() {
165
- await this._readyDeferred.promise;
166
- }
167
- };
14
+ // src/boot/bootDappActors.ts
15
+ import { bootActors } from "@ariestools/actor";
168
16
 
169
17
  // src/DappActor.ts
170
- import { creatable } from "@ariestools/sdk";
18
+ import { PeriodicActor } from "@ariestools/actor";
19
+ import { assertEx, creatable } from "@ariestools/sdk";
171
20
 
172
21
  // src/providers/capabilities.ts
173
22
  var ReadOnlyStoreError = class extends Error {
@@ -324,38 +173,26 @@ function failureStatusFields(prior, consecutiveFailures, error, now) {
324
173
 
325
174
  // src/DappActor.ts
326
175
  var DEFAULT_REDUCE_INTERVAL_MS = 5e3;
327
- var DEFAULT_FIRST_RUN_DELAY_MS = 2e3;
328
- var REDUCE_TIMER = "DappReduce";
329
- function createDeferred2() {
330
- let resolve;
331
- let reject;
332
- const promise = new Promise((res, rej) => {
333
- resolve = res;
334
- reject = rej;
335
- });
336
- void promise.catch(() => {
337
- });
338
- return {
339
- promise,
340
- reject,
341
- resolve
342
- };
343
- }
344
176
  function withDefaultGenerationRoot(result) {
345
177
  if (result === void 0) return;
346
178
  if (result.generation === void 0 || result.generationRoot !== void 0) return result;
347
179
  return { ...result, generationRoot: HEAD_KEY };
348
180
  }
349
- var DappActor = class extends AbstractActor {
181
+ var DappActor = class extends PeriodicActor {
350
182
  _data;
351
183
  _index;
352
184
  _state;
353
- _consecutiveFailures = 0;
354
- _firstPass = createDeferred2();
355
- _firstPassSettled = false;
356
- /** Consecutive reduce failures since the last success. */
357
- get consecutiveFailures() {
358
- return this._consecutiveFailures;
185
+ /**
186
+ Dapp actors require a logger in the locator context (see {@link DappContext}).
187
+ */
188
+ get logger() {
189
+ return assertEx(super.logger, () => `Logger is required in context for actor ${this.name}.`);
190
+ }
191
+ /**
192
+ Reduce cadence: `reduceIntervalMs` names the interval in dapp configs.
193
+ */
194
+ get intervalMs() {
195
+ return this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS;
359
196
  }
360
197
  async createHandler() {
361
198
  await super.createHandler();
@@ -364,23 +201,29 @@ var DappActor = class extends AbstractActor {
364
201
  this._state = await this.locator.getInstance(DappStateStoreMoniker);
365
202
  this._index = await this.locator.getInstance(DappIndexStoreMoniker);
366
203
  }
367
- async readyHandler() {
368
- await this._firstPass.promise;
369
- }
370
204
  async startHandler() {
371
205
  await super.startHandler();
372
- const interval = this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS;
373
- const firstRunDelay = this.params.firstRunDelayMs ?? DEFAULT_FIRST_RUN_DELAY_MS;
374
- this.registerTimer(REDUCE_TIMER, async () => {
375
- await this.runReducePass();
376
- }, firstRunDelay, interval);
377
206
  this.logger.info(
378
- `DappActor started: reducer '${this.params.reducer.name}' every ${interval}ms (first run in ${firstRunDelay}ms)`
207
+ `DappActor started: reducer '${this.params.reducer.name}' every ${this.intervalMs}ms (first run in ${this.firstRunDelayMs}ms)`
379
208
  );
380
209
  }
381
- async stopHandler() {
382
- this.settleFirstPass(new Error("Actor stopped before first reduce pass completed"));
383
- await super.stopHandler();
210
+ /**
211
+ Failure side-channel: publish durable failure status (count already incremented).
212
+ */
213
+ async onPassError(error) {
214
+ await this.safePublishStatus(void 0, error);
215
+ }
216
+ async runPass({ signal }) {
217
+ const result = await this.params.reducer.reduce({
218
+ data: this._data,
219
+ index: this._index,
220
+ logger: this.logger,
221
+ signal,
222
+ state: this._state
223
+ });
224
+ if (signal.aborted) return;
225
+ const progress = withDefaultGenerationRoot(result === void 0 ? void 0 : result);
226
+ await this.safePublishStatus(progress);
384
227
  }
385
228
  async publishStatusFromProgress(progress, error) {
386
229
  if (this.params.publishStatus === false) return;
@@ -391,44 +234,9 @@ var DappActor = class extends AbstractActor {
391
234
  prior = void 0;
392
235
  }
393
236
  const now = (/* @__PURE__ */ new Date()).toISOString();
394
- const fields = error === void 0 ? successStatusFields(progress, prior, now) : failureStatusFields(prior, this._consecutiveFailures, error, now);
237
+ const fields = error === void 0 ? successStatusFields(progress, prior, now) : failureStatusFields(prior, this.consecutiveFailures, error, now);
395
238
  await writeIndexerStatus(this._state, fields);
396
239
  }
397
- async runReducePass() {
398
- const signal = this.signal;
399
- try {
400
- const result = await this.params.reducer.reduce({
401
- data: this._data,
402
- index: this._index,
403
- logger: this.logger,
404
- signal,
405
- state: this._state
406
- });
407
- if (signal.aborted) return;
408
- const progress = withDefaultGenerationRoot(result === void 0 ? void 0 : result);
409
- this._consecutiveFailures = 0;
410
- await this.safePublishStatus(progress);
411
- this.settleFirstPass();
412
- } catch (error) {
413
- if (signal.aborted) return;
414
- const err = error instanceof Error ? error : new Error(String(error));
415
- this._consecutiveFailures += 1;
416
- await this.safePublishStatus(void 0, err);
417
- this.settleFirstPass(err);
418
- this.logger.error(
419
- `Error in reduce pass for '${this.params.reducer.name}': ${err.message}`
420
- );
421
- const max = this.params.maxConsecutiveFailures;
422
- if (max !== void 0 && this._consecutiveFailures >= max) {
423
- this.logger.error(
424
- `Reducer '${this.params.reducer.name}' failed ${this._consecutiveFailures} consecutive times; stopping actor`
425
- );
426
- setTimeout(() => {
427
- void this.stop();
428
- }, 0);
429
- }
430
- }
431
- }
432
240
  async safePublishStatus(progress, error) {
433
241
  try {
434
242
  await this.publishStatusFromProgress(progress, error);
@@ -436,12 +244,6 @@ var DappActor = class extends AbstractActor {
436
244
  this.logger.error(`Failed to publish indexer status: ${String(statusError)}`);
437
245
  }
438
246
  }
439
- settleFirstPass(error) {
440
- if (this._firstPassSettled) return;
441
- this._firstPassSettled = true;
442
- if (error === void 0) this._firstPass.resolve();
443
- else this._firstPass.reject(error);
444
- }
445
247
  };
446
248
  __publicField(DappActor, "dependencies", [
447
249
  DappDataStoreMoniker,
@@ -454,36 +256,22 @@ DappActor = __decorateClass([
454
256
 
455
257
  // src/boot/bootDappActors.ts
456
258
  async function bootDappActors(locator, specs) {
457
- const actors = [];
458
- try {
459
- for (const spec of specs) {
460
- const params = {
461
- locator,
462
- name: spec.name,
463
- reducer: spec.reducer,
464
- ...spec.reduceIntervalMs !== void 0 && { reduceIntervalMs: spec.reduceIntervalMs },
465
- ...spec.firstRunDelayMs !== void 0 && { firstRunDelayMs: spec.firstRunDelayMs },
466
- ...spec.maxConsecutiveFailures !== void 0 && { maxConsecutiveFailures: spec.maxConsecutiveFailures },
467
- ...spec.publishStatus !== void 0 && { publishStatus: spec.publishStatus },
468
- ...spec.shutdownTimeoutMs !== void 0 && { shutdownTimeoutMs: spec.shutdownTimeoutMs }
469
- };
470
- const actor = await DappActor.create(params);
471
- await actor.start();
472
- actors.push(actor);
473
- if (spec.runReady !== false) {
474
- await actor.runReadyHandler();
475
- }
476
- }
477
- return actors;
478
- } catch (error) {
479
- for (const actor of [...actors].reverse()) {
480
- try {
481
- await actor.stop();
482
- } catch {
483
- }
484
- }
485
- throw error;
486
- }
259
+ return await bootActors(specs.map((spec) => {
260
+ const params = {
261
+ locator,
262
+ name: spec.name,
263
+ reducer: spec.reducer,
264
+ ...spec.reduceIntervalMs !== void 0 && { reduceIntervalMs: spec.reduceIntervalMs },
265
+ ...spec.firstRunDelayMs !== void 0 && { firstRunDelayMs: spec.firstRunDelayMs },
266
+ ...spec.maxConsecutiveFailures !== void 0 && { maxConsecutiveFailures: spec.maxConsecutiveFailures },
267
+ ...spec.publishStatus !== void 0 && { publishStatus: spec.publishStatus },
268
+ ...spec.shutdownTimeoutMs !== void 0 && { shutdownTimeoutMs: spec.shutdownTimeoutMs }
269
+ };
270
+ return {
271
+ create: () => DappActor.create(params),
272
+ ...spec.runReady !== void 0 && { runReady: spec.runReady }
273
+ };
274
+ }));
487
275
  }
488
276
 
489
277
  // src/locator/createDappLocator.ts
@@ -1923,7 +1711,6 @@ var noopReducer = {
1923
1711
  }
1924
1712
  };
1925
1713
  export {
1926
- AbstractActor,
1927
1714
  CACHE_CONTROL_IMMUTABLE,
1928
1715
  CACHE_CONTROL_REVALIDATE,
1929
1716
  CAS_PREFIX,