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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
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.6";
3
+ export declare const SDK_VERSION: "0.1.0-rc.7";
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
6
  export type Finality = "preview" | "included" | "finalized";
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.6";
5
+ export const SDK_VERSION = "0.1.0-rc.7";
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",
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.6\" 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.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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-byte/leani-sdk",
3
- "version": "0.1.0-rc.6",
3
+ "version": "0.1.0-rc.7",
4
4
  "description": "Typed Leani queries and resumable live/history delivery",
5
5
  "license": "MIT",
6
6
  "type": "module",