@ariestools/aries-dapp-core 0.1.20 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/dappServer.mjs +21 -20
- package/dist/node/DappActor.d.ts.map +1 -1
- package/dist/node/consumer/api.d.ts.map +1 -1
- package/dist/node/consumer/hash.d.ts.map +1 -1
- package/dist/node/consumer.mjs +14 -7
- package/dist/node/consumer.mjs.map +2 -2
- package/dist/node/examples/productionComposition.d.ts +2 -2
- package/dist/node/index.mjs +75 -48
- package/dist/node/index.mjs.map +3 -3
- package/dist/node/locator/createDappLocator.d.ts.map +1 -1
- package/dist/node/providers/DappBucketStore.d.ts.map +1 -1
- package/dist/node/publication/canonicalHead.d.ts.map +1 -1
- package/dist/node/publication/gc.d.ts.map +1 -1
- package/dist/node/publication/incremental.d.ts.map +1 -1
- package/dist/node/publication/publishGeneration.d.ts.map +1 -1
- package/dist/node/publication/putCreateOnly.d.ts.map +1 -1
- package/dist/node/publication/releases.d.ts.map +1 -1
- package/dist/node/publication/status.d.ts +1 -1
- package/dist/node/publication/status.d.ts.map +1 -1
- package/dist/node/publication/writeGenerationObjects.d.ts.map +1 -1
- package/examples/countFactsReducer.mjs +5 -4
- package/package.json +13 -13
package/dist/node/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/boot/bootDappActors.ts", "../../src/DappActor.ts", "../../src/providers/capabilities.ts", "../../src/providers/monikers.ts", "../../src/publication/constants.ts", "../../src/publication/status.ts", "../../src/publication/statusPatch.ts", "../../src/locator/createDappLocator.ts", "../../src/providers/DappBucketStore.ts", "../../src/providers/errors.ts", "../../src/providers/joinKey.ts", "../../src/providers/hashBytes.ts", "../../src/providers/memoryBucketStore.ts", "../../src/providers/types.ts", "../../src/publication/canonicalHead.ts", "../../src/publication/publishGeneration.ts", "../../src/publication/commitHead.ts", "../../src/publication/safety.ts", "../../src/publication/putCreateOnly.ts", "../../src/publication/writeGenerationObjects.ts", "../../src/publication/releases.ts", "../../src/publication/gc.ts", "../../src/publication/incremental.ts", "../../src/publication/shard.ts", "../../src/reducer/DappReducer.ts"],
|
|
4
|
-
"sourcesContent": ["import { bootActors } from '@ariestools/actor'\nimport type { CreatableName } from '@ariestools/sdk'\n\nimport type { DappProviderLocator } from '../actor/types.ts'\nimport type { DappActorParams } from '../DappActor.ts'\nimport { DappActor } from '../DappActor.ts'\nimport type { DappReducer } from '../reducer/DappReducer.ts'\n\nexport interface DappActorSpec {\n firstRunDelayMs?: number\n maxConsecutiveFailures?: number\n name: string\n publishStatus?: boolean\n reduceIntervalMs?: number\n reducer: DappReducer\n /**\n * When true (default), run readiness after start so boot completes only when\n * the first reduce pass succeeds (or fails under the failure policy).\n */\n runReady?: boolean\n shutdownTimeoutMs?: number\n}\n\n/**\n * Creates and starts one {@link DappActor} per spec, all sharing the single\n * process-wide locator. A thin wrapper over actor-kit's `bootActors`: on\n * partial failure, actors already started are stopped (with shutdown\n * fallback) before the error is rethrown. Returns them so the caller can\n * stop them on shutdown.\n */\nexport async function bootDappActors(\n locator: DappProviderLocator,\n specs: readonly DappActorSpec[],\n): Promise<DappActor[]> {\n return await bootActors(specs.map((spec) => {\n const params: Partial<DappActorParams> = {\n locator,\n name: spec.name as CreatableName,\n reducer: spec.reducer,\n ...(spec.reduceIntervalMs !== undefined && { reduceIntervalMs: spec.reduceIntervalMs }),\n ...(spec.firstRunDelayMs !== undefined && { firstRunDelayMs: spec.firstRunDelayMs }),\n ...(spec.maxConsecutiveFailures !== undefined\n && { maxConsecutiveFailures: spec.maxConsecutiveFailures }),\n ...(spec.publishStatus !== undefined && { publishStatus: spec.publishStatus }),\n ...(spec.shutdownTimeoutMs !== undefined && { shutdownTimeoutMs: spec.shutdownTimeoutMs }),\n }\n return {\n create: () => DappActor.create(params),\n ...(spec.runReady !== undefined && { runReady: spec.runReady }),\n }\n }))\n}\n", "import type { PeriodicActorParams, PeriodicPassContext } from '@ariestools/actor'\nimport { PeriodicActor } from '@ariestools/actor'\nimport type { Logger } from '@ariestools/sdk'\nimport { assertEx, creatable } from '@ariestools/sdk'\n\nimport type { DappProviderLocator } from './actor/types.ts'\nimport type { DappObjectReader, DappObjectWriter } from './providers/capabilities.ts'\nimport { asReadOnly } from './providers/capabilities.ts'\nimport type { DappBucketStore } from './providers/DappBucketStore.ts'\nimport {\n DappDataStoreMoniker, DappIndexStoreMoniker, DappStateStoreMoniker,\n} from './providers/monikers.ts'\nimport { HEAD_KEY } from './publication/constants.ts'\nimport { readIndexerStatus, writeIndexerStatus } from './publication/status.ts'\nimport { failureStatusFields, successStatusFields } from './publication/statusPatch.ts'\nimport type { DappReduceProgress, DappReducer } from './reducer/DappReducer.ts'\n\nexport interface DappActorParams extends PeriodicActorParams<DappProviderLocator> {\n /**\n * When true (default), publish durable indexer status to the state store\n * after each reduce pass (success or failure).\n */\n publishStatus?: boolean\n /**\n Period between reduce passes. Defaults to 5000ms.\n */\n reduceIntervalMs?: number\n reducer: DappReducer\n}\n\nconst DEFAULT_REDUCE_INTERVAL_MS = 5000\n\nfunction withDefaultGenerationRoot(\n result: DappReduceProgress | undefined,\n): DappReduceProgress | undefined {\n if (result === undefined) return\n if (result.generation === undefined || result.generationRoot !== undefined) return result\n return { ...result, generationRoot: HEAD_KEY }\n}\n\n/**\n * The stock dapp actor: resolves the three bucket stores from the shared\n * locator, then drives its reducer on an interval to keep `state` and `index`\n * derived from authoritative input. The loop policies (first-pass-gated\n * readiness, non-overlap, consecutive-failure self-stop) come from\n * `PeriodicActor`; this class contributes the reduce pass and durable status\n * publication. Multiple actors (each with its own reducer) can share one\n * locator; this is the default single-reducer instance the local daemon boots.\n */\n@creatable()\nexport class DappActor extends PeriodicActor<DappActorParams> {\n static readonly dependencies = [\n DappDataStoreMoniker,\n DappStateStoreMoniker,\n DappIndexStoreMoniker,\n ] as const\n\n protected _data!: DappObjectReader\n protected _index!: DappObjectWriter\n protected _state!: DappObjectWriter\n\n /**\n Dapp actors require a logger in the locator context (see {@link DappContext}).\n */\n override get logger(): Logger {\n return assertEx(super.logger, () => `Logger is required in context for actor ${this.name}.`)\n }\n\n /**\n Reduce cadence: `reduceIntervalMs` names the interval in dapp configs.\n */\n protected override get intervalMs(): number {\n return this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n const dataWriter = await this.locator.getInstance<DappBucketStore>(DappDataStoreMoniker)\n // Defense in depth: data is always presented read-only to reducers.\n this._data = asReadOnly(dataWriter)\n this._state = await this.locator.getInstance<DappBucketStore>(DappStateStoreMoniker)\n this._index = await this.locator.getInstance<DappBucketStore>(DappIndexStoreMoniker)\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n this.logger.info(\n `DappActor started: reducer '${this.params.reducer.name}' every ${this.intervalMs}ms `\n + `(first run in ${this.firstRunDelayMs}ms)`,\n )\n }\n\n /**\n Failure side-channel: publish durable failure status (count already incremented).\n */\n protected override async onPassError(error: Error): Promise<void> {\n await this.safePublishStatus(undefined, error)\n }\n\n protected override async runPass({ signal }: PeriodicPassContext): Promise<void> {\n const result = await this.params.reducer.reduce({\n data: this._data,\n index: this._index,\n logger: this.logger,\n signal,\n state: this._state,\n })\n // Shutdown cancellation is control flow, not a successful reducer result.\n if (signal.aborted) return\n const progress = withDefaultGenerationRoot(result === undefined ? undefined : result)\n await this.safePublishStatus(progress)\n }\n\n private async publishStatusFromProgress(\n progress: DappReduceProgress | undefined,\n error: Error | undefined,\n ): Promise<void> {\n if (this.params.publishStatus === false) return\n let prior: Awaited<ReturnType<typeof readIndexerStatus>>\n try {\n prior = await readIndexerStatus(this._state)\n } catch {\n prior = undefined\n }\n const now = new Date().toISOString()\n const fields = error === undefined\n ? successStatusFields(progress, prior, now)\n : failureStatusFields(prior, this.consecutiveFailures, error, now)\n await writeIndexerStatus(this._state, fields)\n }\n\n private async safePublishStatus(\n progress?: DappReduceProgress,\n error?: Error,\n ): Promise<void> {\n try {\n await this.publishStatusFromProgress(progress, error)\n } catch (statusError) {\n this.logger.error(`Failed to publish indexer status: ${String(statusError)}`)\n }\n }\n}\n", "import type {\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n} from './types.ts'\n\n/**\n * Read-only object access for one logical dapp store role. Reducers receive the\n * data role as this surface so they cannot write through the source principal.\n */\nexport interface DappObjectReader {\n readonly bucket: string\n readonly prefix: string\n readonly publicBaseUrl?: string\n readonly role: DappStoreRole\n\n destroy(): void\n get(key: string): Promise<Uint8Array | undefined>\n getWithMeta(key: string): Promise<GetObjectResult | undefined>\n list(prefix?: string): Promise<string[]>\n listAsync(prefix?: string): AsyncIterable<string>\n listPage(options?: ListPageOptions): Promise<ListPage>\n publicUrl(key: string): string | undefined\n resolveKey(key: string): string\n stat(key: string): Promise<ObjectMeta | undefined>\n}\n\n/**\n * Read/write object access for derived roles (state/index) and publication.\n * Extends {@link DappObjectReader} with put/delete.\n */\nexport interface DappObjectWriter extends DappObjectReader {\n delete(key: string): Promise<void>\n put(key: string, body: string | Uint8Array, options?: PutObjectOptions): Promise<PutObjectResult>\n}\n\n/**\n * Full store type used by S3 implementations. Alias of {@link DappObjectWriter}\n * for backward compatibility with existing call sites.\n */\nexport type DappBucketStore = DappObjectWriter\n\n/**\nThrown when a read-only capability wrapper receives a write.\n*/\nexport class ReadOnlyStoreError extends Error {\n override readonly name = 'ReadOnlyStoreError'\n\n constructor(role: DappStoreRole, operation = 'put') {\n super(`Store role \"${role}\" is read-only; ${operation} is not permitted`)\n }\n}\n\nfunction bindReader(store: DappObjectWriter): DappObjectReader {\n return {\n role: store.role,\n bucket: store.bucket,\n prefix: store.prefix,\n ...(store.publicBaseUrl !== undefined && { publicBaseUrl: store.publicBaseUrl }),\n destroy: () => store.destroy(),\n get: key => store.get(key),\n getWithMeta: key => store.getWithMeta(key),\n list: listPrefix => store.list(listPrefix),\n listAsync: listPrefix => store.listAsync(listPrefix),\n listPage: options => store.listPage(options),\n publicUrl: key => store.publicUrl(key),\n resolveKey: key => store.resolveKey(key),\n stat: key => store.stat(key),\n }\n}\n\n/**\n * Wrap any writer as a read-only reader. Other methods and destroy delegate to\n * the underlying store.\n */\nexport function asReadOnly(store: DappObjectWriter): DappObjectReader {\n return bindReader(store)\n}\n\n/**\n * Wrap a writer so `put` fails even if the caller still holds the writer type\n * (defense in depth for the data-role locator registration).\n */\nexport function asReadOnlyWriter(store: DappObjectWriter): DappObjectWriter {\n const reader = bindReader(store)\n return {\n ...reader,\n async put(): Promise<PutObjectResult> {\n throw new ReadOnlyStoreError(store.role, 'put')\n },\n async delete(): Promise<void> {\n throw new ReadOnlyStoreError(store.role, 'delete')\n },\n }\n}\n", "/**\n * Provider monikers for the three dapp buckets. An actor declares these in its\n * `static dependencies` and resolves them from the locator at create time.\n */\nexport const DappDataStoreMoniker = 'DappDataStore' as const\nexport const DappStateStoreMoniker = 'DappStateStore' as const\nexport const DappIndexStoreMoniker = 'DappIndexStore' as const\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 type { DappBucketStore } from '../providers/DappBucketStore.ts'\nimport {\n CACHE_CONTROL_REVALIDATE, INDEXER_STATUS_SCHEMA, STATUS_KEY,\n} from './constants.ts'\nimport type { IndexerStatus } from './types.ts'\n\nexport interface WriteIndexerStatusInput {\n consecutiveFailures: number\n cursor?: string\n floor?: string\n generation?: string\n generationRoot?: string\n /**\n Override the status object key (default `status.json`).\n */\n key?: string\n lastCompletedPosition?: string\n lastError?: string\n lastErrorAt?: string\n lastSuccessAt?: string\n observedSourceHead?: string\n}\n\nfunction encodeStatus(status: IndexerStatus): string {\n return `${JSON.stringify(status, null, 2)}\\n`\n}\n\n/**\n * Read the durable indexer status object from a state (or status) store.\n * Returns undefined when no status has been published yet.\n */\nexport async function readIndexerStatus(\n store: DappBucketStore,\n key: string = STATUS_KEY,\n): Promise<IndexerStatus | undefined> {\n const body = await store.get(key)\n if (body === undefined) return undefined\n const parsed: unknown = JSON.parse(new TextDecoder().decode(body))\n if (parsed === null || typeof parsed !== 'object') {\n throw new Error(`Invalid indexer status at \"${key}\": not an object`)\n }\n const record = parsed as Partial<IndexerStatus>\n if (record.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid indexer status schema at \"${key}\": ${String(record.schema)}`)\n }\n return record as IndexerStatus\n}\n\n/**\n * Publish a machine-readable status object with revalidate CDN caching.\n * Status never carries credentials or private application material.\n */\nexport async function writeIndexerStatus(\n store: DappBucketStore,\n input: WriteIndexerStatusInput,\n): Promise<IndexerStatus> {\n const key = input.key ?? STATUS_KEY\n const status: IndexerStatus = {\n schema: INDEXER_STATUS_SCHEMA,\n consecutiveFailures: input.consecutiveFailures,\n updatedAt: new Date().toISOString(),\n ...(input.floor !== undefined && { floor: input.floor }),\n ...(input.cursor !== undefined && { cursor: input.cursor }),\n ...(input.lastCompletedPosition !== undefined\n && { lastCompletedPosition: input.lastCompletedPosition }),\n ...(input.observedSourceHead !== undefined\n && { observedSourceHead: input.observedSourceHead }),\n ...(input.generation !== undefined && { generation: input.generation }),\n ...(input.generationRoot !== undefined && { generationRoot: input.generationRoot }),\n ...(input.lastSuccessAt !== undefined && { lastSuccessAt: input.lastSuccessAt }),\n ...(input.lastErrorAt !== undefined && { lastErrorAt: input.lastErrorAt }),\n ...(input.lastError !== undefined && { lastError: input.lastError }),\n }\n await store.put(key, encodeStatus(status), {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n })\n return status\n}\n", "import type { DappReduceProgress } from '../reducer/DappReducer.ts'\nimport type { WriteIndexerStatusInput } from './status.ts'\nimport type { IndexerStatus } from './types.ts'\n\nfunction pickDefined(\n source: Record<string, string | undefined>,\n keys: readonly string[],\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of keys) {\n const value = source[key]\n if (value !== undefined) out[key] = value\n }\n return out\n}\n\nconst PROGRESS_KEYS = [\n 'floor',\n 'cursor',\n 'lastCompletedPosition',\n 'observedSourceHead',\n 'generation',\n 'generationRoot',\n] as const\n\n/**\nCarry forward durable progress fields from a prior status object.\n*/\nexport function priorProgressFields(\n prior: IndexerStatus | undefined,\n): Pick<\n WriteIndexerStatusInput,\n 'cursor' | 'floor' | 'generation' | 'generationRoot' | 'lastCompletedPosition' | 'observedSourceHead' | 'lastSuccessAt'\n> {\n if (prior === undefined) return {}\n return {\n ...pickDefined(prior as unknown as Record<string, string | undefined>, PROGRESS_KEYS),\n ...(prior.lastSuccessAt !== undefined && { lastSuccessAt: prior.lastSuccessAt }),\n }\n}\n\n/**\nBuild success status fields from reduce progress, falling back to prior.\n*/\nexport function successStatusFields(\n progress: DappReduceProgress | undefined,\n prior: IndexerStatus | undefined,\n now: string,\n): WriteIndexerStatusInput {\n const fromProgress = progress === undefined\n ? {}\n : pickDefined(progress as unknown as Record<string, string | undefined>, PROGRESS_KEYS)\n const generation = progress?.generation ?? prior?.generation\n const generationRoot = progress?.generationRoot ?? prior?.generationRoot\n return {\n consecutiveFailures: 0,\n ...fromProgress,\n ...(generation !== undefined && { generation }),\n ...(generationRoot !== undefined && { generationRoot }),\n lastSuccessAt: now,\n ...(prior?.lastError !== undefined && { lastError: prior.lastError }),\n ...(prior?.lastErrorAt !== undefined && { lastErrorAt: prior.lastErrorAt }),\n }\n}\n\n/**\nBuild failure status fields while preserving prior checkpoint progress.\n*/\nexport function failureStatusFields(\n prior: IndexerStatus | undefined,\n consecutiveFailures: number,\n error: Error,\n now: string,\n): WriteIndexerStatusInput {\n return {\n consecutiveFailures,\n ...priorProgressFields(prior),\n lastError: error.message,\n lastErrorAt: now,\n }\n}\n", "import type { Logger } from '@ariestools/sdk'\nimport { ConsoleLogger } from '@ariestools/sdk'\nimport type { S3Client } from '@aws-sdk/client-s3'\n\nimport type { DappMoniker, DappProviderLocator } from '../actor/types.ts'\nimport { asReadOnlyWriter } from '../providers/capabilities.ts'\nimport { createS3BucketStore, resolveS3Client } from '../providers/DappBucketStore.ts'\nimport {\n DappDataStoreMoniker, DappIndexStoreMoniker, DappStateStoreMoniker,\n} from '../providers/monikers.ts'\nimport type {\n DappStoreBinding, DappStoreBindings, DappStoreRole, S3ClientConfig,\n} from '../providers/types.ts'\n\nexport interface CreateDappLocatorOptions extends S3ClientConfig {\n accessKeyId?: string\n /**\n * Physical bindings per logical role. When omitted, defaults to three\n * buckets named `data` / `state` / `index` with no prefix (local dapp-serve).\n */\n bindings?: DappStoreBindings\n /**\n * Optional per-role S3 clients or client configs for least-privilege\n * principals (e.g. data read-only IAM user vs state/index writer). When a\n * role is omitted, the shared {@link client} / top-level config is used.\n */\n clients?: Partial<Record<DappStoreRole, S3Client | S3ClientConfig>>\n /**\n * Origin of the private S3-compatible API, e.g. `http://127.0.0.1:8801` or\n * an R2 endpoint. Ignored when {@link client} is provided.\n */\n endpoint?: string\n logger?: Logger\n /**\n * When true (default), the data-role store rejects `put` so reducers cannot\n * write through the source principal even if they cast the type.\n */\n readOnlyData?: boolean\n secretAccessKey?: string\n}\n\nconst DEFAULT_BINDINGS: DappStoreBindings = {\n data: { bucket: 'data' },\n state: { bucket: 'state' },\n index: { bucket: 'index' },\n}\n\nconst ROLE_MONIKERS: Record<DappStoreRole, string> = {\n data: DappDataStoreMoniker,\n state: DappStateStoreMoniker,\n index: DappIndexStoreMoniker,\n}\n\nfunction resolveCredentials(options: CreateDappLocatorOptions): S3ClientConfig['credentials'] {\n if (options.credentials !== undefined) return options.credentials\n if (options.accessKeyId !== undefined || options.secretAccessKey !== undefined) {\n return {\n accessKeyId: options.accessKeyId ?? 'S3RVER',\n secretAccessKey: options.secretAccessKey ?? 'S3RVER',\n }\n }\n return undefined\n}\n\ninterface OwnedClient {\n client: S3Client\n ownClient: boolean\n}\n\nfunction resolveSharedClient(options: CreateDappLocatorOptions): OwnedClient {\n const credentials = resolveCredentials(options)\n if (options.client !== undefined) {\n return {\n client: options.client,\n ownClient: options.ownClient ?? false,\n }\n }\n return resolveS3Client({\n ...(options.endpoint !== undefined && { endpoint: options.endpoint }),\n ...(options.region !== undefined && { region: options.region }),\n ...(options.forcePathStyle !== undefined && { forcePathStyle: options.forcePathStyle }),\n ...(credentials !== undefined && { credentials }),\n ownClient: options.ownClient,\n })\n}\n\nfunction resolveRoleClient(\n role: DappStoreRole,\n options: CreateDappLocatorOptions,\n shared: OwnedClient,\n): OwnedClient {\n const override = options.clients?.[role]\n if (override === undefined) return shared\n if (typeof (override as S3Client).send === 'function') {\n return {\n client: override as S3Client,\n ownClient: false,\n }\n }\n return resolveS3Client({\n ...(override as S3ClientConfig),\n // Per-role constructed clients are owned by the locator.\n ownClient: (override as S3ClientConfig).ownClient ?? true,\n })\n}\n\n/**\n * Builds the process-wide locator: one instance, shared across every actor\n * (xl1-cli style). It pre-registers an S3-backed store per logical role using\n * either the default local bucket names or explicit production bindings.\n * Extra providers can be `register`ed before actors are created.\n *\n * Prefer a shared {@link client} when all roles share one principal; use\n * {@link CreateDappLocatorOptions.clients} for distinct least-privilege\n * credentials per role. Call `destroy()` on shutdown when the locator owns\n * any client it constructed.\n */\nexport function createDappLocator(options: CreateDappLocatorOptions): DappProviderLocator {\n const logger = options.logger ?? new ConsoleLogger()\n const bindings = options.bindings ?? DEFAULT_BINDINGS\n const shared = resolveSharedClient(options)\n const readOnlyData = options.readOnlyData !== false\n\n const roles = ['data', 'state', 'index'] as const\n const instances = new Map<DappMoniker, unknown>()\n const stores: { destroy(): void }[] = []\n const ownedClients: OwnedClient[] = []\n const seenClients = new Set<S3Client>()\n\n const trackClient = (owned: OwnedClient): void => {\n if (!owned.ownClient || seenClients.has(owned.client)) return\n seenClients.add(owned.client)\n ownedClients.push(owned)\n }\n trackClient(shared)\n\n for (const role of roles) {\n const binding: DappStoreBinding = bindings[role]\n const roleClient = resolveRoleClient(role, options, shared)\n trackClient(roleClient)\n let store = createS3BucketStore({\n role,\n binding,\n client: roleClient.client,\n // Locator owns clients; individual stores must not destroy them.\n ownClient: false,\n })\n if (role === 'data' && readOnlyData) {\n store = asReadOnlyWriter(store)\n }\n stores.push(store)\n instances.set(ROLE_MONIKERS[role], store)\n }\n\n let destroyed = false\n return {\n context: { logger },\n has(moniker: DappMoniker): boolean {\n return instances.has(moniker)\n },\n register(moniker: DappMoniker, instance: unknown): void {\n instances.set(moniker, instance)\n },\n async getInstance<T>(moniker: DappMoniker): Promise<T> {\n const found = instances.get(moniker)\n if (found === undefined) throw new Error(`No provider registered for moniker \"${moniker}\"`)\n return found as T\n },\n async tryGetInstance<T>(moniker: DappMoniker): Promise<T | undefined> {\n return instances.get(moniker) as T | undefined\n },\n destroy(): void {\n if (destroyed) return\n destroyed = true\n for (const store of stores) store.destroy()\n for (const owned of ownedClients) {\n if (owned.ownClient) owned.client.destroy()\n }\n },\n }\n}\n", "import {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n} from '@aws-sdk/client-s3'\n\nimport type { DappBucketStore } from './capabilities.ts'\nimport { ConditionalWriteError } from './errors.ts'\nimport {\n joinKey, normalizePublicBaseUrl, stripPrefix,\n} from './joinKey.ts'\nimport type {\n DappStoreBinding,\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n S3ClientConfig,\n} from './types.ts'\n\nexport type { DappBucketStore } from './capabilities.ts'\nexport type { DappObjectReader, DappObjectWriter } from './capabilities.ts'\nexport {\n asReadOnly, asReadOnlyWriter, ReadOnlyStoreError,\n} from './capabilities.ts'\n\nexport interface S3DappBucketStoreOptions extends S3ClientConfig {\n binding: DappStoreBinding\n role: DappStoreRole\n}\n\nconst DEFAULT_CREDENTIAL = 'S3RVER'\nconst DEFAULT_REGION = 'us-east-1'\n\nfunction isNotFound(error: unknown): boolean {\n const name = (error as { name?: string }).name\n const status = (error as { $metadata?: { httpStatusCode?: number } }).$metadata?.httpStatusCode\n return name === 'NoSuchKey'\n || name === 'NotFound'\n || name === '404'\n || status === 404\n}\n\nfunction isConditionalFailure(error: unknown): boolean {\n const name = (error as { name?: string }).name\n const status = (error as { $metadata?: { httpStatusCode?: number } }).$metadata?.httpStatusCode\n return name === 'PreconditionFailed'\n || name === 'ConditionalRequestConflict'\n || name === '412'\n || status === 412\n}\n\nfunction toBodyBytes(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nfunction metaFromResponse(response: {\n CacheControl?: string\n ContentEncoding?: string\n ContentLength?: number\n ContentType?: string\n ETag?: string\n LastModified?: Date\n Metadata?: Record<string, string>\n}): ObjectMeta {\n return {\n ...(response.CacheControl !== undefined && { cacheControl: response.CacheControl }),\n ...(response.ContentEncoding !== undefined && { contentEncoding: response.ContentEncoding }),\n ...(response.ContentLength !== undefined && { contentLength: response.ContentLength }),\n ...(response.ContentType !== undefined && { contentType: response.ContentType }),\n ...(response.ETag !== undefined && { etag: response.ETag }),\n ...(response.LastModified !== undefined && { lastModified: response.LastModified }),\n ...(response.Metadata !== undefined && Object.keys(response.Metadata).length > 0\n && { metadata: response.Metadata }),\n }\n}\n\nexport interface ResolvedS3Client {\n client: S3Client\n ownClient: boolean\n}\n\n/**\n * Resolve a shared S3 client from an injected instance or construct options.\n * Callers that build three role stores should resolve once and pass the same\n * client to each so dapp-core does not own one client per role.\n */\nfunction resolveClientCredentials(\n options: S3ClientConfig,\n): S3ClientConfig['credentials'] | undefined {\n if (options.credentials !== undefined) return options.credentials\n if (options.endpoint === undefined) return undefined\n return {\n accessKeyId: DEFAULT_CREDENTIAL,\n secretAccessKey: DEFAULT_CREDENTIAL,\n }\n}\n\nexport function resolveS3Client(options: S3ClientConfig): ResolvedS3Client {\n if (options.client !== undefined) {\n return {\n client: options.client,\n ownClient: options.ownClient ?? false,\n }\n }\n const credentials = resolveClientCredentials(options)\n const client = new S3Client({\n ...(options.endpoint !== undefined && { endpoint: options.endpoint }),\n region: options.region ?? DEFAULT_REGION,\n forcePathStyle: options.forcePathStyle ?? options.endpoint !== undefined,\n ...(credentials !== undefined && { credentials }),\n })\n return {\n client,\n ownClient: options.ownClient ?? true,\n }\n}\n\n/**\n * S3-backed {@link DappBucketStore}. Accepts an injected client (production)\n * or builds one from endpoint/credentials (local s3rver / simple configs).\n * Path-style addressing is the default when an endpoint is provided so local\n * fixtures and many R2 setups work without virtual-host DNS.\n */\nexport function createS3BucketStore(options: S3DappBucketStoreOptions): DappBucketStore {\n const { role } = options\n const bindingPrefix = (options.binding.prefix ?? '').replaceAll(/^\\/+|\\/+$/g, '')\n const publicBaseUrl = normalizePublicBaseUrl(options.binding.publicBaseUrl)\n const { client, ownClient } = resolveS3Client(options)\n const bucket = options.binding.bucket\n let destroyed = false\n\n function resolve(relativeKey: string): string {\n return joinKey(bindingPrefix, relativeKey)\n }\n\n return {\n role,\n bucket,\n prefix: bindingPrefix,\n ...(publicBaseUrl !== undefined && { publicBaseUrl }),\n\n resolveKey(key: string): string {\n return resolve(key)\n },\n\n publicUrl(key: string): string | undefined {\n if (publicBaseUrl === undefined) return undefined\n const relative = key.replaceAll(/^\\/+/g, '')\n return relative.length === 0 ? publicBaseUrl : `${publicBaseUrl}/${relative}`\n },\n\n destroy(): void {\n if (destroyed) return\n destroyed = true\n if (ownClient) client.destroy()\n },\n\n async get(key: string): Promise<Uint8Array | undefined> {\n const result = await this.getWithMeta(key)\n return result?.body\n },\n\n async getWithMeta(key: string): Promise<GetObjectResult | undefined> {\n try {\n const response = await client.send(new GetObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n const body = await response.Body?.transformToByteArray()\n if (body === undefined) return undefined\n return {\n body,\n meta: metaFromResponse(response),\n }\n } catch (error) {\n if (isNotFound(error)) return undefined\n throw error\n }\n },\n\n async stat(key: string): Promise<ObjectMeta | undefined> {\n try {\n const response = await client.send(new HeadObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n return metaFromResponse(response)\n } catch (error) {\n if (isNotFound(error)) return undefined\n throw error\n }\n },\n\n async put(\n key: string,\n body: string | Uint8Array,\n putOptions?: PutObjectOptions,\n ): Promise<PutObjectResult> {\n const physicalKey = resolve(key)\n try {\n const response = await client.send(new PutObjectCommand({\n Bucket: bucket,\n Key: physicalKey,\n Body: toBodyBytes(body),\n ...(putOptions?.contentType !== undefined && { ContentType: putOptions.contentType }),\n ...(putOptions?.contentEncoding !== undefined\n && { ContentEncoding: putOptions.contentEncoding }),\n ...(putOptions?.cacheControl !== undefined && { CacheControl: putOptions.cacheControl }),\n ...(putOptions?.metadata !== undefined && { Metadata: putOptions.metadata }),\n ...(putOptions?.ifNotExists === true && { IfNoneMatch: '*' }),\n ...(putOptions?.ifMatch !== undefined && { IfMatch: putOptions.ifMatch }),\n }))\n return { ...(response.ETag !== undefined && { etag: response.ETag }) }\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new ConditionalWriteError(key)\n }\n throw error\n }\n },\n\n async delete(key: string): Promise<void> {\n await client.send(new DeleteObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n },\n\n async list(prefix?: string): Promise<string[]> {\n const keys: string[] = []\n for await (const key of this.listAsync(prefix)) {\n keys.push(key)\n }\n return keys\n },\n\n async listPage(pageOptions: ListPageOptions = {}): Promise<ListPage> {\n const physicalPrefix = pageOptions.prefix === undefined\n ? (bindingPrefix.length === 0 ? undefined : `${bindingPrefix}/`)\n : resolve(pageOptions.prefix)\n const response = await client.send(new ListObjectsV2Command({\n Bucket: bucket,\n ...(physicalPrefix !== undefined && { Prefix: physicalPrefix }),\n ...(pageOptions.continuationToken !== undefined\n && { ContinuationToken: pageOptions.continuationToken }),\n ...(pageOptions.maxKeys !== undefined && { MaxKeys: pageOptions.maxKeys }),\n }))\n const keys: string[] = []\n for (const item of response.Contents ?? []) {\n if (item.Key === undefined) continue\n keys.push(stripPrefix(bindingPrefix, item.Key))\n }\n const isTruncated = response.IsTruncated === true\n return {\n keys,\n isTruncated,\n ...(isTruncated && response.NextContinuationToken !== undefined\n && { continuationToken: response.NextContinuationToken }),\n }\n },\n\n async* listAsync(prefix?: string): AsyncIterable<string> {\n let token: string | undefined\n do {\n const page = await this.listPage({\n ...(prefix !== undefined && { prefix }),\n ...(token !== undefined && { continuationToken: token }),\n })\n for (const key of page.keys) yield key\n token = page.continuationToken\n } while (token !== undefined)\n },\n }\n}\n\n/**\n * @deprecated Prefer {@link S3DappBucketStoreOptions} with an explicit binding.\n * Kept for the local-dev locator path that still uses endpoint + role name.\n */\nexport interface LegacyS3DappBucketStoreOptions {\n accessKeyId?: string\n bucket: DappStoreRole\n /**\n Origin the dapp server listens on, e.g. `http://127.0.0.1:8801`.\n */\n endpoint: string\n secretAccessKey?: string\n}\n", "/**\n * Thrown when a conditional put fails (object already exists under\n * `ifNotExists`, or ETag mismatch under `ifMatch`).\n */\nexport class ConditionalWriteError extends Error {\n readonly key: string\n override readonly name = 'ConditionalWriteError'\n\n constructor(key: string, message?: string) {\n super(message ?? `Conditional write failed for key \"${key}\"`)\n this.key = key\n }\n}\n\nexport function isConditionalWriteError(error: unknown): error is ConditionalWriteError {\n return error instanceof ConditionalWriteError\n || (error !== null\n && typeof error === 'object'\n && (error as { name?: string }).name === 'ConditionalWriteError')\n}\n", "/**\n * Join a role prefix with a relative object key into a physical S3 key.\n * Empty prefix yields the relative key unchanged; empty relative yields the\n * prefix without a trailing slash.\n */\nexport function joinKey(prefix: string, relativeKey: string): string {\n const cleanPrefix = prefix.replaceAll(/^\\/+|\\/+$/g, '')\n const cleanKey = relativeKey.replaceAll(/^\\/+/g, '')\n if (cleanPrefix.length === 0) return cleanKey\n if (cleanKey.length === 0) return cleanPrefix\n return `${cleanPrefix}/${cleanKey}`\n}\n\n/**\nStrip a role prefix from a physical key, returning the relative key.\n*/\nexport function stripPrefix(prefix: string, physicalKey: string): string {\n const cleanPrefix = prefix.replaceAll(/^\\/+|\\/+$/g, '')\n if (cleanPrefix.length === 0) return physicalKey\n const withSlash = `${cleanPrefix}/`\n if (physicalKey === cleanPrefix) return ''\n if (physicalKey.startsWith(withSlash)) return physicalKey.slice(withSlash.length)\n return physicalKey\n}\n\n/**\nNormalize an optional public base URL (no trailing slash).\n*/\nexport function normalizePublicBaseUrl(url: string | undefined): string | undefined {\n if (url === undefined || url.length === 0) return undefined\n return url.replace(/\\/+$/, '')\n}\n", "import { createHash } from 'node:crypto'\n\n/**\nSHA-256 hex digest of a string or byte body.\n*/\nexport function hashBytes(body: string | Uint8Array): string {\n const hash = createHash('sha256')\n hash.update(typeof body === 'string' ? body : Buffer.from(body))\n return hash.digest('hex')\n}\n", "import type { DappBucketStore } from './capabilities.ts'\nimport { ConditionalWriteError } from './errors.ts'\nimport type {\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n} from './types.ts'\n\ninterface MemObject {\n body: Uint8Array\n cacheControl?: string\n contentEncoding?: string\n contentType?: string\n etag: string\n metadata?: Record<string, string>\n}\n\nexport interface MemoryBucketStoreOptions {\n bucket?: string\n prefix?: string\n publicBaseUrl?: string\n role: DappStoreRole\n}\n\n/**\n * In-memory {@link DappBucketStore} with real conditional put semantics for\n * deterministic fence/race tests (s3rver conditionals are unreliable).\n */\nexport function createMemoryBucketStore(options: MemoryBucketStoreOptions): DappBucketStore {\n const objects = new Map<string, MemObject>()\n let etagSeq = 0\n const role = options.role\n const bucket = options.bucket ?? role\n const prefix = (options.prefix ?? '').replaceAll(/^\\/+|\\/+$/g, '')\n const publicBaseUrl = options.publicBaseUrl\n\n function nextEtag(): string {\n etagSeq += 1\n return `\"mem-${etagSeq}\"`\n }\n\n function toBytes(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n }\n\n return {\n role,\n bucket,\n prefix,\n ...(publicBaseUrl !== undefined && { publicBaseUrl }),\n\n destroy(): void {\n objects.clear()\n },\n\n resolveKey(key: string): string {\n const clean = key.replaceAll(/^\\/+/g, '')\n if (prefix.length === 0) return clean\n return clean.length === 0 ? prefix : `${prefix}/${clean}`\n },\n\n publicUrl(key: string): string | undefined {\n if (publicBaseUrl === undefined) return undefined\n const relative = key.replaceAll(/^\\/+/g, '')\n return relative.length === 0 ? publicBaseUrl : `${publicBaseUrl}/${relative}`\n },\n\n async get(key: string): Promise<Uint8Array | undefined> {\n return objects.get(key)?.body\n },\n\n async getWithMeta(key: string): Promise<GetObjectResult | undefined> {\n const found = objects.get(key)\n if (found === undefined) return undefined\n return {\n body: found.body,\n meta: {\n etag: found.etag,\n ...(found.contentType !== undefined && { contentType: found.contentType }),\n ...(found.contentEncoding !== undefined && { contentEncoding: found.contentEncoding }),\n ...(found.cacheControl !== undefined && { cacheControl: found.cacheControl }),\n contentLength: found.body.byteLength,\n ...(found.metadata !== undefined && { metadata: found.metadata }),\n },\n }\n },\n\n async stat(key: string): Promise<ObjectMeta | undefined> {\n const found = objects.get(key)\n if (found === undefined) return undefined\n return {\n etag: found.etag,\n contentLength: found.body.byteLength,\n ...(found.contentType !== undefined && { contentType: found.contentType }),\n ...(found.cacheControl !== undefined && { cacheControl: found.cacheControl }),\n }\n },\n\n async put(\n key: string,\n body: string | Uint8Array,\n putOptions?: PutObjectOptions,\n ): Promise<PutObjectResult> {\n const existing = objects.get(key)\n if (putOptions?.ifNotExists === true && existing !== undefined) {\n throw new ConditionalWriteError(key)\n }\n if (\n putOptions?.ifMatch !== undefined\n && (existing === undefined || existing.etag !== putOptions.ifMatch)\n ) {\n throw new ConditionalWriteError(key)\n }\n const etag = nextEtag()\n objects.set(key, {\n body: toBytes(body),\n etag,\n ...(putOptions?.contentType !== undefined && { contentType: putOptions.contentType }),\n ...(putOptions?.contentEncoding !== undefined\n && { contentEncoding: putOptions.contentEncoding }),\n ...(putOptions?.cacheControl !== undefined && { cacheControl: putOptions.cacheControl }),\n ...(putOptions?.metadata !== undefined && { metadata: putOptions.metadata }),\n })\n return { etag }\n },\n\n async delete(key: string): Promise<void> {\n objects.delete(key)\n },\n\n async list(listPrefix?: string): Promise<string[]> {\n const keys: string[] = []\n for await (const key of this.listAsync(listPrefix)) keys.push(key)\n return keys\n },\n\n async listPage(pageOptions: ListPageOptions = {}): Promise<ListPage> {\n const p = pageOptions.prefix ?? ''\n let keys = [...objects.keys()].filter(k => k.startsWith(p)).sort()\n if (pageOptions.continuationToken !== undefined) {\n const idx = keys.indexOf(pageOptions.continuationToken)\n keys = idx === -1 ? keys : keys.slice(idx + 1)\n }\n const max = pageOptions.maxKeys ?? keys.length\n const page = keys.slice(0, max)\n const isTruncated = keys.length > max\n return {\n keys: page,\n isTruncated,\n ...(isTruncated && page.length > 0\n && { continuationToken: page.at(-1) }),\n }\n },\n\n async* listAsync(listPrefix?: string): AsyncIterable<string> {\n let token: string | undefined\n do {\n const page = await this.listPage({\n ...(listPrefix !== undefined && { prefix: listPrefix }),\n ...(token !== undefined && { continuationToken: token }),\n maxKeys: 100,\n })\n for (const key of page.keys) yield key\n token = page.continuationToken\n } while (token !== undefined)\n },\n }\n}\n", "import type { S3Client, S3ClientConfig as AwsS3ClientConfig } from '@aws-sdk/client-s3'\n\n/**\nLogical store roles in a dapp backend.\n*/\nexport const DAPP_STORE_ROLES = ['data', 'state', 'index'] as const\nexport type DappStoreRole = typeof DAPP_STORE_ROLES[number]\n\n/**\n * Physical binding for one logical role. A role maps to an arbitrary bucket\n * name and optional key prefix so projects can use either three independent\n * buckets or one shared bucket with three prefixes.\n */\nexport interface DappStoreBinding {\n /**\n Physical S3/R2 bucket name.\n */\n bucket: string\n /**\n * Optional key prefix inside the bucket (no leading slash). Trailing slashes\n * are normalized. Example: `my-dapp/state`.\n */\n prefix?: string\n /**\n * Optional public CDN / anonymous-read base URL for this role\n * (e.g. `https://cdn.example.com/state`). Distinct from the private S3 API\n * endpoint used for writes.\n */\n publicBaseUrl?: string\n}\n\n/**\nObject metadata returned by stat/get and accepted on put.\n*/\nexport interface ObjectMeta {\n cacheControl?: string\n contentEncoding?: string\n contentLength?: number\n contentType?: string\n etag?: string\n lastModified?: Date\n /**\n User metadata (S3 `x-amz-meta-*`); keys are lower-cased by providers.\n */\n metadata?: Record<string, string>\n}\n\nexport interface PutObjectOptions {\n cacheControl?: string\n contentEncoding?: string\n contentType?: string\n /**\n * Only write when the object's current ETag matches. Supported when the\n * provider honors conditional PutObject; otherwise the write is unconditional.\n */\n ifMatch?: string\n /**\n * Only create when the key does not exist (`If-None-Match: *`). Supported\n * when the provider honors conditional PutObject.\n */\n ifNotExists?: boolean\n metadata?: Record<string, string>\n}\n\nexport interface PutObjectResult {\n etag?: string\n}\n\nexport interface GetObjectResult {\n body: Uint8Array\n meta: ObjectMeta\n}\n\nexport interface ListPageOptions {\n continuationToken?: string\n maxKeys?: number\n /**\n Relative prefix under the role binding (not the full physical key).\n */\n prefix?: string\n}\n\nexport interface ListPage {\n continuationToken?: string\n isTruncated: boolean\n /**\n Relative keys (binding prefix stripped).\n */\n keys: string[]\n}\n\n/**\n * Shared S3 client configuration for production stores. Prefer injecting a\n * single {@link S3Client} (or a credential provider) rather than letting\n * dapp-core own secrets. Credentials must never be logged or embedded in\n * published configuration.\n */\nexport interface S3ClientConfig {\n /**\n * Pre-built client shared across all role stores. When set, endpoint/region/\n * credentials/forcePathStyle are ignored for client construction.\n */\n client?: S3Client\n credentials?: AwsS3ClientConfig['credentials']\n /**\n Private S3-compatible API origin, e.g. `https://<account>.r2.cloudflarestorage.com`.\n */\n endpoint?: string\n forcePathStyle?: boolean\n /**\n * When true (default if the client was constructed here), locator/store\n * `destroy()` releases the client. Injected clients default to false.\n */\n ownClient?: boolean\n region?: string\n}\n\nexport interface DappStoreBindings {\n data: DappStoreBinding\n index: DappStoreBinding\n state: DappStoreBinding\n}\n", "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", "import { randomUUID } from 'node:crypto'\n\nimport type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { canonicalHeadBytes } from './canonicalHead.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n GENERATION_MANIFEST_SCHEMA,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n} from './constants.ts'\nimport type { LeaseHandle } from './safety.ts'\nimport { assertPublicationSafety } from './safety.ts'\nimport type {\n GenerationManifest,\n HeadManifest,\n PublishGenerationInput,\n PublishGenerationResult,\n} from './types.ts'\nimport { writeImmutableObjects, writeManifest } from './writeGenerationObjects.ts'\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new Error('Publication aborted')\n }\n}\n\nasync function acquireLeaseIfNeeded(\n input: PublishGenerationInput,\n): Promise<LeaseHandle | undefined> {\n if (input.safety.mode !== 'lease') return undefined\n return await input.safety.lease.acquire({\n key: HEAD_KEY,\n ttlMs: 60_000,\n ...(input.signal !== undefined && { signal: input.signal }),\n })\n}\n\nasync function buildAndSignHead(\n input: PublishGenerationInput,\n generation: string,\n manifestKey: string,\n manifestHash: string,\n publishedAt: string,\n): Promise<HeadManifest> {\n const trustMode = input.trust?.mode ?? 'trusted-origin'\n const head: HeadManifest = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation,\n layout: 'full',\n manifestKey,\n manifestHash,\n publishedAt,\n trust: trustMode,\n ...(input.previousGeneration !== undefined\n && { previousGeneration: input.previousGeneration }),\n ...(input.revision !== undefined && { revision: input.revision }),\n }\n if (input.trust?.mode === 'signed') {\n head.signature = await input.trust.sign(canonicalHeadBytes(head))\n }\n return head\n}\n\nasync function writeObjectsAndManifest(\n input: PublishGenerationInput,\n generation: string,\n fenced: boolean,\n): Promise<\n | { manifest: GenerationManifest; manifestHash: string; manifestKey: string; ok: true }\n | PublishGenerationResult\n> {\n const signal = input.signal\n const stateRefs = await writeImmutableObjects(input.state, 'state', generation, input.stateObjects ?? [], signal, fenced)\n const indexRefs = await writeImmutableObjects(input.index, 'index', generation, input.indexObjects ?? [], signal, fenced)\n const publishedAt = new Date().toISOString()\n const manifest: GenerationManifest = {\n schema: GENERATION_MANIFEST_SCHEMA,\n generation,\n publishedAt,\n reducer: {\n name: input.reducer.name,\n ...(input.reducer.version !== undefined && { version: input.reducer.version }),\n },\n ...(input.schemaVersion !== undefined && { schemaVersion: input.schemaVersion }),\n source: input.source ?? {},\n objects: [...stateRefs, ...indexRefs],\n }\n const manifestKey = `${GENERATIONS_PREFIX}/${generation}/manifest.json`\n const manifestBody = `${JSON.stringify(manifest, null, 2)}\\n`\n const manifestHash = hashBytes(manifestBody)\n assertNotAborted(signal)\n try {\n await writeManifest(input.state, manifestKey, manifestBody, fenced)\n } catch (error) {\n if (error instanceof Error && error.message.includes('Immutable create-only collision')) {\n return {\n ok: false,\n conflict: {\n kind: 'immutable-collision',\n message: error.message,\n key: manifestKey,\n },\n }\n }\n throw error\n }\n return {\n ok: true, manifest, manifestKey, manifestHash,\n }\n}\n\nasync function releaseLease(handle: LeaseHandle | undefined): Promise<void> {\n if (handle === undefined) return\n try {\n await handle.release()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Publish state and index as one coherent immutable generation, then atomically\n * expose that generation by writing the validated head last under the selected\n * fencing mode.\n */\nexport async function publishGeneration(\n input: PublishGenerationInput,\n): Promise<PublishGenerationResult> {\n const generation = input.generation ?? randomUUID()\n const signal = input.signal\n assertNotAborted(signal)\n if (input.assertSafety !== false && input.safety.mode === 'conditional-head') {\n await assertPublicationSafety(input.state, input.safety)\n }\n const fenced = input.safety.mode !== 'unfenced'\n const leaseHandle = await acquireLeaseIfNeeded(input)\n try {\n const written = await writeObjectsAndManifest(input, generation, fenced)\n if (!written.ok) return written\n const head = await buildAndSignHead(input, generation, written.manifestKey, written.manifestHash, written.manifest.publishedAt)\n assertNotAborted(signal)\n const committed = await commitHead(input.state, head, input.safety, fenced, input.expectedHeadEtag)\n if ('conflict' in committed) {\n return { ok: false, conflict: committed.conflict }\n }\n return {\n ok: true,\n generation,\n manifest: written.manifest,\n manifestKey: written.manifestKey,\n manifestHash: written.manifestHash,\n head,\n headKey: HEAD_KEY,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('Immutable create-only collision')) {\n return {\n ok: false,\n conflict: {\n kind: 'immutable-collision',\n message: error.message,\n },\n }\n }\n if (signal?.aborted === true) {\n return {\n ok: false,\n conflict: {\n kind: 'aborted',\n message: error instanceof Error ? error.message : 'Publication aborted',\n },\n }\n }\n throw error\n } finally {\n await releaseLease(leaseHandle)\n }\n}\n\n/**\n * Load and validate the current head, then the generation manifest (full layout)\n * or map root (incremental-cas). Verifies the pointed-to object hash.\n */\nexport async function readPublishedHead(\n state: DappObjectWriter,\n): Promise<{\n head: HeadManifest\n headEtag?: string\n manifest?: GenerationManifest\n} | undefined> {\n const withMeta = await state.getWithMeta(HEAD_KEY)\n if (withMeta === undefined) return undefined\n const head = JSON.parse(new TextDecoder().decode(withMeta.body)) as HeadManifest\n if (head.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(head.schema)}`)\n }\n const targetBody = await state.get(head.manifestKey)\n if (targetBody === undefined) {\n throw new Error(`Head points at missing object \"${head.manifestKey}\"`)\n }\n const targetBytes = typeof targetBody === 'string'\n ? new TextEncoder().encode(targetBody)\n : targetBody\n const actualHash = hashBytes(targetBytes)\n if (actualHash !== head.manifestHash) {\n throw new Error(\n `Head target hash mismatch for generation \"${head.generation}\": `\n + `head=${head.manifestHash} actual=${actualHash}`,\n )\n }\n if (head.layout === 'incremental-cas') {\n return {\n head,\n ...(withMeta.meta.etag !== undefined && { headEtag: withMeta.meta.etag }),\n }\n }\n const manifest = JSON.parse(new TextDecoder().decode(targetBytes)) as GenerationManifest\n if (manifest.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(manifest.schema)}`)\n }\n if (manifest.generation !== head.generation) {\n throw new Error(\n `Generation id mismatch: head=${head.generation} manifest=${manifest.generation}`,\n )\n }\n return {\n head,\n manifest,\n ...(withMeta.meta.etag !== undefined && { headEtag: withMeta.meta.etag }),\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { CACHE_CONTROL_REVALIDATE, HEAD_KEY } from './constants.ts'\nimport type { PublicationConflict, PublicationSafety } from './safety.ts'\nimport type { HeadManifest } from './types.ts'\n\nexport async function commitHead(\n state: DappObjectWriter,\n head: HeadManifest,\n safety: PublicationSafety,\n fenced: boolean,\n expectedHeadEtag: string | undefined,\n): Promise<{ etag?: string } | { conflict: PublicationConflict }> {\n const headBody = `${JSON.stringify(head, null, 2)}\\n`\n const base = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n }\n try {\n if (!fenced) {\n return await state.put(HEAD_KEY, headBody, base)\n }\n if (expectedHeadEtag === undefined) {\n return await state.put(HEAD_KEY, headBody, { ...base, ifNotExists: true })\n }\n return await state.put(HEAD_KEY, headBody, { ...base, ifMatch: expectedHeadEtag })\n } catch (error) {\n if (error instanceof ConditionalWriteError) {\n return {\n conflict: {\n kind: safety.mode === 'lease' ? 'lease' : 'head-cas',\n message: `Head publish conflict on \"${HEAD_KEY}\" (stale or concurrent writer)`,\n key: HEAD_KEY,\n },\n }\n }\n throw error\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\n\n/**\n * How publication fences concurrent writers.\n *\n * - `conditional-head` \u2014 production CAS via If-Match / If-None-Match on head\n * - `lease` \u2014 injected fencing token for providers without reliable head CAS\n * - `unfenced` \u2014 **development only** (local s3rver); never use in production\n */\nexport type PublicationSafety\n = | { mode: 'conditional-head' }\n | { lease: PublicationLease; mode: 'lease' }\n | { mode: 'unfenced' }\n\nexport interface PublicationLease {\n acquire(opts: {\n key: string\n signal?: AbortSignal\n ttlMs: number\n }): Promise<LeaseHandle>\n}\n\nexport interface LeaseHandle {\n readonly token: string\n release(): Promise<void>\n}\n\nexport type PublicationConflictKind\n = | 'head-cas'\n | 'lease'\n | 'immutable-collision'\n | 'aborted'\n\nexport interface PublicationConflict {\n key?: string\n kind: PublicationConflictKind\n message: string\n}\n\nexport type PublicationTrust\n = | { mode: 'trusted-origin' }\n | {\n mode: 'signed'\n sign: (canonicalBytes: Uint8Array) => Promise<string> | string\n }\n\nexport interface PublicationCapabilities {\n conditionalCreate: boolean\n conditionalUpdate: boolean\n}\n\nconst PROBE_PREFIX = '.aries-dapp-probe/'\n\n/**\n * Probe whether the store honors create-only and if-match updates. Production\n * publication should fail closed when the selected safety mode needs a\n * capability the provider lacks.\n */\nexport async function probePublicationCapabilities(\n store: DappObjectWriter,\n): Promise<PublicationCapabilities> {\n const key = `${PROBE_PREFIX}${Date.now()}-${Math.random().toString(36).slice(2)}`\n let conditionalCreate = false\n let conditionalUpdate = false\n try {\n const created = await store.put(key, 'probe-v1', {\n ifNotExists: true,\n contentType: 'text/plain',\n })\n try {\n await store.put(key, 'probe-v1-again', { ifNotExists: true })\n // Second create-only succeeded \u2192 provider ignored If-None-Match\n } catch (error) {\n conditionalCreate = error instanceof ConditionalWriteError\n }\n const etag = created.etag\n if (etag !== undefined) {\n try {\n await store.put(key, 'probe-v2', {\n ifMatch: etag,\n contentType: 'text/plain',\n })\n try {\n await store.put(key, 'probe-stale', {\n ifMatch: '\"not-the-etag\"',\n contentType: 'text/plain',\n })\n } catch (error) {\n conditionalUpdate = error instanceof ConditionalWriteError\n }\n } catch {\n // update path unsupported\n }\n }\n } catch {\n // create path unsupported\n }\n try {\n await store.put(key, '', { contentType: 'text/plain' })\n } catch {\n // ignore cleanup\n }\n return { conditionalCreate, conditionalUpdate }\n}\n\n/**\n * Assert the selected safety mode is supported. Throws when production would\n * otherwise silently degrade to unconditional puts.\n */\nexport async function assertPublicationSafety(\n store: DappObjectWriter,\n safety: PublicationSafety,\n capabilities?: PublicationCapabilities,\n): Promise<PublicationCapabilities> {\n if (safety.mode === 'unfenced') {\n return { conditionalCreate: false, conditionalUpdate: false }\n }\n if (safety.mode === 'lease') {\n return capabilities ?? await probePublicationCapabilities(store)\n }\n const caps = capabilities ?? await probePublicationCapabilities(store)\n if (!caps.conditionalCreate || !caps.conditionalUpdate) {\n throw new Error(\n 'Publication safety mode \"conditional-head\" requires provider support for '\n + 'create-only (If-None-Match: *) and conditional update (If-Match). '\n + 'Probe failed; refuse to publish without fencing. Use an injected lease '\n + 'adapter, or fix provider configuration.',\n )\n }\n return caps\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport type { PutObjectOptions, PutObjectResult } from '../providers/types.ts'\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\n/**\n * Create-only put for immutable generation objects. If the key already exists\n * with identical bytes, treats the write as an idempotent success. If bytes\n * differ, throws without overwriting published content.\n */\nexport async function putCreateOnly(\n store: DappObjectWriter,\n key: string,\n body: string | Uint8Array,\n options?: Omit<PutObjectOptions, 'ifNotExists' | 'ifMatch'>,\n): Promise<PutObjectResult & { hash: string }> {\n const bytes = toBytes(body)\n const hash = hashBytes(bytes)\n try {\n const result = await store.put(key, bytes, {\n ...options,\n ifNotExists: true,\n })\n return { ...result, hash }\n } catch (error) {\n if (!(error instanceof ConditionalWriteError)) throw error\n const existing = await store.get(key)\n if (existing === undefined) {\n throw new Error(\n `Immutable create-only collision on \"${key}\" (object missing after precondition failure)`,\n { cause: error },\n )\n }\n if (bytesEqual(existing, bytes)) {\n const meta = await store.stat(key)\n return { hash, ...(meta?.etag !== undefined && { etag: meta.etag }) }\n }\n throw new Error(\n `Immutable create-only collision on \"${key}\": existing bytes differ `\n + `(wanted hash ${hash}, existing hash ${hashBytes(existing)})`,\n { cause: error },\n )\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { CACHE_CONTROL_IMMUTABLE, GENERATIONS_PREFIX } from './constants.ts'\nimport { putCreateOnly } from './putCreateOnly.ts'\nimport type { GenerationObjectRef, PublishObjectInput } from './types.ts'\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new Error('Publication aborted')\n }\n}\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nexport async function writeImmutableObjects(\n store: DappObjectWriter,\n role: 'state' | 'index',\n generation: string,\n objects: readonly PublishObjectInput[],\n signal: AbortSignal | undefined,\n fenced: boolean,\n): Promise<GenerationObjectRef[]> {\n const refs: GenerationObjectRef[] = []\n for (const object of objects) {\n assertNotAborted(signal)\n const relativeKey = `${GENERATIONS_PREFIX}/${generation}/${object.key.replaceAll(/^\\/+/g, '')}`\n const bytes = toBytes(object.body)\n const contentType = object.contentType ?? 'application/json'\n const putOpts = {\n contentType,\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n ...(object.metadata !== undefined && { metadata: object.metadata }),\n }\n let hash: string\n if (fenced) {\n hash = (await putCreateOnly(store, relativeKey, bytes, putOpts)).hash\n } else {\n hash = hashBytes(bytes)\n await store.put(relativeKey, bytes, putOpts)\n }\n const publicUrl = store.publicUrl(relativeKey)\n refs.push({\n role,\n key: relativeKey,\n hash,\n size: bytes.byteLength,\n contentType,\n ...(publicUrl !== undefined && { publicUrl }),\n })\n }\n return refs\n}\n\nexport async function writeManifest(\n store: DappObjectWriter,\n manifestKey: string,\n manifestBody: string,\n fenced: boolean,\n): Promise<void> {\n const opts = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n }\n if (fenced) {\n await putCreateOnly(store, manifestKey, manifestBody, opts)\n return\n }\n await store.put(manifestKey, manifestBody, opts)\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n CACHE_CONTROL_REVALIDATE,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n PINS_KEY,\n PINS_SCHEMA,\n RECEIPTS_PREFIX,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport type { PublicationSafety } from './safety.ts'\nimport type { HeadManifest } from './types.ts'\n\nexport interface ReleasePin {\n generation: string\n pinnedAt: string\n reason?: string\n}\n\nexport interface PinsDocument {\n pins: ReleasePin[]\n schema: typeof PINS_SCHEMA\n updatedAt: string\n}\n\nexport interface ReleaseSummary {\n generation: string\n kind: 'full' | 'incremental' | 'unknown'\n manifestKey?: string\n receiptKey?: string\n}\n\nasync function readPins(state: DappObjectWriter): Promise<{ doc: PinsDocument; etag?: string }> {\n const found = await state.getWithMeta(PINS_KEY)\n if (found === undefined) {\n return {\n doc: {\n schema: PINS_SCHEMA,\n pins: [],\n updatedAt: new Date().toISOString(),\n },\n }\n }\n const doc = JSON.parse(new TextDecoder().decode(found.body)) as PinsDocument\n return {\n doc,\n ...(found.meta.etag !== undefined && { etag: found.meta.etag }),\n }\n}\n\nasync function writePins(\n state: DappObjectWriter,\n doc: PinsDocument,\n expectedEtag?: string,\n): Promise<void> {\n const body = `${JSON.stringify(doc, null, 2)}\\n`\n const opts = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n ...(expectedEtag === undefined\n ? { ifNotExists: true as const }\n : { ifMatch: expectedEtag }),\n }\n try {\n await state.put(PINS_KEY, body, opts)\n } catch (error) {\n if (error instanceof ConditionalWriteError && expectedEtag === undefined) {\n // First write raced; retry as update after re-read is caller's concern.\n }\n throw error\n }\n}\n\n/**\nList committed full generations and incremental receipts under the state role.\n*/\nexport async function listReleases(state: DappObjectWriter): Promise<ReleaseSummary[]> {\n const byGen = new Map<string, ReleaseSummary>()\n for await (const key of state.listAsync(`${GENERATIONS_PREFIX}/`)) {\n // generations/<id>/manifest.json or generations/<id>/\u2026\n const parts = key.split('/')\n if (parts.length < 3 || parts[0] !== GENERATIONS_PREFIX) continue\n const generation = parts[1]!\n const existing = byGen.get(generation) ?? { generation, kind: 'full' as const }\n if (parts[2] === 'manifest.json') {\n existing.manifestKey = key\n existing.kind = 'full'\n }\n byGen.set(generation, existing)\n }\n for await (const key of state.listAsync(`${RECEIPTS_PREFIX}/`)) {\n // receipts/<id>.json\n const base = key.slice(RECEIPTS_PREFIX.length + 1).replace(/\\.json$/, '')\n if (base.length === 0) continue\n const existing = byGen.get(base) ?? { generation: base, kind: 'incremental' as const }\n existing.receiptKey = key\n if (existing.manifestKey === undefined) existing.kind = 'incremental'\n byGen.set(base, existing)\n }\n return [...byGen.values()].sort((a, b) => a.generation.localeCompare(b.generation))\n}\n\n/**\nPin a generation so retention/GC will not delete it.\n*/\nexport async function pinRelease(\n state: DappObjectWriter,\n generation: string,\n opts?: { reason?: string },\n): Promise<PinsDocument> {\n const { doc, etag } = await readPins(state)\n if (doc.pins.some(p => p.generation === generation)) return doc\n const next: PinsDocument = {\n schema: PINS_SCHEMA,\n updatedAt: new Date().toISOString(),\n pins: [\n ...doc.pins,\n {\n generation,\n pinnedAt: new Date().toISOString(),\n ...(opts?.reason !== undefined && { reason: opts.reason }),\n },\n ],\n }\n await writePins(state, next, etag)\n return next\n}\n\n/**\nRemove a pin. Does not change head.\n*/\nexport async function unpinRelease(\n state: DappObjectWriter,\n generation: string,\n): Promise<PinsDocument> {\n const { doc, etag } = await readPins(state)\n const next: PinsDocument = {\n schema: PINS_SCHEMA,\n updatedAt: new Date().toISOString(),\n pins: doc.pins.filter(p => p.generation !== generation),\n }\n await writePins(state, next, etag)\n return next\n}\n\nexport async function listPins(state: DappObjectWriter): Promise<readonly ReleasePin[]> {\n return (await readPins(state)).doc.pins\n}\n\nexport interface RollbackHeadInput {\n expectedHeadEtag?: string\n /**\n When true, skip capability checks for unfenced/dev stores.\n */\n safety: PublicationSafety\n targetGeneration: string\n}\n\n/**\n * Conditionally set head to a prior complete generation without rewriting\n * immutable generation objects. Head remains publication authority.\n */\nexport async function rollbackHead(\n state: DappObjectWriter,\n input: RollbackHeadInput,\n): Promise<{ head: HeadManifest; headEtag?: string; ok: true } | { message: string; ok: false }> {\n const current = await readPublishedHead(state)\n if (current === undefined) {\n return { ok: false, message: 'No current head to roll back' }\n }\n if (current.head.generation === input.targetGeneration) {\n return {\n ok: true, head: current.head, ...(current.headEtag !== undefined && { headEtag: current.headEtag }),\n }\n }\n\n const manifestKey = `${GENERATIONS_PREFIX}/${input.targetGeneration}/manifest.json`\n const receiptKey = `${RECEIPTS_PREFIX}/${input.targetGeneration}.json`\n const manifestBody = await state.get(manifestKey)\n const receiptBody = manifestBody === undefined ? await state.get(receiptKey) : undefined\n\n let head: HeadManifest\n if (manifestBody !== undefined) {\n const bytes = typeof manifestBody === 'string'\n ? new TextEncoder().encode(manifestBody)\n : manifestBody\n const parsed = JSON.parse(new TextDecoder().decode(bytes)) as { generation?: string }\n if (parsed.generation !== input.targetGeneration) {\n return { ok: false, message: 'Target manifest generation mismatch' }\n }\n head = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: input.targetGeneration,\n manifestKey,\n manifestHash: hashBytes(bytes),\n publishedAt: new Date().toISOString(),\n previousGeneration: current.head.generation,\n trust: current.head.trust ?? 'trusted-origin',\n revision: (current.head.revision ?? 1) + 1,\n layout: 'full',\n }\n } else if (receiptBody === undefined) {\n return { ok: false, message: `Target generation \"${input.targetGeneration}\" not found` }\n } else {\n const receipt = JSON.parse(new TextDecoder().decode(receiptBody)) as {\n generation: string\n rootHash: string\n rootKey: string\n }\n head = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: receipt.generation,\n manifestKey: receipt.rootKey,\n manifestHash: receipt.rootHash,\n publishedAt: new Date().toISOString(),\n previousGeneration: current.head.generation,\n trust: current.head.trust ?? 'trusted-origin',\n revision: (current.head.revision ?? 1) + 1,\n layout: 'incremental-cas',\n }\n }\n\n const fenced = input.safety.mode !== 'unfenced'\n const etag = input.expectedHeadEtag ?? current.headEtag\n const committed = await commitHead(state, head, input.safety, fenced, etag)\n if ('conflict' in committed) {\n return { ok: false, message: committed.conflict.message }\n }\n return {\n ok: true,\n head,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n}\n\nexport { HEAD_KEY, PINS_KEY }\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport {\n CAS_PREFIX,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_ROOTS_PREFIX,\n MAP_SHARDS_PREFIX,\n PINS_KEY,\n RECEIPTS_PREFIX,\n STATUS_KEY,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport { listPins } from './releases.ts'\n\nexport type RetentionPolicy\n = | { mode: 'forever' }\n | {\n cdnGraceMs: number\n mode: 'bounded'\n /**\n Minimum number of recent full/incremental generations to keep beyond active.\n */\n retainGenerations: number\n }\n\nexport interface GcKeyRef {\n key: string\n reason?: string\n role: 'state' | 'index'\n}\n\nexport interface GcPlan {\n deleteKeys: GcKeyRef[]\n policy: RetentionPolicy\n retainKeys: GcKeyRef[]\n}\n\nexport interface GcRunResult {\n deleted: GcKeyRef[]\n dryRun: boolean\n skipped: GcKeyRef[]\n}\n\nconst PROTECTED_KEYS = new Set([HEAD_KEY, STATUS_KEY, PINS_KEY])\n\nfunction generationFromKey(key: string): string | undefined {\n if (key.startsWith(`${GENERATIONS_PREFIX}/`)) {\n return key.split('/', 2)[1]\n }\n if (key.startsWith(`${RECEIPTS_PREFIX}/`) && key.endsWith('.json')) {\n return key.slice(RECEIPTS_PREFIX.length + 1, -'.json'.length)\n }\n return undefined\n}\n\nasync function collectGenerationKeys(\n store: DappObjectWriter,\n generation: string,\n): Promise<string[]> {\n const keys: string[] = []\n for await (const key of store.listAsync(`${GENERATIONS_PREFIX}/${generation}/`)) {\n keys.push(key)\n }\n const receipt = `${RECEIPTS_PREFIX}/${generation}.json`\n if (await store.stat(receipt) !== undefined) keys.push(receipt)\n return keys\n}\n\nasync function collectCasAndMapFromHead(\n state: DappObjectWriter,\n index: DappObjectWriter | undefined,\n generation: string,\n): Promise<{ indexKeys: string[]; stateKeys: string[] }> {\n const stateKeys: string[] = []\n const indexKeys: string[] = []\n // Full layout objects under generations/\n stateKeys.push(...await collectGenerationKeys(state, generation))\n if (index !== undefined) {\n for await (const key of index.listAsync(`${GENERATIONS_PREFIX}/${generation}/`)) {\n indexKeys.push(key)\n }\n }\n // Incremental: receipt \u2192 root \u2192 shards \u2192 cas refs\n const receiptKey = `${RECEIPTS_PREFIX}/${generation}.json`\n const receiptBody = await state.get(receiptKey)\n if (receiptBody === undefined) {\n return { stateKeys, indexKeys }\n }\n stateKeys.push(receiptKey)\n const receipt = JSON.parse(new TextDecoder().decode(receiptBody)) as {\n objects?: { key: string; role: string }[]\n rootHash?: string\n rootKey?: string\n }\n if (receipt.rootKey !== undefined) stateKeys.push(receipt.rootKey)\n if (receipt.rootHash !== undefined) {\n const rootKey = receipt.rootKey ?? `${MAP_ROOTS_PREFIX}/${receipt.rootHash}.json`\n const rootBody = await state.get(rootKey)\n if (rootBody !== undefined) {\n const root = JSON.parse(new TextDecoder().decode(rootBody)) as {\n shards?: Record<string, string>\n }\n for (const shardHash of Object.values(root.shards ?? {})) {\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n stateKeys.push(shardKey)\n // Shards may live on index role in some layouts; check both.\n const shardBody = await state.get(shardKey)\n ?? (index === undefined ? undefined : await index.get(shardKey))\n if (shardBody === undefined) continue\n const shard = JSON.parse(new TextDecoder().decode(shardBody)) as {\n entries?: Record<string, { hash: string }>\n }\n for (const entry of Object.values(shard.entries ?? {})) {\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n indexKeys.push(casKey)\n stateKeys.push(casKey)\n }\n }\n }\n }\n for (const obj of receipt.objects ?? []) {\n if (obj.role === 'index') indexKeys.push(obj.key)\n else stateKeys.push(obj.key)\n }\n return { stateKeys, indexKeys }\n}\n\n/**\n * Plan garbage collection of derived state/index objects. Never touches the\n * data role. Protects active head, pins, and an optional in-flight generation.\n */\n/* eslint-disable max-statements, complexity -- GC planning is intentionally a single pass over live sets */\nexport async function planGarbageCollection(options: {\n inFlightGeneration?: string\n index?: DappObjectWriter\n policy: RetentionPolicy\n state: DappObjectWriter\n}): Promise<GcPlan> {\n const {\n state, index, policy, inFlightGeneration,\n } = options\n if (policy.mode === 'forever') {\n return {\n policy, deleteKeys: [], retainKeys: [],\n }\n }\n\n const head = await readPublishedHead(state)\n const pins = await listPins(state)\n const protectedGens = new Set<string>()\n if (head !== undefined) protectedGens.add(head.head.generation)\n if (head?.head.previousGeneration !== undefined) {\n protectedGens.add(head.head.previousGeneration)\n }\n for (const pin of pins) protectedGens.add(pin.generation)\n if (inFlightGeneration !== undefined) protectedGens.add(inFlightGeneration)\n\n // Keep N most recent generations by listing releases (lexicographic id order is\n // not time order; prefer receipt/manifest listing order by key and retain count).\n const allGenKeys = await state.list(`${GENERATIONS_PREFIX}/`)\n const genIds = new Set<string>()\n for (const key of allGenKeys) {\n const id = generationFromKey(key)\n if (id !== undefined) genIds.add(id)\n }\n for await (const key of state.listAsync(`${RECEIPTS_PREFIX}/`)) {\n const id = generationFromKey(key)\n if (id !== undefined) genIds.add(id)\n }\n const ordered = [...genIds].sort()\n const retainTail = ordered.slice(-policy.retainGenerations)\n for (const id of retainTail) protectedGens.add(id)\n\n const liveState = new Set<string>(PROTECTED_KEYS)\n const liveIndex = new Set<string>()\n for (const gen of protectedGens) {\n const collected = await collectCasAndMapFromHead(state, index, gen)\n for (const k of collected.stateKeys) liveState.add(k)\n for (const k of collected.indexKeys) liveIndex.add(k)\n }\n\n const deleteKeys: GcKeyRef[] = []\n const retainKeys: GcKeyRef[] = []\n\n for await (const key of state.listAsync()) {\n if (PROTECTED_KEYS.has(key)) {\n retainKeys.push({\n role: 'state', key, reason: 'protected-well-known',\n })\n continue\n }\n if (liveState.has(key)) {\n retainKeys.push({\n role: 'state', key, reason: 'live',\n })\n continue\n }\n // Grace: if key has gen still protected, skip (already handled). Else delete.\n const gen = generationFromKey(key)\n if (gen !== undefined && protectedGens.has(gen)) {\n retainKeys.push({\n role: 'state', key, reason: 'protected-generation',\n })\n continue\n }\n deleteKeys.push({\n role: 'state', key, reason: 'unreferenced',\n })\n }\n\n if (index !== undefined) {\n for await (const key of index.listAsync()) {\n if (liveIndex.has(key)) {\n retainKeys.push({\n role: 'index', key, reason: 'live',\n })\n continue\n }\n const gen = generationFromKey(key)\n if (gen !== undefined && protectedGens.has(gen)) {\n retainKeys.push({\n role: 'index', key, reason: 'protected-generation',\n })\n continue\n }\n deleteKeys.push({\n role: 'index', key, reason: 'unreferenced',\n })\n }\n }\n\n // CDN grace is advisory in the plan metadata; callers delay run by cdnGraceMs.\n void policy.cdnGraceMs\n\n return {\n policy, deleteKeys, retainKeys,\n }\n}\n\n/**\nExecute a GC plan. `dryRun: true` (default) only reports; false deletes.\n*/\nexport async function runGarbageCollection(\n plan: GcPlan,\n stores: {\n index?: DappObjectWriter\n state: DappObjectWriter\n },\n opts?: { dryRun?: boolean },\n): Promise<GcRunResult> {\n const dryRun = opts?.dryRun !== false\n const deleted: GcKeyRef[] = []\n const skipped: GcKeyRef[] = []\n if (dryRun) {\n return {\n dryRun: true, deleted: [], skipped: plan.deleteKeys,\n }\n }\n for (const ref of plan.deleteKeys) {\n try {\n const store = ref.role === 'index' ? stores.index : stores.state\n if (store === undefined) {\n skipped.push({ ...ref, reason: 'no-store' })\n continue\n }\n await store.delete(ref.key)\n deleted.push(ref)\n } catch {\n skipped.push(ref)\n }\n }\n return {\n dryRun: false, deleted, skipped,\n }\n}\n", "import { randomUUID } from 'node:crypto'\n\nimport type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { canonicalHeadBytes } from './canonicalHead.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n CACHE_CONTROL_IMMUTABLE,\n CACHE_CONTROL_REVALIDATE,\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_ROOTS_PREFIX,\n MAP_SHARD_SCHEMA,\n MAP_SHARDS_PREFIX,\n RECEIPT_SCHEMA,\n RECEIPTS_PREFIX,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport { putCreateOnly } from './putCreateOnly.ts'\nimport type { PublicationSafety, PublicationTrust } from './safety.ts'\nimport { assertPublicationSafety } from './safety.ts'\nimport { shardIdForKey } from './shard.ts'\nimport type { HeadManifest, PublishObjectInput } from './types.ts'\n\nexport interface MapRoot {\n schema: typeof MAP_ROOT_SCHEMA\n /**\n shardId \u2192 shard content hash\n */\n shards: Record<string, string>\n}\n\nexport interface MapShard {\n entries: Record<string, {\n contentType?: string\n hash: string\n size: number\n }>\n schema: typeof MAP_SHARD_SCHEMA\n}\n\nexport interface GenerationReceipt {\n changedCount: number\n generation: string\n previousGeneration?: string\n publishedAt: string\n reducer: { name: string; version?: string }\n rootHash: string\n rootKey: string\n schema: typeof RECEIPT_SCHEMA\n source?: {\n completedPosition?: string\n cursor?: string\n floor?: string\n observedHead?: string\n }\n}\n\nexport interface PublishIncrementalInput {\n assertSafety?: boolean\n deletedKeys?: readonly string[]\n expectedHeadEtag?: string\n generation?: string\n index: DappObjectWriter\n /**\n Logical key changes for the index role (primary high-cardinality surface).\n */\n indexChanges?: readonly PublishObjectInput[]\n previousGeneration?: string\n reducer: { name: string; version?: string }\n revision?: number\n safety: PublicationSafety\n shardHexChars?: number\n signal?: AbortSignal\n source?: GenerationReceipt['source']\n state: DappObjectWriter\n /**\n Optional small state-role changes (still CAS + sharded).\n */\n stateChanges?: readonly PublishObjectInput[]\n trust?: PublicationTrust\n}\n\nexport type PublishIncrementalResult\n = | {\n generation: string\n head: HeadManifest\n headEtag?: string\n ok: true\n receipt: GenerationReceipt\n root: MapRoot\n rootHash: string\n writes: number\n }\n | {\n conflict: { kind: string; message: string }\n ok: false\n }\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nexport { shardIdForKey } from './shard.ts'\n\nasync function putCas(\n store: DappObjectWriter,\n body: Uint8Array,\n contentType: string,\n fenced: boolean,\n): Promise<{ hash: string; key: string }> {\n const hash = hashBytes(body)\n const key = `${CAS_PREFIX}/${hash}`\n const opts = {\n contentType,\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n }\n if (fenced) {\n await putCreateOnly(store, key, body, opts)\n } else {\n const existing = await store.get(key)\n if (existing === undefined) await store.put(key, body, opts)\n }\n return { hash, key }\n}\n\nasync function loadRoot(state: DappObjectWriter, head: HeadManifest | undefined): Promise<MapRoot> {\n if (head === undefined || head.layout !== 'incremental-cas') {\n return { schema: MAP_ROOT_SCHEMA, shards: {} }\n }\n const body = await state.get(head.manifestKey)\n if (body === undefined) {\n return { schema: MAP_ROOT_SCHEMA, shards: {} }\n }\n return JSON.parse(new TextDecoder().decode(body)) as MapRoot\n}\n\nasync function loadShard(\n state: DappObjectWriter,\n shardHash: string | undefined,\n): Promise<MapShard> {\n if (shardHash === undefined) {\n return { schema: MAP_SHARD_SCHEMA, entries: {} }\n }\n const key = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const body = await state.get(key)\n if (body === undefined) {\n return { schema: MAP_SHARD_SCHEMA, entries: {} }\n }\n return JSON.parse(new TextDecoder().decode(body)) as MapShard\n}\n\n/**\n * Incremental high-cardinality publication: write only changed objects to CAS,\n * update touched shards + root, then fenced head-last commit. Unchanged logical\n * keys keep stable `cas/sha256/<hash>` URLs.\n */\n/* eslint-disable max-statements, complexity -- incremental publish orchestrates CAS/shards/head */\nexport async function publishIncremental(\n input: PublishIncrementalInput,\n): Promise<PublishIncrementalResult> {\n const generation = input.generation ?? randomUUID()\n const fenced = input.safety.mode !== 'unfenced'\n const hexChars = input.shardHexChars ?? DEFAULT_SHARD_HEX_CHARS\n let writes = 0\n\n if (input.assertSafety !== false && input.safety.mode === 'conditional-head') {\n await assertPublicationSafety(input.state, input.safety)\n }\n\n const prior = await readPublishedHead(input.state)\n const root = await loadRoot(input.state, prior?.head)\n const touched = new Map<string, MapShard>()\n\n const applyChange = async (\n store: DappObjectWriter,\n object: PublishObjectInput,\n ): Promise<void> => {\n const logicalKey = object.key.replaceAll(/^\\/+/g, '')\n const bytes = toBytes(object.body)\n const contentType = object.contentType ?? 'application/json'\n const cas = await putCas(store, bytes, contentType, fenced)\n writes += 1\n const sid = shardIdForKey(logicalKey, hexChars)\n let shard = touched.get(sid)\n if (shard === undefined) {\n shard = await loadShard(input.state, root.shards[sid])\n touched.set(sid, shard)\n }\n shard.entries[logicalKey] = {\n hash: cas.hash,\n size: bytes.byteLength,\n contentType,\n }\n }\n\n for (const object of input.indexChanges ?? []) {\n await applyChange(input.index, object)\n }\n for (const object of input.stateChanges ?? []) {\n await applyChange(input.state, object)\n }\n for (const logicalKey of input.deletedKeys ?? []) {\n const sid = shardIdForKey(logicalKey, hexChars)\n let shard = touched.get(sid)\n if (shard === undefined) {\n shard = await loadShard(input.state, root.shards[sid])\n touched.set(sid, shard)\n }\n delete shard.entries[logicalKey]\n }\n\n const nextShards = { ...root.shards }\n for (const [sid, shard] of touched) {\n const shardBody = `${JSON.stringify(shard, null, 2)}\\n`\n const shardHash = hashBytes(shardBody)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n if (fenced) {\n await putCreateOnly(input.state, shardKey, shardBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(shardKey, shardBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n if (Object.keys(shard.entries).length === 0) delete nextShards[sid]\n else nextShards[sid] = shardHash\n }\n\n const nextRoot: MapRoot = { schema: MAP_ROOT_SCHEMA, shards: nextShards }\n const rootBody = `${JSON.stringify(nextRoot, null, 2)}\\n`\n const rootHash = hashBytes(rootBody)\n const rootKey = `${MAP_ROOTS_PREFIX}/${rootHash}.json`\n if (fenced) {\n await putCreateOnly(input.state, rootKey, rootBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(rootKey, rootBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n\n const publishedAt = new Date().toISOString()\n const receipt: GenerationReceipt = {\n schema: RECEIPT_SCHEMA,\n generation,\n publishedAt,\n rootHash,\n rootKey,\n changedCount: (input.indexChanges?.length ?? 0)\n + (input.stateChanges?.length ?? 0)\n + (input.deletedKeys?.length ?? 0),\n reducer: {\n name: input.reducer.name,\n ...(input.reducer.version !== undefined && { version: input.reducer.version }),\n },\n ...(input.previousGeneration !== undefined\n && { previousGeneration: input.previousGeneration }),\n ...(prior?.head.generation !== undefined && input.previousGeneration === undefined\n && { previousGeneration: prior.head.generation }),\n ...(input.source !== undefined && { source: input.source }),\n }\n const receiptBody = `${JSON.stringify(receipt, null, 2)}\\n`\n const receiptKey = `${RECEIPTS_PREFIX}/${generation}.json`\n if (fenced) {\n await putCreateOnly(input.state, receiptKey, receiptBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(receiptKey, receiptBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n\n const trustMode = input.trust?.mode ?? 'trusted-origin'\n const head: HeadManifest = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation,\n layout: 'incremental-cas',\n manifestKey: rootKey,\n manifestHash: rootHash,\n publishedAt,\n trust: trustMode,\n ...(receipt.previousGeneration !== undefined\n && { previousGeneration: receipt.previousGeneration }),\n revision: input.revision\n ?? ((prior?.head.revision ?? 0) + 1),\n }\n if (input.trust?.mode === 'signed') {\n head.signature = await input.trust.sign(canonicalHeadBytes(head))\n }\n\n const committed = await commitHead(\n input.state,\n head,\n input.safety,\n fenced,\n input.expectedHeadEtag ?? prior?.headEtag,\n )\n if ('conflict' in committed) {\n return {\n ok: false,\n conflict: {\n kind: committed.conflict.kind,\n message: committed.conflict.message,\n },\n }\n }\n\n // Also write a small revalidate pointer file for operators (optional).\n void CACHE_CONTROL_REVALIDATE\n void HEAD_KEY\n\n return {\n ok: true,\n generation,\n head,\n receipt,\n root: nextRoot,\n rootHash,\n writes,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n}\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", "import type { Logger } from '@ariestools/sdk'\n\nimport type { DappObjectReader, DappObjectWriter } from '../providers/capabilities.ts'\n\n/**\n * Optional progress a reducer may return after a successful pass. The actor\n * uses it to publish durable indexer status; the cursor must not advance past\n * a fully published generation (the publication helper writes head last).\n */\nexport interface DappReduceProgress {\n cursor?: string\n floor?: string\n generation?: string\n generationRoot?: string\n lastCompletedPosition?: string\n observedSourceHead?: string\n}\n\n/**\nWhat a reducer is handed each pass: the three bucket stores plus a logger.\n*/\nexport interface DappReduceContext {\n /**\n * Immutable reducer input / materialization (may be a datalake replica).\n * Read-only: reducers must not write through this principal.\n */\n data: DappObjectReader\n /**\n Derived, query-optimized views (writable).\n */\n index: DappObjectWriter\n logger: Logger\n /**\n * Abort signal cancelled when the actor stops. Long reducers should check\n * `signal.aborted` or pass it into fetches so shutdown can bound in-flight work.\n */\n signal: AbortSignal\n /**\n Derived current view (writable).\n */\n state: DappObjectWriter\n}\n\n/**\n * The pluggable unit of dapp logic. The DappActor timer calls `reduce` on an\n * interval; an implementation reads the immutable `data` bucket (and/or other\n * authoritative sources) and rebuilds `state` and `index`. Passes should be\n * idempotent and resume from a watermark so a slow or interrupted pass is safe\n * to repeat.\n */\nexport interface DappReducer {\n readonly name: string\n readonly version?: string\n reduce(context: DappReduceContext): Promise<void | DappReduceProgress>\n}\n\n/**\n * Default reducer: does nothing. The local harness runs the full timer/provider\n * spine with this in place; production entrypoints must supply a real reducer.\n * **Development only** \u2014 not a production indexer.\n */\nexport const noopReducer: DappReducer = {\n name: 'noop',\n async reduce(): Promise<void> {\n // no-op: the spine runs, no derivation happens\n },\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["toBytes", "toBytes", "assertNotAborted", "randomUUID", "toBytes", "randomUUID"]
|
|
4
|
+
"sourcesContent": ["import { bootActors } from '@ariestools/actor'\nimport type { CreatableName } from '@ariestools/sdk'\n\nimport type { DappProviderLocator } from '../actor/types.ts'\nimport type { DappActorParams } from '../DappActor.ts'\nimport { DappActor } from '../DappActor.ts'\nimport type { DappReducer } from '../reducer/DappReducer.ts'\n\nexport interface DappActorSpec {\n firstRunDelayMs?: number\n maxConsecutiveFailures?: number\n name: string\n publishStatus?: boolean\n reduceIntervalMs?: number\n reducer: DappReducer\n /**\n * When true (default), run readiness after start so boot completes only when\n * the first reduce pass succeeds (or fails under the failure policy).\n */\n runReady?: boolean\n shutdownTimeoutMs?: number\n}\n\n/**\n * Creates and starts one {@link DappActor} per spec, all sharing the single\n * process-wide locator. A thin wrapper over actor-kit's `bootActors`: on\n * partial failure, actors already started are stopped (with shutdown\n * fallback) before the error is rethrown. Returns them so the caller can\n * stop them on shutdown.\n */\nexport async function bootDappActors(\n locator: DappProviderLocator,\n specs: readonly DappActorSpec[],\n): Promise<DappActor[]> {\n return await bootActors(specs.map((spec) => {\n const params: Partial<DappActorParams> = {\n locator,\n name: spec.name as CreatableName,\n reducer: spec.reducer,\n ...(spec.reduceIntervalMs !== undefined && { reduceIntervalMs: spec.reduceIntervalMs }),\n ...(spec.firstRunDelayMs !== undefined && { firstRunDelayMs: spec.firstRunDelayMs }),\n ...(spec.maxConsecutiveFailures !== undefined\n && { maxConsecutiveFailures: spec.maxConsecutiveFailures }),\n ...(spec.publishStatus !== undefined && { publishStatus: spec.publishStatus }),\n ...(spec.shutdownTimeoutMs !== undefined && { shutdownTimeoutMs: spec.shutdownTimeoutMs }),\n }\n return {\n create: () => DappActor.create(params),\n ...(spec.runReady !== undefined && { runReady: spec.runReady }),\n }\n }))\n}\n", "import type { PeriodicActorParams, PeriodicPassContext } from '@ariestools/actor'\nimport { PeriodicActor } from '@ariestools/actor'\nimport type { Logger } from '@ariestools/sdk'\nimport { assertEx, creatable } from '@ariestools/sdk'\n\nimport type { DappProviderLocator } from './actor/types.ts'\nimport type { DappObjectReader, DappObjectWriter } from './providers/capabilities.ts'\nimport { asReadOnly } from './providers/capabilities.ts'\nimport type { DappBucketStore } from './providers/DappBucketStore.ts'\nimport {\n DappDataStoreMoniker, DappIndexStoreMoniker, DappStateStoreMoniker,\n} from './providers/monikers.ts'\nimport { HEAD_KEY } from './publication/constants.ts'\nimport { readIndexerStatus, writeIndexerStatus } from './publication/status.ts'\nimport { failureStatusFields, successStatusFields } from './publication/statusPatch.ts'\nimport type { DappReduceProgress, DappReducer } from './reducer/DappReducer.ts'\n\nexport interface DappActorParams extends PeriodicActorParams<DappProviderLocator> {\n /**\n * When true (default), publish durable indexer status to the state store\n * after each reduce pass (success or failure).\n */\n publishStatus?: boolean\n /**\n Period between reduce passes. Defaults to 5000ms.\n */\n reduceIntervalMs?: number\n reducer: DappReducer\n}\n\nconst DEFAULT_REDUCE_INTERVAL_MS = 5000\n\nfunction withDefaultGenerationRoot(\n result: DappReduceProgress | undefined,\n): DappReduceProgress | undefined {\n if (result === undefined) return\n if (result.generation === undefined || result.generationRoot !== undefined) return result\n return { ...result, generationRoot: HEAD_KEY }\n}\n\n/**\n * The stock dapp actor: resolves the three bucket stores from the shared\n * locator, then drives its reducer on an interval to keep `state` and `index`\n * derived from authoritative input. The loop policies (first-pass-gated\n * readiness, non-overlap, consecutive-failure self-stop) come from\n * `PeriodicActor`; this class contributes the reduce pass and durable status\n * publication. Multiple actors (each with its own reducer) can share one\n * locator; this is the default single-reducer instance the local daemon boots.\n */\n@creatable()\nexport class DappActor extends PeriodicActor<DappActorParams> {\n static readonly dependencies = [\n DappDataStoreMoniker,\n DappStateStoreMoniker,\n DappIndexStoreMoniker,\n ] as const\n\n protected _data!: DappObjectReader\n protected _index!: DappObjectWriter\n protected _state!: DappObjectWriter\n\n /**\n Dapp actors require a logger in the locator context (see {@link DappContext}).\n */\n override get logger(): Logger {\n return assertEx(super.logger, () => `Logger is required in context for actor ${this.name}.`)\n }\n\n /**\n Reduce cadence: `reduceIntervalMs` names the interval in dapp configs.\n */\n protected override get intervalMs(): number {\n return this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n const dataWriter = await this.locator.getInstance<DappBucketStore>(DappDataStoreMoniker)\n // Defense in depth: data is always presented read-only to reducers.\n this._data = asReadOnly(dataWriter)\n this._state = await this.locator.getInstance<DappBucketStore>(DappStateStoreMoniker)\n this._index = await this.locator.getInstance<DappBucketStore>(DappIndexStoreMoniker)\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n this.logger.info(\n `DappActor started: reducer '${this.params.reducer.name}' every ${this.intervalMs}ms `\n + `(first run in ${this.firstRunDelayMs}ms)`,\n )\n }\n\n /**\n Failure side-channel: publish durable failure status (count already incremented).\n */\n protected override async onPassError(error: Error): Promise<void> {\n await this.safePublishStatus(undefined, error)\n }\n\n protected override async runPass({ signal }: PeriodicPassContext): Promise<void> {\n const result = await this.params.reducer.reduce({\n data: this._data,\n index: this._index,\n logger: this.logger,\n signal,\n state: this._state,\n })\n // Shutdown cancellation is control flow, not a successful reducer result.\n if (signal.aborted) return\n const progress = withDefaultGenerationRoot(result === undefined ? undefined : result)\n await this.safePublishStatus(progress)\n }\n\n private async publishStatusFromProgress(\n progress: DappReduceProgress | undefined,\n error: Error | undefined,\n ): Promise<void> {\n if (this.params.publishStatus === false) return\n let prior: Awaited<ReturnType<typeof readIndexerStatus>>\n try {\n prior = await readIndexerStatus(this._state)\n } catch {\n prior = undefined\n }\n const nowDate = new Date()\n const now = nowDate.toISOString()\n const fields = error === undefined\n ? successStatusFields(progress, prior, now)\n : failureStatusFields(prior, this.consecutiveFailures, error, now)\n await writeIndexerStatus(this._state, fields)\n }\n\n private async safePublishStatus(\n progress?: DappReduceProgress,\n error?: Error,\n ): Promise<void> {\n try {\n await this.publishStatusFromProgress(progress, error)\n } catch (statusError) {\n this.logger.error(`Failed to publish indexer status: ${String(statusError)}`)\n }\n }\n}\n", "import type {\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n} from './types.ts'\n\n/**\n * Read-only object access for one logical dapp store role. Reducers receive the\n * data role as this surface so they cannot write through the source principal.\n */\nexport interface DappObjectReader {\n readonly bucket: string\n readonly prefix: string\n readonly publicBaseUrl?: string\n readonly role: DappStoreRole\n\n destroy(): void\n get(key: string): Promise<Uint8Array | undefined>\n getWithMeta(key: string): Promise<GetObjectResult | undefined>\n list(prefix?: string): Promise<string[]>\n listAsync(prefix?: string): AsyncIterable<string>\n listPage(options?: ListPageOptions): Promise<ListPage>\n publicUrl(key: string): string | undefined\n resolveKey(key: string): string\n stat(key: string): Promise<ObjectMeta | undefined>\n}\n\n/**\n * Read/write object access for derived roles (state/index) and publication.\n * Extends {@link DappObjectReader} with put/delete.\n */\nexport interface DappObjectWriter extends DappObjectReader {\n delete(key: string): Promise<void>\n put(key: string, body: string | Uint8Array, options?: PutObjectOptions): Promise<PutObjectResult>\n}\n\n/**\n * Full store type used by S3 implementations. Alias of {@link DappObjectWriter}\n * for backward compatibility with existing call sites.\n */\nexport type DappBucketStore = DappObjectWriter\n\n/**\nThrown when a read-only capability wrapper receives a write.\n*/\nexport class ReadOnlyStoreError extends Error {\n override readonly name = 'ReadOnlyStoreError'\n\n constructor(role: DappStoreRole, operation = 'put') {\n super(`Store role \"${role}\" is read-only; ${operation} is not permitted`)\n }\n}\n\nfunction bindReader(store: DappObjectWriter): DappObjectReader {\n return {\n role: store.role,\n bucket: store.bucket,\n prefix: store.prefix,\n ...(store.publicBaseUrl !== undefined && { publicBaseUrl: store.publicBaseUrl }),\n destroy: () => store.destroy(),\n get: key => store.get(key),\n getWithMeta: key => store.getWithMeta(key),\n list: listPrefix => store.list(listPrefix),\n listAsync: listPrefix => store.listAsync(listPrefix),\n listPage: options => store.listPage(options),\n publicUrl: key => store.publicUrl(key),\n resolveKey: key => store.resolveKey(key),\n stat: key => store.stat(key),\n }\n}\n\n/**\n * Wrap any writer as a read-only reader. Other methods and destroy delegate to\n * the underlying store.\n */\nexport function asReadOnly(store: DappObjectWriter): DappObjectReader {\n return bindReader(store)\n}\n\n/**\n * Wrap a writer so `put` fails even if the caller still holds the writer type\n * (defense in depth for the data-role locator registration).\n */\nexport function asReadOnlyWriter(store: DappObjectWriter): DappObjectWriter {\n const reader = bindReader(store)\n return {\n ...reader,\n async put(): Promise<PutObjectResult> {\n throw new ReadOnlyStoreError(store.role, 'put')\n },\n async delete(): Promise<void> {\n throw new ReadOnlyStoreError(store.role, 'delete')\n },\n }\n}\n", "/**\n * Provider monikers for the three dapp buckets. An actor declares these in its\n * `static dependencies` and resolves them from the locator at create time.\n */\nexport const DappDataStoreMoniker = 'DappDataStore' as const\nexport const DappStateStoreMoniker = 'DappStateStore' as const\nexport const DappIndexStoreMoniker = 'DappIndexStore' as const\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 type { DappBucketStore } from '../providers/DappBucketStore.ts'\nimport {\n CACHE_CONTROL_REVALIDATE, INDEXER_STATUS_SCHEMA, STATUS_KEY,\n} from './constants.ts'\nimport type { IndexerStatus } from './types.ts'\n\nexport interface WriteIndexerStatusInput {\n consecutiveFailures: number\n cursor?: string\n floor?: string\n generation?: string\n generationRoot?: string\n /**\n Override the status object key (default `status.json`).\n */\n key?: string\n lastCompletedPosition?: string\n lastError?: string\n lastErrorAt?: string\n lastSuccessAt?: string\n observedSourceHead?: string\n}\n\nfunction encodeStatus(status: IndexerStatus): string {\n return `${JSON.stringify(status, null, 2)}\\n`\n}\n\n/**\n * Read the durable indexer status object from a state (or status) store.\n * Returns undefined when no status has been published yet.\n */\nexport async function readIndexerStatus(\n store: DappBucketStore,\n key: string = STATUS_KEY,\n): Promise<IndexerStatus | undefined> {\n const body = await store.get(key)\n if (body === undefined) return undefined\n const decoder = new TextDecoder()\n const parsed: unknown = JSON.parse(decoder.decode(body))\n if (parsed === null || typeof parsed !== 'object') {\n throw new Error(`Invalid indexer status at \"${key}\": not an object`)\n }\n const record = parsed as Partial<IndexerStatus>\n if (record.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid indexer status schema at \"${key}\": ${String(record.schema)}`)\n }\n return record as IndexerStatus\n}\n\n/**\n * Publish a machine-readable status object with revalidate CDN caching.\n * Status never carries credentials or private app material.\n */\nexport async function writeIndexerStatus(\n store: DappBucketStore,\n input: WriteIndexerStatusInput,\n): Promise<IndexerStatus> {\n const key = input.key ?? STATUS_KEY\n const now = new Date()\n const status: IndexerStatus = {\n schema: INDEXER_STATUS_SCHEMA,\n consecutiveFailures: input.consecutiveFailures,\n updatedAt: now.toISOString(),\n ...(input.floor !== undefined && { floor: input.floor }),\n ...(input.cursor !== undefined && { cursor: input.cursor }),\n ...(input.lastCompletedPosition !== undefined\n && { lastCompletedPosition: input.lastCompletedPosition }),\n ...(input.observedSourceHead !== undefined\n && { observedSourceHead: input.observedSourceHead }),\n ...(input.generation !== undefined && { generation: input.generation }),\n ...(input.generationRoot !== undefined && { generationRoot: input.generationRoot }),\n ...(input.lastSuccessAt !== undefined && { lastSuccessAt: input.lastSuccessAt }),\n ...(input.lastErrorAt !== undefined && { lastErrorAt: input.lastErrorAt }),\n ...(input.lastError !== undefined && { lastError: input.lastError }),\n }\n await store.put(key, encodeStatus(status), {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n })\n return status\n}\n", "import type { DappReduceProgress } from '../reducer/DappReducer.ts'\nimport type { WriteIndexerStatusInput } from './status.ts'\nimport type { IndexerStatus } from './types.ts'\n\nfunction pickDefined(\n source: Record<string, string | undefined>,\n keys: readonly string[],\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of keys) {\n const value = source[key]\n if (value !== undefined) out[key] = value\n }\n return out\n}\n\nconst PROGRESS_KEYS = [\n 'floor',\n 'cursor',\n 'lastCompletedPosition',\n 'observedSourceHead',\n 'generation',\n 'generationRoot',\n] as const\n\n/**\nCarry forward durable progress fields from a prior status object.\n*/\nexport function priorProgressFields(\n prior: IndexerStatus | undefined,\n): Pick<\n WriteIndexerStatusInput,\n 'cursor' | 'floor' | 'generation' | 'generationRoot' | 'lastCompletedPosition' | 'observedSourceHead' | 'lastSuccessAt'\n> {\n if (prior === undefined) return {}\n return {\n ...pickDefined(prior as unknown as Record<string, string | undefined>, PROGRESS_KEYS),\n ...(prior.lastSuccessAt !== undefined && { lastSuccessAt: prior.lastSuccessAt }),\n }\n}\n\n/**\nBuild success status fields from reduce progress, falling back to prior.\n*/\nexport function successStatusFields(\n progress: DappReduceProgress | undefined,\n prior: IndexerStatus | undefined,\n now: string,\n): WriteIndexerStatusInput {\n const fromProgress = progress === undefined\n ? {}\n : pickDefined(progress as unknown as Record<string, string | undefined>, PROGRESS_KEYS)\n const generation = progress?.generation ?? prior?.generation\n const generationRoot = progress?.generationRoot ?? prior?.generationRoot\n return {\n consecutiveFailures: 0,\n ...fromProgress,\n ...(generation !== undefined && { generation }),\n ...(generationRoot !== undefined && { generationRoot }),\n lastSuccessAt: now,\n ...(prior?.lastError !== undefined && { lastError: prior.lastError }),\n ...(prior?.lastErrorAt !== undefined && { lastErrorAt: prior.lastErrorAt }),\n }\n}\n\n/**\nBuild failure status fields while preserving prior checkpoint progress.\n*/\nexport function failureStatusFields(\n prior: IndexerStatus | undefined,\n consecutiveFailures: number,\n error: Error,\n now: string,\n): WriteIndexerStatusInput {\n return {\n consecutiveFailures,\n ...priorProgressFields(prior),\n lastError: error.message,\n lastErrorAt: now,\n }\n}\n", "import type { Logger } from '@ariestools/sdk'\nimport { ConsoleLogger } from '@ariestools/sdk'\nimport type { S3Client } from '@aws-sdk/client-s3'\n\nimport type { DappMoniker, DappProviderLocator } from '../actor/types.ts'\nimport { asReadOnlyWriter } from '../providers/capabilities.ts'\nimport { createS3BucketStore, resolveS3Client } from '../providers/DappBucketStore.ts'\nimport {\n DappDataStoreMoniker, DappIndexStoreMoniker, DappStateStoreMoniker,\n} from '../providers/monikers.ts'\nimport type {\n DappStoreBinding, DappStoreBindings, DappStoreRole, S3ClientConfig,\n} from '../providers/types.ts'\n\nexport interface CreateDappLocatorOptions extends S3ClientConfig {\n accessKeyId?: string\n /**\n * Physical bindings per logical role. When omitted, defaults to three\n * buckets named `data` / `state` / `index` with no prefix (local dapp-serve).\n */\n bindings?: DappStoreBindings\n /**\n * Optional per-role S3 clients or client configs for least-privilege\n * principals (e.g. data read-only IAM user vs state/index writer). When a\n * role is omitted, the shared {@link client} / top-level config is used.\n */\n clients?: Partial<Record<DappStoreRole, S3Client | S3ClientConfig>>\n /**\n * Origin of the private S3-compatible API, e.g. `http://127.0.0.1:8801` or\n * an R2 endpoint. Ignored when {@link client} is provided.\n */\n endpoint?: string\n logger?: Logger\n /**\n * When true (default), the data-role store rejects `put` so reducers cannot\n * write through the source principal even if they cast the type.\n */\n readOnlyData?: boolean\n secretAccessKey?: string\n}\n\nconst DEFAULT_BINDINGS: DappStoreBindings = {\n data: { bucket: 'data' },\n state: { bucket: 'state' },\n index: { bucket: 'index' },\n}\n\nconst ROLE_MONIKERS: Record<DappStoreRole, string> = {\n data: DappDataStoreMoniker,\n state: DappStateStoreMoniker,\n index: DappIndexStoreMoniker,\n}\n\nfunction resolveCredentials(options: CreateDappLocatorOptions): S3ClientConfig['credentials'] {\n if (options.credentials !== undefined) return options.credentials\n if (options.accessKeyId !== undefined || options.secretAccessKey !== undefined) {\n return {\n accessKeyId: options.accessKeyId ?? 'S3RVER',\n secretAccessKey: options.secretAccessKey ?? 'S3RVER',\n }\n }\n return undefined\n}\n\ninterface OwnedClient {\n client: S3Client\n ownClient: boolean\n}\n\nfunction resolveSharedClient(options: CreateDappLocatorOptions): OwnedClient {\n const credentials = resolveCredentials(options)\n if (options.client !== undefined) {\n return {\n client: options.client,\n ownClient: options.ownClient ?? false,\n }\n }\n return resolveS3Client({\n ...(options.endpoint !== undefined && { endpoint: options.endpoint }),\n ...(options.region !== undefined && { region: options.region }),\n ...(options.forcePathStyle !== undefined && { forcePathStyle: options.forcePathStyle }),\n ...(credentials !== undefined && { credentials }),\n ownClient: options.ownClient,\n })\n}\n\nfunction resolveRoleClient(\n role: DappStoreRole,\n options: CreateDappLocatorOptions,\n shared: OwnedClient,\n): OwnedClient {\n const override = options.clients?.[role]\n if (override === undefined) return shared\n if (typeof (override as S3Client).send === 'function') {\n return {\n client: override as S3Client,\n ownClient: false,\n }\n }\n return resolveS3Client({\n ...(override as S3ClientConfig),\n // Per-role constructed clients are owned by the locator.\n ownClient: (override as S3ClientConfig).ownClient ?? true,\n })\n}\n\n/**\n * Builds the process-wide locator: one instance, shared across every actor\n * (xl1-cli style). It pre-registers an S3-backed store per logical role using\n * either the default local bucket names or explicit production bindings.\n * Extra providers can be `register`ed before actors are created.\n *\n * Prefer a shared {@link client} when all roles share one principal; use\n * {@link CreateDappLocatorOptions.clients} for distinct least-privilege\n * credentials per role. Call `destroy()` on shutdown when the locator owns\n * any client it constructed.\n */\nexport function createDappLocator(options: CreateDappLocatorOptions): DappProviderLocator {\n const logger = options.logger ?? new ConsoleLogger()\n const bindings = options.bindings ?? DEFAULT_BINDINGS\n const shared = resolveSharedClient(options)\n const readOnlyData = options.readOnlyData !== false\n\n const roles = ['data', 'state', 'index'] as const\n const instances = new Map<DappMoniker, unknown>()\n const stores: { destroy(): void }[] = []\n const ownedClients: OwnedClient[] = []\n const seenClients = new Set<S3Client>()\n\n const trackClient = (owned: OwnedClient): void => {\n if (!owned.ownClient || seenClients.has(owned.client)) return\n seenClients.add(owned.client)\n ownedClients.push(owned)\n }\n trackClient(shared)\n\n for (const role of roles) {\n const binding: DappStoreBinding = bindings[role]\n const roleClient = resolveRoleClient(role, options, shared)\n trackClient(roleClient)\n let store = createS3BucketStore({\n role,\n binding,\n client: roleClient.client,\n // Locator owns clients; individual stores must not destroy them.\n ownClient: false,\n })\n if (role === 'data' && readOnlyData) {\n store = asReadOnlyWriter(store)\n }\n stores.push(store)\n instances.set(ROLE_MONIKERS[role], store)\n }\n\n let destroyed = false\n return {\n context: { logger },\n has: (moniker: DappMoniker): boolean => instances.has(moniker),\n register(moniker: DappMoniker, instance: unknown): void {\n instances.set(moniker, instance)\n },\n async getInstance<T>(moniker: DappMoniker): Promise<T> {\n const found = instances.get(moniker)\n if (found === undefined) throw new Error(`No provider registered for moniker \"${moniker}\"`)\n return found as T\n },\n tryGetInstance: async <T>(moniker: DappMoniker): Promise<T | undefined> =>\n instances.get(moniker) as T | undefined,\n destroy(): void {\n if (destroyed) return\n destroyed = true\n for (const store of stores) store.destroy()\n for (const owned of ownedClients) {\n if (owned.ownClient) owned.client.destroy()\n }\n },\n }\n}\n", "import {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n S3Client,\n} from '@aws-sdk/client-s3'\n\nimport type { DappBucketStore } from './capabilities.ts'\nimport { ConditionalWriteError } from './errors.ts'\nimport {\n joinKey, normalizePublicBaseUrl, stripPrefix,\n} from './joinKey.ts'\nimport type {\n DappStoreBinding,\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n S3ClientConfig,\n} from './types.ts'\n\nexport type { DappBucketStore } from './capabilities.ts'\nexport type { DappObjectReader, DappObjectWriter } from './capabilities.ts'\nexport {\n asReadOnly, asReadOnlyWriter, ReadOnlyStoreError,\n} from './capabilities.ts'\n\nexport interface S3DappBucketStoreOptions extends S3ClientConfig {\n binding: DappStoreBinding\n role: DappStoreRole\n}\n\nconst DEFAULT_CREDENTIAL = 'S3RVER'\nconst DEFAULT_REGION = 'us-east-1'\n\nfunction isNotFound(error: unknown): boolean {\n const name = (error as { name?: string }).name\n const status = (error as { $metadata?: { httpStatusCode?: number } }).$metadata?.httpStatusCode\n return name === 'NoSuchKey'\n || name === 'NotFound'\n || name === '404'\n || status === 404\n}\n\nfunction isConditionalFailure(error: unknown): boolean {\n const name = (error as { name?: string }).name\n const status = (error as { $metadata?: { httpStatusCode?: number } }).$metadata?.httpStatusCode\n return name === 'PreconditionFailed'\n || name === 'ConditionalRequestConflict'\n || name === '412'\n || status === 412\n}\n\nfunction toBodyBytes(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n}\n\nfunction metaFromResponse(response: {\n CacheControl?: string\n ContentEncoding?: string\n ContentLength?: number\n ContentType?: string\n ETag?: string\n LastModified?: Date\n Metadata?: Record<string, string>\n}): ObjectMeta {\n return {\n ...(response.CacheControl !== undefined && { cacheControl: response.CacheControl }),\n ...(response.ContentEncoding !== undefined && { contentEncoding: response.ContentEncoding }),\n ...(response.ContentLength !== undefined && { contentLength: response.ContentLength }),\n ...(response.ContentType !== undefined && { contentType: response.ContentType }),\n ...(response.ETag !== undefined && { etag: response.ETag }),\n ...(response.LastModified !== undefined && { lastModified: response.LastModified }),\n ...(response.Metadata !== undefined && Object.keys(response.Metadata).length > 0\n && { metadata: response.Metadata }),\n }\n}\n\nexport interface ResolvedS3Client {\n client: S3Client\n ownClient: boolean\n}\n\n/**\n * Resolve a shared S3 client from an injected instance or construct options.\n * Callers that build three role stores should resolve once and pass the same\n * client to each so dapp-core does not own one client per role.\n */\nfunction resolveClientCredentials(\n options: S3ClientConfig,\n): S3ClientConfig['credentials'] | undefined {\n if (options.credentials !== undefined) return options.credentials\n if (options.endpoint === undefined) return undefined\n return {\n accessKeyId: DEFAULT_CREDENTIAL,\n secretAccessKey: DEFAULT_CREDENTIAL,\n }\n}\n\nexport function resolveS3Client(options: S3ClientConfig): ResolvedS3Client {\n if (options.client !== undefined) {\n return {\n client: options.client,\n ownClient: options.ownClient ?? false,\n }\n }\n const credentials = resolveClientCredentials(options)\n const client = new S3Client({\n ...(options.endpoint !== undefined && { endpoint: options.endpoint }),\n region: options.region ?? DEFAULT_REGION,\n forcePathStyle: options.forcePathStyle ?? options.endpoint !== undefined,\n ...(credentials !== undefined && { credentials }),\n })\n return {\n client,\n ownClient: options.ownClient ?? true,\n }\n}\n\n/**\n * S3-backed {@link DappBucketStore}. Accepts an injected client (production)\n * or builds one from endpoint/credentials (local s3rver / simple configs).\n * Path-style addressing is the default when an endpoint is provided so local\n * fixtures and many R2 setups work without virtual-host DNS.\n */\nexport function createS3BucketStore(options: S3DappBucketStoreOptions): DappBucketStore {\n const { role } = options\n const bindingPrefix = (options.binding.prefix ?? '').replaceAll(/^\\/+|\\/+$/g, '')\n const publicBaseUrl = normalizePublicBaseUrl(options.binding.publicBaseUrl)\n const { client, ownClient } = resolveS3Client(options)\n const bucket = options.binding.bucket\n let destroyed = false\n\n function resolve(relativeKey: string): string {\n return joinKey(bindingPrefix, relativeKey)\n }\n\n return {\n role,\n bucket,\n prefix: bindingPrefix,\n ...(publicBaseUrl !== undefined && { publicBaseUrl }),\n\n resolveKey: (key: string): string => resolve(key),\n\n publicUrl(key: string): string | undefined {\n if (publicBaseUrl === undefined) return undefined\n const relative = key.replaceAll(/^\\/+/g, '')\n return relative.length === 0 ? publicBaseUrl : `${publicBaseUrl}/${relative}`\n },\n\n destroy(): void {\n if (destroyed) return\n destroyed = true\n if (ownClient) client.destroy()\n },\n\n async get(key: string): Promise<Uint8Array | undefined> {\n const result = await this.getWithMeta(key)\n return result?.body\n },\n\n async getWithMeta(key: string): Promise<GetObjectResult | undefined> {\n try {\n const response = await client.send(new GetObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n const body = await response.Body?.transformToByteArray()\n if (body === undefined) return undefined\n return {\n body,\n meta: metaFromResponse(response),\n }\n } catch (error) {\n if (isNotFound(error)) return undefined\n throw error\n }\n },\n\n async stat(key: string): Promise<ObjectMeta | undefined> {\n try {\n const response = await client.send(new HeadObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n return metaFromResponse(response)\n } catch (error) {\n if (isNotFound(error)) return undefined\n throw error\n }\n },\n\n async put(\n key: string,\n body: string | Uint8Array,\n putOptions?: PutObjectOptions,\n ): Promise<PutObjectResult> {\n const physicalKey = resolve(key)\n try {\n const response = await client.send(new PutObjectCommand({\n Bucket: bucket,\n Key: physicalKey,\n Body: toBodyBytes(body),\n ...(putOptions?.contentType !== undefined && { ContentType: putOptions.contentType }),\n ...(putOptions?.contentEncoding !== undefined\n && { ContentEncoding: putOptions.contentEncoding }),\n ...(putOptions?.cacheControl !== undefined && { CacheControl: putOptions.cacheControl }),\n ...(putOptions?.metadata !== undefined && { Metadata: putOptions.metadata }),\n ...(putOptions?.ifNotExists === true && { IfNoneMatch: '*' }),\n ...(putOptions?.ifMatch !== undefined && { IfMatch: putOptions.ifMatch }),\n }))\n return { ...(response.ETag !== undefined && { etag: response.ETag }) }\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new ConditionalWriteError(key)\n }\n throw error\n }\n },\n\n async delete(key: string): Promise<void> {\n await client.send(new DeleteObjectCommand({\n Bucket: bucket,\n Key: resolve(key),\n }))\n },\n\n async list(prefix?: string): Promise<string[]> {\n const keys: string[] = []\n for await (const key of this.listAsync(prefix)) {\n keys.push(key)\n }\n return keys\n },\n\n async listPage(pageOptions: ListPageOptions = {}): Promise<ListPage> {\n const physicalPrefix = pageOptions.prefix === undefined\n ? (bindingPrefix.length === 0 ? undefined : `${bindingPrefix}/`)\n : resolve(pageOptions.prefix)\n const response = await client.send(new ListObjectsV2Command({\n Bucket: bucket,\n ...(physicalPrefix !== undefined && { Prefix: physicalPrefix }),\n ...(pageOptions.continuationToken !== undefined\n && { ContinuationToken: pageOptions.continuationToken }),\n ...(pageOptions.maxKeys !== undefined && { MaxKeys: pageOptions.maxKeys }),\n }))\n const keys: string[] = []\n for (const item of response.Contents ?? []) {\n if (item.Key === undefined) continue\n keys.push(stripPrefix(bindingPrefix, item.Key))\n }\n const isTruncated = response.IsTruncated === true\n return {\n keys,\n isTruncated,\n ...(isTruncated && response.NextContinuationToken !== undefined\n && { continuationToken: response.NextContinuationToken }),\n }\n },\n\n async* listAsync(prefix?: string): AsyncIterable<string> {\n let token: string | undefined\n do {\n const page = await this.listPage({\n ...(prefix !== undefined && { prefix }),\n ...(token !== undefined && { continuationToken: token }),\n })\n for (const key of page.keys) yield key\n token = page.continuationToken\n } while (token !== undefined)\n },\n }\n}\n\n/**\n * @deprecated Prefer {@link S3DappBucketStoreOptions} with an explicit binding.\n * Kept for the local-dev locator path that still uses endpoint + role name.\n */\nexport interface LegacyS3DappBucketStoreOptions {\n accessKeyId?: string\n bucket: DappStoreRole\n /**\n Origin the dapp server listens on, e.g. `http://127.0.0.1:8801`.\n */\n endpoint: string\n secretAccessKey?: string\n}\n", "/**\n * Thrown when a conditional put fails (object already exists under\n * `ifNotExists`, or ETag mismatch under `ifMatch`).\n */\nexport class ConditionalWriteError extends Error {\n readonly key: string\n override readonly name = 'ConditionalWriteError'\n\n constructor(key: string, message?: string) {\n super(message ?? `Conditional write failed for key \"${key}\"`)\n this.key = key\n }\n}\n\nexport function isConditionalWriteError(error: unknown): error is ConditionalWriteError {\n return error instanceof ConditionalWriteError\n || (error !== null\n && typeof error === 'object'\n && (error as { name?: string }).name === 'ConditionalWriteError')\n}\n", "/**\n * Join a role prefix with a relative object key into a physical S3 key.\n * Empty prefix yields the relative key unchanged; empty relative yields the\n * prefix without a trailing slash.\n */\nexport function joinKey(prefix: string, relativeKey: string): string {\n const cleanPrefix = prefix.replaceAll(/^\\/+|\\/+$/g, '')\n const cleanKey = relativeKey.replaceAll(/^\\/+/g, '')\n if (cleanPrefix.length === 0) return cleanKey\n if (cleanKey.length === 0) return cleanPrefix\n return `${cleanPrefix}/${cleanKey}`\n}\n\n/**\nStrip a role prefix from a physical key, returning the relative key.\n*/\nexport function stripPrefix(prefix: string, physicalKey: string): string {\n const cleanPrefix = prefix.replaceAll(/^\\/+|\\/+$/g, '')\n if (cleanPrefix.length === 0) return physicalKey\n if (physicalKey === cleanPrefix) return ''\n const withSlash = `${cleanPrefix}/`\n if (physicalKey.startsWith(withSlash)) return physicalKey.slice(withSlash.length)\n return physicalKey\n}\n\n/**\nNormalize an optional public base URL (no trailing slash).\n*/\nexport function normalizePublicBaseUrl(url: string | undefined): string | undefined {\n if (url === undefined || url.length === 0) return undefined\n return url.replace(/\\/+$/, '')\n}\n", "import { createHash } from 'node:crypto'\n\n/**\nSHA-256 hex digest of a string or byte body.\n*/\nexport function hashBytes(body: string | Uint8Array): string {\n const hash = createHash('sha256')\n hash.update(typeof body === 'string' ? body : Buffer.from(body))\n return hash.digest('hex')\n}\n", "import type { DappBucketStore } from './capabilities.ts'\nimport { ConditionalWriteError } from './errors.ts'\nimport type {\n DappStoreRole,\n GetObjectResult,\n ListPage,\n ListPageOptions,\n ObjectMeta,\n PutObjectOptions,\n PutObjectResult,\n} from './types.ts'\n\ninterface MemObject {\n body: Uint8Array\n cacheControl?: string\n contentEncoding?: string\n contentType?: string\n etag: string\n metadata?: Record<string, string>\n}\n\nexport interface MemoryBucketStoreOptions {\n bucket?: string\n prefix?: string\n publicBaseUrl?: string\n role: DappStoreRole\n}\n\n/**\n * In-memory {@link DappBucketStore} with real conditional put semantics for\n * deterministic fence/race tests (s3rver conditionals are unreliable).\n */\nexport function createMemoryBucketStore(options: MemoryBucketStoreOptions): DappBucketStore {\n const objects = new Map<string, MemObject>()\n let etagSeq = 0\n const role = options.role\n const bucket = options.bucket ?? role\n const prefix = (options.prefix ?? '').replaceAll(/^\\/+|\\/+$/g, '')\n const publicBaseUrl = options.publicBaseUrl\n\n function nextEtag(): string {\n etagSeq += 1\n return `\"mem-${etagSeq}\"`\n }\n\n function toBytes(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n }\n\n return {\n role,\n bucket,\n prefix,\n ...(publicBaseUrl !== undefined && { publicBaseUrl }),\n\n destroy(): void {\n objects.clear()\n },\n\n resolveKey(key: string): string {\n const clean = key.replaceAll(/^\\/+/g, '')\n if (prefix.length === 0) return clean\n return clean.length === 0 ? prefix : `${prefix}/${clean}`\n },\n\n publicUrl(key: string): string | undefined {\n if (publicBaseUrl === undefined) return undefined\n const relative = key.replaceAll(/^\\/+/g, '')\n return relative.length === 0 ? publicBaseUrl : `${publicBaseUrl}/${relative}`\n },\n\n get: async (key: string): Promise<Uint8Array | undefined> => objects.get(key)?.body,\n\n async getWithMeta(key: string): Promise<GetObjectResult | undefined> {\n const found = objects.get(key)\n if (found === undefined) return undefined\n return {\n body: found.body,\n meta: {\n etag: found.etag,\n ...(found.contentType !== undefined && { contentType: found.contentType }),\n ...(found.contentEncoding !== undefined && { contentEncoding: found.contentEncoding }),\n ...(found.cacheControl !== undefined && { cacheControl: found.cacheControl }),\n contentLength: found.body.byteLength,\n ...(found.metadata !== undefined && { metadata: found.metadata }),\n },\n }\n },\n\n async stat(key: string): Promise<ObjectMeta | undefined> {\n const found = objects.get(key)\n if (found === undefined) return undefined\n return {\n etag: found.etag,\n contentLength: found.body.byteLength,\n ...(found.contentType !== undefined && { contentType: found.contentType }),\n ...(found.cacheControl !== undefined && { cacheControl: found.cacheControl }),\n }\n },\n\n async put(\n key: string,\n body: string | Uint8Array,\n putOptions?: PutObjectOptions,\n ): Promise<PutObjectResult> {\n const existing = objects.get(key)\n if (putOptions?.ifNotExists === true && existing !== undefined) {\n throw new ConditionalWriteError(key)\n }\n if (\n putOptions?.ifMatch !== undefined\n && (existing === undefined || existing.etag !== putOptions.ifMatch)\n ) {\n throw new ConditionalWriteError(key)\n }\n const etag = nextEtag()\n objects.set(key, {\n body: toBytes(body),\n etag,\n ...(putOptions?.contentType !== undefined && { contentType: putOptions.contentType }),\n ...(putOptions?.contentEncoding !== undefined\n && { contentEncoding: putOptions.contentEncoding }),\n ...(putOptions?.cacheControl !== undefined && { cacheControl: putOptions.cacheControl }),\n ...(putOptions?.metadata !== undefined && { metadata: putOptions.metadata }),\n })\n return { etag }\n },\n\n async delete(key: string): Promise<void> {\n objects.delete(key)\n },\n\n async list(listPrefix?: string): Promise<string[]> {\n const keys: string[] = []\n for await (const key of this.listAsync(listPrefix)) keys.push(key)\n return keys\n },\n\n async listPage(pageOptions: ListPageOptions = {}): Promise<ListPage> {\n const p = pageOptions.prefix ?? ''\n let keys = objects.keys().filter(k => k.startsWith(p)).toArray().toSorted()\n if (pageOptions.continuationToken !== undefined) {\n const idx = keys.indexOf(pageOptions.continuationToken)\n keys = idx === -1 ? keys : keys.slice(idx + 1)\n }\n const max = pageOptions.maxKeys ?? keys.length\n const page = keys.slice(0, max)\n const isTruncated = keys.length > max\n return {\n keys: page,\n isTruncated,\n ...(isTruncated && page.length > 0\n && { continuationToken: page.at(-1) }),\n }\n },\n\n async* listAsync(listPrefix?: string): AsyncIterable<string> {\n let token: string | undefined\n do {\n const page = await this.listPage({\n ...(listPrefix !== undefined && { prefix: listPrefix }),\n ...(token !== undefined && { continuationToken: token }),\n maxKeys: 100,\n })\n for (const key of page.keys) yield key\n token = page.continuationToken\n } while (token !== undefined)\n },\n }\n}\n", "import type { S3Client, S3ClientConfig as AwsS3ClientConfig } from '@aws-sdk/client-s3'\n\n/**\nLogical store roles in a dapp backend.\n*/\nexport const DAPP_STORE_ROLES = ['data', 'state', 'index'] as const\nexport type DappStoreRole = typeof DAPP_STORE_ROLES[number]\n\n/**\n * Physical binding for one logical role. A role maps to an arbitrary bucket\n * name and optional key prefix so projects can use either three independent\n * buckets or one shared bucket with three prefixes.\n */\nexport interface DappStoreBinding {\n /**\n Physical S3/R2 bucket name.\n */\n bucket: string\n /**\n * Optional key prefix inside the bucket (no leading slash). Trailing slashes\n * are normalized. Example: `my-dapp/state`.\n */\n prefix?: string\n /**\n * Optional public CDN / anonymous-read base URL for this role\n * (e.g. `https://cdn.example.com/state`). Distinct from the private S3 API\n * endpoint used for writes.\n */\n publicBaseUrl?: string\n}\n\n/**\nObject metadata returned by stat/get and accepted on put.\n*/\nexport interface ObjectMeta {\n cacheControl?: string\n contentEncoding?: string\n contentLength?: number\n contentType?: string\n etag?: string\n lastModified?: Date\n /**\n User metadata (S3 `x-amz-meta-*`); keys are lower-cased by providers.\n */\n metadata?: Record<string, string>\n}\n\nexport interface PutObjectOptions {\n cacheControl?: string\n contentEncoding?: string\n contentType?: string\n /**\n * Only write when the object's current ETag matches. Supported when the\n * provider honors conditional PutObject; otherwise the write is unconditional.\n */\n ifMatch?: string\n /**\n * Only create when the key does not exist (`If-None-Match: *`). Supported\n * when the provider honors conditional PutObject.\n */\n ifNotExists?: boolean\n metadata?: Record<string, string>\n}\n\nexport interface PutObjectResult {\n etag?: string\n}\n\nexport interface GetObjectResult {\n body: Uint8Array\n meta: ObjectMeta\n}\n\nexport interface ListPageOptions {\n continuationToken?: string\n maxKeys?: number\n /**\n Relative prefix under the role binding (not the full physical key).\n */\n prefix?: string\n}\n\nexport interface ListPage {\n continuationToken?: string\n isTruncated: boolean\n /**\n Relative keys (binding prefix stripped).\n */\n keys: string[]\n}\n\n/**\n * Shared S3 client configuration for production stores. Prefer injecting a\n * single {@link S3Client} (or a credential provider) rather than letting\n * dapp-core own secrets. Credentials must never be logged or embedded in\n * published configuration.\n */\nexport interface S3ClientConfig {\n /**\n * Pre-built client shared across all role stores. When set, endpoint/region/\n * credentials/forcePathStyle are ignored for client construction.\n */\n client?: S3Client\n credentials?: AwsS3ClientConfig['credentials']\n /**\n Private S3-compatible API origin, e.g. `https://<account>.r2.cloudflarestorage.com`.\n */\n endpoint?: string\n forcePathStyle?: boolean\n /**\n * When true (default if the client was constructed here), locator/store\n * `destroy()` releases the client. Injected clients default to false.\n */\n ownClient?: boolean\n region?: string\n}\n\nexport interface DappStoreBindings {\n data: DappStoreBinding\n index: DappStoreBinding\n state: DappStoreBinding\n}\n", "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 (Object.hasOwn(payload, key)) ordered[key] = payload[key]\n }\n const encoder = new TextEncoder()\n return encoder.encode(`${JSON.stringify(ordered)}\\n`)\n}\n", "import { randomUUID } from 'node:crypto'\n\nimport type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { canonicalHeadBytes } from './canonicalHead.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n GENERATION_MANIFEST_SCHEMA,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n} from './constants.ts'\nimport type { LeaseHandle } from './safety.ts'\nimport { assertPublicationSafety } from './safety.ts'\nimport type {\n GenerationManifest,\n HeadManifest,\n PublishGenerationInput,\n PublishGenerationResult,\n} from './types.ts'\nimport { writeImmutableObjects, writeManifest } from './writeGenerationObjects.ts'\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new Error('Publication aborted')\n }\n}\n\nasync function acquireLeaseIfNeeded(\n input: PublishGenerationInput,\n): Promise<LeaseHandle | undefined> {\n if (input.safety.mode !== 'lease') return undefined\n return await input.safety.lease.acquire({\n key: HEAD_KEY,\n ttlMs: 60_000,\n ...(input.signal !== undefined && { signal: input.signal }),\n })\n}\n\nasync function buildAndSignHead(\n input: PublishGenerationInput,\n generation: string,\n manifestKey: string,\n manifestHash: string,\n publishedAt: string,\n): Promise<HeadManifest> {\n const trustMode = input.trust?.mode ?? 'trusted-origin'\n const head: HeadManifest = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation,\n layout: 'full',\n manifestKey,\n manifestHash,\n publishedAt,\n trust: trustMode,\n ...(input.previousGeneration !== undefined\n && { previousGeneration: input.previousGeneration }),\n ...(input.revision !== undefined && { revision: input.revision }),\n }\n if (input.trust?.mode === 'signed') {\n head.signature = await input.trust.sign(canonicalHeadBytes(head))\n }\n return head\n}\n\nasync function writeObjectsAndManifest(\n input: PublishGenerationInput,\n generation: string,\n fenced: boolean,\n): Promise<\n PublishGenerationResult | { manifest: GenerationManifest; manifestHash: string; manifestKey: string; ok: true }\n> {\n const signal = input.signal\n const stateRefs = await writeImmutableObjects(input.state, 'state', generation, input.stateObjects ?? [], signal, fenced)\n const indexRefs = await writeImmutableObjects(input.index, 'index', generation, input.indexObjects ?? [], signal, fenced)\n const publishedAtDate = new Date()\n const publishedAt = publishedAtDate.toISOString()\n const manifest: GenerationManifest = {\n schema: GENERATION_MANIFEST_SCHEMA,\n generation,\n publishedAt,\n reducer: {\n name: input.reducer.name,\n ...(input.reducer.version !== undefined && { version: input.reducer.version }),\n },\n ...(input.schemaVersion !== undefined && { schemaVersion: input.schemaVersion }),\n source: input.source ?? {},\n objects: [...stateRefs, ...indexRefs],\n }\n const manifestKey = `${GENERATIONS_PREFIX}/${generation}/manifest.json`\n const manifestBody = `${JSON.stringify(manifest, null, 2)}\\n`\n const manifestHash = hashBytes(manifestBody)\n assertNotAborted(signal)\n try {\n await writeManifest(input.state, manifestKey, manifestBody, fenced)\n } catch (error) {\n if (error instanceof Error && error.message.includes('Immutable create-only collision')) {\n return {\n ok: false,\n conflict: {\n kind: 'immutable-collision',\n message: error.message,\n key: manifestKey,\n },\n }\n }\n throw error\n }\n return {\n ok: true, manifest, manifestKey, manifestHash,\n }\n}\n\nasync function releaseLease(handle: LeaseHandle | undefined): Promise<void> {\n if (handle === undefined) return\n try {\n await handle.release()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Publish state and index as one coherent immutable generation, then atomically\n * expose that generation by writing the validated head last under the selected\n * fencing mode.\n */\nexport async function publishGeneration(\n input: PublishGenerationInput,\n): Promise<PublishGenerationResult> {\n const generation = input.generation ?? randomUUID()\n const signal = input.signal\n assertNotAborted(signal)\n if (input.assertSafety !== false && input.safety.mode === 'conditional-head') {\n await assertPublicationSafety(input.state, input.safety)\n }\n const fenced = input.safety.mode !== 'unfenced'\n const leaseHandle = await acquireLeaseIfNeeded(input)\n try {\n const written = await writeObjectsAndManifest(input, generation, fenced)\n if (!written.ok) return written\n const head = await buildAndSignHead(input, generation, written.manifestKey, written.manifestHash, written.manifest.publishedAt)\n assertNotAborted(signal)\n const committed = await commitHead(input.state, head, input.safety, fenced, input.expectedHeadEtag)\n if ('conflict' in committed) {\n return { ok: false, conflict: committed.conflict }\n }\n return {\n ok: true,\n generation,\n manifest: written.manifest,\n manifestKey: written.manifestKey,\n manifestHash: written.manifestHash,\n head,\n headKey: HEAD_KEY,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('Immutable create-only collision')) {\n return {\n ok: false,\n conflict: {\n kind: 'immutable-collision',\n message: error.message,\n },\n }\n }\n if (signal?.aborted === true) {\n return {\n ok: false,\n conflict: {\n kind: 'aborted',\n message: error instanceof Error ? error.message : 'Publication aborted',\n },\n }\n }\n throw error\n } finally {\n await releaseLease(leaseHandle)\n }\n}\n\n/**\n * Load and validate the current head, then the generation manifest (full layout)\n * or map root (incremental-cas). Verifies the pointed-to object hash.\n */\nexport async function readPublishedHead(\n state: DappObjectWriter,\n): Promise<{\n head: HeadManifest\n headEtag?: string\n manifest?: GenerationManifest\n} | undefined> {\n const withMeta = await state.getWithMeta(HEAD_KEY)\n if (withMeta === undefined) return undefined\n const decoder = new TextDecoder()\n const head = JSON.parse(decoder.decode(withMeta.body)) as HeadManifest\n if (head.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(head.schema)}`)\n }\n const targetBody = await state.get(head.manifestKey)\n if (targetBody === undefined) {\n throw new Error(`Head points at missing object \"${head.manifestKey}\"`)\n }\n const encoder = new TextEncoder()\n const targetBytes = typeof targetBody === 'string'\n ? encoder.encode(targetBody)\n : targetBody\n const actualHash = hashBytes(targetBytes)\n if (actualHash !== head.manifestHash) {\n throw new Error(\n `Head target hash mismatch for generation \"${head.generation}\": `\n + `head=${head.manifestHash} actual=${actualHash}`,\n )\n }\n if (head.layout === 'incremental-cas') {\n return {\n head,\n ...(withMeta.meta.etag !== undefined && { headEtag: withMeta.meta.etag }),\n }\n }\n const manifest = JSON.parse(decoder.decode(targetBytes)) as GenerationManifest\n if (manifest.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(manifest.schema)}`)\n }\n if (manifest.generation !== head.generation) {\n throw new Error(\n `Generation id mismatch: head=${head.generation} manifest=${manifest.generation}`,\n )\n }\n return {\n head,\n manifest,\n ...(withMeta.meta.etag !== undefined && { headEtag: withMeta.meta.etag }),\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { CACHE_CONTROL_REVALIDATE, HEAD_KEY } from './constants.ts'\nimport type { PublicationConflict, PublicationSafety } from './safety.ts'\nimport type { HeadManifest } from './types.ts'\n\nexport async function commitHead(\n state: DappObjectWriter,\n head: HeadManifest,\n safety: PublicationSafety,\n fenced: boolean,\n expectedHeadEtag: string | undefined,\n): Promise<{ etag?: string } | { conflict: PublicationConflict }> {\n const headBody = `${JSON.stringify(head, null, 2)}\\n`\n const base = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n }\n try {\n if (!fenced) {\n return await state.put(HEAD_KEY, headBody, base)\n }\n if (expectedHeadEtag === undefined) {\n return await state.put(HEAD_KEY, headBody, { ...base, ifNotExists: true })\n }\n return await state.put(HEAD_KEY, headBody, { ...base, ifMatch: expectedHeadEtag })\n } catch (error) {\n if (error instanceof ConditionalWriteError) {\n return {\n conflict: {\n kind: safety.mode === 'lease' ? 'lease' : 'head-cas',\n message: `Head publish conflict on \"${HEAD_KEY}\" (stale or concurrent writer)`,\n key: HEAD_KEY,\n },\n }\n }\n throw error\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\n\n/**\n * How publication fences concurrent writers.\n *\n * - `conditional-head` \u2014 production CAS via If-Match / If-None-Match on head\n * - `lease` \u2014 injected fencing token for providers without reliable head CAS\n * - `unfenced` \u2014 **development only** (local s3rver); never use in production\n */\nexport type PublicationSafety\n = | { mode: 'conditional-head' }\n | { lease: PublicationLease; mode: 'lease' }\n | { mode: 'unfenced' }\n\nexport interface PublicationLease {\n acquire(opts: {\n key: string\n signal?: AbortSignal\n ttlMs: number\n }): Promise<LeaseHandle>\n}\n\nexport interface LeaseHandle {\n readonly token: string\n release(): Promise<void>\n}\n\nexport type PublicationConflictKind\n = | 'head-cas'\n | 'lease'\n | 'immutable-collision'\n | 'aborted'\n\nexport interface PublicationConflict {\n key?: string\n kind: PublicationConflictKind\n message: string\n}\n\nexport type PublicationTrust\n = | { mode: 'trusted-origin' }\n | {\n mode: 'signed'\n sign: (canonicalBytes: Uint8Array) => Promise<string> | string\n }\n\nexport interface PublicationCapabilities {\n conditionalCreate: boolean\n conditionalUpdate: boolean\n}\n\nconst PROBE_PREFIX = '.aries-dapp-probe/'\n\n/**\n * Probe whether the store honors create-only and if-match updates. Production\n * publication should fail closed when the selected safety mode needs a\n * capability the provider lacks.\n */\nexport async function probePublicationCapabilities(\n store: DappObjectWriter,\n): Promise<PublicationCapabilities> {\n const key = `${PROBE_PREFIX}${Date.now()}-${Math.random().toString(36).slice(2)}`\n let conditionalCreate = false\n let conditionalUpdate = false\n try {\n const created = await store.put(key, 'probe-v1', {\n ifNotExists: true,\n contentType: 'text/plain',\n })\n try {\n await store.put(key, 'probe-v1-again', { ifNotExists: true })\n // Second create-only succeeded \u2192 provider ignored If-None-Match\n } catch (error) {\n conditionalCreate = error instanceof ConditionalWriteError\n }\n const etag = created.etag\n if (etag !== undefined) {\n try {\n await store.put(key, 'probe-v2', {\n ifMatch: etag,\n contentType: 'text/plain',\n })\n try {\n await store.put(key, 'probe-stale', {\n ifMatch: '\"not-the-etag\"',\n contentType: 'text/plain',\n })\n } catch (error) {\n conditionalUpdate = error instanceof ConditionalWriteError\n }\n } catch {\n // update path unsupported\n }\n }\n } catch {\n // create path unsupported\n }\n try {\n await store.put(key, '', { contentType: 'text/plain' })\n } catch {\n // ignore cleanup\n }\n return { conditionalCreate, conditionalUpdate }\n}\n\n/**\n * Assert the selected safety mode is supported. Throws when production would\n * otherwise silently degrade to unconditional puts.\n */\nexport async function assertPublicationSafety(\n store: DappObjectWriter,\n safety: PublicationSafety,\n capabilities?: PublicationCapabilities,\n): Promise<PublicationCapabilities> {\n if (safety.mode === 'unfenced') {\n return { conditionalCreate: false, conditionalUpdate: false }\n }\n if (safety.mode === 'lease') {\n return capabilities ?? await probePublicationCapabilities(store)\n }\n const caps = capabilities ?? await probePublicationCapabilities(store)\n if (!caps.conditionalCreate || !caps.conditionalUpdate) {\n throw new Error(\n 'Publication safety mode \"conditional-head\" requires provider support for '\n + 'create-only (If-None-Match: *) and conditional update (If-Match). '\n + 'Probe failed; refuse to publish without fencing. Use an injected lease '\n + 'adapter, or fix provider configuration.',\n )\n }\n return caps\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport type { PutObjectOptions, PutObjectResult } from '../providers/types.ts'\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\n/**\n * Create-only put for immutable generation objects. If the key already exists\n * with identical bytes, treats the write as an idempotent success. If bytes\n * differ, throws without overwriting published content.\n */\nexport async function putCreateOnly(\n store: DappObjectWriter,\n key: string,\n body: string | Uint8Array,\n options?: Omit<PutObjectOptions, 'ifNotExists' | 'ifMatch'>,\n): Promise<PutObjectResult & { hash: string }> {\n const bytes = toBytes(body)\n const hash = hashBytes(bytes)\n try {\n const result = await store.put(key, bytes, {\n ...options,\n ifNotExists: true,\n })\n return { ...result, hash }\n } catch (error) {\n if (!(error instanceof ConditionalWriteError)) throw error\n const existing = await store.get(key)\n if (existing === undefined) {\n throw new Error(\n `Immutable create-only collision on \"${key}\" (object missing after precondition failure)`,\n { cause: error },\n )\n }\n if (bytesEqual(existing, bytes)) {\n const meta = await store.stat(key)\n return { hash, ...(meta?.etag !== undefined && { etag: meta.etag }) }\n }\n throw new Error(\n `Immutable create-only collision on \"${key}\": existing bytes differ `\n + `(wanted hash ${hash}, existing hash ${hashBytes(existing)})`,\n { cause: error },\n )\n }\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { CACHE_CONTROL_IMMUTABLE, GENERATIONS_PREFIX } from './constants.ts'\nimport { putCreateOnly } from './putCreateOnly.ts'\nimport type { GenerationObjectRef, PublishObjectInput } from './types.ts'\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new Error('Publication aborted')\n }\n}\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n}\n\nexport async function writeImmutableObjects(\n store: DappObjectWriter,\n role: 'state' | 'index',\n generation: string,\n objects: readonly PublishObjectInput[],\n signal: AbortSignal | undefined,\n fenced: boolean,\n): Promise<GenerationObjectRef[]> {\n const refs: GenerationObjectRef[] = []\n for (const object of objects) {\n assertNotAborted(signal)\n const relativeKey = `${GENERATIONS_PREFIX}/${generation}/${object.key.replaceAll(/^\\/+/g, '')}`\n const bytes = toBytes(object.body)\n const contentType = object.contentType ?? 'application/json'\n const putOpts = {\n contentType,\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n ...(object.metadata !== undefined && { metadata: object.metadata }),\n }\n let hash: string\n if (fenced) {\n hash = (await putCreateOnly(store, relativeKey, bytes, putOpts)).hash\n } else {\n hash = hashBytes(bytes)\n await store.put(relativeKey, bytes, putOpts)\n }\n const publicUrl = store.publicUrl(relativeKey)\n refs.push({\n role,\n key: relativeKey,\n hash,\n size: bytes.byteLength,\n contentType,\n ...(publicUrl !== undefined && { publicUrl }),\n })\n }\n return refs\n}\n\nexport async function writeManifest(\n store: DappObjectWriter,\n manifestKey: string,\n manifestBody: string,\n fenced: boolean,\n): Promise<void> {\n const opts = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n }\n if (fenced) {\n await putCreateOnly(store, manifestKey, manifestBody, opts)\n return\n }\n await store.put(manifestKey, manifestBody, opts)\n}\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { ConditionalWriteError } from '../providers/errors.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n CACHE_CONTROL_REVALIDATE,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n PINS_KEY,\n PINS_SCHEMA,\n RECEIPTS_PREFIX,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport type { PublicationSafety } from './safety.ts'\nimport type { HeadManifest } from './types.ts'\n\nexport interface ReleasePin {\n generation: string\n pinnedAt: string\n reason?: string\n}\n\nexport interface PinsDocument {\n pins: ReleasePin[]\n schema: typeof PINS_SCHEMA\n updatedAt: string\n}\n\nexport interface ReleaseSummary {\n generation: string\n kind: 'full' | 'incremental' | 'unknown'\n manifestKey?: string\n receiptKey?: string\n}\n\nasync function readPins(state: DappObjectWriter): Promise<{ doc: PinsDocument; etag?: string }> {\n const found = await state.getWithMeta(PINS_KEY)\n if (found === undefined) {\n const now = new Date()\n return {\n doc: {\n schema: PINS_SCHEMA,\n pins: [],\n updatedAt: now.toISOString(),\n },\n }\n }\n const decoder = new TextDecoder()\n const doc = JSON.parse(decoder.decode(found.body)) as PinsDocument\n return {\n doc,\n ...(found.meta.etag !== undefined && { etag: found.meta.etag }),\n }\n}\n\nasync function writePins(\n state: DappObjectWriter,\n doc: PinsDocument,\n expectedEtag?: string,\n): Promise<void> {\n const body = `${JSON.stringify(doc, null, 2)}\\n`\n const opts = {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_REVALIDATE,\n ...(expectedEtag === undefined\n ? { ifNotExists: true as const }\n : { ifMatch: expectedEtag }),\n }\n try {\n await state.put(PINS_KEY, body, opts)\n } catch (error) {\n if (error instanceof ConditionalWriteError && expectedEtag === undefined) {\n // First write raced; retry as update after re-read is caller's concern.\n }\n throw error\n }\n}\n\n/**\nList committed full generations and incremental receipts under the state role.\n*/\nexport async function listReleases(state: DappObjectWriter): Promise<ReleaseSummary[]> {\n const byGen = new Map<string, ReleaseSummary>()\n for await (const key of state.listAsync(`${GENERATIONS_PREFIX}/`)) {\n // generations/<id>/manifest.json or generations/<id>/\u2026\n const parts = key.split('/')\n if (parts.length < 3 || parts[0] !== GENERATIONS_PREFIX) continue\n const generation = parts[1]!\n const existing = byGen.get(generation) ?? { generation, kind: 'full' as const }\n if (parts[2] === 'manifest.json') {\n existing.manifestKey = key\n existing.kind = 'full'\n }\n byGen.set(generation, existing)\n }\n for await (const key of state.listAsync(`${RECEIPTS_PREFIX}/`)) {\n // receipts/<id>.json\n const base = key.slice(RECEIPTS_PREFIX.length + 1).replace(/\\.json$/, '')\n if (base.length === 0) continue\n const existing = byGen.get(base) ?? { generation: base, kind: 'incremental' as const }\n existing.receiptKey = key\n if (existing.manifestKey === undefined) existing.kind = 'incremental'\n byGen.set(base, existing)\n }\n return byGen.values().toArray().toSorted((a, b) => a.generation.localeCompare(b.generation))\n}\n\n/**\nPin a generation so retention/GC will not delete it.\n*/\nexport async function pinRelease(\n state: DappObjectWriter,\n generation: string,\n opts?: { reason?: string },\n): Promise<PinsDocument> {\n const { doc, etag } = await readPins(state)\n if (doc.pins.some(p => p.generation === generation)) return doc\n const now = new Date()\n const next: PinsDocument = {\n schema: PINS_SCHEMA,\n updatedAt: now.toISOString(),\n pins: [\n ...doc.pins,\n {\n generation,\n pinnedAt: now.toISOString(),\n ...(opts?.reason !== undefined && { reason: opts.reason }),\n },\n ],\n }\n await writePins(state, next, etag)\n return next\n}\n\n/**\nRemove a pin. Does not change head.\n*/\nexport async function unpinRelease(\n state: DappObjectWriter,\n generation: string,\n): Promise<PinsDocument> {\n const { doc, etag } = await readPins(state)\n const now = new Date()\n const next: PinsDocument = {\n schema: PINS_SCHEMA,\n updatedAt: now.toISOString(),\n pins: doc.pins.filter(p => p.generation !== generation),\n }\n await writePins(state, next, etag)\n return next\n}\n\nexport async function listPins(state: DappObjectWriter): Promise<readonly ReleasePin[]> {\n return (await readPins(state)).doc.pins\n}\n\nexport interface RollbackHeadInput {\n expectedHeadEtag?: string\n /**\n When true, skip capability checks for unfenced/dev stores.\n */\n safety: PublicationSafety\n targetGeneration: string\n}\n\n/**\n * Conditionally set head to a prior complete generation without rewriting\n * immutable generation objects. Head remains publication authority.\n */\nexport async function rollbackHead(\n state: DappObjectWriter,\n input: RollbackHeadInput,\n): Promise<{ head: HeadManifest; headEtag?: string; ok: true } | { message: string; ok: false }> {\n const current = await readPublishedHead(state)\n if (current === undefined) {\n return { ok: false, message: 'No current head to roll back' }\n }\n if (current.head.generation === input.targetGeneration) {\n return {\n ok: true, head: current.head, ...(current.headEtag !== undefined && { headEtag: current.headEtag }),\n }\n }\n\n const manifestKey = `${GENERATIONS_PREFIX}/${input.targetGeneration}/manifest.json`\n const receiptKey = `${RECEIPTS_PREFIX}/${input.targetGeneration}.json`\n const manifestBody = await state.get(manifestKey)\n const receiptBody = manifestBody === undefined ? await state.get(receiptKey) : undefined\n\n let head: HeadManifest\n const now = new Date()\n const publishedAt = now.toISOString()\n if (manifestBody !== undefined) {\n const encoder = new TextEncoder()\n const bytes = typeof manifestBody === 'string'\n ? encoder.encode(manifestBody)\n : manifestBody\n const decoder = new TextDecoder()\n const parsed = JSON.parse(decoder.decode(bytes)) as { generation?: string }\n if (parsed.generation !== input.targetGeneration) {\n return { ok: false, message: 'Target manifest generation mismatch' }\n }\n head = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: input.targetGeneration,\n manifestKey,\n manifestHash: hashBytes(bytes),\n publishedAt,\n previousGeneration: current.head.generation,\n trust: current.head.trust ?? 'trusted-origin',\n revision: (current.head.revision ?? 1) + 1,\n layout: 'full',\n }\n } else if (receiptBody === undefined) {\n return { ok: false, message: `Target generation \"${input.targetGeneration}\" not found` }\n } else {\n const decoder = new TextDecoder()\n const receipt = JSON.parse(decoder.decode(receiptBody)) as {\n generation: string\n rootHash: string\n rootKey: string\n }\n head = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: receipt.generation,\n manifestKey: receipt.rootKey,\n manifestHash: receipt.rootHash,\n publishedAt,\n previousGeneration: current.head.generation,\n trust: current.head.trust ?? 'trusted-origin',\n revision: (current.head.revision ?? 1) + 1,\n layout: 'incremental-cas',\n }\n }\n\n const fenced = input.safety.mode !== 'unfenced'\n const etag = input.expectedHeadEtag ?? current.headEtag\n const committed = await commitHead(state, head, input.safety, fenced, etag)\n if ('conflict' in committed) {\n return { ok: false, message: committed.conflict.message }\n }\n return {\n ok: true,\n head,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n}\n\nexport { HEAD_KEY, PINS_KEY }\n", "import type { DappObjectWriter } from '../providers/capabilities.ts'\nimport {\n CAS_PREFIX,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_ROOTS_PREFIX,\n MAP_SHARDS_PREFIX,\n PINS_KEY,\n RECEIPTS_PREFIX,\n STATUS_KEY,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport { listPins } from './releases.ts'\n\nexport type RetentionPolicy\n = | { mode: 'forever' }\n | {\n cdnGraceMs: number\n mode: 'bounded'\n /**\n Minimum number of recent full/incremental generations to keep beyond active.\n */\n retainGenerations: number\n }\n\nexport interface GcKeyRef {\n key: string\n reason?: string\n role: 'state' | 'index'\n}\n\nexport interface GcPlan {\n deleteKeys: GcKeyRef[]\n policy: RetentionPolicy\n retainKeys: GcKeyRef[]\n}\n\nexport interface GcRunResult {\n deleted: GcKeyRef[]\n dryRun: boolean\n skipped: GcKeyRef[]\n}\n\nconst PROTECTED_KEYS = new Set([HEAD_KEY, STATUS_KEY, PINS_KEY])\n\nfunction decodeJson(bytes: Uint8Array): unknown {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(bytes))\n}\n\nfunction generationFromKey(key: string): string | undefined {\n if (key.startsWith(`${GENERATIONS_PREFIX}/`)) {\n return key.split('/', 2)[1]\n }\n if (key.startsWith(`${RECEIPTS_PREFIX}/`) && key.endsWith('.json')) {\n return key.slice(RECEIPTS_PREFIX.length + 1, -'.json'.length)\n }\n return undefined\n}\n\nasync function collectGenerationKeys(\n store: DappObjectWriter,\n generation: string,\n): Promise<string[]> {\n const keys: string[] = []\n for await (const key of store.listAsync(`${GENERATIONS_PREFIX}/${generation}/`)) {\n keys.push(key)\n }\n const receipt = `${RECEIPTS_PREFIX}/${generation}.json`\n if (await store.stat(receipt) !== undefined) keys.push(receipt)\n return keys\n}\n\nasync function collectCasAndMapFromHead(\n state: DappObjectWriter,\n index: DappObjectWriter | undefined,\n generation: string,\n): Promise<{ indexKeys: string[]; stateKeys: string[] }> {\n const stateKeys: string[] = []\n const indexKeys: string[] = []\n // Full layout objects under generations/\n stateKeys.push(...await collectGenerationKeys(state, generation))\n if (index !== undefined) {\n for await (const key of index.listAsync(`${GENERATIONS_PREFIX}/${generation}/`)) {\n indexKeys.push(key)\n }\n }\n // Incremental: receipt \u2192 root \u2192 shards \u2192 cas refs\n const receiptKey = `${RECEIPTS_PREFIX}/${generation}.json`\n const receiptBody = await state.get(receiptKey)\n if (receiptBody === undefined) {\n return { stateKeys, indexKeys }\n }\n stateKeys.push(receiptKey)\n const receipt = decodeJson(receiptBody) as {\n objects?: { key: string; role: string }[]\n rootHash?: string\n rootKey?: string\n }\n if (receipt.rootKey !== undefined) stateKeys.push(receipt.rootKey)\n if (receipt.rootHash !== undefined) {\n const rootKey = receipt.rootKey ?? `${MAP_ROOTS_PREFIX}/${receipt.rootHash}.json`\n const rootBody = await state.get(rootKey)\n if (rootBody !== undefined) {\n const root = decodeJson(rootBody) as {\n shards?: Record<string, string>\n }\n for (const shardHash of Object.values(root.shards ?? {})) {\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n stateKeys.push(shardKey)\n // Shards may live on index role in some layouts; check both.\n const shardBody = await state.get(shardKey)\n ?? (index === undefined ? undefined : await index.get(shardKey))\n if (shardBody === undefined) continue\n const shard = decodeJson(shardBody) as {\n entries?: Record<string, { hash: string }>\n }\n for (const entry of Object.values(shard.entries ?? {})) {\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n indexKeys.push(casKey)\n stateKeys.push(casKey)\n }\n }\n }\n }\n for (const obj of receipt.objects ?? []) {\n if (obj.role === 'index') indexKeys.push(obj.key)\n else stateKeys.push(obj.key)\n }\n return { stateKeys, indexKeys }\n}\n\n/**\n * Plan garbage collection of derived state/index objects. Never touches the\n * data role. Protects active head, pins, and an optional in-flight generation.\n */\n/* eslint-disable max-statements, complexity -- GC planning is intentionally a single pass over live sets */\nexport async function planGarbageCollection(options: {\n inFlightGeneration?: string\n index?: DappObjectWriter\n policy: RetentionPolicy\n state: DappObjectWriter\n}): Promise<GcPlan> {\n const {\n state, index, policy, inFlightGeneration,\n } = options\n if (policy.mode === 'forever') {\n return {\n policy, deleteKeys: [], retainKeys: [],\n }\n }\n\n const head = await readPublishedHead(state)\n const pins = await listPins(state)\n const protectedGens = new Set<string>()\n if (head !== undefined) protectedGens.add(head.head.generation)\n if (head?.head.previousGeneration !== undefined) {\n protectedGens.add(head.head.previousGeneration)\n }\n for (const pin of pins) protectedGens.add(pin.generation)\n if (inFlightGeneration !== undefined) protectedGens.add(inFlightGeneration)\n\n // Keep N most recent generations by listing releases (lexicographic id order is\n // not time order; prefer receipt/manifest listing order by key and retain count).\n const allGenKeys = await state.list(`${GENERATIONS_PREFIX}/`)\n const genIds = new Set<string>()\n for (const key of allGenKeys) {\n const id = generationFromKey(key)\n if (id !== undefined) genIds.add(id)\n }\n for await (const key of state.listAsync(`${RECEIPTS_PREFIX}/`)) {\n const id = generationFromKey(key)\n if (id !== undefined) genIds.add(id)\n }\n const ordered = genIds.values().toArray().toSorted()\n const retainTail = ordered.slice(-policy.retainGenerations)\n for (const id of retainTail) protectedGens.add(id)\n\n const liveState = new Set<string>(PROTECTED_KEYS)\n const liveIndex = new Set<string>()\n for (const gen of protectedGens) {\n const collected = await collectCasAndMapFromHead(state, index, gen)\n for (const k of collected.stateKeys) liveState.add(k)\n for (const k of collected.indexKeys) liveIndex.add(k)\n }\n\n const deleteKeys: GcKeyRef[] = []\n const retainKeys: GcKeyRef[] = []\n\n for await (const key of state.listAsync()) {\n if (PROTECTED_KEYS.has(key)) {\n retainKeys.push({\n role: 'state', key, reason: 'protected-well-known',\n })\n continue\n }\n if (liveState.has(key)) {\n retainKeys.push({\n role: 'state', key, reason: 'live',\n })\n continue\n }\n // Grace: if key has gen still protected, skip (already handled). Else delete.\n const gen = generationFromKey(key)\n if (gen !== undefined && protectedGens.has(gen)) {\n retainKeys.push({\n role: 'state', key, reason: 'protected-generation',\n })\n continue\n }\n deleteKeys.push({\n role: 'state', key, reason: 'unreferenced',\n })\n }\n\n if (index !== undefined) {\n for await (const key of index.listAsync()) {\n if (liveIndex.has(key)) {\n retainKeys.push({\n role: 'index', key, reason: 'live',\n })\n continue\n }\n const gen = generationFromKey(key)\n if (gen !== undefined && protectedGens.has(gen)) {\n retainKeys.push({\n role: 'index', key, reason: 'protected-generation',\n })\n continue\n }\n deleteKeys.push({\n role: 'index', key, reason: 'unreferenced',\n })\n }\n }\n\n // CDN grace is advisory in the plan metadata; callers delay run by cdnGraceMs.\n void policy.cdnGraceMs\n\n return {\n policy, deleteKeys, retainKeys,\n }\n}\n\n/**\nExecute a GC plan. `dryRun: true` (default) only reports; false deletes.\n*/\nexport async function runGarbageCollection(\n plan: GcPlan,\n stores: {\n index?: DappObjectWriter\n state: DappObjectWriter\n },\n opts?: { dryRun?: boolean },\n): Promise<GcRunResult> {\n const dryRun = opts?.dryRun !== false\n if (dryRun) {\n return {\n dryRun: true, deleted: [], skipped: plan.deleteKeys,\n }\n }\n const deleted: GcKeyRef[] = []\n const skipped: GcKeyRef[] = []\n for (const ref of plan.deleteKeys) {\n try {\n const store = ref.role === 'index' ? stores.index : stores.state\n if (store === undefined) {\n skipped.push({ ...ref, reason: 'no-store' })\n continue\n }\n await store.delete(ref.key)\n deleted.push(ref)\n } catch {\n skipped.push(ref)\n }\n }\n return {\n dryRun: false, deleted, skipped,\n }\n}\n", "import { randomUUID } from 'node:crypto'\n\nimport type { DappObjectWriter } from '../providers/capabilities.ts'\nimport { hashBytes } from '../providers/hashBytes.ts'\nimport { canonicalHeadBytes } from './canonicalHead.ts'\nimport { commitHead } from './commitHead.ts'\nimport {\n CACHE_CONTROL_IMMUTABLE,\n CACHE_CONTROL_REVALIDATE,\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n HEAD_KEY,\n HEAD_MANIFEST_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_ROOTS_PREFIX,\n MAP_SHARD_SCHEMA,\n MAP_SHARDS_PREFIX,\n RECEIPT_SCHEMA,\n RECEIPTS_PREFIX,\n} from './constants.ts'\nimport { readPublishedHead } from './publishGeneration.ts'\nimport { putCreateOnly } from './putCreateOnly.ts'\nimport type { PublicationSafety, PublicationTrust } from './safety.ts'\nimport { assertPublicationSafety } from './safety.ts'\nimport { shardIdForKey } from './shard.ts'\nimport type { HeadManifest, PublishObjectInput } from './types.ts'\n\nexport interface MapRoot {\n schema: typeof MAP_ROOT_SCHEMA\n /**\n shardId \u2192 shard content hash\n */\n shards: Record<string, string>\n}\n\nexport interface MapShard {\n entries: Record<string, {\n contentType?: string\n hash: string\n size: number\n }>\n schema: typeof MAP_SHARD_SCHEMA\n}\n\nexport interface GenerationReceipt {\n changedCount: number\n generation: string\n previousGeneration?: string\n publishedAt: string\n reducer: { name: string; version?: string }\n rootHash: string\n rootKey: string\n schema: typeof RECEIPT_SCHEMA\n source?: {\n completedPosition?: string\n cursor?: string\n floor?: string\n observedHead?: string\n }\n}\n\nexport interface PublishIncrementalInput {\n assertSafety?: boolean\n deletedKeys?: readonly string[]\n expectedHeadEtag?: string\n generation?: string\n index: DappObjectWriter\n /**\n Logical key changes for the index role (primary high-cardinality surface).\n */\n indexChanges?: readonly PublishObjectInput[]\n previousGeneration?: string\n reducer: { name: string; version?: string }\n revision?: number\n safety: PublicationSafety\n shardHexChars?: number\n signal?: AbortSignal\n source?: GenerationReceipt['source']\n state: DappObjectWriter\n /**\n Optional small state-role changes (still CAS + sharded).\n */\n stateChanges?: readonly PublishObjectInput[]\n trust?: PublicationTrust\n}\n\nexport type PublishIncrementalResult\n = | {\n generation: string\n head: HeadManifest\n headEtag?: string\n ok: true\n receipt: GenerationReceipt\n root: MapRoot\n rootHash: string\n writes: number\n }\n | {\n conflict: { kind: string; message: string }\n ok: false\n }\n\nfunction toBytes(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n}\n\nfunction decodeJson(bytes: Uint8Array): unknown {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(bytes))\n}\n\nexport { shardIdForKey } from './shard.ts'\n\nasync function putCas(\n store: DappObjectWriter,\n body: Uint8Array,\n contentType: string,\n fenced: boolean,\n): Promise<{ hash: string; key: string }> {\n const hash = hashBytes(body)\n const key = `${CAS_PREFIX}/${hash}`\n const opts = {\n contentType,\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n }\n if (fenced) {\n await putCreateOnly(store, key, body, opts)\n } else {\n const existing = await store.get(key)\n if (existing === undefined) await store.put(key, body, opts)\n }\n return { hash, key }\n}\n\nasync function loadRoot(state: DappObjectWriter, head: HeadManifest | undefined): Promise<MapRoot> {\n if (head === undefined || head.layout !== 'incremental-cas') {\n return { schema: MAP_ROOT_SCHEMA, shards: {} }\n }\n const body = await state.get(head.manifestKey)\n if (body === undefined) {\n return { schema: MAP_ROOT_SCHEMA, shards: {} }\n }\n return decodeJson(body) as MapRoot\n}\n\nasync function loadShard(\n state: DappObjectWriter,\n shardHash: string | undefined,\n): Promise<MapShard> {\n if (shardHash === undefined) {\n return { schema: MAP_SHARD_SCHEMA, entries: {} }\n }\n const key = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const body = await state.get(key)\n if (body === undefined) {\n return { schema: MAP_SHARD_SCHEMA, entries: {} }\n }\n return decodeJson(body) as MapShard\n}\n\n/**\n * Incremental high-cardinality publication: write only changed objects to CAS,\n * update touched shards + root, then fenced head-last commit. Unchanged logical\n * keys keep stable `cas/sha256/<hash>` URLs.\n */\n/* eslint-disable max-statements, complexity -- incremental publish orchestrates CAS/shards/head */\nexport async function publishIncremental(\n input: PublishIncrementalInput,\n): Promise<PublishIncrementalResult> {\n const generation = input.generation ?? randomUUID()\n const fenced = input.safety.mode !== 'unfenced'\n const hexChars = input.shardHexChars ?? DEFAULT_SHARD_HEX_CHARS\n let writes = 0\n\n if (input.assertSafety !== false && input.safety.mode === 'conditional-head') {\n await assertPublicationSafety(input.state, input.safety)\n }\n\n const prior = await readPublishedHead(input.state)\n const root = await loadRoot(input.state, prior?.head)\n const touched = new Map<string, MapShard>()\n\n const applyChange = async (\n store: DappObjectWriter,\n object: PublishObjectInput,\n ): Promise<void> => {\n const logicalKey = object.key.replaceAll(/^\\/+/g, '')\n const bytes = toBytes(object.body)\n const contentType = object.contentType ?? 'application/json'\n const cas = await putCas(store, bytes, contentType, fenced)\n writes += 1\n const sid = shardIdForKey(logicalKey, hexChars)\n let shard = touched.get(sid)\n if (shard === undefined) {\n shard = await loadShard(input.state, root.shards[sid])\n touched.set(sid, shard)\n }\n shard.entries[logicalKey] = {\n hash: cas.hash,\n size: bytes.byteLength,\n contentType,\n }\n }\n\n for (const object of input.indexChanges ?? []) {\n await applyChange(input.index, object)\n }\n for (const object of input.stateChanges ?? []) {\n await applyChange(input.state, object)\n }\n for (const logicalKey of input.deletedKeys ?? []) {\n const sid = shardIdForKey(logicalKey, hexChars)\n let shard = touched.get(sid)\n if (shard === undefined) {\n shard = await loadShard(input.state, root.shards[sid])\n touched.set(sid, shard)\n }\n delete shard.entries[logicalKey]\n }\n\n const nextShards = { ...root.shards }\n for (const [sid, shard] of touched) {\n const shardBody = `${JSON.stringify(shard, null, 2)}\\n`\n const shardHash = hashBytes(shardBody)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n if (fenced) {\n await putCreateOnly(input.state, shardKey, shardBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(shardKey, shardBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n if (Object.keys(shard.entries).length === 0) delete nextShards[sid]\n else nextShards[sid] = shardHash\n }\n\n const nextRoot: MapRoot = { schema: MAP_ROOT_SCHEMA, shards: nextShards }\n const rootBody = `${JSON.stringify(nextRoot, null, 2)}\\n`\n const rootHash = hashBytes(rootBody)\n const rootKey = `${MAP_ROOTS_PREFIX}/${rootHash}.json`\n if (fenced) {\n await putCreateOnly(input.state, rootKey, rootBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(rootKey, rootBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n\n const publishedAtDate = new Date()\n const publishedAt = publishedAtDate.toISOString()\n const receipt: GenerationReceipt = {\n schema: RECEIPT_SCHEMA,\n generation,\n publishedAt,\n rootHash,\n rootKey,\n changedCount: (input.indexChanges?.length ?? 0)\n + (input.stateChanges?.length ?? 0)\n + (input.deletedKeys?.length ?? 0),\n reducer: {\n name: input.reducer.name,\n ...(input.reducer.version !== undefined && { version: input.reducer.version }),\n },\n ...(input.previousGeneration !== undefined\n && { previousGeneration: input.previousGeneration }),\n ...(prior?.head.generation !== undefined && input.previousGeneration === undefined\n && { previousGeneration: prior.head.generation }),\n ...(input.source !== undefined && { source: input.source }),\n }\n const receiptBody = `${JSON.stringify(receipt, null, 2)}\\n`\n const receiptKey = `${RECEIPTS_PREFIX}/${generation}.json`\n if (fenced) {\n await putCreateOnly(input.state, receiptKey, receiptBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n } else {\n await input.state.put(receiptKey, receiptBody, {\n contentType: 'application/json',\n cacheControl: CACHE_CONTROL_IMMUTABLE,\n })\n }\n writes += 1\n\n const trustMode = input.trust?.mode ?? 'trusted-origin'\n const head: HeadManifest = {\n schema: HEAD_MANIFEST_SCHEMA,\n generation,\n layout: 'incremental-cas',\n manifestKey: rootKey,\n manifestHash: rootHash,\n publishedAt,\n trust: trustMode,\n ...(receipt.previousGeneration !== undefined\n && { previousGeneration: receipt.previousGeneration }),\n revision: input.revision\n ?? ((prior?.head.revision ?? 0) + 1),\n }\n if (input.trust?.mode === 'signed') {\n head.signature = await input.trust.sign(canonicalHeadBytes(head))\n }\n\n const committed = await commitHead(\n input.state,\n head,\n input.safety,\n fenced,\n input.expectedHeadEtag ?? prior?.headEtag,\n )\n if ('conflict' in committed) {\n return {\n ok: false,\n conflict: {\n kind: committed.conflict.kind,\n message: committed.conflict.message,\n },\n }\n }\n\n // Also write a small revalidate pointer file for operators (optional).\n void CACHE_CONTROL_REVALIDATE\n void HEAD_KEY\n\n return {\n ok: true,\n generation,\n head,\n receipt,\n root: nextRoot,\n rootHash,\n writes,\n ...(committed.etag !== undefined && { headEtag: committed.etag }),\n }\n}\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", "import type { Logger } from '@ariestools/sdk'\n\nimport type { DappObjectReader, DappObjectWriter } from '../providers/capabilities.ts'\n\n/**\n * Optional progress a reducer may return after a successful pass. The actor\n * uses it to publish durable indexer status; the cursor must not advance past\n * a fully published generation (the publication helper writes head last).\n */\nexport interface DappReduceProgress {\n cursor?: string\n floor?: string\n generation?: string\n generationRoot?: string\n lastCompletedPosition?: string\n observedSourceHead?: string\n}\n\n/**\nWhat a reducer is handed each pass: the three bucket stores plus a logger.\n*/\nexport interface DappReduceContext {\n /**\n * Immutable reducer input / materialization (may be a datalake replica).\n * Read-only: reducers must not write through this principal.\n */\n data: DappObjectReader\n /**\n Derived, query-optimized views (writable).\n */\n index: DappObjectWriter\n logger: Logger\n /**\n * Abort signal cancelled when the actor stops. Long reducers should check\n * `signal.aborted` or pass it into fetches so shutdown can bound in-flight work.\n */\n signal: AbortSignal\n /**\n Derived current view (writable).\n */\n state: DappObjectWriter\n}\n\n/**\n * The pluggable unit of dapp logic. The DappActor timer calls `reduce` on an\n * interval; an implementation reads the immutable `data` bucket (and/or other\n * authoritative sources) and rebuilds `state` and `index`. Passes should be\n * idempotent and resume from a watermark so a slow or interrupted pass is safe\n * to repeat.\n */\nexport interface DappReducer {\n readonly name: string\n readonly version?: string\n reduce(context: DappReduceContext): Promise<void | DappReduceProgress>\n}\n\n/**\n * Default reducer: does nothing. The local harness runs the full timer/provider\n * spine with this in place; production entrypoints must supply a real reducer.\n * **Development only** \u2014 not a production indexer.\n */\nexport const noopReducer: DappReducer = {\n name: 'noop',\n async reduce(): Promise<void> {\n // no-op: the spine runs, no derivation happens\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["toBytes", "toBytes", "assertNotAborted", "randomUUID", "toBytes", "decodeJson", "randomUUID"]
|
|
7
7
|
}
|