@smart-byte/leani-sdk 0.1.0-rc.7 → 0.1.0-rc.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,8 +71,8 @@ JSON body send `x-leani-request: 1`, which the node requires.
71
71
 
72
72
  Typed subscriptions accept a configured `processor` instance when a kind is
73
73
  ambiguous. `blobs.subscribe()` yields a `{ block, transactions }` payload on
74
- apply. Check `operation` before reading processor data: a finalized event has
75
- `{ throughBlock }` instead, or, when `isLiveGapChange()` holds, the
74
+ apply. Check `operation` before reading processor data: an `attested` or
75
+ `finalized` event has `{ throughBlock }` instead, or, when `isLiveGapChange()` holds, the
76
76
  `{ fromBlock, toBlock }` the live lane skipped. Pass an `AbortSignal` to stop an idle stream;
77
77
  leaving the loop cancels its response body.
78
78
 
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { LeaniError } from "./errors.ts";
2
2
  export { LeaniError, TransportError, type LeaniErrorBody } from "./errors.ts";
3
- export declare const SDK_VERSION: "0.1.0-rc.7";
3
+ export declare const SDK_VERSION: "0.1.0-rc.8";
4
4
  export type { components as OpenApiComponents, operations as OpenApiOperations, paths as OpenApiPaths, } from "./openapi.generated.ts";
5
5
  export type Hex = `0x${string}`;
