@smart-byte/leani-sdk 0.1.0-rc.3 → 0.1.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/backfill.d.ts +49 -0
- package/dist/backfill.js +161 -5
- package/dist/backfill.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/openapi.generated.d.ts +106 -14
- package/dist/openapi.generated.js.map +1 -1
- package/package.json +2 -2
package/dist/backfill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"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","sourcesContent":["import { LeaniError, TransportError, responseError } from \"./errors.ts\";\nexport { LeaniError, TransportError } from \"./errors.ts\";\nimport type {\n ChangeEnvelope,\n DurableConsumer,\n FetchLike,\n ProcessorCoverage,\n ProcessorSummary,\n} from \"./index.ts\";\nimport {\n concatBytes,\n idleWatchdog,\n readChunks,\n readJson,\n readText,\n resolveUnder,\n send,\n withDeadline,\n} from \"./transport.ts\";\n\nexport type BackfillExecutionMode = \"fill_missing\" | \"recompute\";\nexport type BackfillState =\n | \"waiting_for_consumer\"\n | \"queued\"\n | \"running\"\n | \"backpressured\"\n | \"storage_backpressured\"\n | \"draining\"\n | \"complete_reclaimable\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface BackfillRange {\n fromBlock: number;\n toBlock: number;\n}\n\nexport interface RequestedBackfillRange {\n fromBlock: number;\n toBlock: number | \"finalized\";\n}\n\nexport interface BackfillStatus {\n id: string;\n owner: \"subscription\";\n processor: string;\n deliveryStreamId?: string;\n publicationRevision?: string;\n fromBlock: number;\n toBlock: number;\n ranges: BackfillRange[];\n requestedBlocks: number;\n processedBlocks: number;\n remainingBlocks: number;\n capturedFinalizedTarget?: number;\n mode: BackfillExecutionMode;\n batching?: EffectiveBackfillBatching;\n state: BackfillState;\n attempts: number;\n updatedAtUnixMs: number;\n report: unknown | null;\n lastError: string | null;\n}\n\nexport interface HistoricalWorkDeletion {\n id: string;\n owner: \"subscription\";\n removedJobs: number;\n removedSubscriptionRanges: number;\n removedConsumers: number;\n removedDeliveryRecords: number;\n removedDeliveryStreams: number;\n removedCoverageIntervals: number;\n removedCoverageSegments: number;\n removedExactCoverage: number;\n removedAppliedBlocks: number;\n removedFinalizedUndo: number;\n retainedProcessorOutput: boolean;\n retainedLiveStream: boolean;\n}\n\nexport type BackfillBatchingRequest = Partial<\n Omit<\n EffectiveBackfillBatching,\n \"maximumBufferedBatches\" | \"maximumBufferedBytes\"\n >\n>;\n\nexport type BackfillBatchingProfile = \"latency\" | \"balanced\" | \"throughput\";\n\nconst BACKFILL_BATCHING_PROFILES: Record<\n BackfillBatchingProfile,\n Required<BackfillBatchingRequest>\n> = {\n latency: {\n targetEncodedBytes: 256 * 1024,\n maximumEncodedBytes: 1024 * 1024,\n maximumEvents: 2_000,\n maximumProcessedBlocks: 512,\n maximumDelayMs: 10,\n compression: \"gzip\",\n },\n balanced: {\n targetEncodedBytes: 1024 * 1024,\n maximumEncodedBytes: 4 * 1024 * 1024,\n maximumEvents: 10_000,\n maximumProcessedBlocks: 4_096,\n maximumDelayMs: 25,\n compression: \"gzip\",\n },\n throughput: {\n targetEncodedBytes: 4 * 1024 * 1024,\n maximumEncodedBytes: 16 * 1024 * 1024,\n maximumEvents: 20_000,\n maximumProcessedBlocks: 8_192,\n maximumDelayMs: 50,\n compression: \"gzip\",\n },\n};\n\nexport function backfillBatchingProfile(\n profile: BackfillBatchingProfile,\n): Required<BackfillBatchingRequest> {\n return { ...BACKFILL_BATCHING_PROFILES[profile] };\n}\n\nexport interface EffectiveBackfillBatching {\n targetEncodedBytes: number;\n maximumEncodedBytes: number;\n maximumEvents: number;\n maximumProcessedBlocks: number;\n maximumDelayMs: number;\n maximumBufferedBatches: number;\n maximumBufferedBytes: number;\n compression: \"none\" | \"gzip\";\n}\n\ninterface CreateBackfillSubscriptionBase {\n processor: string;\n mode?: BackfillExecutionMode;\n consumer?: {\n id: string;\n role: \"required\";\n leaseTtlSeconds: number;\n credential?: string;\n };\n limits?: {\n maxUnacknowledgedBlocks: number;\n maxUnacknowledgedBytes: number;\n resumeBelowRatio: number;\n };\n batching?: BackfillBatchingRequest;\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\nexport type CreateBackfillSubscription = CreateBackfillSubscriptionBase &\n (\n | {\n fromBlock: number;\n toBlock: number | \"finalized\";\n ranges?: never;\n }\n | {\n ranges: RequestedBackfillRange[];\n fromBlock?: never;\n toBlock?: never;\n }\n );\n\n/**\n * The `fill_missing` subscription for the blocks a live gap notice\n * announces, its `LiveGapChangeData`, or any other range the destination\n * lacks. Its idempotency key derives from the consumer and the range, so\n * creating it again, as after the notice is delivered again, returns the\n * same subscription.\n */\nexport function liveGapBackfill(\n range: BackfillRange,\n request: Omit<CreateBackfillSubscriptionBase, \"mode\" | \"idempotencyKey\"> & {\n consumer: NonNullable<CreateBackfillSubscriptionBase[\"consumer\"]>;\n },\n): CreateBackfillSubscription {\n return {\n ...request,\n mode: \"fill_missing\",\n fromBlock: range.fromBlock,\n toBlock: range.toBlock,\n idempotencyKey: `live-gap:${request.consumer.id}:${range.fromBlock}-${range.toBlock}`,\n };\n}\n\nexport interface BackfillStreamHello {\n type: \"hello\";\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n subscriptionId: string;\n streamId: string;\n streamKind: \"backfill\";\n publicationRevision: string;\n ranges: BackfillRange[];\n acknowledgedCursor: string;\n storeEpoch: string;\n heartbeatIntervalMs: string;\n sessionExpiresAtUnixMs: string;\n leaseTtlMs: string;\n}\n\nexport interface BackfillStreamBatch<T = unknown> {\n type: \"batch\";\n streamId: string;\n originKind: \"historical_backfill\" | \"recompute\";\n originId: string;\n publicationRevision: string;\n fromBlock: number;\n throughBlock: number;\n processedBlockCount: string;\n domainChangeCount: string;\n progressUnitCount: string;\n rawPayloadBytes: string;\n uncompressedEncodedBytes: string;\n transmittedBytes: string;\n buildDelayMs: string;\n firstCursor: string | null;\n lastCursor: string | null;\n acknowledgeableCursor: string;\n changes: ChangeEnvelope<T>[];\n}\n\nexport interface BackfillStreamCompletion {\n type: \"backfill_complete\";\n subscriptionId: string;\n streamId: string;\n ranges: BackfillRange[];\n throughBlock: number;\n cursor: string;\n mode: BackfillExecutionMode;\n disposition:\n | \"published_all\"\n | \"published_missing_only\"\n | \"already_covered_noop\";\n requestedBlockCount: string;\n coveredBeforeRequestBlockCount: string;\n coveredBeforeRequestRanges: BackfillRange[];\n newlyProcessedBlockCount: string;\n republishedBlockCount: string;\n domainChangeCount: string;\n preexistingCoverageSkipped: boolean;\n repairHint?: \"recompute\";\n}\n\nexport interface BackfillStreamHeartbeat {\n type: \"heartbeat\";\n emittedAt: string;\n}\n\nexport interface BackfillStreamReset {\n type: \"reset_required\";\n code: \"reset_required\";\n message: string;\n earliestAvailableSequence: string | null;\n latestAvailableSequence: string | null;\n}\n\nexport interface BackfillStreamFailure {\n type: \"error\";\n code: string;\n message: string;\n earliestAvailableSequence: string | null;\n latestAvailableSequence: string | null;\n}\n\nexport type BackfillStreamRecord<T = unknown> =\n | BackfillStreamBatch<T>\n | BackfillStreamCompletion\n | BackfillStreamHeartbeat;\n\nexport interface LiveStreamHello {\n type: \"hello\";\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n streamId: string;\n streamKind: \"live\";\n acknowledgedCursor: string;\n storeEpoch: string;\n heartbeatIntervalMs: string;\n sessionExpiresAtUnixMs: string;\n leaseTtlMs: string;\n /** What the processor covers as the session starts: diff it against the\n * destination to find blocks to request as history. */\n coverage: ProcessorCoverage;\n}\n\nexport interface LiveStreamBatch<T = unknown> {\n type: \"batch\";\n streamId: string;\n originKind: \"live\" | \"live_recovery\";\n originId: string;\n publicationRevision: \"0\";\n fromBlock: number;\n throughBlock: number;\n processedBlockCount: \"1\";\n domainChangeCount: string;\n progressUnitCount: \"1\";\n rawPayloadBytes: string;\n uncompressedEncodedBytes: string;\n transmittedBytes: string;\n buildDelayMs: string;\n firstCursor: string;\n lastCursor: string;\n acknowledgeableCursor: string;\n changes: ChangeEnvelope<T>[];\n}\n\nexport type LiveStreamRecord<T = unknown> =\n | LiveStreamBatch<T>\n | BackfillStreamHeartbeat;\n\nexport interface DeliverySession<THello, TRecord>\n extends AsyncIterable<TRecord> {\n readonly hello: THello;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nexport interface BackfillDeliverySession<T = unknown>\n extends DeliverySession<BackfillStreamHello, BackfillStreamRecord<T>> {\n batches(): AsyncIterable<BackfillStreamBatch<T>>;\n /**\n * Every acknowledgement boundary with the changes it covers: each batch,\n * including one without changes, then the completion. Commit `events`,\n * then acknowledge `ackCursor`.\n */\n deliveryBatches(): AsyncIterable<HistoryDeliveryBatch<T>>;\n /**\n * The batches' changes, flattened. They carry no acknowledgement\n * boundary; acknowledge from `deliveryBatches()` or `batches()`.\n */\n events(): AsyncIterable<ChangeEnvelope<T>>;\n}\n\nexport type LiveDeliverySession<T = unknown> = DeliverySession<\n LiveStreamHello,\n LiveStreamRecord<T>\n>;\n\nexport interface MultiLaneSubscriptionRequest {\n processor: string;\n consumer: string;\n credential?: string;\n lanes: {\n live?: boolean;\n history?: Array<{ subscriptionId: string }>;\n };\n view?: \"live_priority\" | \"lane_specific\";\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n}\n\nexport type UnifiedDeliveryBatch<T = unknown> =\n | {\n laneKind: \"live\";\n laneId: \"live\";\n streamId: string;\n ackCursor: string;\n events: ChangeEnvelope<T>[];\n completion?: never;\n record: LiveStreamBatch<T>;\n }\n | {\n laneKind: \"history\";\n laneId: string;\n streamId: string;\n ackCursor: string;\n events: ChangeEnvelope<T>[];\n completion?: BackfillStreamCompletion;\n record: BackfillStreamBatch<T> | BackfillStreamCompletion;\n };\n\n/** One history lane's batch, as `BackfillDeliverySession.deliveryBatches()` yields it. */\nexport type HistoryDeliveryBatch<T = unknown> = Extract<\n UnifiedDeliveryBatch<T>,\n { laneKind: \"history\" }\n>;\n\nexport interface MultiLaneDelivery<T = unknown> {\n batches(): AsyncIterable<UnifiedDeliveryBatch<T>>;\n liveBatches(): AsyncIterable<UnifiedDeliveryBatch<T>>;\n historyBatches(\n subscriptionId: string,\n ): AsyncIterable<UnifiedDeliveryBatch<T>>;\n acknowledge(\n batch: UnifiedDeliveryBatch<T>,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nexport interface BackfillSubscriptionClientOptions {\n baseUrl: string | URL;\n token?: string;\n fetch?: FetchLike;\n /** Deadline for JSON requests; established delivery streams stay open. */\n timeoutMs?: number;\n}\n\nexport class BackfillStreamError extends Error {\n readonly code: string;\n readonly earliestAvailableSequence: string | null;\n readonly latestAvailableSequence: string | null;\n\n constructor(record: BackfillStreamFailure | BackfillStreamReset) {\n super(record.message);\n this.name =\n record.type === \"reset_required\"\n ? \"BackfillStreamResetError\"\n : \"BackfillStreamError\";\n this.code = record.code;\n this.earliestAvailableSequence = record.earliestAvailableSequence;\n this.latestAvailableSequence = record.latestAvailableSequence;\n }\n}\n\nexport interface BackfillSubscriptionClient {\n readonly baseUrl: URL;\n create(request: CreateBackfillSubscription): Promise<BackfillStatus>;\n list(options?: { signal?: AbortSignal }): Promise<BackfillStatus[]>;\n inspect(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n cancel(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n /** Re-queue a failed subscription to resume from its committed progress. */\n retry(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n /**\n * Delete a terminal subscription. A failed or cancelled one is refused\n * while its required consumer has unacknowledged records, unless\n * `discardUnacknowledged` is set.\n */\n delete(\n subscription: string,\n options?: { signal?: AbortSignal; discardUnacknowledged?: boolean },\n ): Promise<HistoricalWorkDeletion>;\n changes<T = unknown>(\n subscription: string,\n consumer: string,\n options?: {\n credential?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n ): Promise<{\n data: ChangeEnvelope<T>[];\n nextCursor: string | null;\n coverage: unknown;\n }>;\n stream<T = unknown>(\n subscription: string,\n consumer: string,\n options?: {\n credential?: string;\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n },\n ): Promise<BackfillDeliverySession<T>>;\n streamLive<T = unknown>(\n processor: string,\n consumer: string,\n options?: { credential?: string; signal?: AbortSignal },\n ): Promise<LiveDeliverySession<T>>;\n subscribe<T = unknown>(\n request: MultiLaneSubscriptionRequest,\n ): Promise<MultiLaneDelivery<T>>;\n}\n\nexport function createBackfillSubscriptionClient(\n options: BackfillSubscriptionClientOptions,\n): BackfillSubscriptionClient {\n const baseUrl = normalizeBaseUrl(options.baseUrl);\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new TypeError(\"a fetch implementation is required\");\n }\n\n const timeoutMs = options.timeoutMs ?? 30_000;\n assertPositiveInteger(timeoutMs, \"timeoutMs\");\n const requestJson = async <T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n signal: AbortSignal | undefined,\n credential?: string,\n sessionToken?: string,\n ): Promise<T> => {\n const headers = requestHeaders(\n options.token,\n \"application/json\",\n credential,\n sessionToken,\n );\n const response = await send(fetchImpl, resolveUnder(baseUrl, path), {\n method,\n headers:\n method === \"GET\" || body !== undefined\n ? headers\n : markLeaniRequest(headers),\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: withDeadline(signal, timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n return readJson<T>(response, signal);\n };\n\n return Object.freeze({\n baseUrl,\n create: (request: CreateBackfillSubscription) =>\n requestJson<BackfillStatus>(\n \"POST\",\n \"admin/v1/backfill-subscriptions\",\n {\n processor: request.processor,\n ...(request.ranges === undefined\n ? {\n fromBlock: assertBlock(request.fromBlock, \"fromBlock\"),\n toBlock: assertUpperBound(request.toBlock, \"toBlock\"),\n }\n : {\n ranges: request.ranges.map((range, index) => ({\n fromBlock: assertBlock(\n range.fromBlock,\n `ranges[${index}].fromBlock`,\n ),\n toBlock: assertUpperBound(\n range.toBlock,\n `ranges[${index}].toBlock`,\n ),\n })),\n }),\n mode: request.mode ?? \"fill_missing\",\n consumer:\n request.consumer === undefined\n ? undefined\n : {\n id: assertIdentity(request.consumer.id, \"consumer.id\"),\n role: request.consumer.role,\n leaseTtlSeconds: assertPositiveInteger(\n request.consumer.leaseTtlSeconds,\n \"consumer.leaseTtlSeconds\",\n ),\n credential:\n request.consumer.credential === undefined\n ? undefined\n : assertIdentity(\n request.consumer.credential,\n \"consumer.credential\",\n ),\n },\n limits:\n request.limits === undefined\n ? undefined\n : {\n maxUnacknowledgedBlocks: assertPositiveInteger(\n request.limits.maxUnacknowledgedBlocks,\n \"limits.maxUnacknowledgedBlocks\",\n ),\n maxUnacknowledgedBytes: assertPositiveInteger(\n request.limits.maxUnacknowledgedBytes,\n \"limits.maxUnacknowledgedBytes\",\n ),\n resumeBelowRatio: assertRatio(\n request.limits.resumeBelowRatio,\n \"limits.resumeBelowRatio\",\n ),\n },\n batching:\n request.batching === undefined\n ? undefined\n : {\n targetEncodedBytes:\n request.batching.targetEncodedBytes === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.targetEncodedBytes,\n \"batching.targetEncodedBytes\",\n ),\n maximumEncodedBytes:\n request.batching.maximumEncodedBytes === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumEncodedBytes,\n \"batching.maximumEncodedBytes\",\n ),\n maximumEvents:\n request.batching.maximumEvents === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumEvents,\n \"batching.maximumEvents\",\n ),\n maximumProcessedBlocks:\n request.batching.maximumProcessedBlocks === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumProcessedBlocks,\n \"batching.maximumProcessedBlocks\",\n ),\n maximumDelayMs:\n request.batching.maximumDelayMs === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumDelayMs,\n \"batching.maximumDelayMs\",\n ),\n compression: request.batching.compression,\n },\n idempotencyKey: assertIdentity(\n request.idempotencyKey,\n \"idempotencyKey\",\n ),\n },\n request.signal,\n ),\n list: async (listOptions?: { signal?: AbortSignal }) => {\n const response = await requestJson<{ data: BackfillStatus[] }>(\n \"GET\",\n \"admin/v1/backfill-subscriptions\",\n undefined,\n listOptions?.signal,\n );\n return response.data;\n },\n inspect: (\n subscription: string,\n inspectOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"GET\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}`,\n undefined,\n inspectOptions?.signal,\n ),\n cancel: (\n subscription: string,\n cancelOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"POST\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}/cancel`,\n undefined,\n cancelOptions?.signal,\n ),\n retry: (\n subscription: string,\n retryOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"POST\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}/retry`,\n undefined,\n retryOptions?.signal,\n ),\n delete: (\n subscription: string,\n deleteOptions?: { signal?: AbortSignal; discardUnacknowledged?: boolean },\n ) =>\n requestJson<HistoricalWorkDeletion>(\n \"DELETE\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}${deleteOptions?.discardUnacknowledged ? \"?discardUnacknowledged=true\" : \"\"}`,\n undefined,\n deleteOptions?.signal,\n ),\n changes: <T>(\n subscription: string,\n consumer: string,\n changeOptions: {\n credential?: string;\n limit?: number;\n signal?: AbortSignal;\n } = {},\n ) => {\n const path = consumerPath(subscription, consumer, \"changes\");\n const query =\n changeOptions.limit === undefined\n ? \"\"\n : `?limit=${assertPositiveInteger(changeOptions.limit, \"limit\")}`;\n return requestJson<{\n data: ChangeEnvelope<T>[];\n nextCursor: string | null;\n coverage: unknown;\n }>(\n \"GET\",\n `${path}${query}`,\n undefined,\n changeOptions.signal,\n changeOptions.credential,\n );\n },\n stream: <T>(\n subscription: string,\n consumer: string,\n streamOptions: {\n credential?: string;\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n } = {},\n ) =>\n openBackfillStream<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n subscription,\n consumer,\n streamOptions.credential,\n streamOptions.batching,\n streamOptions.signal,\n ),\n streamLive: <T>(\n processor: string,\n consumer: string,\n streamOptions: { credential?: string; signal?: AbortSignal } = {},\n ) =>\n openLiveStream<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n processor,\n consumer,\n streamOptions.credential,\n streamOptions.signal,\n ),\n subscribe: <T>(request: MultiLaneSubscriptionRequest) =>\n openMultiLaneDelivery<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n request,\n ),\n });\n}\n\ninterface UnifiedLane<T> {\n readonly kind: \"live\" | \"history\";\n readonly laneId: string;\n readonly streamId: string;\n readonly deliveryOrdering: \"canonical\" | \"block_versioned_idempotent\";\n next(): Promise<IteratorResult<UnifiedDeliveryBatch<T>>>;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nasync function openMultiLaneDelivery<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n request: MultiLaneSubscriptionRequest,\n): Promise<MultiLaneDelivery<T>> {\n const processor = assertIdentity(request.processor, \"processor\");\n const consumer = assertIdentity(request.consumer, \"consumer\");\n const history = request.lanes.history ?? [];\n const historyIds = history.map(({ subscriptionId }, index) =>\n assertIdentity(subscriptionId, `lanes.history[${index}].subscriptionId`),\n );\n if (new Set(historyIds).size !== historyIds.length) {\n throw new TypeError(\"history subscription IDs must be unique\");\n }\n if (!request.lanes.live && historyIds.length === 0) {\n throw new TypeError(\"subscribe requires at least one live or history lane\");\n }\n const view = request.view ?? \"live_priority\";\n const lanes: UnifiedLane<T>[] = [];\n try {\n if (request.lanes.live) {\n const open = (signal = request.signal) =>\n openLiveStream<T>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n processor,\n consumer,\n request.credential,\n signal,\n );\n lanes.push(unifiedLiveLane(await open(), open, request.signal));\n }\n for (const subscriptionId of historyIds) {\n const open = (signal = request.signal) =>\n openBackfillStream<T>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n subscriptionId,\n consumer,\n request.credential,\n request.batching,\n signal,\n );\n lanes.push(\n unifiedHistoryLane(\n subscriptionId,\n await open(),\n open,\n request.signal,\n ),\n );\n }\n } catch (error) {\n await Promise.allSettled(lanes.map((lane) => lane.close()));\n throw error;\n }\n if (\n lanes.length > 1 &&\n lanes.some((lane) => lane.deliveryOrdering === \"canonical\")\n ) {\n await Promise.allSettled(lanes.map((lane) => lane.close()));\n throw new TypeError(\n \"canonical processors cannot interleave live and history lanes\",\n );\n }\n\n const claimed = new Set<string>();\n const claim = (selected: UnifiedLane<T>[]): void => {\n const duplicate = selected.find((lane) => claimed.has(lane.streamId));\n if (duplicate) {\n throw new TypeError(`delivery lane ${duplicate.streamId} is already being iterated`);\n }\n for (const lane of selected) {\n claimed.add(lane.streamId);\n }\n };\n const iterate = (selected: UnifiedLane<T>): AsyncIterable<UnifiedDeliveryBatch<T>> =>\n iterateUnifiedLanes([selected], claim);\n const byStream = new Map(lanes.map((lane) => [lane.streamId, lane]));\n const live = lanes.find((lane) => lane.kind === \"live\");\n const byHistoryId = new Map(\n lanes\n .filter((lane) => lane.kind === \"history\")\n .map((lane) => [lane.laneId, lane]),\n );\n return Object.freeze({\n batches: () => {\n if (view !== \"live_priority\") {\n throw new TypeError(\n \"batches() requires view=live_priority; use lane-specific iterators\",\n );\n }\n return iterateUnifiedLanes(lanes, claim);\n },\n liveBatches: () => {\n if (view !== \"lane_specific\") {\n throw new TypeError(\"liveBatches() requires view=lane_specific\");\n }\n if (!live) {\n throw new TypeError(\"the delivery subscription has no live lane\");\n }\n return iterate(live);\n },\n historyBatches: (subscriptionId: string) => {\n if (view !== \"lane_specific\") {\n throw new TypeError(\"historyBatches() requires view=lane_specific\");\n }\n const id = assertIdentity(subscriptionId, \"subscriptionId\");\n const lane = byHistoryId.get(id);\n if (!lane) {\n throw new TypeError(`history subscription ${id} is not selected`);\n }\n return iterate(lane);\n },\n acknowledge: (\n batch: UnifiedDeliveryBatch<T>,\n acknowledgeOptions?: { signal?: AbortSignal },\n ) => {\n const lane = byStream.get(batch.streamId);\n if (!lane || lane.laneId !== batch.laneId || lane.kind !== batch.laneKind) {\n throw new TypeError(\"delivery batch does not belong to this subscription object\");\n }\n return lane.acknowledge(batch.ackCursor, acknowledgeOptions);\n },\n close: async () => {\n const outcomes = await Promise.allSettled(lanes.map((lane) => lane.close()));\n const failed = outcomes.find(\n (outcome): outcome is PromiseRejectedResult => outcome.status === \"rejected\",\n );\n if (failed) {\n throw failed.reason;\n }\n },\n });\n}\n\nfunction unifiedLiveLane<T>(\n initialSession: LiveDeliverySession<T>,\n open: (signal?: AbortSignal) => Promise<LiveDeliverySession<T>>,\n signal: AbortSignal | undefined,\n): UnifiedLane<T> {\n const connection = reconnectingLaneConnection(initialSession, open, signal);\n return {\n kind: \"live\",\n laneId: \"live\",\n streamId: initialSession.hello.streamId,\n deliveryOrdering: initialSession.hello.processor.deliveryOrdering,\n async next() {\n while (true) {\n const next = await connection.next();\n if (next.done) return { done: true, value: undefined };\n if (next.value.type === \"heartbeat\") continue;\n const record = next.value;\n return {\n done: false,\n value: {\n laneKind: \"live\",\n laneId: \"live\",\n streamId: record.streamId,\n ackCursor: record.acknowledgeableCursor,\n events: record.changes,\n record,\n },\n };\n }\n },\n acknowledge: connection.acknowledge,\n close: connection.close,\n };\n}\n\nfunction unifiedHistoryLane<T>(\n subscriptionId: string,\n initialSession: BackfillDeliverySession<T>,\n open: (signal?: AbortSignal) => Promise<BackfillDeliverySession<T>>,\n signal: AbortSignal | undefined,\n): UnifiedLane<T> {\n const connection = reconnectingLaneConnection(initialSession, open, signal);\n let complete = false;\n return {\n kind: \"history\",\n laneId: subscriptionId,\n streamId: initialSession.hello.streamId,\n deliveryOrdering: initialSession.hello.processor.deliveryOrdering,\n async next() {\n if (complete) return { done: true, value: undefined };\n while (true) {\n const next = await connection.next();\n if (next.done) return { done: true, value: undefined };\n if (next.value.type === \"heartbeat\") continue;\n complete = next.value.type === \"backfill_complete\";\n return {\n done: false,\n value: historyDeliveryBatch(subscriptionId, next.value),\n };\n }\n },\n acknowledge: connection.acknowledge,\n close: connection.close,\n };\n}\n\n/** A history batch or the completion with the cursor that acknowledges it. */\nfunction historyDeliveryBatch<T>(\n laneId: string,\n record: BackfillStreamBatch<T> | BackfillStreamCompletion,\n): HistoryDeliveryBatch<T> {\n if (record.type === \"backfill_complete\") {\n return {\n laneKind: \"history\",\n laneId,\n streamId: record.streamId,\n ackCursor: record.cursor,\n events: [],\n completion: record,\n record,\n };\n }\n return {\n laneKind: \"history\",\n laneId,\n streamId: record.streamId,\n ackCursor: record.acknowledgeableCursor,\n events: record.changes,\n record,\n };\n}\n\ninterface ReconnectingLaneConnection<THello, TRecord> {\n next(): Promise<IteratorResult<TRecord>>;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nfunction reconnectingLaneConnection<\n THello extends {\n streamId: string;\n storeEpoch: string;\n processor: ProcessorSummary;\n },\n TRecord,\n>(\n initialSession: DeliverySession<THello, TRecord>,\n open: (signal?: AbortSignal) => Promise<DeliverySession<THello, TRecord>>,\n signal: AbortSignal | undefined,\n): ReconnectingLaneConnection<THello, TRecord> {\n const expected = initialSession.hello;\n const stop = new AbortController();\n const reconnectSignal = signal\n ? AbortSignal.any([signal, stop.signal])\n : stop.signal;\n let session = initialSession;\n let iterator = session[Symbol.asyncIterator]();\n let closed = false;\n let reconnectTask: Promise<void> | undefined;\n\n const reconnect = (): Promise<void> => {\n reconnectTask ??= (async () => {\n await session.close().catch(() => undefined);\n let delayMs = 25;\n while (!reconnectSignal.aborted) {\n try {\n const replacement = await open(reconnectSignal);\n try {\n validateReplacementHello(expected, replacement.hello);\n } catch (error) {\n await replacement.close().catch(() => undefined);\n throw error;\n }\n session = replacement;\n iterator = replacement[Symbol.asyncIterator]();\n return;\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n await waitForReconnectDelay(delayMs, reconnectSignal);\n delayMs = Math.min(delayMs * 2, 5_000);\n }\n }\n throw reconnectSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n })().finally(() => {\n reconnectTask = undefined;\n });\n return reconnectTask;\n };\n\n const next = async (): Promise<IteratorResult<TRecord>> => {\n while (!closed && !reconnectSignal.aborted) {\n try {\n const result = await iterator.next();\n if (!result.done) return result;\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n }\n await reconnect();\n }\n return { done: true, value: undefined };\n };\n\n const acknowledge = async (\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer> => {\n try {\n return await session.acknowledge(cursor, options);\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n await reconnect();\n return session.acknowledge(cursor, options);\n }\n };\n\n return {\n next,\n acknowledge,\n close: async () => {\n if (closed) return;\n closed = true;\n stop.abort();\n await session.close();\n // A stopped reconnect rejects with the abort reason, which may be the\n // caller's own, of any type.\n await reconnectTask?.catch((error: unknown) => {\n if (!reconnectSignal.aborted) throw error;\n });\n },\n };\n}\n\nfunction validateReplacementHello<\n THello extends {\n streamId: string;\n storeEpoch: string;\n processor: ProcessorSummary;\n },\n>(expected: THello, replacement: THello): void {\n if (\n replacement.streamId !== expected.streamId ||\n replacement.storeEpoch !== expected.storeEpoch ||\n replacement.processor.id !== expected.processor.id ||\n replacement.processor.version !== expected.processor.version ||\n replacement.processor.codeHash !== expected.processor.codeHash ||\n replacement.processor.configHash !== expected.processor.configHash ||\n replacement.processor.deliveryOrdering !==\n expected.processor.deliveryOrdering\n ) {\n throw streamProtocolError(\n \"live\",\n \"replacement connection changed its durable lane identity\",\n );\n }\n}\n\n/**\n * Classified by where the failure came from, never by its message: the SDK\n * reports every failure below HTTP as a retryable TransportError, and a\n * caller's abort, a stream record, or a local check is never retried.\n */\nfunction isRetryableDeliveryDisconnect(error: unknown): boolean {\n return (\n error instanceof LeaniError &&\n (error.retryable ||\n error.code === \"consumer_session_active\" ||\n error.code === \"consumer_session_lost\")\n );\n}\n\nasync function waitForReconnectDelay(\n delayMs: number,\n signal: AbortSignal,\n): Promise<void> {\n if (signal.aborted) {\n throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n await new Promise<void>((resolve, reject) => {\n const finish = () => {\n signal.removeEventListener(\"abort\", abort);\n resolve();\n };\n const timeout = setTimeout(finish, delayMs);\n const abort = () => {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abort);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction iterateUnifiedLanes<T>(\n lanes: UnifiedLane<T>[],\n claim: (lanes: UnifiedLane<T>[]) => void,\n): AsyncIterable<UnifiedDeliveryBatch<T>> {\n return {\n async *[Symbol.asyncIterator]() {\n claim(lanes);\n const ready: number[] = [];\n const settled = new Map<\n number,\n | { result: IteratorResult<UnifiedDeliveryBatch<T>>; error?: never }\n | { result?: never; error: unknown }\n >();\n let wake: (() => void) | undefined;\n let active = lanes.length;\n const schedule = (index: number): void => {\n lanes[index]!.next().then(\n (result) => {\n settled.set(index, { result });\n ready.push(index);\n wake?.();\n wake = undefined;\n },\n (error: unknown) => {\n settled.set(index, { error });\n ready.push(index);\n wake?.();\n wake = undefined;\n },\n );\n };\n for (let index = 0; index < lanes.length; index += 1) schedule(index);\n while (active > 0) {\n if (ready.length === 0) {\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n const livePosition = ready.findIndex(\n (index) => lanes[index]!.kind === \"live\",\n );\n const [index] = ready.splice(livePosition >= 0 ? livePosition : 0, 1);\n const outcome = settled.get(index!);\n settled.delete(index!);\n if (!outcome) throw new Error(\"delivery scheduler lost a settled lane\");\n if (\"error\" in outcome) throw outcome.error;\n if (outcome.result.done) {\n active -= 1;\n continue;\n }\n const completed = outcome.result.value.completion !== undefined;\n if (completed) {\n active -= 1;\n }\n yield outcome.result.value;\n if (!completed) {\n schedule(index!);\n await Promise.resolve();\n }\n }\n },\n };\n}\n\nasync function openBackfillStream<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n subscription: string,\n consumer: string,\n credential: string | undefined,\n batching: BackfillBatchingRequest | undefined,\n signal: AbortSignal | undefined,\n): Promise<BackfillDeliverySession<T>> {\n const session = await openDeliverySession<\n BackfillStreamHello,\n BackfillStreamRecord<T>\n >(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n backfillStreamPath(subscription, consumer, batching),\n consumerPath(subscription, consumer, \"ack\"),\n consumerPath(subscription, consumer, \"lease\"),\n credential,\n signal,\n \"backfill\",\n );\n const batches = async function* (): AsyncGenerator<BackfillStreamBatch<T>> {\n for await (const record of session) {\n if (record.type === \"batch\") {\n yield record;\n }\n }\n };\n // The stream ends once the completion is acknowledged, so iteration\n // continues past it rather than closing the session first.\n const deliveryBatches = async function* (): AsyncGenerator<\n HistoryDeliveryBatch<T>\n > {\n for await (const record of session) {\n if (record.type !== \"heartbeat\") {\n yield historyDeliveryBatch(session.hello.subscriptionId, record);\n }\n }\n };\n const events = async function* (): AsyncGenerator<ChangeEnvelope<T>> {\n for await (const batch of batches()) {\n yield* batch.changes;\n }\n };\n return Object.freeze({\n hello: session.hello,\n acknowledge: session.acknowledge.bind(session),\n close: session.close.bind(session),\n batches,\n deliveryBatches,\n events,\n [Symbol.asyncIterator]: session[Symbol.asyncIterator].bind(session),\n });\n}\n\nasync function openLiveStream<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n processor: string,\n consumer: string,\n credential: string | undefined,\n signal: AbortSignal | undefined,\n): Promise<LiveDeliverySession<T>> {\n return openDeliverySession<LiveStreamHello, LiveStreamRecord<T>>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n liveConsumerPath(processor, consumer, \"stream\"),\n liveConsumerPath(processor, consumer, \"ack\"),\n liveConsumerPath(processor, consumer, \"lease\"),\n credential,\n signal,\n \"live\",\n );\n}\n\nasync function openDeliverySession<THello, TRecord>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n streamPath: string,\n acknowledgePath: string,\n renewPath: string,\n credential: string | undefined,\n signal: AbortSignal | undefined,\n streamKind: \"backfill\" | \"live\",\n): Promise<DeliverySession<THello, TRecord>> {\n const connection = new AbortController();\n // A connection that fails on its own, rather than through the caller's\n // abort or close(), keeps the failure for the iterator and acknowledge().\n let failure: unknown;\n const fail = (error: unknown): void => {\n if (connection.signal.aborted) {\n return;\n }\n failure = error;\n connection.abort(error);\n };\n const stopFromCaller = () => connection.abort(signal?.reason);\n signal?.addEventListener(\"abort\", stopFromCaller, { once: true });\n if (signal?.aborted) {\n stopFromCaller();\n }\n // Until its hello arrives, the stream may stay silent as long as a JSON\n // request may take; afterwards, for three heartbeat intervals.\n let watchdog = idleWatchdog(timeoutMs, () =>\n fail(\n new TransportError(\n `${streamKind} stream sent no hello within ${timeoutMs} ms`,\n ),\n ));\n let records: AsyncGenerator<unknown> | undefined;\n let wireHello: SessionStreamHello & Record<string, unknown>;\n let sessionToken: string;\n let leaseTtlMs: number;\n let heartbeatIntervalMs: number;\n try {\n watchdog.arm();\n const response = await send(fetchImpl, resolveUnder(baseUrl, streamPath), {\n headers: requestHeaders(token, \"application/x-ndjson\", credential),\n signal: connection.signal,\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n if (!response.body) {\n throw new BackfillStreamError({\n type: \"error\",\n code: \"stream_body_missing\",\n message: `${streamKind} stream response has no body`,\n earliestAvailableSequence: null,\n latestAvailableSequence: null,\n });\n }\n records = ndjsonRecords(response.body, connection.signal, () =>\n watchdog.arm());\n const first = await records.next();\n if (first.done) {\n throw streamProtocolError(streamKind, \"stream ended before its hello record\");\n }\n const firstType = (first.value as { type?: unknown }).type;\n if (firstType === \"error\" || firstType === \"reset_required\") {\n throw new BackfillStreamError(\n first.value as BackfillStreamFailure | BackfillStreamReset,\n );\n }\n if (firstType !== \"hello\") {\n throw streamProtocolError(streamKind, \"first stream record is not hello\");\n }\n wireHello = first.value as SessionStreamHello & Record<string, unknown>;\n sessionToken = assertIdentity(\n wireHello.sessionToken,\n \"stream hello sessionToken\",\n );\n leaseTtlMs = parseHelloDuration(wireHello.leaseTtlMs, \"leaseTtlMs\");\n heartbeatIntervalMs = parseHelloDuration(\n wireHello.heartbeatIntervalMs,\n \"heartbeatIntervalMs\",\n );\n } catch (error) {\n connection.abort();\n signal?.removeEventListener(\"abort\", stopFromCaller);\n await records?.return(undefined).catch(() => undefined);\n throw failure ?? error;\n } finally {\n watchdog.disarm();\n }\n const stream = records;\n const { sessionToken: _sessionToken, ...publicHello } = wireHello;\n const idleMs = 3 * heartbeatIntervalMs;\n watchdog = idleWatchdog(idleMs, () =>\n fail(\n new TransportError(`${streamKind} stream sent nothing for ${idleMs} ms`),\n ));\n const renewal = new AbortController();\n const renewalTask = renewSessionUntilStopped(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n renewPath,\n credential,\n sessionToken,\n leaseTtlMs,\n renewal.signal,\n ).catch((error: unknown) => {\n // A lease that cannot be renewed ends the connection at once instead of\n // at the next record, which may never come.\n if (!renewal.signal.aborted) {\n fail(error);\n }\n });\n let iteratorClaimed = false;\n let closeTask: Promise<void> | undefined;\n const close = (): Promise<void> => {\n closeTask ??= (async () => {\n renewal.abort();\n watchdog.disarm();\n connection.abort();\n signal?.removeEventListener(\"abort\", stopFromCaller);\n try {\n await stream.return(undefined);\n } catch (error) {\n if (!connection.signal.aborted) {\n throw error;\n }\n }\n await renewalTask;\n try {\n const released = await send(fetchImpl, resolveUnder(baseUrl, renewPath), {\n method: \"DELETE\",\n headers: markLeaniRequest(\n requestHeaders(token, \"application/json\", credential, sessionToken),\n ),\n signal: AbortSignal.timeout(timeoutMs),\n }, undefined);\n void released.body?.cancel().catch(() => undefined);\n } catch {\n // The lease also expires and is passively released when the stream\n // disconnects. Explicit release only makes clean reconnect immediate.\n }\n })();\n return closeTask;\n };\n const iterate = async function* (): AsyncGenerator<TRecord> {\n if (iteratorClaimed) {\n throw new TypeError(\"a delivery session can only be iterated once\");\n }\n iteratorClaimed = true;\n try {\n while (true) {\n let next: IteratorResult<unknown>;\n // Only a pending read counts silence, not the time the application\n // spends on a record.\n watchdog.arm();\n try {\n next = await stream.next();\n } catch (error) {\n // The caller's abort and close() end the iteration quietly.\n if (failure === undefined && connection.signal.aborted) {\n return;\n }\n throw failure ?? error;\n } finally {\n watchdog.disarm();\n }\n if (failure !== undefined) {\n throw failure;\n }\n if (next.done) {\n return;\n }\n const record = next.value as\n | TRecord\n | BackfillStreamFailure\n | BackfillStreamReset;\n const recordType = (record as { type?: unknown }).type;\n if (recordType === \"error\" || recordType === \"reset_required\") {\n throw new BackfillStreamError(\n record as BackfillStreamFailure | BackfillStreamReset,\n );\n }\n if (recordType === \"hello\") {\n throw streamProtocolError(streamKind, \"stream sent a second hello record\");\n }\n yield record as TRecord;\n }\n } finally {\n await close();\n }\n };\n return Object.freeze({\n hello: publicHello as unknown as THello,\n acknowledge: async (\n cursor: string,\n acknowledgeOptions?: { signal?: AbortSignal },\n ): Promise<DurableConsumer> => {\n if (closeTask !== undefined) {\n throw new TypeError(\"delivery session is closed\");\n }\n if (failure !== undefined) {\n throw failure;\n }\n const caller = acknowledgeOptions?.signal;\n const acknowledge = await send(\n fetchImpl,\n resolveUnder(baseUrl, acknowledgePath),\n {\n method: \"POST\",\n headers: requestHeaders(\n token,\n \"application/json\",\n credential,\n sessionToken,\n ),\n body: JSON.stringify({ cursor: assertIdentity(cursor, \"cursor\") }),\n signal: withDeadline(caller, timeoutMs),\n },\n caller,\n );\n if (!acknowledge.ok) {\n throw await responseError(acknowledge);\n }\n return readJson<DurableConsumer>(acknowledge, caller);\n },\n close,\n [Symbol.asyncIterator]: iterate,\n });\n}\n\nfunction streamProtocolError(\n streamKind: \"backfill\" | \"live\",\n message: string,\n): BackfillStreamError {\n return new BackfillStreamError({\n type: \"error\",\n code: \"invalid_stream_protocol\",\n message: `${streamKind} ${message}`,\n earliestAvailableSequence: null,\n latestAvailableSequence: null,\n });\n}\n\ninterface SessionStreamHello {\n type: \"hello\";\n sessionToken: string;\n leaseTtlMs: string;\n heartbeatIntervalMs: string;\n}\n\nasync function renewSessionUntilStopped(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n renewPath: string,\n credential: string | undefined,\n sessionToken: string,\n leaseTtlMs: number,\n stop: AbortSignal,\n): Promise<void> {\n const intervalMs = Math.max(50, Math.floor(leaseTtlMs / 3));\n const firstRetryMs = Math.max(10, Math.floor(intervalMs / 10));\n // The node renewed the lease no earlier than the request that renewed it.\n let renewedAt = performance.now();\n let delayMs = intervalMs;\n let retryMs = firstRetryMs;\n while (!stop.aborted) {\n await abortableDelay(delayMs, stop);\n if (stop.aborted) {\n return;\n }\n const attemptedAt = performance.now();\n const leaseLeftMs = renewedAt + leaseTtlMs - attemptedAt;\n try {\n const response = await send(fetchImpl, resolveUnder(baseUrl, renewPath), {\n method: \"POST\",\n headers: markLeaniRequest(\n requestHeaders(token, \"application/json\", credential, sessionToken),\n ),\n // An answer after the lease lapsed could not keep it.\n signal: withDeadline(\n stop,\n Math.max(1, Math.min(timeoutMs, Math.floor(leaseLeftMs))),\n ),\n }, stop);\n if (!response.ok) {\n throw await responseError(response);\n }\n await readText(response, stop);\n renewedAt = attemptedAt;\n delayMs = intervalMs;\n retryMs = firstRetryMs;\n } catch (error) {\n // Retry a transient failure, with backoff, while the lease holds.\n const retryable = error instanceof LeaniError && error.retryable;\n if (\n stop.aborted ||\n !retryable ||\n renewedAt + leaseTtlMs - performance.now() <= retryMs\n ) {\n throw error;\n }\n delayMs = retryMs;\n retryMs *= 2;\n }\n }\n}\n\nfunction abortableDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timeout = setTimeout(finish, delayMs);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\nfunction parseHelloDuration(value: string, field: string): number {\n const milliseconds = Number(value);\n if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {\n throw new TypeError(`stream hello contains an invalid ${field}`);\n }\n return milliseconds;\n}\n\nexport async function* parseNdjson(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<unknown> {\n yield* ndjsonRecords(body, signal);\n}\n\n/**\n * The largest NDJSON record the client buffers: the node's default buffer\n * for a batch's changes, 64 MiB, and room for the batch's own fields.\n */\nconst MAX_NDJSON_RECORD_BYTES = 65 * 1024 * 1024;\n\nconst LINE_FEED = 0x0a;\n\n/**\n * Split NDJSON records at line feeds, scanning each byte once. A line feed is\n * ASCII, so a scan by byte never splits a UTF-8 character.\n */\nasync function* ndjsonRecords(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal | undefined,\n onChunk?: () => void,\n): AsyncGenerator<unknown> {\n const decoder = new TextDecoder();\n // The bytes received so far of the record in progress.\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n for await (const chunk of readChunks(body, signal, onChunk)) {\n let lineStart = 0;\n let newline = chunk.indexOf(LINE_FEED);\n while (newline >= 0) {\n const tail = chunk.subarray(lineStart, newline);\n if (pendingBytes + tail.length > MAX_NDJSON_RECORD_BYTES) {\n throw ndjsonRecordTooLarge();\n }\n const line = decoder\n .decode(concatBytes(pending, pendingBytes, tail))\n .trim();\n pending = [];\n pendingBytes = 0;\n lineStart = newline + 1;\n if (line) {\n yield JSON.parse(line) as unknown;\n }\n newline = chunk.indexOf(LINE_FEED, lineStart);\n }\n const rest = chunk.subarray(lineStart);\n if (rest.length > 0) {\n pendingBytes += rest.length;\n if (pendingBytes > MAX_NDJSON_RECORD_BYTES) {\n throw ndjsonRecordTooLarge();\n }\n pending.push(rest);\n }\n }\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"aborted\", \"AbortError\");\n }\n const finalLine = decoder\n .decode(concatBytes(pending, pendingBytes, new Uint8Array()))\n .trim();\n if (finalLine) {\n yield JSON.parse(finalLine) as unknown;\n }\n}\n\nfunction ndjsonRecordTooLarge(): LeaniError {\n return new LeaniError(\n `NDJSON record exceeds ${MAX_NDJSON_RECORD_BYTES} bytes`,\n { status: 200, code: \"invalid_response\", retryable: false },\n );\n}\n\nfunction normalizeBaseUrl(value: string | URL): URL {\n const url = new URL(value);\n if (!url.pathname.endsWith(\"/\")) {\n url.pathname += \"/\";\n }\n return url;\n}\n\nfunction requestHeaders(\n token: string | undefined,\n accept: string,\n credential?: string,\n sessionToken?: string,\n): Headers {\n const headers = new Headers({ accept });\n if (token) {\n headers.set(\"authorization\", `Bearer ${token}`);\n }\n if (credential !== undefined) {\n headers.set(\n \"x-leani-consumer-credential\",\n assertIdentity(credential, \"credential\"),\n );\n }\n if (sessionToken !== undefined) {\n headers.set(\n \"x-leani-consumer-session\",\n assertIdentity(sessionToken, \"sessionToken\"),\n );\n }\n if (accept === \"application/json\") {\n headers.set(\"content-type\", \"application/json\");\n }\n return headers;\n}\n\n/** Mark a mutation without a JSON body, which the node otherwise refuses. */\nfunction markLeaniRequest(headers: Headers): Headers {\n headers.set(\"x-leani-request\", \"1\");\n return headers;\n}\n\nfunction consumerPath(\n subscription: string,\n consumer: string,\n operation: \"changes\" | \"ack\" | \"lease\" | \"stream\",\n): string {\n return (\n `v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}` +\n `/consumers/${encodeURIComponent(assertIdentity(consumer, \"consumer\"))}/${operation}`\n );\n}\n\nfunction backfillStreamPath(\n subscription: string,\n consumer: string,\n batching: BackfillBatchingRequest | undefined,\n): string {\n const path = consumerPath(subscription, consumer, \"stream\");\n if (batching === undefined) return path;\n const query = new URLSearchParams();\n for (const [field, value] of [\n [\"targetEncodedBytes\", batching.targetEncodedBytes],\n [\"maximumEncodedBytes\", batching.maximumEncodedBytes],\n [\"maximumEvents\", batching.maximumEvents],\n [\"maximumProcessedBlocks\", batching.maximumProcessedBlocks],\n [\"maximumDelayMs\", batching.maximumDelayMs],\n ] as const) {\n if (value !== undefined) {\n query.set(field, String(assertPositiveInteger(value, `batching.${field}`)));\n }\n }\n return query.size === 0 ? path : `${path}?${query}`;\n}\n\nfunction liveConsumerPath(\n processor: string,\n consumer: string,\n operation: \"ack\" | \"lease\" | \"stream\",\n): string {\n return (\n `v1/processors/${encodeURIComponent(assertIdentity(processor, \"processor\"))}` +\n `/streams/live/consumers/${encodeURIComponent(assertIdentity(consumer, \"consumer\"))}/${operation}`\n );\n}\n\nfunction assertBlock(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 assertUpperBound(\n value: number | \"finalized\",\n field: string,\n): number | \"finalized\" {\n return value === \"finalized\" ? value : assertBlock(value, field);\n}\n\nfunction assertPositiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${field} must be a positive safe integer`);\n }\n return value;\n}\n\nfunction assertIdentity(value: string, field: string): string {\n if (!value.trim()) {\n throw new TypeError(`${field} must not be empty`);\n }\n return value;\n}\n\nfunction assertRatio(value: number, field: string): number {\n if (!Number.isFinite(value) || value <= 0 || value >= 1) {\n throw new TypeError(`${field} must be greater than zero and less than one`);\n }\n return value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"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","sourcesContent":["import { LeaniError, TransportError, responseError } from \"./errors.ts\";\nexport { LeaniError, TransportError } from \"./errors.ts\";\nimport type {\n ChangeEnvelope,\n DurableConsumer,\n FetchLike,\n ProcessorCoverage,\n ProcessorSummary,\n} from \"./index.ts\";\nimport {\n concatBytes,\n idleWatchdog,\n readChunks,\n readJson,\n readText,\n resolveUnder,\n send,\n withDeadline,\n} from \"./transport.ts\";\n\nexport type BackfillExecutionMode = \"fill_missing\" | \"recompute\";\nexport type BackfillState =\n | \"waiting_for_consumer\"\n | \"queued\"\n | \"running\"\n | \"backpressured\"\n | \"storage_backpressured\"\n | \"draining\"\n | \"complete_reclaimable\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface BackfillRange {\n fromBlock: number;\n toBlock: number;\n}\n\nexport interface RequestedBackfillRange {\n fromBlock: number;\n toBlock: number | \"finalized\";\n}\n\nexport interface BackfillStatus {\n id: string;\n owner: \"subscription\";\n processor: string;\n /**\n * Whether the node configures the processor instance `processor` now.\n * Without it, the stream and acknowledgement routes refuse the\n * subscription. That can be temporary; if the instance will not return,\n * cancel the subscription and delete it with `discardUnacknowledged: true`,\n * which discards its unacknowledged records.\n */\n processorConfigured: boolean;\n /** The required consumer; tell your subscriptions apart by it, not by `id`. */\n consumer: string | null;\n deliveryStreamId?: string;\n publicationRevision?: string;\n fromBlock: number;\n toBlock: number;\n ranges: BackfillRange[];\n requestedBlocks: number;\n processedBlocks: number;\n remainingBlocks: number;\n capturedFinalizedTarget?: number;\n mode: BackfillExecutionMode;\n batching?: EffectiveBackfillBatching;\n state: BackfillState;\n attempts: number;\n updatedAtUnixMs: number;\n report: unknown | null;\n lastError: string | null;\n}\n\nexport interface HistoricalWorkDeletion {\n id: string;\n owner: \"subscription\";\n removedJobs: number;\n removedSubscriptionRanges: number;\n removedConsumers: number;\n removedDeliveryRecords: number;\n removedDeliveryStreams: number;\n removedCoverageIntervals: number;\n removedCoverageSegments: number;\n removedExactCoverage: number;\n removedAppliedBlocks: number;\n removedFinalizedUndo: number;\n retainedProcessorOutput: boolean;\n retainedLiveStream: boolean;\n}\n\nexport type BackfillBatchingRequest = Partial<\n Omit<\n EffectiveBackfillBatching,\n \"maximumBufferedBatches\" | \"maximumBufferedBytes\"\n >\n>;\n\nexport type BackfillBatchingProfile = \"latency\" | \"balanced\" | \"throughput\";\n\nconst BACKFILL_BATCHING_PROFILES: Record<\n BackfillBatchingProfile,\n Required<BackfillBatchingRequest>\n> = {\n latency: {\n targetEncodedBytes: 256 * 1024,\n maximumEncodedBytes: 1024 * 1024,\n maximumEvents: 2_000,\n maximumProcessedBlocks: 512,\n maximumDelayMs: 10,\n compression: \"gzip\",\n },\n balanced: {\n targetEncodedBytes: 1024 * 1024,\n maximumEncodedBytes: 4 * 1024 * 1024,\n maximumEvents: 10_000,\n maximumProcessedBlocks: 4_096,\n maximumDelayMs: 25,\n compression: \"gzip\",\n },\n throughput: {\n targetEncodedBytes: 4 * 1024 * 1024,\n maximumEncodedBytes: 16 * 1024 * 1024,\n maximumEvents: 20_000,\n maximumProcessedBlocks: 8_192,\n maximumDelayMs: 50,\n compression: \"gzip\",\n },\n};\n\nexport function backfillBatchingProfile(\n profile: BackfillBatchingProfile,\n): Required<BackfillBatchingRequest> {\n return { ...BACKFILL_BATCHING_PROFILES[profile] };\n}\n\nexport interface EffectiveBackfillBatching {\n targetEncodedBytes: number;\n maximumEncodedBytes: number;\n maximumEvents: number;\n maximumProcessedBlocks: number;\n maximumDelayMs: number;\n maximumBufferedBatches: number;\n maximumBufferedBytes: number;\n compression: \"none\" | \"gzip\";\n}\n\ninterface CreateBackfillSubscriptionBase {\n processor: string;\n mode?: BackfillExecutionMode;\n consumer?: {\n id: string;\n role: \"required\";\n leaseTtlSeconds: number;\n credential?: string;\n };\n limits?: {\n maxUnacknowledgedBlocks: number;\n maxUnacknowledgedBytes: number;\n resumeBelowRatio: number;\n };\n batching?: BackfillBatchingRequest;\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\nexport type CreateBackfillSubscription = CreateBackfillSubscriptionBase &\n (\n | {\n fromBlock: number;\n toBlock: number | \"finalized\";\n ranges?: never;\n }\n | {\n ranges: RequestedBackfillRange[];\n fromBlock?: never;\n toBlock?: never;\n }\n );\n\n/**\n * The `fill_missing` subscription for the blocks a live gap notice\n * announces, its `LiveGapChangeData`, or any other range the destination\n * lacks. Its idempotency key derives from the consumer and the range, so\n * creating it again, as after the notice is delivered again, returns the\n * same subscription.\n */\nexport function liveGapBackfill(\n range: BackfillRange,\n request: Omit<CreateBackfillSubscriptionBase, \"mode\" | \"idempotencyKey\"> & {\n consumer: NonNullable<CreateBackfillSubscriptionBase[\"consumer\"]>;\n },\n): CreateBackfillSubscription {\n return {\n ...request,\n mode: \"fill_missing\",\n fromBlock: range.fromBlock,\n toBlock: range.toBlock,\n idempotencyKey: `live-gap:${request.consumer.id}:${range.fromBlock}-${range.toBlock}`,\n };\n}\n\nexport interface BackfillStreamHello {\n type: \"hello\";\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n subscriptionId: string;\n streamId: string;\n streamKind: \"backfill\";\n publicationRevision: string;\n ranges: BackfillRange[];\n acknowledgedCursor: string;\n storeEpoch: string;\n heartbeatIntervalMs: string;\n sessionExpiresAtUnixMs: string;\n leaseTtlMs: string;\n}\n\nexport interface BackfillStreamBatch<T = unknown> {\n type: \"batch\";\n streamId: string;\n originKind: \"historical_backfill\" | \"recompute\";\n originId: string;\n publicationRevision: string;\n fromBlock: number;\n throughBlock: number;\n processedBlockCount: string;\n domainChangeCount: string;\n progressUnitCount: string;\n rawPayloadBytes: string;\n uncompressedEncodedBytes: string;\n transmittedBytes: string;\n buildDelayMs: string;\n firstCursor: string | null;\n lastCursor: string | null;\n acknowledgeableCursor: string;\n changes: ChangeEnvelope<T>[];\n}\n\nexport interface BackfillStreamCompletion {\n type: \"backfill_complete\";\n subscriptionId: string;\n streamId: string;\n ranges: BackfillRange[];\n throughBlock: number;\n cursor: string;\n mode: BackfillExecutionMode;\n disposition:\n | \"published_all\"\n | \"published_missing_only\"\n | \"already_covered_noop\";\n requestedBlockCount: string;\n coveredBeforeRequestBlockCount: string;\n coveredBeforeRequestRanges: BackfillRange[];\n newlyProcessedBlockCount: string;\n republishedBlockCount: string;\n domainChangeCount: string;\n preexistingCoverageSkipped: boolean;\n repairHint?: \"recompute\";\n}\n\nexport interface BackfillStreamHeartbeat {\n type: \"heartbeat\";\n emittedAt: string;\n}\n\nexport interface BackfillStreamReset {\n type: \"reset_required\";\n code: \"reset_required\";\n message: string;\n earliestAvailableSequence: string | null;\n latestAvailableSequence: string | null;\n}\n\nexport interface BackfillStreamFailure {\n type: \"error\";\n code: string;\n message: string;\n earliestAvailableSequence: string | null;\n latestAvailableSequence: string | null;\n}\n\nexport type BackfillStreamRecord<T = unknown> =\n | BackfillStreamBatch<T>\n | BackfillStreamCompletion\n | BackfillStreamHeartbeat;\n\nexport interface LiveStreamHello {\n type: \"hello\";\n apiVersion: \"1\";\n chainId: number;\n processor: ProcessorSummary;\n streamId: string;\n streamKind: \"live\";\n acknowledgedCursor: string;\n storeEpoch: string;\n heartbeatIntervalMs: string;\n sessionExpiresAtUnixMs: string;\n leaseTtlMs: string;\n /** What the processor covers as the session starts: diff it against the\n * destination to find blocks to request as history. */\n coverage: ProcessorCoverage;\n}\n\nexport interface LiveStreamBatch<T = unknown> {\n type: \"batch\";\n streamId: string;\n originKind: \"live\" | \"live_recovery\";\n originId: string;\n publicationRevision: \"0\";\n fromBlock: number;\n throughBlock: number;\n processedBlockCount: \"1\";\n domainChangeCount: string;\n progressUnitCount: \"1\";\n rawPayloadBytes: string;\n uncompressedEncodedBytes: string;\n transmittedBytes: string;\n buildDelayMs: string;\n firstCursor: string;\n lastCursor: string;\n acknowledgeableCursor: string;\n changes: ChangeEnvelope<T>[];\n}\n\nexport type LiveStreamRecord<T = unknown> =\n | LiveStreamBatch<T>\n | BackfillStreamHeartbeat;\n\nexport interface DeliverySession<THello, TRecord>\n extends AsyncIterable<TRecord> {\n readonly hello: THello;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nexport interface BackfillDeliverySession<T = unknown>\n extends DeliverySession<BackfillStreamHello, BackfillStreamRecord<T>> {\n batches(): AsyncIterable<BackfillStreamBatch<T>>;\n /**\n * Every acknowledgement boundary with the changes it covers: each batch,\n * including one without changes, then the completion. Commit `events`,\n * then acknowledge `ackCursor`.\n */\n deliveryBatches(): AsyncIterable<HistoryDeliveryBatch<T>>;\n /**\n * The batches' changes, flattened. They carry no acknowledgement\n * boundary; acknowledge from `deliveryBatches()` or `batches()`.\n */\n events(): AsyncIterable<ChangeEnvelope<T>>;\n}\n\nexport type LiveDeliverySession<T = unknown> = DeliverySession<\n LiveStreamHello,\n LiveStreamRecord<T>\n>;\n\nexport interface MultiLaneSubscriptionRequest {\n processor: string;\n consumer: string;\n credential?: string;\n lanes: {\n live?: boolean;\n history?: Array<{ subscriptionId: string }>;\n };\n view?: \"live_priority\" | \"lane_specific\";\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n}\n\nexport type UnifiedDeliveryBatch<T = unknown> =\n | {\n laneKind: \"live\";\n laneId: \"live\";\n streamId: string;\n ackCursor: string;\n events: ChangeEnvelope<T>[];\n completion?: never;\n record: LiveStreamBatch<T>;\n }\n | {\n laneKind: \"history\";\n laneId: string;\n streamId: string;\n ackCursor: string;\n events: ChangeEnvelope<T>[];\n completion?: BackfillStreamCompletion;\n record: BackfillStreamBatch<T> | BackfillStreamCompletion;\n };\n\n/** One history lane's batch, as `BackfillDeliverySession.deliveryBatches()` yields it. */\nexport type HistoryDeliveryBatch<T = unknown> = Extract<\n UnifiedDeliveryBatch<T>,\n { laneKind: \"history\" }\n>;\n\nexport interface MultiLaneDelivery<T = unknown> {\n batches(): AsyncIterable<UnifiedDeliveryBatch<T>>;\n liveBatches(): AsyncIterable<UnifiedDeliveryBatch<T>>;\n historyBatches(\n subscriptionId: string,\n ): AsyncIterable<UnifiedDeliveryBatch<T>>;\n acknowledge(\n batch: UnifiedDeliveryBatch<T>,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nexport interface BackfillSubscriptionClientOptions {\n baseUrl: string | URL;\n token?: string;\n fetch?: FetchLike;\n /** Deadline for JSON requests; established delivery streams stay open. */\n timeoutMs?: number;\n}\n\nexport class BackfillStreamError extends Error {\n readonly code: string;\n readonly earliestAvailableSequence: string | null;\n readonly latestAvailableSequence: string | null;\n\n constructor(record: BackfillStreamFailure | BackfillStreamReset) {\n super(record.message);\n this.name =\n record.type === \"reset_required\"\n ? \"BackfillStreamResetError\"\n : \"BackfillStreamError\";\n this.code = record.code;\n this.earliestAvailableSequence = record.earliestAvailableSequence;\n this.latestAvailableSequence = record.latestAvailableSequence;\n }\n}\n\nexport interface BackfillSubscriptionClient {\n readonly baseUrl: URL;\n create(request: CreateBackfillSubscription): Promise<BackfillStatus>;\n list(options?: { signal?: AbortSignal }): Promise<BackfillStatus[]>;\n inspect(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n cancel(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n /** Re-queue a failed subscription to resume from its committed progress. */\n retry(\n subscription: string,\n options?: { signal?: AbortSignal },\n ): Promise<BackfillStatus>;\n /**\n * Delete a terminal subscription. A failed or cancelled one is refused\n * while its required consumer has unacknowledged records, unless\n * `discardUnacknowledged` is set.\n */\n delete(\n subscription: string,\n options?: { signal?: AbortSignal; discardUnacknowledged?: boolean },\n ): Promise<HistoricalWorkDeletion>;\n changes<T = unknown>(\n subscription: string,\n consumer: string,\n options?: {\n credential?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n ): Promise<{\n data: ChangeEnvelope<T>[];\n nextCursor: string | null;\n coverage: unknown;\n }>;\n stream<T = unknown>(\n subscription: string,\n consumer: string,\n options?: {\n credential?: string;\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n },\n ): Promise<BackfillDeliverySession<T>>;\n streamLive<T = unknown>(\n processor: string,\n consumer: string,\n options?: { credential?: string; signal?: AbortSignal },\n ): Promise<LiveDeliverySession<T>>;\n subscribe<T = unknown>(\n request: MultiLaneSubscriptionRequest,\n ): Promise<MultiLaneDelivery<T>>;\n}\n\nexport function createBackfillSubscriptionClient(\n options: BackfillSubscriptionClientOptions,\n): BackfillSubscriptionClient {\n const baseUrl = normalizeBaseUrl(options.baseUrl);\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new TypeError(\"a fetch implementation is required\");\n }\n\n const timeoutMs = options.timeoutMs ?? 30_000;\n assertPositiveInteger(timeoutMs, \"timeoutMs\");\n const requestJson = async <T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n signal: AbortSignal | undefined,\n credential?: string,\n sessionToken?: string,\n ): Promise<T> => {\n const headers = requestHeaders(\n options.token,\n \"application/json\",\n credential,\n sessionToken,\n );\n const response = await send(fetchImpl, resolveUnder(baseUrl, path), {\n method,\n headers:\n method === \"GET\" || body !== undefined\n ? headers\n : markLeaniRequest(headers),\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: withDeadline(signal, timeoutMs),\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n return readJson<T>(response, signal);\n };\n\n return Object.freeze({\n baseUrl,\n create: (request: CreateBackfillSubscription) =>\n requestJson<BackfillStatus>(\n \"POST\",\n \"admin/v1/backfill-subscriptions\",\n {\n processor: request.processor,\n ...(request.ranges === undefined\n ? {\n fromBlock: assertBlock(request.fromBlock, \"fromBlock\"),\n toBlock: assertUpperBound(request.toBlock, \"toBlock\"),\n }\n : {\n ranges: request.ranges.map((range, index) => ({\n fromBlock: assertBlock(\n range.fromBlock,\n `ranges[${index}].fromBlock`,\n ),\n toBlock: assertUpperBound(\n range.toBlock,\n `ranges[${index}].toBlock`,\n ),\n })),\n }),\n mode: request.mode ?? \"fill_missing\",\n consumer:\n request.consumer === undefined\n ? undefined\n : {\n id: assertIdentity(request.consumer.id, \"consumer.id\"),\n role: request.consumer.role,\n leaseTtlSeconds: assertPositiveInteger(\n request.consumer.leaseTtlSeconds,\n \"consumer.leaseTtlSeconds\",\n ),\n credential:\n request.consumer.credential === undefined\n ? undefined\n : assertIdentity(\n request.consumer.credential,\n \"consumer.credential\",\n ),\n },\n limits:\n request.limits === undefined\n ? undefined\n : {\n maxUnacknowledgedBlocks: assertPositiveInteger(\n request.limits.maxUnacknowledgedBlocks,\n \"limits.maxUnacknowledgedBlocks\",\n ),\n maxUnacknowledgedBytes: assertPositiveInteger(\n request.limits.maxUnacknowledgedBytes,\n \"limits.maxUnacknowledgedBytes\",\n ),\n resumeBelowRatio: assertRatio(\n request.limits.resumeBelowRatio,\n \"limits.resumeBelowRatio\",\n ),\n },\n batching:\n request.batching === undefined\n ? undefined\n : {\n targetEncodedBytes:\n request.batching.targetEncodedBytes === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.targetEncodedBytes,\n \"batching.targetEncodedBytes\",\n ),\n maximumEncodedBytes:\n request.batching.maximumEncodedBytes === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumEncodedBytes,\n \"batching.maximumEncodedBytes\",\n ),\n maximumEvents:\n request.batching.maximumEvents === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumEvents,\n \"batching.maximumEvents\",\n ),\n maximumProcessedBlocks:\n request.batching.maximumProcessedBlocks === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumProcessedBlocks,\n \"batching.maximumProcessedBlocks\",\n ),\n maximumDelayMs:\n request.batching.maximumDelayMs === undefined\n ? undefined\n : assertPositiveInteger(\n request.batching.maximumDelayMs,\n \"batching.maximumDelayMs\",\n ),\n compression: request.batching.compression,\n },\n idempotencyKey: assertIdentity(\n request.idempotencyKey,\n \"idempotencyKey\",\n ),\n },\n request.signal,\n ),\n list: async (listOptions?: { signal?: AbortSignal }) => {\n const response = await requestJson<{ data: BackfillStatus[] }>(\n \"GET\",\n \"admin/v1/backfill-subscriptions\",\n undefined,\n listOptions?.signal,\n );\n return response.data;\n },\n inspect: (\n subscription: string,\n inspectOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"GET\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}`,\n undefined,\n inspectOptions?.signal,\n ),\n cancel: (\n subscription: string,\n cancelOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"POST\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}/cancel`,\n undefined,\n cancelOptions?.signal,\n ),\n retry: (\n subscription: string,\n retryOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<BackfillStatus>(\n \"POST\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}/retry`,\n undefined,\n retryOptions?.signal,\n ),\n delete: (\n subscription: string,\n deleteOptions?: { signal?: AbortSignal; discardUnacknowledged?: boolean },\n ) =>\n requestJson<HistoricalWorkDeletion>(\n \"DELETE\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}${deleteOptions?.discardUnacknowledged ? \"?discardUnacknowledged=true\" : \"\"}`,\n undefined,\n deleteOptions?.signal,\n ),\n changes: <T>(\n subscription: string,\n consumer: string,\n changeOptions: {\n credential?: string;\n limit?: number;\n signal?: AbortSignal;\n } = {},\n ) => {\n const path = consumerPath(subscription, consumer, \"changes\");\n const query =\n changeOptions.limit === undefined\n ? \"\"\n : `?limit=${assertPositiveInteger(changeOptions.limit, \"limit\")}`;\n return requestJson<{\n data: ChangeEnvelope<T>[];\n nextCursor: string | null;\n coverage: unknown;\n }>(\n \"GET\",\n `${path}${query}`,\n undefined,\n changeOptions.signal,\n changeOptions.credential,\n );\n },\n stream: <T>(\n subscription: string,\n consumer: string,\n streamOptions: {\n credential?: string;\n batching?: BackfillBatchingRequest;\n signal?: AbortSignal;\n } = {},\n ) =>\n openBackfillStream<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n subscription,\n consumer,\n streamOptions.credential,\n streamOptions.batching,\n streamOptions.signal,\n ),\n streamLive: <T>(\n processor: string,\n consumer: string,\n streamOptions: { credential?: string; signal?: AbortSignal } = {},\n ) =>\n openLiveStream<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n processor,\n consumer,\n streamOptions.credential,\n streamOptions.signal,\n ),\n subscribe: <T>(request: MultiLaneSubscriptionRequest) =>\n openMultiLaneDelivery<T>(\n fetchImpl,\n baseUrl,\n options.token,\n timeoutMs,\n request,\n ),\n });\n}\n\nexport type BackfillFailurePolicy = \"retry\" | \"discard\" | \"throw\";\n\nexport interface RunBackfillOptions<T = unknown> {\n /** Apply one history batch. It is acknowledged after this resolves. */\n onBatch(batch: HistoryDeliveryBatch<T>): void | Promise<void>;\n /** What a failed subscription does: retry it (default), delete it, or throw. */\n onFailure?: BackfillFailurePolicy;\n /** Retries before \"retry\" gives up and throws. Default 3. */\n maxRetries?: number;\n /** The consumer's credential; `request.consumer.credential` by default. */\n credential?: string;\n batching?: BackfillBatchingRequest;\n /**\n * Stops the run, as `request.signal` does too. The run rejects with the\n * abort reason and keeps the subscription.\n */\n signal?: AbortSignal;\n}\n\nexport interface RunBackfillResult {\n outcome: \"completed\" | \"cancelled\" | \"failed\";\n /** The subscription as it ended, before its deletion. */\n subscription: BackfillStatus;\n /** The completion record this run received, if it streamed one. */\n completion?: BackfillStreamCompletion;\n deletion: HistoricalWorkDeletion;\n}\n\n/**\n * Run an application-owned history subscription to its end: create it,\n * apply and acknowledge each history batch, and delete it once complete.\n * Creation is idempotent by `idempotencyKey`, so running the identical\n * request again, as after a crash, resumes the same subscription after its\n * last acknowledged batch; a batch applied but not acknowledged is delivered\n * again, so `onBatch` must be idempotent. After a lost connection or\n * consumer session, it backs off, reads the subscription's state, and opens\n * the stream again unless the subscription ended meanwhile. A failed\n * subscription follows `onFailure`; a cancelled one is deleted with its\n * unacknowledged records. An `onBatch` error, an abort, or any other failure\n * closes the session and is thrown, leaving the subscription for a rerun.\n */\nexport async function runBackfill<T = unknown>(\n client: BackfillSubscriptionClient,\n request: CreateBackfillSubscription,\n options: RunBackfillOptions<T>,\n): Promise<RunBackfillResult> {\n const consumer = request.consumer;\n if (consumer === undefined) {\n throw new TypeError(\n \"runBackfill requires request.consumer, the consumer that acknowledges the history\",\n );\n }\n const maxRetries = options.maxRetries ?? 3;\n if (!Number.isSafeInteger(maxRetries) || maxRetries < 0) {\n throw new TypeError(\"maxRetries must be a non-negative safe integer\");\n }\n // Either signal stops every request of the run.\n const signal =\n request.signal && options.signal\n ? AbortSignal.any([request.signal, options.signal])\n : (options.signal ?? request.signal);\n let subscription = await client.create({ ...request, signal });\n let completion: BackfillStreamCompletion | undefined;\n const finish = async (\n outcome: RunBackfillResult[\"outcome\"],\n discardUnacknowledged: boolean,\n ): Promise<RunBackfillResult> => ({\n outcome,\n subscription,\n completion,\n deletion: await client.delete(subscription.id, {\n signal,\n discardUnacknowledged,\n }),\n });\n let retries = 0;\n let delayMs = 1_000;\n // Whether the subscription may have changed since its status was read.\n let stale = false;\n while (true) {\n const { state } = subscription;\n if (state === \"complete_reclaimable\" || state === \"completed\") {\n return finish(\"completed\", false);\n }\n if (state === \"cancelled\") {\n return finish(\"cancelled\", true);\n }\n if (state === \"failed\") {\n if (options.onFailure === \"discard\") {\n return finish(\"failed\", true);\n }\n if (options.onFailure === \"throw\" || retries >= maxRetries) {\n throw new BackfillStreamError({\n type: \"error\",\n code: \"backfill_failed\",\n message: subscription.lastError ?? \"the historical subscription failed\",\n earliestAvailableSequence: null,\n latestAvailableSequence: null,\n });\n }\n retries += 1;\n subscription = await client.retry(subscription.id, { signal });\n continue;\n }\n try {\n if (stale) {\n subscription = await client.inspect(subscription.id, { signal });\n stale = false;\n continue;\n }\n const session = await client.stream<T>(subscription.id, consumer.id, {\n credential: options.credential ?? consumer.credential,\n batching: options.batching,\n signal,\n });\n delayMs = 1_000;\n await applyHistory(session, options, signal, (received) => {\n completion = received;\n });\n } catch (error) {\n if (error instanceof ApplicationFailure) {\n throw error.cause;\n }\n const ended =\n error instanceof BackfillStreamError &&\n (error.code === \"backfill_failed\" || error.code === \"backfill_cancelled\");\n if (!ended) {\n if (!isTransientStreamFailure(error)) {\n throw error;\n }\n await waitForReconnectDelay(delayMs, signal);\n delayMs = Math.min(delayMs * 2, 30_000);\n }\n // The subscription's state decides what follows: it failed or was\n // cancelled, or it may have ended while the stream was down, as when\n // the node applied the completion's acknowledgement but its answer was\n // lost. A stream opened again then would only send heartbeats.\n stale = true;\n continue;\n }\n subscription = await client.inspect(subscription.id, { signal });\n return finish(\"completed\", false);\n }\n}\n\n/** What the application's `onBatch` threw: never a delivery failure to recover from. */\nclass ApplicationFailure {\n constructor(readonly cause: unknown) {}\n}\n\n/**\n * Apply and acknowledge each batch of a history session, then acknowledge\n * its completion, which `received` gets first. The session is closed however\n * this ends.\n */\nasync function applyHistory<T>(\n session: BackfillDeliverySession<T>,\n options: RunBackfillOptions<T>,\n signal: AbortSignal | undefined,\n received: (completion: BackfillStreamCompletion) => void,\n): Promise<void> {\n try {\n for await (const batch of session.deliveryBatches()) {\n if (batch.completion === undefined) {\n try {\n await options.onBatch(batch);\n } catch (error) {\n throw new ApplicationFailure(error);\n }\n } else {\n received(batch.completion);\n }\n await session.acknowledge(batch.ackCursor, { signal });\n if (batch.completion !== undefined) {\n return;\n }\n }\n } finally {\n await session.close();\n }\n // The caller's abort ends a session quietly.\n signal?.throwIfAborted();\n throw new TransportError(\"history stream ended before its completion\");\n}\n\n/**\n * Whether a history stream may be opened again: after a disconnect the SDK\n * reports as retryable, or when the node reports, by HTTP error or stream\n * record, that the consumer's session ended or another connection holds it.\n */\nfunction isTransientStreamFailure(error: unknown): boolean {\n return (\n isRetryableDeliveryDisconnect(error) ||\n (error instanceof BackfillStreamError &&\n (error.code === \"consumer_session_active\" ||\n error.code === \"consumer_session_lost\"))\n );\n}\n\ninterface UnifiedLane<T> {\n readonly kind: \"live\" | \"history\";\n readonly laneId: string;\n readonly streamId: string;\n readonly deliveryOrdering: \"canonical\" | \"block_versioned_idempotent\";\n next(): Promise<IteratorResult<UnifiedDeliveryBatch<T>>>;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nasync function openMultiLaneDelivery<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n request: MultiLaneSubscriptionRequest,\n): Promise<MultiLaneDelivery<T>> {\n const processor = assertIdentity(request.processor, \"processor\");\n const consumer = assertIdentity(request.consumer, \"consumer\");\n const history = request.lanes.history ?? [];\n const historyIds = history.map(({ subscriptionId }, index) =>\n assertIdentity(subscriptionId, `lanes.history[${index}].subscriptionId`),\n );\n if (new Set(historyIds).size !== historyIds.length) {\n throw new TypeError(\"history subscription IDs must be unique\");\n }\n if (!request.lanes.live && historyIds.length === 0) {\n throw new TypeError(\"subscribe requires at least one live or history lane\");\n }\n const view = request.view ?? \"live_priority\";\n const lanes: UnifiedLane<T>[] = [];\n try {\n if (request.lanes.live) {\n const open = (signal = request.signal) =>\n openLiveStream<T>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n processor,\n consumer,\n request.credential,\n signal,\n );\n lanes.push(unifiedLiveLane(await open(), open, request.signal));\n }\n for (const subscriptionId of historyIds) {\n const open = (signal = request.signal) =>\n openBackfillStream<T>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n subscriptionId,\n consumer,\n request.credential,\n request.batching,\n signal,\n );\n lanes.push(\n unifiedHistoryLane(\n subscriptionId,\n await open(),\n open,\n request.signal,\n ),\n );\n }\n } catch (error) {\n await Promise.allSettled(lanes.map((lane) => lane.close()));\n throw error;\n }\n if (\n lanes.length > 1 &&\n lanes.some((lane) => lane.deliveryOrdering === \"canonical\")\n ) {\n await Promise.allSettled(lanes.map((lane) => lane.close()));\n throw new TypeError(\n \"canonical processors cannot interleave live and history lanes\",\n );\n }\n\n const claimed = new Set<string>();\n const claim = (selected: UnifiedLane<T>[]): void => {\n const duplicate = selected.find((lane) => claimed.has(lane.streamId));\n if (duplicate) {\n throw new TypeError(`delivery lane ${duplicate.streamId} is already being iterated`);\n }\n for (const lane of selected) {\n claimed.add(lane.streamId);\n }\n };\n const iterate = (selected: UnifiedLane<T>): AsyncIterable<UnifiedDeliveryBatch<T>> =>\n iterateUnifiedLanes([selected], claim);\n const byStream = new Map(lanes.map((lane) => [lane.streamId, lane]));\n const live = lanes.find((lane) => lane.kind === \"live\");\n const byHistoryId = new Map(\n lanes\n .filter((lane) => lane.kind === \"history\")\n .map((lane) => [lane.laneId, lane]),\n );\n return Object.freeze({\n batches: () => {\n if (view !== \"live_priority\") {\n throw new TypeError(\n \"batches() requires view=live_priority; use lane-specific iterators\",\n );\n }\n return iterateUnifiedLanes(lanes, claim);\n },\n liveBatches: () => {\n if (view !== \"lane_specific\") {\n throw new TypeError(\"liveBatches() requires view=lane_specific\");\n }\n if (!live) {\n throw new TypeError(\"the delivery subscription has no live lane\");\n }\n return iterate(live);\n },\n historyBatches: (subscriptionId: string) => {\n if (view !== \"lane_specific\") {\n throw new TypeError(\"historyBatches() requires view=lane_specific\");\n }\n const id = assertIdentity(subscriptionId, \"subscriptionId\");\n const lane = byHistoryId.get(id);\n if (!lane) {\n throw new TypeError(`history subscription ${id} is not selected`);\n }\n return iterate(lane);\n },\n acknowledge: (\n batch: UnifiedDeliveryBatch<T>,\n acknowledgeOptions?: { signal?: AbortSignal },\n ) => {\n const lane = byStream.get(batch.streamId);\n if (!lane || lane.laneId !== batch.laneId || lane.kind !== batch.laneKind) {\n throw new TypeError(\"delivery batch does not belong to this subscription object\");\n }\n return lane.acknowledge(batch.ackCursor, acknowledgeOptions);\n },\n close: async () => {\n const outcomes = await Promise.allSettled(lanes.map((lane) => lane.close()));\n const failed = outcomes.find(\n (outcome): outcome is PromiseRejectedResult => outcome.status === \"rejected\",\n );\n if (failed) {\n throw failed.reason;\n }\n },\n });\n}\n\nfunction unifiedLiveLane<T>(\n initialSession: LiveDeliverySession<T>,\n open: (signal?: AbortSignal) => Promise<LiveDeliverySession<T>>,\n signal: AbortSignal | undefined,\n): UnifiedLane<T> {\n const connection = reconnectingLaneConnection(initialSession, open, signal);\n return {\n kind: \"live\",\n laneId: \"live\",\n streamId: initialSession.hello.streamId,\n deliveryOrdering: initialSession.hello.processor.deliveryOrdering,\n async next() {\n while (true) {\n const next = await connection.next();\n if (next.done) return { done: true, value: undefined };\n if (next.value.type === \"heartbeat\") continue;\n const record = next.value;\n return {\n done: false,\n value: {\n laneKind: \"live\",\n laneId: \"live\",\n streamId: record.streamId,\n ackCursor: record.acknowledgeableCursor,\n events: record.changes,\n record,\n },\n };\n }\n },\n acknowledge: connection.acknowledge,\n close: connection.close,\n };\n}\n\nfunction unifiedHistoryLane<T>(\n subscriptionId: string,\n initialSession: BackfillDeliverySession<T>,\n open: (signal?: AbortSignal) => Promise<BackfillDeliverySession<T>>,\n signal: AbortSignal | undefined,\n): UnifiedLane<T> {\n const connection = reconnectingLaneConnection(initialSession, open, signal);\n let complete = false;\n return {\n kind: \"history\",\n laneId: subscriptionId,\n streamId: initialSession.hello.streamId,\n deliveryOrdering: initialSession.hello.processor.deliveryOrdering,\n async next() {\n if (complete) return { done: true, value: undefined };\n while (true) {\n const next = await connection.next();\n if (next.done) return { done: true, value: undefined };\n if (next.value.type === \"heartbeat\") continue;\n complete = next.value.type === \"backfill_complete\";\n return {\n done: false,\n value: historyDeliveryBatch(subscriptionId, next.value),\n };\n }\n },\n acknowledge: connection.acknowledge,\n close: connection.close,\n };\n}\n\n/** A history batch or the completion with the cursor that acknowledges it. */\nfunction historyDeliveryBatch<T>(\n laneId: string,\n record: BackfillStreamBatch<T> | BackfillStreamCompletion,\n): HistoryDeliveryBatch<T> {\n if (record.type === \"backfill_complete\") {\n return {\n laneKind: \"history\",\n laneId,\n streamId: record.streamId,\n ackCursor: record.cursor,\n events: [],\n completion: record,\n record,\n };\n }\n return {\n laneKind: \"history\",\n laneId,\n streamId: record.streamId,\n ackCursor: record.acknowledgeableCursor,\n events: record.changes,\n record,\n };\n}\n\ninterface ReconnectingLaneConnection<THello, TRecord> {\n next(): Promise<IteratorResult<TRecord>>;\n acknowledge(\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer>;\n close(): Promise<void>;\n}\n\nfunction reconnectingLaneConnection<\n THello extends {\n streamId: string;\n storeEpoch: string;\n processor: ProcessorSummary;\n },\n TRecord,\n>(\n initialSession: DeliverySession<THello, TRecord>,\n open: (signal?: AbortSignal) => Promise<DeliverySession<THello, TRecord>>,\n signal: AbortSignal | undefined,\n): ReconnectingLaneConnection<THello, TRecord> {\n const expected = initialSession.hello;\n const stop = new AbortController();\n const reconnectSignal = signal\n ? AbortSignal.any([signal, stop.signal])\n : stop.signal;\n let session = initialSession;\n let iterator = session[Symbol.asyncIterator]();\n let closed = false;\n let reconnectTask: Promise<void> | undefined;\n\n const reconnect = (): Promise<void> => {\n reconnectTask ??= (async () => {\n await session.close().catch(() => undefined);\n let delayMs = 25;\n while (!reconnectSignal.aborted) {\n try {\n const replacement = await open(reconnectSignal);\n try {\n validateReplacementHello(expected, replacement.hello);\n } catch (error) {\n await replacement.close().catch(() => undefined);\n throw error;\n }\n session = replacement;\n iterator = replacement[Symbol.asyncIterator]();\n return;\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n await waitForReconnectDelay(delayMs, reconnectSignal);\n delayMs = Math.min(delayMs * 2, 5_000);\n }\n }\n throw reconnectSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n })().finally(() => {\n reconnectTask = undefined;\n });\n return reconnectTask;\n };\n\n const next = async (): Promise<IteratorResult<TRecord>> => {\n while (!closed && !reconnectSignal.aborted) {\n try {\n const result = await iterator.next();\n if (!result.done) return result;\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n }\n await reconnect();\n }\n return { done: true, value: undefined };\n };\n\n const acknowledge = async (\n cursor: string,\n options?: { signal?: AbortSignal },\n ): Promise<DurableConsumer> => {\n try {\n return await session.acknowledge(cursor, options);\n } catch (error) {\n if (!isRetryableDeliveryDisconnect(error)) throw error;\n await reconnect();\n return session.acknowledge(cursor, options);\n }\n };\n\n return {\n next,\n acknowledge,\n close: async () => {\n if (closed) return;\n closed = true;\n stop.abort();\n await session.close();\n // A stopped reconnect rejects with the abort reason, which may be the\n // caller's own, of any type.\n await reconnectTask?.catch((error: unknown) => {\n if (!reconnectSignal.aborted) throw error;\n });\n },\n };\n}\n\nfunction validateReplacementHello<\n THello extends {\n streamId: string;\n storeEpoch: string;\n processor: ProcessorSummary;\n },\n>(expected: THello, replacement: THello): void {\n if (\n replacement.streamId !== expected.streamId ||\n replacement.storeEpoch !== expected.storeEpoch ||\n replacement.processor.id !== expected.processor.id ||\n replacement.processor.version !== expected.processor.version ||\n replacement.processor.codeHash !== expected.processor.codeHash ||\n replacement.processor.configHash !== expected.processor.configHash ||\n replacement.processor.deliveryOrdering !==\n expected.processor.deliveryOrdering\n ) {\n throw streamProtocolError(\n \"live\",\n \"replacement connection changed its durable lane identity\",\n );\n }\n}\n\n/**\n * Classified by where the failure came from, never by its message: the SDK\n * reports every failure below HTTP as a retryable TransportError, and a\n * caller's abort, a stream record, or a local check is never retried.\n */\nfunction isRetryableDeliveryDisconnect(error: unknown): boolean {\n return (\n error instanceof LeaniError &&\n (error.retryable ||\n error.code === \"consumer_session_active\" ||\n error.code === \"consumer_session_lost\")\n );\n}\n\nasync function waitForReconnectDelay(\n delayMs: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n await new Promise<void>((resolve, reject) => {\n const finish = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const timeout = setTimeout(finish, delayMs);\n const abort = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", abort);\n reject(signal?.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction iterateUnifiedLanes<T>(\n lanes: UnifiedLane<T>[],\n claim: (lanes: UnifiedLane<T>[]) => void,\n): AsyncIterable<UnifiedDeliveryBatch<T>> {\n return {\n async *[Symbol.asyncIterator]() {\n claim(lanes);\n const ready: number[] = [];\n const settled = new Map<\n number,\n | { result: IteratorResult<UnifiedDeliveryBatch<T>>; error?: never }\n | { result?: never; error: unknown }\n >();\n let wake: (() => void) | undefined;\n let active = lanes.length;\n const schedule = (index: number): void => {\n lanes[index]!.next().then(\n (result) => {\n settled.set(index, { result });\n ready.push(index);\n wake?.();\n wake = undefined;\n },\n (error: unknown) => {\n settled.set(index, { error });\n ready.push(index);\n wake?.();\n wake = undefined;\n },\n );\n };\n for (let index = 0; index < lanes.length; index += 1) schedule(index);\n while (active > 0) {\n if (ready.length === 0) {\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n const livePosition = ready.findIndex(\n (index) => lanes[index]!.kind === \"live\",\n );\n const [index] = ready.splice(livePosition >= 0 ? livePosition : 0, 1);\n const outcome = settled.get(index!);\n settled.delete(index!);\n if (!outcome) throw new Error(\"delivery scheduler lost a settled lane\");\n if (\"error\" in outcome) throw outcome.error;\n if (outcome.result.done) {\n active -= 1;\n continue;\n }\n const completed = outcome.result.value.completion !== undefined;\n if (completed) {\n active -= 1;\n }\n yield outcome.result.value;\n if (!completed) {\n schedule(index!);\n await Promise.resolve();\n }\n }\n },\n };\n}\n\nasync function openBackfillStream<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n subscription: string,\n consumer: string,\n credential: string | undefined,\n batching: BackfillBatchingRequest | undefined,\n signal: AbortSignal | undefined,\n): Promise<BackfillDeliverySession<T>> {\n const session = await openDeliverySession<\n BackfillStreamHello,\n BackfillStreamRecord<T>\n >(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n backfillStreamPath(subscription, consumer, batching),\n consumerPath(subscription, consumer, \"ack\"),\n consumerPath(subscription, consumer, \"lease\"),\n credential,\n signal,\n \"backfill\",\n );\n const batches = async function* (): AsyncGenerator<BackfillStreamBatch<T>> {\n for await (const record of session) {\n if (record.type === \"batch\") {\n yield record;\n }\n }\n };\n // The stream ends once the completion is acknowledged, so iteration\n // continues past it rather than closing the session first.\n const deliveryBatches = async function* (): AsyncGenerator<\n HistoryDeliveryBatch<T>\n > {\n for await (const record of session) {\n if (record.type !== \"heartbeat\") {\n yield historyDeliveryBatch(session.hello.subscriptionId, record);\n }\n }\n };\n const events = async function* (): AsyncGenerator<ChangeEnvelope<T>> {\n for await (const batch of batches()) {\n yield* batch.changes;\n }\n };\n return Object.freeze({\n hello: session.hello,\n acknowledge: session.acknowledge.bind(session),\n close: session.close.bind(session),\n batches,\n deliveryBatches,\n events,\n [Symbol.asyncIterator]: session[Symbol.asyncIterator].bind(session),\n });\n}\n\nasync function openLiveStream<T>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n processor: string,\n consumer: string,\n credential: string | undefined,\n signal: AbortSignal | undefined,\n): Promise<LiveDeliverySession<T>> {\n return openDeliverySession<LiveStreamHello, LiveStreamRecord<T>>(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n liveConsumerPath(processor, consumer, \"stream\"),\n liveConsumerPath(processor, consumer, \"ack\"),\n liveConsumerPath(processor, consumer, \"lease\"),\n credential,\n signal,\n \"live\",\n );\n}\n\nasync function openDeliverySession<THello, TRecord>(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n streamPath: string,\n acknowledgePath: string,\n renewPath: string,\n credential: string | undefined,\n signal: AbortSignal | undefined,\n streamKind: \"backfill\" | \"live\",\n): Promise<DeliverySession<THello, TRecord>> {\n const connection = new AbortController();\n // A connection that fails on its own, rather than through the caller's\n // abort or close(), keeps the failure for the iterator and acknowledge().\n let failure: unknown;\n const fail = (error: unknown): void => {\n if (connection.signal.aborted) {\n return;\n }\n failure = error;\n connection.abort(error);\n };\n const stopFromCaller = () => connection.abort(signal?.reason);\n signal?.addEventListener(\"abort\", stopFromCaller, { once: true });\n if (signal?.aborted) {\n stopFromCaller();\n }\n // Until its hello arrives, the stream may stay silent as long as a JSON\n // request may take; afterwards, for three heartbeat intervals.\n let watchdog = idleWatchdog(timeoutMs, () =>\n fail(\n new TransportError(\n `${streamKind} stream sent no hello within ${timeoutMs} ms`,\n ),\n ));\n let records: AsyncGenerator<unknown> | undefined;\n let wireHello: SessionStreamHello & Record<string, unknown>;\n let sessionToken: string;\n let leaseTtlMs: number;\n let heartbeatIntervalMs: number;\n try {\n watchdog.arm();\n const response = await send(fetchImpl, resolveUnder(baseUrl, streamPath), {\n headers: requestHeaders(token, \"application/x-ndjson\", credential),\n signal: connection.signal,\n }, signal);\n if (!response.ok) {\n throw await responseError(response);\n }\n if (!response.body) {\n throw new BackfillStreamError({\n type: \"error\",\n code: \"stream_body_missing\",\n message: `${streamKind} stream response has no body`,\n earliestAvailableSequence: null,\n latestAvailableSequence: null,\n });\n }\n records = ndjsonRecords(response.body, connection.signal, () =>\n watchdog.arm());\n const first = await records.next();\n if (first.done) {\n throw streamProtocolError(streamKind, \"stream ended before its hello record\");\n }\n const firstType = (first.value as { type?: unknown }).type;\n if (firstType === \"error\" || firstType === \"reset_required\") {\n throw new BackfillStreamError(\n first.value as BackfillStreamFailure | BackfillStreamReset,\n );\n }\n if (firstType !== \"hello\") {\n throw streamProtocolError(streamKind, \"first stream record is not hello\");\n }\n wireHello = first.value as SessionStreamHello & Record<string, unknown>;\n sessionToken = assertIdentity(\n wireHello.sessionToken,\n \"stream hello sessionToken\",\n );\n leaseTtlMs = parseHelloDuration(wireHello.leaseTtlMs, \"leaseTtlMs\");\n heartbeatIntervalMs = parseHelloDuration(\n wireHello.heartbeatIntervalMs,\n \"heartbeatIntervalMs\",\n );\n } catch (error) {\n connection.abort();\n signal?.removeEventListener(\"abort\", stopFromCaller);\n await records?.return(undefined).catch(() => undefined);\n throw failure ?? error;\n } finally {\n watchdog.disarm();\n }\n const stream = records;\n const { sessionToken: _sessionToken, ...publicHello } = wireHello;\n const idleMs = 3 * heartbeatIntervalMs;\n watchdog = idleWatchdog(idleMs, () =>\n fail(\n new TransportError(`${streamKind} stream sent nothing for ${idleMs} ms`),\n ));\n const renewal = new AbortController();\n const renewalTask = renewSessionUntilStopped(\n fetchImpl,\n baseUrl,\n token,\n timeoutMs,\n renewPath,\n credential,\n sessionToken,\n leaseTtlMs,\n renewal.signal,\n ).catch((error: unknown) => {\n // A lease that cannot be renewed ends the connection at once instead of\n // at the next record, which may never come.\n if (!renewal.signal.aborted) {\n fail(error);\n }\n });\n let iteratorClaimed = false;\n let closeTask: Promise<void> | undefined;\n const close = (): Promise<void> => {\n closeTask ??= (async () => {\n renewal.abort();\n watchdog.disarm();\n connection.abort();\n signal?.removeEventListener(\"abort\", stopFromCaller);\n try {\n await stream.return(undefined);\n } catch (error) {\n if (!connection.signal.aborted) {\n throw error;\n }\n }\n await renewalTask;\n try {\n const released = await send(fetchImpl, resolveUnder(baseUrl, renewPath), {\n method: \"DELETE\",\n headers: markLeaniRequest(\n requestHeaders(token, \"application/json\", credential, sessionToken),\n ),\n signal: AbortSignal.timeout(timeoutMs),\n }, undefined);\n void released.body?.cancel().catch(() => undefined);\n } catch {\n // The lease also expires and is passively released when the stream\n // disconnects. Explicit release only makes clean reconnect immediate.\n }\n })();\n return closeTask;\n };\n const iterate = async function* (): AsyncGenerator<TRecord> {\n if (iteratorClaimed) {\n throw new TypeError(\"a delivery session can only be iterated once\");\n }\n iteratorClaimed = true;\n try {\n while (true) {\n let next: IteratorResult<unknown>;\n // Only a pending read counts silence, not the time the application\n // spends on a record.\n watchdog.arm();\n try {\n next = await stream.next();\n } catch (error) {\n // The caller's abort and close() end the iteration quietly.\n if (failure === undefined && connection.signal.aborted) {\n return;\n }\n throw failure ?? error;\n } finally {\n watchdog.disarm();\n }\n if (failure !== undefined) {\n throw failure;\n }\n if (next.done) {\n return;\n }\n const record = next.value as\n | TRecord\n | BackfillStreamFailure\n | BackfillStreamReset;\n const recordType = (record as { type?: unknown }).type;\n if (recordType === \"error\" || recordType === \"reset_required\") {\n throw new BackfillStreamError(\n record as BackfillStreamFailure | BackfillStreamReset,\n );\n }\n if (recordType === \"hello\") {\n throw streamProtocolError(streamKind, \"stream sent a second hello record\");\n }\n yield record as TRecord;\n }\n } finally {\n await close();\n }\n };\n return Object.freeze({\n hello: publicHello as unknown as THello,\n acknowledge: async (\n cursor: string,\n acknowledgeOptions?: { signal?: AbortSignal },\n ): Promise<DurableConsumer> => {\n if (closeTask !== undefined) {\n throw new TypeError(\"delivery session is closed\");\n }\n if (failure !== undefined) {\n throw failure;\n }\n const caller = acknowledgeOptions?.signal;\n const acknowledge = await send(\n fetchImpl,\n resolveUnder(baseUrl, acknowledgePath),\n {\n method: \"POST\",\n headers: requestHeaders(\n token,\n \"application/json\",\n credential,\n sessionToken,\n ),\n body: JSON.stringify({ cursor: assertIdentity(cursor, \"cursor\") }),\n signal: withDeadline(caller, timeoutMs),\n },\n caller,\n );\n if (!acknowledge.ok) {\n throw await responseError(acknowledge);\n }\n return readJson<DurableConsumer>(acknowledge, caller);\n },\n close,\n [Symbol.asyncIterator]: iterate,\n });\n}\n\nfunction streamProtocolError(\n streamKind: \"backfill\" | \"live\",\n message: string,\n): BackfillStreamError {\n return new BackfillStreamError({\n type: \"error\",\n code: \"invalid_stream_protocol\",\n message: `${streamKind} ${message}`,\n earliestAvailableSequence: null,\n latestAvailableSequence: null,\n });\n}\n\ninterface SessionStreamHello {\n type: \"hello\";\n sessionToken: string;\n leaseTtlMs: string;\n heartbeatIntervalMs: string;\n}\n\nasync function renewSessionUntilStopped(\n fetchImpl: FetchLike,\n baseUrl: URL,\n token: string | undefined,\n timeoutMs: number,\n renewPath: string,\n credential: string | undefined,\n sessionToken: string,\n leaseTtlMs: number,\n stop: AbortSignal,\n): Promise<void> {\n const intervalMs = Math.max(50, Math.floor(leaseTtlMs / 3));\n const firstRetryMs = Math.max(10, Math.floor(intervalMs / 10));\n // The node renewed the lease no earlier than the request that renewed it.\n let renewedAt = performance.now();\n let delayMs = intervalMs;\n let retryMs = firstRetryMs;\n while (!stop.aborted) {\n await abortableDelay(delayMs, stop);\n if (stop.aborted) {\n return;\n }\n const attemptedAt = performance.now();\n const leaseLeftMs = renewedAt + leaseTtlMs - attemptedAt;\n try {\n const response = await send(fetchImpl, resolveUnder(baseUrl, renewPath), {\n method: \"POST\",\n headers: markLeaniRequest(\n requestHeaders(token, \"application/json\", credential, sessionToken),\n ),\n // An answer after the lease lapsed could not keep it.\n signal: withDeadline(\n stop,\n Math.max(1, Math.min(timeoutMs, Math.floor(leaseLeftMs))),\n ),\n }, stop);\n if (!response.ok) {\n throw await responseError(response);\n }\n await readText(response, stop);\n renewedAt = attemptedAt;\n delayMs = intervalMs;\n retryMs = firstRetryMs;\n } catch (error) {\n // Retry a transient failure, with backoff, while the lease holds.\n const retryable = error instanceof LeaniError && error.retryable;\n if (\n stop.aborted ||\n !retryable ||\n renewedAt + leaseTtlMs - performance.now() <= retryMs\n ) {\n throw error;\n }\n delayMs = retryMs;\n retryMs *= 2;\n }\n }\n}\n\nfunction abortableDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timeout = setTimeout(finish, delayMs);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\nfunction parseHelloDuration(value: string, field: string): number {\n const milliseconds = Number(value);\n if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {\n throw new TypeError(`stream hello contains an invalid ${field}`);\n }\n return milliseconds;\n}\n\nexport async function* parseNdjson(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<unknown> {\n yield* ndjsonRecords(body, signal);\n}\n\n/**\n * The largest NDJSON record the client buffers: the node's default buffer\n * for a batch's changes, 64 MiB, and room for the batch's own fields.\n */\nconst MAX_NDJSON_RECORD_BYTES = 65 * 1024 * 1024;\n\nconst LINE_FEED = 0x0a;\n\n/**\n * Split NDJSON records at line feeds, scanning each byte once. A line feed is\n * ASCII, so a scan by byte never splits a UTF-8 character.\n */\nasync function* ndjsonRecords(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal | undefined,\n onChunk?: () => void,\n): AsyncGenerator<unknown> {\n const decoder = new TextDecoder();\n // The bytes received so far of the record in progress.\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n for await (const chunk of readChunks(body, signal, onChunk)) {\n let lineStart = 0;\n let newline = chunk.indexOf(LINE_FEED);\n while (newline >= 0) {\n const tail = chunk.subarray(lineStart, newline);\n if (pendingBytes + tail.length > MAX_NDJSON_RECORD_BYTES) {\n throw ndjsonRecordTooLarge();\n }\n const line = decoder\n .decode(concatBytes(pending, pendingBytes, tail))\n .trim();\n pending = [];\n pendingBytes = 0;\n lineStart = newline + 1;\n if (line) {\n yield JSON.parse(line) as unknown;\n }\n newline = chunk.indexOf(LINE_FEED, lineStart);\n }\n const rest = chunk.subarray(lineStart);\n if (rest.length > 0) {\n pendingBytes += rest.length;\n if (pendingBytes > MAX_NDJSON_RECORD_BYTES) {\n throw ndjsonRecordTooLarge();\n }\n pending.push(rest);\n }\n }\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"aborted\", \"AbortError\");\n }\n const finalLine = decoder\n .decode(concatBytes(pending, pendingBytes, new Uint8Array()))\n .trim();\n if (finalLine) {\n yield JSON.parse(finalLine) as unknown;\n }\n}\n\nfunction ndjsonRecordTooLarge(): LeaniError {\n return new LeaniError(\n `NDJSON record exceeds ${MAX_NDJSON_RECORD_BYTES} bytes`,\n { status: 200, code: \"invalid_response\", retryable: false },\n );\n}\n\nfunction normalizeBaseUrl(value: string | URL): URL {\n const url = new URL(value);\n if (!url.pathname.endsWith(\"/\")) {\n url.pathname += \"/\";\n }\n return url;\n}\n\nfunction requestHeaders(\n token: string | undefined,\n accept: string,\n credential?: string,\n sessionToken?: string,\n): Headers {\n const headers = new Headers({ accept });\n if (token) {\n headers.set(\"authorization\", `Bearer ${token}`);\n }\n if (credential !== undefined) {\n headers.set(\n \"x-leani-consumer-credential\",\n assertIdentity(credential, \"credential\"),\n );\n }\n if (sessionToken !== undefined) {\n headers.set(\n \"x-leani-consumer-session\",\n assertIdentity(sessionToken, \"sessionToken\"),\n );\n }\n if (accept === \"application/json\") {\n headers.set(\"content-type\", \"application/json\");\n }\n return headers;\n}\n\n/** Mark a mutation without a JSON body, which the node otherwise refuses. */\nfunction markLeaniRequest(headers: Headers): Headers {\n headers.set(\"x-leani-request\", \"1\");\n return headers;\n}\n\nfunction consumerPath(\n subscription: string,\n consumer: string,\n operation: \"changes\" | \"ack\" | \"lease\" | \"stream\",\n): string {\n return (\n `v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}` +\n `/consumers/${encodeURIComponent(assertIdentity(consumer, \"consumer\"))}/${operation}`\n );\n}\n\nfunction backfillStreamPath(\n subscription: string,\n consumer: string,\n batching: BackfillBatchingRequest | undefined,\n): string {\n const path = consumerPath(subscription, consumer, \"stream\");\n if (batching === undefined) return path;\n const query = new URLSearchParams();\n for (const [field, value] of [\n [\"targetEncodedBytes\", batching.targetEncodedBytes],\n [\"maximumEncodedBytes\", batching.maximumEncodedBytes],\n [\"maximumEvents\", batching.maximumEvents],\n [\"maximumProcessedBlocks\", batching.maximumProcessedBlocks],\n [\"maximumDelayMs\", batching.maximumDelayMs],\n ] as const) {\n if (value !== undefined) {\n query.set(field, String(assertPositiveInteger(value, `batching.${field}`)));\n }\n }\n return query.size === 0 ? path : `${path}?${query}`;\n}\n\nfunction liveConsumerPath(\n processor: string,\n consumer: string,\n operation: \"ack\" | \"lease\" | \"stream\",\n): string {\n return (\n `v1/processors/${encodeURIComponent(assertIdentity(processor, \"processor\"))}` +\n `/streams/live/consumers/${encodeURIComponent(assertIdentity(consumer, \"consumer\"))}/${operation}`\n );\n}\n\nfunction assertBlock(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 assertUpperBound(\n value: number | \"finalized\",\n field: string,\n): number | \"finalized\" {\n return value === \"finalized\" ? value : assertBlock(value, field);\n}\n\nfunction assertPositiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${field} must be a positive safe integer`);\n }\n return value;\n}\n\nfunction assertIdentity(value: string, field: string): string {\n if (!value.trim()) {\n throw new TypeError(`${field} must not be empty`);\n }\n return value;\n}\n\nfunction assertRatio(value: number, field: string): number {\n if (!Number.isFinite(value) || value <= 0 || value >= 1) {\n throw new TypeError(`${field} must be greater than zero and less than one`);\n }\n return value;\n}\n"]}
|
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.
|
|
3
|
+
export declare const SDK_VERSION: "0.1.0-rc.4";
|
|
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";
|
|
@@ -380,7 +380,10 @@ export interface ChangeMetadata {
|
|
|
380
380
|
export interface LiveGapChangeData {
|
|
381
381
|
fromBlock: number;
|
|
382
382
|
toBlock: number;
|
|
383
|
-
/**
|
|
383
|
+
/**
|
|
384
|
+
* Leani did not fill the range: the processor's history is on demand, and a
|
|
385
|
+
* `live_gap_fill` limit, if it has one, did not cover or complete it.
|
|
386
|
+
*/
|
|
384
387
|
reason: "not_filled";
|
|
385
388
|
}
|
|
386
389
|
/** System transitions never pretend to contain a processor entity payload. */
|
|
@@ -404,10 +407,12 @@ export type ChangeEnvelope<T = unknown> = ChangeMetadata & ({
|
|
|
404
407
|
};
|
|
405
408
|
});
|
|
406
409
|
/**
|
|
407
|
-
* Whether `change` announces blocks the live lane skipped
|
|
408
|
-
* restart at a later finalized anchor.
|
|
409
|
-
*
|
|
410
|
-
*
|
|
410
|
+
* Whether `change` announces blocks the live lane skipped and did not fill,
|
|
411
|
+
* as after a restart at a later finalized anchor. Request them as history,
|
|
412
|
+
* for example with `liveGapBackfill` from `@smart-byte/leani-sdk/backfill`.
|
|
413
|
+
* A processor with `live_gap_fill` can still deliver some of them later as
|
|
414
|
+
* `live_recovery` batches, when it retries a fill after a hold, a crash, or a
|
|
415
|
+
* restart of its live lane, so write them idempotently.
|
|
411
416
|
*/
|
|
412
417
|
export declare function isLiveGapChange<T>(change: ChangeEnvelope<T>): change is Extract<ChangeEnvelope<T>, {
|
|
413
418
|
data: LiveGapChangeData;
|
package/dist/index.js
CHANGED
|
@@ -2,16 +2,18 @@ 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.
|
|
5
|
+
export const SDK_VERSION = "0.1.0-rc.4";
|
|
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",
|
|
9
9
|
});
|
|
10
10
|
/**
|
|
11
|
-
* Whether `change` announces blocks the live lane skipped
|
|
12
|
-
* restart at a later finalized anchor.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Whether `change` announces blocks the live lane skipped and did not fill,
|
|
12
|
+
* as after a restart at a later finalized anchor. Request them as history,
|
|
13
|
+
* for example with `liveGapBackfill` from `@smart-byte/leani-sdk/backfill`.
|
|
14
|
+
* A processor with `live_gap_fill` can still deliver some of them later as
|
|
15
|
+
* `live_recovery` batches, when it retries a fill after a hold, a crash, or a
|
|
16
|
+
* restart of its live lane, so write them idempotently.
|
|
15
17
|
*/
|
|
16
18
|
export function isLiveGapChange(change) {
|
|
17
19
|
return change.operation === "finalized" && change.kind === "system.live_gap.put";
|