@smart-byte/leani-sdk 0.1.0-rc.2 → 0.1.0-rc.3
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 +2 -1
- package/dist/backfill.d.ts +24 -1
- package/dist/backfill.js +18 -1
- package/dist/backfill.js.map +1 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/openapi.generated.d.ts +150 -5
- package/dist/openapi.generated.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -68,7 +68,8 @@ JSON body send `x-leani-request: 1`, which the node requires.
|
|
|
68
68
|
Typed subscriptions accept a configured `processor` instance when a kind is
|
|
69
69
|
ambiguous. `blobs.subscribe()` yields a `{ block, transactions }` payload on
|
|
70
70
|
apply. Check `operation` before reading processor data: a finalized event has
|
|
71
|
-
`{ throughBlock }` instead
|
|
71
|
+
`{ throughBlock }` instead, or, when `isLiveGapChange()` holds, the
|
|
72
|
+
`{ fromBlock, toBlock }` the live lane skipped. Pass an `AbortSignal` to stop an idle stream;
|
|
72
73
|
leaving the loop cancels its response body.
|
|
73
74
|
|
|
74
75
|
`queryAndFollow()` returns the first snapshot page and an atomic stream boundary.
|
package/dist/backfill.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { LeaniError, TransportError } from "./errors.ts";
|
|
2
|
-
import type { ChangeEnvelope, DurableConsumer, FetchLike, ProcessorSummary } from "./index.ts";
|
|
2
|
+
import type { ChangeEnvelope, DurableConsumer, FetchLike, ProcessorCoverage, ProcessorSummary } from "./index.ts";
|
|
3
3
|
export type BackfillExecutionMode = "fill_missing" | "recompute";
|
|
4
4
|
export type BackfillState = "waiting_for_consumer" | "queued" | "running" | "backpressured" | "storage_backpressured" | "draining" | "complete_reclaimable" | "completed" | "failed" | "cancelled";
|
|
5
5
|
export interface BackfillRange {
|
|
@@ -87,6 +87,16 @@ export type CreateBackfillSubscription = CreateBackfillSubscriptionBase & ({
|
|
|
87
87
|
fromBlock?: never;
|
|
88
88
|
toBlock?: never;
|
|
89
89
|
});
|
|
90
|
+
/**
|
|
91
|
+
* The `fill_missing` subscription for the blocks a live gap notice
|
|
92
|
+
* announces, its `LiveGapChangeData`, or any other range the destination
|
|
93
|
+
* lacks. Its idempotency key derives from the consumer and the range, so
|
|
94
|
+
* creating it again, as after the notice is delivered again, returns the
|
|
95
|
+
* same subscription.
|
|
96
|
+
*/
|
|
97
|
+
export declare function liveGapBackfill(range: BackfillRange, request: Omit<CreateBackfillSubscriptionBase, "mode" | "idempotencyKey"> & {
|
|
98
|
+
consumer: NonNullable<CreateBackfillSubscriptionBase["consumer"]>;
|
|
99
|
+
}): CreateBackfillSubscription;
|
|
90
100
|
export interface BackfillStreamHello {
|
|
91
101
|
type: "hello";
|
|
92
102
|
apiVersion: "1";
|
|
@@ -172,6 +182,9 @@ export interface LiveStreamHello {
|
|
|
172
182
|
heartbeatIntervalMs: string;
|
|
173
183
|
sessionExpiresAtUnixMs: string;
|
|
174
184
|
leaseTtlMs: string;
|
|
185
|
+
/** What the processor covers as the session starts: diff it against the
|
|
186
|
+
* destination to find blocks to request as history. */
|
|
187
|
+
coverage: ProcessorCoverage;
|
|
175
188
|
}
|
|
176
189
|
export interface LiveStreamBatch<T = unknown> {
|
|
177
190
|
type: "batch";
|
|
@@ -285,8 +298,18 @@ export interface BackfillSubscriptionClient {
|
|
|
285
298
|
cancel(subscription: string, options?: {
|
|
286
299
|
signal?: AbortSignal;
|
|
287
300
|
}): Promise<BackfillStatus>;
|
|
301
|
+
/** Re-queue a failed subscription to resume from its committed progress. */
|
|
302
|
+
retry(subscription: string, options?: {
|
|
303
|
+
signal?: AbortSignal;
|
|
304
|
+
}): Promise<BackfillStatus>;
|
|
305
|
+
/**
|
|
306
|
+
* Delete a terminal subscription. A failed or cancelled one is refused
|
|
307
|
+
* while its required consumer has unacknowledged records, unless
|
|
308
|
+
* `discardUnacknowledged` is set.
|
|
309
|
+
*/
|
|
288
310
|
delete(subscription: string, options?: {
|
|
289
311
|
signal?: AbortSignal;
|
|
312
|
+
discardUnacknowledged?: boolean;
|
|
290
313
|
}): Promise<HistoricalWorkDeletion>;
|
|
291
314
|
changes<T = unknown>(subscription: string, consumer: string, options?: {
|
|
292
315
|
credential?: string;
|
package/dist/backfill.js
CHANGED
|
@@ -30,6 +30,22 @@ const BACKFILL_BATCHING_PROFILES = {
|
|
|
30
30
|
export function backfillBatchingProfile(profile) {
|
|
31
31
|
return { ...BACKFILL_BATCHING_PROFILES[profile] };
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* The `fill_missing` subscription for the blocks a live gap notice
|
|
35
|
+
* announces, its `LiveGapChangeData`, or any other range the destination
|
|
36
|
+
* lacks. Its idempotency key derives from the consumer and the range, so
|
|
37
|
+
* creating it again, as after the notice is delivered again, returns the
|
|
38
|
+
* same subscription.
|
|
39
|
+
*/
|
|
40
|
+
export function liveGapBackfill(range, request) {
|
|
41
|
+
return {
|
|
42
|
+
...request,
|
|
43
|
+
mode: "fill_missing",
|
|
44
|
+
fromBlock: range.fromBlock,
|
|
45
|
+
toBlock: range.toBlock,
|
|
46
|
+
idempotencyKey: `live-gap:${request.consumer.id}:${range.fromBlock}-${range.toBlock}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
33
49
|
export class BackfillStreamError extends Error {
|
|
34
50
|
code;
|
|
35
51
|
earliestAvailableSequence;
|
|
@@ -129,7 +145,8 @@ export function createBackfillSubscriptionClient(options) {
|
|
|
129
145
|
},
|
|
130
146
|
inspect: (subscription, inspectOptions) => requestJson("GET", `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, "subscription"))}`, undefined, inspectOptions?.signal),
|
|
131
147
|
cancel: (subscription, cancelOptions) => requestJson("POST", `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, "subscription"))}/cancel`, undefined, cancelOptions?.signal),
|
|
132
|
-
|
|
148
|
+
retry: (subscription, retryOptions) => requestJson("POST", `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, "subscription"))}/retry`, undefined, retryOptions?.signal),
|
|
149
|
+
delete: (subscription, deleteOptions) => requestJson("DELETE", `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, "subscription"))}${deleteOptions?.discardUnacknowledged ? "?discardUnacknowledged=true" : ""}`, undefined, deleteOptions?.signal),
|
|
133
150
|
changes: (subscription, consumer, changeOptions = {}) => {
|
|
134
151
|
const path = consumerPath(subscription, consumer, "changes");
|
|
135
152
|
const query = changeOptions.limit === undefined
|
package/dist/backfill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOzD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAyExB,MAAM,0BAA0B,GAG5B;IACF,OAAO,EAAE;QACP,kBAAkB,EAAE,GAAG,GAAG,IAAI;QAC9B,mBAAmB,EAAE,IAAI,GAAG,IAAI;QAChC,aAAa,EAAE,KAAK;QACpB,sBAAsB,EAAE,GAAG;QAC3B,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,MAAM;KACpB;IACD,QAAQ,EAAE;QACR,kBAAkB,EAAE,IAAI,GAAG,IAAI;QAC/B,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;QACpC,aAAa,EAAE,MAAM;QACrB,sBAAsB,EAAE,KAAK;QAC7B,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,MAAM;KACpB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;QACnC,mBAAmB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;QACrC,aAAa,EAAE,MAAM;QACrB,sBAAsB,EAAE,KAAK;QAC7B,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,MAAM;KACpB;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,OAAgC;IAEhC,OAAO,EAAE,GAAG,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;AACpD,CAAC;AAsQD,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,CAAS;IACb,yBAAyB,CAAgB;IACzC,uBAAuB,CAAgB;IAEhD,YAAY,MAAmD;QAC7D,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YACP,MAAM,CAAC,IAAI,KAAK,gBAAgB;gBAC9B,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,qBAAqB,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,yBAAyB,CAAC;QAClE,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;IAChE,CAAC;CACF;AAkDD,MAAM,UAAU,gCAAgC,CAC9C,OAA0C;IAE1C,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,KAAK,EACvB,MAAiC,EACjC,IAAY,EACZ,IAAa,EACb,MAA+B,EAC/B,UAAmB,EACnB,YAAqB,EACT,EAAE;QACd,MAAM,OAAO,GAAG,cAAc,CAC5B,OAAO,CAAC,KAAK,EACb,kBAAkB,EAClB,UAAU,EACV,YAAY,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YAClE,MAAM;YACN,OAAO,EACL,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS;gBACpC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC/B,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC3D,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;SACxC,EAAE,MAAM,CAAC,CAAC;QACX,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,QAAQ,CAAI,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO;QACP,MAAM,EAAE,CAAC,OAAmC,EAAE,EAAE,CAC9C,WAAW,CACT,MAAM,EACN,iCAAiC,EACjC;YACE,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;gBAC9B,CAAC,CAAC;oBACE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;oBACtD,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;iBACtD;gBACH,CAAC,CAAC;oBACE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC5C,SAAS,EAAE,WAAW,CACpB,KAAK,CAAC,SAAS,EACf,UAAU,KAAK,aAAa,CAC7B;wBACD,OAAO,EAAE,gBAAgB,CACvB,KAAK,CAAC,OAAO,EACb,UAAU,KAAK,WAAW,CAC3B;qBACF,CAAC,CAAC;iBACJ,CAAC;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,cAAc;YACpC,QAAQ,EACN,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAC5B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;oBACtD,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;oBAC3B,eAAe,EAAE,qBAAqB,CACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAChC,0BAA0B,CAC3B;oBACD,UAAU,EACR,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS;wBACvC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,cAAc,CACZ,OAAO,CAAC,QAAQ,CAAC,UAAU,EAC3B,qBAAqB,CACtB;iBACR;YACP,MAAM,EACJ,OAAO,CAAC,MAAM,KAAK,SAAS;gBAC1B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,uBAAuB,EAAE,qBAAqB,CAC5C,OAAO,CAAC,MAAM,CAAC,uBAAuB,EACtC,gCAAgC,CACjC;oBACD,sBAAsB,EAAE,qBAAqB,CAC3C,OAAO,CAAC,MAAM,CAAC,sBAAsB,EACrC,+BAA+B,CAChC;oBACD,gBAAgB,EAAE,WAAW,CAC3B,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAC/B,yBAAyB,CAC1B;iBACF;YACP,QAAQ,EACN,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAC5B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,kBAAkB,EAChB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,KAAK,SAAS;wBAC/C,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,qBAAqB,CACnB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EACnC,6BAA6B,CAC9B;oBACP,mBAAmB,EACjB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,KAAK,SAAS;wBAChD,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,qBAAqB,CACnB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EACpC,8BAA8B,CAC/B;oBACP,aAAa,EACX,OAAO,CAAC,QAAQ,CAAC,aAAa,KAAK,SAAS;wBAC1C,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,qBAAqB,CACnB,OAAO,CAAC,QAAQ,CAAC,aAAa,EAC9B,wBAAwB,CACzB;oBACP,sBAAsB,EACpB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,KAAK,SAAS;wBACnD,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,qBAAqB,CACnB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,EACvC,iCAAiC,CAClC;oBACP,cAAc,EACZ,OAAO,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS;wBAC3C,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,qBAAqB,CACnB,OAAO,CAAC,QAAQ,CAAC,cAAc,EAC/B,yBAAyB,CAC1B;oBACP,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW;iBAC1C;YACP,cAAc,EAAE,cAAc,CAC5B,OAAO,CAAC,cAAc,EACtB,gBAAgB,CACjB;SACF,EACD,OAAO,CAAC,MAAM,CACf;QACH,IAAI,EAAE,KAAK,EAAE,WAAsC,EAAE,EAAE;YACrD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,KAAK,EACL,iCAAiC,EACjC,SAAS,EACT,WAAW,EAAE,MAAM,CACpB,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,CACP,YAAoB,EACpB,cAAyC,EACzC,EAAE,CACF,WAAW,CACT,KAAK,EACL,mCAAmC,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,EACrG,SAAS,EACT,cAAc,EAAE,MAAM,CACvB;QACH,MAAM,EAAE,CACN,YAAoB,EACpB,aAAwC,EACxC,EAAE,CACF,WAAW,CACT,MAAM,EACN,mCAAmC,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,SAAS,EAC5G,SAAS,EACT,aAAa,EAAE,MAAM,CACtB;QACH,MAAM,EAAE,CACN,YAAoB,EACpB,aAAwC,EACxC,EAAE,CACF,WAAW,CACT,QAAQ,EACR,mCAAmC,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,EACrG,SAAS,EACT,aAAa,EAAE,MAAM,CACtB;QACH,OAAO,EAAE,CACP,YAAoB,EACpB,QAAgB,EAChB,aAAa,GAIT,EAAE,EACN,EAAE;YACF,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,KAAK,GACT,aAAa,CAAC,KAAK,KAAK,SAAS;gBAC/B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,UAAU,qBAAqB,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YACtE,OAAO,WAAW,CAKhB,KAAK,EACL,GAAG,IAAI,GAAG,KAAK,EAAE,EACjB,SAAS,EACT,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,UAAU,CACzB,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CACN,YAAoB,EACpB,QAAgB,EAChB,aAAa,GAIT,EAAE,EACN,EAAE,CACF,kBAAkB,CAChB,SAAS,EACT,OAAO,EACP,OAAO,CAAC,KAAK,EACb,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,MAAM,CACrB;QACH,UAAU,EAAE,CACV,SAAiB,EACjB,QAAgB,EAChB,aAAa,GAAkD,EAAE,EACjE,EAAE,CACF,cAAc,CACZ,SAAS,EACT,OAAO,EACP,OAAO,CAAC,KAAK,EACb,SAAS,EACT,SAAS,EACT,QAAQ,EACR,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,MAAM,CACrB;QACH,SAAS,EAAE,CAAI,OAAqC,EAAE,EAAE,CACtD,qBAAqB,CACnB,SAAS,EACT,OAAO,EACP,OAAO,CAAC,KAAK,EACb,SAAS,EACT,OAAO,CACR;KACJ,CAAC,CAAC;AACL,CAAC;AAeD,KAAK,UAAU,qBAAqB,CAClC,SAAoB,EACpB,OAAY,EACZ,KAAyB,EACzB,SAAiB,EACjB,OAAqC;IAErC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,CAC3D,cAAc,CAAC,cAAc,EAAE,iBAAiB,KAAK,kBAAkB,CAAC,CACzE,CAAC;IACF,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC;IAC7C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CACvC,cAAc,CACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACR,OAAO,CAAC,UAAU,EAClB,MAAM,CACP,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,cAAc,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CACvC,kBAAkB,CAChB,SAAS,EACT,OAAO,EACP,KAAK,EACL,SAAS,EACT,cAAc,EACd,QAAQ,EACR,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,EAChB,MAAM,CACP,CAAC;YACJ,KAAK,CAAC,IAAI,CACR,kBAAkB,CAChB,cAAc,EACd,MAAM,IAAI,EAAE,EACZ,IAAI,EACJ,OAAO,CAAC,MAAM,CACf,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IACE,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,KAAK,WAAW,CAAC,EAC3D,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,SAAS,CACjB,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,QAA0B,EAAQ,EAAE;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC,iBAAiB,SAAS,CAAC,QAAQ,4BAA4B,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,QAAwB,EAA0C,EAAE,CACnF,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,KAAK;SACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CACtC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC7B,MAAM,IAAI,SAAS,CACjB,oEAAoE,CACrE,CAAC;YACJ,CAAC;YACD,OAAO,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC7B,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,cAAc,EAAE,CAAC,cAAsB,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC7B,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,EAAE,GAAG,cAAc,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,SAAS,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,WAAW,EAAE,CACX,KAA8B,EAC9B,kBAA6C,EAC7C,EAAE;YACF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1E,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAC1B,CAAC,OAAO,EAAoC,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAC7E,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,CAAC,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACtB,cAAsC,EACtC,IAA+D,EAC/D,MAA+B;IAE/B,MAAM,UAAU,GAAG,0BAA0B,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ;QACvC,gBAAgB,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB;QACjE,KAAK,CAAC,IAAI;YACR,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBACvD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;oBAAE,SAAS;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC1B,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE;wBACL,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,MAAM;wBACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,SAAS,EAAE,MAAM,CAAC,qBAAqB;wBACvC,MAAM,EAAE,MAAM,CAAC,OAAO;wBACtB,MAAM;qBACP;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,cAAsB,EACtB,cAA0C,EAC1C,IAAmE,EACnE,MAA+B;IAE/B,MAAM,UAAU,GAAG,0BAA0B,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,QAAQ;QACvC,gBAAgB,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB;QACjE,KAAK,CAAC,IAAI;YACR,IAAI,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACtD,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBACvD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;oBAAE,SAAS;gBAC9C,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC;gBACnD,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,oBAAoB,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,oBAAoB,CAC3B,MAAc,EACd,MAAyD;IAEzD,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,MAAM;YACxB,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,MAAM;YAClB,MAAM;SACP,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,qBAAqB;QACvC,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,MAAM;KACP,CAAC;AACJ,CAAC;AAWD,SAAS,0BAA0B,CAQjC,cAAgD,EAChD,IAAyE,EACzE,MAA+B;IAE/B,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,eAAe,GAAG,MAAM;QAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChB,IAAI,OAAO,GAAG,cAAc,CAAC;IAC7B,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAC/C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,aAAwC,CAAC;IAE7C,MAAM,SAAS,GAAG,GAAkB,EAAE;QACpC,aAAa,KAAK,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC;oBAChD,IAAI,CAAC;wBACH,wBAAwB,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;oBACxD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;wBACjD,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,OAAO,GAAG,WAAW,CAAC;oBACtB,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBACvD,MAAM,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;oBACtD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,MAAM,eAAe,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,IAAsC,EAAE;QACxD,OAAO,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI;oBAAE,OAAO,MAAM,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YACzD,CAAC;YACD,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EACvB,MAAc,EACd,OAAkC,EACR,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YACvD,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,sEAAsE;YACtE,6BAA6B;YAC7B,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC5C,IAAI,CAAC,eAAe,CAAC,OAAO;oBAAE,MAAM,KAAK,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAM/B,QAAgB,EAAE,WAAmB;IACrC,IACE,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;QAC1C,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU;QAC9C,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,SAAS,CAAC,EAAE;QAClD,WAAW,CAAC,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC,SAAS,CAAC,OAAO;QAC5D,WAAW,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,SAAS,CAAC,QAAQ;QAC9D,WAAW,CAAC,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,SAAS,CAAC,UAAU;QAClE,WAAW,CAAC,SAAS,CAAC,gBAAgB;YACpC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EACrC,CAAC;QACD,MAAM,mBAAmB,CACvB,MAAM,EACN,0DAA0D,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,6BAA6B,CAAC,KAAc;IACnD,OAAO,CACL,KAAK,YAAY,UAAU;QAC3B,CAAC,KAAK,CAAC,SAAS;YACd,KAAK,CAAC,IAAI,KAAK,yBAAyB;YACxC,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAe,EACf,MAAmB;IAEnB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAuB,EACvB,KAAwC;IAExC,OAAO;QACL,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAIpB,CAAC;YACJ,IAAI,IAA8B,CAAC;YACnC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;gBACvC,KAAK,CAAC,KAAK,CAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CACvB,CAAC,MAAM,EAAE,EAAE;oBACT,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,IAAI,EAAE,EAAE,CAAC;oBACT,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;oBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,IAAI,EAAE,EAAE,CAAC;oBACT,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC,CACF,CAAC;YACJ,CAAC,CAAC;YACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;gBAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtE,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;wBAClC,IAAI,GAAG,OAAO,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,IAAI,KAAK,MAAM,CACzC,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;gBACvB,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACxE,IAAI,OAAO,IAAI,OAAO;oBAAE,MAAM,OAAO,CAAC,KAAK,CAAC;gBAC5C,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC;gBAChE,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAM,CAAC,CAAC;oBACjB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,SAAoB,EACpB,OAAY,EACZ,KAAyB,EACzB,SAAiB,EACjB,YAAoB,EACpB,QAAgB,EAChB,UAA8B,EAC9B,QAA6C,EAC7C,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAIvC,SAAS,EACT,OAAO,EACP,KAAK,EACL,SAAS,EACT,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACpD,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,EAC3C,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC7C,UAAU,EACV,MAAM,EACN,UAAU,CACX,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,SAAS,CAAC;QAC7B,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,eAAe,GAAG,KAAK,SAAS,CAAC;QAGrC,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,MAAM,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,SAAS,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE,CAAC;YACpC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QAC9C,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,OAAO;QACP,eAAe;QACf,MAAM;QACN,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;KACpE,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,SAAoB,EACpB,OAAY,EACZ,KAAyB,EACzB,SAAiB,EACjB,SAAiB,EACjB,QAAgB,EAChB,UAA8B,EAC9B,MAA+B;IAE/B,OAAO,mBAAmB,CACxB,SAAS,EACT,OAAO,EACP,KAAK,EACL,SAAS,EACT,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/C,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,EAC5C,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,UAAU,EACV,MAAM,EACN,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,SAAoB,EACpB,OAAY,EACZ,KAAyB,EACzB,SAAiB,EACjB,UAAkB,EAClB,eAAuB,EACvB,SAAiB,EACjB,UAA8B,EAC9B,MAA+B,EAC/B,UAA+B;IAE/B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,uEAAuE;IACvE,0EAA0E;IAC1E,IAAI,OAAgB,CAAC;IACrB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE;QACpC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;QAChB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,cAAc,EAAE,CAAC;IACnB,CAAC;IACD,wEAAwE;IACxE,+DAA+D;IAC/D,IAAI,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,CAC1C,IAAI,CACF,IAAI,cAAc,CAChB,GAAG,UAAU,gCAAgC,SAAS,KAAK,CAC5D,CACF,CAAC,CAAC;IACL,IAAI,OAA4C,CAAC;IACjD,IAAI,SAAuD,CAAC;IAC5D,IAAI,YAAoB,CAAC;IACzB,IAAI,UAAkB,CAAC;IACvB,IAAI,mBAA2B,CAAC;IAChC,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;YACxE,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,sBAAsB,EAAE,UAAU,CAAC;YAClE,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,EAAE,MAAM,CAAC,CAAC;QACX,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,mBAAmB,CAAC;gBAC5B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,GAAG,UAAU,8BAA8B;gBACpD,yBAAyB,EAAE,IAAI;gBAC/B,uBAAuB,EAAE,IAAI;aAC9B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,mBAAmB,CAAC,UAAU,EAAE,sCAAsC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,SAAS,GAAI,KAAK,CAAC,KAA4B,CAAC,IAAI,CAAC;QAC3D,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;YAC5D,MAAM,IAAI,mBAAmB,CAC3B,KAAK,CAAC,KAAoD,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,mBAAmB,CAAC,UAAU,EAAE,kCAAkC,CAAC,CAAC;QAC5E,CAAC;QACD,SAAS,GAAG,KAAK,CAAC,KAAqD,CAAC;QACxE,YAAY,GAAG,cAAc,CAC3B,SAAS,CAAC,YAAY,EACtB,2BAA2B,CAC5B,CAAC;QACF,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACpE,mBAAmB,GAAG,kBAAkB,CACtC,SAAS,CAAC,mBAAmB,EAC7B,qBAAqB,CACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,OAAO,IAAI,KAAK,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG,CAAC,GAAG,mBAAmB,CAAC;IACvC,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,CACnC,IAAI,CACF,IAAI,cAAc,CAAC,GAAG,UAAU,4BAA4B,MAAM,KAAK,CAAC,CACzE,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,wBAAwB,CAC1C,SAAS,EACT,OAAO,EACP,KAAK,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,UAAU,EACV,OAAO,CAAC,MAAM,CACf,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACzB,wEAAwE;QACxE,4CAA4C;QAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAoC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAkB,EAAE;QAChC,SAAS,KAAK,CAAC,KAAK,IAAI,EAAE;YACxB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,MAAM,WAAW,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;oBACvE,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,gBAAgB,CACvB,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,CAAC,CACpE;oBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;iBACvC,EAAE,SAAS,CAAC,CAAC;gBACd,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,mEAAmE;gBACnE,sEAAsE;YACxE,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,SAAS,CAAC;QAC7B,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACtE,CAAC;QACD,eAAe,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,IAA6B,CAAC;gBAClC,mEAAmE;gBACnE,sBAAsB;gBACtB,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,4DAA4D;oBAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACvD,OAAO;oBACT,CAAC;oBACD,MAAM,OAAO,IAAI,KAAK,CAAC;gBACzB,CAAC;wBAAS,CAAC;oBACT,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,CAAC;gBACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,MAAM,OAAO,CAAC;gBAChB,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAGG,CAAC;gBACxB,MAAM,UAAU,GAAI,MAA6B,CAAC,IAAI,CAAC;gBACvD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC9D,MAAM,IAAI,mBAAmB,CAC3B,MAAqD,CACtD,CAAC;gBACJ,CAAC;gBACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,MAAM,mBAAmB,CAAC,UAAU,EAAE,mCAAmC,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,MAAiB,CAAC;YAC1B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,WAAgC;QACvC,WAAW,EAAE,KAAK,EAChB,MAAc,EACd,kBAA6C,EACnB,EAAE;YAC5B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,kBAAkB,EAAE,MAAM,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAC5B,SAAS,EACT,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,EACtC;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,cAAc,CACrB,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,YAAY,CACb;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;aACxC,EACD,MAAM,CACP,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpB,MAAM,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,QAAQ,CAAkB,WAAW,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,KAAK;QACL,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO;KAChC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,UAA+B,EAC/B,OAAe;IAEf,OAAO,IAAI,mBAAmB,CAAC;QAC7B,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,GAAG,UAAU,IAAI,OAAO,EAAE;QACnC,yBAAyB,EAAE,IAAI;QAC/B,uBAAuB,EAAE,IAAI;KAC9B,CAAC,CAAC;AACL,CAAC;AASD,KAAK,UAAU,wBAAwB,CACrC,SAAoB,EACpB,OAAY,EACZ,KAAyB,EACzB,SAAiB,EACjB,SAAiB,EACjB,UAA8B,EAC9B,YAAoB,EACpB,UAAkB,EAClB,IAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/D,0EAA0E;IAC1E,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,UAAU,CAAC;IACzB,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gBAAgB,CACvB,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,CAAC,CACpE;gBACD,sDAAsD;gBACtD,MAAM,EAAE,YAAY,CAClB,IAAI,EACJ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAC1D;aACF,EAAE,IAAI,CAAC,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC/B,SAAS,GAAG,WAAW,CAAC;YACxB,OAAO,GAAG,UAAU,CAAC;YACrB,OAAO,GAAG,YAAY,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kEAAkE;YAClE,MAAM,SAAS,GAAG,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC;YACjE,IACE,IAAI,CAAC,OAAO;gBACZ,CAAC,SAAS;gBACV,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,OAAO,EACrD,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,GAAG,OAAO,CAAC;YAClB,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,MAAmB;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAChC,IAAgC,EAChC,MAAoB;IAEpB,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,aAAa,CAC3B,IAAgC,EAChC,MAA+B,EAC/B,OAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,uDAAuD;IACvD,IAAI,OAAO,GAAiB,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,OAAO,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;gBACzD,MAAM,oBAAoB,EAAE,CAAC;YAC/B,CAAC;YACD,MAAM,IAAI,GAAG,OAAO;iBACjB,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;iBAChD,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,CAAC,CAAC;YACjB,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;YACxB,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YACpC,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC;YAC5B,IAAI,YAAY,GAAG,uBAAuB,EAAE,CAAC;gBAC3C,MAAM,oBAAoB,EAAE,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,OAAO;SACtB,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;SAC5D,IAAI,EAAE,CAAC;IACV,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,IAAI,UAAU,CACnB,yBAAyB,uBAAuB,QAAQ,EACxD,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAmB;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CACrB,KAAyB,EACzB,MAAc,EACd,UAAmB,EACnB,YAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,6BAA6B,EAC7B,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CACzC,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,0BAA0B,EAC1B,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,SAAS,gBAAgB,CAAC,OAAgB;IACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CACnB,YAAoB,EACpB,QAAgB,EAChB,SAAiD;IAEjD,OAAO,CACL,6BAA6B,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE;QAC/F,cAAc,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,SAAS,EAAE,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAoB,EACpB,QAAgB,EAChB,QAA6C;IAE7C,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,oBAAoB,EAAE,QAAQ,CAAC,kBAAkB,CAAC;QACnD,CAAC,qBAAqB,EAAE,QAAQ,CAAC,mBAAmB,CAAC;QACrD,CAAC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC;QACzC,CAAC,wBAAwB,EAAE,QAAQ,CAAC,sBAAsB,CAAC;QAC3D,CAAC,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAC;KACnC,EAAE,CAAC;QACX,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiB,EACjB,QAAgB,EAChB,SAAqC;IAErC,OAAO,CACL,iBAAiB,kBAAkB,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE;QAC7E,2BAA2B,kBAAkB,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,SAAS,EAAE,CACnG,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,sCAAsC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA2B,EAC3B,KAAa;IAEb,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,KAAa;IACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { LeaniError, TransportError, responseError } from \"./errors.ts\";\nexport { LeaniError, TransportError } from \"./errors.ts\";\nimport type {\n ChangeEnvelope,\n DurableConsumer,\n FetchLike,\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\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}\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 delete(\n subscription: string,\n options?: { signal?: AbortSignal },\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 delete: (\n subscription: string,\n deleteOptions?: { signal?: AbortSignal },\n ) =>\n requestJson<HistoricalWorkDeletion>(\n \"DELETE\",\n `admin/v1/backfill-subscriptions/${encodeURIComponent(assertIdentity(subscription, \"subscription\"))}`,\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 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"]}
|
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.3";
|
|
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";
|
|
@@ -376,6 +376,13 @@ export interface ChangeMetadata {
|
|
|
376
376
|
/** RFC 3339 UTC emission time with millisecond precision. */
|
|
377
377
|
emittedAt: string;
|
|
378
378
|
}
|
|
379
|
+
/** Blocks the live lane skipped, as a `system.live_gap.put` change announces them. */
|
|
380
|
+
export interface LiveGapChangeData {
|
|
381
|
+
fromBlock: number;
|
|
382
|
+
toBlock: number;
|
|
383
|
+
/** Leani does not fill the range: the processor's history is on demand. */
|
|
384
|
+
reason: "not_filled";
|
|
385
|
+
}
|
|
379
386
|
/** System transitions never pretend to contain a processor entity payload. */
|
|
380
387
|
export type ChangeEnvelope<T = unknown> = ChangeMetadata & ({
|
|
381
388
|
operation: "apply" | "undo";
|
|
@@ -385,6 +392,9 @@ export type ChangeEnvelope<T = unknown> = ChangeMetadata & ({
|
|
|
385
392
|
data: {
|
|
386
393
|
throughBlock: number;
|
|
387
394
|
};
|
|
395
|
+
} | {
|
|
396
|
+
operation: "finalized";
|
|
397
|
+
data: LiveGapChangeData;
|
|
388
398
|
} | {
|
|
389
399
|
operation: "reset_required";
|
|
390
400
|
data: {
|
|
@@ -393,6 +403,15 @@ export type ChangeEnvelope<T = unknown> = ChangeMetadata & ({
|
|
|
393
403
|
action: "query_snapshot_then_resume";
|
|
394
404
|
};
|
|
395
405
|
});
|
|
406
|
+
/**
|
|
407
|
+
* Whether `change` announces blocks the live lane skipped, as after a
|
|
408
|
+
* restart at a later finalized anchor. Nothing else delivers them: request
|
|
409
|
+
* them as history, for example with `liveGapBackfill` from
|
|
410
|
+
* `@smart-byte/leani-sdk/backfill`.
|
|
411
|
+
*/
|
|
412
|
+
export declare function isLiveGapChange<T>(change: ChangeEnvelope<T>): change is Extract<ChangeEnvelope<T>, {
|
|
413
|
+
data: LiveGapChangeData;
|
|
414
|
+
}>;
|
|
396
415
|
export interface LiveLaneReset {
|
|
397
416
|
processor: string;
|
|
398
417
|
state: "paused";
|
package/dist/index.js
CHANGED
|
@@ -2,11 +2,20 @@ 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.3";
|
|
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
|
+
/**
|
|
11
|
+
* Whether `change` announces blocks the live lane skipped, as after a
|
|
12
|
+
* restart at a later finalized anchor. Nothing else delivers them: request
|
|
13
|
+
* them as history, for example with `liveGapBackfill` from
|
|
14
|
+
* `@smart-byte/leani-sdk/backfill`.
|
|
15
|
+
*/
|
|
16
|
+
export function isLiveGapChange(change) {
|
|
17
|
+
return change.operation === "finalized" && change.kind === "system.live_gap.put";
|
|
18
|
+
}
|
|
10
19
|
export class ResetRequiredError extends LeaniError {
|
|
11
20
|
change;
|
|
12
21
|
constructor(change) {
|