@smart-byte/leani-sdk 0.1.0-rc.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Leani contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # `@smart-byte/leani-sdk`
2
+
3
+ Typed queries and resumable live/history delivery for [Leani](https://github.com/smart-byte/leani).
4
+
5
+ ```ts
6
+ import { createLeaniClient } from "@smart-byte/leani-sdk";
7
+
8
+ const leani = createLeaniClient({ baseUrl: "http://127.0.0.1:8080" });
9
+ const status = await leani.status();
10
+ ```
11
+
12
+ Processor status and query responses expose inclusive `available` ranges split
13
+ at coverage gaps and exact finality boundaries. Filter those intervals when
14
+ selecting finalized material: `finalizedThrough` is only the highest covered
15
+ block recorded as finalized, not a guarantee that every lower block is
16
+ finalized or present.
17
+
18
+ Processor-owned query extensions are discoverable through
19
+ `leani.capabilities()`. Call a custom extension through the same authenticated,
20
+ same-origin request path used by the built-in wrappers:
21
+
22
+ ```ts
23
+ interface Summary {
24
+ indexedBlocks: string;
25
+ }
26
+
27
+ const summary = await leani.request<Summary>(
28
+ "v1/processors/my-instance/query/summary",
29
+ );
30
+ ```
31
+
32
+ The client rejects absolute and protocol-relative URLs before attaching a
33
+ bearer token. Prefer the canonical instance-scoped `basePath` from capability
34
+ discovery; short aliases may be absent when several instances share one
35
+ extension.
36
+
37
+ When an alias is absent, pass the discovered canonical path to the typed
38
+ helper instead of giving up its response types:
39
+
40
+ ```ts
41
+ const capabilities = await leani.capabilities();
42
+ const blobs = capabilities.queryExtensions.find(
43
+ (extension) => extension.id === "blobs-v1",
44
+ );
45
+ const scoped = createLeaniClient({
46
+ baseUrl: "http://127.0.0.1:8080",
47
+ queryBasePaths: { blobs: blobs?.basePath },
48
+ });
49
+ ```
50
+
51
+ Historical subscription orchestration and unified live/history iterators are
52
+ available from `@smart-byte/leani-sdk/backfill`. Required consumers should commit the
53
+ application transaction before acknowledging the Leani-owned durable cursor.
54
+ Destination writes must be idempotent because a crash between those steps can
55
+ replay a change.
56
+
57
+ The browser build assumes a same-origin deployment or a reverse proxy that
58
+ adds the application's CORS policy. Leani does not enable cross-origin access
59
+ on its native API by default.
60
+
61
+ Typed subscriptions accept a configured `processor` instance when a kind is
62
+ ambiguous. `blobs.subscribe()` yields a `{ block, transactions }` payload on
63
+ apply. Check `operation` before reading processor data: a finalized event has
64
+ `{ throughBlock }` instead. Pass an `AbortSignal` to stop an idle stream;
65
+ leaving the loop cancels its response body.
66
+
67
+ `queryAndFollow()` returns the first snapshot page and an atomic stream boundary.
68
+ Read every `nextCursor` with `queryEntities()`, release the snapshot in `finally`,
69
+ and then subscribe from `boundaryCursor`. See the executable
70
+ [query/follow example](../../examples/sdk-stream/index.ts) and its
71
+ [setup guide](https://leani.dev/docs/guides/query-then-follow/).
72
+
73
+ When delivery is disabled, `queryEntities()` still returns retained output,
74
+ with `boundaryCursor` and `recovery.follow` set to `null`. `queryAndFollow()`
75
+ requires delivery and otherwise returns HTTP 409 `delivery_disabled`.
76
+
77
+ Both package entry points use `LeaniError` for HTTP failures, including status,
78
+ code, retryability, and request ID. ResetRequiredError is a LeaniError with
79
+ `code: "cursor_expired"`; rebuild application state from a fresh snapshot.
80
+
81
+ ## License
82
+
83
+ [MIT](LICENSE).
@@ -0,0 +1,299 @@
1
+ export { LeaniError } from "./errors.ts";
2
+ import type { ChangeEnvelope, DurableConsumer, FetchLike, ProcessorSummary } from "./index.ts";
3
+ export type BackfillExecutionMode = "fill_missing" | "recompute";
4
+ export type BackfillState = "waiting_for_consumer" | "queued" | "running" | "backpressured" | "storage_backpressured" | "draining" | "complete_reclaimable" | "completed" | "failed" | "cancelled";
5
+ export interface BackfillRange {
6
+ fromBlock: number;
7
+ toBlock: number;
8
+ }
9
+ export interface RequestedBackfillRange {
10
+ fromBlock: number;
11
+ toBlock: number | "finalized";
12
+ }
13
+ export interface BackfillStatus {
14
+ id: string;
15
+ owner: "subscription";
16
+ processor: string;
17
+ deliveryStreamId?: string;
18
+ publicationRevision?: string;
19
+ fromBlock: number;
20
+ toBlock: number;
21
+ ranges: BackfillRange[];
22
+ requestedBlocks: number;
23
+ processedBlocks: number;
24
+ remainingBlocks: number;
25
+ capturedFinalizedTarget?: number;
26
+ mode: BackfillExecutionMode;
27
+ batching?: EffectiveBackfillBatching;
28
+ state: BackfillState;
29
+ attempts: number;
30
+ updatedAtUnixMs: number;
31
+ report: unknown | null;
32
+ lastError: string | null;
33
+ }
34
+ export interface HistoricalWorkDeletion {
35
+ id: string;
36
+ owner: "subscription";
37
+ removedJobs: number;
38
+ removedSubscriptionRanges: number;
39
+ removedConsumers: number;
40
+ removedDeliveryRecords: number;
41
+ removedDeliveryStreams: number;
42
+ removedCoverageIntervals: number;
43
+ removedCoverageSegments: number;
44
+ removedExactCoverage: number;
45
+ removedAppliedBlocks: number;
46
+ removedFinalizedUndo: number;
47
+ retainedProcessorOutput: boolean;
48
+ retainedLiveStream: boolean;
49
+ }
50
+ export type BackfillBatchingRequest = Partial<Omit<EffectiveBackfillBatching, "maximumBufferedBatches" | "maximumBufferedBytes">>;
51
+ export type BackfillBatchingProfile = "latency" | "balanced" | "throughput";
52
+ export declare function backfillBatchingProfile(profile: BackfillBatchingProfile): Required<BackfillBatchingRequest>;
53
+ export interface EffectiveBackfillBatching {
54
+ targetEncodedBytes: number;
55
+ maximumEncodedBytes: number;
56
+ maximumEvents: number;
57
+ maximumProcessedBlocks: number;
58
+ maximumDelayMs: number;
59
+ maximumBufferedBatches: number;
60
+ maximumBufferedBytes: number;
61
+ compression: "none" | "gzip";
62
+ }
63
+ interface CreateBackfillSubscriptionBase {
64
+ processor: string;
65
+ mode?: BackfillExecutionMode;
66
+ consumer?: {
67
+ id: string;
68
+ role: "required";
69
+ leaseTtlSeconds: number;
70
+ credential?: string;
71
+ };
72
+ limits?: {
73
+ maxUnacknowledgedBlocks: number;
74
+ maxUnacknowledgedBytes: number;
75
+ resumeBelowRatio: number;
76
+ };
77
+ batching?: BackfillBatchingRequest;
78
+ idempotencyKey: string;
79
+ signal?: AbortSignal;
80
+ }
81
+ export type CreateBackfillSubscription = CreateBackfillSubscriptionBase & ({
82
+ fromBlock: number;
83
+ toBlock: number | "finalized";
84
+ ranges?: never;
85
+ } | {
86
+ ranges: RequestedBackfillRange[];
87
+ fromBlock?: never;
88
+ toBlock?: never;
89
+ });
90
+ export interface BackfillStreamHello {
91
+ type: "hello";
92
+ apiVersion: "1";
93
+ chainId: number;
94
+ processor: ProcessorSummary;
95
+ subscriptionId: string;
96
+ streamId: string;
97
+ streamKind: "backfill";
98
+ publicationRevision: string;
99
+ ranges: BackfillRange[];
100
+ acknowledgedCursor: string;
101
+ storeEpoch: string;
102
+ heartbeatIntervalMs: string;
103
+ sessionExpiresAtUnixMs: string;
104
+ leaseTtlMs: string;
105
+ }
106
+ export interface BackfillStreamBatch<T = unknown> {
107
+ type: "batch";
108
+ streamId: string;
109
+ originKind: "historical_backfill" | "recompute";
110
+ originId: string;
111
+ publicationRevision: string;
112
+ fromBlock: number;
113
+ throughBlock: number;
114
+ processedBlockCount: string;
115
+ domainChangeCount: string;
116
+ progressUnitCount: string;
117
+ rawPayloadBytes: string;
118
+ uncompressedEncodedBytes: string;
119
+ transmittedBytes: string;
120
+ buildDelayMs: string;
121
+ firstCursor: string | null;
122
+ lastCursor: string | null;
123
+ acknowledgeableCursor: string;
124
+ changes: ChangeEnvelope<T>[];
125
+ }
126
+ export interface BackfillStreamCompletion {
127
+ type: "backfill_complete";
128
+ subscriptionId: string;
129
+ streamId: string;
130
+ ranges: BackfillRange[];
131
+ throughBlock: number;
132
+ cursor: string;
133
+ mode: BackfillExecutionMode;
134
+ disposition: "published_all" | "published_missing_only" | "already_covered_noop";
135
+ requestedBlockCount: string;
136
+ coveredBeforeRequestBlockCount: string;
137
+ coveredBeforeRequestRanges: BackfillRange[];
138
+ newlyProcessedBlockCount: string;
139
+ republishedBlockCount: string;
140
+ domainChangeCount: string;
141
+ preexistingCoverageSkipped: boolean;
142
+ repairHint?: "recompute";
143
+ }
144
+ export interface BackfillStreamHeartbeat {
145
+ type: "heartbeat";
146
+ emittedAt: string;
147
+ }
148
+ export interface BackfillStreamReset {
149
+ type: "reset_required";
150
+ code: "reset_required";
151
+ message: string;
152
+ earliestAvailableSequence: string | null;
153
+ latestAvailableSequence: string | null;
154
+ }
155
+ export interface BackfillStreamFailure {
156
+ type: "error";
157
+ code: string;
158
+ message: string;
159
+ earliestAvailableSequence: string | null;
160
+ latestAvailableSequence: string | null;
161
+ }
162
+ export type BackfillStreamRecord<T = unknown> = BackfillStreamBatch<T> | BackfillStreamCompletion | BackfillStreamHeartbeat;
163
+ export interface LiveStreamHello {
164
+ type: "hello";
165
+ apiVersion: "1";
166
+ chainId: number;
167
+ processor: ProcessorSummary;
168
+ streamId: string;
169
+ streamKind: "live";
170
+ acknowledgedCursor: string;
171
+ storeEpoch: string;
172
+ heartbeatIntervalMs: string;
173
+ sessionExpiresAtUnixMs: string;
174
+ leaseTtlMs: string;
175
+ }
176
+ export interface LiveStreamBatch<T = unknown> {
177
+ type: "batch";
178
+ streamId: string;
179
+ originKind: "live" | "live_recovery";
180
+ originId: string;
181
+ publicationRevision: "0";
182
+ fromBlock: number;
183
+ throughBlock: number;
184
+ processedBlockCount: "1";
185
+ domainChangeCount: string;
186
+ progressUnitCount: "1";
187
+ rawPayloadBytes: string;
188
+ uncompressedEncodedBytes: string;
189
+ transmittedBytes: string;
190
+ buildDelayMs: string;
191
+ firstCursor: string;
192
+ lastCursor: string;
193
+ acknowledgeableCursor: string;
194
+ changes: ChangeEnvelope<T>[];
195
+ }
196
+ export type LiveStreamRecord<T = unknown> = LiveStreamBatch<T> | BackfillStreamHeartbeat;
197
+ export interface DeliverySession<THello, TRecord> extends AsyncIterable<TRecord> {
198
+ readonly hello: THello;
199
+ acknowledge(cursor: string, options?: {
200
+ signal?: AbortSignal;
201
+ }): Promise<DurableConsumer>;
202
+ close(): Promise<void>;
203
+ }
204
+ export interface BackfillDeliverySession<T = unknown> extends DeliverySession<BackfillStreamHello, BackfillStreamRecord<T>> {
205
+ batches(): AsyncIterable<BackfillStreamBatch<T>>;
206
+ events(): AsyncIterable<ChangeEnvelope<T>>;
207
+ }
208
+ export type LiveDeliverySession<T = unknown> = DeliverySession<LiveStreamHello, LiveStreamRecord<T>>;
209
+ export interface MultiLaneSubscriptionRequest {
210
+ processor: string;
211
+ consumer: string;
212
+ credential?: string;
213
+ lanes: {
214
+ live?: boolean;
215
+ history?: Array<{
216
+ subscriptionId: string;
217
+ }>;
218
+ };
219
+ view?: "live_priority" | "lane_specific";
220
+ batching?: BackfillBatchingRequest;
221
+ signal?: AbortSignal;
222
+ }
223
+ export type UnifiedDeliveryBatch<T = unknown> = {
224
+ laneKind: "live";
225
+ laneId: "live";
226
+ streamId: string;
227
+ ackCursor: string;
228
+ events: ChangeEnvelope<T>[];
229
+ completion?: never;
230
+ record: LiveStreamBatch<T>;
231
+ } | {
232
+ laneKind: "history";
233
+ laneId: string;
234
+ streamId: string;
235
+ ackCursor: string;
236
+ events: ChangeEnvelope<T>[];
237
+ completion?: BackfillStreamCompletion;
238
+ record: BackfillStreamBatch<T> | BackfillStreamCompletion;
239
+ };
240
+ export interface MultiLaneDelivery<T = unknown> {
241
+ batches(): AsyncIterable<UnifiedDeliveryBatch<T>>;
242
+ liveBatches(): AsyncIterable<UnifiedDeliveryBatch<T>>;
243
+ historyBatches(subscriptionId: string): AsyncIterable<UnifiedDeliveryBatch<T>>;
244
+ acknowledge(batch: UnifiedDeliveryBatch<T>, options?: {
245
+ signal?: AbortSignal;
246
+ }): Promise<DurableConsumer>;
247
+ close(): Promise<void>;
248
+ }
249
+ export interface BackfillSubscriptionClientOptions {
250
+ baseUrl: string | URL;
251
+ token?: string;
252
+ fetch?: FetchLike;
253
+ /** Deadline for JSON requests; established delivery streams stay open. */
254
+ timeoutMs?: number;
255
+ }
256
+ export declare class BackfillStreamError extends Error {
257
+ readonly code: string;
258
+ readonly earliestAvailableSequence: string | null;
259
+ readonly latestAvailableSequence: string | null;
260
+ constructor(record: BackfillStreamFailure | BackfillStreamReset);
261
+ }
262
+ export interface BackfillSubscriptionClient {
263
+ readonly baseUrl: URL;
264
+ create(request: CreateBackfillSubscription): Promise<BackfillStatus>;
265
+ list(options?: {
266
+ signal?: AbortSignal;
267
+ }): Promise<BackfillStatus[]>;
268
+ inspect(subscription: string, options?: {
269
+ signal?: AbortSignal;
270
+ }): Promise<BackfillStatus>;
271
+ cancel(subscription: string, options?: {
272
+ signal?: AbortSignal;
273
+ }): Promise<BackfillStatus>;
274
+ delete(subscription: string, options?: {
275
+ signal?: AbortSignal;
276
+ }): Promise<HistoricalWorkDeletion>;
277
+ changes<T = unknown>(subscription: string, consumer: string, options?: {
278
+ credential?: string;
279
+ limit?: number;
280
+ signal?: AbortSignal;
281
+ }): Promise<{
282
+ data: ChangeEnvelope<T>[];
283
+ nextCursor: string | null;
284
+ coverage: unknown;
285
+ }>;
286
+ stream<T = unknown>(subscription: string, consumer: string, options?: {
287
+ credential?: string;
288
+ batching?: BackfillBatchingRequest;
289
+ signal?: AbortSignal;
290
+ }): Promise<BackfillDeliverySession<T>>;
291
+ streamLive<T = unknown>(processor: string, consumer: string, options?: {
292
+ credential?: string;
293
+ signal?: AbortSignal;
294
+ }): Promise<LiveDeliverySession<T>>;
295
+ subscribe<T = unknown>(request: MultiLaneSubscriptionRequest): Promise<MultiLaneDelivery<T>>;
296
+ }
297
+ export declare function createBackfillSubscriptionClient(options: BackfillSubscriptionClientOptions): BackfillSubscriptionClient;
298
+ export declare function parseNdjson(body: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<unknown>;
299
+ //# sourceMappingURL=backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"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"}