6
- export type Finality = "preview" | "included" | "finalized";
7
- export type ChangeOperation = "apply" | "undo" | "finalized" | "reset_required";
6
+ export type Finality = "unattested" | "attested" | "finalized";
7
+ export type ChangeOperation = "apply" | "undo" | "attested" | "finalized" | "reset_required";
8
8
  export interface LeaniClientOptions {
9
9
  baseUrl: string | URL;
10
10
  token?: string;
@@ -390,6 +390,11 @@ export interface LiveGapChangeData {
390
390
  export type ChangeEnvelope<T = unknown> = ChangeMetadata & ({
391
391
  operation: "apply" | "undo";
392
392
  data: T | null;
393
+ } | {
394
+ operation: "attested";
395
+ data: {
396
+ throughBlock: number;
397
+ };
393
398
  } | {
394
399
  operation: "finalized";
395
400
  data: {
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { LeaniError, TransportError, responseError, errorFromBody, } from "./err
2
2
  import { concatBytes, idleWatchdog, readChunks, readJson, resolveUnder, send, withDeadline, } from "./transport.js";
3
3
  export { LeaniError, TransportError } from "./errors.js";
4
4
  // Kept literal for toolchain compatibility; tests pin it to package.json.
5
- export const SDK_VERSION = "0.1.0-rc.7";
5
+ export const SDK_VERSION = "0.1.0-rc.8";
6
6
  /** Sent on mutations without a JSON body, which the node otherwise refuses. */
7
7
  const LEANI_REQUEST_HEADER = Object.freeze({
8
8
  "x-leani-request": "1",
@@ -435,7 +435,7 @@ function validateChangeEnvelope(value) {
435
435
  !/^\d+$/.test(value.sequence) ||
436
436
  typeof value.cursor !== "string" ||
437
437
  value.cursor.length === 0 ||
438
- !["apply", "undo", "finalized", "reset_required"].includes(value.operation) ||
438
+ !["apply", "undo", "attested", "finalized", "reset_required"].includes(value.operation) ||
439
439
  typeof value.schema !== "string" ||
440
440
  value.schema.length === 0) {
441
441
  throw new LeaniError("invalid change envelope", {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LeaniError,\n TransportError,\n responseError,\n errorFromBody,\n} from \"./errors.ts\";\nimport {\n concatBytes,\n idleWatchdog,\n readChunks,\n readJson,\n resolveUnder,\n send,\n withDeadline,\n} from \"./transport.ts\";\nexport { LeaniError, TransportError, type LeaniErrorBody } from \"./errors.ts\";\n\n// Kept literal for toolchain compatibility; tests pin it to package.json.\nexport const SDK_VERSION = \"0.1.0-rc.7\" as const;\n\n/** Sent on mutations without a JSON body, which the node otherwise refuses. */\nconst LEANI_REQUEST_HEADER: Readonly<Record<string, string>> = Object.freeze({\n \"x-leani-request\": \"1\",\n});\n\nexport type {\n components as OpenApiComponents,\n operations as OpenApiOperations,\n paths as OpenApiPaths,\n} from \"./openapi.generated.ts\";\n\nexport type Hex = `0x${string}`;\nexport type Finality = \"preview\" | \"included\" | \"finalized\";\nexport type ChangeOperation =\n | \"apply\"\n | \"undo\"\n | \"finalized\"\n | \"reset_required\";\n\nexport interface LeaniClientOptions {\n baseUrl: string | URL;\n token?: string;\n timeoutMs?: number;\n fetch?: FetchLike;\n /**\n * Override typed query-extension mounts with canonical `basePath` values\n * returned by `capabilities()` when an ergonomic alias is unavailable.\n */\n queryBasePaths?: {\n blobs?: string;\n erc20?: string;\n uniswap?: string;\n };\n reconnect?: {\n initialDelayMs?: number;\n maxDelayMs?: number;\n jitter?: number;\n };\n}\n\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface ProcessorSummary {\n id: string;\n instance: string;\n version: string;\n codeHash: Hex;\n configHash: Hex;\n genericApi: \"processor-v1\";\n changeSchema: string;\n queryExtensions: QueryExtensionSummary[];\n subscriptions: boolean;\n artifactRetention: \"none\" | \"window\" | \"full\";\n deliveryOrdering: \"canonical\" | \"block_versioned_idempotent\";\n}\n\nexport interface QueryExtensionSummary {\n id: string;\n basePath: string;\n aliasPath: string | null;\n}\n\nexport interface QueryExtensionCapability extends QueryExtensionSummary {\n processor: string;\n}\n\nexport interface Capabilities {\n chainId: number;\n ethereumRpc: Record<string, unknown>;\n processors: ProcessorSummary[];\n queryExtensions: QueryExtensionCapability[];\n}\n\nexport interface NodeStatus {\n apiVersion: \"1\";\n project: string;\n version: string;\n chainId: number;\n uptimeSeconds: number;\n databaseBytes: number;\n processor: ProcessorSummary;\n processors: ProcessorSummary[];\n readiness: Readiness;\n}\n\nexport interface Readiness {\n liveRequired: boolean;\n liveReady: boolean;\n finalityRequired: boolean;\n finalityReady: boolean;\n ready: boolean;\n}\n\nexport interface Health {\n status: \"live\" | \"ready\" | \"not_ready\" | \"failed\";\n uptimeSeconds: number;\n database: \"available\" | \"unavailable\";\n readiness: Readiness;\n reasons: string[];\n}\n\nexport interface CoverageInterval {\n fromBlock: number;\n toBlock: number;\n finality: Finality;\n}\n\nexport interface ProcessorCoverage {\n chainId: number;\n chainFinalizedHead: {\n number: number;\n hash: string;\n } | null;\n requested?: {\n fromBlock: number;\n toBlock: number;\n } | null;\n available: CoverageInterval[];\n configuredStartBlock: number;\n processedThrough: number | null;\n finalizedThrough: number | null;\n complete: boolean;\n state:\n | \"starting\"\n | \"backfilling\"\n | \"catching_up\"\n | \"live\"\n | \"degraded\"\n | \"paused\"\n | \"failed\";\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n coverage: ProcessorCoverage;\n}\n\nexport interface BlobsBlock {\n network: string;\n blockNumber: number;\n blockHash: Hex;\n parentHash: Hex;\n timestamp: number;\n size: string;\n blobCount: number;\n blobGasUsed: string;\n excessBlobGas: string;\n /**\n * Protocol blob base fee in wei per blob gas: the EIP-4844 fee for\n * `excessBlobGas` under the fork active at `timestamp`. EIP-7918 does not\n * change it.\n */\n blobBaseFee: string;\n executionBaseFee: string;\n gasUsed: string;\n gasLimit: string;\n executionEthBurnedWei: string;\n /** `blobBaseFee` times `blobGasUsed`. */\n blobEthBurnedWei: string;\n /**\n * EIP-7918 reserve price in wei per blob gas from Fusaka on, `null` before.\n * It only changes how excess blob gas evolves and is not applied to\n * `blobBaseFee`.\n */\n reserveFeeWei: string | null;\n transactionCount: number;\n targetBlobsPerBlock: number;\n maxBlobsPerBlock: number;\n transformVersion: number;\n finality: Finality;\n}\n\nexport interface BlobTransaction {\n network: string;\n blockNumber: number;\n blockHash: Hex;\n txHash: Hex;\n transactionIndex: number;\n senderAddress: Hex;\n blobVersionedHashes: Hex[];\n blobCount: number;\n totalBurnedWei: string;\n executionBurnedWei: string;\n /** The block's `blobBaseFee` times this transaction's blob gas. */\n blobBurnedWei: string;\n}\n\nexport interface BlobsSnapshotEntry {\n block: BlobsBlock;\n transactions: BlobTransaction[];\n}\n\nexport interface ChangeHead {\n earliestSequence: string | null;\n latestSequence: string | null;\n cursor: string | null;\n}\n\nexport interface GenericOutputEntity<T = unknown> {\n ordinal: string;\n key: Hex;\n schema: string;\n data: T;\n blockNumber: number;\n blockTimestamp: number;\n finality: Finality;\n}\n\nexport interface OutputBounds {\n earliestBlock: number;\n latestBlock: number;\n earliestTimestamp: number;\n latestTimestamp: number;\n}\n\nexport interface GenericSnapshotPage<T = unknown> {\n data: GenericOutputEntity<T>[];\n nextCursor: string | null;\n snapshotId: string;\n boundaryCursor: string | null;\n rowCount: string;\n valueBytes: string;\n expiresAtUnixMs: string;\n retainedBounds: OutputBounds | null;\n coverage: ProcessorCoverage;\n recovery: {\n follow: string | null;\n outsideRetention: \"create_processor_instance_or_source_scan\";\n };\n}\n\nexport interface FollowSnapshotPage<T = unknown> extends GenericSnapshotPage<T> {\n boundaryCursor: string;\n recovery: GenericSnapshotPage<T>[\"recovery\"] & { follow: string };\n}\n\nexport interface OutputQueryOptions {\n fromBlock?: number;\n toBlock?: number;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport type ConsumerRole = \"required\" | \"best_effort\";\nexport type ConsumerState = \"active\" | \"reset_required\" | \"revoked\";\nexport type ConsumerStart =\n | { position: \"earliest_retained\" }\n | { position: \"current_head\" }\n | { position: \"cursor\"; cursor: string };\n\nexport interface CreateConsumerOptions {\n id: string;\n role: ConsumerRole;\n start: ConsumerStart;\n leaseTtlSeconds: number;\n credential: string;\n signal?: AbortSignal;\n}\n\nexport interface DurableConsumer {\n id: string;\n processorInstance: string;\n /** The delivery stream this consumer reads. */\n streamId: string;\n role: ConsumerRole;\n state: ConsumerState;\n acknowledgedSequence: string;\n deliveredSequence: string;\n acknowledgedCursor: string;\n deliveredCursor: string;\n /** Stream sessions that have taken the lease; `\"0\"` before the first. */\n leaseGeneration: string;\n leaseTtlMs: string;\n leaseExpiresAtUnixMs: string;\n leaseActive: boolean;\n lagChanges: string;\n lagBlocks: string;\n lagBytes: string;\n lagAgeMs: string;\n createdAtUnixMs: string;\n updatedAtUnixMs: string;\n}\n\nexport interface BlobSchedule {\n name: string;\n /**\n * Block-number label for `atBlock` lookups. For Dencun it is 19426589, the\n * first block the blobs processor covers.\n */\n activationBlock: number;\n /** The fork's parameters apply to blocks from this timestamp on. */\n activationTimestamp: number;\n forkId: Hex;\n targetBlobsPerBlock: number;\n maxBlobsPerBlock: number;\n baseFeeUpdateFraction: string;\n eip7918: boolean;\n source: \"chain_spec\" | \"eth_config\" | \"configured\";\n}\n\nexport interface Erc20Balance {\n token: Hex;\n address: Hex;\n balance: string;\n asOfBlock: number;\n blockHash: Hex;\n finality: Finality;\n coverageFrom: number;\n complete: boolean;\n /**\n * Block whose transfer proved the ledger incomplete for this token and\n * holder. From that block the pair is no longer derived and `balance` keeps\n * its last derived value; `null` while the pair is derived.\n */\n incompleteFrom: number | null;\n method: \"erc20_transfer_ledger\";\n}\n\nexport interface EvmEvent {\n schemaVersion: number;\n contract: Hex;\n event: string;\n signature: string;\n blockNumber: number;\n blockHash: Hex;\n blockTimestamp: number;\n bucketStartTimestamp?: number;\n transactionHash: Hex;\n transactionIndex: number;\n logIndex: number;\n finality: Finality;\n values: Record<string, string>;\n}\n\nexport interface TransactionStats {\n from: Hex;\n to: Hex;\n /** Submitted transactions from `from` to `to`, reverted ones included. */\n count: number;\n /** Submitted value in wei, including the value of reverted transactions. */\n totalValueWei: string;\n asOfBlock: number;\n blockHash: Hex;\n finality: Finality;\n coverageFrom: number;\n complete: boolean;\n}\n\nexport interface UniswapPoolPrice {\n pool: Hex;\n kind: \"v2\" | \"v3\";\n reserve0: string | null;\n reserve1: string | null;\n /** Signed token0 pool delta for a V3 swap, in raw token units. */\n amount0: string | null;\n /** Signed token1 pool delta for a V3 swap, in raw token units. */\n amount1: string | null;\n sqrtPriceX96: string | null;\n blockNumber: number;\n blockHash: Hex;\n logIndex: number;\n finality: Finality;\n}\n\nexport interface LatestUniswapObservation {\n data: UniswapPoolPrice;\n timestamp: number;\n}\n\nexport interface ConfiguredUniswapPool {\n address: Hex;\n kind: \"v2\" | \"v3\";\n}\n\nexport interface ConfiguredUniswapPools {\n data: ConfiguredUniswapPool[];\n}\n\nexport interface BlockSummary {\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n parentHash: Hex;\n timestamp: number;\n gasLimit: number | null;\n gasUsed: number | null;\n baseFeePerGas: string | null;\n blobGasUsed: number | null;\n excessBlobGas: number | null;\n transactionCount: number | null;\n sizeBytes: number | null;\n finality: Finality;\n}\n\nexport interface LatestBlockSummary {\n data: BlockSummary;\n}\n\nexport interface ChangeMetadata {\n apiVersion: \"1\";\n sequence: string;\n cursor: string;\n originKind:\n | \"live\"\n | \"live_recovery\"\n | \"historical_backfill\"\n | \"recompute\";\n originId: string;\n publicationRevision: string;\n chainId: number;\n block: {\n number: number;\n hash: Hex;\n parentHash: Hex;\n timestamp: number;\n } | null;\n finality: Finality;\n kind: string;\n schema: string;\n key: string | null;\n /** Present only on `reset_required` events, as the current coverage hint. */\n coverage?: ProcessorCoverage;\n /** RFC 3339 UTC emission time with millisecond precision. */\n emittedAt: string;\n}\n\n/** Blocks the live lane skipped, as a `system.live_gap.put` change announces them. */\nexport interface LiveGapChangeData {\n fromBlock: number;\n toBlock: number;\n /**\n * Leani did not fill the range: the processor's history is on demand, and a\n * `live_gap_fill` limit, if it has one, did not cover or complete it.\n */\n reason: \"not_filled\";\n}\n\n/** System transitions never pretend to contain a processor entity payload. */\nexport type ChangeEnvelope<T = unknown> = ChangeMetadata & (\n | { operation: \"apply\" | \"undo\"; data: T | null }\n | { operation: \"finalized\"; data: { throughBlock: number } }\n | { operation: \"finalized\"; data: LiveGapChangeData }\n | { operation: \"reset_required\"; data: {\n earliestAvailableSequence: string;\n latestAvailableSequence: string;\n action: \"query_snapshot_then_resume\";\n } }\n);\n\n/**\n * Whether `change` announces blocks the live lane skipped and did not fill,\n * as after a restart at a later finalized anchor. Request them as history,\n * for example with `liveGapBackfill` from `@smart-byte/leani-sdk/backfill`.\n * A processor with `live_gap_fill` can still deliver some of them later as\n * `live_recovery` batches, when it retries a fill after a hold, a crash, or a\n * restart of its live lane, so write them idempotently.\n */\nexport function isLiveGapChange<T>(\n change: ChangeEnvelope<T>,\n): change is Extract<ChangeEnvelope<T>, { data: LiveGapChangeData }> {\n return change.operation === \"finalized\" && change.kind === \"system.live_gap.put\";\n}\n\nexport interface LiveLaneReset {\n processor: string;\n state: \"paused\";\n reason: \"operator_reset_pending_replay\";\n firstUnappliedBlock: number;\n firstUnappliedHash: Hex;\n requiredDeliveryBytes: string;\n}\n\n/**\n * Connection-scoped stream handshake. Sent as the first frame of every\n * stream connection (including reconnects), synthesized at accept time,\n * never stored, and never acknowledged.\n */\nexport interface StreamHello {\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n coverage: ProcessorCoverage;\n}\n\nexport class ResetRequiredError extends LeaniError {\n readonly change: ChangeEnvelope;\n\n constructor(change: ChangeEnvelope) {\n super(\"the durable stream cursor requires a snapshot reset\", {\n status: 410,\n code: \"cursor_expired\",\n retryable: false,\n details: { cursor: change.cursor },\n });\n this.name = \"ResetRequiredError\";\n this.change = change;\n }\n}\n\nexport interface ListBlocksOptions {\n fromBlock: number;\n toBlock: number;\n limit?: number;\n cursor?: string;\n allowPartial?: boolean;\n signal?: AbortSignal;\n}\n\nexport interface ListTransactionsOptions {\n blockNumber: number;\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface ChangesOptions {\n after?: string;\n limit?: number;\n signal?: AbortSignal;\n}\n\nexport interface SubscribeOptions {\n after?: string;\n signal?: AbortSignal;\n /** Receives the connection handshake frame; called once per (re)connect. */\n onHello?: (hello: StreamHello) => void;\n /**\n * Reconnect when the stream sends nothing, not even the node's 15-second\n * keep-alive comments, for this long while the loop waits for a change.\n * Defaults to 60,000 ms.\n */\n idleTimeoutMs?: number;\n}\n\n/** Select a configured instance when more than one processor has this kind. */\nexport interface ProcessorSubscribeOptions extends SubscribeOptions {\n processor?: string;\n}\n\nexport interface LeaniClient {\n readonly baseUrl: URL;\n request<T>(\n path: string,\n params?: Record<string, QueryValue>,\n options?: { signal?: AbortSignal },\n ): Promise<T>;\n health: {\n live(options?: { signal?: AbortSignal }): Promise<Health>;\n ready(options?: { signal?: AbortSignal }): Promise<Health>;\n };\n status(options?: { signal?: AbortSignal }): Promise<NodeStatus>;\n capabilities(options?: { signal?: AbortSignal }): Promise<Capabilities>;\n processors: {\n list(options?: { signal?: AbortSignal }): Promise<ProcessorSummary[]>;\n status(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<ProcessorCoverage>;\n changes<T = unknown>(\n id: string,\n options?: ChangesOptions,\n ): Promise<Page<ChangeEnvelope<T>>>;\n changeHead(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<ChangeHead>;\n resetLiveLane(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<LiveLaneReset>;\n listCollections(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<{\n processor: ProcessorSummary;\n outputMode: \"none\" | \"latest\" | \"window\" | \"full\";\n retained: boolean;\n data: string[];\n }>;\n queryEntities<T = unknown>(\n id: string,\n collection: string,\n options?: OutputQueryOptions,\n ): Promise<GenericSnapshotPage<T>>;\n /** First snapshot page plus an atomic stream boundary. Read all nextCursor pages and releaseSnapshot before following. */\n queryAndFollow<T = unknown>(\n id: string,\n collection: string,\n options?: Omit<OutputQueryOptions, \"cursor\">,\n ): Promise<FollowSnapshotPage<T>>;\n getEntity<T = unknown>(\n id: string,\n collection: string,\n key: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<GenericOutputEntity<T>>;\n releaseSnapshot(\n id: string,\n snapshotId: string,\n options?: { signal?: AbortSignal },\n ): Promise<void>;\n consumers: {\n list(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer[]>;\n create(\n id: string,\n options: CreateConsumerOptions,\n ): Promise<DurableConsumer>;\n inspect(\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n revoke(\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n renew(\n id: string,\n consumer: string,\n credential: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n changes<T = unknown>(\n id: string,\n consumer: string,\n credential: string,\n options?: { limit?: number; signal?: AbortSignal },\n ): Promise<Page<ChangeEnvelope<T>>>;\n acknowledge(\n id: string,\n consumer: string,\n credential: string,\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n };\n subscribe<T = unknown>(\n id: string,\n options?: SubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<T>>;\n };\n blobs: {\n getBlock(\n number: number,\n options?: { signal?: AbortSignal },\n ): Promise<BlobsBlock>;\n listBlocks(options: ListBlocksOptions): Promise<Page<BlobsBlock>>;\n listSnapshot(\n options: ListBlocksOptions,\n ): Promise<Page<BlobsSnapshotEntry>>;\n getTransaction(\n hash: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<BlobTransaction>;\n listTransactions(\n options: ListTransactionsOptions,\n ): Promise<Page<BlobTransaction>>;\n getSchedule(options?: {\n atBlock?: number;\n signal?: AbortSignal;\n }): Promise<BlobSchedule>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<BlobsSnapshotEntry>>;\n };\n erc20: {\n getBalance(\n token: Hex,\n address: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<Erc20Balance>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<Erc20Balance>>;\n };\n uniswap: {\n getPool(\n address: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<UniswapPoolPrice>;\n getLatestObservation(\n address: Hex,\n options?: { processor?: string; signal?: AbortSignal },\n ): Promise<LatestUniswapObservation>;\n listConfiguredPools(options?: {\n processor?: string;\n signal?: AbortSignal;\n }): Promise<ConfiguredUniswapPools>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<UniswapPoolPrice>>;\n };\n blocks: {\n getLatest(options?: {\n processor?: string;\n signal?: AbortSignal;\n }): Promise<LatestBlockSummary>;\n getByNumber(\n number: number,\n options?: { processor?: string; signal?: AbortSignal },\n ): Promise<LatestBlockSummary>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<BlockSummary>>;\n };\n}\n\ninterface ResolvedOptions {\n baseUrl: URL;\n token?: string;\n timeoutMs: number;\n fetch: FetchLike;\n queryBasePaths: {\n blobs: string;\n erc20: string;\n uniswap: string;\n };\n reconnect: {\n initialDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n };\n}\n\n/**\n * Create a Bun/Node/browser client for the native v1 query and durable change\n * API. Ethereum JSON-RPC remains a separate endpoint used directly by viem,\n * ethers, or another Ethereum library.\n */\nexport function createLeaniClient(\n options: LeaniClientOptions,\n): LeaniClient {\n const resolved = resolveOptions(options);\n\n const get = <T>(\n path: string,\n query?: Record<string, QueryValue>,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"GET\",\n path,\n query,\n undefined,\n signal,\n extraHeaders,\n );\n\n const post = <T>(\n path: string,\n body?: unknown,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"POST\",\n path,\n undefined,\n body,\n signal,\n extraHeaders,\n );\n\n const remove = (\n path: string,\n signal?: AbortSignal,\n ): Promise<void> => requestVoid(resolved, \"DELETE\", path, signal);\n\n const removeJson = <T>(\n path: string,\n signal?: AbortSignal,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"DELETE\",\n path,\n undefined,\n undefined,\n signal,\n );\n\n const subscribe = <T>(\n processor: string,\n options: SubscribeOptions = {},\n ): AsyncGenerator<ChangeEnvelope<T>> =>\n subscribeProcessor<T>(resolved, processor, options);\n\n const request = <T>(\n path: string,\n params?: Record<string, QueryValue>,\n requestOptions?: { signal?: AbortSignal },\n ): Promise<T> => get<T>(path, params, requestOptions?.signal);\n\n return Object.freeze({\n baseUrl: resolved.baseUrl,\n request,\n health: Object.freeze({\n live: (options?: { signal?: AbortSignal }) =>\n get<Health>(\"health/live\", undefined, options?.signal),\n ready: (options?: { signal?: AbortSignal }) =>\n get<Health>(\"health/ready\", undefined, options?.signal),\n }),\n status: (options?: { signal?: AbortSignal }) =>\n get<NodeStatus>(\"v1/status\", undefined, options?.signal),\n capabilities: (options?: { signal?: AbortSignal }) =>\n request<Capabilities>(\"v1/capabilities\", undefined, options),\n processors: Object.freeze({\n list: async (options?: { signal?: AbortSignal }) => {\n const response = await get<{ data: ProcessorSummary[] }>(\n \"v1/processors\",\n undefined,\n options?.signal,\n );\n return response.data;\n },\n status: (id: string, options?: { signal?: AbortSignal }) =>\n get<ProcessorCoverage>(\n `v1/processors/${encodeURIComponent(id)}/status`,\n undefined,\n options?.signal,\n ),\n changes: <T = unknown>(\n id: string,\n changesOptions: ChangesOptions = {},\n ) =>\n get<Page<ChangeEnvelope<T>>>(\n `v1/processors/${encodeURIComponent(id)}/changes`,\n {\n after: changesOptions.after,\n limit: changesOptions.limit,\n },\n changesOptions.signal,\n ),\n changeHead: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<ChangeHead>(\n `v1/processors/${encodeURIComponent(id)}/changes/head`,\n undefined,\n options?.signal,\n ),\n resetLiveLane: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<LiveLaneReset>(\n `admin/v1/processors/${encodeURIComponent(id)}/lanes/live/reset`,\n undefined,\n options?.signal,\n ),\n listCollections: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<{\n processor: ProcessorSummary;\n outputMode: \"none\" | \"latest\" | \"window\" | \"full\";\n retained: boolean;\n data: string[];\n }>(\n `v1/processors/${encodeURIComponent(id)}/collections`,\n undefined,\n options?.signal,\n ),\n queryEntities: <T = unknown>(\n id: string,\n collection: string,\n queryOptions: OutputQueryOptions = {},\n ) => {\n const path = `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/entities`;\n // Only POST creates a snapshot; its later pages are read by GET.\n return queryOptions.cursor === undefined\n ? post<GenericSnapshotPage<T>>(\n path,\n outputQueryBody(queryOptions),\n queryOptions.signal,\n )\n : get<GenericSnapshotPage<T>>(\n path,\n outputQueryValues(queryOptions),\n queryOptions.signal,\n );\n },\n queryAndFollow: <T = unknown>(\n id: string,\n collection: string,\n queryOptions: Omit<OutputQueryOptions, \"cursor\"> = {},\n ) =>\n post<FollowSnapshotPage<T>>(\n `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/query-and-follow`,\n outputQueryBody(queryOptions),\n queryOptions.signal,\n ),\n getEntity: <T = unknown>(\n id: string,\n collection: string,\n key: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n get<GenericOutputEntity<T>>(\n `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/entities/${encodeURIComponent(assertEntityKey(key))}`,\n undefined,\n options?.signal,\n ),\n releaseSnapshot: (\n id: string,\n snapshotId: string,\n options?: { signal?: AbortSignal },\n ) =>\n remove(\n `v1/processors/${encodeURIComponent(id)}/query-snapshots/${encodeURIComponent(snapshotId)}`,\n options?.signal,\n ),\n consumers: Object.freeze({\n list: async (\n id: string,\n options?: { signal?: AbortSignal },\n ) => {\n const response = await get<{ data: DurableConsumer[] }>(\n `v1/processors/${encodeURIComponent(id)}/consumers`,\n undefined,\n options?.signal,\n );\n return response.data;\n },\n create: (\n id: string,\n consumerOptions: CreateConsumerOptions,\n ) =>\n post<DurableConsumer>(\n `v1/processors/${encodeURIComponent(id)}/consumers`,\n {\n id: consumerOptions.id,\n role: consumerOptions.role,\n start: consumerOptions.start,\n leaseTtlSeconds: assertPositiveSafeInteger(\n consumerOptions.leaseTtlSeconds,\n \"leaseTtlSeconds\",\n ),\n credential: consumerOptions.credential,\n },\n consumerOptions.signal,\n ),\n inspect: (\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<DurableConsumer>(\n consumerPath(id, consumer),\n undefined,\n options?.signal,\n ),\n revoke: (\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ) =>\n removeJson<DurableConsumer>(\n consumerPath(id, consumer),\n options?.signal,\n ),\n renew: (\n id: string,\n consumer: string,\n credential: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<DurableConsumer>(\n `${consumerPath(id, consumer)}/lease`,\n undefined,\n options?.signal,\n consumerCredentialHeader(credential),\n ),\n changes: <T = unknown>(\n id: string,\n consumer: string,\n credential: string,\n options: { limit?: number; signal?: AbortSignal } = {},\n ) =>\n get<Page<ChangeEnvelope<T>>>(\n `${consumerPath(id, consumer)}/changes`,\n { limit: options.limit },\n options.signal,\n consumerCredentialHeader(credential),\n ),\n acknowledge: (\n id: string,\n consumer: string,\n credential: string,\n cursor: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<DurableConsumer>(\n `${consumerPath(id, consumer)}/ack`,\n { cursor },\n options?.signal,\n consumerCredentialHeader(credential),\n ),\n }),\n subscribe,\n }),\n blobs: Object.freeze({\n getBlock: (number: number, options?: { signal?: AbortSignal }) =>\n request<BlobsBlock>(\n `${resolved.queryBasePaths.blobs}/blocks/${assertSafeInteger(number, \"block number\")}`,\n undefined,\n options,\n ),\n listBlocks: (listOptions: ListBlocksOptions) =>\n request<Page<BlobsBlock>>(\n `${resolved.queryBasePaths.blobs}/blocks`,\n {\n fromBlock: assertSafeInteger(\n listOptions.fromBlock,\n \"fromBlock\",\n ),\n toBlock: assertSafeInteger(listOptions.toBlock, \"toBlock\"),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n allowPartial: listOptions.allowPartial,\n },\n { signal: listOptions.signal },\n ),\n listSnapshot: (listOptions: ListBlocksOptions) =>\n request<Page<BlobsSnapshotEntry>>(\n `${resolved.queryBasePaths.blobs}/snapshot`,\n {\n fromBlock: assertSafeInteger(\n listOptions.fromBlock,\n \"fromBlock\",\n ),\n toBlock: assertSafeInteger(listOptions.toBlock, \"toBlock\"),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n allowPartial: listOptions.allowPartial,\n },\n { signal: listOptions.signal },\n ),\n getTransaction: (\n hash: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<BlobTransaction>(\n `${resolved.queryBasePaths.blobs}/transactions/${encodeURIComponent(assertHash(hash))}`,\n undefined,\n options,\n ),\n listTransactions: (listOptions: ListTransactionsOptions) =>\n request<Page<BlobTransaction>>(\n `${resolved.queryBasePaths.blobs}/transactions`,\n {\n blockNumber: assertSafeInteger(\n listOptions.blockNumber,\n \"blockNumber\",\n ),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n },\n { signal: listOptions.signal },\n ),\n getSchedule: (\n scheduleOptions: {\n atBlock?: number;\n signal?: AbortSignal;\n } = {},\n ) =>\n request<BlobSchedule>(\n `${resolved.queryBasePaths.blobs}/schedule`,\n {\n atBlock:\n scheduleOptions.atBlock === undefined\n ? undefined\n : assertSafeInteger(scheduleOptions.atBlock, \"atBlock\"),\n },\n { signal: scheduleOptions.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<BlobsSnapshotEntry>(\n subscribeOptions.processor ?? \"blobs-money\",\n subscribeOptions,\n ),\n }),\n erc20: Object.freeze({\n getBalance: (\n token: Hex,\n address: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<Erc20Balance>(\n `${resolved.queryBasePaths.erc20}/balances/${encodeURIComponent(assertAddress(token))}/${encodeURIComponent(assertAddress(address))}`,\n undefined,\n options,\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<Erc20Balance>(subscribeOptions.processor ?? \"erc20-balances\", subscribeOptions),\n }),\n uniswap: Object.freeze({\n getPool: (\n address: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<UniswapPoolPrice>(\n `${resolved.queryBasePaths.uniswap}/pools/${encodeURIComponent(assertAddress(address))}`,\n undefined,\n options,\n ),\n getLatestObservation: (\n address: Hex,\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestUniswapObservation>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"uniswap-observations\")}/query/pools/${encodeURIComponent(assertAddress(address))}/latest`,\n undefined,\n { signal: options.signal },\n ),\n listConfiguredPools: (\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<ConfiguredUniswapPools>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"uniswap-observations\")}/query/pools`,\n undefined,\n { signal: options.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<UniswapPoolPrice>(subscribeOptions.processor ?? \"uniswap-observations\", subscribeOptions),\n }),\n blocks: Object.freeze({\n getLatest: (\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestBlockSummary>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"block-summary\")}/query/latest`,\n undefined,\n { signal: options.signal },\n ),\n getByNumber: (\n number: number,\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestBlockSummary>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"block-summary\")}/query/blocks/${assertSafeInteger(number, \"block number\")}`,\n undefined,\n { signal: options.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<BlockSummary>(subscribeOptions.processor ?? \"block-summary\", subscribeOptions),\n }),\n });\n}\n\nfunction resolveOptions(options: LeaniClientOptions): ResolvedOptions {\n const baseUrl = new URL(options.baseUrl);\n baseUrl.pathname = `${baseUrl.pathname.replace(/\\/+$/, \"\")}/`;\n const timeoutMs = options.timeoutMs ?? 15_000;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError(\"timeoutMs must be a positive safe integer\");\n }\n const jitter = options.reconnect?.jitter ?? 0.2;\n if (!Number.isFinite(jitter) || jitter < 0 || jitter > 1) {\n throw new TypeError(\"reconnect.jitter must be in 0..=1\");\n }\n return {\n baseUrl,\n token: options.token,\n timeoutMs,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n queryBasePaths: {\n blobs: normalizeQueryBasePath(\n options.queryBasePaths?.blobs,\n \"v1/q/blobs\",\n ),\n erc20: normalizeQueryBasePath(\n options.queryBasePaths?.erc20,\n \"v1/q/erc20\",\n ),\n uniswap: normalizeQueryBasePath(\n options.queryBasePaths?.uniswap,\n \"v1/q/uniswap\",\n ),\n },\n reconnect: {\n initialDelayMs: options.reconnect?.initialDelayMs ?? 250,\n maxDelayMs: options.reconnect?.maxDelayMs ?? 10_000,\n jitter,\n },\n };\n}\n\nfunction normalizeQueryBasePath(\n configured: string | undefined,\n fallback: string,\n): string {\n const path = (configured ?? fallback).replace(/\\/+$/g, \"\");\n if (\n path.length === 0 ||\n /^[a-z][a-z0-9+.-]*:/i.test(path) ||\n path.startsWith(\"//\") ||\n path.includes(\"?\") ||\n path.includes(\"#\")\n ) {\n throw new TypeError(\"query base path must be a non-empty same-origin path\");\n }\n return path;\n}\n\nexport type QueryValue = string | number | boolean | undefined;\n\nfunction buildUrl(\n options: ResolvedOptions,\n path: string,\n query?: Record<string, QueryValue>,\n): URL {\n const url = resolveUnder(options.baseUrl, path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url;\n}\n\nasync function requestJson<T>(\n options: ResolvedOptions,\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n query?: Record<string, QueryValue>,\n body?: unknown,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n): Promise<T> {\n const response = await send(options.fetch, buildUrl(options, path, query), {\n method,\n headers: headers(\n options,\n \"application/json\",\n body !== undefined\n ? { \"content-type\": \"application/json\", ...extraHeaders }\n : method === \"GET\"\n ? extraHeaders\n : { ...LEANI_REQUEST_HEADER, ...extraHeaders },\n ),\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: withDeadline(signal, options.timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n return readJson<T>(response, signal);\n}\n\nasync function requestVoid(\n options: ResolvedOptions,\n method: \"DELETE\",\n path: string,\n signal?: AbortSignal,\n): Promise<void> {\n const response = await send(options.fetch, buildUrl(options, path), {\n method,\n headers: headers(options, \"application/json\", LEANI_REQUEST_HEADER),\n signal: withDeadline(signal, options.timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n}\n\n/** The default `idleTimeoutMs`: four of the node's keep-alive intervals. */\nconst DEFAULT_SSE_IDLE_TIMEOUT_MS = 60_000;\n\n/**\n * Retryable `error` events in a row, with no new change between them, after\n * which a subscription throws the last one instead of reconnecting again.\n */\nconst MAX_ERROR_EVENT_RETRIES = 5;\n\nasync function* subscribeProcessor<T>(\n options: ResolvedOptions,\n processor: string,\n subscribeOptions: SubscribeOptions,\n): AsyncGenerator<ChangeEnvelope<T>> {\n const signal = subscribeOptions.signal;\n const idleTimeoutMs =\n subscribeOptions.idleTimeoutMs ?? DEFAULT_SSE_IDLE_TIMEOUT_MS;\n if (!Number.isSafeInteger(idleTimeoutMs) || idleTimeoutMs <= 0) {\n throw new TypeError(\"idleTimeoutMs must be a positive safe integer\");\n }\n let after = subscribeOptions.after;\n let lastSequence: string | undefined;\n let delayMs = options.reconnect.initialDelayMs;\n let errorEventsWithoutProgress = 0;\n while (!signal?.aborted) {\n const connection = new AbortController();\n const connectionSignal = signal\n ? AbortSignal.any([signal, connection.signal])\n : connection.signal;\n const watchdog = idleWatchdog(idleTimeoutMs, () =>\n connection.abort(\n new TransportError(`SSE stream sent nothing for ${idleTimeoutMs} ms`),\n ));\n try {\n watchdog.arm();\n const response = await send(\n options.fetch,\n buildUrl(\n options,\n `v1/processors/${encodeURIComponent(processor)}/stream`,\n { after },\n ),\n {\n headers: headers(options, \"text/event-stream\"),\n signal: connectionSignal,\n },\n signal,\n );\n if (!response.ok) {\n const error = await responseError(response);\n if (!error.retryable) {\n throw error;\n }\n } else if (!response.body) {\n throw new LeaniError(\"stream response has no body\", {\n status: response.status,\n code: \"internal\",\n retryable: true,\n });\n } else {\n // A stream that opens ends the backoff of earlier failures.\n delayMs = options.reconnect.initialDelayMs;\n const messages = sseMessages(\n readChunks(response.body, connectionSignal, watchdog.arm),\n signal,\n );\n for await (const message of messages) {\n if (!message.data) {\n continue;\n }\n if (message.event === \"hello\") {\n subscribeOptions.onHello?.(JSON.parse(message.data) as StreamHello);\n continue;\n }\n if (message.event === \"error\") {\n const error = errorFromBody(200, JSON.parse(message.data));\n errorEventsWithoutProgress += 1;\n if (\n !error.retryable ||\n errorEventsWithoutProgress > MAX_ERROR_EVENT_RETRIES\n ) {\n throw error;\n }\n // The node ends the stream after an error event. Opening the\n // stream reset the backoff, so it grows with these events.\n delayMs = Math.min(\n options.reconnect.initialDelayMs *\n 2 ** (errorEventsWithoutProgress - 1),\n options.reconnect.maxDelayMs,\n );\n break;\n }\n const change = JSON.parse(message.data) as ChangeEnvelope<T>;\n validateChangeEnvelope(change);\n if (change.operation === \"reset_required\") {\n throw new ResetRequiredError(change as ChangeEnvelope);\n }\n\n if (\n lastSequence !== undefined &&\n compareSequences(change.sequence, lastSequence) <= 0\n ) {\n continue;\n }\n lastSequence = change.sequence;\n after = change.cursor;\n errorEventsWithoutProgress = 0;\n // The time the application spends on a change is not silence.\n watchdog.disarm();\n yield change;\n watchdog.arm();\n }\n }\n } catch (error) {\n if (signal?.aborted) return;\n // Resume only transport failures; malformed events, terminal errors,\n // and user callbacks must fail visibly instead of reconnecting forever.\n if (!(error instanceof TransportError)) throw error;\n } finally {\n watchdog.disarm();\n connection.abort();\n }\n if (signal?.aborted) {\n break;\n }\n await abortableDelay(\n jitter(delayMs, options.reconnect.jitter),\n signal,\n );\n delayMs = Math.min(delayMs * 2, options.reconnect.maxDelayMs);\n }\n}\n\ninterface SseMessage {\n id?: string;\n event?: string;\n data?: string;\n}\n\n/** The largest SSE event the client buffers before it fails the stream. */\nconst MAX_SSE_EVENT_BYTES = 8 * 1024 * 1024;\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\n\nexport async function* parseSse(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<SseMessage> {\n yield* sseMessages(readChunks(body, signal), signal);\n}\n\n/**\n * Split SSE events at blank lines, scanning each byte once. Line endings are\n * ASCII, so a scan by byte never splits a UTF-8 character.\n */\nasync function* sseMessages(\n chunks: AsyncIterable<Uint8Array>,\n signal: AbortSignal | undefined,\n): AsyncGenerator<SseMessage> {\n const decoder = new TextDecoder();\n // The bytes received so far of the event in progress.\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let lineEmpty = true;\n let afterCarriageReturn = false;\n for await (const chunk of chunks) {\n let eventStart = 0;\n for (let index = 0; index < chunk.length; index += 1) {\n const byte = chunk[index];\n if (byte === LINE_FEED && afterCarriageReturn) {\n // The second half of a CRLF, which chunks may split.\n afterCarriageReturn = false;\n continue;\n }\n afterCarriageReturn = byte === CARRIAGE_RETURN;\n if (byte !== LINE_FEED && byte !== CARRIAGE_RETURN) {\n lineEmpty = false;\n continue;\n }\n if (!lineEmpty) {\n lineEmpty = true;\n continue;\n }\n // A blank line completes the event.\n const tail = chunk.subarray(eventStart, index);\n eventStart = index + 1;\n if (pendingBytes + tail.length > MAX_SSE_EVENT_BYTES) {\n throw sseEventTooLarge();\n }\n const event = concatBytes(pending, pendingBytes, tail);\n pending = [];\n pendingBytes = 0;\n if (signal?.aborted) return;\n const parsed = parseSseFrame(decoder.decode(event));\n if (parsed) {\n yield parsed;\n }\n }\n const rest = chunk.subarray(eventStart);\n if (rest.length > 0) {\n pendingBytes += rest.length;\n if (pendingBytes > MAX_SSE_EVENT_BYTES) {\n throw sseEventTooLarge();\n }\n pending.push(rest);\n }\n }\n // Only a blank line completes an SSE event. A partial final event is\n // discarded, so a reconnect resumes from the last complete one.\n}\n\nfunction sseEventTooLarge(): LeaniError {\n return new LeaniError(`SSE event exceeds ${MAX_SSE_EVENT_BYTES} bytes`, {\n status: 200,\n code: \"invalid_response\",\n retryable: false,\n });\n}\n\nfunction parseSseFrame(frame: string): SseMessage | undefined {\n const message: SseMessage = {};\n const data: string[] = [];\n for (const line of frame.split(/\\r\\n|\\r|\\n/)) {\n if (line.length === 0 || line.startsWith(\":\")) {\n continue;\n }\n const separator = line.indexOf(\":\");\n const field = separator < 0 ? line : line.slice(0, separator);\n let value = separator < 0 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n if (field === \"id\") {\n message.id = value;\n } else if (field === \"event\") {\n message.event = value;\n } else if (field === \"data\") {\n data.push(value);\n }\n }\n if (data.length > 0) {\n message.data = data.join(\"\\n\");\n }\n return Object.keys(message).length > 0 ? message : undefined;\n}\n\nfunction headers(\n options: ResolvedOptions,\n accept: string,\n extra?: Record<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = { Accept: accept, ...extra };\n if (options.token) {\n result.Authorization = `Bearer ${options.token}`;\n }\n return result;\n}\n\nfunction validateChangeEnvelope(value: ChangeEnvelope): void {\n if (\n !value ||\n value.apiVersion !== \"1\" ||\n !/^\\d+$/.test(value.sequence) ||\n typeof value.cursor !== \"string\" ||\n value.cursor.length === 0 ||\n ![\"apply\", \"undo\", \"finalized\", \"reset_required\"].includes(value.operation) ||\n typeof value.schema !== \"string\" ||\n value.schema.length === 0\n ) {\n throw new LeaniError(\"invalid change envelope\", {\n status: 200,\n code: \"invalid_response\",\n retryable: false,\n });\n }\n}\n\nexport function compareSequences(left: string, right: string): -1 | 0 | 1 {\n if (!/^\\d+$/.test(left) || !/^\\d+$/.test(right)) {\n throw new TypeError(\"sequences must be unsigned decimal strings\");\n }\n const comparison = BigInt(left) - BigInt(right);\n return comparison < 0n ? -1 : comparison > 0n ? 1 : 0;\n}\n\nexport function isResetRequired(\n change: ChangeEnvelope,\n): change is ChangeEnvelope & { operation: \"reset_required\" } {\n return change.operation === \"reset_required\";\n}\n\nexport interface EntityChangeTarget<T> {\n put(key: string, value: T): void | Promise<void>;\n delete(key: string): void | Promise<void>;\n}\n\nexport async function applyEntityChange<T>(\n target: EntityChangeTarget<T>,\n change: ChangeEnvelope<T>,\n): Promise<void> {\n if ((change.operation !== \"apply\" && change.operation !== \"undo\") || !change.key) {\n return;\n }\n if (change.data === null || change.kind.endsWith(\".delete\")) {\n await target.delete(change.key);\n } else {\n await target.put(change.key, change.data);\n }\n}\n\n/**\n * Commit destination state before constructing the acknowledgement request.\n * If the destination commit rejects, `acknowledge` is never invoked and the\n * durable consumer safely receives the same changes again.\n */\nexport async function commitThenAcknowledge<T>(\n destinationCommit: () => Promise<T>,\n acknowledge: (committed: T) => Promise<unknown>,\n): Promise<T> {\n const committed = await destinationCommit();\n await acknowledge(committed);\n return committed;\n}\n\nexport interface CursorStore {\n get(): string | undefined;\n set(cursor: string): void;\n clear(): void;\n}\n\nexport function createInMemoryCursorStore(initial?: string): CursorStore {\n let cursor = initial;\n return {\n get: () => cursor,\n set: (value: string) => {\n cursor = value;\n },\n clear: () => {\n cursor = undefined;\n },\n };\n}\n\nfunction assertSafeInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\n\nfunction assertPositiveSafeInteger(value: number, field: string): number {\n const result = assertSafeInteger(value, field);\n if (result === 0) {\n throw new TypeError(`${field} must be positive`);\n }\n return result;\n}\n\nfunction optionalSafeInteger(\n value: number | undefined,\n field: string,\n): number | undefined {\n return value === undefined ? undefined : assertSafeInteger(value, field);\n}\n\nfunction outputQueryBody(\n options: Omit<OutputQueryOptions, \"cursor\">,\n): Record<string, number | undefined> {\n return {\n fromBlock: optionalSafeInteger(options.fromBlock, \"fromBlock\"),\n toBlock: optionalSafeInteger(options.toBlock, \"toBlock\"),\n fromTimestamp: optionalSafeInteger(\n options.fromTimestamp,\n \"fromTimestamp\",\n ),\n toTimestamp: optionalSafeInteger(options.toTimestamp, \"toTimestamp\"),\n limit:\n options.limit === undefined\n ? undefined\n : assertPositiveSafeInteger(options.limit, \"limit\"),\n };\n}\n\nfunction outputQueryValues(\n options: OutputQueryOptions,\n): Record<string, QueryValue> {\n return {\n ...outputQueryBody(options),\n cursor: options.cursor,\n };\n}\n\nfunction consumerPath(processor: string, consumer: string): string {\n return `v1/processors/${encodeURIComponent(processor)}/consumers/${encodeURIComponent(consumer)}`;\n}\n\nfunction consumerCredentialHeader(\n credential: string,\n): Record<string, string> {\n if (credential.length === 0) {\n throw new TypeError(\"consumer credential must not be empty\");\n }\n return { \"x-leani-consumer-credential\": credential };\n}\n\nfunction assertEntityKey(value: string): Hex {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {\n throw new TypeError(\"entity key must contain complete hexadecimal bytes\");\n }\n return value as Hex;\n}\n\nfunction assertHash(value: string): Hex {\n if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {\n throw new TypeError(\"transaction hash must contain exactly 32 bytes\");\n }\n return value as Hex;\n}\n\nfunction assertAddress(value: string): Hex {\n if (!/^0x[0-9a-fA-F]{40}$/.test(value)) {\n throw new TypeError(\"address must contain exactly 20 bytes\");\n }\n return value as Hex;\n}\n\nfunction jitter(delayMs: number, amount: number): number {\n const factor = 1 - amount + Math.random() * amount * 2;\n return Math.max(0, Math.round(delayMs * factor));\n}\n\nasync function abortableDelay(\n milliseconds: number,\n signal?: AbortSignal,\n): Promise<void> {\n if (signal?.aborted) {\n return;\n }\n await new Promise<void>((resolve) => {\n const finish = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timeout = setTimeout(finish, milliseconds);\n signal?.addEventListener(\"abort\", finish, { once: true });\n });\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LeaniError,\n TransportError,\n responseError,\n errorFromBody,\n} from \"./errors.ts\";\nimport {\n concatBytes,\n idleWatchdog,\n readChunks,\n readJson,\n resolveUnder,\n send,\n withDeadline,\n} from \"./transport.ts\";\nexport { LeaniError, TransportError, type LeaniErrorBody } from \"./errors.ts\";\n\n// Kept literal for toolchain compatibility; tests pin it to package.json.\nexport const SDK_VERSION = \"0.1.0-rc.8\" as const;\n\n/** Sent on mutations without a JSON body, which the node otherwise refuses. */\nconst LEANI_REQUEST_HEADER: Readonly<Record<string, string>> = Object.freeze({\n \"x-leani-request\": \"1\",\n});\n\nexport type {\n components as OpenApiComponents,\n operations as OpenApiOperations,\n paths as OpenApiPaths,\n} from \"./openapi.generated.ts\";\n\nexport type Hex = `0x${string}`;\nexport type Finality = \"unattested\" | \"attested\" | \"finalized\";\nexport type ChangeOperation =\n | \"apply\"\n | \"undo\"\n | \"attested\"\n | \"finalized\"\n | \"reset_required\";\n\nexport interface LeaniClientOptions {\n baseUrl: string | URL;\n token?: string;\n timeoutMs?: number;\n fetch?: FetchLike;\n /**\n * Override typed query-extension mounts with canonical `basePath` values\n * returned by `capabilities()` when an ergonomic alias is unavailable.\n */\n queryBasePaths?: {\n blobs?: string;\n erc20?: string;\n uniswap?: string;\n };\n reconnect?: {\n initialDelayMs?: number;\n maxDelayMs?: number;\n jitter?: number;\n };\n}\n\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface ProcessorSummary {\n id: string;\n instance: string;\n version: string;\n codeHash: Hex;\n configHash: Hex;\n genericApi: \"processor-v1\";\n changeSchema: string;\n queryExtensions: QueryExtensionSummary[];\n subscriptions: boolean;\n artifactRetention: \"none\" | \"window\" | \"full\";\n deliveryOrdering: \"canonical\" | \"block_versioned_idempotent\";\n}\n\nexport interface QueryExtensionSummary {\n id: string;\n basePath: string;\n aliasPath: string | null;\n}\n\nexport interface QueryExtensionCapability extends QueryExtensionSummary {\n processor: string;\n}\n\nexport interface Capabilities {\n chainId: number;\n ethereumRpc: Record<string, unknown>;\n processors: ProcessorSummary[];\n queryExtensions: QueryExtensionCapability[];\n}\n\nexport interface NodeStatus {\n apiVersion: \"1\";\n project: string;\n version: string;\n chainId: number;\n uptimeSeconds: number;\n databaseBytes: number;\n processor: ProcessorSummary;\n processors: ProcessorSummary[];\n readiness: Readiness;\n}\n\nexport interface Readiness {\n liveRequired: boolean;\n liveReady: boolean;\n finalityRequired: boolean;\n finalityReady: boolean;\n ready: boolean;\n}\n\nexport interface Health {\n status: \"live\" | \"ready\" | \"not_ready\" | \"failed\";\n uptimeSeconds: number;\n database: \"available\" | \"unavailable\";\n readiness: Readiness;\n reasons: string[];\n}\n\nexport interface CoverageInterval {\n fromBlock: number;\n toBlock: number;\n finality: Finality;\n}\n\nexport interface ProcessorCoverage {\n chainId: number;\n chainFinalizedHead: {\n number: number;\n hash: string;\n } | null;\n requested?: {\n fromBlock: number;\n toBlock: number;\n } | null;\n available: CoverageInterval[];\n configuredStartBlock: number;\n processedThrough: number | null;\n finalizedThrough: number | null;\n complete: boolean;\n state:\n | \"starting\"\n | \"backfilling\"\n | \"catching_up\"\n | \"live\"\n | \"degraded\"\n | \"paused\"\n | \"failed\";\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n coverage: ProcessorCoverage;\n}\n\nexport interface BlobsBlock {\n network: string;\n blockNumber: number;\n blockHash: Hex;\n parentHash: Hex;\n timestamp: number;\n size: string;\n blobCount: number;\n blobGasUsed: string;\n excessBlobGas: string;\n /**\n * Protocol blob base fee in wei per blob gas: the EIP-4844 fee for\n * `excessBlobGas` under the fork active at `timestamp`. EIP-7918 does not\n * change it.\n */\n blobBaseFee: string;\n executionBaseFee: string;\n gasUsed: string;\n gasLimit: string;\n executionEthBurnedWei: string;\n /** `blobBaseFee` times `blobGasUsed`. */\n blobEthBurnedWei: string;\n /**\n * EIP-7918 reserve price in wei per blob gas from Fusaka on, `null` before.\n * It only changes how excess blob gas evolves and is not applied to\n * `blobBaseFee`.\n */\n reserveFeeWei: string | null;\n transactionCount: number;\n targetBlobsPerBlock: number;\n maxBlobsPerBlock: number;\n transformVersion: number;\n finality: Finality;\n}\n\nexport interface BlobTransaction {\n network: string;\n blockNumber: number;\n blockHash: Hex;\n txHash: Hex;\n transactionIndex: number;\n senderAddress: Hex;\n blobVersionedHashes: Hex[];\n blobCount: number;\n totalBurnedWei: string;\n executionBurnedWei: string;\n /** The block's `blobBaseFee` times this transaction's blob gas. */\n blobBurnedWei: string;\n}\n\nexport interface BlobsSnapshotEntry {\n block: BlobsBlock;\n transactions: BlobTransaction[];\n}\n\nexport interface ChangeHead {\n earliestSequence: string | null;\n latestSequence: string | null;\n cursor: string | null;\n}\n\nexport interface GenericOutputEntity<T = unknown> {\n ordinal: string;\n key: Hex;\n schema: string;\n data: T;\n blockNumber: number;\n blockTimestamp: number;\n finality: Finality;\n}\n\nexport interface OutputBounds {\n earliestBlock: number;\n latestBlock: number;\n earliestTimestamp: number;\n latestTimestamp: number;\n}\n\nexport interface GenericSnapshotPage<T = unknown> {\n data: GenericOutputEntity<T>[];\n nextCursor: string | null;\n snapshotId: string;\n boundaryCursor: string | null;\n rowCount: string;\n valueBytes: string;\n expiresAtUnixMs: string;\n retainedBounds: OutputBounds | null;\n coverage: ProcessorCoverage;\n recovery: {\n follow: string | null;\n outsideRetention: \"create_processor_instance_or_source_scan\";\n };\n}\n\nexport interface FollowSnapshotPage<T = unknown> extends GenericSnapshotPage<T> {\n boundaryCursor: string;\n recovery: GenericSnapshotPage<T>[\"recovery\"] & { follow: string };\n}\n\nexport interface OutputQueryOptions {\n fromBlock?: number;\n toBlock?: number;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport type ConsumerRole = \"required\" | \"best_effort\";\nexport type ConsumerState = \"active\" | \"reset_required\" | \"revoked\";\nexport type ConsumerStart =\n | { position: \"earliest_retained\" }\n | { position: \"current_head\" }\n | { position: \"cursor\"; cursor: string };\n\nexport interface CreateConsumerOptions {\n id: string;\n role: ConsumerRole;\n start: ConsumerStart;\n leaseTtlSeconds: number;\n credential: string;\n signal?: AbortSignal;\n}\n\nexport interface DurableConsumer {\n id: string;\n processorInstance: string;\n /** The delivery stream this consumer reads. */\n streamId: string;\n role: ConsumerRole;\n state: ConsumerState;\n acknowledgedSequence: string;\n deliveredSequence: string;\n acknowledgedCursor: string;\n deliveredCursor: string;\n /** Stream sessions that have taken the lease; `\"0\"` before the first. */\n leaseGeneration: string;\n leaseTtlMs: string;\n leaseExpiresAtUnixMs: string;\n leaseActive: boolean;\n lagChanges: string;\n lagBlocks: string;\n lagBytes: string;\n lagAgeMs: string;\n createdAtUnixMs: string;\n updatedAtUnixMs: string;\n}\n\nexport interface BlobSchedule {\n name: string;\n /**\n * Block-number label for `atBlock` lookups. For Dencun it is 19426589, the\n * first block the blobs processor covers.\n */\n activationBlock: number;\n /** The fork's parameters apply to blocks from this timestamp on. */\n activationTimestamp: number;\n forkId: Hex;\n targetBlobsPerBlock: number;\n maxBlobsPerBlock: number;\n baseFeeUpdateFraction: string;\n eip7918: boolean;\n source: \"chain_spec\" | \"eth_config\" | \"configured\";\n}\n\nexport interface Erc20Balance {\n token: Hex;\n address: Hex;\n balance: string;\n asOfBlock: number;\n blockHash: Hex;\n finality: Finality;\n coverageFrom: number;\n complete: boolean;\n /**\n * Block whose transfer proved the ledger incomplete for this token and\n * holder. From that block the pair is no longer derived and `balance` keeps\n * its last derived value; `null` while the pair is derived.\n */\n incompleteFrom: number | null;\n method: \"erc20_transfer_ledger\";\n}\n\nexport interface EvmEvent {\n schemaVersion: number;\n contract: Hex;\n event: string;\n signature: string;\n blockNumber: number;\n blockHash: Hex;\n blockTimestamp: number;\n bucketStartTimestamp?: number;\n transactionHash: Hex;\n transactionIndex: number;\n logIndex: number;\n finality: Finality;\n values: Record<string, string>;\n}\n\nexport interface TransactionStats {\n from: Hex;\n to: Hex;\n /** Submitted transactions from `from` to `to`, reverted ones included. */\n count: number;\n /** Submitted value in wei, including the value of reverted transactions. */\n totalValueWei: string;\n asOfBlock: number;\n blockHash: Hex;\n finality: Finality;\n coverageFrom: number;\n complete: boolean;\n}\n\nexport interface UniswapPoolPrice {\n pool: Hex;\n kind: \"v2\" | \"v3\";\n reserve0: string | null;\n reserve1: string | null;\n /** Signed token0 pool delta for a V3 swap, in raw token units. */\n amount0: string | null;\n /** Signed token1 pool delta for a V3 swap, in raw token units. */\n amount1: string | null;\n sqrtPriceX96: string | null;\n blockNumber: number;\n blockHash: Hex;\n logIndex: number;\n finality: Finality;\n}\n\nexport interface LatestUniswapObservation {\n data: UniswapPoolPrice;\n timestamp: number;\n}\n\nexport interface ConfiguredUniswapPool {\n address: Hex;\n kind: \"v2\" | \"v3\";\n}\n\nexport interface ConfiguredUniswapPools {\n data: ConfiguredUniswapPool[];\n}\n\nexport interface BlockSummary {\n chainId: number;\n blockNumber: number;\n blockHash: Hex;\n parentHash: Hex;\n timestamp: number;\n gasLimit: number | null;\n gasUsed: number | null;\n baseFeePerGas: string | null;\n blobGasUsed: number | null;\n excessBlobGas: number | null;\n transactionCount: number | null;\n sizeBytes: number | null;\n finality: Finality;\n}\n\nexport interface LatestBlockSummary {\n data: BlockSummary;\n}\n\nexport interface ChangeMetadata {\n apiVersion: \"1\";\n sequence: string;\n cursor: string;\n originKind:\n | \"live\"\n | \"live_recovery\"\n | \"historical_backfill\"\n | \"recompute\";\n originId: string;\n publicationRevision: string;\n chainId: number;\n block: {\n number: number;\n hash: Hex;\n parentHash: Hex;\n timestamp: number;\n } | null;\n finality: Finality;\n kind: string;\n schema: string;\n key: string | null;\n /** Present only on `reset_required` events, as the current coverage hint. */\n coverage?: ProcessorCoverage;\n /** RFC 3339 UTC emission time with millisecond precision. */\n emittedAt: string;\n}\n\n/** Blocks the live lane skipped, as a `system.live_gap.put` change announces them. */\nexport interface LiveGapChangeData {\n fromBlock: number;\n toBlock: number;\n /**\n * Leani did not fill the range: the processor's history is on demand, and a\n * `live_gap_fill` limit, if it has one, did not cover or complete it.\n */\n reason: \"not_filled\";\n}\n\n/** System transitions never pretend to contain a processor entity payload. */\nexport type ChangeEnvelope<T = unknown> = ChangeMetadata & (\n | { operation: \"apply\" | \"undo\"; data: T | null }\n | { operation: \"attested\"; data: { throughBlock: number } }\n | { operation: \"finalized\"; data: { throughBlock: number } }\n | { operation: \"finalized\"; data: LiveGapChangeData }\n | { operation: \"reset_required\"; data: {\n earliestAvailableSequence: string;\n latestAvailableSequence: string;\n action: \"query_snapshot_then_resume\";\n } }\n);\n\n/**\n * Whether `change` announces blocks the live lane skipped and did not fill,\n * as after a restart at a later finalized anchor. Request them as history,\n * for example with `liveGapBackfill` from `@smart-byte/leani-sdk/backfill`.\n * A processor with `live_gap_fill` can still deliver some of them later as\n * `live_recovery` batches, when it retries a fill after a hold, a crash, or a\n * restart of its live lane, so write them idempotently.\n */\nexport function isLiveGapChange<T>(\n change: ChangeEnvelope<T>,\n): change is Extract<ChangeEnvelope<T>, { data: LiveGapChangeData }> {\n return change.operation === \"finalized\" && change.kind === \"system.live_gap.put\";\n}\n\nexport interface LiveLaneReset {\n processor: string;\n state: \"paused\";\n reason: \"operator_reset_pending_replay\";\n firstUnappliedBlock: number;\n firstUnappliedHash: Hex;\n requiredDeliveryBytes: string;\n}\n\n/**\n * Connection-scoped stream handshake. Sent as the first frame of every\n * stream connection (including reconnects), synthesized at accept time,\n * never stored, and never acknowledged.\n */\nexport interface StreamHello {\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n coverage: ProcessorCoverage;\n}\n\nexport class ResetRequiredError extends LeaniError {\n readonly change: ChangeEnvelope;\n\n constructor(change: ChangeEnvelope) {\n super(\"the durable stream cursor requires a snapshot reset\", {\n status: 410,\n code: \"cursor_expired\",\n retryable: false,\n details: { cursor: change.cursor },\n });\n this.name = \"ResetRequiredError\";\n this.change = change;\n }\n}\n\nexport interface ListBlocksOptions {\n fromBlock: number;\n toBlock: number;\n limit?: number;\n cursor?: string;\n allowPartial?: boolean;\n signal?: AbortSignal;\n}\n\nexport interface ListTransactionsOptions {\n blockNumber: number;\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface ChangesOptions {\n after?: string;\n limit?: number;\n signal?: AbortSignal;\n}\n\nexport interface SubscribeOptions {\n after?: string;\n signal?: AbortSignal;\n /** Receives the connection handshake frame; called once per (re)connect. */\n onHello?: (hello: StreamHello) => void;\n /**\n * Reconnect when the stream sends nothing, not even the node's 15-second\n * keep-alive comments, for this long while the loop waits for a change.\n * Defaults to 60,000 ms.\n */\n idleTimeoutMs?: number;\n}\n\n/** Select a configured instance when more than one processor has this kind. */\nexport interface ProcessorSubscribeOptions extends SubscribeOptions {\n processor?: string;\n}\n\nexport interface LeaniClient {\n readonly baseUrl: URL;\n request<T>(\n path: string,\n params?: Record<string, QueryValue>,\n options?: { signal?: AbortSignal },\n ): Promise<T>;\n health: {\n live(options?: { signal?: AbortSignal }): Promise<Health>;\n ready(options?: { signal?: AbortSignal }): Promise<Health>;\n };\n status(options?: { signal?: AbortSignal }): Promise<NodeStatus>;\n capabilities(options?: { signal?: AbortSignal }): Promise<Capabilities>;\n processors: {\n list(options?: { signal?: AbortSignal }): Promise<ProcessorSummary[]>;\n status(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<ProcessorCoverage>;\n changes<T = unknown>(\n id: string,\n options?: ChangesOptions,\n ): Promise<Page<ChangeEnvelope<T>>>;\n changeHead(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<ChangeHead>;\n resetLiveLane(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<LiveLaneReset>;\n listCollections(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<{\n processor: ProcessorSummary;\n outputMode: \"none\" | \"latest\" | \"window\" | \"full\";\n retained: boolean;\n data: string[];\n }>;\n queryEntities<T = unknown>(\n id: string,\n collection: string,\n options?: OutputQueryOptions,\n ): Promise<GenericSnapshotPage<T>>;\n /** First snapshot page plus an atomic stream boundary. Read all nextCursor pages and releaseSnapshot before following. */\n queryAndFollow<T = unknown>(\n id: string,\n collection: string,\n options?: Omit<OutputQueryOptions, \"cursor\">,\n ): Promise<FollowSnapshotPage<T>>;\n getEntity<T = unknown>(\n id: string,\n collection: string,\n key: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<GenericOutputEntity<T>>;\n releaseSnapshot(\n id: string,\n snapshotId: string,\n options?: { signal?: AbortSignal },\n ): Promise<void>;\n consumers: {\n list(\n id: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer[]>;\n create(\n id: string,\n options: CreateConsumerOptions,\n ): Promise<DurableConsumer>;\n inspect(\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n revoke(\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n renew(\n id: string,\n consumer: string,\n credential: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n changes<T = unknown>(\n id: string,\n consumer: string,\n credential: string,\n options?: { limit?: number; signal?: AbortSignal },\n ): Promise<Page<ChangeEnvelope<T>>>;\n acknowledge(\n id: string,\n consumer: string,\n credential: string,\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n };\n subscribe<T = unknown>(\n id: string,\n options?: SubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<T>>;\n };\n blobs: {\n getBlock(\n number: number,\n options?: { signal?: AbortSignal },\n ): Promise<BlobsBlock>;\n listBlocks(options: ListBlocksOptions): Promise<Page<BlobsBlock>>;\n listSnapshot(\n options: ListBlocksOptions,\n ): Promise<Page<BlobsSnapshotEntry>>;\n getTransaction(\n hash: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<BlobTransaction>;\n listTransactions(\n options: ListTransactionsOptions,\n ): Promise<Page<BlobTransaction>>;\n getSchedule(options?: {\n atBlock?: number;\n signal?: AbortSignal;\n }): Promise<BlobSchedule>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<BlobsSnapshotEntry>>;\n };\n erc20: {\n getBalance(\n token: Hex,\n address: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<Erc20Balance>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<Erc20Balance>>;\n };\n uniswap: {\n getPool(\n address: Hex,\n options?: { signal?: AbortSignal },\n ): Promise<UniswapPoolPrice>;\n getLatestObservation(\n address: Hex,\n options?: { processor?: string; signal?: AbortSignal },\n ): Promise<LatestUniswapObservation>;\n listConfiguredPools(options?: {\n processor?: string;\n signal?: AbortSignal;\n }): Promise<ConfiguredUniswapPools>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<UniswapPoolPrice>>;\n };\n blocks: {\n getLatest(options?: {\n processor?: string;\n signal?: AbortSignal;\n }): Promise<LatestBlockSummary>;\n getByNumber(\n number: number,\n options?: { processor?: string; signal?: AbortSignal },\n ): Promise<LatestBlockSummary>;\n subscribe(\n options?: ProcessorSubscribeOptions,\n ): AsyncGenerator<ChangeEnvelope<BlockSummary>>;\n };\n}\n\ninterface ResolvedOptions {\n baseUrl: URL;\n token?: string;\n timeoutMs: number;\n fetch: FetchLike;\n queryBasePaths: {\n blobs: string;\n erc20: string;\n uniswap: string;\n };\n reconnect: {\n initialDelayMs: number;\n maxDelayMs: number;\n jitter: number;\n };\n}\n\n/**\n * Create a Bun/Node/browser client for the native v1 query and durable change\n * API. Ethereum JSON-RPC remains a separate endpoint used directly by viem,\n * ethers, or another Ethereum library.\n */\nexport function createLeaniClient(\n options: LeaniClientOptions,\n): LeaniClient {\n const resolved = resolveOptions(options);\n\n const get = <T>(\n path: string,\n query?: Record<string, QueryValue>,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"GET\",\n path,\n query,\n undefined,\n signal,\n extraHeaders,\n );\n\n const post = <T>(\n path: string,\n body?: unknown,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"POST\",\n path,\n undefined,\n body,\n signal,\n extraHeaders,\n );\n\n const remove = (\n path: string,\n signal?: AbortSignal,\n ): Promise<void> => requestVoid(resolved, \"DELETE\", path, signal);\n\n const removeJson = <T>(\n path: string,\n signal?: AbortSignal,\n ): Promise<T> =>\n requestJson<T>(\n resolved,\n \"DELETE\",\n path,\n undefined,\n undefined,\n signal,\n );\n\n const subscribe = <T>(\n processor: string,\n options: SubscribeOptions = {},\n ): AsyncGenerator<ChangeEnvelope<T>> =>\n subscribeProcessor<T>(resolved, processor, options);\n\n const request = <T>(\n path: string,\n params?: Record<string, QueryValue>,\n requestOptions?: { signal?: AbortSignal },\n ): Promise<T> => get<T>(path, params, requestOptions?.signal);\n\n return Object.freeze({\n baseUrl: resolved.baseUrl,\n request,\n health: Object.freeze({\n live: (options?: { signal?: AbortSignal }) =>\n get<Health>(\"health/live\", undefined, options?.signal),\n ready: (options?: { signal?: AbortSignal }) =>\n get<Health>(\"health/ready\", undefined, options?.signal),\n }),\n status: (options?: { signal?: AbortSignal }) =>\n get<NodeStatus>(\"v1/status\", undefined, options?.signal),\n capabilities: (options?: { signal?: AbortSignal }) =>\n request<Capabilities>(\"v1/capabilities\", undefined, options),\n processors: Object.freeze({\n list: async (options?: { signal?: AbortSignal }) => {\n const response = await get<{ data: ProcessorSummary[] }>(\n \"v1/processors\",\n undefined,\n options?.signal,\n );\n return response.data;\n },\n status: (id: string, options?: { signal?: AbortSignal }) =>\n get<ProcessorCoverage>(\n `v1/processors/${encodeURIComponent(id)}/status`,\n undefined,\n options?.signal,\n ),\n changes: <T = unknown>(\n id: string,\n changesOptions: ChangesOptions = {},\n ) =>\n get<Page<ChangeEnvelope<T>>>(\n `v1/processors/${encodeURIComponent(id)}/changes`,\n {\n after: changesOptions.after,\n limit: changesOptions.limit,\n },\n changesOptions.signal,\n ),\n changeHead: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<ChangeHead>(\n `v1/processors/${encodeURIComponent(id)}/changes/head`,\n undefined,\n options?.signal,\n ),\n resetLiveLane: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<LiveLaneReset>(\n `admin/v1/processors/${encodeURIComponent(id)}/lanes/live/reset`,\n undefined,\n options?.signal,\n ),\n listCollections: (\n id: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<{\n processor: ProcessorSummary;\n outputMode: \"none\" | \"latest\" | \"window\" | \"full\";\n retained: boolean;\n data: string[];\n }>(\n `v1/processors/${encodeURIComponent(id)}/collections`,\n undefined,\n options?.signal,\n ),\n queryEntities: <T = unknown>(\n id: string,\n collection: string,\n queryOptions: OutputQueryOptions = {},\n ) => {\n const path = `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/entities`;\n // Only POST creates a snapshot; its later pages are read by GET.\n return queryOptions.cursor === undefined\n ? post<GenericSnapshotPage<T>>(\n path,\n outputQueryBody(queryOptions),\n queryOptions.signal,\n )\n : get<GenericSnapshotPage<T>>(\n path,\n outputQueryValues(queryOptions),\n queryOptions.signal,\n );\n },\n queryAndFollow: <T = unknown>(\n id: string,\n collection: string,\n queryOptions: Omit<OutputQueryOptions, \"cursor\"> = {},\n ) =>\n post<FollowSnapshotPage<T>>(\n `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/query-and-follow`,\n outputQueryBody(queryOptions),\n queryOptions.signal,\n ),\n getEntity: <T = unknown>(\n id: string,\n collection: string,\n key: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n get<GenericOutputEntity<T>>(\n `v1/processors/${encodeURIComponent(id)}/collections/${encodeURIComponent(collection)}/entities/${encodeURIComponent(assertEntityKey(key))}`,\n undefined,\n options?.signal,\n ),\n releaseSnapshot: (\n id: string,\n snapshotId: string,\n options?: { signal?: AbortSignal },\n ) =>\n remove(\n `v1/processors/${encodeURIComponent(id)}/query-snapshots/${encodeURIComponent(snapshotId)}`,\n options?.signal,\n ),\n consumers: Object.freeze({\n list: async (\n id: string,\n options?: { signal?: AbortSignal },\n ) => {\n const response = await get<{ data: DurableConsumer[] }>(\n `v1/processors/${encodeURIComponent(id)}/consumers`,\n undefined,\n options?.signal,\n );\n return response.data;\n },\n create: (\n id: string,\n consumerOptions: CreateConsumerOptions,\n ) =>\n post<DurableConsumer>(\n `v1/processors/${encodeURIComponent(id)}/consumers`,\n {\n id: consumerOptions.id,\n role: consumerOptions.role,\n start: consumerOptions.start,\n leaseTtlSeconds: assertPositiveSafeInteger(\n consumerOptions.leaseTtlSeconds,\n \"leaseTtlSeconds\",\n ),\n credential: consumerOptions.credential,\n },\n consumerOptions.signal,\n ),\n inspect: (\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ) =>\n get<DurableConsumer>(\n consumerPath(id, consumer),\n undefined,\n options?.signal,\n ),\n revoke: (\n id: string,\n consumer: string,\n options?: { signal?: AbortSignal },\n ) =>\n removeJson<DurableConsumer>(\n consumerPath(id, consumer),\n options?.signal,\n ),\n renew: (\n id: string,\n consumer: string,\n credential: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<DurableConsumer>(\n `${consumerPath(id, consumer)}/lease`,\n undefined,\n options?.signal,\n consumerCredentialHeader(credential),\n ),\n changes: <T = unknown>(\n id: string,\n consumer: string,\n credential: string,\n options: { limit?: number; signal?: AbortSignal } = {},\n ) =>\n get<Page<ChangeEnvelope<T>>>(\n `${consumerPath(id, consumer)}/changes`,\n { limit: options.limit },\n options.signal,\n consumerCredentialHeader(credential),\n ),\n acknowledge: (\n id: string,\n consumer: string,\n credential: string,\n cursor: string,\n options?: { signal?: AbortSignal },\n ) =>\n post<DurableConsumer>(\n `${consumerPath(id, consumer)}/ack`,\n { cursor },\n options?.signal,\n consumerCredentialHeader(credential),\n ),\n }),\n subscribe,\n }),\n blobs: Object.freeze({\n getBlock: (number: number, options?: { signal?: AbortSignal }) =>\n request<BlobsBlock>(\n `${resolved.queryBasePaths.blobs}/blocks/${assertSafeInteger(number, \"block number\")}`,\n undefined,\n options,\n ),\n listBlocks: (listOptions: ListBlocksOptions) =>\n request<Page<BlobsBlock>>(\n `${resolved.queryBasePaths.blobs}/blocks`,\n {\n fromBlock: assertSafeInteger(\n listOptions.fromBlock,\n \"fromBlock\",\n ),\n toBlock: assertSafeInteger(listOptions.toBlock, \"toBlock\"),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n allowPartial: listOptions.allowPartial,\n },\n { signal: listOptions.signal },\n ),\n listSnapshot: (listOptions: ListBlocksOptions) =>\n request<Page<BlobsSnapshotEntry>>(\n `${resolved.queryBasePaths.blobs}/snapshot`,\n {\n fromBlock: assertSafeInteger(\n listOptions.fromBlock,\n \"fromBlock\",\n ),\n toBlock: assertSafeInteger(listOptions.toBlock, \"toBlock\"),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n allowPartial: listOptions.allowPartial,\n },\n { signal: listOptions.signal },\n ),\n getTransaction: (\n hash: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<BlobTransaction>(\n `${resolved.queryBasePaths.blobs}/transactions/${encodeURIComponent(assertHash(hash))}`,\n undefined,\n options,\n ),\n listTransactions: (listOptions: ListTransactionsOptions) =>\n request<Page<BlobTransaction>>(\n `${resolved.queryBasePaths.blobs}/transactions`,\n {\n blockNumber: assertSafeInteger(\n listOptions.blockNumber,\n \"blockNumber\",\n ),\n limit: listOptions.limit,\n cursor: listOptions.cursor,\n },\n { signal: listOptions.signal },\n ),\n getSchedule: (\n scheduleOptions: {\n atBlock?: number;\n signal?: AbortSignal;\n } = {},\n ) =>\n request<BlobSchedule>(\n `${resolved.queryBasePaths.blobs}/schedule`,\n {\n atBlock:\n scheduleOptions.atBlock === undefined\n ? undefined\n : assertSafeInteger(scheduleOptions.atBlock, \"atBlock\"),\n },\n { signal: scheduleOptions.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<BlobsSnapshotEntry>(\n subscribeOptions.processor ?? \"blobs-money\",\n subscribeOptions,\n ),\n }),\n erc20: Object.freeze({\n getBalance: (\n token: Hex,\n address: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<Erc20Balance>(\n `${resolved.queryBasePaths.erc20}/balances/${encodeURIComponent(assertAddress(token))}/${encodeURIComponent(assertAddress(address))}`,\n undefined,\n options,\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<Erc20Balance>(subscribeOptions.processor ?? \"erc20-balances\", subscribeOptions),\n }),\n uniswap: Object.freeze({\n getPool: (\n address: Hex,\n options?: { signal?: AbortSignal },\n ) =>\n request<UniswapPoolPrice>(\n `${resolved.queryBasePaths.uniswap}/pools/${encodeURIComponent(assertAddress(address))}`,\n undefined,\n options,\n ),\n getLatestObservation: (\n address: Hex,\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestUniswapObservation>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"uniswap-observations\")}/query/pools/${encodeURIComponent(assertAddress(address))}/latest`,\n undefined,\n { signal: options.signal },\n ),\n listConfiguredPools: (\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<ConfiguredUniswapPools>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"uniswap-observations\")}/query/pools`,\n undefined,\n { signal: options.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<UniswapPoolPrice>(subscribeOptions.processor ?? \"uniswap-observations\", subscribeOptions),\n }),\n blocks: Object.freeze({\n getLatest: (\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestBlockSummary>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"block-summary\")}/query/latest`,\n undefined,\n { signal: options.signal },\n ),\n getByNumber: (\n number: number,\n options: { processor?: string; signal?: AbortSignal } = {},\n ) =>\n request<LatestBlockSummary>(\n `v1/processors/${encodeURIComponent(options.processor ?? \"block-summary\")}/query/blocks/${assertSafeInteger(number, \"block number\")}`,\n undefined,\n { signal: options.signal },\n ),\n subscribe: (subscribeOptions: ProcessorSubscribeOptions = {}) =>\n subscribe<BlockSummary>(subscribeOptions.processor ?? \"block-summary\", subscribeOptions),\n }),\n });\n}\n\nfunction resolveOptions(options: LeaniClientOptions): ResolvedOptions {\n const baseUrl = new URL(options.baseUrl);\n baseUrl.pathname = `${baseUrl.pathname.replace(/\\/+$/, \"\")}/`;\n const timeoutMs = options.timeoutMs ?? 15_000;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError(\"timeoutMs must be a positive safe integer\");\n }\n const jitter = options.reconnect?.jitter ?? 0.2;\n if (!Number.isFinite(jitter) || jitter < 0 || jitter > 1) {\n throw new TypeError(\"reconnect.jitter must be in 0..=1\");\n }\n return {\n baseUrl,\n token: options.token,\n timeoutMs,\n fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n queryBasePaths: {\n blobs: normalizeQueryBasePath(\n options.queryBasePaths?.blobs,\n \"v1/q/blobs\",\n ),\n erc20: normalizeQueryBasePath(\n options.queryBasePaths?.erc20,\n \"v1/q/erc20\",\n ),\n uniswap: normalizeQueryBasePath(\n options.queryBasePaths?.uniswap,\n \"v1/q/uniswap\",\n ),\n },\n reconnect: {\n initialDelayMs: options.reconnect?.initialDelayMs ?? 250,\n maxDelayMs: options.reconnect?.maxDelayMs ?? 10_000,\n jitter,\n },\n };\n}\n\nfunction normalizeQueryBasePath(\n configured: string | undefined,\n fallback: string,\n): string {\n const path = (configured ?? fallback).replace(/\\/+$/g, \"\");\n if (\n path.length === 0 ||\n /^[a-z][a-z0-9+.-]*:/i.test(path) ||\n path.startsWith(\"//\") ||\n path.includes(\"?\") ||\n path.includes(\"#\")\n ) {\n throw new TypeError(\"query base path must be a non-empty same-origin path\");\n }\n return path;\n}\n\nexport type QueryValue = string | number | boolean | undefined;\n\nfunction buildUrl(\n options: ResolvedOptions,\n path: string,\n query?: Record<string, QueryValue>,\n): URL {\n const url = resolveUnder(options.baseUrl, path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url;\n}\n\nasync function requestJson<T>(\n options: ResolvedOptions,\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n query?: Record<string, QueryValue>,\n body?: unknown,\n signal?: AbortSignal,\n extraHeaders?: Record<string, string>,\n): Promise<T> {\n const response = await send(options.fetch, buildUrl(options, path, query), {\n method,\n headers: headers(\n options,\n \"application/json\",\n body !== undefined\n ? { \"content-type\": \"application/json\", ...extraHeaders }\n : method === \"GET\"\n ? extraHeaders\n : { ...LEANI_REQUEST_HEADER, ...extraHeaders },\n ),\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: withDeadline(signal, options.timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n return readJson<T>(response, signal);\n}\n\nasync function requestVoid(\n options: ResolvedOptions,\n method: \"DELETE\",\n path: string,\n signal?: AbortSignal,\n): Promise<void> {\n const response = await send(options.fetch, buildUrl(options, path), {\n method,\n headers: headers(options, \"application/json\", LEANI_REQUEST_HEADER),\n signal: withDeadline(signal, options.timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n}\n\n/** The default `idleTimeoutMs`: four of the node's keep-alive intervals. */\nconst DEFAULT_SSE_IDLE_TIMEOUT_MS = 60_000;\n\n/**\n * Retryable `error` events in a row, with no new change between them, after\n * which a subscription throws the last one instead of reconnecting again.\n */\nconst MAX_ERROR_EVENT_RETRIES = 5;\n\nasync function* subscribeProcessor<T>(\n options: ResolvedOptions,\n processor: string,\n subscribeOptions: SubscribeOptions,\n): AsyncGenerator<ChangeEnvelope<T>> {\n const signal = subscribeOptions.signal;\n const idleTimeoutMs =\n subscribeOptions.idleTimeoutMs ?? DEFAULT_SSE_IDLE_TIMEOUT_MS;\n if (!Number.isSafeInteger(idleTimeoutMs) || idleTimeoutMs <= 0) {\n throw new TypeError(\"idleTimeoutMs must be a positive safe integer\");\n }\n let after = subscribeOptions.after;\n let lastSequence: string | undefined;\n let delayMs = options.reconnect.initialDelayMs;\n let errorEventsWithoutProgress = 0;\n while (!signal?.aborted) {\n const connection = new AbortController();\n const connectionSignal = signal\n ? AbortSignal.any([signal, connection.signal])\n : connection.signal;\n const watchdog = idleWatchdog(idleTimeoutMs, () =>\n connection.abort(\n new TransportError(`SSE stream sent nothing for ${idleTimeoutMs} ms`),\n ));\n try {\n watchdog.arm();\n const response = await send(\n options.fetch,\n buildUrl(\n options,\n `v1/processors/${encodeURIComponent(processor)}/stream`,\n { after },\n ),\n {\n headers: headers(options, \"text/event-stream\"),\n signal: connectionSignal,\n },\n signal,\n );\n if (!response.ok) {\n const error = await responseError(response);\n if (!error.retryable) {\n throw error;\n }\n } else if (!response.body) {\n throw new LeaniError(\"stream response has no body\", {\n status: response.status,\n code: \"internal\",\n retryable: true,\n });\n } else {\n // A stream that opens ends the backoff of earlier failures.\n delayMs = options.reconnect.initialDelayMs;\n const messages = sseMessages(\n readChunks(response.body, connectionSignal, watchdog.arm),\n signal,\n );\n for await (const message of messages) {\n if (!message.data) {\n continue;\n }\n if (message.event === \"hello\") {\n subscribeOptions.onHello?.(JSON.parse(message.data) as StreamHello);\n continue;\n }\n if (message.event === \"error\") {\n const error = errorFromBody(200, JSON.parse(message.data));\n errorEventsWithoutProgress += 1;\n if (\n !error.retryable ||\n errorEventsWithoutProgress > MAX_ERROR_EVENT_RETRIES\n ) {\n throw error;\n }\n // The node ends the stream after an error event. Opening the\n // stream reset the backoff, so it grows with these events.\n delayMs = Math.min(\n options.reconnect.initialDelayMs *\n 2 ** (errorEventsWithoutProgress - 1),\n options.reconnect.maxDelayMs,\n );\n break;\n }\n const change = JSON.parse(message.data) as ChangeEnvelope<T>;\n validateChangeEnvelope(change);\n if (change.operation === \"reset_required\") {\n throw new ResetRequiredError(change as ChangeEnvelope);\n }\n\n if (\n lastSequence !== undefined &&\n compareSequences(change.sequence, lastSequence) <= 0\n ) {\n continue;\n }\n lastSequence = change.sequence;\n after = change.cursor;\n errorEventsWithoutProgress = 0;\n // The time the application spends on a change is not silence.\n watchdog.disarm();\n yield change;\n watchdog.arm();\n }\n }\n } catch (error) {\n if (signal?.aborted) return;\n // Resume only transport failures; malformed events, terminal errors,\n // and user callbacks must fail visibly instead of reconnecting forever.\n if (!(error instanceof TransportError)) throw error;\n } finally {\n watchdog.disarm();\n connection.abort();\n }\n if (signal?.aborted) {\n break;\n }\n await abortableDelay(\n jitter(delayMs, options.reconnect.jitter),\n signal,\n );\n delayMs = Math.min(delayMs * 2, options.reconnect.maxDelayMs);\n }\n}\n\ninterface SseMessage {\n id?: string;\n event?: string;\n data?: string;\n}\n\n/** The largest SSE event the client buffers before it fails the stream. */\nconst MAX_SSE_EVENT_BYTES = 8 * 1024 * 1024;\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\n\nexport async function* parseSse(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<SseMessage> {\n yield* sseMessages(readChunks(body, signal), signal);\n}\n\n/**\n * Split SSE events at blank lines, scanning each byte once. Line endings are\n * ASCII, so a scan by byte never splits a UTF-8 character.\n */\nasync function* sseMessages(\n chunks: AsyncIterable<Uint8Array>,\n signal: AbortSignal | undefined,\n): AsyncGenerator<SseMessage> {\n const decoder = new TextDecoder();\n // The bytes received so far of the event in progress.\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let lineEmpty = true;\n let afterCarriageReturn = false;\n for await (const chunk of chunks) {\n let eventStart = 0;\n for (let index = 0; index < chunk.length; index += 1) {\n const byte = chunk[index];\n if (byte === LINE_FEED && afterCarriageReturn) {\n // The second half of a CRLF, which chunks may split.\n afterCarriageReturn = false;\n continue;\n }\n afterCarriageReturn = byte === CARRIAGE_RETURN;\n if (byte !== LINE_FEED && byte !== CARRIAGE_RETURN) {\n lineEmpty = false;\n continue;\n }\n if (!lineEmpty) {\n lineEmpty = true;\n continue;\n }\n // A blank line completes the event.\n const tail = chunk.subarray(eventStart, index);\n eventStart = index + 1;\n if (pendingBytes + tail.length > MAX_SSE_EVENT_BYTES) {\n throw sseEventTooLarge();\n }\n const event = concatBytes(pending, pendingBytes, tail);\n pending = [];\n pendingBytes = 0;\n if (signal?.aborted) return;\n const parsed = parseSseFrame(decoder.decode(event));\n if (parsed) {\n yield parsed;\n }\n }\n const rest = chunk.subarray(eventStart);\n if (rest.length > 0) {\n pendingBytes += rest.length;\n if (pendingBytes > MAX_SSE_EVENT_BYTES) {\n throw sseEventTooLarge();\n }\n pending.push(rest);\n }\n }\n // Only a blank line completes an SSE event. A partial final event is\n // discarded, so a reconnect resumes from the last complete one.\n}\n\nfunction sseEventTooLarge(): LeaniError {\n return new LeaniError(`SSE event exceeds ${MAX_SSE_EVENT_BYTES} bytes`, {\n status: 200,\n code: \"invalid_response\",\n retryable: false,\n });\n}\n\nfunction parseSseFrame(frame: string): SseMessage | undefined {\n const message: SseMessage = {};\n const data: string[] = [];\n for (const line of frame.split(/\\r\\n|\\r|\\n/)) {\n if (line.length === 0 || line.startsWith(\":\")) {\n continue;\n }\n const separator = line.indexOf(\":\");\n const field = separator < 0 ? line : line.slice(0, separator);\n let value = separator < 0 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n if (field === \"id\") {\n message.id = value;\n } else if (field === \"event\") {\n message.event = value;\n } else if (field === \"data\") {\n data.push(value);\n }\n }\n if (data.length > 0) {\n message.data = data.join(\"\\n\");\n }\n return Object.keys(message).length > 0 ? message : undefined;\n}\n\nfunction headers(\n options: ResolvedOptions,\n accept: string,\n extra?: Record<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = { Accept: accept, ...extra };\n if (options.token) {\n result.Authorization = `Bearer ${options.token}`;\n }\n return result;\n}\n\nfunction validateChangeEnvelope(value: ChangeEnvelope): void {\n if (\n !value ||\n value.apiVersion !== \"1\" ||\n !/^\\d+$/.test(value.sequence) ||\n typeof value.cursor !== \"string\" ||\n value.cursor.length === 0 ||\n ![\"apply\", \"undo\", \"attested\", \"finalized\", \"reset_required\"].includes(value.operation) ||\n typeof value.schema !== \"string\" ||\n value.schema.length === 0\n ) {\n throw new LeaniError(\"invalid change envelope\", {\n status: 200,\n code: \"invalid_response\",\n retryable: false,\n });\n }\n}\n\nexport function compareSequences(left: string, right: string): -1 | 0 | 1 {\n if (!/^\\d+$/.test(left) || !/^\\d+$/.test(right)) {\n throw new TypeError(\"sequences must be unsigned decimal strings\");\n }\n const comparison = BigInt(left) - BigInt(right);\n return comparison < 0n ? -1 : comparison > 0n ? 1 : 0;\n}\n\nexport function isResetRequired(\n change: ChangeEnvelope,\n): change is ChangeEnvelope & { operation: \"reset_required\" } {\n return change.operation === \"reset_required\";\n}\n\nexport interface EntityChangeTarget<T> {\n put(key: string, value: T): void | Promise<void>;\n delete(key: string): void | Promise<void>;\n}\n\nexport async function applyEntityChange<T>(\n target: EntityChangeTarget<T>,\n change: ChangeEnvelope<T>,\n): Promise<void> {\n if ((change.operation !== \"apply\" && change.operation !== \"undo\") || !change.key) {\n return;\n }\n if (change.data === null || change.kind.endsWith(\".delete\")) {\n await target.delete(change.key);\n } else {\n await target.put(change.key, change.data);\n }\n}\n\n/**\n * Commit destination state before constructing the acknowledgement request.\n * If the destination commit rejects, `acknowledge` is never invoked and the\n * durable consumer safely receives the same changes again.\n */\nexport async function commitThenAcknowledge<T>(\n destinationCommit: () => Promise<T>,\n acknowledge: (committed: T) => Promise<unknown>,\n): Promise<T> {\n const committed = await destinationCommit();\n await acknowledge(committed);\n return committed;\n}\n\nexport interface CursorStore {\n get(): string | undefined;\n set(cursor: string): void;\n clear(): void;\n}\n\nexport function createInMemoryCursorStore(initial?: string): CursorStore {\n let cursor = initial;\n return {\n get: () => cursor,\n set: (value: string) => {\n cursor = value;\n },\n clear: () => {\n cursor = undefined;\n },\n };\n}\n\nfunction assertSafeInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\n\nfunction assertPositiveSafeInteger(value: number, field: string): number {\n const result = assertSafeInteger(value, field);\n if (result === 0) {\n throw new TypeError(`${field} must be positive`);\n }\n return result;\n}\n\nfunction optionalSafeInteger(\n value: number | undefined,\n field: string,\n): number | undefined {\n return value === undefined ? undefined : assertSafeInteger(value, field);\n}\n\nfunction outputQueryBody(\n options: Omit<OutputQueryOptions, \"cursor\">,\n): Record<string, number | undefined> {\n return {\n fromBlock: optionalSafeInteger(options.fromBlock, \"fromBlock\"),\n toBlock: optionalSafeInteger(options.toBlock, \"toBlock\"),\n fromTimestamp: optionalSafeInteger(\n options.fromTimestamp,\n \"fromTimestamp\",\n ),\n toTimestamp: optionalSafeInteger(options.toTimestamp, \"toTimestamp\"),\n limit:\n options.limit === undefined\n ? undefined\n : assertPositiveSafeInteger(options.limit, \"limit\"),\n };\n}\n\nfunction outputQueryValues(\n options: OutputQueryOptions,\n): Record<string, QueryValue> {\n return {\n ...outputQueryBody(options),\n cursor: options.cursor,\n };\n}\n\nfunction consumerPath(processor: string, consumer: string): string {\n return `v1/processors/${encodeURIComponent(processor)}/consumers/${encodeURIComponent(consumer)}`;\n}\n\nfunction consumerCredentialHeader(\n credential: string,\n): Record<string, string> {\n if (credential.length === 0) {\n throw new TypeError(\"consumer credential must not be empty\");\n }\n return { \"x-leani-consumer-credential\": credential };\n}\n\nfunction assertEntityKey(value: string): Hex {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {\n throw new TypeError(\"entity key must contain complete hexadecimal bytes\");\n }\n return value as Hex;\n}\n\nfunction assertHash(value: string): Hex {\n if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {\n throw new TypeError(\"transaction hash must contain exactly 32 bytes\");\n }\n return value as Hex;\n}\n\nfunction assertAddress(value: string): Hex {\n if (!/^0x[0-9a-fA-F]{40}$/.test(value)) {\n throw new TypeError(\"address must contain exactly 20 bytes\");\n }\n return value as Hex;\n}\n\nfunction jitter(delayMs: number, amount: number): number {\n const factor = 1 - amount + Math.random() * amount * 2;\n return Math.max(0, Math.round(delayMs * factor));\n}\n\nasync function abortableDelay(\n milliseconds: number,\n signal?: AbortSignal,\n): Promise<void> {\n if (signal?.aborted) {\n return;\n }\n await new Promise<void>((resolve) => {\n const finish = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timeout = setTimeout(finish, milliseconds);\n signal?.addEventListener(\"abort\", finish, { once: true });\n });\n}\n"]}
@@ -249,10 +249,10 @@ export interface paths {
249
249
  * Snapshot processor entities
250
250
  * @description Copies the matching retained output into a stable, short-lived
251
251
  * snapshot and returns its first page. Read later pages with GET and the
252
- * page's `nextCursor`, and release the snapshot when done. A
253
- * `finalized_only` processor's snapshot holds blocks whose changes are
254
- * not published yet, so it offers no boundary to follow:
255
- * `boundaryCursor` and `recovery.follow` are null.
252
+ * page's `nextCursor`, and release the snapshot when done. The snapshot
253
+ * of a processor that publishes from `attested` or `finalized` holds
254
+ * blocks whose changes are not published yet, so it offers no boundary
255
+ * to follow: `boundaryCursor` and `recovery.follow` are null.
256
256
  */
257
257
  post: operations["createProcessorEntitySnapshot"];
258
258
  delete?: never;
@@ -1421,19 +1421,21 @@ export interface components {
1421
1421
  /** @description Store-, chain-, and processor-bound opaque value. */
1422
1422
  Cursor: string;
1423
1423
  /**
1424
- * @description Chain-confidence status of the block a record belongs to.
1425
- * `included`: the block is on the currently followed chain; a reorg can
1426
- * still remove it. `finalized`: Ethereum consensus has finalized the
1427
- * block, as verified by this node's configured finality source. When a
1428
- * source serves finalized material under dataset trust (Xatu, EraE), the
1429
- * label reflects that source's trust model, not an independent proof.
1430
- * `preview`: a peer supplied the block and its connection to the chain is
1431
- * still being checked; only the embedded CLI emits `preview`, the HTTP
1432
- * API never does. A record's `data.finality`, when present, always equals
1433
- * the envelope `finality`.
1424
+ * @description Chain-confidence level of the block a record belongs to.
1425
+ * `unattested`: at least two execution peers served the block, it passed
1426
+ * Leani's header rules, and it extends the delivered chain; the Ethereum
1427
+ * sync committee has not attested it yet, and the block is undone if no
1428
+ * attestation covers it. `attested`: its ancestry is verified to an
1429
+ * execution block at least two thirds of the sync committee attested; a
1430
+ * reorg can still remove it. `finalized`: Ethereum consensus has
1431
+ * finalized the block, as verified by this node's configured finality
1432
+ * source. When a source serves finalized material under dataset trust
1433
+ * (Xatu, EraE), the label reflects that source's trust model, not an
1434
+ * independent proof. A record's `data.finality`, when present, always
1435
+ * equals the envelope `finality`.
1434
1436
  * @enum {string}
1435
1437
  */
1436
- Finality: "preview" | "included" | "finalized";
1438
+ Finality: "unattested" | "attested" | "finalized";
1437
1439
  ProcessorSummary: {
1438
1440
  id: string;
1439
1441
  instance: string;
@@ -1576,8 +1578,9 @@ export interface components {
1576
1578
  nextCursor: components["schemas"]["Cursor"] | null;
1577
1579
  snapshotId: string;
1578
1580
  /**
1579
- * @description Null when the processor has delivery disabled or is
1580
- * `finalized_only`, whose retained state holds unpublished blocks.
1581
+ * @description Null when the processor has delivery disabled or publishes from
1582
+ * `attested` or `finalized`: its retained state holds unpublished
1583
+ * blocks.
1581
1584
  */
1582
1585
  boundaryCursor: components["schemas"]["Cursor"] | null;
1583
1586
  rowCount: components["schemas"]["DecimalQuantity"];
@@ -1872,7 +1875,7 @@ export interface components {
1872
1875
  sequence: components["schemas"]["DecimalQuantity"];
1873
1876
  cursor: components["schemas"]["Cursor"];
1874
1877
  /** @enum {string} */
1875
- operation: "apply" | "undo" | "finalized" | "reset_required";
1878
+ operation: "apply" | "undo" | "attested" | "finalized" | "reset_required";
1876
1879
  /**
1877
1880
  * @description Processing lane that produced this publication.
1878
1881
  * @enum {string}
@@ -1889,8 +1892,11 @@ export interface components {
1889
1892
  schema: string;
1890
1893
  key: string | null;
1891
1894
  /**
1892
- * @description The processor's entity for `apply` and `undo`. For `finalized`,
1893
- * the `system.finality.put` kind carries `{ throughBlock }`, and the
1895
+ * @description The processor's entity for `apply` and `undo`. For `attested`,
1896
+ * the `system.finality.put` kind carries `{ throughBlock }`, the
1897
+ * highest block the sync committee has attested; processors that
1898
+ * publish `unattested` blocks emit it. For `finalized`, the
1899
+ * `system.finality.put` kind carries `{ throughBlock }`, and the
1894
1900
  * `system.live_gap.put` kind carries
1895
1901
  * `{ fromBlock, toBlock, reason: "not_filled" }`: blocks the live
1896
1902
  * lane skipped and did not fill, such as after a restart at a later
@@ -2481,7 +2487,13 @@ export interface operations {
2481
2487
  "application/json": components["schemas"]["FollowSnapshotPage"];
2482
2488
  };
2483
2489
  };
2484
- /** @description This processor has delivery disabled; query retained entities without following, or enable delivery. */
2490
+ /**
2491
+ * @description This processor has delivery disabled; query retained entities
2492
+ * without following, or enable delivery. Or it publishes from
2493
+ * `attested` or `finalized` (`deferred_publication_snapshot`): its
2494
+ * retained state holds blocks not published yet, so follow the
2495
+ * change stream from its head instead.
2496
+ */
2485
2497
  409: {
2486
2498
  headers: {
2487
2499
  [name: string]: unknown;