@ariestools/aries-dapp-core 0.1.11 → 0.1.13

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.
@@ -409,19 +409,22 @@ let DappActor = class DappActor extends AbstractActor {
409
409
  await writeIndexerStatus(this._state, fields);
410
410
  }
411
411
  async runReducePass() {
412
+ const signal = this.signal;
412
413
  try {
413
414
  const result = await this.params.reducer.reduce({
414
415
  data: this._data,
415
416
  index: this._index,
416
417
  logger: this.logger,
417
- signal: this.signal,
418
+ signal,
418
419
  state: this._state
419
420
  });
421
+ if (signal.aborted) return;
420
422
  const progress = withDefaultGenerationRoot(result === void 0 ? void 0 : result);
421
423
  this._consecutiveFailures = 0;
422
424
  await this.safePublishStatus(progress);
423
425
  this.settleFirstPass();
424
426
  } catch (error) {
427
+ if (signal.aborted) return;
425
428
  const err = error instanceof Error ? error : new Error(String(error));
426
429
  this._consecutiveFailures += 1;
427
430
  await this.safePublishStatus(void 0, err);
@@ -1 +1 @@
1
- {"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AASrF,OAAO,KAAK,EAAsB,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE/E,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAmCD;;;;;;GAMG;AACH,qBACa,SAAU,SAAQ,aAAa,CAAC,eAAe,CAAC;IAC3D,MAAM,CAAC,QAAQ,CAAC,YAAY,iEAIlB;IAEV,SAAS,CAAC,KAAK,EAAG,gBAAgB,CAAA;IAClC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IACnC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IAEnC,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,0DAA0D;IAC1D,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAK7B,yBAAyB;YAkBzB,aAAa;YAsCb,iBAAiB;IAW/B,OAAO,CAAC,eAAe;CAMxB"}
1
+ {"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AASrF,OAAO,KAAK,EAAsB,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE/E,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAmCD;;;;;;GAMG;AACH,qBACa,SAAU,SAAQ,aAAa,CAAC,eAAe,CAAC;IAC3D,MAAM,CAAC,QAAQ,CAAC,YAAY,iEAIlB;IAEV,SAAS,CAAC,KAAK,EAAG,gBAAgB,CAAA;IAClC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IACnC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IAEnC,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,0DAA0D;IAC1D,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAK7B,yBAAyB;YAkBzB,aAAa;YA8Cb,iBAAiB;IAW/B,OAAO,CAAC,eAAe;CAMxB"}
@@ -395,19 +395,22 @@ var DappActor = class extends AbstractActor {
395
395
  await writeIndexerStatus(this._state, fields);
396
396
  }
397
397
  async runReducePass() {
398
+ const signal = this.signal;
398
399
  try {
399
400
  const result = await this.params.reducer.reduce({
400
401
  data: this._data,
401
402
  index: this._index,
402
403
  logger: this.logger,
403
- signal: this.signal,
404
+ signal,
404
405
  state: this._state
405
406
  });
407
+ if (signal.aborted) return;
406
408
  const progress = withDefaultGenerationRoot(result === void 0 ? void 0 : result);
407
409
  this._consecutiveFailures = 0;
408
410
  await this.safePublishStatus(progress);
409
411
  this.settleFirstPass();
410
412
  } catch (error) {
413
+ if (signal.aborted) return;
411
414
  const err = error instanceof Error ? error : new Error(String(error));
412
415
  this._consecutiveFailures += 1;
413
416
  await this.safePublishStatus(void 0, err);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/actor/AbstractActor.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/boot/bootDappActors.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 type { CreatableInstance, Logger } from '@ariestools/sdk'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@ariestools/sdk'\n\nimport type {\n ActorParams, DappContext, DappProviderLocator, ReadyState,\n} from './types.ts'\n\ninterface Deferred<T> {\n promise: Promise<T>\n reject: (reason: unknown) => void\n resolve: (value: T) => void\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void\n let reject!: (reason: unknown) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n // Always attach a sink so reject() is never an unhandled rejection when\n // callers do not await the promise (e.g. whenReady / first-pass readiness).\n void promise.catch(() => {\n // intentional\n })\n return {\n promise, reject, resolve,\n }\n}\n\n/**\n * Lean, dapp-owned fork of the xl1 `ActorV3` pattern: the create/start/stop\n * lifecycle from `AbstractCreatable`, plus non-overlapping interval timers and\n * a readiness contract. It deliberately swaps the chain's\n * `ProviderFactoryLocator`/`LocatorConfig` machinery for the small\n * {@link DappProviderLocator} seam, so a dapp actor resolves providers by\n * moniker without dragging the chain protocol config model in.\n *\n * The locator is process-wide: the daemon builds it once and passes the same\n * instance to every actor via `params.locator` (see `bootDappActors`). When\n * this graduates into a shared cli/actor toolkit \u2014 and, later, xl1-protocol \u2014\n * this base can re-adopt the real locator.\n */\nexport abstract class AbstractActor<TParams extends ActorParams = ActorParams> extends AbstractCreatable<TParams> {\n protected readonly _intervals = new Map<string, NodeJS.Timeout>()\n protected readonly _timeouts = new Map<string, NodeJS.Timeout>()\n\n private _abortController = new AbortController()\n private _idLogger?: Logger\n private readonly _inFlight = new Map<string, Promise<void>>()\n private readonly _readyDeferred = createDeferred<void>()\n private _readyError?: Error\n private _readyState: ReadyState = 'pending'\n\n override get logger(): Logger {\n this._idLogger ??= new IdLogger(\n assertEx(this.context.logger, () => `Logger is required in context for actor ${this.name}.`),\n () => this.name,\n )\n return this._idLogger\n }\n\n get readyError(): Error | undefined {\n return this._readyError\n }\n\n get readyState(): ReadyState {\n return this._readyState\n }\n\n protected get context(): DappContext {\n return this.locator.context\n }\n\n protected get locator(): DappProviderLocator {\n return this.params.locator\n }\n\n /** Abort signal cancelled when the actor stops (or is replaced on restart). */\n protected get signal(): AbortSignal {\n return this._abortController.signal\n }\n\n static override async paramsHandler<T extends CreatableInstance>(params?: Partial<T['params']>): Promise<T['params']> {\n const inParams = (params ?? {}) as Partial<T['params']> & { locator?: DappProviderLocator }\n const baseParams = await super.paramsHandler({ ...inParams, name: inParams.name ?? 'UnknownActor' }) as T['params']\n const locator = assertEx(inParams.locator, () => `params.locator is required for actor ${String(baseParams.name)}.`)\n return { ...baseParams, locator }\n }\n\n /** Override to prove the actor can do useful work. Default: no-op. */\n async readyHandler(): Promise<void> {\n // no-op by default\n }\n\n /**\n * Register a recurring task. The first invocation fires after `dueTimeMs`\n * (the documented first-run delay); subsequent invocations fire every\n * `periodMs` while the actor is `started`. A run is skipped if the previous\n * one is still in flight, so a slow pass can never stack on top of itself.\n * Must be called from `startHandler` (guards on `starting` status).\n */\n registerTimer(timerName: string, callback: () => Promise<void>, dueTimeMs: number, periodMs: number): void {\n if (this.status !== 'starting') {\n this.logger.warn(`Cannot register timer '${timerName}' because actor is not starting.`)\n return\n }\n const tick = (): void => {\n if (this.status !== 'started') return\n if (this._inFlight.has(timerName)) {\n this.logger.warn(`Skipping timer '${this.name}:${timerName}' because the previous run is still in flight.`)\n return\n }\n const run = (async (): Promise<void> => {\n const startTime = Date.now()\n try {\n await callback()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.logger.error(`Error in timer '${this.name}:${timerName}': ${err.message}`)\n } finally {\n const duration = Date.now() - startTime\n if (duration > periodMs) {\n this.logger.warn(`Timer '${this.name}:${timerName}' took ${duration}ms, longer than its ${periodMs}ms period.`)\n }\n }\n })()\n this._inFlight.set(timerName, run.finally(() => {\n this._inFlight.delete(timerName)\n }))\n }\n const timeoutId = setTimeout(() => {\n if (this.status !== 'started') return\n // Register the interval before the first tick so stop() can clear it,\n // then fire immediately so firstRunDelay is the true delay to first pass.\n this._intervals.set(timerName, setInterval(tick, periodMs))\n tick()\n }, dueTimeMs)\n this._timeouts.set(timerName, timeoutId)\n }\n\n /**\n * Run the warm-pass once. The standard boot path invokes this after\n * `start()` so readiness either resolves or rejects.\n */\n async runReadyHandler(): Promise<void> {\n if (this._readyState !== 'pending') return\n try {\n await this.readyHandler()\n this._readyState = 'ready'\n this._readyDeferred.resolve()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this._readyState = 'failed'\n this._readyError = err\n this._readyDeferred.reject(err)\n throw err\n }\n }\n\n override async startHandler(): Promise<void> {\n // Fresh signal for this start cycle (supports stop \u2192 start reuse).\n if (this._abortController.signal.aborted) {\n this._abortController = new AbortController()\n }\n await super.startHandler()\n }\n\n override async stopHandler(): Promise<void> {\n await super.stopHandler()\n this._abortController.abort()\n for (const timeoutRef of this._timeouts.values()) clearTimeout(timeoutRef)\n this._timeouts.clear()\n for (const intervalRef of this._intervals.values()) clearInterval(intervalRef)\n this._intervals.clear()\n const inFlight = [...this._inFlight.values()]\n this._inFlight.clear()\n const timeoutMs = this.params.shutdownTimeoutMs\n if (timeoutMs === undefined) {\n await Promise.allSettled(inFlight)\n return\n }\n await Promise.race([\n Promise.allSettled(inFlight),\n new Promise<void>((resolve) => {\n setTimeout(resolve, timeoutMs)\n }),\n ])\n }\n\n async whenReady(): Promise<void> {\n await this._readyDeferred.promise\n }\n}\n", "import { creatable } from '@ariestools/sdk'\n\nimport { AbstractActor } from './actor/AbstractActor.ts'\nimport type { ActorParams } 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 ActorParams {\n /** Delay before the first reduce pass. Defaults to 2000ms. */\n firstRunDelayMs?: number\n /**\n * When set, after this many consecutive reduce failures the actor stops so a\n * supervisor can restart the process.\n */\n maxConsecutiveFailures?: number\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 reduceIntervalMs?: number\n reducer: DappReducer\n}\n\nconst DEFAULT_REDUCE_INTERVAL_MS = 5000\nconst DEFAULT_FIRST_RUN_DELAY_MS = 2000\nconst REDUCE_TIMER = 'DappReduce'\n\ninterface Deferred<T> {\n promise: Promise<T>\n reject: (reason: Error) => void\n resolve: (value: T) => void\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void\n let reject!: (reason: Error) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n void promise.catch(() => {\n // intentional \u2014 readiness may not be awaited\n })\n return {\n promise, reject, resolve,\n }\n}\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. Multiple actors (each with its own\n * reducer) can share one locator; this is the default single-reducer instance\n * the local daemon boots.\n */\n@creatable()\nexport class DappActor extends AbstractActor<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 private _consecutiveFailures = 0\n private readonly _firstPass = createDeferred<void>()\n private _firstPassSettled = false\n\n /** Consecutive reduce failures since the last success. */\n get consecutiveFailures(): number {\n return this._consecutiveFailures\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 readyHandler(): Promise<void> {\n await this._firstPass.promise\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n const interval = this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS\n const firstRunDelay = this.params.firstRunDelayMs ?? DEFAULT_FIRST_RUN_DELAY_MS\n this.registerTimer(REDUCE_TIMER, async () => {\n await this.runReducePass()\n }, firstRunDelay, interval)\n this.logger.info(\n `DappActor started: reducer '${this.params.reducer.name}' every ${interval}ms `\n + `(first run in ${firstRunDelay}ms)`,\n )\n }\n\n override async stopHandler(): Promise<void> {\n this.settleFirstPass(new Error('Actor stopped before first reduce pass completed'))\n await super.stopHandler()\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 runReducePass(): Promise<void> {\n try {\n const result = await this.params.reducer.reduce({\n data: this._data,\n index: this._index,\n logger: this.logger,\n signal: this.signal,\n state: this._state,\n })\n const progress = withDefaultGenerationRoot(result === undefined ? undefined : result)\n this._consecutiveFailures = 0\n await this.safePublishStatus(progress)\n this.settleFirstPass()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this._consecutiveFailures += 1\n await this.safePublishStatus(undefined, err)\n // First pass always settles readiness so boot cannot hang.\n this.settleFirstPass(err)\n this.logger.error(\n `Error in reduce pass for '${this.params.reducer.name}': ${err.message}`,\n )\n const max = this.params.maxConsecutiveFailures\n if (max !== undefined && this._consecutiveFailures >= max) {\n this.logger.error(\n `Reducer '${this.params.reducer.name}' failed ${this._consecutiveFailures} `\n + 'consecutive times; stopping actor',\n )\n // Defer stop so this pass can finish without awaiting itself via in-flight.\n setTimeout(() => {\n void this.stop()\n }, 0)\n }\n // Do not rethrow: the actor timer already treats reduce errors as non-fatal\n // for the process (status + consecutive-failure policy handle observability).\n }\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 private settleFirstPass(error?: Error): void {\n if (this._firstPassSettled) return\n this._firstPassSettled = true\n if (error === undefined) this._firstPass.resolve()\n else this._firstPass.reject(error)\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/** Thrown when a read-only capability wrapper receives a write. */\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", "/** Well-known relative keys published by the coherent generation protocol. */\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/** Content-addressed object bodies (incremental layout). */\nexport const CAS_PREFIX = 'cas/sha256'\n/** Sharded logical map roots (incremental layout). */\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/** Sharded logical map shards (incremental layout). */\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/** Small generation receipts for incremental layout. */\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/** CDN caching: immutable generation objects and manifests. */\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/** CDN caching: mutable head and status objects that must revalidate. */\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/** Default shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards. */\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import 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 /** Override the status object key (default `status.json`). */\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/** Carry forward durable progress fields from a prior status object. */\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/** Build success status fields from reduce progress, falling back to prior. */\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/** Build failure status fields while preserving prior checkpoint progress. */\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 { 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. On partial failure, actors already started are stopped\n * before the error is rethrown. Returns them so the caller can stop them on\n * shutdown.\n */\nexport async function bootDappActors(\n locator: DappProviderLocator,\n specs: readonly DappActorSpec[],\n): Promise<DappActor[]> {\n const actors: DappActor[] = []\n try {\n for (const spec of specs) {\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 const actor = await DappActor.create(params)\n await actor.start()\n actors.push(actor)\n if (spec.runReady !== false) {\n await actor.runReadyHandler()\n }\n }\n return actors\n } catch (error) {\n for (const actor of [...actors].reverse()) {\n try {\n await actor.stop()\n } catch {\n // best-effort cleanup\n }\n }\n throw error\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 /** Origin the dapp server listens on, e.g. `http://127.0.0.1:8801`. */\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/** Strip a role prefix from a physical key, returning the relative key. */\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/** Normalize an optional public base URL (no trailing slash). */\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/** SHA-256 hex digest of a string or byte body. */\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/** Logical store roles in a dapp backend. */\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 /** Physical S3/R2 bucket name. */\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/** Object metadata returned by stat/get and accepted on put. */\nexport interface ObjectMeta {\n cacheControl?: string\n contentEncoding?: string\n contentLength?: number\n contentType?: string\n etag?: string\n lastModified?: Date\n /** User metadata (S3 `x-amz-meta-*`); keys are lower-cased by providers. */\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 /** Relative prefix under the role binding (not the full physical key). */\n prefix?: string\n}\n\nexport interface ListPage {\n continuationToken?: string\n isTruncated: boolean\n /** Relative keys (binding prefix stripped). */\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 /** Private S3-compatible API origin, e.g. `https://<account>.r2.cloudflarestorage.com`. */\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/** List committed full generations and incremental receipts under the state role. */\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/** Pin a generation so retention/GC will not delete it. */\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/** Remove a pin. Does not change head. */\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 /** When true, skip capability checks for unfenced/dev stores. */\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 /** Minimum number of recent full/incremental generations to keep beyond active. */\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/** Execute a GC plan. `dryRun: true` (default) only reports; false deletes. */\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 /** shardId \u2192 shard content hash */\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 /** Logical key changes for the index role (primary high-cardinality surface). */\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 /** Optional small state-role changes (still CAS + sharded). */\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/** What a reducer is handed each pass: the three bucket stores plus a logger. */\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 /** Derived, query-optimized views (writable). */\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 /** Derived current view (writable). */\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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",
4
+ "sourcesContent": ["import type { CreatableInstance, Logger } from '@ariestools/sdk'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@ariestools/sdk'\n\nimport type {\n ActorParams, DappContext, DappProviderLocator, ReadyState,\n} from './types.ts'\n\ninterface Deferred<T> {\n promise: Promise<T>\n reject: (reason: unknown) => void\n resolve: (value: T) => void\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void\n let reject!: (reason: unknown) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n // Always attach a sink so reject() is never an unhandled rejection when\n // callers do not await the promise (e.g. whenReady / first-pass readiness).\n void promise.catch(() => {\n // intentional\n })\n return {\n promise, reject, resolve,\n }\n}\n\n/**\n * Lean, dapp-owned fork of the xl1 `ActorV3` pattern: the create/start/stop\n * lifecycle from `AbstractCreatable`, plus non-overlapping interval timers and\n * a readiness contract. It deliberately swaps the chain's\n * `ProviderFactoryLocator`/`LocatorConfig` machinery for the small\n * {@link DappProviderLocator} seam, so a dapp actor resolves providers by\n * moniker without dragging the chain protocol config model in.\n *\n * The locator is process-wide: the daemon builds it once and passes the same\n * instance to every actor via `params.locator` (see `bootDappActors`). When\n * this graduates into a shared cli/actor toolkit \u2014 and, later, xl1-protocol \u2014\n * this base can re-adopt the real locator.\n */\nexport abstract class AbstractActor<TParams extends ActorParams = ActorParams> extends AbstractCreatable<TParams> {\n protected readonly _intervals = new Map<string, NodeJS.Timeout>()\n protected readonly _timeouts = new Map<string, NodeJS.Timeout>()\n\n private _abortController = new AbortController()\n private _idLogger?: Logger\n private readonly _inFlight = new Map<string, Promise<void>>()\n private readonly _readyDeferred = createDeferred<void>()\n private _readyError?: Error\n private _readyState: ReadyState = 'pending'\n\n override get logger(): Logger {\n this._idLogger ??= new IdLogger(\n assertEx(this.context.logger, () => `Logger is required in context for actor ${this.name}.`),\n () => this.name,\n )\n return this._idLogger\n }\n\n get readyError(): Error | undefined {\n return this._readyError\n }\n\n get readyState(): ReadyState {\n return this._readyState\n }\n\n protected get context(): DappContext {\n return this.locator.context\n }\n\n protected get locator(): DappProviderLocator {\n return this.params.locator\n }\n\n /** Abort signal cancelled when the actor stops (or is replaced on restart). */\n protected get signal(): AbortSignal {\n return this._abortController.signal\n }\n\n static override async paramsHandler<T extends CreatableInstance>(params?: Partial<T['params']>): Promise<T['params']> {\n const inParams = (params ?? {}) as Partial<T['params']> & { locator?: DappProviderLocator }\n const baseParams = await super.paramsHandler({ ...inParams, name: inParams.name ?? 'UnknownActor' }) as T['params']\n const locator = assertEx(inParams.locator, () => `params.locator is required for actor ${String(baseParams.name)}.`)\n return { ...baseParams, locator }\n }\n\n /** Override to prove the actor can do useful work. Default: no-op. */\n async readyHandler(): Promise<void> {\n // no-op by default\n }\n\n /**\n * Register a recurring task. The first invocation fires after `dueTimeMs`\n * (the documented first-run delay); subsequent invocations fire every\n * `periodMs` while the actor is `started`. A run is skipped if the previous\n * one is still in flight, so a slow pass can never stack on top of itself.\n * Must be called from `startHandler` (guards on `starting` status).\n */\n registerTimer(timerName: string, callback: () => Promise<void>, dueTimeMs: number, periodMs: number): void {\n if (this.status !== 'starting') {\n this.logger.warn(`Cannot register timer '${timerName}' because actor is not starting.`)\n return\n }\n const tick = (): void => {\n if (this.status !== 'started') return\n if (this._inFlight.has(timerName)) {\n this.logger.warn(`Skipping timer '${this.name}:${timerName}' because the previous run is still in flight.`)\n return\n }\n const run = (async (): Promise<void> => {\n const startTime = Date.now()\n try {\n await callback()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.logger.error(`Error in timer '${this.name}:${timerName}': ${err.message}`)\n } finally {\n const duration = Date.now() - startTime\n if (duration > periodMs) {\n this.logger.warn(`Timer '${this.name}:${timerName}' took ${duration}ms, longer than its ${periodMs}ms period.`)\n }\n }\n })()\n this._inFlight.set(timerName, run.finally(() => {\n this._inFlight.delete(timerName)\n }))\n }\n const timeoutId = setTimeout(() => {\n if (this.status !== 'started') return\n // Register the interval before the first tick so stop() can clear it,\n // then fire immediately so firstRunDelay is the true delay to first pass.\n this._intervals.set(timerName, setInterval(tick, periodMs))\n tick()\n }, dueTimeMs)\n this._timeouts.set(timerName, timeoutId)\n }\n\n /**\n * Run the warm-pass once. The standard boot path invokes this after\n * `start()` so readiness either resolves or rejects.\n */\n async runReadyHandler(): Promise<void> {\n if (this._readyState !== 'pending') return\n try {\n await this.readyHandler()\n this._readyState = 'ready'\n this._readyDeferred.resolve()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this._readyState = 'failed'\n this._readyError = err\n this._readyDeferred.reject(err)\n throw err\n }\n }\n\n override async startHandler(): Promise<void> {\n // Fresh signal for this start cycle (supports stop \u2192 start reuse).\n if (this._abortController.signal.aborted) {\n this._abortController = new AbortController()\n }\n await super.startHandler()\n }\n\n override async stopHandler(): Promise<void> {\n await super.stopHandler()\n this._abortController.abort()\n for (const timeoutRef of this._timeouts.values()) clearTimeout(timeoutRef)\n this._timeouts.clear()\n for (const intervalRef of this._intervals.values()) clearInterval(intervalRef)\n this._intervals.clear()\n const inFlight = [...this._inFlight.values()]\n this._inFlight.clear()\n const timeoutMs = this.params.shutdownTimeoutMs\n if (timeoutMs === undefined) {\n await Promise.allSettled(inFlight)\n return\n }\n await Promise.race([\n Promise.allSettled(inFlight),\n new Promise<void>((resolve) => {\n setTimeout(resolve, timeoutMs)\n }),\n ])\n }\n\n async whenReady(): Promise<void> {\n await this._readyDeferred.promise\n }\n}\n", "import { creatable } from '@ariestools/sdk'\n\nimport { AbstractActor } from './actor/AbstractActor.ts'\nimport type { ActorParams } 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 ActorParams {\n /** Delay before the first reduce pass. Defaults to 2000ms. */\n firstRunDelayMs?: number\n /**\n * When set, after this many consecutive reduce failures the actor stops so a\n * supervisor can restart the process.\n */\n maxConsecutiveFailures?: number\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 reduceIntervalMs?: number\n reducer: DappReducer\n}\n\nconst DEFAULT_REDUCE_INTERVAL_MS = 5000\nconst DEFAULT_FIRST_RUN_DELAY_MS = 2000\nconst REDUCE_TIMER = 'DappReduce'\n\ninterface Deferred<T> {\n promise: Promise<T>\n reject: (reason: Error) => void\n resolve: (value: T) => void\n}\n\nfunction createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void\n let reject!: (reason: Error) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n void promise.catch(() => {\n // intentional \u2014 readiness may not be awaited\n })\n return {\n promise, reject, resolve,\n }\n}\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. Multiple actors (each with its own\n * reducer) can share one locator; this is the default single-reducer instance\n * the local daemon boots.\n */\n@creatable()\nexport class DappActor extends AbstractActor<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 private _consecutiveFailures = 0\n private readonly _firstPass = createDeferred<void>()\n private _firstPassSettled = false\n\n /** Consecutive reduce failures since the last success. */\n get consecutiveFailures(): number {\n return this._consecutiveFailures\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 readyHandler(): Promise<void> {\n await this._firstPass.promise\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n const interval = this.params.reduceIntervalMs ?? DEFAULT_REDUCE_INTERVAL_MS\n const firstRunDelay = this.params.firstRunDelayMs ?? DEFAULT_FIRST_RUN_DELAY_MS\n this.registerTimer(REDUCE_TIMER, async () => {\n await this.runReducePass()\n }, firstRunDelay, interval)\n this.logger.info(\n `DappActor started: reducer '${this.params.reducer.name}' every ${interval}ms `\n + `(first run in ${firstRunDelay}ms)`,\n )\n }\n\n override async stopHandler(): Promise<void> {\n this.settleFirstPass(new Error('Actor stopped before first reduce pass completed'))\n await super.stopHandler()\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 runReducePass(): Promise<void> {\n // Keep the signal for this pass: a later start cycle replaces the actor's\n // controller, but cancellation of this pass must retain its original meaning.\n const signal = this.signal\n try {\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 this._consecutiveFailures = 0\n await this.safePublishStatus(progress)\n this.settleFirstPass()\n } catch (error) {\n // AbstractActor owns this signal, so its cancellation means stop() ended\n // this exact pass. Do not turn expected shutdown into reducer failure state.\n if (signal.aborted) return\n const err = error instanceof Error ? error : new Error(String(error))\n this._consecutiveFailures += 1\n await this.safePublishStatus(undefined, err)\n // First pass always settles readiness so boot cannot hang.\n this.settleFirstPass(err)\n this.logger.error(\n `Error in reduce pass for '${this.params.reducer.name}': ${err.message}`,\n )\n const max = this.params.maxConsecutiveFailures\n if (max !== undefined && this._consecutiveFailures >= max) {\n this.logger.error(\n `Reducer '${this.params.reducer.name}' failed ${this._consecutiveFailures} `\n + 'consecutive times; stopping actor',\n )\n // Defer stop so this pass can finish without awaiting itself via in-flight.\n setTimeout(() => {\n void this.stop()\n }, 0)\n }\n // Do not rethrow: the actor timer already treats reduce errors as non-fatal\n // for the process (status + consecutive-failure policy handle observability).\n }\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 private settleFirstPass(error?: Error): void {\n if (this._firstPassSettled) return\n this._firstPassSettled = true\n if (error === undefined) this._firstPass.resolve()\n else this._firstPass.reject(error)\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/** Thrown when a read-only capability wrapper receives a write. */\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", "/** Well-known relative keys published by the coherent generation protocol. */\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/** Content-addressed object bodies (incremental layout). */\nexport const CAS_PREFIX = 'cas/sha256'\n/** Sharded logical map roots (incremental layout). */\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/** Sharded logical map shards (incremental layout). */\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/** Small generation receipts for incremental layout. */\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/** CDN caching: immutable generation objects and manifests. */\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/** CDN caching: mutable head and status objects that must revalidate. */\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/** Default shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards. */\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import 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 /** Override the status object key (default `status.json`). */\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/** Carry forward durable progress fields from a prior status object. */\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/** Build success status fields from reduce progress, falling back to prior. */\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/** Build failure status fields while preserving prior checkpoint progress. */\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 { 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. On partial failure, actors already started are stopped\n * before the error is rethrown. Returns them so the caller can stop them on\n * shutdown.\n */\nexport async function bootDappActors(\n locator: DappProviderLocator,\n specs: readonly DappActorSpec[],\n): Promise<DappActor[]> {\n const actors: DappActor[] = []\n try {\n for (const spec of specs) {\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 const actor = await DappActor.create(params)\n await actor.start()\n actors.push(actor)\n if (spec.runReady !== false) {\n await actor.runReadyHandler()\n }\n }\n return actors\n } catch (error) {\n for (const actor of [...actors].reverse()) {\n try {\n await actor.stop()\n } catch {\n // best-effort cleanup\n }\n }\n throw error\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 /** Origin the dapp server listens on, e.g. `http://127.0.0.1:8801`. */\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/** Strip a role prefix from a physical key, returning the relative key. */\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/** Normalize an optional public base URL (no trailing slash). */\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/** SHA-256 hex digest of a string or byte body. */\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/** Logical store roles in a dapp backend. */\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 /** Physical S3/R2 bucket name. */\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/** Object metadata returned by stat/get and accepted on put. */\nexport interface ObjectMeta {\n cacheControl?: string\n contentEncoding?: string\n contentLength?: number\n contentType?: string\n etag?: string\n lastModified?: Date\n /** User metadata (S3 `x-amz-meta-*`); keys are lower-cased by providers. */\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 /** Relative prefix under the role binding (not the full physical key). */\n prefix?: string\n}\n\nexport interface ListPage {\n continuationToken?: string\n isTruncated: boolean\n /** Relative keys (binding prefix stripped). */\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 /** Private S3-compatible API origin, e.g. `https://<account>.r2.cloudflarestorage.com`. */\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/** List committed full generations and incremental receipts under the state role. */\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/** Pin a generation so retention/GC will not delete it. */\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/** Remove a pin. Does not change head. */\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 /** When true, skip capability checks for unfenced/dev stores. */\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 /** Minimum number of recent full/incremental generations to keep beyond active. */\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/** Execute a GC plan. `dryRun: true` (default) only reports; false deletes. */\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 /** shardId \u2192 shard content hash */\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 /** Logical key changes for the index role (primary high-cardinality surface). */\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 /** Optional small state-role changes (still CAS + sharded). */\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/** What a reducer is handed each pass: the three bucket stores plus a logger. */\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 /** Derived, query-optimized views (writable). */\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 /** Derived current view (writable). */\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
6
  "names": ["createDeferred", "toBytes", "toBytes", "assertNotAborted", "randomUUID", "toBytes", "randomUUID"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariestools/aries-dapp-core",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Aries dapp backend core: the DappActor (forked xl1 actor pattern), process-wide provider locator, pluggable reducer, and the composed daemon that runs the storage server plus actors",
5
5
  "keywords": [
6
6
  "ariestools",
@@ -40,9 +40,9 @@
40
40
  ],
41
41
  "dependencies": {
42
42
  "@ariestools/sdk": "~8.1.3",
43
- "@aws-sdk/client-s3": "~3.1090.0",
43
+ "@aws-sdk/client-s3": "~3.1091.0",
44
44
  "tslib": "~2.8.1",
45
- "@ariestools/aries-dapp-serve": "~0.1.11"
45
+ "@ariestools/aries-dapp-serve": "~0.1.13"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@ariestools/toolchain": "~8.7.21",