@secondlayer/sdk 12.1.0 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +50 -3
- package/dist/index.js +291 -12
- package/dist/index.js.map +6 -6
- package/dist/streams/index.d.ts +11 -0
- package/dist/streams/index.js +7 -3
- package/dist/streams/index.js.map +5 -5
- package/dist/subgraphs/index.d.ts +11 -0
- package/dist/subgraphs/index.js +7 -3
- package/dist/subgraphs/index.js.map +4 -4
- package/dist/webhooks/doctor.d.ts +39 -3
- package/dist/webhooks/doctor.js +285 -10
- package/dist/webhooks/doctor.js.map +3 -3
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"import { BaseClient, type SecondLayerOptions, buildQuery } from \"../base.ts\";\n\n/**\n * Typed client for the contract-discovery API (`GET /v1/contracts`).\n *\n * \"Find all contracts conforming to a trait\" — backed by the contract registry:\n * `declared` traits parsed from Clarity source, `inferred` standards from static\n * ABI shape-matching. Anonymous public read. `trait` is required; the ABI blob is\n * omitted unless `include: \"abi\"` is passed.\n */\n\n/** Whether a trait match must be declared in source, inferred from ABI, or either. */\nexport type ContractConformance = \"declared\" | \"inferred\" | \"any\";\n\nexport interface ContractsListParams {\n\t/** Required. Trait identifier to match (e.g. \"sip-010\", or a fully-qualified trait). */\n\ttrait: string;\n\t/** Match source. Defaults to \"any\" server-side. */\n\tconformance?: ContractConformance;\n\t/** Set to \"abi\" to include the full ABI blob in each row. */\n\tinclude?: \"abi\";\n\t/** Page size, 1–500 (default 100 server-side). */\n\tlimit?: number;\n\t/** Opaque cursor from a prior response's `next_cursor`. */\n\tcursor?: string;\n}\n\nexport interface ContractSummary {\n\tcontract_id: string;\n\tdeployer: string;\n\tblock_height: number;\n\tdeclared_traits: string[] | null;\n\tinferred_standards: string[] | null;\n\tabi_status: string;\n\t/** Present only when `include: \"abi\"` was requested. */\n\tabi?: unknown;\n}\n\nexport interface ContractsEnvelope {\n\tcontracts: ContractSummary[];\n\tnext_cursor: string | null;\n}\n\nexport class Contracts extends BaseClient {\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tsuper(options);\n\t}\n\n\t/** Find contracts conforming to `trait`. `trait` is required (server 400s without it). */\n\tlist(params: ContractsListParams): Promise<ContractsEnvelope> {\n\t\treturn this.request<ContractsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/contracts${buildQuery({\n\t\t\t\ttrait: params.trait,\n\t\t\t\tconformance: params.conformance,\n\t\t\t\tinclude: params.include,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tcursor: params.cursor,\n\t\t\t})}`,\n\t\t);\n\t}\n\n\t/**\n\t * Fetch a single contract from the registry by id (the prod-safe ABI source).\n\t * Pass `{ includeAbi: true }` for the full ABI blob. Resolves null on 404.\n\t */\n\tasync get(\n\t\tcontractId: string,\n\t\topts: { includeAbi?: boolean } = {},\n\t): Promise<ContractSummary | null> {\n\t\tconst result = await this.requestOrNull<{ contract: ContractSummary }>(\n\t\t\t\"GET\",\n\t\t\t`/v1/contracts/${encodeURIComponent(contractId)}${\n\t\t\t\topts.includeAbi ? \"?include=abi\" : \"\"\n\t\t\t}`,\n\t\t);\n\t\treturn result?.contract ?? null;\n\t}\n}\n",
|
|
10
10
|
"import {\n\tblockEndCursor,\n\tdecodeStreamsCursor,\n\tencodeStreamsCursor,\n} from \"@secondlayer/shared\";\nimport { ValidationError } from \"./errors.ts\";\n\n/**\n * Helpers for Streams cursors. A cursor is the opaque `<block>:<index>` string\n * that marks a position in the event stream; treat the format as an\n * implementation detail and go through these helpers instead of string-building\n * it at call sites. Encode/decode and the rewind sentinel come from the\n * canonical codec in `@secondlayer/shared` so the SDK cannot accept a spelling\n * the server would 400, or rewind to a different foot than Index/Streams.\n */\nexport const Cursor = {\n\t/**\n\t * Cursor at the foot of `height` — a position that sorts strictly below the\n\t * first event of block `height` (`height:0`) and strictly above every event\n\t * of block `height - 1`. Cursors are exclusive (`(bh,ei) > after`), so\n\t * resuming from it re-reads the entire canonical run starting at `height:0`\n\t * inclusive. This is the position to rewind to after a reorg whose fork point\n\t * is `height`: the new canonical block at `height` carries a fresh first\n\t * event at `(height, 0)` that the consumer MUST re-read.\n\t *\n\t * Encoded as `blockEndCursor(height - 1)` rather than the seemingly-natural\n\t * `${height}:0` — that earlier form was an off-by-one: being exclusive, it\n\t * skipped `(height, 0)`, silently dropping the fork block's first row on\n\t * every reorg. The sentinel is int4 max (the `event_index`/`tx_index` column\n\t * type), larger than any real index, so nothing at `height - 1` survives the\n\t * keyset and the next returned row is exactly `(height, 0)`.\n\t *\n\t * `atHeight(0)` is `null`: the pre-genesis position both consume loops\n\t * accept as \"read everything from the first event\". There is no string\n\t * cursor below `0:0`, and `0:0` itself is exclusive, so returning it here\n\t * skipped the genesis event.\n\t */\n\tatHeight(height: number): string | null {\n\t\tif (height <= 0) return null;\n\t\treturn encodeStreamsCursor(blockEndCursor(height - 1));\n\t},\n\n\t/** Parse a `<block>:<index>` cursor. Throws `ValidationError` if malformed. */\n\tparse(cursor: string): { blockHeight: number; eventIndex: number } {\n\t\ttry {\n\t\t\tconst decoded = decodeStreamsCursor(cursor);\n\t\t\treturn {\n\t\t\t\tblockHeight: decoded.block_height,\n\t\t\t\teventIndex: decoded.event_index,\n\t\t\t};\n\t\t} catch {\n\t\t\tthrow new ValidationError(\n\t\t\t\t`Invalid stream cursor \"${cursor}\"; expected \"<block>:<index>\" (e.g. \"951475:3\").`,\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t},\n};\n",
|
|
11
11
|
"// AuthError / RateLimitError / ValidationError are shared across the whole SDK\n// (Index and the platform clients throw them too) and live in ../errors.ts —\n// re-exported here so `@secondlayer/sdk/streams` imports keep working.\nimport { parseErrorEnvelope } from \"../base.ts\";\nimport {\n\tApiError,\n\tAuthError,\n\tRateLimitError,\n\tSecondLayerError,\n\tValidationError,\n} from \"../errors.ts\";\n\nexport { AuthError, RateLimitError, ValidationError } from \"../errors.ts\";\n\n/** Thrown on a 5xx from the Streams API, and on a failed signing-key fetch.\n * `retryable`: the page retry policy tries again. */\nexport class StreamsServerError extends ApiError {\n\tconstructor(message: string, status: number, body?: unknown, code?: string) {\n\t\tsuper(status, message, body, code, { retryable: true });\n\t\tthis.name = \"StreamsServerError\";\n\t}\n}\n\n/** Thrown when response signature verification is enabled and fails. */\nexport class StreamsSignatureError extends SecondLayerError {\n\tconstructor(message = \"Streams response signature verification failed.\") {\n\t\tsuper(message);\n\t\tthis.name = \"StreamsSignatureError\";\n\t}\n}\n\n/** Map a non-OK Streams response onto the SDK error family. The server's\n * `{error, code}` envelope survives on `message`/`code`/`body`, the same way\n * it does on Index reads, so `err.code === \"CURSOR_INVALID\"` branches the\n * same whichever client raised it. */\nexport async function mapStreamsError(response: Response): Promise<never> {\n\tconst { message, code, body } = parseErrorEnvelope(await response.text());\n\n\tif (response.status === 401) {\n\t\tthrow new AuthError(message ?? \"API key invalid or expired.\", body, code);\n\t}\n\n\tif (response.status === 429) {\n\t\tconst retryAfter = response.headers.get(\"Retry-After\") ?? undefined;\n\t\tthrow new RateLimitError(\n\t\t\tmessage ?? \"Rate limited. Try again later.\",\n\t\t\tretryAfter,\n\t\t\tbody,\n\t\t\tcode,\n\t\t);\n\t}\n\n\tif (response.status >= 500) {\n\t\tthrow new StreamsServerError(\n\t\t\tmessage ?? `Streams server returned ${response.status}.`,\n\t\t\tresponse.status,\n\t\t\tbody,\n\t\t\tcode,\n\t\t);\n\t}\n\n\tthrow new ValidationError(\n\t\tmessage ?? `Streams request returned ${response.status}.`,\n\t\tresponse.status,\n\t\tbody,\n\t\tcode,\n\t);\n}\n",
|
|
12
|
-
"import type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\nimport { Cursor } from \"./cursor.ts\";\nimport { ValidationError } from \"./errors.ts\";\nimport type {\n\tConsumerBatchContext,\n\tStreamsBatch,\n\tStreamsEvent,\n\tStreamsEventType,\n\tStreamsEventsEnvelope,\n\tStreamsFilterMap,\n\tStreamsFilterValue,\n\tStreamsReorg,\n\tStreamsReorgsListEnvelope,\n} from \"./types.ts\";\n\n/** Stable identity of a reorg, for in-memory dedup across re-reported pages. */\nfunction reorgKey(reorg: StreamsReorg): string {\n\treturn `${reorg.detected_at}|${reorg.fork_point_height}|${reorg.new_canonical_tip}`;\n}\n\n/** Default ceiling on how far below the checkpoint one reorg may rewind. */\nexport const DEFAULT_MAX_ROLLBACK_DEPTH = 1000;\n\n/** What one call to {@link applyReorgs} did. `null` when nothing rewound. */\nexport type ReorgRewind = {\n\t/** Lowest fork point rolled back. */\n\tforkPoint: number;\n\t/** Cursor to resume from: the foot of `forkPoint`, or `null` (pre-genesis). */\n\tcursor: string | null;\n};\n\n/**\n * Apply a page's (or the reorg list's) reorgs against the consumer's position.\n * Shared by the Streams and Index loops so the two cannot drift on the one\n * rule that decides data loss: NEVER rewind forward.\n *\n * A reorg is only actionable when its fork point is at or below the height\n * the cursor has reached (`fork_point_height <= resumeHeight(cursor)`).\n * Servers attach every reorg whose orphaned span intersects the page span, so\n * a page read from below the fork carries a reorg the consumer has not\n * written past yet. Rewinding to it would move the cursor FORWARD and skip\n * every row between the checkpoint and the fork, durably once a sink commits\n * the rewound cursor. Those reorgs are marked handled and left alone: the\n * page itself is already the canonical chain.\n *\n * Every fresh reorg is validated BEFORE the sink sees any of them: the fork\n * point must be a non-negative safe integer, and the rewind may not reach\n * more than `maxRollbackDepth` blocks below the checkpoint unless the caller\n * raised the ceiling. `fork_point_height` drives a `DELETE ... >= fork` on\n * every declared table, so a malformed or hostile value is refused loudly\n * rather than executed.\n */\nexport async function applyReorgs<\n\tTReorg extends { fork_point_height: number },\n>(opts: {\n\treorgs: readonly TReorg[];\n\tcursor: string | null;\n\t/** In-memory dedup across re-reported pages; mutated. */\n\thandled: Set<string>;\n\tkeyOf: (reorg: TReorg) => string;\n\tsink?: Pick<ConsumerSink<unknown>, \"rollback\">;\n\tonReorg?: (\n\t\treorg: TReorg,\n\t\tctx: { cursor: string | null },\n\t) => Promise<void> | void;\n\tmaxRollbackDepth?: number;\n}): Promise<ReorgRewind | null> {\n\tconst fresh = opts.reorgs.filter(\n\t\t(reorg) => !opts.handled.has(opts.keyOf(reorg)),\n\t);\n\tif (fresh.length === 0) return null;\n\n\tfor (const reorg of fresh) {\n\t\tconst fork = reorg.fork_point_height;\n\t\tif (!Number.isSafeInteger(fork) || fork < 0) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t`Reorg fork_point_height ${String(fork)} is not a non-negative integer. Rollback deletes every row at or above the fork from every declared table, so a malformed fork point is refused before the sink runs.`,\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst position = resumeHeight(opts.cursor);\n\tconst applicable = fresh\n\t\t.filter((reorg) => position !== null && reorg.fork_point_height <= position)\n\t\t.sort((a, b) => a.fork_point_height - b.fork_point_height);\n\t// Fork above the checkpoint: nothing at or past it has been written, and\n\t// the page being read is already the new chain. Remember it, do not move.\n\tfor (const reorg of fresh) {\n\t\tif (!applicable.includes(reorg)) opts.handled.add(opts.keyOf(reorg));\n\t}\n\tif (applicable.length === 0 || position === null) return null;\n\n\tconst forkPoint = applicable[0]?.fork_point_height ?? position;\n\tconst depth = position - forkPoint;\n\tconst maxDepth = opts.maxRollbackDepth ?? DEFAULT_MAX_ROLLBACK_DEPTH;\n\tif (depth > maxDepth) {\n\t\tthrow new ValidationError(\n\t\t\t`Reorg at fork ${forkPoint} rewinds ${depth} blocks below the checkpoint at height ${position}, past maxRollbackDepth (${maxDepth}). A rollback this deep deletes every row at or above the fork from every declared table. Confirm the source is trusted, then pass maxRollbackDepth: ${depth} or higher to allow it.`,\n\t\t\t400,\n\t\t);\n\t}\n\n\tconst rewind = Cursor.atHeight(forkPoint);\n\tfor (const reorg of applicable) {\n\t\t// Sink first: rollback + rewound cursor commit atomically. A user\n\t\t// onReorg (if any) runs after, for observability.\n\t\tawait opts.sink?.rollback(reorg.fork_point_height, rewind);\n\t\tawait opts.onReorg?.(reorg, { cursor: rewind });\n\t\topts.handled.add(opts.keyOf(reorg));\n\t}\n\treturn { forkPoint, cursor: rewind };\n}\n\ntype StreamsEventsFetchParams = {\n\tcursor?: string | null;\n\tlimit: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type StreamsEventsFetcher = (\n\tparams: StreamsEventsFetchParams,\n) => Promise<StreamsEventsEnvelope>;\n\nexport type Sleep = (ms: number, signal?: AbortSignal) => Promise<void>;\n\n/**\n * Guard the `finalizedOnly` checkpoint contract. Shared by both loops.\n *\n * In `finalizedOnly` mode the unfinalized tail is filtered OUT of the batch\n * and re-read next poll — and `onReorg` is skipped entirely, so nothing ever\n * re-reads a range the cursor has passed. Returning a cursor above the last\n * delivered finalized event (e.g. `envelope.next_cursor`, which points past\n * the filtered tail) therefore drops those events permanently and silently.\n * Throw instead: this is the one wrong return the loop can detect.\n */\nexport function assertFinalizedCheckpoint(\n\t// biome-ignore lint/suspicious/noConfusingVoidType: mirrors the onBatch return union it validates\n\treturned: string | null | undefined | void,\n\tcheckpoint: string | null,\n): void {\n\tif (returned === null || returned === undefined) return;\n\tif (returned === checkpoint) return;\n\tconst r = Cursor.parse(returned);\n\tconst c = checkpoint === null ? null : Cursor.parse(checkpoint);\n\tconst above =\n\t\tc === null ||\n\t\tr.blockHeight > c.blockHeight ||\n\t\t(r.blockHeight === c.blockHeight && r.eventIndex > c.eventIndex);\n\tif (above) {\n\t\tconst boundary = c ? ` (\"${checkpoint}\")` : \" (none delivered yet)\";\n\t\tthrow new ValidationError(\n\t\t\t`onBatch returned cursor \"${returned}\", above the last delivered finalized event${boundary}. With finalizedOnly, events past that point were filtered out and will be re-read once finalized — committing beyond it skips them permanently. Return ctx.cursor (or nothing); never envelope.next_cursor.`,\n\t\t\t400,\n\t\t);\n\t}\n}\n\n/**\n * Fail fast on an impossible sink/mode pairing. Shared by both loops, checked\n * BEFORE the first fetch and before `loadCursor`: a `finalizedOnly` sink\n * (append-only store — cannot undo committed rows) following the unfinalized\n * tip would corrupt on the first fork, and the corruption is silent until the\n * fork happens. Throwing at startup is the only loud moment available.\n */\nexport function assertSinkModeCompatible(\n\tsink: Pick<ConsumerSink, \"capabilities\"> | undefined,\n\tfinalizedOnly: boolean,\n): void {\n\tif (sink?.capabilities?.finalizedOnly && !finalizedOnly) {\n\t\tthrow new ValidationError(\n\t\t\t\"This sink declares capabilities.finalizedOnly — it cannot roll back reorged rows, and following the unfinalized tip would corrupt it at the first fork. Pass finalizedOnly: true to consume(), or use a sink that implements rollback.\",\n\t\t\t400,\n\t\t);\n\t}\n}\n\n/**\n * The height a resume cursor implies — seeds the loop's \"highest block\n * reached\" so a consumer restarted into a quiet tail reports its true\n * position (`checkpoint`, `height`, `blocksBehind`) instead of `null`s\n * until the first delivered row. Lenient: an unparseable cursor seeds\n * nothing and is left for the server to reject.\n */\nexport function resumeHeight(cursor: string | null): number | null {\n\tif (cursor === null) return null;\n\ttry {\n\t\treturn Cursor.parse(cursor).blockHeight;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Build the ctx handed to `onBatch`. Shared by the Streams and Index loops so\n * the two can't drift on what \"progress\" means. `blocksBehind` measures the\n * consumer's BACKLOG (`tip - scannedHeight`), not the age of the last\n * delivered event — a caught-up tail on a quiet contract is 0 behind. */\nexport function batchContext<TTip extends { block_height: number }, TReorg>(\n\tcursor: string | null,\n\theight: number | null,\n\ttip: TTip,\n\treorgs: readonly TReorg[] = [],\n\tscannedHeight: number | null = null,\n): ConsumerBatchContext<TTip, TReorg> {\n\tconst tipHeight = tip.block_height;\n\tconst position = scannedHeight ?? height;\n\treturn {\n\t\tcursor,\n\t\theight,\n\t\tscannedHeight: position,\n\t\ttipHeight,\n\t\tblocksBehind: position === null ? null : Math.max(0, tipHeight - position),\n\t\ttip,\n\t\treorgs,\n\t};\n}\n\n/** Options shared by both consume loops' page-fetch retry. Vocabulary matches\n * `@secondlayer/stacks` transports (`retryCount`/`retryDelay`) — one retry\n * language across the family, not a third. */\nexport type PageRetryOptions = {\n\t/** Retries after the first failure. Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base delay in ms; the n-th retry waits `retryDelay * n` (matches the\n\t * stacks transport). A server `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). The\n\t * retry policy owns the decision; this cannot change it. */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n};\n\n/** Sleep clamp for a server `Retry-After`: the loop honors the header up to\n * five minutes per attempt and keeps retrying within `retryCount`. It never\n * gives up early on a long Retry-After; the tradeoff is a long wait, not a\n * dropped loop. Set `retryCount: 0` to surface the 429 immediately instead. */\nconst MAX_RETRY_AFTER_MS = 300_000;\n\nfunction errRetryable(err: unknown): boolean {\n\t// SecondLayerError family carries an explicit signal; a bare TypeError is\n\t// the raw fetch network failure (Streams' fetchImpl isn't wrapped).\n\tif (err && typeof err === \"object\" && \"retryable\" in err) {\n\t\treturn (err as { retryable: unknown }).retryable === true;\n\t}\n\treturn err instanceof TypeError;\n}\n\nfunction errRetryAfterMs(err: unknown): number | undefined {\n\tif (err && typeof err === \"object\" && \"retryAfterSeconds\" in err) {\n\t\tconst seconds = (err as { retryAfterSeconds: unknown }).retryAfterSeconds;\n\t\tif (typeof seconds === \"number\" && Number.isFinite(seconds)) {\n\t\t\treturn Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Run one page fetch with retries. Scoped to the FETCH only — never the loop\n * body: retrying after an `onReorg`/`onBatch` throw would re-enter with\n * `handledReorgs` partially mutated and skip a rollback silently. `onBatch`\n * and `onReorg` throws always propagate to the caller.\n */\nexport async function fetchPageWithRetry<T>(\n\tfetchPage: () => Promise<T>,\n\topts: PageRetryOptions & { sleep: Sleep; signal?: AbortSignal },\n): Promise<T> {\n\tconst retryCount = opts.retryCount ?? 3;\n\tconst retryDelay = opts.retryDelay ?? 1000;\n\tfor (let attempt = 0; ; attempt++) {\n\t\ttry {\n\t\t\treturn await fetchPage();\n\t\t} catch (err) {\n\t\t\tconst retriesLeft = retryCount - attempt;\n\t\t\tif (retriesLeft <= 0 || !errRetryable(err) || opts.signal?.aborted) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tconst delayMs = errRetryAfterMs(err) ?? retryDelay * (attempt + 1);\n\t\t\topts.onError?.(err, { attempt, retriesLeft, delayMs });\n\t\t\tawait opts.sleep(delayMs, opts.signal);\n\t\t\t// Aborted mid-sleep: surface the original failure, not a fresh fetch.\n\t\t\tif (opts.signal?.aborted) throw err;\n\t\t}\n\t}\n}\n\nexport async function defaultSleep(\n\tms: number,\n\tsignal?: AbortSignal,\n): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tresolve();\n\t\t};\n\t\t// Detach on the timer path too: a tail at the tip sleeps once per\n\t\t// empty poll, and each sleep that left its listener behind pinned a\n\t\t// closure on the caller's long-lived signal until the process exited.\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport async function consumeStreamsEvents<TTx = never>(opts: {\n\tfromCursor?: string | null;\n\tmode?: \"tail\" | \"bounded\";\n\tfinalizedOnly?: boolean;\n\tbatchSize: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\t/** `GET /v1/streams/reorgs`, polled on idle (empty) pages so a reorg\n\t * that lands while the consumer sits at the tip is still rolled back.\n\t * Pages only carry reorgs overlapping their own span. */\n\tfetchReorgs?: (params: {\n\t\tsince: string;\n\t}) => Promise<StreamsReorgsListEnvelope>;\n\t/** Destination adapter owning checkpoint + rollback (see IndexConsumeOptions.sink). */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: ConsumerBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: { cursor: string | null },\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint. Default 1000. */\n\tmaxRollbackDepth?: number;\n\tsleep?: Sleep;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tretryCount?: number;\n\tretryDelay?: number;\n\tonError?: PageRetryOptions[\"onError\"];\n\tsignal?: AbortSignal;\n}): Promise<{ cursor: string | null; pages: number; emptyPolls: number }> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tconst mode = opts.mode ?? \"tail\";\n\tconst finalizedOnly = opts.finalizedOnly ?? false;\n\tconst emptyBackoffMs = opts.emptyBackoffMs ?? 500;\n\tconst maxPages = opts.maxPages ?? Number.POSITIVE_INFINITY;\n\tconst maxEmptyPolls = opts.maxEmptyPolls ?? Number.POSITIVE_INFINITY;\n\tassertSinkModeCompatible(opts.sink, finalizedOnly);\n\t// Resume order: explicit fromCursor, then the sink's committed checkpoint.\n\t// `loadCursor` is also the sink's INIT — it creates the checkpoint table and\n\t// validates the rollback precondition. Short-circuiting it on an explicit\n\t// `fromCursor` meant a replay-from-cursor run crashed on its first commit,\n\t// and skipped the height-column check that keeps reorg rollback from being\n\t// a silent no-op. Always initialize; `fromCursor` still wins as the resume\n\t// position.\n\tconst committedCursor = (await opts.sink?.loadCursor()) ?? null;\n\tlet cursor = opts.fromCursor ?? committedCursor;\n\t// In-memory only: rollback is idempotent, so a crash before the rewind is\n\t// re-detected and re-applied harmlessly on restart — no need to persist.\n\tconst handledReorgs = new Set<string>();\n\t// Resume token for the idle-tip reorg list; `null` until the first idle\n\t// poll with a checkpoint to seed it from.\n\tlet reorgSince: string | null = null;\n\tlet pages = 0;\n\tlet emptyPolls = 0;\n\t// Highest block reached, carried across empty pages so a caught-up tail\n\t// keeps reporting its position instead of dropping to null. Seeded from\n\t// the resume cursor: a restart into a quiet tail knows where it stands\n\t// before the first row lands.\n\tlet height: number | null = resumeHeight(cursor);\n\t// Highest block VERIFIED — how far the sweep is actually caught up, as\n\t// opposed to `height` (last delivered row). Starts at the resume position;\n\t// each page moves it (see below).\n\tlet scanned: number | null = height;\n\n\twhile (\n\t\tpages < maxPages &&\n\t\temptyPolls < maxEmptyPolls &&\n\t\t!opts.signal?.aborted\n\t) {\n\t\t// Retry wraps ONLY the page fetch: one transient 429/5xx must not kill\n\t\t// an hours-long backfill, and handler throws must never be re-entered.\n\t\tconst envelope = await fetchPageWithRetry(\n\t\t\t() =>\n\t\t\t\topts.fetchEvents({\n\t\t\t\t\tcursor,\n\t\t\t\t\tlimit: opts.batchSize,\n\t\t\t\t\ttypes: opts.types,\n\t\t\t\t\tnotTypes: opts.notTypes,\n\t\t\t\t\tcontractId: opts.contractId,\n\t\t\t\t\tsender: opts.sender,\n\t\t\t\t\trecipient: opts.recipient,\n\t\t\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\t\t\tfilters: opts.filters,\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tretryCount: opts.retryCount,\n\t\t\t\tretryDelay: opts.retryDelay,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tsleep,\n\t\t\t\tsignal: opts.signal,\n\t\t\t},\n\t\t);\n\t\tpages++;\n\n\t\t// Reorgs: roll back each new fork at or below the checkpoint, then\n\t\t// rewind to the lowest fork point and re-read the now-canonical run.\n\t\t// Finalized data never reorgs, so `finalizedOnly` skips this entirely.\n\t\t// A sink makes rollback UNCONDITIONAL: omitting `onReorg` used to skip\n\t\t// reorgs silently.\n\t\tconst reorgsOn = !finalizedOnly && Boolean(opts.onReorg || opts.sink);\n\t\tif (reorgsOn) {\n\t\t\tconst rewound = await applyReorgs({\n\t\t\t\treorgs: envelope.reorgs,\n\t\t\t\tcursor,\n\t\t\t\thandled: handledReorgs,\n\t\t\t\tkeyOf: reorgKey,\n\t\t\t\tsink: opts.sink,\n\t\t\t\tonReorg: opts.onReorg,\n\t\t\t\tmaxRollbackDepth: opts.maxRollbackDepth,\n\t\t\t});\n\t\t\tif (rewound) {\n\t\t\t\tcursor = rewound.cursor;\n\t\t\t\t// Everything at and above the fork is no longer canonical, so the\n\t\t\t\t// reached height rolls back with it — including the verified\n\t\t\t\t// position: the new chain above the fork is unread.\n\t\t\t\theight = rewound.forkPoint > 0 ? rewound.forkPoint - 1 : null;\n\t\t\t\tscanned = height;\n\t\t\t\temptyPolls = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Idle tip: a page only reports reorgs overlapping its own span, so a\n\t\t// fork that lands while the consumer sits at the tip (orphaning rows\n\t\t// BELOW the next non-empty page) is never on a page. On an empty page\n\t\t// ask the reorg list instead: one extra request per idle poll. Seeded\n\t\t// from the checkpoint cursor (the API reads a cursor as \"reorgs that\n\t\t// orphaned anything at or above this position\"), then advanced by the\n\t\t// list's own `next_since` token.\n\t\tif (reorgsOn && opts.fetchReorgs && envelope.events.length === 0) {\n\t\t\treorgSince ??= cursor;\n\t\t\tif (reorgSince !== null) {\n\t\t\t\tconst since: string = reorgSince;\n\t\t\t\tconst fetchReorgs = opts.fetchReorgs;\n\t\t\t\tconst listed: StreamsReorgsListEnvelope = await fetchPageWithRetry(\n\t\t\t\t\t() => fetchReorgs({ since }),\n\t\t\t\t\t{\n\t\t\t\t\t\tretryCount: opts.retryCount,\n\t\t\t\t\t\tretryDelay: opts.retryDelay,\n\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\tsleep,\n\t\t\t\t\t\tsignal: opts.signal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (listed.next_since !== null) reorgSince = listed.next_since;\n\t\t\t\tconst rewound = await applyReorgs({\n\t\t\t\t\treorgs: listed.reorgs,\n\t\t\t\t\tcursor,\n\t\t\t\t\thandled: handledReorgs,\n\t\t\t\t\tkeyOf: reorgKey,\n\t\t\t\t\tsink: opts.sink,\n\t\t\t\t\tonReorg: opts.onReorg,\n\t\t\t\t\tmaxRollbackDepth: opts.maxRollbackDepth,\n\t\t\t\t});\n\t\t\t\tif (rewound) {\n\t\t\t\t\tcursor = rewound.cursor;\n\t\t\t\t\theight = rewound.forkPoint > 0 ? rewound.forkPoint - 1 : null;\n\t\t\t\t\tscanned = height;\n\t\t\t\t\temptyPolls = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst emitted = finalizedOnly\n\t\t\t? envelope.events.filter((event) => event.finalized)\n\t\t\t: envelope.events;\n\t\t// Only advance to the last finalized event in finalizedOnly mode; the\n\t\t// unfinalized tail is re-read next poll until it settles.\n\t\tconst checkpoint = finalizedOnly\n\t\t\t? (emitted.at(-1)?.cursor ?? cursor)\n\t\t\t: envelope.next_cursor;\n\t\t// Ascending cursor order, so the last row is the highest block this page\n\t\t// reached; an empty page keeps the previous value.\n\t\theight = emitted.at(-1)?.block_height ?? height;\n\t\t// Verified position. Rows delivered → through the last row (the page\n\t\t// limit hides what's above it). Empty page with an ADVANCED cursor →\n\t\t// through that cursor only (a server may cap an expensive filtered\n\t\t// scan; claiming the tip would overstate). Truly empty page → the\n\t\t// server confirmed nothing matches up to the tip. Non-empty raw page\n\t\t// fully filtered (unfinalized tail) → position unchanged.\n\t\tif (emitted.length > 0) {\n\t\t\tscanned = height;\n\t\t} else if (checkpoint !== null && checkpoint !== cursor) {\n\t\t\tscanned = resumeHeight(checkpoint) ?? scanned;\n\t\t} else if (envelope.events.length === 0) {\n\t\t\tscanned = envelope.tip.block_height;\n\t\t}\n\n\t\t// An empty page reports the STANDING cursor, not null: the committed\n\t\t// checkpoint is still this consumer's position while it idles.\n\t\tconst ctx = batchContext(\n\t\t\tcheckpoint ?? cursor,\n\t\t\theight,\n\t\t\tenvelope.tip,\n\t\t\tenvelope.reorgs,\n\t\t\tscanned,\n\t\t);\n\t\t// Before any early return: an empty page still proves the loop is alive.\n\t\topts.onProgress?.(ctx);\n\n\t\tlet nextCursor: string | null;\n\t\tif (opts.sink) {\n\t\t\tconst sink = opts.sink;\n\t\t\t// Rows and cursor commit in ONE transaction; a handler throw aborts\n\t\t\t// both. Nothing moved → nothing to commit, handler not invoked.\n\t\t\tif (\n\t\t\t\tcheckpoint !== null &&\n\t\t\t\t(checkpoint !== cursor || emitted.length > 0)\n\t\t\t) {\n\t\t\t\tawait sink.commitBatch(checkpoint, async (tx) => {\n\t\t\t\t\t// The cast is sound exactly as far as the sink's own typing:\n\t\t\t\t\t// `sink: ConsumerSink<TTx>` binds TTx, and `tx` here is what its\n\t\t\t\t\t// commitBatch lends. Nothing verifies it at runtime — a sink whose\n\t\t\t\t\t// declared Tx lies about what it lends fails inside the handler.\n\t\t\t\t\tawait opts.onBatch(emitted, envelope, {\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\ttx,\n\t\t\t\t\t} as ConsumerBatchContext & WithSinkTx<TTx>);\n\t\t\t\t});\n\t\t\t}\n\t\t\tnextCursor = checkpoint;\n\t\t} else {\n\t\t\tconst returnedCursor = await opts.onBatch(\n\t\t\t\temitted,\n\t\t\t\tenvelope,\n\t\t\t\tctx as ConsumerBatchContext & WithSinkTx<TTx>,\n\t\t\t);\n\t\t\tif (finalizedOnly) assertFinalizedCheckpoint(returnedCursor, checkpoint);\n\t\t\tnextCursor = returnedCursor ?? checkpoint;\n\t\t}\n\n\t\tif (nextCursor && nextCursor !== cursor) {\n\t\t\tcursor = nextCursor;\n\t\t\temptyPolls = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (emitted.length === 0) {\n\t\t\temptyPolls++;\n\t\t\tif (mode === \"bounded\") {\n\t\t\t\treturn { cursor, pages, emptyPolls };\n\t\t\t}\n\t\t\tawait sleep(emptyBackoffMs, opts.signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn { cursor, pages, emptyPolls };\n\t}\n\n\treturn { cursor, pages, emptyPolls };\n}\n\n/**\n * Async-iterator form of the Streams pull loop, yielding one {@link StreamsBatch}\n * per fetched page. Each yield maps 1:1 onto a `GET /v1/streams/events` envelope\n * (`{ events, next_cursor, tip, reorgs }` → `{ events, cursor, tip, reorgs }`) —\n * no extra API calls, no regrouping. Pages with no events and no reorgs are not\n * yielded; the iterator sleeps `intervalMs` and re-polls the tip instead.\n */\nexport async function* iterateStreamsBatches(opts: {\n\tfromCursor?: string | null;\n\tbatchSize: number;\n\tintervalMs: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\tsleep?: Sleep;\n\tsignal?: AbortSignal;\n}): AsyncGenerator<StreamsBatch> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tlet cursor = opts.fromCursor ?? null;\n\n\twhile (!opts.signal?.aborted) {\n\t\tconst envelope = await opts.fetchEvents({\n\t\t\tcursor,\n\t\t\tlimit: opts.batchSize,\n\t\t\ttypes: opts.types,\n\t\t\tnotTypes: opts.notTypes,\n\t\t\tcontractId: opts.contractId,\n\t\t\tsender: opts.sender,\n\t\t\trecipient: opts.recipient,\n\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\tfilters: opts.filters,\n\t\t});\n\n\t\tconst checkpoint = envelope.next_cursor ?? cursor;\n\t\tif (envelope.events.length > 0 || envelope.reorgs.length > 0) {\n\t\t\tyield {\n\t\t\t\tevents: envelope.events,\n\t\t\t\tcursor: checkpoint,\n\t\t\t\ttip: envelope.tip,\n\t\t\t\treorgs: envelope.reorgs,\n\t\t\t};\n\t\t}\n\n\t\tconst advanced = checkpoint !== null && checkpoint !== cursor;\n\t\tcursor = checkpoint;\n\t\t// Caught up at the tip: wait one poll interval before re-reading.\n\t\tif (!advanced && envelope.events.length === 0) {\n\t\t\tif (opts.signal?.aborted) return;\n\t\t\tawait sleep(opts.intervalMs, opts.signal);\n\t\t}\n\t}\n}\n\nexport async function* streamStreamsEvents(opts: {\n\tfromCursor?: string | null;\n\tbatchSize: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\tsleep?: Sleep;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n}): AsyncGenerator<StreamsEvent> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tconst emptyBackoffMs = opts.emptyBackoffMs ?? 500;\n\tconst maxPages = opts.maxPages ?? Number.POSITIVE_INFINITY;\n\tconst maxEmptyPolls = opts.maxEmptyPolls ?? Number.POSITIVE_INFINITY;\n\tlet cursor = opts.fromCursor ?? null;\n\tlet pages = 0;\n\tlet emptyPolls = 0;\n\n\twhile (\n\t\tpages < maxPages &&\n\t\temptyPolls < maxEmptyPolls &&\n\t\t!opts.signal?.aborted\n\t) {\n\t\tconst envelope = await opts.fetchEvents({\n\t\t\tcursor,\n\t\t\tlimit: opts.batchSize,\n\t\t\ttypes: opts.types,\n\t\t\tnotTypes: opts.notTypes,\n\t\t\tcontractId: opts.contractId,\n\t\t\tsender: opts.sender,\n\t\t\trecipient: opts.recipient,\n\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\tfilters: opts.filters,\n\t\t});\n\t\tpages++;\n\n\t\tfor (const event of envelope.events) {\n\t\t\tif (opts.signal?.aborted) return;\n\t\t\tyield event;\n\t\t}\n\n\t\tconst nextCursor = envelope.next_cursor;\n\t\tif (nextCursor && nextCursor !== cursor) {\n\t\t\tcursor = nextCursor;\n\t\t\temptyPolls = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (envelope.events.length === 0) {\n\t\t\temptyPolls++;\n\t\t\tif (emptyPolls >= maxEmptyPolls || pages >= maxPages) return;\n\t\t\tawait sleep(emptyBackoffMs, opts.signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn;\n\t}\n}\n",
|
|
12
|
+
"import type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\nimport { Cursor } from \"./cursor.ts\";\nimport { ValidationError } from \"./errors.ts\";\nimport type {\n\tConsumerBatchContext,\n\tStreamsBatch,\n\tStreamsEvent,\n\tStreamsEventType,\n\tStreamsEventsEnvelope,\n\tStreamsFilterMap,\n\tStreamsFilterValue,\n\tStreamsReorg,\n\tStreamsReorgsListEnvelope,\n} from \"./types.ts\";\n\n/** Stable identity of a reorg, for in-memory dedup across re-reported pages. */\nfunction reorgKey(reorg: StreamsReorg): string {\n\treturn `${reorg.detected_at}|${reorg.fork_point_height}|${reorg.new_canonical_tip}`;\n}\n\n/** Default ceiling on how far below the checkpoint one reorg may rewind. */\nexport const DEFAULT_MAX_ROLLBACK_DEPTH = 1000;\n\n/** What one call to {@link applyReorgs} did. `null` when nothing rewound. */\nexport type ReorgRewind = {\n\t/** Lowest fork point rolled back. */\n\tforkPoint: number;\n\t/** Cursor to resume from: the foot of `forkPoint`, or `null` (pre-genesis). */\n\tcursor: string | null;\n};\n\n/**\n * Apply a page's (or the reorg list's) reorgs against the consumer's position.\n * Shared by the Streams and Index loops so the two cannot drift on the one\n * rule that decides data loss: NEVER rewind forward.\n *\n * A reorg is only actionable when its fork point is at or below the height\n * the cursor has reached (`fork_point_height <= resumeHeight(cursor)`).\n * Servers attach every reorg whose orphaned span intersects the page span, so\n * a page read from below the fork carries a reorg the consumer has not\n * written past yet. Rewinding to it would move the cursor FORWARD and skip\n * every row between the checkpoint and the fork, durably once a sink commits\n * the rewound cursor. Those reorgs are marked handled and left alone: the\n * page itself is already the canonical chain.\n *\n * Every fresh reorg is validated BEFORE the sink sees any of them: the fork\n * point must be a non-negative safe integer, and the rewind may not reach\n * more than `maxRollbackDepth` blocks below the checkpoint unless the caller\n * raised the ceiling. `fork_point_height` drives a `DELETE ... >= fork` on\n * every declared table, so a malformed or hostile value is refused loudly\n * rather than executed.\n */\nexport async function applyReorgs<\n\tTReorg extends { fork_point_height: number },\n>(opts: {\n\treorgs: readonly TReorg[];\n\tcursor: string | null;\n\t/** In-memory dedup across re-reported pages; mutated. */\n\thandled: Set<string>;\n\tkeyOf: (reorg: TReorg) => string;\n\tsink?: Pick<ConsumerSink<unknown>, \"rollback\">;\n\tonReorg?: (\n\t\treorg: TReorg,\n\t\tctx: { cursor: string | null },\n\t) => Promise<void> | void;\n\tmaxRollbackDepth?: number;\n}): Promise<ReorgRewind | null> {\n\tconst fresh = opts.reorgs.filter(\n\t\t(reorg) => !opts.handled.has(opts.keyOf(reorg)),\n\t);\n\tif (fresh.length === 0) return null;\n\n\tfor (const reorg of fresh) {\n\t\tconst fork = reorg.fork_point_height;\n\t\tif (!Number.isSafeInteger(fork) || fork < 0) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t`Reorg fork_point_height ${String(fork)} is not a non-negative integer. Rollback deletes every row at or above the fork from every declared table, so a malformed fork point is refused before the sink runs.`,\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst position = resumeHeight(opts.cursor);\n\tconst applicable = fresh\n\t\t.filter((reorg) => position !== null && reorg.fork_point_height <= position)\n\t\t.sort((a, b) => a.fork_point_height - b.fork_point_height);\n\t// Fork above the checkpoint: nothing at or past it has been written, and\n\t// the page being read is already the new chain. Remember it, do not move.\n\tfor (const reorg of fresh) {\n\t\tif (!applicable.includes(reorg)) opts.handled.add(opts.keyOf(reorg));\n\t}\n\tif (applicable.length === 0 || position === null) return null;\n\n\tconst forkPoint = applicable[0]?.fork_point_height ?? position;\n\tconst depth = position - forkPoint;\n\tconst maxDepth = opts.maxRollbackDepth ?? DEFAULT_MAX_ROLLBACK_DEPTH;\n\tif (depth > maxDepth) {\n\t\tthrow new ValidationError(\n\t\t\t`Reorg at fork ${forkPoint} rewinds ${depth} blocks below the checkpoint at height ${position}, past maxRollbackDepth (${maxDepth}). A rollback this deep deletes every row at or above the fork from every declared table. Confirm the source is trusted, then pass maxRollbackDepth: ${depth} or higher to allow it.`,\n\t\t\t400,\n\t\t);\n\t}\n\n\tconst rewind = Cursor.atHeight(forkPoint);\n\tfor (const reorg of applicable) {\n\t\t// Sink first: rollback + rewound cursor commit atomically. A user\n\t\t// onReorg (if any) runs after, for observability.\n\t\tawait opts.sink?.rollback(reorg.fork_point_height, rewind);\n\t\tawait opts.onReorg?.(reorg, { cursor: rewind });\n\t\topts.handled.add(opts.keyOf(reorg));\n\t}\n\treturn { forkPoint, cursor: rewind };\n}\n\ntype StreamsEventsFetchParams = {\n\tcursor?: string | null;\n\tlimit: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type StreamsEventsFetcher = (\n\tparams: StreamsEventsFetchParams,\n) => Promise<StreamsEventsEnvelope>;\n\nexport type Sleep = (ms: number, signal?: AbortSignal) => Promise<void>;\n\n/**\n * Guard the `finalizedOnly` checkpoint contract. Shared by both loops.\n *\n * In `finalizedOnly` mode the unfinalized tail is filtered OUT of the batch\n * and re-read next poll — and `onReorg` is skipped entirely, so nothing ever\n * re-reads a range the cursor has passed. Returning a cursor above the last\n * delivered finalized event (e.g. `envelope.next_cursor`, which points past\n * the filtered tail) therefore drops those events permanently and silently.\n * Throw instead: this is the one wrong return the loop can detect.\n */\nexport function assertFinalizedCheckpoint(\n\t// biome-ignore lint/suspicious/noConfusingVoidType: mirrors the onBatch return union it validates\n\treturned: string | null | undefined | void,\n\tcheckpoint: string | null,\n): void {\n\tif (returned === null || returned === undefined) return;\n\tif (returned === checkpoint) return;\n\tconst r = Cursor.parse(returned);\n\tconst c = checkpoint === null ? null : Cursor.parse(checkpoint);\n\tconst above =\n\t\tc === null ||\n\t\tr.blockHeight > c.blockHeight ||\n\t\t(r.blockHeight === c.blockHeight && r.eventIndex > c.eventIndex);\n\tif (above) {\n\t\tconst boundary = c ? ` (\"${checkpoint}\")` : \" (none delivered yet)\";\n\t\tthrow new ValidationError(\n\t\t\t`onBatch returned cursor \"${returned}\", above the last delivered finalized event${boundary}. With finalizedOnly, events past that point were filtered out and will be re-read once finalized — committing beyond it skips them permanently. Return ctx.cursor (or nothing); never envelope.next_cursor.`,\n\t\t\t400,\n\t\t);\n\t}\n}\n\n/**\n * Fail fast on an impossible sink/mode pairing. Shared by both loops, checked\n * BEFORE the first fetch and before `loadCursor`: a `finalizedOnly` sink\n * (append-only store — cannot undo committed rows) following the unfinalized\n * tip would corrupt on the first fork, and the corruption is silent until the\n * fork happens. Throwing at startup is the only loud moment available.\n */\nexport function assertSinkModeCompatible(\n\tsink: Pick<ConsumerSink, \"capabilities\"> | undefined,\n\tfinalizedOnly: boolean,\n): void {\n\tif (sink?.capabilities?.finalizedOnly && !finalizedOnly) {\n\t\tthrow new ValidationError(\n\t\t\t\"This sink declares capabilities.finalizedOnly — it cannot roll back reorged rows, and following the unfinalized tip would corrupt it at the first fork. Pass finalizedOnly: true to consume(), or use a sink that implements rollback.\",\n\t\t\t400,\n\t\t);\n\t}\n}\n\n/**\n * The height a resume cursor implies — seeds the loop's \"highest block\n * reached\" so a consumer restarted into a quiet tail reports its true\n * position (`checkpoint`, `height`, `blocksBehind`) instead of `null`s\n * until the first delivered row. Lenient: an unparseable cursor seeds\n * nothing and is left for the server to reject.\n */\nexport function resumeHeight(cursor: string | null): number | null {\n\tif (cursor === null) return null;\n\ttry {\n\t\treturn Cursor.parse(cursor).blockHeight;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Build the ctx handed to `onBatch`. Shared by the Streams and Index loops so\n * the two can't drift on what \"progress\" means. `blocksBehind` measures the\n * consumer's BACKLOG (`tip - scannedHeight`), not the age of the last\n * delivered event — a caught-up tail on a quiet contract is 0 behind. */\nexport function batchContext<TTip extends { block_height: number }, TReorg>(\n\tcursor: string | null,\n\theight: number | null,\n\ttip: TTip,\n\treorgs: readonly TReorg[] = [],\n\tscannedHeight: number | null = null,\n): ConsumerBatchContext<TTip, TReorg> {\n\tconst tipHeight = tip.block_height;\n\tconst position = scannedHeight ?? height;\n\treturn {\n\t\tcursor,\n\t\theight,\n\t\tscannedHeight: position,\n\t\ttipHeight,\n\t\tblocksBehind: position === null ? null : Math.max(0, tipHeight - position),\n\t\ttip,\n\t\treorgs,\n\t};\n}\n\n/** Options shared by both consume loops' page-fetch retry. Vocabulary matches\n * `@secondlayer/stacks` transports (`retryCount`/`retryDelay`) — one retry\n * language across the family, not a third. */\nexport type PageRetryOptions = {\n\t/** Retries after the first failure. Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base delay in ms; the n-th retry waits `retryDelay * n` (matches the\n\t * stacks transport). A server `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). The\n\t * retry policy owns the decision; this cannot change it. */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n};\n\n/** Sleep clamp for a server `Retry-After`: the loop honors the header up to\n * five minutes per attempt and keeps retrying within `retryCount`. It never\n * gives up early on a long Retry-After; the tradeoff is a long wait, not a\n * dropped loop. Set `retryCount: 0` to surface the 429 immediately instead. */\nconst MAX_RETRY_AFTER_MS = 300_000;\n\nfunction errRetryable(err: unknown): boolean {\n\t// SecondLayerError family carries an explicit signal; a bare TypeError is\n\t// the raw fetch network failure (Streams' fetchImpl isn't wrapped).\n\tif (err && typeof err === \"object\" && \"retryable\" in err) {\n\t\treturn (err as { retryable: unknown }).retryable === true;\n\t}\n\treturn err instanceof TypeError;\n}\n\nfunction errRetryAfterMs(err: unknown): number | undefined {\n\tif (err && typeof err === \"object\" && \"retryAfterSeconds\" in err) {\n\t\tconst seconds = (err as { retryAfterSeconds: unknown }).retryAfterSeconds;\n\t\tif (typeof seconds === \"number\" && Number.isFinite(seconds)) {\n\t\t\treturn Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Run one page fetch with retries. Scoped to the FETCH only — never the loop\n * body: retrying after an `onReorg`/`onBatch` throw would re-enter with\n * `handledReorgs` partially mutated and skip a rollback silently. `onBatch`\n * and `onReorg` throws always propagate to the caller.\n */\nexport async function fetchPageWithRetry<T>(\n\tfetchPage: () => Promise<T>,\n\topts: PageRetryOptions & { sleep: Sleep; signal?: AbortSignal },\n): Promise<T> {\n\tconst retryCount = opts.retryCount ?? 3;\n\tconst retryDelay = opts.retryDelay ?? 1000;\n\tfor (let attempt = 0; ; attempt++) {\n\t\ttry {\n\t\t\treturn await fetchPage();\n\t\t} catch (err) {\n\t\t\tconst retriesLeft = retryCount - attempt;\n\t\t\tif (retriesLeft <= 0 || !errRetryable(err) || opts.signal?.aborted) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tconst delayMs = errRetryAfterMs(err) ?? retryDelay * (attempt + 1);\n\t\t\topts.onError?.(err, { attempt, retriesLeft, delayMs });\n\t\t\tawait opts.sleep(delayMs, opts.signal);\n\t\t\t// Aborted mid-sleep: surface the original failure, not a fresh fetch.\n\t\t\tif (opts.signal?.aborted) throw err;\n\t\t}\n\t}\n}\n\nexport async function defaultSleep(\n\tms: number,\n\tsignal?: AbortSignal,\n): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tresolve();\n\t\t};\n\t\t// Detach on the timer path too: a tail at the tip sleeps once per\n\t\t// empty poll, and each sleep that left its listener behind pinned a\n\t\t// closure on the caller's long-lived signal until the process exited.\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nexport async function consumeStreamsEvents<TTx = never>(opts: {\n\tfromCursor?: string | null;\n\tmode?: \"tail\" | \"bounded\";\n\tfinalizedOnly?: boolean;\n\tbatchSize: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\t/** `GET /v1/streams/reorgs`, polled on idle (empty) pages so a reorg\n\t * that lands while the consumer sits at the tip is still rolled back.\n\t * Pages only carry reorgs overlapping their own span. */\n\tfetchReorgs?: (params: {\n\t\tsince: string;\n\t}) => Promise<StreamsReorgsListEnvelope>;\n\t/** Destination adapter owning checkpoint + rollback (see IndexConsumeOptions.sink). */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: ConsumerBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: { cursor: string | null },\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint. Default 1000. */\n\tmaxRollbackDepth?: number;\n\tsleep?: Sleep;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tretryCount?: number;\n\tretryDelay?: number;\n\tonError?: PageRetryOptions[\"onError\"];\n\tsignal?: AbortSignal;\n\t/** Cuts the empty-poll backoff short — see the field doc on\n\t * {@link StreamsEventsConsumeParams.wake} (same contract). */\n\twake?: () => Promise<void>;\n}): Promise<{ cursor: string | null; pages: number; emptyPolls: number }> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tconst mode = opts.mode ?? \"tail\";\n\tconst finalizedOnly = opts.finalizedOnly ?? false;\n\tconst emptyBackoffMs = opts.emptyBackoffMs ?? 500;\n\tconst maxPages = opts.maxPages ?? Number.POSITIVE_INFINITY;\n\tconst maxEmptyPolls = opts.maxEmptyPolls ?? Number.POSITIVE_INFINITY;\n\tassertSinkModeCompatible(opts.sink, finalizedOnly);\n\t// Resume order: explicit fromCursor, then the sink's committed checkpoint.\n\t// `loadCursor` is also the sink's INIT — it creates the checkpoint table and\n\t// validates the rollback precondition. Short-circuiting it on an explicit\n\t// `fromCursor` meant a replay-from-cursor run crashed on its first commit,\n\t// and skipped the height-column check that keeps reorg rollback from being\n\t// a silent no-op. Always initialize; `fromCursor` still wins as the resume\n\t// position.\n\tconst committedCursor = (await opts.sink?.loadCursor()) ?? null;\n\tlet cursor = opts.fromCursor ?? committedCursor;\n\t// In-memory only: rollback is idempotent, so a crash before the rewind is\n\t// re-detected and re-applied harmlessly on restart — no need to persist.\n\tconst handledReorgs = new Set<string>();\n\t// Resume token for the idle-tip reorg list; `null` until the first idle\n\t// poll with a checkpoint to seed it from.\n\tlet reorgSince: string | null = null;\n\tlet pages = 0;\n\tlet emptyPolls = 0;\n\t// Highest block reached, carried across empty pages so a caught-up tail\n\t// keeps reporting its position instead of dropping to null. Seeded from\n\t// the resume cursor: a restart into a quiet tail knows where it stands\n\t// before the first row lands.\n\tlet height: number | null = resumeHeight(cursor);\n\t// Highest block VERIFIED — how far the sweep is actually caught up, as\n\t// opposed to `height` (last delivered row). Starts at the resume position;\n\t// each page moves it (see below).\n\tlet scanned: number | null = height;\n\n\twhile (\n\t\tpages < maxPages &&\n\t\temptyPolls < maxEmptyPolls &&\n\t\t!opts.signal?.aborted\n\t) {\n\t\t// Retry wraps ONLY the page fetch: one transient 429/5xx must not kill\n\t\t// an hours-long backfill, and handler throws must never be re-entered.\n\t\tconst envelope = await fetchPageWithRetry(\n\t\t\t() =>\n\t\t\t\topts.fetchEvents({\n\t\t\t\t\tcursor,\n\t\t\t\t\tlimit: opts.batchSize,\n\t\t\t\t\ttypes: opts.types,\n\t\t\t\t\tnotTypes: opts.notTypes,\n\t\t\t\t\tcontractId: opts.contractId,\n\t\t\t\t\tsender: opts.sender,\n\t\t\t\t\trecipient: opts.recipient,\n\t\t\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\t\t\tfilters: opts.filters,\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tretryCount: opts.retryCount,\n\t\t\t\tretryDelay: opts.retryDelay,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tsleep,\n\t\t\t\tsignal: opts.signal,\n\t\t\t},\n\t\t);\n\t\tpages++;\n\n\t\t// Reorgs: roll back each new fork at or below the checkpoint, then\n\t\t// rewind to the lowest fork point and re-read the now-canonical run.\n\t\t// Finalized data never reorgs, so `finalizedOnly` skips this entirely.\n\t\t// A sink makes rollback UNCONDITIONAL: omitting `onReorg` used to skip\n\t\t// reorgs silently.\n\t\tconst reorgsOn = !finalizedOnly && Boolean(opts.onReorg || opts.sink);\n\t\tif (reorgsOn) {\n\t\t\tconst rewound = await applyReorgs({\n\t\t\t\treorgs: envelope.reorgs,\n\t\t\t\tcursor,\n\t\t\t\thandled: handledReorgs,\n\t\t\t\tkeyOf: reorgKey,\n\t\t\t\tsink: opts.sink,\n\t\t\t\tonReorg: opts.onReorg,\n\t\t\t\tmaxRollbackDepth: opts.maxRollbackDepth,\n\t\t\t});\n\t\t\tif (rewound) {\n\t\t\t\tcursor = rewound.cursor;\n\t\t\t\t// Everything at and above the fork is no longer canonical, so the\n\t\t\t\t// reached height rolls back with it — including the verified\n\t\t\t\t// position: the new chain above the fork is unread.\n\t\t\t\theight = rewound.forkPoint > 0 ? rewound.forkPoint - 1 : null;\n\t\t\t\tscanned = height;\n\t\t\t\temptyPolls = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Idle tip: a page only reports reorgs overlapping its own span, so a\n\t\t// fork that lands while the consumer sits at the tip (orphaning rows\n\t\t// BELOW the next non-empty page) is never on a page. On an empty page\n\t\t// ask the reorg list instead: one extra request per idle poll. Seeded\n\t\t// from the checkpoint cursor (the API reads a cursor as \"reorgs that\n\t\t// orphaned anything at or above this position\"), then advanced by the\n\t\t// list's own `next_since` token.\n\t\tif (reorgsOn && opts.fetchReorgs && envelope.events.length === 0) {\n\t\t\treorgSince ??= cursor;\n\t\t\tif (reorgSince !== null) {\n\t\t\t\tconst since: string = reorgSince;\n\t\t\t\tconst fetchReorgs = opts.fetchReorgs;\n\t\t\t\tconst listed: StreamsReorgsListEnvelope = await fetchPageWithRetry(\n\t\t\t\t\t() => fetchReorgs({ since }),\n\t\t\t\t\t{\n\t\t\t\t\t\tretryCount: opts.retryCount,\n\t\t\t\t\t\tretryDelay: opts.retryDelay,\n\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\tsleep,\n\t\t\t\t\t\tsignal: opts.signal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (listed.next_since !== null) reorgSince = listed.next_since;\n\t\t\t\tconst rewound = await applyReorgs({\n\t\t\t\t\treorgs: listed.reorgs,\n\t\t\t\t\tcursor,\n\t\t\t\t\thandled: handledReorgs,\n\t\t\t\t\tkeyOf: reorgKey,\n\t\t\t\t\tsink: opts.sink,\n\t\t\t\t\tonReorg: opts.onReorg,\n\t\t\t\t\tmaxRollbackDepth: opts.maxRollbackDepth,\n\t\t\t\t});\n\t\t\t\tif (rewound) {\n\t\t\t\t\tcursor = rewound.cursor;\n\t\t\t\t\theight = rewound.forkPoint > 0 ? rewound.forkPoint - 1 : null;\n\t\t\t\t\tscanned = height;\n\t\t\t\t\temptyPolls = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst emitted = finalizedOnly\n\t\t\t? envelope.events.filter((event) => event.finalized)\n\t\t\t: envelope.events;\n\t\t// Only advance to the last finalized event in finalizedOnly mode; the\n\t\t// unfinalized tail is re-read next poll until it settles.\n\t\tconst checkpoint = finalizedOnly\n\t\t\t? (emitted.at(-1)?.cursor ?? cursor)\n\t\t\t: envelope.next_cursor;\n\t\t// Ascending cursor order, so the last row is the highest block this page\n\t\t// reached; an empty page keeps the previous value.\n\t\theight = emitted.at(-1)?.block_height ?? height;\n\t\t// Verified position. Rows delivered → through the last row (the page\n\t\t// limit hides what's above it). Empty page with an ADVANCED cursor →\n\t\t// through that cursor only (a server may cap an expensive filtered\n\t\t// scan; claiming the tip would overstate). Truly empty page → the\n\t\t// server confirmed nothing matches up to the tip. Non-empty raw page\n\t\t// fully filtered (unfinalized tail) → position unchanged.\n\t\tif (emitted.length > 0) {\n\t\t\tscanned = height;\n\t\t} else if (checkpoint !== null && checkpoint !== cursor) {\n\t\t\tscanned = resumeHeight(checkpoint) ?? scanned;\n\t\t} else if (envelope.events.length === 0) {\n\t\t\tscanned = envelope.tip.block_height;\n\t\t}\n\n\t\t// An empty page reports the STANDING cursor, not null: the committed\n\t\t// checkpoint is still this consumer's position while it idles.\n\t\tconst ctx = batchContext(\n\t\t\tcheckpoint ?? cursor,\n\t\t\theight,\n\t\t\tenvelope.tip,\n\t\t\tenvelope.reorgs,\n\t\t\tscanned,\n\t\t);\n\t\t// Before any early return: an empty page still proves the loop is alive.\n\t\topts.onProgress?.(ctx);\n\n\t\tlet nextCursor: string | null;\n\t\tif (opts.sink) {\n\t\t\tconst sink = opts.sink;\n\t\t\t// Rows and cursor commit in ONE transaction; a handler throw aborts\n\t\t\t// both. Nothing moved → nothing to commit, handler not invoked.\n\t\t\tif (\n\t\t\t\tcheckpoint !== null &&\n\t\t\t\t(checkpoint !== cursor || emitted.length > 0)\n\t\t\t) {\n\t\t\t\tawait sink.commitBatch(checkpoint, async (tx) => {\n\t\t\t\t\t// The cast is sound exactly as far as the sink's own typing:\n\t\t\t\t\t// `sink: ConsumerSink<TTx>` binds TTx, and `tx` here is what its\n\t\t\t\t\t// commitBatch lends. Nothing verifies it at runtime — a sink whose\n\t\t\t\t\t// declared Tx lies about what it lends fails inside the handler.\n\t\t\t\t\tawait opts.onBatch(emitted, envelope, {\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\ttx,\n\t\t\t\t\t} as ConsumerBatchContext & WithSinkTx<TTx>);\n\t\t\t\t});\n\t\t\t}\n\t\t\tnextCursor = checkpoint;\n\t\t} else {\n\t\t\tconst returnedCursor = await opts.onBatch(\n\t\t\t\temitted,\n\t\t\t\tenvelope,\n\t\t\t\tctx as ConsumerBatchContext & WithSinkTx<TTx>,\n\t\t\t);\n\t\t\tif (finalizedOnly) assertFinalizedCheckpoint(returnedCursor, checkpoint);\n\t\t\tnextCursor = returnedCursor ?? checkpoint;\n\t\t}\n\n\t\tif (nextCursor && nextCursor !== cursor) {\n\t\t\tcursor = nextCursor;\n\t\t\temptyPolls = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (emitted.length === 0) {\n\t\t\temptyPolls++;\n\t\t\tif (mode === \"bounded\") {\n\t\t\t\treturn { cursor, pages, emptyPolls };\n\t\t\t}\n\t\t\t// The backoff timer always runs underneath — a `wake` that never\n\t\t\t// resolves, rejects (e.g. a dropped LISTEN connection), or isn't\n\t\t\t// supplied at all falls back to exactly the old poll-only behavior.\n\t\t\t// Racing (not replacing) it means a broken wake source degrades to\n\t\t\t// plain polling, never a stall. A rejection must NOT resolve the\n\t\t\t// race early — swallowing it into a promise that never settles (not\n\t\t\t// `.catch(() => {})`, which would resolve immediately and defeat the\n\t\t\t// backoff entirely) is what makes \"wake is broken\" behave exactly\n\t\t\t// like \"no wake at all\".\n\t\t\tawait (opts.wake\n\t\t\t\t? Promise.race([\n\t\t\t\t\t\tsleep(emptyBackoffMs, opts.signal),\n\t\t\t\t\t\topts.wake().catch(() => new Promise<never>(() => {})),\n\t\t\t\t\t])\n\t\t\t\t: sleep(emptyBackoffMs, opts.signal));\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn { cursor, pages, emptyPolls };\n\t}\n\n\treturn { cursor, pages, emptyPolls };\n}\n\n/**\n * Async-iterator form of the Streams pull loop, yielding one {@link StreamsBatch}\n * per fetched page. Each yield maps 1:1 onto a `GET /v1/streams/events` envelope\n * (`{ events, next_cursor, tip, reorgs }` → `{ events, cursor, tip, reorgs }`) —\n * no extra API calls, no regrouping. Pages with no events and no reorgs are not\n * yielded; the iterator sleeps `intervalMs` and re-polls the tip instead.\n */\nexport async function* iterateStreamsBatches(opts: {\n\tfromCursor?: string | null;\n\tbatchSize: number;\n\tintervalMs: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\tsleep?: Sleep;\n\tsignal?: AbortSignal;\n}): AsyncGenerator<StreamsBatch> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tlet cursor = opts.fromCursor ?? null;\n\n\twhile (!opts.signal?.aborted) {\n\t\tconst envelope = await opts.fetchEvents({\n\t\t\tcursor,\n\t\t\tlimit: opts.batchSize,\n\t\t\ttypes: opts.types,\n\t\t\tnotTypes: opts.notTypes,\n\t\t\tcontractId: opts.contractId,\n\t\t\tsender: opts.sender,\n\t\t\trecipient: opts.recipient,\n\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\tfilters: opts.filters,\n\t\t});\n\n\t\tconst checkpoint = envelope.next_cursor ?? cursor;\n\t\tif (envelope.events.length > 0 || envelope.reorgs.length > 0) {\n\t\t\tyield {\n\t\t\t\tevents: envelope.events,\n\t\t\t\tcursor: checkpoint,\n\t\t\t\ttip: envelope.tip,\n\t\t\t\treorgs: envelope.reorgs,\n\t\t\t};\n\t\t}\n\n\t\tconst advanced = checkpoint !== null && checkpoint !== cursor;\n\t\tcursor = checkpoint;\n\t\t// Caught up at the tip: wait one poll interval before re-reading.\n\t\tif (!advanced && envelope.events.length === 0) {\n\t\t\tif (opts.signal?.aborted) return;\n\t\t\tawait sleep(opts.intervalMs, opts.signal);\n\t\t}\n\t}\n}\n\nexport async function* streamStreamsEvents(opts: {\n\tfromCursor?: string | null;\n\tbatchSize: number;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups, forwarded to the server verbatim. */\n\tfilters?: StreamsFilterMap;\n\tfetchEvents: StreamsEventsFetcher;\n\tsleep?: Sleep;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n}): AsyncGenerator<StreamsEvent> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tconst emptyBackoffMs = opts.emptyBackoffMs ?? 500;\n\tconst maxPages = opts.maxPages ?? Number.POSITIVE_INFINITY;\n\tconst maxEmptyPolls = opts.maxEmptyPolls ?? Number.POSITIVE_INFINITY;\n\tlet cursor = opts.fromCursor ?? null;\n\tlet pages = 0;\n\tlet emptyPolls = 0;\n\n\twhile (\n\t\tpages < maxPages &&\n\t\temptyPolls < maxEmptyPolls &&\n\t\t!opts.signal?.aborted\n\t) {\n\t\tconst envelope = await opts.fetchEvents({\n\t\t\tcursor,\n\t\t\tlimit: opts.batchSize,\n\t\t\ttypes: opts.types,\n\t\t\tnotTypes: opts.notTypes,\n\t\t\tcontractId: opts.contractId,\n\t\t\tsender: opts.sender,\n\t\t\trecipient: opts.recipient,\n\t\t\tassetIdentifier: opts.assetIdentifier,\n\t\t\tfilters: opts.filters,\n\t\t});\n\t\tpages++;\n\n\t\tfor (const event of envelope.events) {\n\t\t\tif (opts.signal?.aborted) return;\n\t\t\tyield event;\n\t\t}\n\n\t\tconst nextCursor = envelope.next_cursor;\n\t\tif (nextCursor && nextCursor !== cursor) {\n\t\t\tcursor = nextCursor;\n\t\t\temptyPolls = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (envelope.events.length === 0) {\n\t\t\temptyPolls++;\n\t\t\tif (emptyPolls >= maxEmptyPolls || pages >= maxPages) return;\n\t\t\tawait sleep(emptyBackoffMs, opts.signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn;\n\t}\n}\n",
|
|
13
13
|
"import type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\nimport {\n\ttype PageRetryOptions,\n\ttype Sleep,\n\tapplyReorgs,\n\tassertFinalizedCheckpoint,\n\tassertSinkModeCompatible,\n\tbatchContext,\n\tdefaultSleep,\n\tfetchPageWithRetry,\n\tresumeHeight,\n} from \"../streams/consumer.ts\";\nimport type { ConsumerBatchContext } from \"../streams/types.ts\";\nimport type { IndexReorg, IndexTip } from \"./client.ts\";\n\n/** Minimum shape a consumed Index row must expose. */\nexport type IndexFeedItem = { cursor: string; block_height: number };\n\n/** Minimum envelope shape of a consumable Index feed page. */\nexport type IndexFeedEnvelope = {\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\treorgs: IndexReorg[];\n};\n\n/** One page fetch. `fromHeight` is only set on the first page of a fresh\n * consume (no cursor yet) — cursor and from_height are mutually exclusive\n * on the API. */\nexport type IndexFeedFetcher<TEnvelope extends IndexFeedEnvelope> = (params: {\n\tcursor: string | null;\n\tfromHeight?: number;\n\tlimit: number;\n}) => Promise<TEnvelope>;\n\n/** Consumer options shared by `index.events.consume` and\n * `index.contractCalls.consume`. Same contract as the Streams consumer:\n * commit your writes inside `onBatch`, return the cursor you committed —\n * or attach a `sink` and let it own checkpointing and rollback entirely. */\nexport type IndexConsumeOptions<\n\tTItem extends IndexFeedItem,\n\tTEnvelope extends IndexFeedEnvelope,\n\tTTx = never,\n> = {\n\t/** Resume from a committed checkpoint. Without it (and without\n\t * `fromHeight`) the API serves only the recent default window. */\n\tfromCursor?: string | null;\n\t/** Start a fresh sweep at this height (e.g. `0` for genesis backfill).\n\t * Ignored once a cursor exists (including a sink's committed cursor). */\n\tfromHeight?: number;\n\t/** `tail` (default) keeps polling at the tip; `bounded` returns on the\n\t * first empty page. */\n\tmode?: \"tail\" | \"bounded\";\n\t/** Emit only rows at or below the tip's `finalized_height`; the\n\t * unfinalized tail is re-read each poll until it settles. Finalized data\n\t * never reorgs, so `onReorg` is skipped entirely. */\n\tfinalizedOnly?: boolean;\n\tbatchSize?: number;\n\t/**\n\t * Destination adapter that owns the checkpoint + rollback transaction\n\t * (e.g. `kyselySink` from `@secondlayer/sdk/sinks/kysely`). With a sink:\n\t * the loop resumes from the sink's committed cursor, `onBatch` receives\n\t * `ctx.tx` and must write ONLY through it (rows and cursor commit in one\n\t * transaction — a throw aborts both), reorg rollback is automatic (no\n\t * `onReorg` needed), and `onBatch`'s return value is ignored. Folds\n\t * (balances) invert in the sink's `onRollback`, not in `onReorg`.\n\t */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and before any early return —\n\t * an empty page still proves the loop is alive. Feed it to\n\t * `consumerHealth().record`. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tonBatch: (\n\t\titems: TItem[],\n\t\tenvelope: TEnvelope,\n\t\tctx: ConsumerBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\t/** Called once per new reorg at or below the checkpoint, before the loop\n\t * rewinds to `ctx.cursor` (`null` = pre-genesis) and re-reads. A reorg\n\t * whose fork sits ABOVE the checkpoint is not a rollback: nothing past\n\t * it was written, so it is noted and the page is read as normal. */\n\tonReorg?: (\n\t\treorg: IndexReorg,\n\t\tctx: { cursor: string | null },\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint before the loop\n\t * refuses with `ValidationError`. Default 1000 blocks. The fork point is\n\t * server supplied and drives a delete on every declared table, so raise\n\t * this only for a source you trust. */\n\tmaxRollbackDepth?: number;\n\tsleep?: Sleep;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/** Page-fetch retries after the first failure (429/5xx/network only —\n\t * 4xx and handler throws always propagate). Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base retry delay in ms; the n-th retry waits `retryDelay * n`. A server\n\t * `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep. Cannot change the retry\n\t * decision — the policy owns it. */\n\tonError?: PageRetryOptions[\"onError\"];\n};\n\n/**\n * Checkpointed pull loop over a cursor-paginated Index feed — the Index port\n * of `consumeStreamsEvents`, sharing its contract: at-least-once delivery,\n * client-owned checkpoints (`onBatch` may return the cursor it committed),\n * and automatic reorg rewind to the lowest fresh fork point.\n *\n * Differs from Streams in how finality is read: Index rows carry no\n * per-event `finalized` flag, so `finalizedOnly` gates by\n * `block_height <= tip.finalized_height` instead.\n */\nexport async function consumeIndexFeed<\n\tTItem extends IndexFeedItem,\n\tTEnvelope extends IndexFeedEnvelope,\n\tTTx = never,\n>(\n\topts: IndexConsumeOptions<TItem, TEnvelope, TTx> & {\n\t\tfetchPage: IndexFeedFetcher<TEnvelope>;\n\t\titemsOf: (envelope: TEnvelope) => TItem[];\n\t},\n): Promise<{ cursor: string | null; pages: number; emptyPolls: number }> {\n\tconst sleep = opts.sleep ?? defaultSleep;\n\tconst mode = opts.mode ?? \"tail\";\n\tconst finalizedOnly = opts.finalizedOnly ?? false;\n\tconst batchSize = opts.batchSize ?? 200;\n\tconst emptyBackoffMs = opts.emptyBackoffMs ?? 500;\n\tconst maxPages = opts.maxPages ?? Number.POSITIVE_INFINITY;\n\tconst maxEmptyPolls = opts.maxEmptyPolls ?? Number.POSITIVE_INFINITY;\n\tassertSinkModeCompatible(opts.sink, finalizedOnly);\n\t// Resume order: explicit fromCursor, then the sink's committed checkpoint.\n\t// `loadCursor` is also the sink's INIT — it creates the checkpoint table and\n\t// validates the rollback precondition. Short-circuiting it on an explicit\n\t// `fromCursor` meant a replay-from-cursor run crashed on its first commit,\n\t// and skipped the height-column check that keeps reorg rollback from being\n\t// a silent no-op. Always initialize; `fromCursor` still wins as the resume\n\t// position.\n\tconst committedCursor = (await opts.sink?.loadCursor()) ?? null;\n\tlet cursor = opts.fromCursor ?? committedCursor;\n\t// In-memory only: rollback is idempotent, so a crash before the rewind is\n\t// re-detected and re-applied harmlessly on restart — no need to persist.\n\tconst handledReorgs = new Set<string>();\n\tlet pages = 0;\n\tlet emptyPolls = 0;\n\t// Highest block reached, carried across empty pages so a caught-up tail\n\t// keeps reporting its position instead of dropping to null. Seeded from\n\t// the resume cursor: a restart into a quiet tail knows where it stands\n\t// before the first row lands.\n\tlet height: number | null = resumeHeight(cursor);\n\t// Highest block VERIFIED — how far the sweep is actually caught up, as\n\t// opposed to `height` (last delivered row). Starts at the resume position;\n\t// each page moves it (see below).\n\tlet scanned: number | null = height;\n\n\twhile (\n\t\tpages < maxPages &&\n\t\temptyPolls < maxEmptyPolls &&\n\t\t!opts.signal?.aborted\n\t) {\n\t\t// Retry wraps ONLY the page fetch: one transient 429/5xx must not kill\n\t\t// an hours-long backfill, and handler throws must never be re-entered\n\t\t// (retrying past a thrown onReorg would skip its rollback silently).\n\t\tconst envelope = await fetchPageWithRetry(\n\t\t\t() =>\n\t\t\t\topts.fetchPage({\n\t\t\t\t\tcursor,\n\t\t\t\t\tfromHeight: cursor === null ? opts.fromHeight : undefined,\n\t\t\t\t\tlimit: batchSize,\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tretryCount: opts.retryCount,\n\t\t\t\tretryDelay: opts.retryDelay,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tsleep,\n\t\t\t\tsignal: opts.signal,\n\t\t\t},\n\t\t);\n\t\tpages++;\n\n\t\t// Reorgs: roll back each new fork at or below the checkpoint, then\n\t\t// rewind to the lowest fork point and re-read the now-canonical run.\n\t\t// Finalized data never reorgs, so `finalizedOnly` skips this entirely.\n\t\t// A sink makes rollback UNCONDITIONAL: omitting `onReorg` used to skip\n\t\t// reorgs silently. Index has no reorg list route, so a fork that lands\n\t\t// while idling at the tip is only seen once a page overlaps it.\n\t\tif (!finalizedOnly && (opts.onReorg || opts.sink)) {\n\t\t\tconst rewound = await applyReorgs({\n\t\t\t\treorgs: envelope.reorgs,\n\t\t\t\tcursor,\n\t\t\t\thandled: handledReorgs,\n\t\t\t\tkeyOf: (reorg) => reorg.id,\n\t\t\t\tsink: opts.sink,\n\t\t\t\tonReorg: opts.onReorg,\n\t\t\t\tmaxRollbackDepth: opts.maxRollbackDepth,\n\t\t\t});\n\t\t\tif (rewound) {\n\t\t\t\tcursor = rewound.cursor;\n\t\t\t\t// Everything at and above the fork is no longer canonical, so the\n\t\t\t\t// reached height rolls back with it — including the verified\n\t\t\t\t// position: the new chain above the fork is unread.\n\t\t\t\theight = rewound.forkPoint > 0 ? rewound.forkPoint - 1 : null;\n\t\t\t\tscanned = height;\n\t\t\t\temptyPolls = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tconst items = opts.itemsOf(envelope);\n\t\tconst emitted = finalizedOnly\n\t\t\t? items.filter(\n\t\t\t\t\t(item) => item.block_height <= envelope.tip.finalized_height,\n\t\t\t\t)\n\t\t\t: items;\n\t\t// Only advance to the last finalized row in finalizedOnly mode; the\n\t\t// unfinalized tail is re-read next poll until it settles.\n\t\tconst checkpoint = finalizedOnly\n\t\t\t? (emitted.at(-1)?.cursor ?? cursor)\n\t\t\t: envelope.next_cursor;\n\t\t// Ascending cursor order, so the last row is the highest block this page\n\t\t// reached; an empty page keeps the previous value.\n\t\theight = emitted.at(-1)?.block_height ?? height;\n\t\t// Verified position. Rows delivered → through the last row (the page\n\t\t// limit hides what's above it). Empty page with an ADVANCED cursor →\n\t\t// through that cursor only (a server may cap an expensive filtered\n\t\t// scan; claiming the tip would overstate). Truly empty → the server\n\t\t// confirmed nothing matches up to the boundary — the finalized height\n\t\t// in finalizedOnly mode (the unfinalized tail is deliberately unread),\n\t\t// the tip otherwise.\n\t\tif (emitted.length > 0) {\n\t\t\tscanned = height;\n\t\t} else if (checkpoint !== null && checkpoint !== cursor) {\n\t\t\tscanned = resumeHeight(checkpoint) ?? scanned;\n\t\t} else {\n\t\t\tscanned = finalizedOnly\n\t\t\t\t? envelope.tip.finalized_height\n\t\t\t\t: envelope.tip.block_height;\n\t\t}\n\n\t\t// An empty page reports the STANDING cursor, not null: the committed\n\t\t// checkpoint is still this consumer's position while it idles.\n\t\tconst ctx = batchContext(\n\t\t\tcheckpoint ?? cursor,\n\t\t\theight,\n\t\t\tenvelope.tip,\n\t\t\tenvelope.reorgs,\n\t\t\tscanned,\n\t\t);\n\t\t// Before any early return: an empty page still proves the loop is alive.\n\t\topts.onProgress?.(ctx);\n\n\t\tlet nextCursor: string | null;\n\t\tif (opts.sink) {\n\t\t\tconst sink = opts.sink;\n\t\t\t// Rows and cursor commit in ONE transaction; a handler throw aborts\n\t\t\t// both, so the crashed batch is simply re-read on restart. When the\n\t\t\t// page moved nothing (same checkpoint, no rows) there is nothing to\n\t\t\t// commit and the handler is not invoked.\n\t\t\tif (\n\t\t\t\tcheckpoint !== null &&\n\t\t\t\t(checkpoint !== cursor || emitted.length > 0)\n\t\t\t) {\n\t\t\t\tawait sink.commitBatch(checkpoint, async (tx) => {\n\t\t\t\t\t// The cast is sound exactly as far as the sink's own typing:\n\t\t\t\t\t// `sink: ConsumerSink<TTx>` binds TTx, and `tx` here is what its\n\t\t\t\t\t// commitBatch lends. Nothing verifies it at runtime — a sink whose\n\t\t\t\t\t// declared Tx lies about what it lends fails inside the handler.\n\t\t\t\t\tawait opts.onBatch(emitted, envelope, {\n\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\ttx,\n\t\t\t\t\t} as ConsumerBatchContext & WithSinkTx<TTx>);\n\t\t\t\t});\n\t\t\t}\n\t\t\tnextCursor = checkpoint;\n\t\t} else {\n\t\t\tconst returnedCursor = await opts.onBatch(\n\t\t\t\temitted,\n\t\t\t\tenvelope,\n\t\t\t\tctx as ConsumerBatchContext & WithSinkTx<TTx>,\n\t\t\t);\n\t\t\tif (finalizedOnly) assertFinalizedCheckpoint(returnedCursor, checkpoint);\n\t\t\tnextCursor = returnedCursor ?? checkpoint;\n\t\t}\n\n\t\tif (nextCursor && nextCursor !== cursor) {\n\t\t\tcursor = nextCursor;\n\t\t\temptyPolls = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (emitted.length === 0) {\n\t\t\temptyPolls++;\n\t\t\tif (mode === \"bounded\") {\n\t\t\t\treturn { cursor, pages, emptyPolls };\n\t\t\t}\n\t\t\tawait sleep(emptyBackoffMs, opts.signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn { cursor, pages, emptyPolls };\n\t}\n\n\treturn { cursor, pages, emptyPolls };\n}\n",
|
|
14
14
|
"import type { Pox5EventTopic } from \"@secondlayer/stacks/pox5\";\nimport type { SbtcEventTopic } from \"@secondlayer/stacks/sbtc\";\nimport type { InferredTopicSchema } from \"@secondlayer/subgraphs\";\nimport { BaseClient, abortError, buildQuery } from \"../base.ts\";\nimport type { SecondLayerOptions } from \"../base.ts\";\nimport { ValidationError } from \"../errors.ts\";\nimport type { TransactionProof } from \"../proofs.ts\";\nimport type { ConsumerSink } from \"../sinks/types.ts\";\nimport {\n\ttype PageRetryOptions,\n\tdefaultSleep,\n\tfetchPageWithRetry,\n} from \"../streams/consumer.ts\";\nimport { type IndexConsumeOptions, consumeIndexFeed } from \"./consumer.ts\";\n\nexport type IndexTip = {\n\tblock_height: number;\n\t/** Highest height treated as immutable (past the burn-confirmation\n\t * finality boundary). Rows at or below it never reorg — `finalizedOnly`\n\t * consumers gate on this, since Index rows carry no per-event flag. */\n\tfinalized_height: number;\n\tlag_seconds: number;\n};\n\n/**\n * A chain reorg overlapping a returned page's height range. Height-keyed feeds\n * (`/transactions`, `/contract-calls`, `/stacking`) populate this so a consumer\n * can reconcile: roll back every row at `block_height >= fork_point_height`\n * (the whole fork block is replaced, so the rollback is inclusive of the fork\n * height), then re-read the canonical run from the foot of `fork_point_height`.\n * The SDK consumers do exactly this — they rewind to `Cursor.atHeight(\n * fork_point_height)`, an exclusive cursor that re-reads from `fork:0`\n * inclusive. Empty when the page spans no reorg.\n */\nexport type IndexReorg = {\n\tid: string;\n\tdetected_at: string;\n\tfork_point_height: number;\n\told_index_block_hash: string | null;\n\tnew_index_block_hash: string | null;\n\t/** Orphaned cursor span `<block_height>:<tx_index>`, inclusive. */\n\torphaned_range: { from: string; to: string };\n\t/**\n\t * First position of the new canonical chain at the fork, `fork:0`\n\t * (INCLUSIVE). Not an exclusive resume token — resuming a `(bh,ei) > cursor`\n\t * read directly from it would skip `fork:0`. To re-read the new run, rewind\n\t * to the foot of `fork_point_height` (`Cursor.atHeight`), not to this value.\n\t */\n\tnew_canonical_tip: string;\n};\n\nexport type FtTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_transfer\";\n\tcontract_id: string;\n\tasset_identifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n};\n\nexport type FtTransfersEnvelope<TRow = FtTransfer> = {\n\tevents: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n};\n\n/** Transfer columns that survive any projection — the consume contract\n * (`cursor`, `block_height`) plus the `event_type` discriminant. */\nexport type FtTransferAlwaysFields = \"cursor\" | \"block_height\" | \"event_type\";\n\n/** An ft-transfer row narrowed to the requested columns plus the always-present ones. */\nexport type FtTransferFields<F extends keyof FtTransfer & string> = Pick<\n\tFtTransfer,\n\t(F | FtTransferAlwaysFields) & keyof FtTransfer\n>;\n\nexport type FtTransfersListParams = {\n\t/**\n\t * Columns to return. The server projects the row, so an unrequested column\n\t * is physically absent — and the narrowing overload on `list` makes reading\n\t * one a compile error rather than `undefined` at runtime. Omitting\n\t * `block_time` also lets the server skip the blocks join.\n\t */\n\tfields?: readonly (keyof FtTransfer & string)[];\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tcontractId?: string;\n\tassetIdentifier?: string;\n\tsender?: string;\n\trecipient?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\n/** Largest page any Index list route serves. The server clamps `limit` above\n * this without saying so, so `walk` refuses a bigger `batchSize` up front\n * rather than paging in silently smaller steps. */\nexport const INDEX_MAX_PAGE_SIZE = 1000;\n\n/** Options every `walk*` feed shares on top of its list filters. Page fetches\n * retry with the same `retryCount`/`retryDelay`/`onError` vocabulary as\n * `consume()`; the tradeoff is that a walk can pause for the retry delays\n * instead of failing fast on the first 429. */\nexport type WalkOptions = PageRetryOptions & {\n\t/** Rows per page request. Default 200, max `INDEX_MAX_PAGE_SIZE` (1000). */\n\tbatchSize?: number;\n\t/** Stops the walk. The iterator always rejects with the signal's reason (an\n\t * `AbortError` by default), whether the abort lands during a page request\n\t * (which is cancelled) or between yields, so a caller can tell a finished\n\t * walk from a stopped one. */\n\tsignal?: AbortSignal;\n};\n\n/** Per-request signal the private list methods thread into `request`. */\ntype RequestSignal = { signal?: AbortSignal };\n\nexport type FtTransfersWalkParams = Omit<FtTransfersListParams, \"limit\"> &\n\tWalkOptions;\n\nexport type NftTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_transfer\";\n\tcontract_id: string;\n\tasset_identifier: string;\n\tsender: string;\n\trecipient: string;\n\tvalue: string;\n};\n\nexport type NftTransfersEnvelope<TRow = NftTransfer> = {\n\tevents: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n};\n\n/** See {@link FtTransferAlwaysFields}. */\nexport type NftTransferAlwaysFields = \"cursor\" | \"block_height\" | \"event_type\";\n\n/** An nft-transfer row narrowed to the requested columns plus the always-present ones. */\nexport type NftTransferFields<F extends keyof NftTransfer & string> = Pick<\n\tNftTransfer,\n\t(F | NftTransferAlwaysFields) & keyof NftTransfer\n>;\n\nexport type NftTransfersListParams = {\n\t/** Columns to return (see {@link FtTransfersListParams.fields}). */\n\tfields?: readonly (keyof NftTransfer & string)[];\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tcontractId?: string;\n\tassetIdentifier?: string;\n\tsender?: string;\n\trecipient?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type NftTransfersWalkParams = Omit<NftTransfersListParams, \"limit\"> &\n\tWalkOptions;\n\n// ── Generic decoded events (/v1/index/events) ──────────────────────\n\ntype IndexEventBase = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tcontract_id: string | null;\n\t/** Submitting-transaction context, present only when `txContext: true` was\n\t * requested. `tx_sender` is the real tx sender — distinct from a transfer's\n\t * asset `sender`, and the only place a `print` event's sender is available.\n\t * Lets a consumer build per-event tx context without a `/v1/index/transactions`\n\t * call per event. */\n\ttx_sender?: string | null;\n\ttx_type?: string | null;\n\ttx_status?: string | null;\n\ttx_contract_id?: string | null;\n\ttx_function_name?: string | null;\n};\n\nexport type IndexFtTransfer = IndexEventBase & {\n\tevent_type: \"ft_transfer\";\n\tasset_identifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n};\nexport type IndexNftTransfer = IndexEventBase & {\n\tevent_type: \"nft_transfer\";\n\tasset_identifier: string;\n\tsender: string;\n\trecipient: string;\n\tvalue: string;\n};\nexport type IndexStxTransfer = IndexEventBase & {\n\tevent_type: \"stx_transfer\";\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n\tmemo: string | null;\n};\nexport type IndexStxMint = IndexEventBase & {\n\tevent_type: \"stx_mint\";\n\trecipient: string;\n\tamount: string;\n};\nexport type IndexStxBurn = IndexEventBase & {\n\tevent_type: \"stx_burn\";\n\tsender: string;\n\tamount: string;\n};\nexport type IndexStxLock = IndexEventBase & {\n\tevent_type: \"stx_lock\";\n\tsender: string;\n\tamount: string;\n\tpayload: { unlock_height: string | null };\n};\nexport type IndexFtMint = IndexEventBase & {\n\tevent_type: \"ft_mint\";\n\tasset_identifier: string;\n\trecipient: string;\n\tamount: string;\n};\nexport type IndexFtBurn = IndexEventBase & {\n\tevent_type: \"ft_burn\";\n\tasset_identifier: string;\n\tsender: string;\n\tamount: string;\n};\nexport type IndexNftMint = IndexEventBase & {\n\tevent_type: \"nft_mint\";\n\tasset_identifier: string;\n\trecipient: string;\n\tvalue: string;\n};\nexport type IndexNftBurn = IndexEventBase & {\n\tevent_type: \"nft_burn\";\n\tasset_identifier: string;\n\tsender: string;\n\tvalue: string;\n};\nexport type IndexPrint = IndexEventBase & {\n\tevent_type: \"print\";\n\tpayload: { topic: string | null; value: unknown; raw_value: string | null };\n};\n\nexport type IndexNestedContractCall = IndexEventBase & {\n\tevent_type: \"nested_contract_call\";\n\tsender: string | null;\n\tcaller: string;\n\tfunction_name: string;\n\tfunction_args: unknown;\n\traw_result: string | null;\n};\nexport type IndexVarSet = IndexEventBase & {\n\tevent_type: \"var_set\";\n\tvar_name: string;\n\traw_value: string;\n};\nexport type IndexMapSet = IndexEventBase & {\n\tevent_type: \"map_set\";\n\tmap: string;\n\traw_key: string;\n\traw_value: string;\n};\nexport type IndexMapInsert = IndexEventBase & {\n\tevent_type: \"map_insert\";\n\tmap: string;\n\traw_key: string;\n\traw_value: string;\n};\nexport type IndexMapDelete = IndexEventBase & {\n\tevent_type: \"map_delete\";\n\tmap: string;\n\traw_key: string;\n};\n\n/** Decoded chain event, discriminated by `event_type`. */\nexport type IndexEvent =\n\t| IndexFtTransfer\n\t| IndexNftTransfer\n\t| IndexStxTransfer\n\t| IndexStxMint\n\t| IndexStxBurn\n\t| IndexStxLock\n\t| IndexFtMint\n\t| IndexFtBurn\n\t| IndexNftMint\n\t| IndexNftBurn\n\t| IndexPrint\n\t| IndexNestedContractCall\n\t| IndexVarSet\n\t| IndexMapSet\n\t| IndexMapInsert\n\t| IndexMapDelete;\n\nexport type IndexEventType = IndexEvent[\"event_type\"];\n\n/** Fields every read returns regardless of `fields` — the consume contract\n * (`cursor`, `block_height`) plus the union discriminant. */\nexport type IndexAlwaysFields = \"cursor\" | \"block_height\" | \"event_type\";\n\n/** An event row narrowed to a `fields` selection (plus what always ships). */\nexport type IndexEventFields<\n\tT extends IndexEventType,\n\tF extends keyof IndexEventOf<T> & string,\n> = Pick<IndexEventOf<T>, (F | IndexAlwaysFields) & keyof IndexEventOf<T>>;\n\nexport type EventsEnvelope<\n\tT extends IndexEventType = IndexEventType,\n\tTRow = IndexEventOf<T>,\n> = {\n\tevents: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n};\n\n/** The single decoded-event member matching one `event_type` literal.\n * `IndexEventOf<\"ft_transfer\">` is `IndexFtTransfer`. */\nexport type IndexEventOf<T extends IndexEventType> = Extract<\n\tIndexEvent,\n\t{ event_type: T }\n>;\n\nexport type EventsListParams<T extends IndexEventType = IndexEventType> = {\n\t/** Decoded types or VM types (`nested_contract_call`, `map_set`, …). */\n\teventType: T;\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\t/** One id, or several to scope the sweep to a set of contracts (max 20).\n\t * Mutually exclusive with `trait`. */\n\tcontractId?: string | readonly string[];\n\tassetIdentifier?: string;\n\tsender?: string;\n\trecipient?: string;\n\tfunctionName?: string;\n\tcaller?: string;\n\tmap?: string;\n\tvarName?: string;\n\t/** Restrict to one transaction. */\n\ttxId?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\t/** Restrict to contracts conforming to a trait/standard (e.g. \"sip-010\").\n\t * Mutually exclusive with contractId; contract-keyed event types only. */\n\ttrait?: string;\n\t/** Join the submitting transaction into each event — populates `tx_sender`,\n\t * `tx_type`, `tx_status`, `tx_contract_id`, `tx_function_name`. Off by default.\n\t * Avoids a `/v1/index/transactions` call per event; for `print` events it's\n\t * the only source of the submitting sender. */\n\ttxContext?: boolean;\n\t/**\n\t * Return only these columns. The server projects the SELECT, so an\n\t * unrequested field is physically absent — and the returned row type\n\t * narrows to match, making a read of one a compile error rather than\n\t * `undefined`.\n\t *\n\t * `cursor`, `block_height`, and `event_type` come back regardless: the\n\t * first two are the consume contract, the third carries the discriminant.\n\t * Don't list them.\n\t *\n\t * Cost note: this does NOT change your bill — Index meters per row read,\n\t * not per field. What it buys is wire bytes, plus skipping the `blocks`\n\t * join when `block_time` is omitted.\n\t */\n\tfields?: readonly (keyof IndexEventOf<T> & string)[];\n};\n\nexport type EventsWalkParams<T extends IndexEventType = IndexEventType> = Omit<\n\tEventsListParams<T>,\n\t\"limit\"\n> &\n\tWalkOptions;\n\nexport type EventsConsumeParams<\n\tT extends IndexEventType = IndexEventType,\n\tTTx = never,\n\t// `fields` is omitted deliberately: the consume loop builds its page\n\t// request field-by-field and never forwarded it, so accepting the option\n\t// meant it type-checked and was then silently dropped. Consuming a\n\t// projected row is a real want — it needs the loop to thread it AND the\n\t// handler's row type to narrow, which is a larger change than pretending\n\t// the option works.\n> = Omit<EventsListParams<T>, \"cursor\" | \"fromCursor\" | \"limit\" | \"fields\"> &\n\tIndexConsumeOptions<IndexEventOf<T>, EventsEnvelope<T>, TTx>;\n\n// ── Contract calls (/v1/index/contract-calls) ──────────────────────\n\nexport type IndexContractCall = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tcontract_id: string;\n\tfunction_name: string;\n\tsender: string;\n\tstatus: string;\n\targs: unknown[];\n\tresult: unknown;\n\tresult_hex: string | null;\n};\n\nexport type ContractCallsEnvelope = {\n\tcontract_calls: IndexContractCall[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n};\n\nexport type ContractCallsListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\t/** One id, or several to scope the sweep to a set of contracts (max 20).\n\t * Mutually exclusive with `trait`. */\n\tcontractId?: string | readonly string[];\n\tfunctionName?: string;\n\tsender?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\t/** Restrict to contracts conforming to a trait/standard (e.g. \"sip-010\").\n\t * Mutually exclusive with contractId. */\n\ttrait?: string;\n};\n\nexport type ContractCallsWalkParams = Omit<ContractCallsListParams, \"limit\"> &\n\tWalkOptions;\n\nexport type ContractCallsConsumeParams<TTx = never> = Omit<\n\tContractCallsListParams,\n\t\"cursor\" | \"fromCursor\" | \"limit\"\n> &\n\tIndexConsumeOptions<IndexContractCall, ContractCallsEnvelope, TTx>;\n\n// ── Canonical block-hash map (/v1/index/canonical) ─────────────────\n\n/** One canonical block in the sync map. Lean by design — block + parent hash\n * for chain linkage, burn anchor for Bitcoin confirmations. Use `blocks` for\n * the full block resource. */\nexport type IndexCanonicalBlock = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_hash: string;\n\tparent_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n};\n\nexport type CanonicalEnvelope = {\n\tcanonical: IndexCanonicalBlock[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n};\n\nexport type CanonicalListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type CanonicalWalkParams = Omit<CanonicalListParams, \"limit\"> &\n\tWalkOptions;\n\n// ── Blocks (/v1/index/blocks) ──────────────────────────────────────\n\n/** A block resource. Metadata is intentionally thin — only chain-linkage and\n * burn-anchor fields are persisted (no miner / tx_count / signer). */\nexport type IndexBlock = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_hash: string;\n\tparent_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\tblock_time: string | null;\n\tcanonical: boolean;\n};\n\nexport type BlocksEnvelope = {\n\tblocks: IndexBlock[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n};\n\nexport type BlockEnvelope = {\n\tblock: IndexBlock;\n\ttip: IndexTip;\n};\n\nexport type BlocksListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type BlocksWalkParams = Omit<BlocksListParams, \"limit\"> & WalkOptions;\n\n// ── Transactions (/v1/index/transactions) ──────────────────────────\n\n// Mirrors DecodedPostCondition in packages/api/src/index/transaction-decode.ts\n// (source of truth) — this type is hand-maintained, not generated, so the two\n// must move together.\nexport type IndexPostCondition =\n\t| {\n\t\t\ttype: \"stx\";\n\t\t\tprincipal: string;\n\t\t\tcondition_code: number;\n\t\t\tcondition_code_name: string | null;\n\t\t\tamount: string;\n\t }\n\t| {\n\t\t\ttype: \"ft\";\n\t\t\tprincipal: string;\n\t\t\tasset_identifier: string;\n\t\t\tcondition_code: number;\n\t\t\tcondition_code_name: string | null;\n\t\t\tamount: string;\n\t }\n\t| {\n\t\t\ttype: \"nft\";\n\t\t\tprincipal: string;\n\t\t\tasset_identifier: string;\n\t\t\tasset_value: unknown;\n\t\t\tcondition_code: number;\n\t\t\tcondition_code_name: string | null;\n\t }\n\t// SIP-045 (epoch 4.0 / pox-5): gates stake / register-for-bond / stake-update.\n\t| {\n\t\t\ttype: \"staking\";\n\t\t\tprincipal: string;\n\t\t\tcondition_code: number;\n\t\t\tcondition_code_name: string | null;\n\t\t\tamount: string;\n\t }\n\t// SIP-045 (epoch 4.0 / pox-5): gates non-locking PoX state changes, e.g.\n\t// unstake / announce-l1-early-exit. No amount — see PoxPostConditionWire.\n\t| {\n\t\t\ttype: \"pox\";\n\t\t\tprincipal: string;\n\t\t\tcondition_code: number;\n\t\t\tcondition_code_name: string | null;\n\t };\n\n/** Full transaction document: columnar fields plus `raw_tx`-decoded enrichment.\n * Payload sub-objects are present only for the matching `tx_type`; enrichment\n * fields are null when `raw_tx` isn't decodable (e.g. burnchain ops). */\nexport type IndexTransaction = {\n\tcursor: string;\n\ttx_id: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_index: number;\n\ttx_type: string;\n\tsender: string;\n\tstatus: string;\n\tfee: string | null;\n\tnonce: string | null;\n\tsponsored: boolean | null;\n\tanchor_mode: string | null;\n\tpost_condition_mode: string | null;\n\tpost_conditions: IndexPostCondition[];\n\tcontract_call?: {\n\t\tcontract_id: string;\n\t\tfunction_name: string;\n\t\tfunction_args: unknown[];\n\t\t/** Raw hex-encoded ClarityValues; decode(function_args_hex[i]) === function_args[i]. */\n\t\tfunction_args_hex: string[];\n\t\tresult: unknown;\n\t\tresult_hex: string | null;\n\t};\n\ttoken_transfer?: { recipient: string; amount: string; memo: string };\n\tsmart_contract?: {\n\t\tcontract_id: string | null;\n\t\tclarity_version: number | null;\n\t};\n\tcoinbase?: { alt_recipient: string | null };\n\ttenure_change?: { cause: number };\n};\n\nexport type TransactionsEnvelope<TRow = IndexTransaction> = {\n\ttransactions: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n};\n\nexport type TransactionEnvelope = {\n\ttransaction: IndexTransaction;\n\ttip: IndexTip;\n};\n\n/** Transaction columns that survive any projection. */\nexport type TransactionAlwaysFields = \"cursor\" | \"block_height\" | \"tx_id\";\n\n/** A Transaction row narrowed to the requested columns plus the always-present ones. */\nexport type TransactionFields<F extends keyof IndexTransaction & string> = Pick<\n\tIndexTransaction,\n\t(F | TransactionAlwaysFields) & keyof IndexTransaction\n>;\n\nexport type TransactionsListParams = {\n\t/**\n\t * Columns to return. The server projects the row, so an unrequested column\n\t * is physically absent — and the narrowing overload on `list` makes reading\n\t * one a compile error rather than `undefined` at runtime.\n\t */\n\tfields?: readonly (keyof IndexTransaction & string)[];\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\ttype?: string;\n\tsender?: string;\n\tcontractId?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type TransactionsWalkParams = Omit<TransactionsListParams, \"limit\"> &\n\tWalkOptions;\n\n// ── Stacking (/v1/index/stacking) ──────────────────────────────────\n\n/** A decoded PoX-4 stacking action (one per stacking contract call). */\nexport type IndexStackingAction = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\tburn_block_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tfunction_name: string;\n\tcaller: string;\n\tstacker: string | null;\n\tdelegate_to: string | null;\n\tamount_ustx: string | null;\n\tlock_period: number | null;\n\tpox_addr: {\n\t\tversion: number | null;\n\t\thashbytes: string | null;\n\t\tbtc: string | null;\n\t};\n\tstart_cycle: number | null;\n\tend_cycle: number | null;\n\treward_cycle: number | null;\n\tsigner_key: string | null;\n\tresult_ok: boolean;\n};\n\nexport type StackingEnvelope = {\n\tstacking: IndexStackingAction[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n\t/** Present only when the PoX-4 decoder is disabled, explaining an empty feed. */\n\tnotes?: string;\n};\n\nexport type StackingListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tfunctionName?: string;\n\tstacker?: string;\n\tcaller?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type StackingWalkParams = Omit<StackingListParams, \"limit\"> &\n\tWalkOptions;\n\n// ── Mempool (/v1/index/mempool) ────────────────────────────────────\n\n/** A pending (unconfirmed) transaction. Like a transaction document but\n * pre-chain — no block_height/tx_index/result/events — with `received_at` and\n * a sequence cursor instead of a block position. */\nexport type IndexMempoolTransaction = {\n\tcursor: string;\n\ttx_id: string;\n\ttx_type: string;\n\tsender: string;\n\treceived_at?: string | null;\n\tfee: string | null;\n\tnonce: string | null;\n\tsponsored: boolean | null;\n\tanchor_mode: string | null;\n\tpost_condition_mode: string | null;\n\tpost_conditions: IndexPostCondition[];\n\tcontract_call?: {\n\t\tcontract_id: string;\n\t\tfunction_name: string;\n\t\tfunction_args: unknown[];\n\t};\n\ttoken_transfer?: { recipient: string; amount: string; memo: string };\n\tsmart_contract?: { clarity_version: number | null };\n\tcoinbase?: { alt_recipient: string | null };\n\ttenure_change?: { cause: number };\n};\n\nexport type MempoolEnvelope = {\n\tmempool: IndexMempoolTransaction[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n};\n\nexport type MempoolTransactionEnvelope = {\n\ttransaction: IndexMempoolTransaction;\n\ttip: IndexTip;\n};\n\nexport type MempoolListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tsender?: string;\n\ttype?: string;\n\t/** Filter to pending calls to a single contract (e.g. `SP….contract`). */\n\tcontractId?: string;\n\t/** Filter to pending calls to a single function (composes with `contractId`). */\n\tfunctionName?: string;\n};\n\nexport type MempoolWalkParams = Omit<MempoolListParams, \"limit\"> & WalkOptions;\n\n// ── Print schema (/v1/index/contracts/:contract_id/print-schema) ───\n\n/**\n * Empirical per-topic print payload schema for a contract, inferred from\n * sampled on-chain events. `topics` is sorted by count desc; `sampled` is true\n * when the contract has more print events than the windows examined.\n */\nexport type PrintSchemaResponse = {\n\tcontract_id: string;\n\ttopics: InferredTopicSchema[];\n\tsampled: boolean;\n\ttotal_events: number;\n\t/** True when the count hit the server-side cap (total_events is the cap). */\n\ttotal_events_capped: boolean;\n\tsample: {\n\t\tsize: number;\n\t\tnewest_height: number | null;\n\t\toldest_height: number | null;\n\t};\n\ttip: IndexTip;\n};\n\n// ── sBTC peg (/v1/index/sbtc) ──────────────────────────────────────\n\n/** The decoded `sbtc_events` topics — one source of truth in\n * `@secondlayer/stacks/sbtc` (already a dependency), re-exported here. */\nexport type { SbtcEventTopic } from \"@secondlayer/stacks/sbtc\";\n\nexport type SbtcWithdrawalStatus = \"REQUESTED\" | \"ACCEPTED\" | \"REJECTED\";\n\n/** A completed sBTC peg-in, keyed by `bitcoin_txid` (deposits carry no\n * `request_id`). One terminal `completed-deposit` event per deposit. */\nexport type IndexSbtcDeposit = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tamount: string | null;\n\tsender: string | null;\n\tbitcoin_txid: string | null;\n\toutput_index: number | null;\n\trecipient_btc_version: number | null;\n\trecipient_btc_hashbytes: string | null;\n};\n\n/** A deposit fetched by Bitcoin txid — always terminal, hence `status`. */\nexport type IndexSbtcDepositDetail = IndexSbtcDeposit & { status: \"COMPLETED\" };\n\n/** A peg-out collapsed to one row per `request_id`, with lifecycle `status`\n * derived from the latest accept/reject. */\nexport type IndexSbtcWithdrawal = {\n\tcursor: string;\n\trequest_id: number;\n\tstatus: SbtcWithdrawalStatus;\n\tamount: string | null;\n\tsender: string | null;\n\trecipient_btc_version: number | null;\n\trecipient_btc_hashbytes: string | null;\n\tsweep_txid: string | null;\n\t/** BTC L1 settlement of the committed sweep: true once confirmed, false while\n\t * pending, null when there is no sweep yet (REQUESTED). */\n\tsettlement_confirmed: boolean | null;\n\t/** BTC confirmations on the sweep tx, null when no settlement row yet. */\n\tbtc_confirmations: number | null;\n\t/** Confirming BTC block height, null while unconfirmed / no sweep. */\n\tbtc_block_height: number | null;\n\t/** When the sweep crossed the confirmation threshold (ISO), null otherwise. */\n\tconfirmed_at: string | null;\n\trequested_at?: string | null;\n\tresolved_at?: string | null;\n};\n\n/** One phase of a withdrawal's lifecycle (the on-Stacks event that drove it). */\nexport type IndexSbtcWithdrawalPhase = {\n\tblock_height: number;\n\tblock_time: string | null;\n\ttx_id: string;\n};\n\n/** A single peg-out's full assembled lifecycle, fetched by `request_id`.\n * `finalized` is true once terminal and past the reorg margin. */\nexport type IndexSbtcWithdrawalDetail = {\n\trequest_id: number;\n\tstatus: SbtcWithdrawalStatus;\n\tamount: string | null;\n\tsender: string | null;\n\trecipient_btc_version: number | null;\n\trecipient_btc_hashbytes: string | null;\n\trequested: IndexSbtcWithdrawalPhase;\n\taccepted:\n\t\t| (IndexSbtcWithdrawalPhase & {\n\t\t\t\tsweep_txid: string | null;\n\t\t\t\tsigner_bitmap: string | null;\n\t\t })\n\t\t| null;\n\trejected: IndexSbtcWithdrawalPhase | null;\n\tsettlement: {\n\t\tsweep_txid: string | null;\n\t\tbtc_confirmations: number | null;\n\t\tsettlement_confirmed: boolean | null;\n\t\t/** Confirming Bitcoin block height; null until the sweep confirms. */\n\t\tbtc_block_height: number | null;\n\t\t/** ISO timestamp the sweep first crossed the confirmation threshold. */\n\t\tconfirmed_at: string | null;\n\t};\n\tfinalized: boolean;\n};\n\n/** A raw decoded sBTC protocol-state event — the full `sbtc_events` row, one\n * per event across all topics. */\nexport type IndexSbtcEvent = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time?: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\ttopic: SbtcEventTopic;\n\trequest_id: number | null;\n\tamount: string | null;\n\tsender: string | null;\n\trecipient_btc_version: number | null;\n\trecipient_btc_hashbytes: string | null;\n\tbitcoin_txid: string | null;\n\toutput_index: number | null;\n\tsweep_txid: string | null;\n\tburn_hash: string | null;\n\tburn_height: number | null;\n\tsigner_bitmap: string | null;\n\tmax_fee: string | null;\n\tfee: string | null;\n\tgovernance_contract_type: number | null;\n\tgovernance_new_contract: string | null;\n\tsigner_aggregate_pubkey: string | null;\n\tsigner_threshold: number | null;\n\tsigner_address: string | null;\n\tsigner_keys_count: number | null;\n};\n\n/** The peg \"scoreboard\" — a single all-time canonical aggregate. */\nexport type IndexSbtcSummary = {\n\ttotal_deposits: number;\n\ttotal_withdrawals_requested: number;\n\ttotal_withdrawals_accepted: number;\n\ttotal_withdrawals_rejected: number;\n\tnet_peg_flow_sats: string;\n\ttotal_locked_sats: string;\n\tsbtc_supply_sats: string | null;\n};\n\nexport type SbtcDepositsEnvelope<TRow = IndexSbtcDeposit> = {\n\tdeposits: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\t// Chain reorgs overlapping this page's height range; empty when none.\n\treorgs: IndexReorg[];\n\t/** Present only when the sBTC decoder is disabled, explaining an empty feed. */\n\tnotes?: string;\n};\n\nexport type SbtcDepositEnvelope = {\n\tdeposit: IndexSbtcDepositDetail;\n\ttip: IndexTip;\n};\n\nexport type SbtcWithdrawalsEnvelope<TRow = IndexSbtcWithdrawal> = {\n\twithdrawals: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\treorgs: IndexReorg[];\n\tnotes?: string;\n};\n\nexport type SbtcWithdrawalEnvelope = {\n\twithdrawal: IndexSbtcWithdrawalDetail;\n\ttip: IndexTip;\n};\n\nexport type SbtcEventsEnvelope = {\n\tevents: IndexSbtcEvent[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\treorgs: IndexReorg[];\n\tnotes?: string;\n};\n\nexport type SbtcSummaryEnvelope = {\n\tsummary: IndexSbtcSummary;\n\ttip: IndexTip;\n\tnotes?: string;\n};\n\nexport type SbtcDepositsListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\t/** Clamp to the finality boundary — only settled deposits past the reorg margin. */\n\tconfirmed?: boolean;\n\tsender?: string;\n\tbitcoinTxid?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\t/**\n\t * Columns to return. The server projects the row, so an unrequested column\n\t * is physically absent — and the narrowing overload on `list` makes reading\n\t * one a compile error rather than `undefined` at runtime.\n\t */\n\tfields?: readonly (keyof IndexSbtcDeposit & string)[];\n};\n\n/** Deposit columns that survive any projection — pagination needs them. */\nexport type SbtcDepositAlwaysFields = \"cursor\" | \"block_height\";\n\n/** A deposit row narrowed to the requested columns plus the always-present ones. */\nexport type SbtcDepositFields<F extends keyof IndexSbtcDeposit & string> = Pick<\n\tIndexSbtcDeposit,\n\t(F | SbtcDepositAlwaysFields) & keyof IndexSbtcDeposit\n>;\n\nexport type SbtcDepositsWalkParams = Omit<SbtcDepositsListParams, \"limit\"> &\n\tWalkOptions;\n\n/** SbtcWithdrawal columns that survive any projection. */\nexport type SbtcWithdrawalAlwaysFields = \"cursor\" | \"request_id\";\n\n/** A SbtcWithdrawal row narrowed to the requested columns plus the always-present ones. */\nexport type SbtcWithdrawalFields<F extends keyof IndexSbtcWithdrawal & string> =\n\tPick<\n\t\tIndexSbtcWithdrawal,\n\t\t(F | SbtcWithdrawalAlwaysFields) & keyof IndexSbtcWithdrawal\n\t>;\n\nexport type SbtcWithdrawalsListParams = {\n\t/**\n\t * Columns to return. The server projects the row, so an unrequested column\n\t * is physically absent — and the narrowing overload on `list` makes reading\n\t * one a compile error rather than `undefined` at runtime.\n\t */\n\tfields?: readonly (keyof IndexSbtcWithdrawal & string)[];\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tconfirmed?: boolean;\n\tstatus?: SbtcWithdrawalStatus;\n\tsender?: string;\n\trequestId?: number;\n\t/** Filter by BTC L1 settlement: true → only confirmed sweeps; false → not\n\t * yet confirmed (pending or no sweep). */\n\tsettlementConfirmed?: boolean;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type SbtcWithdrawalsWalkParams = Omit<\n\tSbtcWithdrawalsListParams,\n\t\"limit\"\n> &\n\tWalkOptions;\n\nexport type SbtcEventsListParams = {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tconfirmed?: boolean;\n\ttopic?: SbtcEventTopic;\n\tsender?: string;\n\trequestId?: number;\n\tbitcoinTxid?: string;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type SbtcEventsWalkParams = Omit<SbtcEventsListParams, \"limit\"> &\n\tWalkOptions;\n\nexport type SbtcEventsConsumeParams<TTx = never> = Omit<\n\tSbtcEventsListParams,\n\t\"cursor\" | \"fromCursor\" | \"limit\"\n> &\n\tIndexConsumeOptions<IndexSbtcEvent, SbtcEventsEnvelope, TTx>;\n\nexport type SbtcDepositsConsumeParams<TTx = never> = Omit<\n\tSbtcDepositsListParams,\n\t// `fields` omitted for the same reason as EventsConsumeParams: the consume\n\t// loop never forwarded it, so accepting the option meant it type-checked\n\t// and was then silently dropped. Consuming a projected row needs the\n\t// handler's row type to narrow too — a larger change than pretending the\n\t// option works.\n\t\"cursor\" | \"fromCursor\" | \"limit\" | \"fields\"\n> &\n\tIndexConsumeOptions<IndexSbtcDeposit, SbtcDepositsEnvelope, TTx>;\n\n/** `index.sbtc` — the decoded sBTC peg surface (deposits, withdrawals, raw\n * events, scoreboard). The only productized decoded sBTC peg feed on Stacks. */\nexport interface SbtcResource {\n\tdeposits: {\n\t\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t\t * requested columns plus {@link SbtcDepositAlwaysFields}. */\n\t\tlist<const F extends keyof IndexSbtcDeposit & string>(\n\t\t\tparams: SbtcDepositsListParams & { fields: readonly F[] },\n\t\t): Promise<SbtcDepositsEnvelope<SbtcDepositFields<F>>>;\n\t\tlist(params?: SbtcDepositsListParams): Promise<SbtcDepositsEnvelope>;\n\t\twalk(params?: SbtcDepositsWalkParams): AsyncIterable<IndexSbtcDeposit>;\n\t\t/** Checkpointed sweep of completed deposits — append-only, so safe to\n\t\t * mirror. See {@link IndexConsumeOptions}. */\n\t\tconsume<TTx = never>(\n\t\t\tparams: SbtcDepositsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t): Promise<{\n\t\t\tcursor: string | null;\n\t\t\tpages: number;\n\t\t\temptyPolls: number;\n\t\t}>;\n\t\t/** Fetch a completed deposit by Bitcoin txid; 404 → null. */\n\t\tget(bitcoinTxid: string): Promise<SbtcDepositEnvelope | null>;\n\t};\n\twithdrawals: {\n\t\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t\t * requested columns plus {@link SbtcWithdrawalAlwaysFields}. */\n\t\tlist<const F extends keyof IndexSbtcWithdrawal & string>(\n\t\t\tparams: SbtcWithdrawalsListParams & { fields: readonly F[] },\n\t\t): Promise<SbtcWithdrawalsEnvelope<SbtcWithdrawalFields<F>>>;\n\t\tlist(params?: SbtcWithdrawalsListParams): Promise<SbtcWithdrawalsEnvelope>;\n\t\twalk(\n\t\t\tparams?: SbtcWithdrawalsWalkParams,\n\t\t): AsyncIterable<IndexSbtcWithdrawal>;\n\t\t/** Fetch a withdrawal's full lifecycle by request id; 404 → null. */\n\t\tget(requestId: number): Promise<SbtcWithdrawalEnvelope | null>;\n\t\t// No `consume` by design: a withdrawal row is a lifecycle aggregate keyed\n\t\t// by `request_id`, and it MUTATES as the peg-out moves REQUESTED →\n\t\t// ACCEPTED/REJECTED → settled. A checkpointed cursor only ever moves\n\t\t// forward, so a consumer would commit a row as REQUESTED and never see it\n\t\t// transition. Mirror the append-only `events` feed and derive status from\n\t\t// the withdrawal-{create,accept,reject} topics instead.\n\t};\n\tevents: {\n\t\tlist(params?: SbtcEventsListParams): Promise<SbtcEventsEnvelope>;\n\t\twalk(params?: SbtcEventsWalkParams): AsyncIterable<IndexSbtcEvent>;\n\t\t/** Checkpointed sweep of the raw peg event log — append-only across all\n\t\t * six topics. See {@link IndexConsumeOptions}. */\n\t\tconsume<TTx = never>(\n\t\t\tparams: SbtcEventsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t): Promise<{\n\t\t\tcursor: string | null;\n\t\t\tpages: number;\n\t\t\temptyPolls: number;\n\t\t}>;\n\t};\n\t/** The peg scoreboard — a single all-time aggregate (no pagination). */\n\tsummary(): Promise<SbtcSummaryEnvelope>;\n}\n\n// ── PoX reward cycles (/v1/index/pox/cycles) ───────────────────────\n\n/** Per-function action count within a reward cycle. */\nexport type IndexPoxFunctionCount = {\n\tfunction_name: string;\n\tcount: number;\n};\n\n/** Aggregate stats for one PoX reward cycle — distinct from `index.stacking`\n * (decoded per-call PoX-4 actions); this is the reward-cycle rollup. */\nexport type IndexPoxCycle = {\n\treward_cycle: number;\n\t/** Total ustx locked across all stack-* calls in this cycle (bigint-safe string). */\n\ttotal_stacked_ustx: string;\n\tunique_stackers: number;\n\tunique_delegators: number;\n\taction_count: number;\n\tstart_block_height: number;\n\tend_block_height: number;\n\t/** True when this is the latest reward cycle (still accumulating new actions). */\n\tis_current: boolean;\n\tfunction_breakdown: IndexPoxFunctionCount[];\n};\n\nexport type PoxCyclesEnvelope = {\n\tcycles: IndexPoxCycle[];\n\t/** The next `reward_cycle` to page from (cycles descend), or null at the end. */\n\tnext_cursor: number | null;\n\ttip: IndexTip;\n\t/** Present only when the PoX-4 decoder is disabled, explaining an empty feed. */\n\tnotes?: string;\n};\n\nexport type PoxCycleEnvelope = {\n\tcycle: IndexPoxCycle;\n\ttip: IndexTip;\n\tnotes?: string;\n};\n\nexport type PoxCyclesListParams = {\n\t/** A `reward_cycle` to page from; the page returns cycles below it (descending). */\n\tcursor?: number | null;\n\tlimit?: number;\n};\n\nexport type PoxCyclesWalkParams = Omit<PoxCyclesListParams, \"limit\"> &\n\tWalkOptions;\n\n/** `index.pox` — PoX reward-cycle aggregates. */\nexport interface PoxResource {\n\tcycles: {\n\t\tlist(params?: PoxCyclesListParams): Promise<PoxCyclesEnvelope>;\n\t\twalk(params?: PoxCyclesWalkParams): AsyncIterable<IndexPoxCycle>;\n\t\t/** Fetch one reward cycle's aggregate by number; 404 → null. */\n\t\tget(rewardCycle: number): Promise<PoxCycleEnvelope | null>;\n\t};\n}\n\n// ── PoX-5 events (/v1/index/pox5/events) ───────────────────────────\n\n/** The decoded `pox-5` boot-contract print topics (SIP-045 Bitcoin Staking) —\n * one source of truth in `@secondlayer/stacks/pox5` (already a dependency;\n * the old \"SDK owns its own dependency surface\" rationale predated that). */\nexport type IndexPox5EventTopic = Pox5EventTopic;\n\n/** A raw decoded PoX-5 print event. Promoted fields cover the hot query paths;\n * `data` always carries the full decoded tuple, including nested shapes\n * (`btc-lockup`, `bond-rewards`, `bond-periods`) that have no flat column. */\nexport type IndexPox5Event = {\n\tcursor: string;\n\tblock_height: number;\n\tblock_time: string | null;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\ttopic: IndexPox5EventTopic;\n\tstaker: string | null;\n\tsigner: string | null;\n\tsigner_manager: string | null;\n\tbond_index: number | null;\n\t/** ustx, bigint-safe string. */\n\tamount_ustx: string | null;\n\t/** sats, bigint-safe string. */\n\tamount_sats: string | null;\n\treward_cycle: number | null;\n\tfirst_reward_cycle: number | null;\n\tunlock_cycle: number | null;\n\tunlock_burn_height: number | null;\n\tis_l1_lock: boolean | null;\n\tsigner_key: string | null;\n\t/** The full decoded print tuple as JSON. */\n\tdata: unknown;\n};\n\nexport type Pox5EventsEnvelope<TRow = IndexPox5Event> = {\n\tevents: TRow[];\n\tnext_cursor: string | null;\n\ttip: IndexTip;\n\treorgs: IndexReorg[];\n\t/** Present only when the PoX-5 decoder is disabled, explaining an empty feed. */\n\tnotes?: string;\n};\n\n/** Pox5Event columns that survive any projection. */\nexport type Pox5EventAlwaysFields = \"cursor\" | \"block_height\" | \"topic\";\n\n/** A Pox5Event row narrowed to the requested columns plus the always-present ones. */\nexport type Pox5EventFields<F extends keyof IndexPox5Event & string> = Pick<\n\tIndexPox5Event,\n\t(F | Pox5EventAlwaysFields) & keyof IndexPox5Event\n>;\n\nexport type Pox5EventsListParams = {\n\t/**\n\t * Columns to return. The server projects the row, so an unrequested column\n\t * is physically absent — and the narrowing overload on `list` makes reading\n\t * one a compile error rather than `undefined` at runtime.\n\t */\n\tfields?: readonly (keyof IndexPox5Event & string)[];\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\t/** Clamp to the finality boundary — only rows past the reorg margin. */\n\tconfirmed?: boolean;\n\ttopic?: IndexPox5EventTopic;\n\tstaker?: string;\n\tsigner?: string;\n\tsignerManager?: string;\n\tbondIndex?: number;\n\trewardCycle?: number;\n\tfromHeight?: number;\n\ttoHeight?: number;\n};\n\nexport type Pox5EventsWalkParams = Omit<Pox5EventsListParams, \"limit\"> &\n\tWalkOptions;\n\n/** `index.pox5` — decoded PoX-5 print events, the staking primitive from the\n * epoch 4.0 hard fork onward (PoX-4's `index.stacking` stream ends there). */\nexport interface Pox5Resource {\n\tevents: {\n\t\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t\t * requested columns plus {@link Pox5EventAlwaysFields}. */\n\t\tlist<const F extends keyof IndexPox5Event & string>(\n\t\t\tparams: Pox5EventsListParams & { fields: readonly F[] },\n\t\t): Promise<Pox5EventsEnvelope<Pox5EventFields<F>>>;\n\t\tlist(params?: Pox5EventsListParams): Promise<Pox5EventsEnvelope>;\n\t\twalk(params?: Pox5EventsWalkParams): AsyncIterable<IndexPox5Event>;\n\t};\n}\n\n/**\n * A consume call's feed filters: everything except the loop's own starting\n * checkpoint. `fromCursor` MUST be dropped — it is where the loop begins, not\n * a filter, and the API rejects `cursor` + `from_cursor` together, so\n * forwarding it would 400 every page after the first. `fromHeight`/`limit`\n * also appear in both, and the explicit page args at each call site override\n * them. The loop's non-wire options (onBatch, sink, signal, …) ride along\n * unread — `buildQuery` only reads the keys each list method names.\n */\nfunction feedFilters<T extends { fromCursor?: string | null }>(params: T) {\n\tconst { fromCursor: _checkpoint, ...filters } = params;\n\treturn filters;\n}\n\nfunction firstWalkFromHeight(params: {\n\tcursor?: string | number | null;\n\tfromCursor?: string | null;\n\tfromHeight?: number;\n}): number | undefined {\n\tif (params.fromHeight !== undefined) return params.fromHeight;\n\tif (params.cursor || params.fromCursor) return undefined;\n\treturn 0;\n}\n\n/** The query params every Index keyset feed shares: page window, height range,\n * column projection. Keeping the camel→snake mapping in one place means a new\n * feed can't typo `from_cursor` into a silently-dropped filter. `buildQuery`\n * drops undefined/null and comma-joins arrays, so a feed whose params type has\n * no height window or `fields` contributes nothing for those keys. PoX cycles\n * page by a numeric cursor and opt out. */\nfunction indexPageQuery(params: {\n\tcursor?: string | null;\n\tfromCursor?: string | null;\n\tlimit?: number;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\tfields?: readonly string[];\n}) {\n\treturn {\n\t\tcursor: params.cursor,\n\t\tfrom_cursor: params.fromCursor,\n\t\tlimit: params.limit,\n\t\tfrom_height: params.fromHeight,\n\t\tto_height: params.toHeight,\n\t\tfields: params.fields,\n\t};\n}\n\n/** Pagination overrides `keysetWalk` applies to each page request; the original\n * filter params are merged in by the per-resource list closure. */\ntype PageParams<C = string> = {\n\tlimit: number;\n\tcursor?: C | null;\n\tfromCursor?: string | null;\n\tfromHeight?: number;\n\tsignal?: AbortSignal;\n};\n\n/**\n * `index.ftTransfers` — callable shorthand for `.list()`, with `.list`/`.walk`\n * still available: `await sl.index.ftTransfers({ contractId })`.\n *\n * The API accepts `contract_id`/`sender`/`recipient` equality filters only —\n * no amount filtering and no asset-slug resolution on /v1/index/ft-transfers.\n */\nexport interface FtTransfersResource {\n\t/** Narrowing overload for the callable shorthand — same wire path as\n\t * `list`, so it must narrow identically. */\n\t<const F extends keyof FtTransfer & string>(\n\t\tparams: FtTransfersListParams & { fields: readonly F[] },\n\t): Promise<FtTransfersEnvelope<FtTransferFields<F>>>;\n\t(params?: FtTransfersListParams): Promise<FtTransfersEnvelope>;\n\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t * requested columns plus {@link FtTransferAlwaysFields}. */\n\tlist<const F extends keyof FtTransfer & string>(\n\t\tparams: FtTransfersListParams & { fields: readonly F[] },\n\t): Promise<FtTransfersEnvelope<FtTransferFields<F>>>;\n\tlist(params?: FtTransfersListParams): Promise<FtTransfersEnvelope>;\n\t/** Narrowing overload, matching `list`: `walk` forwards `fields` to the\n\t * wire, so without this the yielded rows are stripped while the type\n\t * still promises every column. */\n\twalk<const F extends keyof FtTransfer & string>(\n\t\tparams: FtTransfersWalkParams & { fields: readonly F[] },\n\t): AsyncIterable<FtTransferFields<F>>;\n\twalk(params?: FtTransfersWalkParams): AsyncIterable<FtTransfer>;\n}\n\n/** `index.nftTransfers` — callable shorthand for `.list()` (see {@link FtTransfersResource}). */\nexport interface NftTransfersResource {\n\t/** Narrowing overload for the callable shorthand — same wire path as\n\t * `list`, so it must narrow identically. */\n\t<const F extends keyof NftTransfer & string>(\n\t\tparams: NftTransfersListParams & { fields: readonly F[] },\n\t): Promise<NftTransfersEnvelope<NftTransferFields<F>>>;\n\t(params?: NftTransfersListParams): Promise<NftTransfersEnvelope>;\n\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t * requested columns plus {@link NftTransferAlwaysFields}. */\n\tlist<const F extends keyof NftTransfer & string>(\n\t\tparams: NftTransfersListParams & { fields: readonly F[] },\n\t): Promise<NftTransfersEnvelope<NftTransferFields<F>>>;\n\tlist(params?: NftTransfersListParams): Promise<NftTransfersEnvelope>;\n\t/** Narrowing overload, matching `list` (see {@link FtTransfersResource}). */\n\twalk<const F extends keyof NftTransfer & string>(\n\t\tparams: NftTransfersWalkParams & { fields: readonly F[] },\n\t): AsyncIterable<NftTransferFields<F>>;\n\twalk(params?: NftTransfersWalkParams): AsyncIterable<NftTransfer>;\n}\n\n/** `index.events` — callable shorthand for `.list()`; `eventType` is required. */\nexport interface IndexEventsResource {\n\t/** Narrowing overload for the callable shorthand — same wire path as\n\t * `list`, so it must narrow identically. */\n\t<T extends IndexEventType, const F extends keyof IndexEventOf<T> & string>(\n\t\tparams: EventsListParams<T> & { fields: readonly F[] },\n\t): Promise<EventsEnvelope<T, IndexEventFields<T, F>>>;\n\t<T extends IndexEventType>(\n\t\tparams: EventsListParams<T>,\n\t): Promise<EventsEnvelope<T>>;\n\t/** Narrowing overload: `fields` shrinks the returned row type to exactly\n\t * the requested columns plus {@link IndexAlwaysFields}. `const F` means no\n\t * `as const` at the call site. */\n\tlist<\n\t\tT extends IndexEventType,\n\t\tconst F extends keyof IndexEventOf<T> & string,\n\t>(\n\t\tparams: EventsListParams<T> & { fields: readonly F[] },\n\t): Promise<EventsEnvelope<T, IndexEventFields<T, F>>>;\n\tlist<T extends IndexEventType>(\n\t\tparams: EventsListParams<T>,\n\t): Promise<EventsEnvelope<T>>;\n\t/** Narrowing overload, matching `list`: `walk` forwards `fields` to the\n\t * wire, so without this the yielded rows are stripped while the type\n\t * still promises every column. */\n\twalk<\n\t\tT extends IndexEventType,\n\t\tconst F extends keyof IndexEventOf<T> & string,\n\t>(\n\t\tparams: EventsWalkParams<T> & { fields: readonly F[] },\n\t): AsyncIterable<IndexEventFields<T, F>>;\n\twalk<T extends IndexEventType>(\n\t\tparams: EventsWalkParams<T>,\n\t): AsyncIterable<IndexEventOf<T>>;\n\tconsume<T extends IndexEventType, TTx = never>(\n\t\t// The redundant `sink` member gives TS a DIRECT inference site for TTx —\n\t\t// inference does not reliably traverse the params alias intersection.\n\t\tparams: EventsConsumeParams<T, TTx> & {\n\t\t\tsink?: ConsumerSink<TTx>;\n\t\t},\n\t): Promise<{ cursor: string | null; pages: number; emptyPolls: number }>;\n}\n\n/** Per-event-type filter vocabulary in the {@link IndexDiscovery} doc. */\nexport type IndexEventTypeFilters = {\n\tcolumns?: string[];\n\tallowed_filters?: string[];\n\tequality_filters?: string[];\n\trequired_non_null?: string[];\n};\n\n/** The `GET /v1/index` discovery doc — live endpoint + filter vocabulary.\n * Shape is intentionally open (the server may add fields); the agent-relevant\n * parts are the per-type filter rules. */\nexport type IndexDiscovery = {\n\tevent_type_filters?: Record<string, IndexEventTypeFilters>;\n\t[key: string]: unknown;\n};\n\nexport class Index extends BaseClient {\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tsuper(options);\n\t}\n\n\t/**\n\t * Index discovery doc — the live vocabulary: every endpoint, each event type's\n\t * columns, allowed/equality filters, and required-non-null fields. Read this to\n\t * learn what's queryable (and which types accept `trait`) instead of hardcoding.\n\t */\n\tdiscover(): Promise<IndexDiscovery> {\n\t\treturn this.request<IndexDiscovery>(\"GET\", \"/v1/index\");\n\t}\n\n\t/**\n\t * Empirical per-topic print payload schema for a contract — what topics it\n\t * emits and each field's observed Clarity/TS/column types. Anonymous read;\n\t * 404 → null.\n\t */\n\tasync printSchema(contractId: string): Promise<PrintSchemaResponse | null> {\n\t\treturn this.requestOrNull<PrintSchemaResponse>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/contracts/${encodeURIComponent(contractId)}/print-schema`,\n\t\t);\n\t}\n\n\t/** Callable: `index.ftTransfers(params)` ≡ `index.ftTransfers.list(params)`. */\n\treadonly ftTransfers: FtTransfersResource = Object.assign(\n\t\t(params: FtTransfersListParams = {}): Promise<FtTransfersEnvelope> =>\n\t\t\tthis.listFtTransfers(params),\n\t\t{\n\t\t\tlist: (\n\t\t\t\tparams: FtTransfersListParams = {},\n\t\t\t): Promise<FtTransfersEnvelope> => this.listFtTransfers(params),\n\t\t\twalk: (params: FtTransfersWalkParams = {}): AsyncIterable<FtTransfer> =>\n\t\t\t\tthis.walkFtTransfers(params),\n\t\t},\n\t);\n\n\t/** Callable: `index.nftTransfers(params)` ≡ `index.nftTransfers.list(params)`. */\n\treadonly nftTransfers: NftTransfersResource = Object.assign(\n\t\t(params: NftTransfersListParams = {}): Promise<NftTransfersEnvelope> =>\n\t\t\tthis.listNftTransfers(params),\n\t\t{\n\t\t\tlist: (\n\t\t\t\tparams: NftTransfersListParams = {},\n\t\t\t): Promise<NftTransfersEnvelope> => this.listNftTransfers(params),\n\t\t\twalk: (params: NftTransfersWalkParams = {}): AsyncIterable<NftTransfer> =>\n\t\t\t\tthis.walkNftTransfers(params),\n\t\t},\n\t);\n\n\t/** Generic decoded events by `event_type` (the full /v1/index/events surface).\n\t * Callable: `index.events(params)` ≡ `index.events.list(params)`. */\n\treadonly events: IndexEventsResource = Object.assign(\n\t\t<T extends IndexEventType>(\n\t\t\tparams: EventsListParams<T>,\n\t\t): Promise<EventsEnvelope<T>> => this.listEvents(params),\n\t\t{\n\t\t\tlist: (<T extends IndexEventType>(\n\t\t\t\tparams: EventsListParams<T>,\n\t\t\t): Promise<EventsEnvelope<T>> =>\n\t\t\t\tthis.listEvents(params)) as IndexEventsResource[\"list\"],\n\t\t\twalk: <T extends IndexEventType>(\n\t\t\t\tparams: EventsWalkParams<T>,\n\t\t\t): AsyncIterable<IndexEventOf<T>> => this.walkEvents(params),\n\t\t\tconsume: <T extends IndexEventType, TTx = never>(\n\t\t\t\t// The redundant `sink` member gives TS a DIRECT inference site for\n\t\t\t\t// TTx — inference does not traverse the Omit-intersection alias.\n\t\t\t\tparams: EventsConsumeParams<T, TTx> & { sink?: ConsumerSink<TTx> },\n\t\t\t) =>\n\t\t\t\tconsumeIndexFeed<IndexEventOf<T>, EventsEnvelope<T>, TTx>({\n\t\t\t\t\t...params,\n\t\t\t\t\tfetchPage: ({ cursor, fromHeight, limit }) =>\n\t\t\t\t\t\tthis.listEvents({\n\t\t\t\t\t\t\t...feedFilters(params),\n\t\t\t\t\t\t\tcursor,\n\t\t\t\t\t\t\tfromHeight,\n\t\t\t\t\t\t\tlimit,\n\t\t\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\t\t}),\n\t\t\t\t\titemsOf: (envelope) => envelope.events,\n\t\t\t\t}),\n\t\t},\n\t);\n\n\treadonly contractCalls: {\n\t\tlist: (params?: ContractCallsListParams) => Promise<ContractCallsEnvelope>;\n\t\twalk: (\n\t\t\tparams?: ContractCallsWalkParams,\n\t\t) => AsyncIterable<IndexContractCall>;\n\t\tconsume: <TTx = never>(\n\t\t\tparams: ContractCallsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t) => Promise<{ cursor: string | null; pages: number; emptyPolls: number }>;\n\t} = {\n\t\tlist: (\n\t\t\tparams: ContractCallsListParams = {},\n\t\t): Promise<ContractCallsEnvelope> => this.listContractCalls(params),\n\t\twalk: (\n\t\t\tparams: ContractCallsWalkParams = {},\n\t\t): AsyncIterable<IndexContractCall> => this.walkContractCalls(params),\n\t\tconsume: <TTx = never>(\n\t\t\tparams: ContractCallsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t) =>\n\t\t\tconsumeIndexFeed<IndexContractCall, ContractCallsEnvelope, TTx>({\n\t\t\t\t...params,\n\t\t\t\tfetchPage: ({ cursor, fromHeight, limit }) =>\n\t\t\t\t\tthis.listContractCalls({\n\t\t\t\t\t\t...feedFilters(params),\n\t\t\t\t\t\tcursor,\n\t\t\t\t\t\tfromHeight,\n\t\t\t\t\t\tlimit,\n\t\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\t}),\n\t\t\t\titemsOf: (envelope) => envelope.contract_calls,\n\t\t\t}),\n\t};\n\n\t/** Canonical block-hash map — sync only the current canonical chain. */\n\treadonly canonical: {\n\t\tlist: (params?: CanonicalListParams) => Promise<CanonicalEnvelope>;\n\t\twalk: (params?: CanonicalWalkParams) => AsyncIterable<IndexCanonicalBlock>;\n\t} = {\n\t\tlist: (params: CanonicalListParams = {}): Promise<CanonicalEnvelope> =>\n\t\t\tthis.listCanonical(params),\n\t\twalk: (\n\t\t\tparams: CanonicalWalkParams = {},\n\t\t): AsyncIterable<IndexCanonicalBlock> => this.walkCanonical(params),\n\t};\n\n\t/** Canonical blocks: paginated `list`/`walk`, plus `get` by height or hash\n\t * (resolves to null on 404). */\n\treadonly blocks: {\n\t\tlist: (params?: BlocksListParams) => Promise<BlocksEnvelope>;\n\t\twalk: (params?: BlocksWalkParams) => AsyncIterable<IndexBlock>;\n\t\tget: (ref: string | number) => Promise<BlockEnvelope | null>;\n\t} = {\n\t\tlist: (params: BlocksListParams = {}): Promise<BlocksEnvelope> =>\n\t\t\tthis.listBlocks(params),\n\t\twalk: (params: BlocksWalkParams = {}): AsyncIterable<IndexBlock> =>\n\t\t\tthis.walkBlocks(params),\n\t\tget: (ref: string | number): Promise<BlockEnvelope | null> =>\n\t\t\tthis.getBlock(ref),\n\t};\n\n\t/** Full transaction documents: paginated `list`/`walk`, plus `get` by tx_id\n\t * (resolves to null on 404). */\n\treadonly transactions: {\n\t\t/** Narrowing overload: `fields` shrinks the row type to exactly the\n\t\t * requested columns plus {@link TransactionAlwaysFields}. Declared as\n\t\t * an overloaded call signature because an arrow property cannot carry\n\t\t * overloads. */\n\t\tlist: {\n\t\t\t<const F extends keyof IndexTransaction & string>(\n\t\t\t\tparams: TransactionsListParams & { fields: readonly F[] },\n\t\t\t): Promise<TransactionsEnvelope<TransactionFields<F>>>;\n\t\t\t(params?: TransactionsListParams): Promise<TransactionsEnvelope>;\n\t\t};\n\t\twalk: (params?: TransactionsWalkParams) => AsyncIterable<IndexTransaction>;\n\t\tget: (txId: string) => Promise<TransactionEnvelope | null>;\n\t\tgetProof: (txId: string) => Promise<TransactionProof | null>;\n\t} = {\n\t\tlist: (\n\t\t\tparams: TransactionsListParams = {},\n\t\t): Promise<TransactionsEnvelope> => this.listTransactions(params),\n\t\twalk: (\n\t\t\tparams: TransactionsWalkParams = {},\n\t\t): AsyncIterable<IndexTransaction> => this.walkTransactions(params),\n\t\tget: (txId: string): Promise<TransactionEnvelope | null> =>\n\t\t\tthis.getTransaction(txId),\n\t\tgetProof: (txId: string): Promise<TransactionProof | null> =>\n\t\t\tthis.getTransactionProof(txId),\n\t};\n\n\t/** Decoded PoX-4 stacking actions. Empty (with a `notes` hint) when the\n\t * platform's PoX-4 decoder is disabled. */\n\treadonly stacking: {\n\t\tlist: (params?: StackingListParams) => Promise<StackingEnvelope>;\n\t\twalk: (params?: StackingWalkParams) => AsyncIterable<IndexStackingAction>;\n\t} = {\n\t\tlist: (params: StackingListParams = {}): Promise<StackingEnvelope> =>\n\t\t\tthis.listStacking(params),\n\t\twalk: (\n\t\t\tparams: StackingWalkParams = {},\n\t\t): AsyncIterable<IndexStackingAction> => this.walkStacking(params),\n\t};\n\n\t/** Pending (unconfirmed) transactions: paginated `list`/`walk`, plus `get` by\n\t * tx_id (resolves to null when the tx has confirmed or dropped). */\n\treadonly mempool: {\n\t\tlist: (params?: MempoolListParams) => Promise<MempoolEnvelope>;\n\t\twalk: (\n\t\t\tparams?: MempoolWalkParams,\n\t\t) => AsyncIterable<IndexMempoolTransaction>;\n\t\tget: (txId: string) => Promise<MempoolTransactionEnvelope | null>;\n\t} = {\n\t\tlist: (params: MempoolListParams = {}): Promise<MempoolEnvelope> =>\n\t\t\tthis.listMempool(params),\n\t\twalk: (\n\t\t\tparams: MempoolWalkParams = {},\n\t\t): AsyncIterable<IndexMempoolTransaction> => this.walkMempool(params),\n\t\tget: (txId: string): Promise<MempoolTransactionEnvelope | null> =>\n\t\t\tthis.getMempoolTx(txId),\n\t};\n\n\t/** Decoded sBTC peg surface — the only productized decoded sBTC peg feed on\n\t * Stacks. `deposits`/`withdrawals`/`events` paginate; `summary` is a scalar. */\n\treadonly sbtc: SbtcResource = {\n\t\tdeposits: {\n\t\t\tlist: (\n\t\t\t\tparams: SbtcDepositsListParams = {},\n\t\t\t): Promise<SbtcDepositsEnvelope> => this.listSbtcDeposits(params),\n\t\t\twalk: (\n\t\t\t\tparams: SbtcDepositsWalkParams = {},\n\t\t\t): AsyncIterable<IndexSbtcDeposit> => this.walkSbtcDeposits(params),\n\t\t\tconsume: <TTx = never>(\n\t\t\t\tparams: SbtcDepositsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t\t) =>\n\t\t\t\tconsumeIndexFeed<IndexSbtcDeposit, SbtcDepositsEnvelope, TTx>({\n\t\t\t\t\t...params,\n\t\t\t\t\tfetchPage: ({ cursor, fromHeight, limit }) =>\n\t\t\t\t\t\tthis.listSbtcDeposits({\n\t\t\t\t\t\t\t...feedFilters(params),\n\t\t\t\t\t\t\tcursor,\n\t\t\t\t\t\t\tfromHeight,\n\t\t\t\t\t\t\tlimit,\n\t\t\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\t\t}),\n\t\t\t\t\titemsOf: (envelope) => envelope.deposits,\n\t\t\t\t}),\n\t\t\tget: (bitcoinTxid: string): Promise<SbtcDepositEnvelope | null> =>\n\t\t\t\tthis.getSbtcDeposit(bitcoinTxid),\n\t\t},\n\t\twithdrawals: {\n\t\t\tlist: (\n\t\t\t\tparams: SbtcWithdrawalsListParams = {},\n\t\t\t): Promise<SbtcWithdrawalsEnvelope> => this.listSbtcWithdrawals(params),\n\t\t\twalk: (\n\t\t\t\tparams: SbtcWithdrawalsWalkParams = {},\n\t\t\t): AsyncIterable<IndexSbtcWithdrawal> => this.walkSbtcWithdrawals(params),\n\t\t\tget: (requestId: number): Promise<SbtcWithdrawalEnvelope | null> =>\n\t\t\t\tthis.getSbtcWithdrawal(requestId),\n\t\t},\n\t\tevents: {\n\t\t\tlist: (params: SbtcEventsListParams = {}): Promise<SbtcEventsEnvelope> =>\n\t\t\t\tthis.listSbtcEvents(params),\n\t\t\twalk: (\n\t\t\t\tparams: SbtcEventsWalkParams = {},\n\t\t\t): AsyncIterable<IndexSbtcEvent> => this.walkSbtcEvents(params),\n\t\t\tconsume: <TTx = never>(\n\t\t\t\tparams: SbtcEventsConsumeParams<TTx> & { sink?: ConsumerSink<TTx> },\n\t\t\t) =>\n\t\t\t\tconsumeIndexFeed<IndexSbtcEvent, SbtcEventsEnvelope, TTx>({\n\t\t\t\t\t...params,\n\t\t\t\t\tfetchPage: ({ cursor, fromHeight, limit }) =>\n\t\t\t\t\t\tthis.listSbtcEvents({\n\t\t\t\t\t\t\t...feedFilters(params),\n\t\t\t\t\t\t\tcursor,\n\t\t\t\t\t\t\tfromHeight,\n\t\t\t\t\t\t\tlimit,\n\t\t\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\t\t}),\n\t\t\t\t\titemsOf: (envelope) => envelope.events,\n\t\t\t\t}),\n\t\t},\n\t\tsummary: (): Promise<SbtcSummaryEnvelope> => this.getSbtcSummary(),\n\t};\n\n\t/** PoX reward-cycle aggregates. Distinct from `stacking` (per-call PoX-4\n\t * actions); `cycles` is the reward-cycle rollup. */\n\treadonly pox: PoxResource = {\n\t\tcycles: {\n\t\t\tlist: (params: PoxCyclesListParams = {}): Promise<PoxCyclesEnvelope> =>\n\t\t\t\tthis.listPoxCycles(params),\n\t\t\twalk: (params: PoxCyclesWalkParams = {}): AsyncIterable<IndexPoxCycle> =>\n\t\t\t\tthis.walkPoxCycles(params),\n\t\t\tget: (rewardCycle: number): Promise<PoxCycleEnvelope | null> =>\n\t\t\t\tthis.getPoxCycle(rewardCycle),\n\t\t},\n\t};\n\n\t/** Decoded PoX-5 print events (SIP-045 Bitcoin Staking) — the raw pox-5\n\t * boot-contract log, all 19 topics. Distinct from `stacking` (PoX-4 era). */\n\treadonly pox5: Pox5Resource = {\n\t\tevents: {\n\t\t\tlist: (params: Pox5EventsListParams = {}): Promise<Pox5EventsEnvelope> =>\n\t\t\t\tthis.listPox5Events(params),\n\t\t\twalk: (\n\t\t\t\tparams: Pox5EventsWalkParams = {},\n\t\t\t): AsyncIterable<IndexPox5Event> => this.walkPox5Events(params),\n\t\t},\n\t};\n\n\tprivate async listFtTransfers(\n\t\tparams: FtTransfersListParams & RequestSignal = {},\n\t): Promise<FtTransfersEnvelope> {\n\t\treturn this.request<FtTransfersEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/ft-transfers${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\tsender: params.sender,\n\t\t\t\trecipient: params.recipient,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate async listNftTransfers(\n\t\tparams: NftTransfersListParams & RequestSignal = {},\n\t): Promise<NftTransfersEnvelope> {\n\t\treturn this.request<NftTransfersEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/nft-transfers${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\tsender: params.sender,\n\t\t\t\trecipient: params.recipient,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\t/** Shared keyset-pagination loop for every `walk*` feed: seed the cursor from\n\t * `cursor`/`fromCursor` (and `fromHeight` 0 on the first page), then page until\n\t * the server stops advancing the cursor (`next_cursor` null or unchanged). A\n\t * short page is not a tail signal: the server clamps oversized limits without\n\t * saying so, so trusting page length truncated backfills. The cost is one\n\t * extra empty fetch at the end of feeds that never return a null cursor.\n\t * `list` merges the resource's filter params; `itemsOf` selects the envelope's\n\t * item array. Each page fetch retries under `fetchPageWithRetry`; the cursor\n\t * is a string keyset for every feed except PoX cycles, which use a number. */\n\tprivate async *keysetWalk<\n\t\tE extends { next_cursor: C | null },\n\t\tT,\n\t\tC extends string | number = string,\n\t>(\n\t\tparams: WalkOptions & {\n\t\t\tcursor?: C | null;\n\t\t\tfromCursor?: string | null;\n\t\t\tfromHeight?: number;\n\t\t},\n\t\tlist: (page: PageParams<C>) => Promise<E>,\n\t\titemsOf: (envelope: E) => T[],\n\t): AsyncGenerator<T> {\n\t\tconst batchSize = params.batchSize ?? 200;\n\t\tif (\n\t\t\t!Number.isInteger(batchSize) ||\n\t\t\tbatchSize < 1 ||\n\t\t\tbatchSize > INDEX_MAX_PAGE_SIZE\n\t\t) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t`walk batchSize must be an integer from 1 to ${INDEX_MAX_PAGE_SIZE} (the largest page the Index serves); got ${batchSize}.`,\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t\t// `fromCursor` is a string keyset on every feed that accepts it; PoX\n\t\t// cycles (numeric cursor) never pass one.\n\t\tlet cursor: C | null =\n\t\t\tparams.cursor ?? (params.fromCursor as C | null | undefined) ?? null;\n\t\tlet firstPage = true;\n\n\t\t// Abort is a rejection at every boundary, never a clean return: a walk\n\t\t// that ends without throwing has reached the end of the feed.\n\t\tconst throwIfAborted = () => {\n\t\t\tif (params.signal?.aborted) throw params.signal.reason ?? abortError();\n\t\t};\n\n\t\tfor (;;) {\n\t\t\tthrowIfAborted();\n\t\t\tconst page: PageParams<C> = {\n\t\t\t\tlimit: batchSize,\n\t\t\t\tcursor: firstPage ? params.cursor : cursor,\n\t\t\t\tfromCursor: firstPage ? params.fromCursor : undefined,\n\t\t\t\tfromHeight: firstPage ? firstWalkFromHeight(params) : undefined,\n\t\t\t\tsignal: params.signal,\n\t\t\t};\n\t\t\tconst envelope = await fetchPageWithRetry(() => list(page), {\n\t\t\t\tretryCount: params.retryCount,\n\t\t\t\tretryDelay: params.retryDelay,\n\t\t\t\tonError: params.onError,\n\t\t\t\tsleep: defaultSleep,\n\t\t\t\tsignal: params.signal,\n\t\t\t});\n\n\t\t\tconst items = itemsOf(envelope);\n\t\t\tfor (const item of items) {\n\t\t\t\tthrowIfAborted();\n\t\t\t\tyield item;\n\t\t\t}\n\n\t\t\tconst nextCursor = envelope.next_cursor;\n\t\t\tif (nextCursor === null || nextCursor === undefined) return;\n\t\t\tif (nextCursor === cursor) return;\n\n\t\t\tcursor = nextCursor;\n\t\t\tfirstPage = false;\n\t\t}\n\t}\n\n\tprivate walkFtTransfers(\n\t\tparams: FtTransfersWalkParams = {},\n\t): AsyncGenerator<FtTransfer> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listFtTransfers({ ...params, ...page }),\n\t\t\t(e) => e.events,\n\t\t);\n\t}\n\n\tprivate walkNftTransfers(\n\t\tparams: NftTransfersWalkParams = {},\n\t): AsyncGenerator<NftTransfer> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listNftTransfers({ ...params, ...page }),\n\t\t\t(e) => e.events,\n\t\t);\n\t}\n\n\tprivate async listEvents<T extends IndexEventType>(\n\t\tparams: EventsListParams<T> & RequestSignal,\n\t): Promise<EventsEnvelope<T>> {\n\t\treturn this.request<EventsEnvelope<T>>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/events${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tevent_type: params.eventType,\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\tsender: params.sender,\n\t\t\t\trecipient: params.recipient,\n\t\t\t\t// vm types (second clock): accepted per event_type by the server.\n\t\t\t\tfunction_name: params.functionName,\n\t\t\t\tcaller: params.caller,\n\t\t\t\tmap: params.map,\n\t\t\t\tvar_name: params.varName,\n\t\t\t\ttx_id: params.txId,\n\t\t\t\ttrait: params.trait,\n\t\t\t\ttx_context: params.txContext ? \"true\" : undefined,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkEvents<T extends IndexEventType>(\n\t\tparams: EventsWalkParams<T>,\n\t): AsyncGenerator<IndexEventOf<T>> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listEvents({ ...params, ...page }),\n\t\t\t(e) => e.events,\n\t\t);\n\t}\n\n\tprivate async listContractCalls(\n\t\tparams: ContractCallsListParams & RequestSignal = {},\n\t): Promise<ContractCallsEnvelope> {\n\t\treturn this.request<ContractCallsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/contract-calls${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tfunction_name: params.functionName,\n\t\t\t\tsender: params.sender,\n\t\t\t\ttrait: params.trait,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkContractCalls(\n\t\tparams: ContractCallsWalkParams = {},\n\t): AsyncGenerator<IndexContractCall> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listContractCalls({ ...params, ...page }),\n\t\t\t(e) => e.contract_calls,\n\t\t);\n\t}\n\n\tprivate async listCanonical(\n\t\tparams: CanonicalListParams & RequestSignal = {},\n\t): Promise<CanonicalEnvelope> {\n\t\treturn this.request<CanonicalEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/canonical${buildQuery(indexPageQuery(params))}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkCanonical(\n\t\tparams: CanonicalWalkParams = {},\n\t): AsyncGenerator<IndexCanonicalBlock> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listCanonical({ ...params, ...page }),\n\t\t\t(e) => e.canonical,\n\t\t);\n\t}\n\n\tprivate async listBlocks(\n\t\tparams: BlocksListParams & RequestSignal = {},\n\t): Promise<BlocksEnvelope> {\n\t\treturn this.request<BlocksEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/blocks${buildQuery(indexPageQuery(params))}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate async getBlock(ref: string | number): Promise<BlockEnvelope | null> {\n\t\treturn this.requestOrNull<BlockEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/blocks/${encodeURIComponent(String(ref))}`,\n\t\t);\n\t}\n\n\tprivate walkBlocks(\n\t\tparams: BlocksWalkParams = {},\n\t): AsyncGenerator<IndexBlock> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listBlocks({ ...params, ...page }),\n\t\t\t(e) => e.blocks,\n\t\t);\n\t}\n\n\tprivate async listTransactions(\n\t\tparams: TransactionsListParams & RequestSignal = {},\n\t): Promise<TransactionsEnvelope> {\n\t\treturn this.request<TransactionsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/transactions${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\ttype: params.type,\n\t\t\t\tsender: params.sender,\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate async getTransaction(\n\t\ttxId: string,\n\t): Promise<TransactionEnvelope | null> {\n\t\treturn this.requestOrNull<TransactionEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/transactions/${encodeURIComponent(txId)}`,\n\t\t);\n\t}\n\n\t/** Fetch the inclusion proof for a tx (raw tx + Nakamoto header + merkle path)\n\t * to verify client-side with `verifyTransactionProof`. 404 → null. A 503\n\t * (`PROOF_TX_SET_INCOMPLETE` / `PROOF_NODE_UNAVAILABLE`) surfaces as an\n\t * ApiError — the proof can't be assembled on this deployment right now. */\n\tprivate async getTransactionProof(\n\t\ttxId: string,\n\t): Promise<TransactionProof | null> {\n\t\treturn this.requestOrNull<TransactionProof>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/transactions/${encodeURIComponent(txId)}/proof`,\n\t\t);\n\t}\n\n\tprivate walkTransactions(\n\t\tparams: TransactionsWalkParams = {},\n\t): AsyncGenerator<IndexTransaction> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listTransactions({ ...params, ...page }),\n\t\t\t(e) => e.transactions,\n\t\t);\n\t}\n\n\tprivate async listStacking(\n\t\tparams: StackingListParams & RequestSignal = {},\n\t): Promise<StackingEnvelope> {\n\t\treturn this.request<StackingEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/stacking${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tfunction_name: params.functionName,\n\t\t\t\tstacker: params.stacker,\n\t\t\t\tcaller: params.caller,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkStacking(\n\t\tparams: StackingWalkParams = {},\n\t): AsyncGenerator<IndexStackingAction> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listStacking({ ...params, ...page }),\n\t\t\t(e) => e.stacking,\n\t\t);\n\t}\n\n\tprivate async listMempool(\n\t\tparams: MempoolListParams & RequestSignal = {},\n\t): Promise<MempoolEnvelope> {\n\t\treturn this.request<MempoolEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/mempool${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tsender: params.sender,\n\t\t\t\ttype: params.type,\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tfunction_name: params.functionName,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate async getMempoolTx(\n\t\ttxId: string,\n\t): Promise<MempoolTransactionEnvelope | null> {\n\t\treturn this.requestOrNull<MempoolTransactionEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/mempool/${encodeURIComponent(txId)}`,\n\t\t);\n\t}\n\n\tprivate walkMempool(\n\t\tparams: MempoolWalkParams = {},\n\t): AsyncGenerator<IndexMempoolTransaction> {\n\t\t// Mempool has no height filter; listMempool ignores the seeded fromHeight.\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listMempool({ ...params, ...page }),\n\t\t\t(e) => e.mempool,\n\t\t);\n\t}\n\n\tprivate async listSbtcDeposits(\n\t\tparams: SbtcDepositsListParams & RequestSignal = {},\n\t): Promise<SbtcDepositsEnvelope> {\n\t\treturn this.request<SbtcDepositsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/sbtc/deposits${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tconfirmed: params.confirmed,\n\t\t\t\tsender: params.sender,\n\t\t\t\tbitcoin_txid: params.bitcoinTxid,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkSbtcDeposits(\n\t\tparams: SbtcDepositsWalkParams = {},\n\t): AsyncGenerator<IndexSbtcDeposit> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listSbtcDeposits({ ...params, ...page }),\n\t\t\t(e) => e.deposits,\n\t\t);\n\t}\n\n\tprivate async getSbtcDeposit(\n\t\tbitcoinTxid: string,\n\t): Promise<SbtcDepositEnvelope | null> {\n\t\treturn this.requestOrNull<SbtcDepositEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/sbtc/deposits/${encodeURIComponent(bitcoinTxid)}`,\n\t\t);\n\t}\n\n\tprivate async listSbtcWithdrawals(\n\t\tparams: SbtcWithdrawalsListParams & RequestSignal = {},\n\t): Promise<SbtcWithdrawalsEnvelope> {\n\t\treturn this.request<SbtcWithdrawalsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/sbtc/withdrawals${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tconfirmed: params.confirmed,\n\t\t\t\tstatus: params.status,\n\t\t\t\tsender: params.sender,\n\t\t\t\trequest_id: params.requestId,\n\t\t\t\tsettlement_confirmed: params.settlementConfirmed,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkSbtcWithdrawals(\n\t\tparams: SbtcWithdrawalsWalkParams = {},\n\t): AsyncGenerator<IndexSbtcWithdrawal> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listSbtcWithdrawals({ ...params, ...page }),\n\t\t\t(e) => e.withdrawals,\n\t\t);\n\t}\n\n\tprivate async getSbtcWithdrawal(\n\t\trequestId: number,\n\t): Promise<SbtcWithdrawalEnvelope | null> {\n\t\treturn this.requestOrNull<SbtcWithdrawalEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/sbtc/withdrawals/${requestId}`,\n\t\t);\n\t}\n\n\tprivate async listSbtcEvents(\n\t\tparams: SbtcEventsListParams & RequestSignal = {},\n\t): Promise<SbtcEventsEnvelope> {\n\t\treturn this.request<SbtcEventsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/sbtc/events${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tconfirmed: params.confirmed,\n\t\t\t\ttopic: params.topic,\n\t\t\t\tsender: params.sender,\n\t\t\t\trequest_id: params.requestId,\n\t\t\t\tbitcoin_txid: params.bitcoinTxid,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkSbtcEvents(\n\t\tparams: SbtcEventsWalkParams = {},\n\t): AsyncGenerator<IndexSbtcEvent> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listSbtcEvents({ ...params, ...page }),\n\t\t\t(e) => e.events,\n\t\t);\n\t}\n\n\tprivate async getSbtcSummary(): Promise<SbtcSummaryEnvelope> {\n\t\treturn this.request<SbtcSummaryEnvelope>(\"GET\", \"/v1/index/sbtc/summary\");\n\t}\n\n\tprivate async listPox5Events(\n\t\tparams: Pox5EventsListParams & RequestSignal = {},\n\t): Promise<Pox5EventsEnvelope> {\n\t\treturn this.request<Pox5EventsEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/pox5/events${buildQuery({\n\t\t\t\t...indexPageQuery(params),\n\t\t\t\tconfirmed: params.confirmed,\n\t\t\t\ttopic: params.topic,\n\t\t\t\tstaker: params.staker,\n\t\t\t\tsigner: params.signer,\n\t\t\t\tsigner_manager: params.signerManager,\n\t\t\t\tbond_index: params.bondIndex,\n\t\t\t\treward_cycle: params.rewardCycle,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\tprivate walkPox5Events(\n\t\tparams: Pox5EventsWalkParams = {},\n\t): AsyncGenerator<IndexPox5Event> {\n\t\treturn this.keysetWalk(\n\t\t\tparams,\n\t\t\t(page) => this.listPox5Events({ ...params, ...page }),\n\t\t\t(e) => e.events,\n\t\t);\n\t}\n\n\tprivate async listPoxCycles(\n\t\tparams: PoxCyclesListParams & RequestSignal = {},\n\t): Promise<PoxCyclesEnvelope> {\n\t\treturn this.request<PoxCyclesEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/pox/cycles${buildQuery({\n\t\t\t\tcursor: params.cursor,\n\t\t\t\tlimit: params.limit,\n\t\t\t})}`,\n\t\t\tundefined,\n\t\t\t{ signal: params.signal },\n\t\t);\n\t}\n\n\t// PoX cycles page by a numeric `reward_cycle` cursor (descending) with no\n\t// from_cursor/from_height; the shared loop only ever sends `cursor`+`limit`.\n\tprivate walkPoxCycles(\n\t\tparams: PoxCyclesWalkParams = {},\n\t): AsyncGenerator<IndexPoxCycle> {\n\t\treturn this.keysetWalk<PoxCyclesEnvelope, IndexPoxCycle, number>(\n\t\t\tparams,\n\t\t\t(page) =>\n\t\t\t\tthis.listPoxCycles({\n\t\t\t\t\tcursor: page.cursor,\n\t\t\t\t\tlimit: page.limit,\n\t\t\t\t\tsignal: page.signal,\n\t\t\t\t}),\n\t\t\t(e) => e.cycles,\n\t\t);\n\t}\n\n\tprivate async getPoxCycle(\n\t\trewardCycle: number,\n\t): Promise<PoxCycleEnvelope | null> {\n\t\treturn this.requestOrNull<PoxCycleEnvelope>(\n\t\t\t\"GET\",\n\t\t\t`/v1/index/pox/cycles/${rewardCycle}`,\n\t\t);\n\t}\n}\n",
|
|
15
|
-
"import { ed25519 } from \"@secondlayer/shared\";\nimport { buildQuery, resolveApiKey, resolveBaseUrl } from \"../base.ts\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink } from \"../sinks/types.ts\";\nimport {\n\ttype StreamsEventsFetcher,\n\tconsumeStreamsEvents,\n\titerateStreamsBatches,\n\tstreamStreamsEvents,\n} from \"./consumer.ts\";\nimport { Cursor } from \"./cursor.ts\";\nimport { decode } from \"./decode.ts\";\nimport { createStreamsDumps } from \"./dumps.ts\";\nimport {\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tValidationError,\n\tmapStreamsError,\n} from \"./errors.ts\";\nimport { subscribeStreamsEvents } from \"./subscribe.ts\";\nimport type {\n\tFetchLike,\n\tStreamsCanonicalBlock,\n\tStreamsClient,\n\tStreamsConsumeParams,\n\tStreamsEvent,\n\tStreamsEventType,\n\tStreamsEventsConsumeParams,\n\tStreamsEventsConsumeResult,\n\tStreamsEventsEnvelope,\n\tStreamsEventsListEnvelope,\n\tStreamsEventsListParams,\n\tStreamsEventsReplayParams,\n\tStreamsEventsStreamParams,\n\tStreamsEventsSubscribeParams,\n\tStreamsFilterMap,\n\tStreamsFilterValue,\n\tStreamsReorgsListEnvelope,\n\tStreamsReorgsListParams,\n\tStreamsTip,\n} from \"./types.ts\";\n\n/** Parse a `<block>:<index>` cursor; null sorts before genesis. */\nfunction cursorTuple(cursor: string | null): [number, number] {\n\tif (!cursor) return [-1, -1];\n\tconst { blockHeight, eventIndex } = Cursor.parse(cursor);\n\treturn [blockHeight, eventIndex];\n}\n\n/** The greater of two cursors (later in the stream). */\nfunction maxCursor(a: string | null, b: string | null): string | null {\n\tconst [ah, ai] = cursorTuple(a);\n\tconst [bh, bi] = cursorTuple(b);\n\treturn ah > bh || (ah === bh && ai >= bi) ? a : b;\n}\n\n/**\n * The narrowing set every Streams read forwards verbatim to the consumer\n * loops. Kept in one place because each field is optional: a forgotten one is\n * a type-checkable object that silently widens the stream toward the full\n * firehose — which is billed per row, and has happened. `events.replay()`\n * deliberately forwards a subset and stays explicit.\n */\nfunction streamsFilters(params: {\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\tfilters?: StreamsFilterMap;\n}) {\n\treturn {\n\t\ttypes: params.types,\n\t\tnotTypes: params.notTypes,\n\t\tcontractId: params.contractId,\n\t\tsender: params.sender,\n\t\trecipient: params.recipient,\n\t\tassetIdentifier: params.assetIdentifier,\n\t\tfilters: params.filters,\n\t};\n}\n\nexport type CreateStreamsClientOptions = {\n\tapiKey?: string;\n\tbaseUrl?: string;\n\t/** Deploy origin label sent as `x-sl-origin` (telemetry). Defaults to `cli`. */\n\torigin?: \"cli\" | \"mcp\" | \"session\";\n\tfetchImpl?: FetchLike;\n\t/**\n\t * Public base URL for bulk parquet dumps (the R2/CDN bucket root). Required\n\t * to use `client.dumps`. See `GET /public/streams/dumps/manifest`.\n\t */\n\tdumpsBaseUrl?: string;\n\t/**\n\t * Verify the ed25519 `X-Signature` on every REST response and per-frame SSE\n\t * signature. Three states:\n\t * - **default (omitted)** — *lenient*: verify when the server signs (the\n\t * hosted API signs every response), and pass through when no signature is\n\t * present (e.g. a self-hosted instance with no `STREAMS_SIGNING_PRIVATE_KEY`).\n\t * So verification is on by default against the hosted API without breaking\n\t * unsigned self-host deployments. An *invalid* signature always throws.\n\t * - **`true`** (or `{ publicKey }` to pin a known PEM) — *strict*: a missing\n\t * OR invalid signature throws `StreamsSignatureError`. Use this when you\n\t * require a portable, non-repudiable attestation and won't accept unsigned\n\t * data (it also closes the lenient mode's strip-the-header downgrade).\n\t * - **`false`** — off.\n\t *\n\t * The key is fetched once from `/public/streams/signing-key` (cached; a\n\t * rotated `X-Signature-KeyId` triggers one refresh) unless a PEM is pinned.\n\t */\n\tverify?: boolean | { publicKey: string };\n\t/**\n\t * Verify the bulk dumps manifest's ed25519 signature in `client.dumps.list()`\n\t * before trusting any file sha256 (default ON). Uses the same key source as\n\t * `verify` (fetches `/public/streams/signing-key`, or a pinned PEM). Pass\n\t * `false` to opt out. A missing or invalid signature throws\n\t * `StreamsSignatureError`.\n\t */\n\tverifyDumpsManifest?: boolean;\n};\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n\treturn baseUrl.replace(/\\/+$/, \"\");\n}\n\n/** Loopback hosts, where plain http carries no more exposure than the box\n * itself. Anywhere else, http means a network hop anyone on the path can\n * rewrite, key endpoint included. */\nfunction isLoopbackUrl(baseUrl: string): boolean {\n\ttry {\n\t\tconst { hostname } = new URL(baseUrl);\n\t\treturn (\n\t\t\thostname === \"localhost\" ||\n\t\t\thostname === \"127.0.0.1\" ||\n\t\t\thostname === \"::1\" ||\n\t\t\thostname === \"[::1]\" ||\n\t\t\thostname.startsWith(\"127.\")\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function createStreamsClient(\n\toptions: CreateStreamsClientOptions,\n): StreamsClient {\n\tconst baseUrl = normalizeBaseUrl(resolveBaseUrl(options.baseUrl));\n\t// Same credential precedence as every other client (explicit option, then\n\t// INSTANCE_TOKEN, then SECONDLAYER_API_KEY), so the same code authenticates\n\t// the same way whether it enters through `new SecondLayer()` or here.\n\tconst apiKey = resolveApiKey(options.apiKey);\n\tconst origin = options.origin ?? \"cli\";\n\tconst authHeaders = (): Record<string, string> => ({\n\t\t\"x-sl-origin\": origin,\n\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t});\n\tconst fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));\n\tconst verify = options.verify;\n\t// On by default, but lenient: the hosted API signs every response, while a\n\t// self-hosted instance without STREAMS_SIGNING_PRIVATE_KEY serves none.\n\t// Lenient verifies when a signature is present and passes through when it is\n\t// absent — so the default neither skips hosted verification nor breaks OSS.\n\t// `verify: true` / `{ publicKey }` is strict (missing signature throws);\n\t// `verify: false` is off. An invalid signature always throws.\n\tconst verifyMode: \"off\" | \"lenient\" | \"strict\" =\n\t\tverify === false ? \"off\" : verify === undefined ? \"lenient\" : \"strict\";\n\t// Strict mode promises the response came from the holder of a known key.\n\t// A key fetched over plain http from a host off the box is whatever the\n\t// path served, so the promise only holds with a pinned PEM there.\n\tif (\n\t\tverify === true &&\n\t\tbaseUrl.startsWith(\"http:\") &&\n\t\t!isLoopbackUrl(baseUrl)\n\t) {\n\t\tthrow new ValidationError(\n\t\t\t`verify: true over plain http to ${baseUrl} fetches the signing key from the same unprotected path it verifies. Pin the key with verify: { publicKey } (see GET /public/streams/signing-key), or use https.`,\n\t\t\t400,\n\t\t);\n\t}\n\n\t// Lazily resolve and cache the verification key alongside its id, so a\n\t// rotation (signalled by a changed `X-Signature-KeyId`) can be detected.\n\ttype VerificationKey = {\n\t\tkeyId: string;\n\t\tpublicKeyPem: string;\n\t\tpublicKey: ReturnType<typeof ed25519.loadEd25519PublicKey>;\n\t};\n\t// Only a successful fetch stays cached. A 5xx or a dropped socket on the\n\t// key endpoint used to park a rejected promise here for the life of the\n\t// client; now it surfaces as a retryable error and the next call refetches.\n\tlet keyPromise: Promise<VerificationKey> | null = null;\n\tfunction loadKey(): Promise<VerificationKey> {\n\t\tif (keyPromise) return keyPromise;\n\t\tconst pending = (async () => {\n\t\t\tif (typeof verify === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\tkeyId: ed25519.ed25519KeyId(verify.publicKey),\n\t\t\t\t\tpublicKeyPem: verify.publicKey,\n\t\t\t\t\tpublicKey: ed25519.loadEd25519PublicKey(verify.publicKey),\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet res: Response;\n\t\t\ttry {\n\t\t\t\tres = await fetchImpl(`${baseUrl}/public/streams/signing-key`);\n\t\t\t} catch {\n\t\t\t\tthrow new StreamsServerError(\n\t\t\t\t\t`Could not reach the signing key at ${baseUrl}/public/streams/signing-key. Retryable.`,\n\t\t\t\t\t0,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"SIGNING_KEY_UNAVAILABLE\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!res.ok) {\n\t\t\t\tif (res.status >= 500 || res.status === 429) {\n\t\t\t\t\tthrow new StreamsServerError(\n\t\t\t\t\t\t`Could not fetch signing key (${res.status}). Retryable.`,\n\t\t\t\t\t\tres.status,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"SIGNING_KEY_UNAVAILABLE\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t`Could not fetch signing key (${res.status}).`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = (await res.json()) as {\n\t\t\t\tpublic_key_pem?: string;\n\t\t\t\tkey_id?: string;\n\t\t\t};\n\t\t\tif (!body.public_key_pem) {\n\t\t\t\tthrow new StreamsSignatureError(\"Signing key response missing key.\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkeyId: body.key_id ?? ed25519.ed25519KeyId(body.public_key_pem),\n\t\t\t\tpublicKeyPem: body.public_key_pem,\n\t\t\t\tpublicKey: ed25519.loadEd25519PublicKey(body.public_key_pem),\n\t\t\t};\n\t\t})();\n\t\tkeyPromise = pending;\n\t\tpending.catch(() => {\n\t\t\tif (keyPromise === pending) keyPromise = null;\n\t\t});\n\t\treturn pending;\n\t}\n\t/** Resolve the key a response claims to be signed with. A fetched key\n\t * refreshes once on an unknown id; a pinned key never changes, so an\n\t * unknown id is a failure either way. Shared by REST reads and SSE frames. */\n\tasync function loadKeyFor(\n\t\tresponseKeyId: string | null | undefined,\n\t): Promise<VerificationKey> {\n\t\tlet key = await loadKey();\n\t\tif (!responseKeyId || responseKeyId === key.keyId) return key;\n\t\tif (typeof verify === \"object\") {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Response signed with key '${responseKeyId}', expected pinned key '${key.keyId}'.`,\n\t\t\t);\n\t\t}\n\t\t// Refresh once. A still-mismatched id (no re-loop) means the endpoint\n\t\t// does not serve the signing key: fail closed.\n\t\tkeyPromise = null;\n\t\tkey = await loadKey();\n\t\tif (responseKeyId !== key.keyId) {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Response signed with key '${responseKeyId}' not served by the signing-key endpoint.`,\n\t\t\t);\n\t\t}\n\t\treturn key;\n\t}\n\n\tconst dumps = createStreamsDumps({\n\t\tbaseUrl: options.dumpsBaseUrl,\n\t\tfetchImpl,\n\t\tverifyManifest: options.verifyDumpsManifest ?? true,\n\t\tloadPublicKeyPem: async () => (await loadKey()).publicKeyPem,\n\t});\n\n\tasync function request<T>(path: string): Promise<T> {\n\t\tconst response = await fetchImpl(`${baseUrl}${path}`, {\n\t\t\theaders: authHeaders(),\n\t\t});\n\t\tif (!response.ok) await mapStreamsError(response);\n\t\tconst text = await response.text();\n\t\tif (verifyMode !== \"off\") {\n\t\t\tconst signature = response.headers.get(\"X-Signature\");\n\t\t\tif (!signature) {\n\t\t\t\t// Strict requires a signature; lenient (default) lets an unsigned\n\t\t\t\t// response through — e.g. self-host with no signing key configured.\n\t\t\t\tif (verifyMode === \"strict\") {\n\t\t\t\t\tthrow new StreamsSignatureError(\"Response is missing X-Signature.\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst key = await loadKeyFor(response.headers.get(\"X-Signature-KeyId\"));\n\t\t\t\t// A signature is present, so verify it regardless of strict/lenient —\n\t\t\t\t// an invalid signature always fails closed.\n\t\t\t\tif (!ed25519.verifyEd25519(text, signature, key.publicKey)) {\n\t\t\t\t\tthrow new StreamsSignatureError();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn JSON.parse(text) as T;\n\t}\n\n\t// StreamsEventsFetchParams is a strict subset of StreamsEventsListParams, so\n\t// this is checked by the compiler rather than by a hand-copied destructure.\n\tconst fetchEvents: StreamsEventsFetcher = listEvents;\n\n\tfunction listReorgs(params: StreamsReorgsListParams) {\n\t\treturn request<StreamsReorgsListEnvelope>(\n\t\t\t`/v1/streams/reorgs${buildQuery({\n\t\t\t\tsince: params.since,\n\t\t\t\tlimit: params.limit,\n\t\t\t})}`,\n\t\t);\n\t}\n\t// Idle-tip reorg detection for the consume loop (one request per empty\n\t// page); the public `reorgs.list` is the same call.\n\tconst fetchReorgs = (params: { since: string }) => listReorgs(params);\n\n\tfunction encodeFilters(filters: StreamsFilterMap | undefined) {\n\t\treturn filters ? JSON.stringify(filters) : undefined;\n\t}\n\n\tasync function listEvents(\n\t\tparams: StreamsEventsListParams = {},\n\t): Promise<StreamsEventsEnvelope> {\n\t\treturn request<StreamsEventsEnvelope>(\n\t\t\t`/v1/streams/events${buildQuery({\n\t\t\t\tcursor: params.cursor,\n\t\t\t\tfrom_height: params.fromHeight,\n\t\t\t\tto_height: params.toHeight,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tsender: params.sender,\n\t\t\t\trecipient: params.recipient,\n\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\ttypes: params.types,\n\t\t\t\tnot_types: params.notTypes,\n\t\t\t\t// `vm` reads ordinal; omitted = Streams 1.0 (server default).\n\t\t\t\tclock: params.clock === \"vm\" ? \"vm\" : undefined,\n\t\t\t\tfilters: encodeFilters(params.filters),\n\t\t\t})}`,\n\t\t);\n\t}\n\n\t/**\n\t * One signature, two shapes: a flat filter with `onBatch`, or a labelled\n\t * `filters` map with a handler per label (or both). Deliberately NOT\n\t * overloaded — an overloaded interface member strips contextual typing from\n\t * every stub and alternate implementation of `StreamsClient`.\n\t */\n\tfunction consumeEvents<\n\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\tTTx = never,\n\t\tD extends boolean = false,\n\t>(\n\t\t// Redundant `sink` member: direct TTx inference site (inference\n\t\t// does not traverse the params alias).\n\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\tsink?: ConsumerSink<TTx>;\n\t\t},\n\t): Promise<StreamsEventsConsumeResult> {\n\t\tconst labels = params.filters ? Object.keys(params.filters) : [];\n\t\t// The \"at least one handler\" rule is conditional on `filters`, so it\n\t\t// can't live in the type without making `F` uninferrable. Fail loudly\n\t\t// instead of consuming pages into nothing.\n\t\tif (labels.length === 0 && !params.onBatch) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t\"consume requires onBatch, or filters + on handlers.\",\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t\tif (labels.length > 0 && !params.on && !params.onBatch) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t\"consume with filters requires on handlers (or onBatch).\",\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t\tconst dispatch = params.on as\n\t\t\t| Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t(\n\t\t\t\t\t\tevents: StreamsEvent[] | IndexEvent[],\n\t\t\t\t\t\tctx: Parameters<\n\t\t\t\t\t\t\tNonNullable<StreamsEventsConsumeParams<TTx>[\"onBatch\"]>\n\t\t\t\t\t\t>[2],\n\t\t\t\t\t) => void | Promise<void>\n\t\t\t >\n\t\t\t| undefined;\n\n\t\t// With `decoded: true`, events arrive as the flat Index-shaped rows —\n\t\t// decoding never appears in the handler.\n\t\tconst project = (events: StreamsEvent[]): StreamsEvent[] | IndexEvent[] =>\n\t\t\tparams.decoded ? events.map(decode) : events;\n\n\t\tconst onBatch: StreamsEventsConsumeParams<TTx>[\"onBatch\"] = async (\n\t\t\tevents,\n\t\t\tenvelope,\n\t\t\tctx,\n\t\t) => {\n\t\t\t// Label dispatch reads the wire `matched` array, so it has to run\n\t\t\t// BEFORE decode — the decoded row shape does not carry it.\n\t\t\tfor (const label of labels) {\n\t\t\t\tconst forLabel = events.filter((event) =>\n\t\t\t\t\tevent.matched?.includes(label),\n\t\t\t\t);\n\t\t\t\tif (forLabel.length === 0) continue;\n\t\t\t\tawait dispatch?.[label]?.(project(forLabel), ctx);\n\t\t\t}\n\t\t\t// The `decoded` flag is a runtime value here, so `project`'s return\n\t\t\t// can't be narrowed to the D-conditional the declared handler wants.\n\t\t\tconst userOnBatch = params.onBatch as StreamsEventsConsumeParams<\n\t\t\t\tTTx,\n\t\t\t\tboolean\n\t\t\t>[\"onBatch\"];\n\t\t\t// `onBatch`'s several legal return shapes collapse to one here: the\n\t\t\t// consume loop only ever reads a cursor string or nothing.\n\t\t\treturn (await userOnBatch?.(project(events), envelope, ctx)) as\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t};\n\n\t\treturn consumeStreamsEvents<TTx>({\n\t\t\tfromCursor: params.fromCursor,\n\t\t\tsink: params.sink,\n\t\t\tonProgress: params.onProgress,\n\t\t\tmode: params.mode,\n\t\t\tfinalizedOnly: params.finalizedOnly,\n\t\t\t...streamsFilters(params),\n\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\tfetchEvents,\n\t\t\tfetchReorgs,\n\t\t\tonBatch,\n\t\t\tonReorg: params.onReorg,\n\t\t\tmaxRollbackDepth: params.maxRollbackDepth,\n\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\tmaxPages: params.maxPages,\n\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\tsignal: params.signal,\n\t\t\tretryCount: params.retryCount,\n\t\t\tretryDelay: params.retryDelay,\n\t\t\tonError: params.onError,\n\t\t});\n\t}\n\n\treturn {\n\t\tconsume(params: StreamsConsumeParams = {}) {\n\t\t\treturn iterateStreamsBatches({\n\t\t\t\tfromCursor: params.cursor,\n\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\tintervalMs: params.intervalMs ?? 2000,\n\t\t\t\t...streamsFilters(params),\n\t\t\t\tsignal: params.signal,\n\t\t\t\tfetchEvents,\n\t\t\t});\n\t\t},\n\t\tevents: {\n\t\t\t// One wire call; the overloads narrow the row type by `clock`/`types`.\n\t\t\tlist: listEvents as StreamsClient[\"events\"][\"list\"],\n\t\t\tbyTxId(txId: string) {\n\t\t\t\treturn request<StreamsEventsListEnvelope>(\n\t\t\t\t\t`/v1/streams/events/${encodeURIComponent(txId)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t\tconsume: consumeEvents,\n\t\t\tstream(params: StreamsEventsStreamParams = {}) {\n\t\t\t\treturn streamStreamsEvents({\n\t\t\t\t\tfromCursor: params.fromCursor,\n\t\t\t\t\t// Includes the labelled OR-groups: dropping them here silently\n\t\t\t\t\t// widened the stream to the FULL firehose (billed per row).\n\t\t\t\t\t...streamsFilters(params),\n\t\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\t\t\tmaxPages: params.maxPages,\n\t\t\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\tfetchEvents,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsubscribe(params: StreamsEventsSubscribeParams) {\n\t\t\t\treturn subscribeStreamsEvents({\n\t\t\t\t\tbaseUrl,\n\t\t\t\t\theaders: authHeaders(),\n\t\t\t\t\tfetchImpl,\n\t\t\t\t\tverify: verifyMode,\n\t\t\t\t\tloadKey: loadKeyFor,\n\t\t\t\t\treconnectDelayMs: params.reconnectDelayMs,\n\t\t\t\t\tstaleAfterMs: params.staleAfterMs,\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t},\n\t\t\tasync replay(params: StreamsEventsReplayParams) {\n\t\t\t\tconst fromCursor =\n\t\t\t\t\tparams.from === \"genesis\" ? null : (params.from ?? null);\n\t\t\t\tconst fromBlock = fromCursor ? cursorTuple(fromCursor)[0] : 0;\n\t\t\t\tconst manifest = await dumps.list();\n\n\t\t\t\t// Hydrate finalized history from dumps, in block order. Files\n\t\t\t\t// ending at or below `from` carry nothing new; a file straddling\n\t\t\t\t// it is handed over whole, with `from` so the handler can skip\n\t\t\t\t// the rows at or below the checkpoint (file-granular delivery).\n\t\t\t\tconst files = manifest.files\n\t\t\t\t\t.filter((file) => file.to_block >= fromBlock)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(file) =>\n\t\t\t\t\t\t\tfromCursor === null ||\n\t\t\t\t\t\t\tfile.max_cursor === null ||\n\t\t\t\t\t\t\tmaxCursor(fromCursor, file.max_cursor) !== fromCursor,\n\t\t\t\t\t)\n\t\t\t\t\t.sort(\n\t\t\t\t\t\t(a, b) => a.from_block - b.from_block || a.to_block - b.to_block,\n\t\t\t\t\t);\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\tif (params.signal?.aborted) break;\n\t\t\t\t\tawait params.onDumpFile(file, { from: fromCursor });\n\t\t\t\t}\n\n\t\t\t\t// Seam: tail live from just past the dumped coverage. Cursor input is\n\t\t\t\t// exclusive, so the first live event is strictly after the last dump.\n\t\t\t\tconst seam = maxCursor(fromCursor, manifest.latest_finalized_cursor);\n\t\t\t\treturn consumeStreamsEvents({\n\t\t\t\t\tfromCursor: seam,\n\t\t\t\t\tmode: params.mode ?? \"tail\",\n\t\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\t\t// Live-tail narrowing only — the dump phase above hands over\n\t\t\t\t\t// whole all-type files by design.\n\t\t\t\t\ttypes: params.types,\n\t\t\t\t\tnotTypes: params.notTypes,\n\t\t\t\t\tfilters: params.filters,\n\t\t\t\t\tfetchEvents,\n\t\t\t\t\tonBatch: params.onBatch,\n\t\t\t\t\tonReorg: params.onReorg,\n\t\t\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\t\t\tmaxPages: params.maxPages,\n\t\t\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tblocks: {\n\t\t\tevents(heightOrHash: number | string) {\n\t\t\t\treturn request<StreamsEventsListEnvelope>(\n\t\t\t\t\t`/v1/streams/blocks/${encodeURIComponent(String(heightOrHash))}/events`,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\treorgs: { list: listReorgs },\n\t\tdumps,\n\t\tcanonical(height: number) {\n\t\t\treturn request<StreamsCanonicalBlock>(`/v1/streams/canonical/${height}`);\n\t\t},\n\t\ttip() {\n\t\t\treturn request<StreamsTip>(\"/v1/streams/tip\");\n\t\t},\n\t};\n}\n",
|
|
15
|
+
"import { ed25519 } from \"@secondlayer/shared\";\nimport { buildQuery, resolveApiKey, resolveBaseUrl } from \"../base.ts\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink } from \"../sinks/types.ts\";\nimport {\n\ttype StreamsEventsFetcher,\n\tconsumeStreamsEvents,\n\titerateStreamsBatches,\n\tstreamStreamsEvents,\n} from \"./consumer.ts\";\nimport { Cursor } from \"./cursor.ts\";\nimport { decode } from \"./decode.ts\";\nimport { createStreamsDumps } from \"./dumps.ts\";\nimport {\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tValidationError,\n\tmapStreamsError,\n} from \"./errors.ts\";\nimport { subscribeStreamsEvents } from \"./subscribe.ts\";\nimport type {\n\tFetchLike,\n\tStreamsCanonicalBlock,\n\tStreamsClient,\n\tStreamsConsumeParams,\n\tStreamsEvent,\n\tStreamsEventType,\n\tStreamsEventsConsumeParams,\n\tStreamsEventsConsumeResult,\n\tStreamsEventsEnvelope,\n\tStreamsEventsListEnvelope,\n\tStreamsEventsListParams,\n\tStreamsEventsReplayParams,\n\tStreamsEventsStreamParams,\n\tStreamsEventsSubscribeParams,\n\tStreamsFilterMap,\n\tStreamsFilterValue,\n\tStreamsReorgsListEnvelope,\n\tStreamsReorgsListParams,\n\tStreamsTip,\n} from \"./types.ts\";\n\n/** Parse a `<block>:<index>` cursor; null sorts before genesis. */\nfunction cursorTuple(cursor: string | null): [number, number] {\n\tif (!cursor) return [-1, -1];\n\tconst { blockHeight, eventIndex } = Cursor.parse(cursor);\n\treturn [blockHeight, eventIndex];\n}\n\n/** The greater of two cursors (later in the stream). */\nfunction maxCursor(a: string | null, b: string | null): string | null {\n\tconst [ah, ai] = cursorTuple(a);\n\tconst [bh, bi] = cursorTuple(b);\n\treturn ah > bh || (ah === bh && ai >= bi) ? a : b;\n}\n\n/**\n * The narrowing set every Streams read forwards verbatim to the consumer\n * loops. Kept in one place because each field is optional: a forgotten one is\n * a type-checkable object that silently widens the stream toward the full\n * firehose — which is billed per row, and has happened. `events.replay()`\n * deliberately forwards a subset and stays explicit.\n */\nfunction streamsFilters(params: {\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\tfilters?: StreamsFilterMap;\n}) {\n\treturn {\n\t\ttypes: params.types,\n\t\tnotTypes: params.notTypes,\n\t\tcontractId: params.contractId,\n\t\tsender: params.sender,\n\t\trecipient: params.recipient,\n\t\tassetIdentifier: params.assetIdentifier,\n\t\tfilters: params.filters,\n\t};\n}\n\nexport type CreateStreamsClientOptions = {\n\tapiKey?: string;\n\tbaseUrl?: string;\n\t/** Deploy origin label sent as `x-sl-origin` (telemetry). Defaults to `cli`. */\n\torigin?: \"cli\" | \"mcp\" | \"session\";\n\tfetchImpl?: FetchLike;\n\t/**\n\t * Public base URL for bulk parquet dumps (the R2/CDN bucket root). Required\n\t * to use `client.dumps`. See `GET /public/streams/dumps/manifest`.\n\t */\n\tdumpsBaseUrl?: string;\n\t/**\n\t * Verify the ed25519 `X-Signature` on every REST response and per-frame SSE\n\t * signature. Three states:\n\t * - **default (omitted)** — *lenient*: verify when the server signs (the\n\t * hosted API signs every response), and pass through when no signature is\n\t * present (e.g. a self-hosted instance with no `STREAMS_SIGNING_PRIVATE_KEY`).\n\t * So verification is on by default against the hosted API without breaking\n\t * unsigned self-host deployments. An *invalid* signature always throws.\n\t * - **`true`** (or `{ publicKey }` to pin a known PEM) — *strict*: a missing\n\t * OR invalid signature throws `StreamsSignatureError`. Use this when you\n\t * require a portable, non-repudiable attestation and won't accept unsigned\n\t * data (it also closes the lenient mode's strip-the-header downgrade).\n\t * - **`false`** — off.\n\t *\n\t * The key is fetched once from `/public/streams/signing-key` (cached; a\n\t * rotated `X-Signature-KeyId` triggers one refresh) unless a PEM is pinned.\n\t */\n\tverify?: boolean | { publicKey: string };\n\t/**\n\t * Verify the bulk dumps manifest's ed25519 signature in `client.dumps.list()`\n\t * before trusting any file sha256 (default ON). Uses the same key source as\n\t * `verify` (fetches `/public/streams/signing-key`, or a pinned PEM). Pass\n\t * `false` to opt out. A missing or invalid signature throws\n\t * `StreamsSignatureError`.\n\t */\n\tverifyDumpsManifest?: boolean;\n};\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n\treturn baseUrl.replace(/\\/+$/, \"\");\n}\n\n/** Loopback hosts, where plain http carries no more exposure than the box\n * itself. Anywhere else, http means a network hop anyone on the path can\n * rewrite, key endpoint included. */\nfunction isLoopbackUrl(baseUrl: string): boolean {\n\ttry {\n\t\tconst { hostname } = new URL(baseUrl);\n\t\treturn (\n\t\t\thostname === \"localhost\" ||\n\t\t\thostname === \"127.0.0.1\" ||\n\t\t\thostname === \"::1\" ||\n\t\t\thostname === \"[::1]\" ||\n\t\t\thostname.startsWith(\"127.\")\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function createStreamsClient(\n\toptions: CreateStreamsClientOptions,\n): StreamsClient {\n\tconst baseUrl = normalizeBaseUrl(resolveBaseUrl(options.baseUrl));\n\t// Same credential precedence as every other client (explicit option, then\n\t// INSTANCE_TOKEN, then SECONDLAYER_API_KEY), so the same code authenticates\n\t// the same way whether it enters through `new SecondLayer()` or here.\n\tconst apiKey = resolveApiKey(options.apiKey);\n\tconst origin = options.origin ?? \"cli\";\n\tconst authHeaders = (): Record<string, string> => ({\n\t\t\"x-sl-origin\": origin,\n\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t});\n\tconst fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));\n\tconst verify = options.verify;\n\t// On by default, but lenient: the hosted API signs every response, while a\n\t// self-hosted instance without STREAMS_SIGNING_PRIVATE_KEY serves none.\n\t// Lenient verifies when a signature is present and passes through when it is\n\t// absent — so the default neither skips hosted verification nor breaks OSS.\n\t// `verify: true` / `{ publicKey }` is strict (missing signature throws);\n\t// `verify: false` is off. An invalid signature always throws.\n\tconst verifyMode: \"off\" | \"lenient\" | \"strict\" =\n\t\tverify === false ? \"off\" : verify === undefined ? \"lenient\" : \"strict\";\n\t// Strict mode promises the response came from the holder of a known key.\n\t// A key fetched over plain http from a host off the box is whatever the\n\t// path served, so the promise only holds with a pinned PEM there.\n\tif (\n\t\tverify === true &&\n\t\tbaseUrl.startsWith(\"http:\") &&\n\t\t!isLoopbackUrl(baseUrl)\n\t) {\n\t\tthrow new ValidationError(\n\t\t\t`verify: true over plain http to ${baseUrl} fetches the signing key from the same unprotected path it verifies. Pin the key with verify: { publicKey } (see GET /public/streams/signing-key), or use https.`,\n\t\t\t400,\n\t\t);\n\t}\n\n\t// Lazily resolve and cache the verification key alongside its id, so a\n\t// rotation (signalled by a changed `X-Signature-KeyId`) can be detected.\n\ttype VerificationKey = {\n\t\tkeyId: string;\n\t\tpublicKeyPem: string;\n\t\tpublicKey: ReturnType<typeof ed25519.loadEd25519PublicKey>;\n\t};\n\t// Only a successful fetch stays cached. A 5xx or a dropped socket on the\n\t// key endpoint used to park a rejected promise here for the life of the\n\t// client; now it surfaces as a retryable error and the next call refetches.\n\tlet keyPromise: Promise<VerificationKey> | null = null;\n\tfunction loadKey(): Promise<VerificationKey> {\n\t\tif (keyPromise) return keyPromise;\n\t\tconst pending = (async () => {\n\t\t\tif (typeof verify === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\tkeyId: ed25519.ed25519KeyId(verify.publicKey),\n\t\t\t\t\tpublicKeyPem: verify.publicKey,\n\t\t\t\t\tpublicKey: ed25519.loadEd25519PublicKey(verify.publicKey),\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet res: Response;\n\t\t\ttry {\n\t\t\t\tres = await fetchImpl(`${baseUrl}/public/streams/signing-key`);\n\t\t\t} catch {\n\t\t\t\tthrow new StreamsServerError(\n\t\t\t\t\t`Could not reach the signing key at ${baseUrl}/public/streams/signing-key. Retryable.`,\n\t\t\t\t\t0,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"SIGNING_KEY_UNAVAILABLE\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!res.ok) {\n\t\t\t\tif (res.status >= 500 || res.status === 429) {\n\t\t\t\t\tthrow new StreamsServerError(\n\t\t\t\t\t\t`Could not fetch signing key (${res.status}). Retryable.`,\n\t\t\t\t\t\tres.status,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"SIGNING_KEY_UNAVAILABLE\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t`Could not fetch signing key (${res.status}).`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = (await res.json()) as {\n\t\t\t\tpublic_key_pem?: string;\n\t\t\t\tkey_id?: string;\n\t\t\t};\n\t\t\tif (!body.public_key_pem) {\n\t\t\t\tthrow new StreamsSignatureError(\"Signing key response missing key.\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkeyId: body.key_id ?? ed25519.ed25519KeyId(body.public_key_pem),\n\t\t\t\tpublicKeyPem: body.public_key_pem,\n\t\t\t\tpublicKey: ed25519.loadEd25519PublicKey(body.public_key_pem),\n\t\t\t};\n\t\t})();\n\t\tkeyPromise = pending;\n\t\tpending.catch(() => {\n\t\t\tif (keyPromise === pending) keyPromise = null;\n\t\t});\n\t\treturn pending;\n\t}\n\t/** Resolve the key a response claims to be signed with. A fetched key\n\t * refreshes once on an unknown id; a pinned key never changes, so an\n\t * unknown id is a failure either way. Shared by REST reads and SSE frames. */\n\tasync function loadKeyFor(\n\t\tresponseKeyId: string | null | undefined,\n\t): Promise<VerificationKey> {\n\t\tlet key = await loadKey();\n\t\tif (!responseKeyId || responseKeyId === key.keyId) return key;\n\t\tif (typeof verify === \"object\") {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Response signed with key '${responseKeyId}', expected pinned key '${key.keyId}'.`,\n\t\t\t);\n\t\t}\n\t\t// Refresh once. A still-mismatched id (no re-loop) means the endpoint\n\t\t// does not serve the signing key: fail closed.\n\t\tkeyPromise = null;\n\t\tkey = await loadKey();\n\t\tif (responseKeyId !== key.keyId) {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Response signed with key '${responseKeyId}' not served by the signing-key endpoint.`,\n\t\t\t);\n\t\t}\n\t\treturn key;\n\t}\n\n\tconst dumps = createStreamsDumps({\n\t\tbaseUrl: options.dumpsBaseUrl,\n\t\tfetchImpl,\n\t\tverifyManifest: options.verifyDumpsManifest ?? true,\n\t\tloadPublicKeyPem: async () => (await loadKey()).publicKeyPem,\n\t});\n\n\tasync function request<T>(path: string): Promise<T> {\n\t\tconst response = await fetchImpl(`${baseUrl}${path}`, {\n\t\t\theaders: authHeaders(),\n\t\t});\n\t\tif (!response.ok) await mapStreamsError(response);\n\t\tconst text = await response.text();\n\t\tif (verifyMode !== \"off\") {\n\t\t\tconst signature = response.headers.get(\"X-Signature\");\n\t\t\tif (!signature) {\n\t\t\t\t// Strict requires a signature; lenient (default) lets an unsigned\n\t\t\t\t// response through — e.g. self-host with no signing key configured.\n\t\t\t\tif (verifyMode === \"strict\") {\n\t\t\t\t\tthrow new StreamsSignatureError(\"Response is missing X-Signature.\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst key = await loadKeyFor(response.headers.get(\"X-Signature-KeyId\"));\n\t\t\t\t// A signature is present, so verify it regardless of strict/lenient —\n\t\t\t\t// an invalid signature always fails closed.\n\t\t\t\tif (!ed25519.verifyEd25519(text, signature, key.publicKey)) {\n\t\t\t\t\tthrow new StreamsSignatureError();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn JSON.parse(text) as T;\n\t}\n\n\t// StreamsEventsFetchParams is a strict subset of StreamsEventsListParams, so\n\t// this is checked by the compiler rather than by a hand-copied destructure.\n\tconst fetchEvents: StreamsEventsFetcher = listEvents;\n\n\tfunction listReorgs(params: StreamsReorgsListParams) {\n\t\treturn request<StreamsReorgsListEnvelope>(\n\t\t\t`/v1/streams/reorgs${buildQuery({\n\t\t\t\tsince: params.since,\n\t\t\t\tlimit: params.limit,\n\t\t\t})}`,\n\t\t);\n\t}\n\t// Idle-tip reorg detection for the consume loop (one request per empty\n\t// page); the public `reorgs.list` is the same call.\n\tconst fetchReorgs = (params: { since: string }) => listReorgs(params);\n\n\tfunction encodeFilters(filters: StreamsFilterMap | undefined) {\n\t\treturn filters ? JSON.stringify(filters) : undefined;\n\t}\n\n\tasync function listEvents(\n\t\tparams: StreamsEventsListParams = {},\n\t): Promise<StreamsEventsEnvelope> {\n\t\treturn request<StreamsEventsEnvelope>(\n\t\t\t`/v1/streams/events${buildQuery({\n\t\t\t\tcursor: params.cursor,\n\t\t\t\tfrom_height: params.fromHeight,\n\t\t\t\tto_height: params.toHeight,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tcontract_id: params.contractId,\n\t\t\t\tsender: params.sender,\n\t\t\t\trecipient: params.recipient,\n\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\ttypes: params.types,\n\t\t\t\tnot_types: params.notTypes,\n\t\t\t\t// `vm` reads ordinal; omitted = Streams 1.0 (server default).\n\t\t\t\tclock: params.clock === \"vm\" ? \"vm\" : undefined,\n\t\t\t\tfilters: encodeFilters(params.filters),\n\t\t\t})}`,\n\t\t);\n\t}\n\n\t/**\n\t * One signature, two shapes: a flat filter with `onBatch`, or a labelled\n\t * `filters` map with a handler per label (or both). Deliberately NOT\n\t * overloaded — an overloaded interface member strips contextual typing from\n\t * every stub and alternate implementation of `StreamsClient`.\n\t */\n\tfunction consumeEvents<\n\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\tTTx = never,\n\t\tD extends boolean = false,\n\t>(\n\t\t// Redundant `sink` member: direct TTx inference site (inference\n\t\t// does not traverse the params alias).\n\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\tsink?: ConsumerSink<TTx>;\n\t\t},\n\t): Promise<StreamsEventsConsumeResult> {\n\t\tconst labels = params.filters ? Object.keys(params.filters) : [];\n\t\t// The \"at least one handler\" rule is conditional on `filters`, so it\n\t\t// can't live in the type without making `F` uninferrable. Fail loudly\n\t\t// instead of consuming pages into nothing.\n\t\tif (labels.length === 0 && !params.onBatch) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t\"consume requires onBatch, or filters + on handlers.\",\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t\tif (labels.length > 0 && !params.on && !params.onBatch) {\n\t\t\tthrow new ValidationError(\n\t\t\t\t\"consume with filters requires on handlers (or onBatch).\",\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\t\tconst dispatch = params.on as\n\t\t\t| Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t(\n\t\t\t\t\t\tevents: StreamsEvent[] | IndexEvent[],\n\t\t\t\t\t\tctx: Parameters<\n\t\t\t\t\t\t\tNonNullable<StreamsEventsConsumeParams<TTx>[\"onBatch\"]>\n\t\t\t\t\t\t>[2],\n\t\t\t\t\t) => void | Promise<void>\n\t\t\t >\n\t\t\t| undefined;\n\n\t\t// With `decoded: true`, events arrive as the flat Index-shaped rows —\n\t\t// decoding never appears in the handler.\n\t\tconst project = (events: StreamsEvent[]): StreamsEvent[] | IndexEvent[] =>\n\t\t\tparams.decoded ? events.map(decode) : events;\n\n\t\tconst onBatch: StreamsEventsConsumeParams<TTx>[\"onBatch\"] = async (\n\t\t\tevents,\n\t\t\tenvelope,\n\t\t\tctx,\n\t\t) => {\n\t\t\t// Label dispatch reads the wire `matched` array, so it has to run\n\t\t\t// BEFORE decode — the decoded row shape does not carry it.\n\t\t\tfor (const label of labels) {\n\t\t\t\tconst forLabel = events.filter((event) =>\n\t\t\t\t\tevent.matched?.includes(label),\n\t\t\t\t);\n\t\t\t\tif (forLabel.length === 0) continue;\n\t\t\t\tawait dispatch?.[label]?.(project(forLabel), ctx);\n\t\t\t}\n\t\t\t// The `decoded` flag is a runtime value here, so `project`'s return\n\t\t\t// can't be narrowed to the D-conditional the declared handler wants.\n\t\t\tconst userOnBatch = params.onBatch as StreamsEventsConsumeParams<\n\t\t\t\tTTx,\n\t\t\t\tboolean\n\t\t\t>[\"onBatch\"];\n\t\t\t// `onBatch`'s several legal return shapes collapse to one here: the\n\t\t\t// consume loop only ever reads a cursor string or nothing.\n\t\t\treturn (await userOnBatch?.(project(events), envelope, ctx)) as\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t};\n\n\t\treturn consumeStreamsEvents<TTx>({\n\t\t\tfromCursor: params.fromCursor,\n\t\t\tsink: params.sink,\n\t\t\tonProgress: params.onProgress,\n\t\t\tmode: params.mode,\n\t\t\tfinalizedOnly: params.finalizedOnly,\n\t\t\t...streamsFilters(params),\n\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\tfetchEvents,\n\t\t\tfetchReorgs,\n\t\t\tonBatch,\n\t\t\tonReorg: params.onReorg,\n\t\t\tmaxRollbackDepth: params.maxRollbackDepth,\n\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\tmaxPages: params.maxPages,\n\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\tsignal: params.signal,\n\t\t\tretryCount: params.retryCount,\n\t\t\tretryDelay: params.retryDelay,\n\t\t\tonError: params.onError,\n\t\t\twake: params.wake,\n\t\t});\n\t}\n\n\treturn {\n\t\tconsume(params: StreamsConsumeParams = {}) {\n\t\t\treturn iterateStreamsBatches({\n\t\t\t\tfromCursor: params.cursor,\n\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\tintervalMs: params.intervalMs ?? 2000,\n\t\t\t\t...streamsFilters(params),\n\t\t\t\tsignal: params.signal,\n\t\t\t\tfetchEvents,\n\t\t\t});\n\t\t},\n\t\tevents: {\n\t\t\t// One wire call; the overloads narrow the row type by `clock`/`types`.\n\t\t\tlist: listEvents as StreamsClient[\"events\"][\"list\"],\n\t\t\tbyTxId(txId: string) {\n\t\t\t\treturn request<StreamsEventsListEnvelope>(\n\t\t\t\t\t`/v1/streams/events/${encodeURIComponent(txId)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t\tconsume: consumeEvents,\n\t\t\tstream(params: StreamsEventsStreamParams = {}) {\n\t\t\t\treturn streamStreamsEvents({\n\t\t\t\t\tfromCursor: params.fromCursor,\n\t\t\t\t\t// Includes the labelled OR-groups: dropping them here silently\n\t\t\t\t\t// widened the stream to the FULL firehose (billed per row).\n\t\t\t\t\t...streamsFilters(params),\n\t\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\t\t\tmaxPages: params.maxPages,\n\t\t\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\tfetchEvents,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsubscribe(params: StreamsEventsSubscribeParams) {\n\t\t\t\treturn subscribeStreamsEvents({\n\t\t\t\t\tbaseUrl,\n\t\t\t\t\theaders: authHeaders(),\n\t\t\t\t\tfetchImpl,\n\t\t\t\t\tverify: verifyMode,\n\t\t\t\t\tloadKey: loadKeyFor,\n\t\t\t\t\treconnectDelayMs: params.reconnectDelayMs,\n\t\t\t\t\tstaleAfterMs: params.staleAfterMs,\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t},\n\t\t\tasync replay(params: StreamsEventsReplayParams) {\n\t\t\t\tconst fromCursor =\n\t\t\t\t\tparams.from === \"genesis\" ? null : (params.from ?? null);\n\t\t\t\tconst fromBlock = fromCursor ? cursorTuple(fromCursor)[0] : 0;\n\t\t\t\tconst manifest = await dumps.list();\n\n\t\t\t\t// Hydrate finalized history from dumps, in block order. Files\n\t\t\t\t// ending at or below `from` carry nothing new; a file straddling\n\t\t\t\t// it is handed over whole, with `from` so the handler can skip\n\t\t\t\t// the rows at or below the checkpoint (file-granular delivery).\n\t\t\t\tconst files = manifest.files\n\t\t\t\t\t.filter((file) => file.to_block >= fromBlock)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(file) =>\n\t\t\t\t\t\t\tfromCursor === null ||\n\t\t\t\t\t\t\tfile.max_cursor === null ||\n\t\t\t\t\t\t\tmaxCursor(fromCursor, file.max_cursor) !== fromCursor,\n\t\t\t\t\t)\n\t\t\t\t\t.sort(\n\t\t\t\t\t\t(a, b) => a.from_block - b.from_block || a.to_block - b.to_block,\n\t\t\t\t\t);\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\tif (params.signal?.aborted) break;\n\t\t\t\t\tawait params.onDumpFile(file, { from: fromCursor });\n\t\t\t\t}\n\n\t\t\t\t// Seam: tail live from just past the dumped coverage. Cursor input is\n\t\t\t\t// exclusive, so the first live event is strictly after the last dump.\n\t\t\t\tconst seam = maxCursor(fromCursor, manifest.latest_finalized_cursor);\n\t\t\t\treturn consumeStreamsEvents({\n\t\t\t\t\tfromCursor: seam,\n\t\t\t\t\tmode: params.mode ?? \"tail\",\n\t\t\t\t\tbatchSize: params.batchSize ?? 100,\n\t\t\t\t\t// Live-tail narrowing only — the dump phase above hands over\n\t\t\t\t\t// whole all-type files by design.\n\t\t\t\t\ttypes: params.types,\n\t\t\t\t\tnotTypes: params.notTypes,\n\t\t\t\t\tfilters: params.filters,\n\t\t\t\t\tfetchEvents,\n\t\t\t\t\tonBatch: params.onBatch,\n\t\t\t\t\tonReorg: params.onReorg,\n\t\t\t\t\temptyBackoffMs: params.emptyBackoffMs,\n\t\t\t\t\tmaxPages: params.maxPages,\n\t\t\t\t\tmaxEmptyPolls: params.maxEmptyPolls,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tblocks: {\n\t\t\tevents(heightOrHash: number | string) {\n\t\t\t\treturn request<StreamsEventsListEnvelope>(\n\t\t\t\t\t`/v1/streams/blocks/${encodeURIComponent(String(heightOrHash))}/events`,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\treorgs: { list: listReorgs },\n\t\tdumps,\n\t\tcanonical(height: number) {\n\t\t\treturn request<StreamsCanonicalBlock>(`/v1/streams/canonical/${height}`);\n\t\t},\n\t\ttip() {\n\t\t\treturn request<StreamsTip>(\"/v1/streams/tip\");\n\t\t},\n\t};\n}\n",
|
|
16
16
|
"import {\n\toptionalString,\n\trequireAmountField,\n\trequireHexValue,\n\trequireString,\n} from \"@secondlayer/shared/streams-rows\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\n/**\n * Decode a raw Streams event into the SAME flat, `event_type`-discriminated\n * row shape Index serves — so Streams consumption reads identically to Index\n * consumption, with one call instead of eleven guard+decode pairs.\n *\n * ```ts\n * for (const event of envelope.events) {\n * const row = decode(event);\n * if (row.event_type === \"ft_transfer\") row.amount; // string, narrowed\n * }\n * ```\n *\n * Prefer `decoded: true` on `streams.events.consume` — then decoding never\n * appears in your code at all.\n */\nexport function decode(event: StreamsEvent): IndexEvent {\n\tconst base = {\n\t\tcursor: event.cursor,\n\t\tblock_height: event.block_height,\n\t\tblock_time: event.ts,\n\t\ttx_id: event.tx_id,\n\t\ttx_index: event.tx_index,\n\t\tevent_index: event.event_index,\n\t\tcontract_id: event.contract_id,\n\t};\n\t// Payloads are validated field-by-field (never trusted casts): a malformed\n\t// payload throws with the event type and field named.\n\tconst p = event.payload as Record<string, unknown>;\n\tswitch (event.event_type) {\n\t\tcase \"stx_transfer\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"stx_transfer\",\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t\tmemo: optionalString(p.memo),\n\t\t\t};\n\t\tcase \"stx_mint\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"stx_mint\",\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t};\n\t\tcase \"stx_burn\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"stx_burn\",\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t};\n\t\tcase \"stx_lock\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"stx_lock\",\n\t\t\t\tsender: requireString(p, \"locked_address\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"locked_amount\", event.event_type),\n\t\t\t\tpayload: { unlock_height: optionalString(p.unlock_height) },\n\t\t\t};\n\t\tcase \"ft_transfer\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"ft_transfer\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t};\n\t\tcase \"ft_mint\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"ft_mint\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t};\n\t\tcase \"ft_burn\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"ft_burn\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\tamount: requireAmountField(p, \"amount\", event.event_type),\n\t\t\t};\n\t\tcase \"nft_transfer\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"nft_transfer\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tvalue: requireHexValue(p, event.event_type),\n\t\t\t};\n\t\tcase \"nft_mint\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"nft_mint\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\trecipient: requireString(p, \"recipient\", event.event_type),\n\t\t\t\tvalue: requireHexValue(p, event.event_type),\n\t\t\t};\n\t\tcase \"nft_burn\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"nft_burn\",\n\t\t\t\tasset_identifier: requireString(\n\t\t\t\t\tp,\n\t\t\t\t\t\"asset_identifier\",\n\t\t\t\t\tevent.event_type,\n\t\t\t\t),\n\t\t\t\tsender: requireString(p, \"sender\", event.event_type),\n\t\t\t\tvalue: requireHexValue(p, event.event_type),\n\t\t\t};\n\t\tcase \"print\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tevent_type: \"print\",\n\t\t\t\tpayload: {\n\t\t\t\t\ttopic: optionalString(p.topic),\n\t\t\t\t\tvalue: p.value,\n\t\t\t\t\traw_value: optionalString(p.raw_value),\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n",
|
|
17
17
|
"import { createHash } from \"node:crypto\";\nimport { verifyStreamsBulkManifestSignature } from \"@secondlayer/shared/streams-bulk-manifest\";\nimport { defaultSleep, fetchPageWithRetry } from \"./consumer.ts\";\nimport { StreamsServerError, StreamsSignatureError } from \"./errors.ts\";\nimport type {\n\tFetchLike,\n\tStreamsDumpFile,\n\tStreamsDumps,\n\tStreamsDumpsManifest,\n} from \"./types.ts\";\n\n/**\n * Bulk parquet dumps: the cold backfill path for \"download all the raw data\".\n *\n * The manifest lives at `<dumpsBaseUrl>/manifest/latest.json` and each file's\n * `path` is the object key under the same base. Downloads are verified against\n * the manifest sha256 so a truncated or tampered file is rejected.\n *\n * When `verifyManifest` is set (the default), the manifest's own ed25519\n * signature is checked (against the published Streams key) BEFORE any file sha256\n * is trusted — a sha256 is only as trustworthy as the manifest it came from.\n */\nexport function createStreamsDumps(opts: {\n\tbaseUrl?: string;\n\tfetchImpl: FetchLike;\n\tverifyManifest?: boolean;\n\tloadPublicKeyPem?: () => Promise<string>;\n}): StreamsDumps {\n\tconst baseUrl = opts.baseUrl?.replace(/\\/+$/, \"\");\n\n\tfunction requireBaseUrl(): string {\n\t\tif (!baseUrl) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t\"Streams dumps require `dumpsBaseUrl` on createStreamsClient.\",\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\treturn baseUrl;\n\t}\n\n\tfunction fileUrl(file: StreamsDumpFile): string {\n\t\tconst base = requireBaseUrl();\n\t\tconst path = file.path.replace(/^\\/+/, \"\");\n\t\t// Manifest file paths are bucket-root-absolute (they embed the dataset\n\t\t// prefix), while `baseUrl` already ends with that prefix — strip the\n\t\t// overlap so both the manifest and its files resolve from one base URL.\n\t\ttry {\n\t\t\tconst basePath = new URL(base).pathname.replace(/^\\/+|\\/+$/g, \"\");\n\t\t\tif (basePath && path.startsWith(`${basePath}/`)) {\n\t\t\t\treturn `${base}/${path.slice(basePath.length + 1)}`;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Non-URL base (tests, relative proxies): fall through to plain join.\n\t\t}\n\t\treturn `${base}/${path}`;\n\t}\n\n\tasync function list(): Promise<StreamsDumpsManifest> {\n\t\tconst url = `${requireBaseUrl()}/manifest/latest.json`;\n\t\tconst res = await opts.fetchImpl(url);\n\t\tif (!res.ok) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Could not fetch dumps manifest (${res.status}).`,\n\t\t\t\tres.status,\n\t\t\t);\n\t\t}\n\t\tconst manifest = (await res.json()) as StreamsDumpsManifest;\n\t\tif (opts.verifyManifest) {\n\t\t\tif (!opts.loadPublicKeyPem) {\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\"Manifest verification is on but no signing key source is configured.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst publicKeyPem = await opts.loadPublicKeyPem();\n\t\t\tif (!verifyStreamsBulkManifestSignature(manifest, publicKeyPem)) {\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\"Dumps manifest signature is missing or invalid.\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn manifest;\n\t}\n\n\t/** Fetch one file and hash it as it arrives. Each chunk goes through the\n\t * digest once and is kept once, so a multi-hundred-MB parquet costs its\n\t * own size in memory rather than double. A dropped socket or 5xx retries\n\t * the whole file under the same policy `consume()` uses for pages. */\n\tasync function download(file: StreamsDumpFile): Promise<Uint8Array> {\n\t\treturn fetchPageWithRetry(() => downloadOnce(file), {\n\t\t\tsleep: defaultSleep,\n\t\t});\n\t}\n\n\tasync function downloadOnce(file: StreamsDumpFile): Promise<Uint8Array> {\n\t\tconst res = await opts.fetchImpl(fileUrl(file));\n\t\tif (!res.ok) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Could not download dump ${file.path} (${res.status}).`,\n\t\t\t\tres.status,\n\t\t\t);\n\t\t}\n\t\tif (!res.body) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Dump ${file.path} response has no body.`,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tconst hash = createHash(\"sha256\");\n\t\tconst chunks: Uint8Array[] = [];\n\t\tlet total = 0;\n\t\tconst reader = res.body.getReader();\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\thash.update(value);\n\t\t\t\tchunks.push(value);\n\t\t\t\ttotal += value.byteLength;\n\t\t\t}\n\t\t} catch {\n\t\t\t// A body that dies mid-transfer is the same transient as a socket\n\t\t\t// that never answered: let the retry policy take it.\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Download of dump ${file.path} was interrupted after ${total} bytes.`,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tconst digest = hash.digest(\"hex\");\n\t\tif (digest !== file.sha256) {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Dump ${file.path} sha256 mismatch (expected ${file.sha256}, got ${digest}).`,\n\t\t\t);\n\t\t}\n\t\tif (chunks.length === 1 && chunks[0]) return chunks[0];\n\t\tconst bytes = new Uint8Array(total);\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tbytes.set(chunk, offset);\n\t\t\toffset += chunk.byteLength;\n\t\t}\n\t\treturn bytes;\n\t}\n\n\treturn { list, fileUrl, download };\n}\n",
|
|
18
18
|
"import { ed25519 } from \"@secondlayer/shared\";\nimport { buildQuery } from \"../base.ts\";\nimport {\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tmapStreamsError,\n} from \"./errors.ts\";\nimport type {\n\tFetchLike,\n\tStreamsEvent,\n\tStreamsEventsSubscribeParams,\n\tStreamsSubscription,\n} from \"./types.ts\";\n\ntype VerificationKey = {\n\tkeyId: string;\n\tpublicKey: ReturnType<typeof ed25519.loadEd25519PublicKey>;\n};\n\n/** Backoff ceiling: a subscriber that keeps failing asks once per half\n * minute, which a restarting instance can absorb from every worker at once. */\nexport const SUBSCRIBE_MAX_RECONNECT_DELAY_MS = 30_000;\n/** Three server heartbeats (20 s each) with no frame means the socket is\n * half-open, not idle. */\nexport const SUBSCRIBE_DEFAULT_STALE_AFTER_MS = 60_000;\n\n/**\n * Pause before reconnect attempt `attempt` (0 = first retry): `base * 2^attempt`\n * capped at 30 s, scaled by a jitter in [0.5, 1] so a fleet that dropped\n * together does not reconnect together. Never shorter than a `Retry-After`\n * the server sent, since that is the one number it is sure about.\n */\nexport function reconnectDelay(\n\tattempt: number,\n\tbaseMs: number,\n\tretryAfterSeconds?: number,\n\trandom: () => number = Math.random,\n): number {\n\tconst capped = Math.min(\n\t\tbaseMs * 2 ** Math.max(0, attempt),\n\t\tSUBSCRIBE_MAX_RECONNECT_DELAY_MS,\n\t);\n\tconst jittered = capped * (0.5 + random() * 0.5);\n\tconst floor = (retryAfterSeconds ?? 0) * 1000;\n\treturn Math.max(jittered, floor);\n}\n\n/** An error the loop stops on: a retry cannot change the answer. */\nfunction isTerminal(err: unknown): boolean {\n\tif (err instanceof StreamsSignatureError) return true;\n\treturn (err as { retryable?: boolean } | null)?.retryable === false;\n}\n\n/**\n * Subscribe to the Streams SSE push surface (`GET /v1/streams/events/stream`).\n *\n * A fetch-based reader (not `EventSource`) so it can send `Authorization` when\n * a key is present, which `EventSource` cannot. Works in browsers and Node 18+.\n * Reconnects from the last handled cursor after a dropped connection, a clean\n * server close, or a stale socket, with exponential backoff; stops on an error\n * a retry cannot fix and rejects the handle's `done`.\n */\nexport function subscribeStreamsEvents(opts: {\n\tbaseUrl: string;\n\t/** Request headers for every connection (bearer token, `x-sl-origin`). */\n\theaders?: Record<string, string>;\n\tfetchImpl: FetchLike;\n\t/**\n\t * `off` skips verification; `lenient` (default) verifies a frame when it\n\t * carries a `sig` and delivers it unverified when it doesn't (unsigned\n\t * self-host); `strict` requires every frame to be signed. An invalid `sig`\n\t * always throws regardless of mode.\n\t */\n\tverify: \"off\" | \"lenient\" | \"strict\";\n\t/** Resolve the key a frame names by `key_id` (a fetched key refreshes once\n\t * on an unknown id; a pinned key fails closed), or the cached key when\n\t * the frame carries none. */\n\tloadKey: (keyId?: string | null) => Promise<VerificationKey>;\n\t/** First reconnect pause; see {@link StreamsEventsSubscribeParams.reconnectDelayMs}. */\n\treconnectDelayMs?: number;\n\t/** Idle limit before the socket is treated as dead; see\n\t * {@link StreamsEventsSubscribeParams.staleAfterMs}. */\n\tstaleAfterMs?: number;\n\t/** Jitter source, injectable for tests. */\n\trandom?: () => number;\n\tparams: StreamsEventsSubscribeParams;\n}): StreamsSubscription {\n\tconst { params } = opts;\n\tconst controller = new AbortController();\n\tconst external = params.signal;\n\tif (external) {\n\t\tif (external.aborted) controller.abort();\n\t\telse\n\t\t\texternal.addEventListener(\"abort\", () => controller.abort(), {\n\t\t\t\tonce: true,\n\t\t\t});\n\t}\n\tlet cursor = params.fromCursor ?? null;\n\tconst baseDelayMs = opts.reconnectDelayMs ?? params.reconnectDelayMs ?? 1000;\n\tconst staleAfterMs =\n\t\topts.staleAfterMs ??\n\t\tparams.staleAfterMs ??\n\t\tSUBSCRIBE_DEFAULT_STALE_AFTER_MS;\n\t// Consecutive failures since the last frame; drives the backoff exponent.\n\tlet attempt = 0;\n\n\tconst run = async (): Promise<void> => {\n\t\twhile (!controller.signal.aborted) {\n\t\t\ttry {\n\t\t\t\tconst url = `${opts.baseUrl}/v1/streams/events/stream${buildQuery({\n\t\t\t\t\tfrom_cursor: cursor ?? undefined,\n\t\t\t\t\ttypes: params.types,\n\t\t\t\t\tnot_types: params.notTypes,\n\t\t\t\t\tcontract_id: params.contractId,\n\t\t\t\t\tsender: params.sender,\n\t\t\t\t\trecipient: params.recipient,\n\t\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\t\t// JSON in a query param, so SSE keeps plain GET semantics:\n\t\t\t\t\t// no POST-and-stream variant of this route.\n\t\t\t\t\tfilters: params.filters ? JSON.stringify(params.filters) : undefined,\n\t\t\t\t})}`;\n\t\t\t\tawait readSse({\n\t\t\t\t\turl,\n\t\t\t\t\theaders: opts.headers ?? {},\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tfetchImpl: opts.fetchImpl,\n\t\t\t\t\tstaleAfterMs,\n\t\t\t\t\tmapError: mapStreamsError,\n\t\t\t\t\tonFrame: async (frame) => {\n\t\t\t\t\t\t// Any frame, ping included, proves the socket is live.\n\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\tif (frame.event === \"ping\" || !frame.data) return;\n\t\t\t\t\t\tlet parsed: { event?: StreamsEvent; sig?: string; key_id?: string };\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tparsed = JSON.parse(frame.data);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn; // ignore non-JSON frames\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!parsed.event) return;\n\t\t\t\t\t\tif (opts.verify !== \"off\") {\n\t\t\t\t\t\t\tif (!parsed.sig) {\n\t\t\t\t\t\t\t\t// Strict requires a signed frame; lenient (default) delivers an\n\t\t\t\t\t\t\t\t// unsigned frame (e.g. self-host with no signing key).\n\t\t\t\t\t\t\t\tif (opts.verify === \"strict\") {\n\t\t\t\t\t\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\t\t\t\t\t\"Streams SSE frame signature is missing.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// The frame names its key, so a rotation mid-stream is a\n\t\t\t\t\t\t\t\t// one-time refresh instead of a reconnect loop that fails\n\t\t\t\t\t\t\t\t// every frame forever.\n\t\t\t\t\t\t\t\tconst key = await opts.loadKey(parsed.key_id);\n\t\t\t\t\t\t\t\t// A signature is present, so verify it in either mode; an\n\t\t\t\t\t\t\t\t// invalid signature always fails closed.\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!ed25519.verifyEd25519(\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(parsed.event),\n\t\t\t\t\t\t\t\t\t\tparsed.sig,\n\t\t\t\t\t\t\t\t\t\tkey.publicKey,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\t\t\t\t\t\"Streams SSE frame signature is invalid.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// The cursor moves only once the handler has taken the event.\n\t\t\t\t\t\t// A throw here reconnects from the previous cursor, so this\n\t\t\t\t\t\t// event is delivered again rather than skipped.\n\t\t\t\t\t\tawait params.onEvent(parsed.event);\n\t\t\t\t\t\tcursor = (parsed.event as { cursor?: string }).cursor ?? cursor;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// Clean end (server closed the stream): reconnect from `cursor`\n\t\t\t\t// after the same pause as an error, so a proxy that answers 200 and\n\t\t\t\t// closes at once cannot spin a hot loop.\n\t\t\t\tawait sleep(\n\t\t\t\t\treconnectDelay(attempt, baseDelayMs, undefined, opts.random),\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t);\n\t\t\t\tattempt += 1;\n\t\t\t} catch (err) {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tparams.onError?.(err);\n\t\t\t\tif (isTerminal(err)) throw err;\n\t\t\t\tconst retryAfterSeconds = (err as { retryAfterSeconds?: number })\n\t\t\t\t\t.retryAfterSeconds;\n\t\t\t\tawait sleep(\n\t\t\t\t\treconnectDelay(attempt, baseDelayMs, retryAfterSeconds, opts.random),\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t);\n\t\t\t\tattempt += 1;\n\t\t\t}\n\t\t}\n\t};\n\tconst done = run();\n\t// The caller may never look at `done`; a terminal error already reached\n\t// `onError`, so an unobserved rejection must not crash the process.\n\tdone.catch(() => {});\n\tconst unsubscribe = () => controller.abort();\n\treturn Object.assign(unsubscribe, { done });\n}\n\n/** One parsed `text/event-stream` frame. */\nexport type SseFrame = { event?: string; data?: string };\n\n/**\n * Open one SSE connection and hand every frame to `onFrame` until the server\n * closes the stream or `signal` aborts. Fetch-based rather than `EventSource`\n * so the request can carry `Authorization`. A non-OK response throws through\n * `mapError` (default: a retryable `StreamsServerError`); a thrown `onFrame`\n * propagates and cancels the body. With `staleAfterMs`, a read that sees no\n * frame for that long cancels the body and throws a retryable\n * `StreamsServerError` (`STREAM_STALE`). Reconnecting is the caller's job, so\n * each surface keeps its own cursor rule.\n */\nexport async function readSse(opts: {\n\turl: string;\n\theaders?: Record<string, string>;\n\tsignal: AbortSignal;\n\tfetchImpl: FetchLike;\n\tonFrame: (frame: SseFrame) => void | Promise<void>;\n\tstaleAfterMs?: number;\n\tmapError?: (res: Response) => Promise<never>;\n}): Promise<void> {\n\tconst res = await opts.fetchImpl(opts.url, {\n\t\theaders: { ...(opts.headers ?? {}), Accept: \"text/event-stream\" },\n\t\tsignal: opts.signal,\n\t});\n\tif (!res.ok) {\n\t\tif (opts.mapError) await opts.mapError(res);\n\t\tthrow new StreamsServerError(\n\t\t\t`Streams SSE returned ${res.status}.`,\n\t\t\tres.status,\n\t\t);\n\t}\n\tif (!res.body) {\n\t\tthrow new StreamsServerError(\"Streams SSE response has no body.\", 0);\n\t}\n\tfor await (const frame of parseSseFrames(\n\t\tres.body,\n\t\topts.signal,\n\t\topts.staleAfterMs,\n\t)) {\n\t\tawait opts.onFrame(frame);\n\t}\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tif (signal.aborted) return resolve();\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tresolve();\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/** `reader.read()` raced against an idle timer; a timeout throws a retryable\n * error so the caller's reconnect path takes over. */\nasync function readWithStaleTimer<R extends { read(): Promise<unknown> }>(\n\treader: R,\n\tstaleAfterMs: number | undefined,\n): Promise<Awaited<ReturnType<R[\"read\"]>>> {\n\tif (staleAfterMs === undefined || !Number.isFinite(staleAfterMs)) {\n\t\treturn reader.read() as Promise<Awaited<ReturnType<R[\"read\"]>>>;\n\t}\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst stale = new Promise<never>((_, reject) => {\n\t\ttimer = setTimeout(\n\t\t\t() =>\n\t\t\t\treject(\n\t\t\t\t\tnew StreamsServerError(\n\t\t\t\t\t\t`Streams SSE went quiet for ${staleAfterMs} ms; reconnecting.`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"STREAM_STALE\",\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tstaleAfterMs,\n\t\t);\n\t});\n\ttry {\n\t\treturn (await Promise.race([reader.read(), stale])) as Awaited<\n\t\t\tReturnType<R[\"read\"]>\n\t\t>;\n\t} finally {\n\t\tclearTimeout(timer);\n\t}\n}\n\nasync function* parseSseFrames(\n\tbody: ReadableStream<Uint8Array>,\n\tsignal: AbortSignal,\n\tstaleAfterMs?: number,\n): AsyncGenerator<SseFrame> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\ttry {\n\t\twhile (!signal.aborted) {\n\t\t\tconst { value, done } = await readWithStaleTimer(reader, staleAfterMs);\n\t\t\tif (done) break;\n\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\tlet sep = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (sep !== -1) {\n\t\t\t\tyield parseFrame(buffer.slice(0, sep));\n\t\t\t\tbuffer = buffer.slice(sep + 2);\n\t\t\t\tsep = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\tawait reader.cancel();\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t}\n}\n\nfunction parseFrame(raw: string): SseFrame {\n\tlet event: string | undefined;\n\tconst data: string[] = [];\n\tfor (const line of raw.split(\"\\n\")) {\n\t\tif (line.startsWith(\"data:\")) {\n\t\t\tdata.push(line.slice(line.startsWith(\"data: \") ? 6 : 5));\n\t\t} else if (line.startsWith(\"event:\")) {\n\t\t\tevent = line.slice(line.startsWith(\"event: \") ? 7 : 6).trim();\n\t\t}\n\t}\n\treturn { event, data: data.length > 0 ? data.join(\"\\n\") : undefined };\n}\n",
|
|
@@ -21,15 +21,15 @@
|
|
|
21
21
|
"import type {\n\tCreateWebhookRequest,\n\tCreateWebhookResponse,\n\tDeadRow,\n\tDeliveryRow,\n\tReplayResult,\n\tRotateSecretResponse,\n\tUpdateWebhookRequest,\n\tWebhookDetail,\n\tWebhookSummary,\n\tWebhookTestResult,\n} from \"@secondlayer/shared/schemas/webhooks\";\nimport { BaseClient, seg } from \"../base.ts\";\n\nexport type {\n\tChainTrigger,\n\tChainTriggerType,\n\tCreateWebhookRequest,\n\tCreateWebhookResponse,\n\tDeadRow,\n\tDeliveryRow,\n\tReplayResult,\n\tRotateSecretResponse,\n\tWebhookDetail,\n\tWebhookFormat,\n\tWebhookKind,\n\tWebhookRuntime,\n\tWebhookStatus,\n\tWebhookSummary,\n\tWebhookTestResult,\n\tUpdateWebhookRequest,\n} from \"@secondlayer/shared/schemas/webhooks\";\n\n// `trigger.*` chain-trigger builders for chain webhooks\n// (`create({ triggers: [trigger.contractCall({ ... })] })`).\nexport { trigger } from \"@secondlayer/shared/schemas/webhooks\";\n\nexport class Webhooks extends BaseClient {\n\tasync list(): Promise<{ data: WebhookSummary[] }> {\n\t\treturn this.request<{ data: WebhookSummary[] }>(\"GET\", \"/api/webhooks\");\n\t}\n\n\tasync get(id: string): Promise<WebhookDetail> {\n\t\treturn this.request<WebhookDetail>(\"GET\", `/api/webhooks/${seg(id)}`);\n\t}\n\n\tasync create(input: CreateWebhookRequest): Promise<CreateWebhookResponse> {\n\t\treturn this.request<CreateWebhookResponse>(\"POST\", \"/api/webhooks\", input);\n\t}\n\n\tasync update(\n\t\tid: string,\n\t\tpatch: UpdateWebhookRequest,\n\t): Promise<WebhookDetail> {\n\t\treturn this.request<WebhookDetail>(\n\t\t\t\"PATCH\",\n\t\t\t`/api/webhooks/${seg(id)}`,\n\t\t\tpatch,\n\t\t);\n\t}\n\n\tasync pause(id: string): Promise<WebhookDetail> {\n\t\treturn this.request<WebhookDetail>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/pause`,\n\t\t);\n\t}\n\n\tasync resume(id: string): Promise<WebhookDetail> {\n\t\treturn this.request<WebhookDetail>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/resume`,\n\t\t);\n\t}\n\n\tasync delete(id: string): Promise<{ ok: true }> {\n\t\treturn this.request<{ ok: true }>(\"DELETE\", `/api/webhooks/${seg(id)}`);\n\t}\n\n\tasync rotateSecret(id: string): Promise<RotateSecretResponse> {\n\t\treturn this.request<RotateSecretResponse>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/rotate-secret`,\n\t\t);\n\t}\n\n\t/** Send a one-off test webhook to the webhook's URL (built for its\n\t * format, SSRF-guarded). Logged as a delivery row, visible via deliveries. */\n\tasync test(id: string): Promise<WebhookTestResult> {\n\t\treturn this.request<WebhookTestResult>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/test`,\n\t\t);\n\t}\n\n\t/** The last 100 delivery attempts, newest first. The server caps the window;\n\t * there is nothing to page. */\n\tasync deliveries(id: string): Promise<{ data: DeliveryRow[] }> {\n\t\treturn this.request<{ data: DeliveryRow[] }>(\n\t\t\t\"GET\",\n\t\t\t`/api/webhooks/${seg(id)}/deliveries`,\n\t\t);\n\t}\n\n\tasync replay(\n\t\tid: string,\n\t\trange: { fromBlock: number; toBlock: number; force?: string },\n\t): Promise<ReplayResult> {\n\t\treturn this.request<ReplayResult>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/replay`,\n\t\t\trange,\n\t\t);\n\t}\n\n\tasync dead(id: string): Promise<{ data: DeadRow[] }> {\n\t\treturn this.request<{ data: DeadRow[] }>(\n\t\t\t\"GET\",\n\t\t\t`/api/webhooks/${seg(id)}/dead`,\n\t\t);\n\t}\n\n\t/** Push one dead-lettered event back onto the delivery queue. `outboxId` is\n\t * the `id` of a row from {@link dead}. */\n\tasync requeue(id: string, outboxId: string): Promise<{ ok: true }> {\n\t\treturn this.request<{ ok: true }>(\n\t\t\t\"POST\",\n\t\t\t`/api/webhooks/${seg(id)}/dead/${seg(outboxId)}/requeue`,\n\t\t);\n\t}\n}\n",
|
|
22
22
|
"import type { InstanceDiagnosis } from \"@secondlayer/shared/archive/instance-diagnosis\";\nimport type { SubgraphSummary } from \"@secondlayer/shared/schemas\";\nimport { createArchiveClient } from \"./archive/client.ts\";\nimport {\n\ttype InstanceClient,\n\tcreateArchiveVerify,\n\tcreateInstanceClient,\n} from \"./archive/instance.ts\";\nimport type { SecondLayerArchive } from \"./archive/types.ts\";\nimport { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Contracts } from \"./contracts/client.ts\";\nimport { ApiError, SecondLayerError } from \"./errors.ts\";\nimport { Index } from \"./index-api/client.ts\";\nimport type { IndexTip } from \"./index-api/client.ts\";\nimport { createStreamsClient } from \"./streams/client.ts\";\nimport type { StreamsClient, StreamsTip } from \"./streams/types.ts\";\nimport { Subgraphs } from \"./subgraphs/client.ts\";\nimport type { SubgraphOperationStatus } from \"./subgraphs/client.ts\";\nimport { Webhooks } from \"./webhooks/client.ts\";\n\nexport interface ContextAccount {\n\temail: string;\n}\n\nexport interface ActiveSubgraphOperation {\n\tsubgraph: string;\n\toperationId: string;\n\tkind: SubgraphOperationStatus[\"kind\"];\n\tstatus: SubgraphOperationStatus[\"status\"];\n\tprogress: number | null;\n}\n\n/** Why one snapshot field could not be read. Serialized from the SDK error\n * family so a snapshot stays plain data. */\nexport interface ContextFieldError {\n\tmessage: string;\n\t/** Stable code from the API envelope (`UNAUTHORIZED`, `INDEX_NOT_READY`)\n\t * or the SDK (`REQUEST_TIMEOUT`); absent for a bare transport failure. */\n\tcode?: string;\n\t/** HTTP status; `0` when the API could not be reached. */\n\tstatus?: number;\n\t/** Whether the same read can succeed on a retry (429, 5xx, network). */\n\tretryable: boolean;\n}\n\n/** One snapshot field: the value, or `null` plus the error that produced it.\n * `value: null` with no `error` means the read succeeded and found nothing. */\nexport interface ContextField<T> {\n\tvalue: T | null;\n\terror?: ContextFieldError;\n}\n\n/**\n * A point-in-time orientation snapshot for an agent: the live tips and what\n * this instance holds. Every field is a {@link ContextField}, so a missing\n * value says why it is missing (API unreachable, token rejected, index still\n * catching up) instead of a bare `null`. `context()` itself never throws.\n */\nexport interface ContextSnapshot {\n\t/** Token identity from `/api/accounts/me`. A self-hosted instance has no\n\t * account system: the read 404s and the field carries that error. */\n\taccount: ContextField<ContextAccount>;\n\tstreamsTip: ContextField<StreamsTip>;\n\tindexTip: ContextField<IndexTip>;\n\tsubgraphs: ContextField<SubgraphSummary[]>;\n\twebhooks: ContextField<{\n\t\tcount: number;\n\t\tbyStatus: Record<string, number>;\n\t}>;\n\t/** In-flight reindex operations (bounded to subgraphs reporting `reindexing`). */\n\tactiveOperations: ContextField<ActiveSubgraphOperation[]>;\n\t/** Decoder lag / empty-index from `GET /public/status`. */\n\tinstance: ContextField<InstanceDiagnosis>;\n}\n\n/** Fold one read into a {@link ContextField}: the value, or `null` with the\n * failure described. Exported for callers that assemble their own snapshot\n * from extra reads and want the same shape. */\nexport async function contextField<T>(\n\tread: Promise<T>,\n): Promise<ContextField<T>> {\n\ttry {\n\t\treturn { value: await read };\n\t} catch (err) {\n\t\treturn { value: null, error: describeContextError(err) };\n\t}\n}\n\nfunction describeContextError(err: unknown): ContextFieldError {\n\tif (err instanceof SecondLayerError) {\n\t\treturn {\n\t\t\tmessage: err.shortMessage,\n\t\t\t...(err.code !== undefined ? { code: err.code } : {}),\n\t\t\t...(err instanceof ApiError ? { status: err.status } : {}),\n\t\t\tretryable: err.retryable,\n\t\t};\n\t}\n\t// A bare TypeError is fetch's own network failure (Streams reads are not\n\t// wrapped): unreachable, and worth another try, same as the consume loops.\n\tif (err instanceof TypeError) {\n\t\treturn { message: err.message, status: 0, retryable: true };\n\t}\n\treturn {\n\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\tretryable: false,\n\t};\n}\n\nexport class SecondLayer extends BaseClient {\n\treadonly streams: StreamsClient;\n\treadonly index: Index;\n\treadonly contracts: Contracts;\n\treadonly subgraphs: Subgraphs;\n\treadonly webhooks: Webhooks;\n\treadonly archive: SecondLayerArchive;\n\treadonly instance: InstanceClient;\n\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tsuper(options);\n\t\tthis.streams = createStreamsClient({\n\t\t\t// Already resolved by BaseClient (an explicit \"\" stays keyless), so the\n\t\t\t// env precedence runs, and warns, once per client.\n\t\t\tapiKey: this.apiKey,\n\t\t\torigin: this.origin,\n\t\t\tbaseUrl: options.baseUrl,\n\t\t\tfetchImpl: options.fetchImpl,\n\t\t\tdumpsBaseUrl: options.dumpsBaseUrl,\n\t\t\tverify: options.verify,\n\t\t\tverifyDumpsManifest: options.verifyDumpsManifest,\n\t\t});\n\t\tthis.index = new Index(options);\n\t\tthis.contracts = new Contracts(options);\n\t\tthis.subgraphs = new Subgraphs(options);\n\t\tthis.webhooks = new Webhooks(options);\n\t\tconst request = <T>(method: string, path: string, body?: unknown) =>\n\t\t\tthis.request<T>(method, path, body);\n\t\tthis.archive = {\n\t\t\t...createArchiveClient({\n\t\t\t\taccountKey: options.accountKey,\n\t\t\t\tfetchImpl: options.fetchImpl,\n\t\t\t\tarchiveBaseUrl: options.archiveBaseUrl,\n\t\t\t\tarchiveOpsUrl: options.archiveOpsUrl,\n\t\t\t}),\n\t\t\tverify: createArchiveVerify(request),\n\t\t};\n\t\tthis.instance = createInstanceClient(request);\n\t}\n\n\t/**\n\t * Up to 10 public reads in one round trip (`POST /v1/batch`). Each item\n\t * is authorized on its own; the client's bearer token applies to every item.\n\t */\n\tasync batch(\n\t\trequests: Array<{\n\t\t\tpath: string;\n\t\t\tparams?: Record<string, string | number | boolean>;\n\t\t}>,\n\t): Promise<{\n\t\tresults: Array<{ path: string | null; status: number; body: unknown }>;\n\t}> {\n\t\treturn this.request(\"POST\", \"/v1/batch\", { requests });\n\t}\n\n\t/**\n\t * Assemble a {@link ContextSnapshot}: the same orientation an MCP agent\n\t * reads from `secondlayer://context`, available to any SDK/CLI consumer.\n\t * Reads run concurrently; a failed read lands as `{ value: null, error }`\n\t * on its field rather than rejecting the whole snapshot.\n\t */\n\tasync context(): Promise<ContextSnapshot> {\n\t\tconst [account, streamsTip, indexEnv, subgraphsRes, webhooksRes, instance] =\n\t\t\tawait Promise.all([\n\t\t\t\tcontextField(this.request<ContextAccount>(\"GET\", \"/api/accounts/me\")),\n\t\t\t\tcontextField(this.streams.tip()),\n\t\t\t\tcontextField(this.index.canonical.list({ limit: 1 })),\n\t\t\t\tcontextField(this.subgraphs.list()),\n\t\t\t\tcontextField(this.webhooks.list()),\n\t\t\t\tcontextField(this.instance.diagnose()),\n\t\t\t]);\n\n\t\tconst subgraphs: ContextField<SubgraphSummary[]> = {\n\t\t\tvalue: subgraphsRes.value?.data ?? null,\n\t\t\t...(subgraphsRes.error ? { error: subgraphsRes.error } : {}),\n\t\t};\n\n\t\tconst webhooks: ContextSnapshot[\"webhooks\"] = {\n\t\t\tvalue: null,\n\t\t\t...(webhooksRes.error ? { error: webhooksRes.error } : {}),\n\t\t};\n\t\tif (webhooksRes.value) {\n\t\t\tconst byStatus: Record<string, number> = {};\n\t\t\tfor (const s of webhooksRes.value.data) {\n\t\t\t\tbyStatus[s.status] = (byStatus[s.status] ?? 0) + 1;\n\t\t\t}\n\t\t\twebhooks.value = {\n\t\t\t\tcount: webhooksRes.value.data.length,\n\t\t\t\tbyStatus,\n\t\t\t};\n\t\t}\n\n\t\t// In-flight ops: only probe subgraphs that report `reindexing`, so this\n\t\t// stays cheap (usually zero extra calls) instead of N+1 over every subgraph.\n\t\tlet activeOperations: ContextField<ActiveSubgraphOperation[]> = {\n\t\t\tvalue: null,\n\t\t\terror: {\n\t\t\t\tmessage:\n\t\t\t\t\t\"Not probed: in-flight operations are read per subgraph, and the subgraph list did not resolve.\",\n\t\t\t\tretryable: subgraphs.error?.retryable ?? false,\n\t\t\t},\n\t\t};\n\t\tif (subgraphs.value) {\n\t\t\tconst probed = await Promise.all(\n\t\t\t\tsubgraphs.value\n\t\t\t\t\t.filter((s) => s.status === \"reindexing\")\n\t\t\t\t\t.map(async (s) => {\n\t\t\t\t\t\tconst res = await contextField(this.subgraphs.operations(s.name));\n\t\t\t\t\t\tconst op = res.value?.operations.find(\n\t\t\t\t\t\t\t(o) => o.status === \"queued\" || o.status === \"running\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn op\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tsubgraph: s.name,\n\t\t\t\t\t\t\t\t\toperationId: op.id,\n\t\t\t\t\t\t\t\t\tkind: op.kind,\n\t\t\t\t\t\t\t\t\tstatus: op.status,\n\t\t\t\t\t\t\t\t\tprogress: op.progress,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}),\n\t\t\t);\n\t\t\tactiveOperations = {\n\t\t\t\tvalue: probed.filter((o): o is ActiveSubgraphOperation => o !== null),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\taccount,\n\t\t\tstreamsTip,\n\t\t\tindexTip: {\n\t\t\t\tvalue: indexEnv.value?.tip ?? null,\n\t\t\t\t...(indexEnv.error ? { error: indexEnv.error } : {}),\n\t\t\t},\n\t\t\tsubgraphs,\n\t\t\twebhooks,\n\t\t\tactiveOperations,\n\t\t\tinstance,\n\t\t};\n\t}\n}\n",
|
|
23
23
|
"import type { InferSubgraphClient } from \"@secondlayer/subgraphs\";\nimport type { SecondLayerOptions } from \"../base.ts\";\nimport { SecondLayer } from \"../client.ts\";\nimport { Subgraphs } from \"./client.ts\";\n\n/**\n * Returns a typed client for a subgraph defined with `defineSubgraph()`.\n *\n * Accepts a plain options object, a `SecondLayer` instance, or a `Subgraphs` instance.\n *\n * @example\n * ```ts\n * import mySubgraph from './subgraphs/my-subgraph'\n * import { getSubgraph } from '@secondlayer/sdk'\n *\n * const client = getSubgraph(mySubgraph, { apiKey: 'sl_...' })\n * const page = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * ```\n */\nexport function getSubgraph<\n\tT extends { name: string; schema: Record<string, unknown> },\n>(\n\tdef: T,\n\toptions: Partial<SecondLayerOptions> | SecondLayer | Subgraphs = {},\n): InferSubgraphClient<T> {\n\tif (options instanceof Subgraphs) {\n\t\treturn options.typed(def);\n\t}\n\tif (options instanceof SecondLayer) {\n\t\treturn options.subgraphs.typed(def);\n\t}\n\treturn new Subgraphs(options).typed(def);\n}\n",
|
|
24
|
-
"import type { SubgraphDetail } from \"@secondlayer/shared/schemas/subgraphs\";\nimport type {\n\tDeadRow,\n\tDeliveryRow,\n\tWebhookDetail,\n} from \"@secondlayer/shared/schemas/webhooks\";\n\n/**\n * Webhook diagnosis, shared by `secondlayer webhooks doctor` and the\n * dashboard's webhook detail page. Moved out of the CLI (unchanged behavior)\n * so the web can build the same judgment without printing CLI-command text.\n */\n\nexport function isSuccessDelivery(row: DeliveryRow): boolean {\n\treturn (\n\t\trow.statusCode !== null && row.statusCode >= 200 && row.statusCode < 300\n\t);\n}\n\nexport type DoctorIssueCode =\n\t| \"warning\"\n\t| \"paused\"\n\t| \"last_error\"\n\t| \"circuit\"\n\t| \"dead_letters\"\n\t| \"subgraph_gaps\"\n\t| \"subgraph_catching_up\"\n\t| \"no_deliveries\";\n\nexport interface DoctorIssue {\n\tcode: DoctorIssueCode;\n\tdetail?: string;\n}\n\nexport interface DoctorReport {\n\twebhook: WebhookDetail;\n\tdeliverySummary: {\n\t\ttotal: number;\n\t\tsuccessful: number;\n\t\tfailed: number;\n\t\tlast: DeliveryRow | null;\n\t};\n\tdeadCount: number;\n\tsubgraph: {\n\t\tname: string;\n\t\tstatus: string;\n\t\tsyncStatus: string;\n\t\tlastProcessedBlock: number;\n\t\tchainTip: number;\n\t\tgapCount: number;\n\t\tintegrity: string;\n\t} | null;\n\t/** CLI-facing next steps, one per issue, in the same order as `issues`. */\n\thints: string[];\n\tissues: DoctorIssue[];\n}\n\nexport function buildDoctorReport(input: {\n\twebhook: WebhookDetail;\n\tdeliveries: DeliveryRow[];\n\tdead: DeadRow[];\n\tsubgraph?: SubgraphDetail | null;\n}): DoctorReport {\n\tconst successful = input.deliveries.filter(isSuccessDelivery).length;\n\tconst failed = input.deliveries.length - successful;\n\tconst subgraph = input.subgraph\n\t\t? {\n\t\t\t\tname: input.subgraph.name,\n\t\t\t\tstatus: input.subgraph.status,\n\t\t\t\tsyncStatus: input.subgraph.sync.status,\n\t\t\t\tlastProcessedBlock: input.subgraph.sync.lastProcessedBlock,\n\t\t\t\tchainTip: input.subgraph.sync.chainTip,\n\t\t\t\tgapCount: input.subgraph.sync.gaps.count,\n\t\t\t\tintegrity: input.subgraph.sync.integrity,\n\t\t\t}\n\t\t: null;\n\n\tconst hints: string[] = [];\n\tconst issues: DoctorIssue[] = [];\n\tif (input.webhook.warning) {\n\t\thints.push(input.webhook.warning);\n\t\tissues.push({ code: \"warning\", detail: input.webhook.warning });\n\t}\n\tif (input.webhook.status === \"paused\") {\n\t\thints.push(\n\t\t\t`Resume when the receiver is healthy: secondlayer webhooks resume ${input.webhook.id}`,\n\t\t);\n\t\tissues.push({ code: \"paused\" });\n\t}\n\tif (input.webhook.lastError) {\n\t\thints.push(\n\t\t\t\"Run secondlayer webhooks test to reproduce the receiver request.\",\n\t\t);\n\t\tissues.push({ code: \"last_error\", detail: input.webhook.lastError });\n\t}\n\tif (input.webhook.circuitOpenedAt || input.webhook.circuitFailures > 0) {\n\t\thints.push(\n\t\t\t\"Circuit breaker has failures; inspect receiver logs and delivery status codes.\",\n\t\t);\n\t\tissues.push({ code: \"circuit\" });\n\t}\n\tif (input.dead.length > 0) {\n\t\thints.push(\n\t\t\t`Dead-letter rows exist; inspect with secondlayer webhooks dead ${input.webhook.id} and requeue selected rows.`,\n\t\t);\n\t\tissues.push({ code: \"dead_letters\" });\n\t}\n\tif (subgraph?.gapCount && subgraph.gapCount > 0) {\n\t\thints.push(\n\t\t\t`Linked subgraph has gaps; run secondlayer subgraphs gaps ${input.webhook.subgraphName}.`,\n\t\t);\n\t\tissues.push({ code: \"subgraph_gaps\" });\n\t}\n\tif (subgraph?.syncStatus === \"catching_up\") {\n\t\thints.push(\n\t\t\t\"Linked subgraph is still catching up; new matching rows may arrive later.\",\n\t\t);\n\t\tissues.push({ code: \"subgraph_catching_up\" });\n\t}\n\tif (input.deliveries.length === 0) {\n\t\thints.push(\n\t\t\t\"No deliveries yet; confirm the table is receiving inserted rows that match the filter.\",\n\t\t);\n\t\tissues.push({ code: \"no_deliveries\" });\n\t}\n\tif (hints.length === 0) {\n\t\thints.push(\"No immediate action needed.\");\n\t}\n\n\treturn {\n\t\twebhook: input.webhook,\n\t\tdeliverySummary: {\n\t\t\ttotal: input.deliveries.length,\n\t\t\tsuccessful,\n\t\t\tfailed,\n\t\t\tlast: input.deliveries[0] ?? null,\n\t\t},\n\t\tdeadCount: input.dead.length,\n\t\tsubgraph,\n\t\thints,\n\t\tissues,\n\t};\n}\n",
|
|
24
|
+
"import type { SubgraphDetail } from \"@secondlayer/shared/schemas/subgraphs\";\nimport type {\n\tDeadRow,\n\tDeliveryRow,\n\tWebhookDetail,\n\tWebhookSummary,\n} from \"@secondlayer/shared/schemas/webhooks\";\n\n/**\n * Webhook diagnosis, shared by `secondlayer webhooks doctor` and the\n * dashboard's webhook detail page. Moved out of the CLI (unchanged behavior)\n * so the web can build the same judgment without printing CLI-command text.\n *\n * Plan 068 adds five deterministic, numbers-only detectors on top of the\n * existing flag checks: no model, no history beyond the deliveries window\n * already fetched. Thresholds are named constants below, conservative on\n * purpose — a wrong insight costs more trust than a missed one.\n */\n\nexport function isSuccessDelivery(row: DeliveryRow): boolean {\n\treturn (\n\t\trow.statusCode !== null && row.statusCode >= 200 && row.statusCode < 300\n\t);\n}\n\nexport type DoctorSeverity = \"bad\" | \"warn\" | \"calm\";\n\nexport interface DoctorEvidence {\n\tlabel: string;\n\tvalue: string;\n}\n\nexport interface DoctorFix {\n\ttext: string;\n\t/** A `secondlayer webhooks ...` command the reader can copy. */\n\tcommand?: string;\n\t/** Anchor into the docs' webhooks troubleshooting section. */\n\tdocsPath?: string;\n}\n\nexport type DoctorIssueCode =\n\t| \"warning\"\n\t| \"paused\"\n\t| \"last_error\"\n\t| \"circuit\"\n\t| \"dead_letters\"\n\t| \"subgraph_gaps\"\n\t| \"subgraph_catching_up\"\n\t| \"no_deliveries\"\n\t| \"receiver_rate_limited\"\n\t| \"receiver_down\"\n\t| \"receiver_rejects\"\n\t| \"receiver_slow\"\n\t| \"delivery_lag\";\n\nexport interface DoctorIssue {\n\tcode: DoctorIssueCode;\n\tdetail?: string;\n\tseverity: DoctorSeverity;\n\t/** 2-4 numbers-only facts backing the issue. Only the five new detectors\n\t * and the list-summary circuit issue carry this — the older flag checks\n\t * keep their plain `detail` string. */\n\tevidence?: DoctorEvidence[];\n\tfix?: DoctorFix;\n}\n\nexport interface DoctorReport {\n\twebhook: WebhookDetail;\n\tdeliverySummary: {\n\t\ttotal: number;\n\t\tsuccessful: number;\n\t\tfailed: number;\n\t\tlast: DeliveryRow | null;\n\t};\n\tdeadCount: number;\n\tsubgraph: {\n\t\tname: string;\n\t\tstatus: string;\n\t\tsyncStatus: string;\n\t\tlastProcessedBlock: number;\n\t\tchainTip: number;\n\t\tgapCount: number;\n\t\tintegrity: string;\n\t} | null;\n\t/** CLI-facing next steps, one per issue, in the same order as `issues`. */\n\thints: string[];\n\tissues: DoctorIssue[];\n\t/** The single most severe issue (bad > warn > calm, then rule priority),\n\t * or `null` when there are none. The UI leads with this and collapses\n\t * the rest underneath. */\n\tprimary: DoctorIssue | null;\n}\n\n// ── Detector thresholds ─────────────────────────────────────────────\n// Named constants, not config (plan 068). Tune from real data at the 054\n// spike — until then these stay conservative.\n\nconst RATE_LIMITED_MIN_ATTEMPTS = 10;\nconst RATE_LIMITED_MIN_RATIO = 0.5;\nconst DOWN_MIN_CONSECUTIVE = 5;\nconst REJECTS_MIN_CONSECUTIVE = 5;\nconst SLOW_WINDOW = 20;\nconst SLOW_MIN_SAMPLES = 5;\nconst SLOW_TIMEOUT_RATIO = 0.5;\nconst LAG_WINDOW = 20;\nconst LAG_MIN_SAMPLES = 5;\nconst LAG_THRESHOLD_MS = 60_000;\nconst ERROR_SNIPPET_MAX = 200;\n\nfunction median(values: number[]): number {\n\tif (values.length === 0) return 0;\n\tconst sorted = [...values].sort((a, b) => a - b);\n\treturn sorted[Math.floor(sorted.length / 2)] ?? 0;\n}\n\nfunction percentile(values: number[], p: number): number {\n\tif (values.length === 0) return 0;\n\tconst sorted = [...values].sort((a, b) => a - b);\n\tconst idx = Math.min(sorted.length - 1, Math.floor(p * sorted.length));\n\treturn sorted[idx] ?? 0;\n}\n\nfunction formatMs(ms: number): string {\n\treturn ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;\n}\n\n/** \"2026-04-23 00:00 UTC\" — date, hour:minute, and an explicit zone so an\n * evidence value never reads as local time. */\nfunction formatShortDate(iso: string): string {\n\treturn `${iso.slice(0, 10)} ${iso.slice(11, 16)} UTC`;\n}\n\n/** The longest run from the start of `rows` (newest-first) matching\n * `predicate` — the current losing (or rejecting) streak. */\nfunction consecutiveFromStart(\n\trows: DeliveryRow[],\n\tpredicate: (row: DeliveryRow) => boolean,\n): DeliveryRow[] {\n\tconst out: DeliveryRow[] = [];\n\tfor (const row of rows) {\n\t\tif (!predicate(row)) break;\n\t\tout.push(row);\n\t}\n\treturn out;\n}\n\nfunction summarizeStatusBreakdown(rows: DeliveryRow[]): string {\n\tconst counts = new Map<string, number>();\n\tfor (const row of rows) {\n\t\tconst key =\n\t\t\trow.statusCode === null ? \"timeout/no response\" : String(row.statusCode);\n\t\tcounts.set(key, (counts.get(key) ?? 0) + 1);\n\t}\n\treturn [...counts.entries()].map(([key, n]) => `${n}× ${key}`).join(\", \");\n}\n\nconst RETRY_AFTER_RE = /retry-after:?\\s*(\\d+)/i;\n\n/** The most recent 429's `Retry-After`, if the receiver's error text carried\n * one — we never invent a value the rows didn't report. */\nfunction extractRetryAfterSeconds(rows: DeliveryRow[]): string | null {\n\tfor (const row of rows) {\n\t\tif (row.statusCode !== 429 || !row.errorMessage) continue;\n\t\tconst match = row.errorMessage.match(RETRY_AFTER_RE);\n\t\tif (match?.[1]) return match[1];\n\t}\n\treturn null;\n}\n\n/** ≥10 attempts in the window, ≥50% of them 429 — the receiver is\n * rate-limiting us, not failing. */\nfunction detectReceiverRateLimited(\n\twebhook: WebhookDetail,\n\tdeliveries: DeliveryRow[],\n): DoctorIssue | null {\n\tif (deliveries.length < RATE_LIMITED_MIN_ATTEMPTS) return null;\n\tconst count429 = deliveries.filter((d) => d.statusCode === 429).length;\n\tif (count429 / deliveries.length < RATE_LIMITED_MIN_RATIO) return null;\n\n\tconst oldest = deliveries[deliveries.length - 1];\n\tconst newest = deliveries[0];\n\tconst evidence: DoctorEvidence[] = [\n\t\t{\n\t\t\tlabel: \"429 responses\",\n\t\t\tvalue: `${count429} of ${deliveries.length} attempts`,\n\t\t},\n\t\t{\n\t\t\tlabel: \"window\",\n\t\t\tvalue:\n\t\t\t\toldest && newest\n\t\t\t\t\t? `${formatShortDate(oldest.dispatchedAt)} → ${formatShortDate(newest.dispatchedAt)}`\n\t\t\t\t\t: \"unknown\",\n\t\t},\n\t];\n\tconst retryAfter = extractRetryAfterSeconds(deliveries);\n\tif (retryAfter) {\n\t\tevidence.push({ label: \"latest Retry-After\", value: `${retryAfter}s` });\n\t}\n\n\tconst suggestedConcurrency = Math.max(1, Math.floor(webhook.concurrency / 2));\n\treturn {\n\t\tcode: \"receiver_rate_limited\",\n\t\tseverity: \"warn\",\n\t\tevidence,\n\t\tfix: {\n\t\t\ttext: \"Lower concurrency, or honor the Retry-After header on your receiver.\",\n\t\t\tcommand: `secondlayer webhooks update ${webhook.id} --concurrency ${suggestedConcurrency}`,\n\t\t\tdocsPath: \"/docs/webhooks#receiver-rate-limited\",\n\t\t},\n\t};\n}\n\n/** ≥5 most recent attempts are 5xx or got no response at all (timeout /\n * connection failure) — the receiver looks down, not just slow. */\nfunction detectReceiverDown(\n\twebhook: WebhookDetail,\n\tdeliveries: DeliveryRow[],\n): DoctorIssue | null {\n\tconst streak = consecutiveFromStart(\n\t\tdeliveries,\n\t\t(d) => d.statusCode === null || d.statusCode >= 500,\n\t);\n\tif (streak.length < DOWN_MIN_CONSECUTIVE) return null;\n\n\treturn {\n\t\tcode: \"receiver_down\",\n\t\tseverity: \"bad\",\n\t\tevidence: [\n\t\t\t{ label: \"consecutive failures\", value: String(streak.length) },\n\t\t\t{ label: \"breakdown\", value: summarizeStatusBreakdown(streak) },\n\t\t\t{\n\t\t\t\tlabel: \"last success\",\n\t\t\t\tvalue: webhook.lastSuccessAt\n\t\t\t\t\t? formatShortDate(webhook.lastSuccessAt)\n\t\t\t\t\t: \"never\",\n\t\t\t},\n\t\t],\n\t\tfix: {\n\t\t\ttext: \"Check your receiver's health and logs, then send a test event.\",\n\t\t\tcommand: `secondlayer webhooks test ${webhook.id}`,\n\t\t\tdocsPath: \"/docs/webhooks#receiver-down\",\n\t\t},\n\t};\n}\n\n/** ≥5 most recent attempts are 4xx other than 429 — the receiver is\n * reachable but actively rejecting us (auth, signature, bad request). */\nfunction detectReceiverRejects(\n\twebhook: WebhookDetail,\n\tdeliveries: DeliveryRow[],\n): DoctorIssue | null {\n\tconst streak = consecutiveFromStart(\n\t\tdeliveries,\n\t\t(d) =>\n\t\t\td.statusCode !== null &&\n\t\t\td.statusCode >= 400 &&\n\t\t\td.statusCode < 500 &&\n\t\t\td.statusCode !== 429,\n\t);\n\tif (streak.length < REJECTS_MIN_CONSECUTIVE) return null;\n\n\tconst evidence: DoctorEvidence[] = [\n\t\t{ label: \"consecutive rejects\", value: String(streak.length) },\n\t\t{ label: \"breakdown\", value: summarizeStatusBreakdown(streak) },\n\t];\n\tconst withText = streak.find((d) => d.errorMessage || d.responseBody);\n\tconst snippet = withText\n\t\t? (withText.errorMessage ?? withText.responseBody ?? \"\").slice(\n\t\t\t\t0,\n\t\t\t\tERROR_SNIPPET_MAX,\n\t\t\t)\n\t\t: null;\n\tif (snippet) evidence.push({ label: \"first error\", value: snippet });\n\n\treturn {\n\t\tcode: \"receiver_rejects\",\n\t\tseverity: \"bad\",\n\t\tevidence,\n\t\tfix: {\n\t\t\ttext: \"Check your receiver's auth config or signature verification.\",\n\t\t\tcommand: `secondlayer webhooks test ${webhook.id}`,\n\t\t\tdocsPath: \"/docs/webhooks#receiver-rejects\",\n\t\t},\n\t};\n}\n\n/** Median response time of the newest 20 attempts is at least half the\n * webhook's timeout — deliveries are slow, not failing. */\nfunction detectReceiverSlow(\n\twebhook: WebhookDetail,\n\tdeliveries: DeliveryRow[],\n): DoctorIssue | null {\n\tconst durations = deliveries\n\t\t.slice(0, SLOW_WINDOW)\n\t\t.map((d) => d.durationMs)\n\t\t.filter((d): d is number => d !== null);\n\tif (durations.length < SLOW_MIN_SAMPLES) return null;\n\n\tconst med = median(durations);\n\tif (med < webhook.timeoutMs * SLOW_TIMEOUT_RATIO) return null;\n\n\treturn {\n\t\tcode: \"receiver_slow\",\n\t\tseverity: \"warn\",\n\t\tevidence: [\n\t\t\t{ label: \"median response time\", value: formatMs(med) },\n\t\t\t{\n\t\t\t\tlabel: \"p95 response time\",\n\t\t\t\tvalue: formatMs(percentile(durations, 0.95)),\n\t\t\t},\n\t\t\t{ label: \"timeout\", value: formatMs(webhook.timeoutMs) },\n\t\t],\n\t\tfix: {\n\t\t\ttext: \"Speed up your receiver, or raise the timeout (up to 30s hosted).\",\n\t\t\tcommand: `secondlayer webhooks update ${webhook.id} --timeout-ms 30000`,\n\t\t\tdocsPath: \"/docs/webhooks#receiver-slow\",\n\t\t},\n\t};\n}\n\n/** Median (dispatch time − block time) of the newest 20 attempts with a\n * known block time exceeds a minute — we're behind on delivery. This is\n * our-side latency, not something the receiver can fix, so it carries no\n * actionable command. */\nfunction detectDeliveryLag(deliveries: DeliveryRow[]): DoctorIssue | null {\n\tconst window = deliveries\n\t\t.slice(0, LAG_WINDOW)\n\t\t.filter(\n\t\t\t(d): d is DeliveryRow & { blockTime: string } => d.blockTime !== null,\n\t\t);\n\tif (window.length < LAG_MIN_SAMPLES) return null;\n\n\tconst lags = window.map(\n\t\t(d) => new Date(d.dispatchedAt).getTime() - new Date(d.blockTime).getTime(),\n\t);\n\tconst med = median(lags);\n\tif (med <= LAG_THRESHOLD_MS) return null;\n\n\tconst blockTimes = window.map((d) => d.blockTime).sort();\n\tconst oldest = blockTimes[0];\n\tconst newest = blockTimes[blockTimes.length - 1];\n\n\treturn {\n\t\tcode: \"delivery_lag\",\n\t\tseverity: \"warn\",\n\t\tevidence: [\n\t\t\t{ label: \"median lag\", value: formatMs(med) },\n\t\t\t{\n\t\t\t\tlabel: \"block time range\",\n\t\t\t\tvalue:\n\t\t\t\t\toldest && newest\n\t\t\t\t\t\t? `${formatShortDate(oldest)} → ${formatShortDate(newest)}`\n\t\t\t\t\t\t: \"unknown\",\n\t\t\t},\n\t\t],\n\t\tfix: {\n\t\t\ttext: \"We're behind on delivery; no action needed on your end.\",\n\t\t},\n\t};\n}\n\nconst SEVERITY_RANK: Record<DoctorSeverity, number> = {\n\tbad: 0,\n\twarn: 1,\n\tcalm: 2,\n};\n\n/** Tie-break within a severity tier when more than one issue fires at\n * once — most specific / most actionable first. */\nconst CODE_PRIORITY: DoctorIssueCode[] = [\n\t\"circuit\",\n\t\"receiver_down\",\n\t\"receiver_rejects\",\n\t\"dead_letters\",\n\t\"paused\",\n\t\"last_error\",\n\t\"warning\",\n\t\"receiver_rate_limited\",\n\t\"receiver_slow\",\n\t\"delivery_lag\",\n\t\"no_deliveries\",\n\t\"subgraph_gaps\",\n\t\"subgraph_catching_up\",\n];\n\nfunction pickPrimary(issues: DoctorIssue[]): DoctorIssue | null {\n\tif (issues.length === 0) return null;\n\treturn (\n\t\t[...issues].sort((a, b) => {\n\t\t\tconst sevDiff = SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity];\n\t\t\tif (sevDiff !== 0) return sevDiff;\n\t\t\treturn CODE_PRIORITY.indexOf(a.code) - CODE_PRIORITY.indexOf(b.code);\n\t\t})[0] ?? null\n\t);\n}\n\nfunction hintFor(issue: DoctorIssue): string {\n\tif (!issue.fix) return issue.detail ?? issue.code;\n\treturn issue.fix.command\n\t\t? `${issue.fix.text} ${issue.fix.command}`\n\t\t: issue.fix.text;\n}\n\nexport function buildDoctorReport(input: {\n\twebhook: WebhookDetail;\n\tdeliveries: DeliveryRow[];\n\tdead: DeadRow[];\n\tsubgraph?: SubgraphDetail | null;\n}): DoctorReport {\n\tconst successful = input.deliveries.filter(isSuccessDelivery).length;\n\tconst failed = input.deliveries.length - successful;\n\tconst subgraph = input.subgraph\n\t\t? {\n\t\t\t\tname: input.subgraph.name,\n\t\t\t\tstatus: input.subgraph.status,\n\t\t\t\tsyncStatus: input.subgraph.sync.status,\n\t\t\t\tlastProcessedBlock: input.subgraph.sync.lastProcessedBlock,\n\t\t\t\tchainTip: input.subgraph.sync.chainTip,\n\t\t\t\tgapCount: input.subgraph.sync.gaps.count,\n\t\t\t\tintegrity: input.subgraph.sync.integrity,\n\t\t\t}\n\t\t: null;\n\n\tconst hints: string[] = [];\n\tconst issues: DoctorIssue[] = [];\n\tif (input.webhook.warning) {\n\t\thints.push(input.webhook.warning);\n\t\tissues.push({\n\t\t\tcode: \"warning\",\n\t\t\tdetail: input.webhook.warning,\n\t\t\tseverity: \"warn\",\n\t\t});\n\t}\n\tif (input.webhook.status === \"paused\") {\n\t\thints.push(\n\t\t\t`Resume when the receiver is healthy: secondlayer webhooks resume ${input.webhook.id}`,\n\t\t);\n\t\tissues.push({ code: \"paused\", severity: \"warn\" });\n\t}\n\tif (input.webhook.lastError) {\n\t\thints.push(\n\t\t\t\"Run secondlayer webhooks test to reproduce the receiver request.\",\n\t\t);\n\t\tissues.push({\n\t\t\tcode: \"last_error\",\n\t\t\tdetail: input.webhook.lastError,\n\t\t\tseverity: \"warn\",\n\t\t});\n\t}\n\tif (input.webhook.circuitOpenedAt || input.webhook.circuitFailures > 0) {\n\t\thints.push(\n\t\t\t\"Circuit breaker has failures; inspect receiver logs and delivery status codes.\",\n\t\t);\n\t\tissues.push({ code: \"circuit\", severity: \"bad\" });\n\t}\n\tif (input.dead.length > 0) {\n\t\thints.push(\n\t\t\t`Dead-letter rows exist; inspect with secondlayer webhooks dead ${input.webhook.id} and requeue selected rows.`,\n\t\t);\n\t\tissues.push({ code: \"dead_letters\", severity: \"bad\" });\n\t}\n\tif (subgraph?.gapCount && subgraph.gapCount > 0) {\n\t\thints.push(\n\t\t\t`Linked subgraph has gaps; run secondlayer subgraphs gaps ${input.webhook.subgraphName}.`,\n\t\t);\n\t\tissues.push({ code: \"subgraph_gaps\", severity: \"calm\" });\n\t}\n\tif (subgraph?.syncStatus === \"catching_up\") {\n\t\thints.push(\n\t\t\t\"Linked subgraph is still catching up; new matching rows may arrive later.\",\n\t\t);\n\t\tissues.push({ code: \"subgraph_catching_up\", severity: \"calm\" });\n\t}\n\n\tfor (const detector of [\n\t\tdetectReceiverRateLimited,\n\t\tdetectReceiverDown,\n\t\tdetectReceiverRejects,\n\t\tdetectReceiverSlow,\n\t]) {\n\t\tconst issue = detector(input.webhook, input.deliveries);\n\t\tif (issue) {\n\t\t\tissues.push(issue);\n\t\t\thints.push(hintFor(issue));\n\t\t}\n\t}\n\tconst lagIssue = detectDeliveryLag(input.deliveries);\n\tif (lagIssue) {\n\t\tissues.push(lagIssue);\n\t\thints.push(hintFor(lagIssue));\n\t}\n\n\tif (input.deliveries.length === 0) {\n\t\thints.push(\n\t\t\t\"No deliveries yet; confirm the table is receiving inserted rows that match the filter.\",\n\t\t);\n\t\tissues.push({ code: \"no_deliveries\", severity: \"calm\" });\n\t}\n\tif (hints.length === 0) {\n\t\thints.push(\"No immediate action needed.\");\n\t}\n\n\treturn {\n\t\twebhook: input.webhook,\n\t\tdeliverySummary: {\n\t\t\ttotal: input.deliveries.length,\n\t\t\tsuccessful,\n\t\t\tfailed,\n\t\t\tlast: input.deliveries[0] ?? null,\n\t\t},\n\t\tdeadCount: input.dead.length,\n\t\tsubgraph,\n\t\thints,\n\t\tissues,\n\t\tprimary: pickPrimary(issues),\n\t};\n}\n\n/**\n * The list page's own reduced detector: computed from `WebhookSummary` alone\n * (no deliveries, no dead-letter rows — the list endpoint returns neither,\n * and fetching per-row detail or deliveries here would fan out one request\n * per row). Only `status` and `circuitOpenedAt` distinguish a real problem\n * from a manual pause at this level; deliveries-based rules (rate limits,\n * downtime, rejects, slowness, lag) only ever show on the detail page.\n */\nexport function buildListIssue(\n\twebhook: Pick<WebhookSummary, \"status\" | \"circuitOpenedAt\" | \"lastSuccessAt\">,\n): DoctorIssue | null {\n\tif (webhook.status !== \"paused\") return null;\n\tif (webhook.circuitOpenedAt) {\n\t\treturn {\n\t\t\tcode: \"circuit\",\n\t\t\tseverity: \"bad\",\n\t\t\tevidence: [\n\t\t\t\t{\n\t\t\t\t\tlabel: \"circuit opened\",\n\t\t\t\t\tvalue: formatShortDate(webhook.circuitOpenedAt),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: \"last success\",\n\t\t\t\t\tvalue: webhook.lastSuccessAt\n\t\t\t\t\t\t? formatShortDate(webhook.lastSuccessAt)\n\t\t\t\t\t\t: \"never\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tfix: {\n\t\t\t\ttext: \"Check your receiver's health and logs, then send a test event.\",\n\t\t\t\tdocsPath: \"/docs/webhooks#receiver-down\",\n\t\t\t},\n\t\t};\n\t}\n\treturn { code: \"paused\", severity: \"warn\" };\n}\n",
|
|
25
25
|
"import type { ConsumerBatchContext } from \"./streams/types.ts\";\n\n/**\n * The two pieces every \"deploy a consumer\" guide leaves out, packaged:\n * a liveness endpoint and a graceful-shutdown signal. Both are\n * runtime-agnostic — the SDK never binds a port or assumes Bun/Node.\n */\n\nexport interface ConsumerHealth {\n\t/** Feed this to the consume loop's `onProgress` — it stamps arrival time\n\t * and keeps the latest progress ctx for the health body. */\n\trecord: (ctx: ConsumerBatchContext) => void;\n\t/** Fetch-style handler for `GET /health`. Mount it on whatever serves\n\t * HTTP in your runtime:\n\t * `Bun.serve({ port, fetch: health.handler })` ·\n\t * `http.createServer(...)` via an adapter · a Workers route. */\n\thandler: (req: Request) => Response;\n}\n\n/**\n * Liveness for a consume loop. The gate is \"did a page land recently\", NOT\n * \"are we near the tip\": during a genesis backfill the loop is millions of\n * blocks behind and perfectly healthy, so lag can't be the signal. A wedged\n * loop stops reporting pages and flips to 503 — that's what platforms\n * should restart on. The body carries position for dashboards:\n * `blocks_behind` is the actual backlog (`tip - scanned_height`, ~0 for a\n * caught-up tail even on a quiet contract), while `last_delivered_height`\n * is the last DELIVERED row — its distance from the tip is event age, not\n * lag.\n */\nexport function consumerHealth(\n\toptions: { staleAfterMs?: number } = {},\n): ConsumerHealth {\n\tconst staleAfterMs = options.staleAfterMs ?? 120_000;\n\tconst startedAt = Date.now();\n\tlet lastCtx: ConsumerBatchContext | null = null;\n\tlet lastBatchAt = 0;\n\n\treturn {\n\t\trecord(ctx) {\n\t\t\tlastCtx = ctx;\n\t\t\tlastBatchAt = Date.now();\n\t\t},\n\t\thandler(req) {\n\t\t\tif (new URL(req.url).pathname !== \"/health\") {\n\t\t\t\treturn new Response(\"not found\", { status: 404 });\n\t\t\t}\n\t\t\t// Before the first page there is nothing to be stale about — a cold\n\t\t\t// start is healthy while it opens its first connection.\n\t\t\tconst idleMs = lastBatchAt ? Date.now() - lastBatchAt : 0;\n\t\t\tconst ok = idleMs < staleAfterMs;\n\t\t\treturn Response.json(\n\t\t\t\t{\n\t\t\t\t\tok,\n\t\t\t\t\tcheckpoint: lastCtx?.cursor ?? null,\n\t\t\t\t\tlast_delivered_height: lastCtx?.height ?? null,\n\t\t\t\t\tscanned_height: lastCtx?.scannedHeight ?? null,\n\t\t\t\t\ttip_height: lastCtx?.tipHeight ?? null,\n\t\t\t\t\tblocks_behind: lastCtx?.blocksBehind ?? null,\n\t\t\t\t\tidle_s: Math.floor(idleMs / 1000),\n\t\t\t\t\tuptime_s: Math.floor((Date.now() - startedAt) / 1000),\n\t\t\t\t},\n\t\t\t\t{ status: ok ? 200 : 503 },\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * An `AbortSignal` wired to SIGTERM/SIGINT (redeploys arrive as SIGTERM).\n * Pass it as the consume loop's `signal`: aborting is checked at the top of\n * the loop, never mid-batch, so the in-flight transaction — rows AND\n * checkpoint — always commits before the process exits. Nothing is\n * half-written; the next run resumes from exactly that cursor.\n *\n * No-op (never fires) on runtimes without `process` signal handling.\n */\nexport function shutdownSignal(\n\toptions: { signals?: readonly (\"SIGTERM\" | \"SIGINT\")[] } = {},\n): AbortSignal {\n\tconst controller = new AbortController();\n\tif (typeof process !== \"undefined\" && typeof process.on === \"function\") {\n\t\tfor (const signal of options.signals ?? [\"SIGTERM\", \"SIGINT\"]) {\n\t\t\tprocess.on(signal, () => {\n\t\t\t\tcontroller.abort(new Error(`${signal} — finishing the current batch`));\n\t\t\t});\n\t\t}\n\t}\n\treturn controller.signal;\n}\n",
|
|
26
26
|
"import type { ChainWebhookDelivery } from \"@secondlayer/shared\";\nimport { verifySecondlayerSignatureValues } from \"@secondlayer/shared/crypto/secondlayer-webhook\";\nimport {\n\ttype StandardWebhooksHeaders,\n\tverify,\n} from \"@secondlayer/shared/crypto/standard-webhooks\";\n\nexport {\n\ttype StandardWebhooksHeaders,\n\tverify as verifyStandardWebhooksHeaders,\n} from \"@secondlayer/shared/crypto/standard-webhooks\";\nexport type {\n\tChainApplyDeliveryOf,\n\tChainApplyEnvelope,\n\tChainApplyEnvelopeOf,\n\tChainEventEnvelope,\n\tChainFtBurnData,\n\tChainFtMintData,\n\tChainFtTransferData,\n\tChainNftBurnData,\n\tChainNftMintData,\n\tChainNftTransferData,\n\tChainPrintEventData,\n\tChainReorgOrphanedEntry,\n\tChainReorgRollbackDelivery,\n\tChainReorgRollbackEnvelope,\n\tChainStxBurnData,\n\tChainStxLockData,\n\tChainStxMintData,\n\tChainStxTransferData,\n\tChainTestDelivery,\n\tChainTxLevelEvent,\n\tChainWebhookDelivery,\n\tChainWebhookEnvelope,\n\tSbtcDepositEvent,\n\tSbtcWithdrawalEvent,\n\tSbtcWithdrawalSweptConfirmedEvent,\n} from \"@secondlayer/shared\";\n\ntype HeaderLookup = (name: string) => string | null | undefined;\nexport type WebhookHeaderInput =\n\t| HeaderLookup\n\t| StandardWebhooksHeaders\n\t| Record<string, string | string[] | undefined>\n\t| { get: (name: string) => string | null }; // e.g. Fetch `Headers`\n\nfunction pickHeader(\n\theaders: WebhookHeaderInput,\n\tname: string,\n): string | undefined {\n\tif (typeof headers === \"function\") {\n\t\tconst v = (headers as HeaderLookup)(name);\n\t\treturn typeof v === \"string\" ? v : undefined;\n\t}\n\tif (\n\t\ttypeof (headers as { get?: unknown }).get === \"function\" &&\n\t\t!(name in (headers as Record<string, unknown>))\n\t) {\n\t\tconst v = (headers as { get: (n: string) => string | null }).get(name);\n\t\treturn typeof v === \"string\" ? v : undefined;\n\t}\n\tconst bag = headers as Record<string, string | string[] | undefined>;\n\tlet v = bag[name] ?? bag[name.toLowerCase()];\n\tif (v === undefined) {\n\t\tconst target = name.toLowerCase();\n\t\tfor (const key of Object.keys(bag)) {\n\t\t\tif (key.toLowerCase() === target) {\n\t\t\t\tv = bag[key];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (Array.isArray(v)) return v[0];\n\treturn typeof v === \"string\" ? v : undefined;\n}\n\n/**\n * Verify a Secondlayer webhook delivery signature.\n *\n * Every delivery whose webhook `format` is `\"standard-webhooks\"` (the\n * default) carries three Standard Webhooks headers:\n *\n * webhook-id — UUID for the delivery (stable across retries; use as\n * your dedup key)\n * webhook-timestamp — unix seconds at dispatch time\n * webhook-signature — space-separated list of `v1,<base64-hmac>` tuples\n *\n * The signed content is `${id}.${timestamp}.${rawBody}` HMAC-SHA256 with the\n * signing secret. Secrets returned by `secondlayer webhooks create` (or\n * `rotate-secret`) are a bare 64-character hex string used directly as the\n * HMAC key (its UTF-8 bytes) — this helper handles that. A `whsec_`-prefixed\n * base64 secret (the Svix convention) is also accepted and base64-decoded after\n * the prefix is stripped. Note: because the issued secret is bare hex (no\n * `whsec_` prefix), a generic Svix / Standard Webhooks library will base64-\n * decode it and derive the wrong key — verify with this helper (or with\n * {@link verifySecondlayerSignature}, the format-agnostic ed25519 path).\n *\n * @param rawBody The raw request body as a string. NEVER pass\n * `JSON.stringify(req.body)` — re-stringifying drops\n * key ordering and whitespace, breaking the HMAC.\n * Use the raw body bytes/string your framework hands\n * you (Express raw body middleware, Hono `c.req.text()`,\n * Bun `await req.text()`, etc.).\n * @param headers The request headers. Accepts a plain object\n * (Express / Node), a Fetch `Headers` instance\n * (Bun / Hono / Workers), or a callback that returns\n * a header value by name. Header name matching is\n * case-insensitive.\n * @param secret The signing secret returned by\n * `secondlayer webhooks create` / `rotateSecret` (a bare\n * 64-char hex string). Pass it through verbatim — the\n * helper accepts both bare hex and `whsec_`-prefixed\n * base64 secrets.\n * @param toleranceSeconds Max age of `webhook-timestamp` in seconds. Default\n * 300 (5 min) per the Standard Webhooks spec.\n * @returns true if every header is present, the timestamp is within\n * tolerance, and a `v1` signature matches.\n *\n * @example\n * ```ts\n * // Hono / Bun\n * import { verifyWebhookSignature } from \"@secondlayer/sdk\";\n *\n * app.post(\"/webhook\", async (c) => {\n * const raw = await c.req.text();\n * if (!verifyWebhookSignature(raw, c.req.raw.headers, process.env.SIGNING_SECRET!)) {\n * return c.text(\"Invalid signature\", 401);\n * }\n * const { type, timestamp, data } = JSON.parse(raw);\n * // ... process data ...\n * return c.body(null, 204);\n * });\n * ```\n *\n * @example\n * ```ts\n * // Express with raw-body middleware\n * import express from \"express\";\n * import { verifyWebhookSignature } from \"@secondlayer/sdk\";\n *\n * app.post(\n * \"/webhook\",\n * express.raw({ type: \"application/json\" }),\n * (req, res) => {\n * const raw = req.body.toString(\"utf8\");\n * if (!verifyWebhookSignature(raw, req.headers, process.env.SIGNING_SECRET!)) {\n * return res.status(401).end();\n * }\n * // ... process raw ...\n * res.status(204).end();\n * },\n * );\n * ```\n */\nexport function verifyWebhookSignature(\n\trawBody: string,\n\theaders: WebhookHeaderInput,\n\tsecret: string,\n\ttoleranceSeconds = 300,\n): boolean {\n\tconst id = pickHeader(headers, \"webhook-id\");\n\tconst timestamp = pickHeader(headers, \"webhook-timestamp\");\n\tconst signature = pickHeader(headers, \"webhook-signature\");\n\tif (!id || !timestamp || !signature) return false;\n\treturn verify(\n\t\trawBody,\n\t\t{\n\t\t\t\"webhook-id\": id,\n\t\t\t\"webhook-timestamp\": timestamp,\n\t\t\t\"webhook-signature\": signature,\n\t\t},\n\t\tsecret,\n\t\t{ toleranceSeconds },\n\t);\n}\n\n/**\n * Verify the universal Secondlayer authenticity signature that every delivery\n * carries, regardless of body format (`raw`, `cloudevents`, `standard-webhooks`,\n * …). This is the format-agnostic alternative to {@link verifyWebhookSignature}:\n * instead of a per-webhook HMAC secret, it checks an ed25519 signature over\n * `${webhook-id}.${rawBody}` against Secondlayer's published public key — so one\n * key proves authenticity for any format.\n *\n * @param rawBody The raw request body string (never re-stringify the parsed\n * JSON — whitespace/key-order changes break the signature).\n * @param headers Request headers — plain object, Fetch `Headers`, or a\n * lookup callback. Reads `webhook-id` + `x-secondlayer-signature`.\n * @param publicKeyPem Secondlayer's published ed25519 public key (SPKI PEM).\n * @returns true when the signature header is present and verifies.\n *\n * @example\n * ```ts\n * import { verifySecondlayerSignature } from \"@secondlayer/sdk\";\n *\n * app.post(\"/webhook\", async (c) => {\n * const raw = await c.req.text();\n * if (!verifySecondlayerSignature(raw, c.req.raw.headers, SECONDLAYER_PUBLIC_KEY)) {\n * return c.text(\"Invalid signature\", 401);\n * }\n * // ... process raw ...\n * return c.body(null, 204);\n * });\n * ```\n */\nexport function verifySecondlayerSignature(\n\trawBody: string,\n\theaders: WebhookHeaderInput,\n\tpublicKeyPem: string,\n): boolean {\n\tconst id = pickHeader(headers, \"webhook-id\");\n\tconst signature = pickHeader(headers, \"x-secondlayer-signature\");\n\treturn verifySecondlayerSignatureValues(rawBody, id, signature, publicKeyPem);\n}\n\n/**\n * Decode + narrow a chain webhook delivery body into a typed\n * {@link ChainWebhookDelivery}. Verify the signature first with\n * {@link verifyWebhookSignature} (or {@link verifySecondlayerSignature}), then\n * decode the same raw body — this does not check authenticity, only shape.\n *\n * Only understands the `format: \"standard-webhooks\"` envelope (`{ type,\n * timestamp, data }`) — the webhook default, and the only format\n * `verifyWebhookSignature` covers. Other formats (`raw`, `cloudevents`, …)\n * carry the same `data` value under a different envelope; see the \"Chain\n * webhook payloads\" doc for how to unwrap those.\n *\n * A chain webhook delivery is NOT a Streams/Index event — do not run this\n * over a `StreamsEvent` body (`{ event_type, payload }`) or vice versa.\n *\n * @param rawBody The raw request body string (same bytes passed to\n * {@link verifyWebhookSignature}).\n * @throws {Error} if the body isn't a `chain.*` delivery, or the envelope is\n * internally inconsistent (e.g. `type` and `data.trigger` disagree —\n * a sign the wire shape drifted from this decoder).\n *\n * @example\n * ```ts\n * import { decodeChainWebhook, verifyWebhookSignature } from \"@secondlayer/sdk\";\n *\n * app.post(\"/webhook\", async (c) => {\n * const raw = await c.req.text();\n * if (!verifyWebhookSignature(raw, c.req.raw.headers, process.env.SIGNING_SECRET!)) {\n * return c.text(\"Invalid signature\", 401);\n * }\n * const delivery = decodeChainWebhook(raw);\n * if (delivery.data.action === \"apply\" && delivery.data.trigger === \"stx_transfer\") {\n * delivery.data.event.data.amount; // typed\n * }\n * return c.body(null, 204);\n * });\n * ```\n */\nexport function decodeChainWebhook(rawBody: string): ChainWebhookDelivery {\n\tconst parsed = JSON.parse(rawBody) as {\n\t\ttype?: unknown;\n\t\ttimestamp?: unknown;\n\t\tdata?: unknown;\n\t};\n\tif (\n\t\ttypeof parsed.type !== \"string\" ||\n\t\ttypeof parsed.timestamp !== \"string\" ||\n\t\ttypeof parsed.data !== \"object\" ||\n\t\tparsed.data === null\n\t) {\n\t\tthrow new Error(\n\t\t\t\"decodeChainWebhook: not a chain webhook delivery — expected { type, timestamp, data }\",\n\t\t);\n\t}\n\tif (!parsed.type.startsWith(\"chain.\")) {\n\t\tthrow new Error(\n\t\t\t`decodeChainWebhook: not a chain webhook delivery (type \"${parsed.type}\")`,\n\t\t);\n\t}\n\n\tconst data = parsed.data as Record<string, unknown>;\n\tif (parsed.type === \"chain.test.apply\") {\n\t\tif (data.test !== true) {\n\t\t\tthrow new Error(\n\t\t\t\t'decodeChainWebhook: \"chain.test.apply\" body missing `data.test: true`',\n\t\t\t);\n\t\t}\n\t} else if (parsed.type === \"chain.reorg.rollback\") {\n\t\tif (data.action !== \"rollback\" || !Array.isArray(data.orphaned)) {\n\t\t\tthrow new Error(\n\t\t\t\t'decodeChainWebhook: \"chain.reorg.rollback\" body missing `data.action`/`data.orphaned`',\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (data.action !== \"apply\" || typeof data.trigger !== \"string\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"decodeChainWebhook: apply delivery missing `data.action`/`data.trigger`\",\n\t\t\t);\n\t\t}\n\t\tif (parsed.type !== `chain.${data.trigger}.apply`) {\n\t\t\tthrow new Error(\n\t\t\t\t`decodeChainWebhook: type \"${parsed.type}\" doesn't match data.trigger \"${data.trigger}\"`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn parsed as unknown as ChainWebhookDelivery;\n}\n",
|
|
27
27
|
"import {\n\ttype RewardSet,\n\tverifySignerSignatures,\n} from \"@secondlayer/shared/node/consensus\";\nimport {\n\ttype MerkleProofStep,\n\tnakamotoBlockHash,\n\tnakamotoBlockId,\n\tparseNakamotoBlockHeader,\n\tstacksTxid,\n\tverifyTxMerkleProof,\n} from \"@secondlayer/shared/node/nakamoto\";\nimport { hexToBytes } from \"@secondlayer/stacks/utils\";\n\n/**\n * Trustless transaction-inclusion proof verification.\n *\n * Given a proof from `GET /v1/index/transactions/:txid/proof`, the consumer\n * re-derives everything itself — it does NOT trust any value Secondlayer\n * computed. Anchored level: (1) recompute the txid from the raw tx bytes, (2)\n * fold it up the merkle path to the header's `tx_merkle_root`, (3) recompute the\n * header's `block_hash` and `index_block_hash` from the raw header — \"this tx is\n * included in a header any node can corroborate\". Consensus level (when the proof\n * carries a `consensus` field, or a `rewardSet` is passed): additionally recover\n * the header's signer signatures and confirm ≥70% of reward-set signer weight\n * signed the block.\n *\n * Note: uses Node's crypto via `@secondlayer/shared` (same as the Streams\n * signature verify); intended for Node/server verification.\n */\nexport interface TransactionProof {\n\ttxid: string;\n\tindex_block_hash: string;\n\tblock_height: number;\n\ttx_index: number;\n\t/** Raw consensus-serialized transaction bytes (hex). */\n\traw_tx: string;\n\t/** Raw Nakamoto block-header bytes (hex) — parsed + re-hashed by the verifier. */\n\traw_header: string;\n\t/** Authentication path from the tx leaf to `tx_merkle_root`. */\n\ttx_merkle_path: MerkleProofStep[];\n\t/** Present when consensus-level verification is available: the reward cycle and\n\t * its signer set, against which the header's signer signatures are checked. */\n\tconsensus?: {\n\t\treward_cycle: number;\n\t\treward_set: RewardSet;\n\t};\n}\n\nexport interface TransactionProofVerifyResult {\n\t/** Highest level actually verified. \"consensus\" requires the proof's\n\t * `consensus` field and a met signer-weight threshold. */\n\tlevel: \"anchored\" | \"consensus\";\n\t/** Recomputed txid === proof.txid. */\n\ttxidMatches: boolean;\n\t/** Merkle path folds the txid to the header's tx_merkle_root. */\n\tincludedInHeader: boolean;\n\t/** Recomputed block_hash + index_block_hash match the header / proof. */\n\theaderSelfConsistent: boolean;\n\t/** Basis points (0–10000) of reward-set signer weight that signed the block.\n\t * Only set when the proof carries a `consensus` field. */\n\tsignerWeightBps?: number;\n\t/** ≥70% of signer weight signed. Only set with a `consensus` field. */\n\tthresholdMet?: boolean;\n\t/** Which reward set the signer check used: \"provided\" (caller-resolved →\n\t * fully trustless) or \"embedded\" (the one Secondlayer put in the proof). */\n\trewardSetSource?: \"provided\" | \"embedded\";\n\t/** All applicable checks passed (incl. the threshold when consensus is present). */\n\tok: boolean;\n\terrors: string[];\n}\n\nconst strip = (h: string): string => (h.startsWith(\"0x\") ? h.slice(2) : h);\n// hexToBytes instead of Buffer.from(h, \"hex\") — proofs must verify on edge\n// runtimes where Buffer doesn't exist, and it validates byte sequences.\nconst bytes = (h: string): Uint8Array => hexToBytes(h);\n\n/**\n * Resolve a reward set directly from a stacks-node (`/v3/stacker_set/{cycle}`),\n * so a caller can verify the consensus layer against a node IT trusts rather than\n * the reward set Secondlayer embedded in the proof. Pass the result as\n * `verifyTransactionProof(proof, { rewardSet })`.\n */\nexport async function fetchRewardSet(opts: {\n\tnodeUrl: string;\n\tcycle: number;\n\tfetchImpl?: typeof fetch;\n}): Promise<RewardSet | null> {\n\tconst f = opts.fetchImpl ?? fetch;\n\tconst res = await f(\n\t\t`${opts.nodeUrl.replace(/\\/+$/, \"\")}/v3/stacker_set/${opts.cycle}`,\n\t);\n\tif (res.status === 404) return null;\n\tif (!res.ok) {\n\t\tthrow new Error(`/v3/stacker_set/${opts.cycle} returned ${res.status}`);\n\t}\n\tconst body = (await res.json()) as {\n\t\tstacker_set: { signers: { signing_key: string; weight: number }[] };\n\t};\n\tconst signers = body.stacker_set.signers.map((s) => ({\n\t\tsigning_key: strip(s.signing_key),\n\t\tweight: s.weight,\n\t}));\n\treturn {\n\t\tsigners,\n\t\ttotal_weight: signers.reduce((sum, s) => sum + s.weight, 0),\n\t};\n}\n\n/**\n * Verify a transaction-inclusion proof. Every check is recomputed client-side,\n * so a `true` result does not rely on trusting Secondlayer. Pass\n * `{ rewardSet }` (resolved via {@link fetchRewardSet} from your own node) to\n * verify the consensus layer against a reward set you trust rather than the one\n * embedded in the proof.\n */\nexport function verifyTransactionProof(\n\tproof: TransactionProof,\n\topts?: { rewardSet?: RewardSet },\n): TransactionProofVerifyResult {\n\tconst errors: string[] = [];\n\n\t// (1) recompute the txid from the raw tx bytes\n\tconst computedTxid = stacksTxid(bytes(proof.raw_tx));\n\tconst txidMatches = computedTxid === strip(proof.txid);\n\tif (!txidMatches) errors.push(\"txid does not match raw_tx\");\n\n\t// parse the header (so we use ITS tx_merkle_root / consensus_hash, not a field)\n\tconst header = parseNakamotoBlockHeader(bytes(proof.raw_header));\n\n\t// (2) inclusion: fold txid up the merkle path to the header's root\n\tconst includedInHeader = verifyTxMerkleProof(\n\t\tcomputedTxid,\n\t\tproof.tx_merkle_path,\n\t\theader.txMerkleRoot,\n\t);\n\tif (!includedInHeader)\n\t\terrors.push(\"merkle path does not reach tx_merkle_root\");\n\n\t// (3) header self-consistency: recompute block_hash + index_block_hash\n\tconst blockHash = nakamotoBlockHash(header);\n\tconst indexBlockHash = nakamotoBlockId(blockHash, header.consensusHash);\n\tconst headerSelfConsistent = indexBlockHash === strip(proof.index_block_hash);\n\tif (!headerSelfConsistent) {\n\t\terrors.push(\"recomputed index_block_hash does not match proof\");\n\t}\n\n\tconst anchoredOk = txidMatches && includedInHeader && headerSelfConsistent;\n\n\t// (4) consensus: recover the header's signer signatures over the block_hash and\n\t// weigh them against the reward set. A caller-provided `rewardSet` (resolved\n\t// from a trusted node) takes precedence over the proof's embedded set and makes\n\t// this fully trustless; otherwise the embedded set is used.\n\tconst rewardSet = opts?.rewardSet ?? proof.consensus?.reward_set;\n\tlet level: \"anchored\" | \"consensus\" = \"anchored\";\n\tlet signerWeightBps: number | undefined;\n\tlet thresholdMet: boolean | undefined;\n\tlet rewardSetSource: \"provided\" | \"embedded\" | undefined;\n\tif (rewardSet) {\n\t\tconst v = verifySignerSignatures(\n\t\t\tblockHash,\n\t\t\theader.signerSignatures,\n\t\t\trewardSet,\n\t\t);\n\t\tsignerWeightBps =\n\t\t\tv.totalWeight > 0\n\t\t\t\t? Math.round((v.signedWeight / v.totalWeight) * 10000)\n\t\t\t\t: 0;\n\t\tthresholdMet = v.thresholdMet;\n\t\trewardSetSource = opts?.rewardSet ? \"provided\" : \"embedded\";\n\t\tif (!thresholdMet) errors.push(\"signer weight below the 70% threshold\");\n\t\tif (anchoredOk && thresholdMet) level = \"consensus\";\n\t}\n\n\treturn {\n\t\tlevel,\n\t\ttxidMatches,\n\t\tincludedInHeader,\n\t\theaderSelfConsistent,\n\t\tsignerWeightBps,\n\t\tthresholdMet,\n\t\trewardSetSource,\n\t\tok: anchoredOk && (rewardSet ? thresholdMet === true : true),\n\t\terrors,\n\t};\n}\n",
|
|
28
28
|
"export { createStreamsClient } from \"./client.ts\";\nexport { decode } from \"./decode.ts\";\nexport {\n\tAuthError,\n\tRateLimitError,\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tValidationError,\n} from \"./errors.ts\";\n// ── Per-type guard+decode pairs ─────────────────────────────────────────\n// @deprecated (whole block): these 22 helpers return DB-row shapes\n// (`decoded_payload` nested, `source_cursor`) and force an 11-branch\n// guard+decode dispatch, which is the wrong default for a consumer. Use\n// `decode(event)` — one call, the same flat `event_type`-discriminated row\n// Index serves — or `decoded: true` on `streams.events.consume`.\n//\n// They are NOT going away: building a `decoded_events`-shaped projection is a\n// real use, and it is what our own decoder does. They move to the explicit\n// `@secondlayer/sdk/streams/rows` subpath at the next major, so reaching for\n// the storage shape is a deliberate act rather than the first thing autocomplete\n// offers. Import from there today.\nexport {\n\tdecodeFtTransfer,\n\tisFtTransfer,\n\tdecodeNftTransfer,\n\tisNftTransfer,\n\tdecodeStxBurn,\n\tdecodeStxLock,\n\tdecodeStxMint,\n\tdecodeStxTransfer,\n\tisStxBurn,\n\tisStxLock,\n\tisStxMint,\n\tisStxTransfer,\n\tdecodeFtBurn,\n\tdecodeFtMint,\n\tdecodeNftBurn,\n\tdecodeNftMint,\n\tisFtBurn,\n\tisFtMint,\n\tisNftBurn,\n\tisNftMint,\n\tdecodePrint,\n\tisPrint,\n} from \"@secondlayer/shared/streams-rows\";\nexport type {\n\tDecodedEventColumns,\n\tDecodedEventRow,\n\tDecodedFtBurn,\n\tDecodedFtBurnPayload,\n\tDecodedFtMint,\n\tDecodedFtMintPayload,\n\tDecodedFtTransfer,\n\tDecodedFtTransferPayload,\n\tDecodedNftBurn,\n\tDecodedNftBurnPayload,\n\tDecodedNftMint,\n\tDecodedNftMintPayload,\n\tDecodedNftTransfer,\n\tDecodedNftTransferPayload,\n\tDecodedPrint,\n\tDecodedPrintPayload,\n\tDecodedPrintValue,\n\tDecodedStxBurn,\n\tDecodedStxBurnPayload,\n\tDecodedStxLock,\n\tDecodedStxLockPayload,\n\tDecodedStxMint,\n\tDecodedStxMintPayload,\n\tDecodedStxTransfer,\n\tDecodedStxTransferPayload,\n\tFtTransferEvent,\n\tFtTransferPayload,\n\tNftTransferEvent,\n\tNftTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\nexport { STREAMS_EVENT_TYPES } from \"./types.ts\";\nexport { Cursor } from \"./cursor.ts\";\nexport type {\n\tConsumerBatchContext,\n\tFetchLike,\n\tStreamsBatch,\n\tStreamsBatchContext,\n\tStreamsClient,\n\tStreamsConsumeParams,\n\tStreamsCanonicalBlock,\n\tStreamsDumpFile,\n\tStreamsDumps,\n\tStreamsDumpsManifest,\n\tStreamsEvent,\n\tStreamsEventPayload,\n\tStreamsWireEvent,\n\tVmStreamsEvent,\n\tStreamsEventsConsumeParams,\n\tStreamsEventsConsumeResult,\n\tStreamsEventsEnvelope,\n\tStreamsEventsListEnvelope,\n\tStreamsEventsListParams,\n\tStreamsEventsStreamParams,\n\tStreamsEventsSubscribeParams,\n\tStreamsSubscription,\n\tStreamsEventType,\n\tStreamsReorg,\n\tStreamsReorgContext,\n\tStreamsReorgsListEnvelope,\n\tStreamsReorgsListParams,\n\tStreamsTip,\n} from \"./types.ts\";\n",
|
|
29
|
-
"// Canonical event primitives (StreamsEvent, payload types, event-type vocab)\n// live in @secondlayer/shared/streams-rows; re-exported here so the public\n// Streams surface is unchanged.\nimport type { VmEventType } from \"@secondlayer/shared\";\nimport {\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype StreamsWireEvent,\n\ttype VmStreamsEvent,\n} from \"@secondlayer/shared/streams-rows\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\n\nexport {\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype VmStreamsEvent,\n};\nexport type {\n\tFtBurnPayload,\n\tFtMintPayload,\n\tFtTransferPayload,\n\tMapDeletePayload,\n\tMapWritePayload,\n\tNestedContractCallPayload,\n\tVarSetPayload,\n\tStreamsWireEvent,\n\tNftBurnPayload,\n\tNftMintPayload,\n\tNftTransferPayload,\n\tPrintPayload,\n\tStreamsClarityValue,\n\tStreamsEventBase,\n\tStreamsEventPayload,\n\tStxBurnPayload,\n\tStxLockPayload,\n\tStxMintPayload,\n\tStxTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\n\nexport type StreamsTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\t/**\n\t * Highest Stacks block past the burn-confirmation finality boundary.\n\t * Optional for back-compat; the API always sets it.\n\t */\n\tfinalized_height?: number;\n\tlag_seconds: number;\n\t/**\n\t * Oldest height still seekable on the live API for the caller's tier\n\t * (`tip - retention`). `null` = unlimited retention. Older reads must use the\n\t * cold dumps lane. Optional for back-compat.\n\t */\n\toldest_seekable_height?: number | null;\n\t/** Oldest seekable cursor (`<oldest_seekable_height>:0`); `null` = unlimited. */\n\toldest_cursor?: string | null;\n};\n\nexport type StreamsCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\tis_canonical: true;\n};\n\nexport type StreamsReorg = {\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\t/**\n\t * First position of the new canonical chain at the fork, `fork:0`\n\t * (INCLUSIVE). Not an exclusive resume token — resuming directly from it\n\t * skips `fork:0`. The consumer rewinds to the foot of `fork_point_height`\n\t * (`Cursor.atHeight`) to re-read the new run from `fork:0` inclusive.\n\t */\n\tnew_canonical_tip: string;\n};\n\nexport type StreamsEventsEnvelope<TEvent = StreamsEvent> = {\n\tevents: TEvent[];\n\tnext_cursor: string | null;\n\ttip: StreamsTip;\n\treorgs: StreamsReorg[];\n};\n\nexport type StreamsEventsListEnvelope = Omit<\n\tStreamsEventsEnvelope,\n\t\"next_cursor\"\n>;\n\n/** The StreamsEvent union narrowed to a `types` selection — what a\n * const-generic `types: [\"ft_transfer\"]` buys at the type level. */\nexport type StreamsEventOfTypes<T extends readonly StreamsEventType[]> =\n\tExtract<StreamsEvent, { event_type: T[number] }>;\n\nexport type StreamsReorgsListParams = {\n\tsince: string;\n\tlimit?: number;\n};\n\nexport type StreamsReorgsListEnvelope = {\n\treorgs: StreamsReorg[];\n\tnext_since: string | null;\n};\n\n/** A filter that matches a single value or any value in a list. */\nexport type StreamsFilterValue = string | readonly string[];\n\n/**\n * One labelled filter group. Fields inside a group AND together; groups in a\n * map OR together server-side.\n */\nexport type StreamsLabelledFilter = {\n\ttypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n};\n\n/** A map of label → filter group. Labels are yours; the server echoes them. */\nexport type StreamsFilterMap = Record<string, StreamsLabelledFilter>;\n\n/**\n * The events one label can yield. A group that declares `types` narrows to\n * exactly those variants, so a per-label handler needs no `event_type` guard;\n * a group without `types` keeps the full union.\n */\nexport type StreamsEventForFilter<F, D extends boolean = false> = F extends {\n\ttypes: readonly (infer T extends StreamsEventType)[];\n}\n\t? D extends true\n\t\t? Extract<IndexEvent, { event_type: T }>\n\t\t: Extract<StreamsEvent, { event_type: T }>\n\t: D extends true\n\t\t? IndexEvent\n\t\t: StreamsEvent;\n\nexport type StreamsEventsListParams = {\n\tcursor?: string | null;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\t/** `vm` reads ordinal. Omit for Streams 1.0. */\n\tclock?: \"classic\" | \"vm\";\n\ttypes?: readonly (StreamsEventType | VmEventType)[];\n\t/** Event types to exclude (applied after `types`). */\n\tnotTypes?: readonly (StreamsEventType | VmEventType)[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in one scan and each\n\t * returned event carries the labels it matched (`event.matched`) — two\n\t * unrelated concerns share one page, one cursor, one checkpoint.\n\t */\n\tfilters?: StreamsFilterMap;\n\tlimit?: number;\n};\n\nexport type StreamsEventsStreamParams = {\n\tfromCursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n};\n\nexport type StreamsEventsSubscribeParams = {\n\t/** Resume strictly after this cursor; omit to live-tail from the tip. */\n\tfromCursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n\t/** Abort to unsubscribe (the returned function does the same). */\n\tsignal?: AbortSignal;\n\t/**\n\t * Called for each pushed event, in order. The resume cursor advances only\n\t * after this resolves, so a handler that throws sees the same event again\n\t * on reconnect (at-least-once). Key durable writes by `cursor`.\n\t */\n\tonEvent: (event: StreamsEvent) => void | Promise<void>;\n\t/**\n\t * Called on every failure. Transport errors (dropped socket, 5xx, 429, a\n\t * stale connection, a throwing handler) reconnect from the last handled\n\t * cursor with exponential backoff. Errors that a retry cannot fix (401,\n\t * 4xx, a bad signature) end the subscription and reject its `done`.\n\t */\n\tonError?: (err: unknown) => void;\n\t/**\n\t * First reconnect pause in ms (default 1000). Doubles per consecutive\n\t * failure up to 30 s with jitter, resets once a frame arrives, and never\n\t * undercuts a `Retry-After`.\n\t */\n\treconnectDelayMs?: number;\n\t/**\n\t * Reconnect when no frame (pings included) arrives for this long (default\n\t * 60000, three server heartbeats). Catches a half-open socket that never\n\t * errors; set it above your instance's heartbeat interval.\n\t */\n\tstaleAfterMs?: number;\n};\n\n/**\n * Handle for a live subscription: call it to unsubscribe. `done` resolves\n * after unsubscribe (or the signal aborting) and rejects with the error that\n * ended the loop when a retry could not fix it, so a worker can `await`\n * it instead of polling for silence.\n */\nexport type StreamsSubscription = {\n\t(): void;\n\tdone: Promise<void>;\n};\n\n/**\n * The checkpoint the SDK computes for a batch. Persist `cursor` inside the same\n * transaction as your projection writes, then resume from it via `fromCursor`.\n * It is the position to advance to: `next_cursor` normally, or the last\n * finalized event when `finalizedOnly` is set.\n */\n/**\n * What the loop knows at the end of a page, handed to `onBatch`.\n *\n * `cursor` is the position to commit. The rest answers \"how far along am I,\n * and am I still moving\" — the question every deployed consumer has to expose\n * for a health check.\n *\n * Progress is reported here rather than left to callers because only the loop\n * can get it right: `height` has to survive empty pages (normal at the tip)\n * and has to roll back to `fork_point_height - 1` after a reorg rewind.\n * Deriving it from `cursor` is wrong — `Cursor.atHeight` encodes the foot of a\n * block as `${height - 1}:<sentinel>`, so a rewound cursor parses to a\n * position that was never reached.\n */\nexport type ConsumerBatchContext<TTip = unknown, TReorg = unknown> = {\n\t/** Checkpoint to commit alongside your rows. */\n\tcursor: string | null;\n\t/** Highest canonical block a row was DELIVERED from. `null` before the\n\t * first row of a fresh consume. With a sparse filter this parks at the\n\t * last matching event — it measures event recency, not progress. */\n\theight: number | null;\n\t/** Highest canonical block the sweep has VERIFIED through: an empty page\n\t * is the server confirming nothing matches between the cursor and the\n\t * tip, so a caught-up tail scans to the tip even when `height` is far\n\t * below it. Rolls back with reorg rewinds. */\n\tscannedHeight: number | null;\n\t/** Chain tip as of this page's read. */\n\ttipHeight: number;\n\t/** `tipHeight - scannedHeight`, floored at 0 — the consumer's actual\n\t * backlog. `null` until a position is known. A caught-up consumer on a\n\t * quiet contract reads ~0 here while `tipHeight - height` grows — that\n\t * difference is event age, not lag. */\n\tblocksBehind: number | null;\n\t/**\n\t * The full tip for this page — `StreamsTip` or `IndexTip` depending on the\n\t * surface. Exposed here so a handler never needs the `envelope` parameter,\n\t * which is the only way to reach it today and is also how the worst\n\t * `finalizedOnly` mistake becomes reachable (`return envelope.next_cursor`\n\t * jumps the cursor past events that were filtered out and never delivered).\n\t */\n\ttip: TTip;\n\t/**\n\t * Reorgs reported alongside this page; empty when none. Rollback still\n\t * belongs in `onReorg` — this is for observability inside a batch.\n\t */\n\treorgs: readonly TReorg[];\n};\n\n/** @deprecated Use {@link ConsumerBatchContext} — the Index and Streams loops\n * share one shape now. Kept as an alias so existing annotations compile. */\nexport type StreamsBatchContext = ConsumerBatchContext;\n\n/**\n * The checkpoint for a reorg rollback. Persist `cursor` (the rewind position)\n * inside the same transaction as your rollback so the two commit atomically.\n */\n/** `cursor` is the rewind position the loop resumes from after `onReorg`:\n * the foot of the fork point, or `null` for a fork at genesis. Persist it\n * in the same transaction as the rollback. */\nexport type StreamsReorgContext = { cursor: string | null };\n\nexport type StreamsEventsConsumeParams<\n\tTTx = never,\n\tD extends boolean = false,\n\tF extends StreamsFilterMap = Record<never, never>,\n> = {\n\tfromCursor?: string | null;\n\t/**\n\t * Deliver events pre-decoded as the flat, `event_type`-discriminated rows\n\t * Index serves (`IndexEvent`), so Streams consumption reads identically\n\t * to Index consumption — no guard+decode pairs in your handler.\n\t */\n\tdecoded?: D;\n\t/**\n\t * Destination adapter that owns the checkpoint + rollback transaction\n\t * (e.g. `kyselySink` from `@secondlayer/sdk/sinks/kysely`). With a sink:\n\t * the loop resumes from the sink's committed cursor, `onBatch` receives\n\t * `ctx.tx` and must write ONLY through it (rows and cursor commit in one\n\t * transaction), reorg rollback is automatic, and `onBatch`'s return value\n\t * is ignored. Folds (balances) invert in the sink's `onRollback`, not in\n\t * `onReorg`.\n\t */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and before any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\t/**\n\t * Emit only finalized (immutable) events and never surface reorgs. The SDK\n\t * checkpoints at the last finalized event and re-reads the unfinalized tail\n\t * until it settles. Trades finality lag for zero reorg handling; `onReorg` is\n\t * ignored.\n\t */\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in ONE server-side scan,\n\t * so two unrelated concerns share one page, one cursor, and one checkpoint\n\t * instead of two consume loops. Pair with `on` to handle each label.\n\t */\n\tfilters?: F;\n\t/**\n\t * One handler per label in `filters`. Every label must be handled, so\n\t * adding a label is a compile error until its handler exists.\n\t *\n\t * A label's declared `types` narrows its handler's events, so `payload` is\n\t * typed without an `event_type` guard. Labels are dispatched in declaration\n\t * order: a label's own events stay in cursor order, but events of different\n\t * labels do not interleave within a page — add `onBatch` when you need\n\t * strict global order across labels.\n\t */\n\ton?: {\n\t\t[K in keyof F]: (\n\t\t\tevents: StreamsEventForFilter<F[K], D>[],\n\t\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t\t) => void | Promise<void>;\n\t};\n\tbatchSize?: number;\n\t/**\n\t * Apply a page of canonical events. Persist `ctx.cursor` in the same\n\t * transaction as your writes. Returning a cursor overrides `ctx.cursor` as\n\t * the resume point (advanced manual control); returning nothing uses it.\n\t *\n\t * Optional only when `on` handles the page instead; a consume call with\n\t * neither throws.\n\t */\n\tonBatch?: (\n\t\tevents: D extends true ? IndexEvent[] : StreamsEvent[],\n\t\t/**\n\t\t * @deprecated Read `ctx.tip` / `ctx.reorgs` instead. The envelope is\n\t\t * also how the worst `finalizedOnly` mistake stays reachable —\n\t\t * returning `envelope.next_cursor` jumps the cursor past unfinalized\n\t\t * events that were filtered out and never delivered. Removed in the\n\t\t * next major.\n\t\t */\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\t/**\n\t * Roll your projection back to `reorg.fork_point_height`, persisting\n\t * `ctx.cursor` in the same transaction. Called once per *new* reorg at or\n\t * below the checkpoint (deduped in-memory, fork-ascending) before the SDK\n\t * rewinds and re-reads the now-canonical events. A reorg whose fork sits\n\t * above the checkpoint is not a rollback (nothing past it was written) and\n\t * is skipped. Omit it to ignore reorgs (events stay canonical, but stale\n\t * rows from an orphaned fork are left in place).\n\t *\n\t * With `onReorg` or a `sink` attached, every empty page also polls\n\t * `reorgs.list` (one extra request per idle poll) so a fork that lands\n\t * while the consumer idles at the tip is rolled back too.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint before the loop\n\t * refuses with `ValidationError`. Default 1000 blocks. The fork point is\n\t * server supplied and drives a delete on every declared table, so raise\n\t * this only for a source you trust. */\n\tmaxRollbackDepth?: number;\n\t/** Page-fetch retries after the first failure (429/5xx/network only —\n\t * 4xx and handler throws always propagate). Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base retry delay in ms; the n-th retry waits `retryDelay * n`. A server\n\t * `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n};\n\n/**\n * One yielded page from {@link StreamsClient.consume} — the\n * `GET /v1/streams/events` envelope verbatim, with `next_cursor` renamed to\n * `cursor` (the checkpoint to persist and resume from).\n */\nexport type StreamsBatch<TEvent = StreamsEvent> = {\n\t/** Canonical events of this page, in cursor order. */\n\tevents: TEvent[];\n\t/** Checkpoint after this page — pass back as `consume({ cursor })` to resume. */\n\tcursor: string | null;\n\ttip: StreamsTip;\n\t/** Chain reorgs reported alongside this page; empty when none. */\n\treorgs: StreamsReorg[];\n};\n\nexport type StreamsConsumeParams = {\n\t/** Resume strictly after this cursor; omit to start from the oldest seekable page. */\n\tcursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled OR-groups — same semantics as `events.consume`; each returned\n\t * event echoes the labels it matched. */\n\tfilters?: StreamsFilterMap;\n\t/** Events per page (the `limit` query param). Default 100. */\n\tbatchSize?: number;\n\t/** Poll interval while caught up at the tip, in ms. Default 2000. */\n\tintervalMs?: number;\n\t/** Abort to end the iteration. */\n\tsignal?: AbortSignal;\n};\n\nexport type StreamsEventsConsumeResult = {\n\tcursor: string | null;\n\tpages: number;\n\temptyPolls: number;\n};\n\nexport type StreamsEventsReplayParams = {\n\t/** Start point: `\"genesis\"` (default) or a `<block>:<index>` cursor. */\n\tfrom?: \"genesis\" | string;\n\t/**\n\t * Called once per finalized dump file, in block order, before live tailing.\n\t * Process the parquet with your own tooling (e.g. DuckDB) — the SDK does not\n\t * decode parquet. Use `client.dumps.download(file)` to fetch + verify bytes.\n\t *\n\t * Delivery is file-granular and at-least-once: a file whose range straddles\n\t * `from` is handed over whole. `ctx.from` is that cursor (`null` from\n\t * genesis); skip rows at or below it, or key rows by `cursor` so a re-run\n\t * is an idempotent no-op. Files ending at or below `from` are not handed\n\t * over at all.\n\t */\n\tonDumpFile: (\n\t\tfile: StreamsDumpFile,\n\t\tctx: { from: string | null },\n\t) => Promise<void> | void;\n\t/** Called per live page after the dump phase, like `consume`. */\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t) => Promise<string | null | undefined> | string | null | undefined;\n\t/**\n\t * Called when the live-tail phase (after the dump backfill) crosses a reorg,\n\t * before the cursor rewinds and re-reads the now-canonical events — same\n\t * contract as `consume`. The dump-backfill phase is finalized and never\n\t * reorgs; omit this to leave stale rows from an orphaned fork in place.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmode?: \"tail\" | \"bounded\";\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/** Narrow the LIVE TAIL after the dump phase. The dump files themselves are\n\t * always all-type (block-partitioned parquet) — filter those in your own\n\t * tooling while processing each file. */\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\t/** Labelled OR-groups for the live tail, like `consume`. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type FetchLike = (\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/** One bulk parquet file in the dumps manifest. `path` is the object key under\n * the dumps base URL. */\nexport type StreamsDumpFile = {\n\tpath: string;\n\tfrom_block: number;\n\tto_block: number;\n\tmin_cursor: string | null;\n\tmax_cursor: string | null;\n\trow_count: number;\n\tbyte_size: number;\n\tsha256: string;\n\tschema_version: number;\n\tcreated_at: string;\n};\n\nexport type StreamsDumpsManifest = {\n\tdataset: string;\n\tnetwork: string;\n\tversion: string;\n\tschema_version: number;\n\tgenerated_at: string;\n\tproducer_version: string;\n\tfinality_lag_blocks: number;\n\t/** Cursor at the end of the finalized bulk coverage — hand to live tailing. */\n\tlatest_finalized_cursor: string | null;\n\tcoverage: { from_block: number; to_block: number };\n\tfiles: StreamsDumpFile[];\n\t/** ed25519 signature over the manifest's canonical bytes. Absent on legacy\n\t * unsigned manifests. Verified by `list()` when `verifyDumpsManifest` is on. */\n\tsignature?: string;\n\t/** Short id of the signing public key. */\n\tkey_id?: string;\n};\n\nexport type StreamsDumps = {\n\t/** Fetch and parse the latest dumps manifest. */\n\tlist(): Promise<StreamsDumpsManifest>;\n\t/** Absolute URL for a manifest file. */\n\tfileUrl(file: StreamsDumpFile): string;\n\t/** Download a parquet file and verify its sha256 against the manifest. */\n\tdownload(file: StreamsDumpFile): Promise<Uint8Array>;\n};\n\nexport type StreamsClient = {\n\t/**\n\t * Follow Streams as an async iterator of page batches.\n\t *\n\t * Yields one {@link StreamsBatch} per `GET /v1/streams/events` page — the\n\t * existing envelope (`events`, `next_cursor` → `cursor`, `tip`, `reorgs`)\n\t * with zero extra API calls. Batches are chosen over per-block groupings\n\t * because the envelope is page-keyed, so every yield is exactly one fetch.\n\t * Empty pages are skipped; at the tip the iterator re-polls every\n\t * `intervalMs` (default 2000) until aborted via `signal`.\n\t *\n\t * Reorgs are surfaced on the batch (`batch.reorgs`) but the cursor is not\n\t * rewound automatically — use `events.consume` with `onReorg` for managed\n\t * rollback semantics.\n\t */\n\t/** Narrowing overload: a literal `types` array narrows every batch's\n\t * event union to exactly those members. */\n\tconsume<const T extends readonly StreamsEventType[]>(\n\t\tparams: StreamsConsumeParams & { types: T },\n\t): AsyncIterableIterator<StreamsBatch<StreamsEventOfTypes<T>>>;\n\tconsume(params?: StreamsConsumeParams): AsyncIterableIterator<StreamsBatch>;\n\tevents: {\n\t\t/** `clock: \"vm\"` pages carry vm rows only (a parallel vocabulary,\n\t\t * `event_index` = `ordinal`). Never `StreamsEvent`. */\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams & { clock: \"vm\" },\n\t\t): Promise<StreamsEventsEnvelope<VmStreamsEvent>>;\n\t\t/** Narrowing overload, matching `consume`. Classic clock only —\n\t\t * `clock: \"vm\"` is overload 1, and a general `StreamsEventsListParams`\n\t\t * variable (clock unresolved) is the wire-union fallback. */\n\t\tlist<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: Omit<StreamsEventsListParams, \"clock\" | \"types\" | \"notTypes\"> & {\n\t\t\t\ttypes: T;\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope<StreamsEventOfTypes<T>>>;\n\t\tlist(\n\t\t\tparams?: Omit<StreamsEventsListParams, \"clock\" | \"types\" | \"notTypes\"> & {\n\t\t\t\ttypes?: readonly StreamsEventType[];\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope>;\n\t\t/** Unresolved `clock` on a general params variable: the wire union. */\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams,\n\t\t): Promise<StreamsEventsEnvelope<StreamsWireEvent>>;\n\t\tbyTxId(txId: string): Promise<StreamsEventsListEnvelope>;\n\t\t/**\n\t\t * Pull pages from Streams and call `onBatch` after each page.\n\t\t *\n\t\t * Use `consume` for indexers and ETL jobs that own checkpointing. Return\n\t\t * the checkpoint cursor from `onBatch`. Default `mode: \"tail\"` keeps\n\t\t * polling when caught up; `mode: \"bounded\"` exits on the first empty page.\n\t\t * The consumer also exits when `maxPages`, `maxEmptyPolls`, or `signal`\n\t\t * stops it.\n\t\t */\n\t\tconsume<\n\t\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\t\tTTx = never,\n\t\t\tD extends boolean = false,\n\t\t>(\n\t\t\t// The redundant `sink` member gives TS a DIRECT inference site for\n\t\t\t// TTx — inference does not reliably traverse the params alias.\n\t\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Backfill from bulk dumps, then continue live from the dump→live seam in\n\t\t * one call. Iterates finalized dump files (via `onDumpFile`) in block\n\t\t * order, then tails live from the manifest's `latest_finalized_cursor`\n\t\t * (exclusive input → no gap or duplicate at the seam). Requires\n\t\t * `dumpsBaseUrl`.\n\t\t */\n\t\treplay(\n\t\t\tparams: StreamsEventsReplayParams,\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Follow Streams as an async iterator.\n\t\t *\n\t\t * Use `stream` for live processors and watch-style apps. It tails\n\t\t * indefinitely by default and stops when its `AbortSignal`, `maxPages`, or\n\t\t * `maxEmptyPolls` stops it.\n\t\t */\n\t\t/** Narrowing overload, matching `consume`. */\n\t\tstream<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: StreamsEventsStreamParams & { types: T },\n\t\t): AsyncIterable<StreamsEventOfTypes<T>>;\n\t\tstream(params?: StreamsEventsStreamParams): AsyncIterable<StreamsEvent>;\n\t\t/**\n\t\t * Subscribe to the real-time SSE push surface. Calls `onEvent` for each new\n\t\t * canonical event as the server pushes it (chain cadence, not poll-bounded),\n\t\t * and verifies each frame's inline ed25519 signature when the client was\n\t\t * created with `verify`. Returns an unsubscribe function whose `done`\n\t\t * settles when the loop ends. Not reorg-aware: an event delivered then\n\t\t * orphaned is never retracted. Durable writers use `consume()`.\n\t\t */\n\t\tsubscribe(params: StreamsEventsSubscribeParams): StreamsSubscription;\n\t};\n\tblocks: {\n\t\tevents(heightOrHash: number | string): Promise<StreamsEventsListEnvelope>;\n\t};\n\treorgs: {\n\t\tlist(params: StreamsReorgsListParams): Promise<StreamsReorgsListEnvelope>;\n\t};\n\t/** Bulk parquet dumps. Requires `dumpsBaseUrl` on the client. */\n\tdumps: StreamsDumps;\n\tcanonical(height: number): Promise<StreamsCanonicalBlock>;\n\ttip(): Promise<StreamsTip>;\n};\n",
|
|
29
|
+
"// Canonical event primitives (StreamsEvent, payload types, event-type vocab)\n// live in @secondlayer/shared/streams-rows; re-exported here so the public\n// Streams surface is unchanged.\nimport type { VmEventType } from \"@secondlayer/shared\";\nimport {\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype StreamsWireEvent,\n\ttype VmStreamsEvent,\n} from \"@secondlayer/shared/streams-rows\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\n\nexport {\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype VmStreamsEvent,\n};\nexport type {\n\tFtBurnPayload,\n\tFtMintPayload,\n\tFtTransferPayload,\n\tMapDeletePayload,\n\tMapWritePayload,\n\tNestedContractCallPayload,\n\tVarSetPayload,\n\tStreamsWireEvent,\n\tNftBurnPayload,\n\tNftMintPayload,\n\tNftTransferPayload,\n\tPrintPayload,\n\tStreamsClarityValue,\n\tStreamsEventBase,\n\tStreamsEventPayload,\n\tStxBurnPayload,\n\tStxLockPayload,\n\tStxMintPayload,\n\tStxTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\n\nexport type StreamsTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\t/**\n\t * Highest Stacks block past the burn-confirmation finality boundary.\n\t * Optional for back-compat; the API always sets it.\n\t */\n\tfinalized_height?: number;\n\tlag_seconds: number;\n\t/**\n\t * Oldest height still seekable on the live API for the caller's tier\n\t * (`tip - retention`). `null` = unlimited retention. Older reads must use the\n\t * cold dumps lane. Optional for back-compat.\n\t */\n\toldest_seekable_height?: number | null;\n\t/** Oldest seekable cursor (`<oldest_seekable_height>:0`); `null` = unlimited. */\n\toldest_cursor?: string | null;\n};\n\nexport type StreamsCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\tis_canonical: true;\n};\n\nexport type StreamsReorg = {\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\t/**\n\t * First position of the new canonical chain at the fork, `fork:0`\n\t * (INCLUSIVE). Not an exclusive resume token — resuming directly from it\n\t * skips `fork:0`. The consumer rewinds to the foot of `fork_point_height`\n\t * (`Cursor.atHeight`) to re-read the new run from `fork:0` inclusive.\n\t */\n\tnew_canonical_tip: string;\n};\n\nexport type StreamsEventsEnvelope<TEvent = StreamsEvent> = {\n\tevents: TEvent[];\n\tnext_cursor: string | null;\n\ttip: StreamsTip;\n\treorgs: StreamsReorg[];\n};\n\nexport type StreamsEventsListEnvelope = Omit<\n\tStreamsEventsEnvelope,\n\t\"next_cursor\"\n>;\n\n/** The StreamsEvent union narrowed to a `types` selection — what a\n * const-generic `types: [\"ft_transfer\"]` buys at the type level. */\nexport type StreamsEventOfTypes<T extends readonly StreamsEventType[]> =\n\tExtract<StreamsEvent, { event_type: T[number] }>;\n\nexport type StreamsReorgsListParams = {\n\tsince: string;\n\tlimit?: number;\n};\n\nexport type StreamsReorgsListEnvelope = {\n\treorgs: StreamsReorg[];\n\tnext_since: string | null;\n};\n\n/** A filter that matches a single value or any value in a list. */\nexport type StreamsFilterValue = string | readonly string[];\n\n/**\n * One labelled filter group. Fields inside a group AND together; groups in a\n * map OR together server-side.\n */\nexport type StreamsLabelledFilter = {\n\ttypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n};\n\n/** A map of label → filter group. Labels are yours; the server echoes them. */\nexport type StreamsFilterMap = Record<string, StreamsLabelledFilter>;\n\n/**\n * The events one label can yield. A group that declares `types` narrows to\n * exactly those variants, so a per-label handler needs no `event_type` guard;\n * a group without `types` keeps the full union.\n */\nexport type StreamsEventForFilter<F, D extends boolean = false> = F extends {\n\ttypes: readonly (infer T extends StreamsEventType)[];\n}\n\t? D extends true\n\t\t? Extract<IndexEvent, { event_type: T }>\n\t\t: Extract<StreamsEvent, { event_type: T }>\n\t: D extends true\n\t\t? IndexEvent\n\t\t: StreamsEvent;\n\nexport type StreamsEventsListParams = {\n\tcursor?: string | null;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\t/** `vm` reads ordinal. Omit for Streams 1.0. */\n\tclock?: \"classic\" | \"vm\";\n\ttypes?: readonly (StreamsEventType | VmEventType)[];\n\t/** Event types to exclude (applied after `types`). */\n\tnotTypes?: readonly (StreamsEventType | VmEventType)[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in one scan and each\n\t * returned event carries the labels it matched (`event.matched`) — two\n\t * unrelated concerns share one page, one cursor, one checkpoint.\n\t */\n\tfilters?: StreamsFilterMap;\n\tlimit?: number;\n};\n\nexport type StreamsEventsStreamParams = {\n\tfromCursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n};\n\nexport type StreamsEventsSubscribeParams = {\n\t/** Resume strictly after this cursor; omit to live-tail from the tip. */\n\tfromCursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n\t/** Abort to unsubscribe (the returned function does the same). */\n\tsignal?: AbortSignal;\n\t/**\n\t * Called for each pushed event, in order. The resume cursor advances only\n\t * after this resolves, so a handler that throws sees the same event again\n\t * on reconnect (at-least-once). Key durable writes by `cursor`.\n\t */\n\tonEvent: (event: StreamsEvent) => void | Promise<void>;\n\t/**\n\t * Called on every failure. Transport errors (dropped socket, 5xx, 429, a\n\t * stale connection, a throwing handler) reconnect from the last handled\n\t * cursor with exponential backoff. Errors that a retry cannot fix (401,\n\t * 4xx, a bad signature) end the subscription and reject its `done`.\n\t */\n\tonError?: (err: unknown) => void;\n\t/**\n\t * First reconnect pause in ms (default 1000). Doubles per consecutive\n\t * failure up to 30 s with jitter, resets once a frame arrives, and never\n\t * undercuts a `Retry-After`.\n\t */\n\treconnectDelayMs?: number;\n\t/**\n\t * Reconnect when no frame (pings included) arrives for this long (default\n\t * 60000, three server heartbeats). Catches a half-open socket that never\n\t * errors; set it above your instance's heartbeat interval.\n\t */\n\tstaleAfterMs?: number;\n};\n\n/**\n * Handle for a live subscription: call it to unsubscribe. `done` resolves\n * after unsubscribe (or the signal aborting) and rejects with the error that\n * ended the loop when a retry could not fix it, so a worker can `await`\n * it instead of polling for silence.\n */\nexport type StreamsSubscription = {\n\t(): void;\n\tdone: Promise<void>;\n};\n\n/**\n * The checkpoint the SDK computes for a batch. Persist `cursor` inside the same\n * transaction as your projection writes, then resume from it via `fromCursor`.\n * It is the position to advance to: `next_cursor` normally, or the last\n * finalized event when `finalizedOnly` is set.\n */\n/**\n * What the loop knows at the end of a page, handed to `onBatch`.\n *\n * `cursor` is the position to commit. The rest answers \"how far along am I,\n * and am I still moving\" — the question every deployed consumer has to expose\n * for a health check.\n *\n * Progress is reported here rather than left to callers because only the loop\n * can get it right: `height` has to survive empty pages (normal at the tip)\n * and has to roll back to `fork_point_height - 1` after a reorg rewind.\n * Deriving it from `cursor` is wrong — `Cursor.atHeight` encodes the foot of a\n * block as `${height - 1}:<sentinel>`, so a rewound cursor parses to a\n * position that was never reached.\n */\nexport type ConsumerBatchContext<TTip = unknown, TReorg = unknown> = {\n\t/** Checkpoint to commit alongside your rows. */\n\tcursor: string | null;\n\t/** Highest canonical block a row was DELIVERED from. `null` before the\n\t * first row of a fresh consume. With a sparse filter this parks at the\n\t * last matching event — it measures event recency, not progress. */\n\theight: number | null;\n\t/** Highest canonical block the sweep has VERIFIED through: an empty page\n\t * is the server confirming nothing matches between the cursor and the\n\t * tip, so a caught-up tail scans to the tip even when `height` is far\n\t * below it. Rolls back with reorg rewinds. */\n\tscannedHeight: number | null;\n\t/** Chain tip as of this page's read. */\n\ttipHeight: number;\n\t/** `tipHeight - scannedHeight`, floored at 0 — the consumer's actual\n\t * backlog. `null` until a position is known. A caught-up consumer on a\n\t * quiet contract reads ~0 here while `tipHeight - height` grows — that\n\t * difference is event age, not lag. */\n\tblocksBehind: number | null;\n\t/**\n\t * The full tip for this page — `StreamsTip` or `IndexTip` depending on the\n\t * surface. Exposed here so a handler never needs the `envelope` parameter,\n\t * which is the only way to reach it today and is also how the worst\n\t * `finalizedOnly` mistake becomes reachable (`return envelope.next_cursor`\n\t * jumps the cursor past events that were filtered out and never delivered).\n\t */\n\ttip: TTip;\n\t/**\n\t * Reorgs reported alongside this page; empty when none. Rollback still\n\t * belongs in `onReorg` — this is for observability inside a batch.\n\t */\n\treorgs: readonly TReorg[];\n};\n\n/** @deprecated Use {@link ConsumerBatchContext} — the Index and Streams loops\n * share one shape now. Kept as an alias so existing annotations compile. */\nexport type StreamsBatchContext = ConsumerBatchContext;\n\n/**\n * The checkpoint for a reorg rollback. Persist `cursor` (the rewind position)\n * inside the same transaction as your rollback so the two commit atomically.\n */\n/** `cursor` is the rewind position the loop resumes from after `onReorg`:\n * the foot of the fork point, or `null` for a fork at genesis. Persist it\n * in the same transaction as the rollback. */\nexport type StreamsReorgContext = { cursor: string | null };\n\nexport type StreamsEventsConsumeParams<\n\tTTx = never,\n\tD extends boolean = false,\n\tF extends StreamsFilterMap = Record<never, never>,\n> = {\n\tfromCursor?: string | null;\n\t/**\n\t * Deliver events pre-decoded as the flat, `event_type`-discriminated rows\n\t * Index serves (`IndexEvent`), so Streams consumption reads identically\n\t * to Index consumption — no guard+decode pairs in your handler.\n\t */\n\tdecoded?: D;\n\t/**\n\t * Destination adapter that owns the checkpoint + rollback transaction\n\t * (e.g. `kyselySink` from `@secondlayer/sdk/sinks/kysely`). With a sink:\n\t * the loop resumes from the sink's committed cursor, `onBatch` receives\n\t * `ctx.tx` and must write ONLY through it (rows and cursor commit in one\n\t * transaction), reorg rollback is automatic, and `onBatch`'s return value\n\t * is ignored. Folds (balances) invert in the sink's `onRollback`, not in\n\t * `onReorg`.\n\t */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and before any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\t/**\n\t * Emit only finalized (immutable) events and never surface reorgs. The SDK\n\t * checkpoints at the last finalized event and re-reads the unfinalized tail\n\t * until it settles. Trades finality lag for zero reorg handling; `onReorg` is\n\t * ignored.\n\t */\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in ONE server-side scan,\n\t * so two unrelated concerns share one page, one cursor, and one checkpoint\n\t * instead of two consume loops. Pair with `on` to handle each label.\n\t */\n\tfilters?: F;\n\t/**\n\t * One handler per label in `filters`. Every label must be handled, so\n\t * adding a label is a compile error until its handler exists.\n\t *\n\t * A label's declared `types` narrows its handler's events, so `payload` is\n\t * typed without an `event_type` guard. Labels are dispatched in declaration\n\t * order: a label's own events stay in cursor order, but events of different\n\t * labels do not interleave within a page — add `onBatch` when you need\n\t * strict global order across labels.\n\t */\n\ton?: {\n\t\t[K in keyof F]: (\n\t\t\tevents: StreamsEventForFilter<F[K], D>[],\n\t\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t\t) => void | Promise<void>;\n\t};\n\tbatchSize?: number;\n\t/**\n\t * Apply a page of canonical events. Persist `ctx.cursor` in the same\n\t * transaction as your writes. Returning a cursor overrides `ctx.cursor` as\n\t * the resume point (advanced manual control); returning nothing uses it.\n\t *\n\t * Optional only when `on` handles the page instead; a consume call with\n\t * neither throws.\n\t */\n\tonBatch?: (\n\t\tevents: D extends true ? IndexEvent[] : StreamsEvent[],\n\t\t/**\n\t\t * @deprecated Read `ctx.tip` / `ctx.reorgs` instead. The envelope is\n\t\t * also how the worst `finalizedOnly` mistake stays reachable —\n\t\t * returning `envelope.next_cursor` jumps the cursor past unfinalized\n\t\t * events that were filtered out and never delivered. Removed in the\n\t\t * next major.\n\t\t */\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\t/**\n\t * Roll your projection back to `reorg.fork_point_height`, persisting\n\t * `ctx.cursor` in the same transaction. Called once per *new* reorg at or\n\t * below the checkpoint (deduped in-memory, fork-ascending) before the SDK\n\t * rewinds and re-reads the now-canonical events. A reorg whose fork sits\n\t * above the checkpoint is not a rollback (nothing past it was written) and\n\t * is skipped. Omit it to ignore reorgs (events stay canonical, but stale\n\t * rows from an orphaned fork are left in place).\n\t *\n\t * With `onReorg` or a `sink` attached, every empty page also polls\n\t * `reorgs.list` (one extra request per idle poll) so a fork that lands\n\t * while the consumer idles at the tip is rolled back too.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint before the loop\n\t * refuses with `ValidationError`. Default 1000 blocks. The fork point is\n\t * server supplied and drives a delete on every declared table, so raise\n\t * this only for a source you trust. */\n\tmaxRollbackDepth?: number;\n\t/** Page-fetch retries after the first failure (429/5xx/network only —\n\t * 4xx and handler throws always propagate). Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base retry delay in ms; the n-th retry waits `retryDelay * n`. A server\n\t * `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/**\n\t * Cuts the empty-poll backoff short: on an empty page, the loop races\n\t * `emptyBackoffMs` against this promise instead of sleeping the full\n\t * amount. Pass a function that resolves once when new data MIGHT be\n\t * available (e.g. a Postgres NOTIFY listener) — it is called fresh on\n\t * every empty page, never awaited more than once concurrently per page.\n\t * The backoff timer still runs underneath, so a wake source that never\n\t * resolves (or a `wake` this call omits) degrades to the same polling\n\t * behavior as before.\n\t */\n\twake?: () => Promise<void>;\n};\n\n/**\n * One yielded page from {@link StreamsClient.consume} — the\n * `GET /v1/streams/events` envelope verbatim, with `next_cursor` renamed to\n * `cursor` (the checkpoint to persist and resume from).\n */\nexport type StreamsBatch<TEvent = StreamsEvent> = {\n\t/** Canonical events of this page, in cursor order. */\n\tevents: TEvent[];\n\t/** Checkpoint after this page — pass back as `consume({ cursor })` to resume. */\n\tcursor: string | null;\n\ttip: StreamsTip;\n\t/** Chain reorgs reported alongside this page; empty when none. */\n\treorgs: StreamsReorg[];\n};\n\nexport type StreamsConsumeParams = {\n\t/** Resume strictly after this cursor; omit to start from the oldest seekable page. */\n\tcursor?: string | null;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled OR-groups — same semantics as `events.consume`; each returned\n\t * event echoes the labels it matched. */\n\tfilters?: StreamsFilterMap;\n\t/** Events per page (the `limit` query param). Default 100. */\n\tbatchSize?: number;\n\t/** Poll interval while caught up at the tip, in ms. Default 2000. */\n\tintervalMs?: number;\n\t/** Abort to end the iteration. */\n\tsignal?: AbortSignal;\n};\n\nexport type StreamsEventsConsumeResult = {\n\tcursor: string | null;\n\tpages: number;\n\temptyPolls: number;\n};\n\nexport type StreamsEventsReplayParams = {\n\t/** Start point: `\"genesis\"` (default) or a `<block>:<index>` cursor. */\n\tfrom?: \"genesis\" | string;\n\t/**\n\t * Called once per finalized dump file, in block order, before live tailing.\n\t * Process the parquet with your own tooling (e.g. DuckDB) — the SDK does not\n\t * decode parquet. Use `client.dumps.download(file)` to fetch + verify bytes.\n\t *\n\t * Delivery is file-granular and at-least-once: a file whose range straddles\n\t * `from` is handed over whole. `ctx.from` is that cursor (`null` from\n\t * genesis); skip rows at or below it, or key rows by `cursor` so a re-run\n\t * is an idempotent no-op. Files ending at or below `from` are not handed\n\t * over at all.\n\t */\n\tonDumpFile: (\n\t\tfile: StreamsDumpFile,\n\t\tctx: { from: string | null },\n\t) => Promise<void> | void;\n\t/** Called per live page after the dump phase, like `consume`. */\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t) => Promise<string | null | undefined> | string | null | undefined;\n\t/**\n\t * Called when the live-tail phase (after the dump backfill) crosses a reorg,\n\t * before the cursor rewinds and re-reads the now-canonical events — same\n\t * contract as `consume`. The dump-backfill phase is finalized and never\n\t * reorgs; omit this to leave stale rows from an orphaned fork in place.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmode?: \"tail\" | \"bounded\";\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/** Narrow the LIVE TAIL after the dump phase. The dump files themselves are\n\t * always all-type (block-partitioned parquet) — filter those in your own\n\t * tooling while processing each file. */\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\t/** Labelled OR-groups for the live tail, like `consume`. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type FetchLike = (\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/** One bulk parquet file in the dumps manifest. `path` is the object key under\n * the dumps base URL. */\nexport type StreamsDumpFile = {\n\tpath: string;\n\tfrom_block: number;\n\tto_block: number;\n\tmin_cursor: string | null;\n\tmax_cursor: string | null;\n\trow_count: number;\n\tbyte_size: number;\n\tsha256: string;\n\tschema_version: number;\n\tcreated_at: string;\n};\n\nexport type StreamsDumpsManifest = {\n\tdataset: string;\n\tnetwork: string;\n\tversion: string;\n\tschema_version: number;\n\tgenerated_at: string;\n\tproducer_version: string;\n\tfinality_lag_blocks: number;\n\t/** Cursor at the end of the finalized bulk coverage — hand to live tailing. */\n\tlatest_finalized_cursor: string | null;\n\tcoverage: { from_block: number; to_block: number };\n\tfiles: StreamsDumpFile[];\n\t/** ed25519 signature over the manifest's canonical bytes. Absent on legacy\n\t * unsigned manifests. Verified by `list()` when `verifyDumpsManifest` is on. */\n\tsignature?: string;\n\t/** Short id of the signing public key. */\n\tkey_id?: string;\n};\n\nexport type StreamsDumps = {\n\t/** Fetch and parse the latest dumps manifest. */\n\tlist(): Promise<StreamsDumpsManifest>;\n\t/** Absolute URL for a manifest file. */\n\tfileUrl(file: StreamsDumpFile): string;\n\t/** Download a parquet file and verify its sha256 against the manifest. */\n\tdownload(file: StreamsDumpFile): Promise<Uint8Array>;\n};\n\nexport type StreamsClient = {\n\t/**\n\t * Follow Streams as an async iterator of page batches.\n\t *\n\t * Yields one {@link StreamsBatch} per `GET /v1/streams/events` page — the\n\t * existing envelope (`events`, `next_cursor` → `cursor`, `tip`, `reorgs`)\n\t * with zero extra API calls. Batches are chosen over per-block groupings\n\t * because the envelope is page-keyed, so every yield is exactly one fetch.\n\t * Empty pages are skipped; at the tip the iterator re-polls every\n\t * `intervalMs` (default 2000) until aborted via `signal`.\n\t *\n\t * Reorgs are surfaced on the batch (`batch.reorgs`) but the cursor is not\n\t * rewound automatically — use `events.consume` with `onReorg` for managed\n\t * rollback semantics.\n\t */\n\t/** Narrowing overload: a literal `types` array narrows every batch's\n\t * event union to exactly those members. */\n\tconsume<const T extends readonly StreamsEventType[]>(\n\t\tparams: StreamsConsumeParams & { types: T },\n\t): AsyncIterableIterator<StreamsBatch<StreamsEventOfTypes<T>>>;\n\tconsume(params?: StreamsConsumeParams): AsyncIterableIterator<StreamsBatch>;\n\tevents: {\n\t\t/** `clock: \"vm\"` pages carry vm rows only (a parallel vocabulary,\n\t\t * `event_index` = `ordinal`). Never `StreamsEvent`. */\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams & { clock: \"vm\" },\n\t\t): Promise<StreamsEventsEnvelope<VmStreamsEvent>>;\n\t\t/** Narrowing overload, matching `consume`. Classic clock only —\n\t\t * `clock: \"vm\"` is overload 1, and a general `StreamsEventsListParams`\n\t\t * variable (clock unresolved) is the wire-union fallback. */\n\t\tlist<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: Omit<StreamsEventsListParams, \"clock\" | \"types\" | \"notTypes\"> & {\n\t\t\t\ttypes: T;\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope<StreamsEventOfTypes<T>>>;\n\t\tlist(\n\t\t\tparams?: Omit<StreamsEventsListParams, \"clock\" | \"types\" | \"notTypes\"> & {\n\t\t\t\ttypes?: readonly StreamsEventType[];\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope>;\n\t\t/** Unresolved `clock` on a general params variable: the wire union. */\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams,\n\t\t): Promise<StreamsEventsEnvelope<StreamsWireEvent>>;\n\t\tbyTxId(txId: string): Promise<StreamsEventsListEnvelope>;\n\t\t/**\n\t\t * Pull pages from Streams and call `onBatch` after each page.\n\t\t *\n\t\t * Use `consume` for indexers and ETL jobs that own checkpointing. Return\n\t\t * the checkpoint cursor from `onBatch`. Default `mode: \"tail\"` keeps\n\t\t * polling when caught up; `mode: \"bounded\"` exits on the first empty page.\n\t\t * The consumer also exits when `maxPages`, `maxEmptyPolls`, or `signal`\n\t\t * stops it.\n\t\t */\n\t\tconsume<\n\t\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\t\tTTx = never,\n\t\t\tD extends boolean = false,\n\t\t>(\n\t\t\t// The redundant `sink` member gives TS a DIRECT inference site for\n\t\t\t// TTx — inference does not reliably traverse the params alias.\n\t\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Backfill from bulk dumps, then continue live from the dump→live seam in\n\t\t * one call. Iterates finalized dump files (via `onDumpFile`) in block\n\t\t * order, then tails live from the manifest's `latest_finalized_cursor`\n\t\t * (exclusive input → no gap or duplicate at the seam). Requires\n\t\t * `dumpsBaseUrl`.\n\t\t */\n\t\treplay(\n\t\t\tparams: StreamsEventsReplayParams,\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Follow Streams as an async iterator.\n\t\t *\n\t\t * Use `stream` for live processors and watch-style apps. It tails\n\t\t * indefinitely by default and stops when its `AbortSignal`, `maxPages`, or\n\t\t * `maxEmptyPolls` stops it.\n\t\t */\n\t\t/** Narrowing overload, matching `consume`. */\n\t\tstream<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: StreamsEventsStreamParams & { types: T },\n\t\t): AsyncIterable<StreamsEventOfTypes<T>>;\n\t\tstream(params?: StreamsEventsStreamParams): AsyncIterable<StreamsEvent>;\n\t\t/**\n\t\t * Subscribe to the real-time SSE push surface. Calls `onEvent` for each new\n\t\t * canonical event as the server pushes it (chain cadence, not poll-bounded),\n\t\t * and verifies each frame's inline ed25519 signature when the client was\n\t\t * created with `verify`. Returns an unsubscribe function whose `done`\n\t\t * settles when the loop ends. Not reorg-aware: an event delivered then\n\t\t * orphaned is never retracted. Durable writers use `consume()`.\n\t\t */\n\t\tsubscribe(params: StreamsEventsSubscribeParams): StreamsSubscription;\n\t};\n\tblocks: {\n\t\tevents(heightOrHash: number | string): Promise<StreamsEventsListEnvelope>;\n\t};\n\treorgs: {\n\t\tlist(params: StreamsReorgsListParams): Promise<StreamsReorgsListEnvelope>;\n\t};\n\t/** Bulk parquet dumps. Requires `dumpsBaseUrl` on the client. */\n\tdumps: StreamsDumps;\n\tcanonical(height: number): Promise<StreamsCanonicalBlock>;\n\ttip(): Promise<StreamsTip>;\n};\n",
|
|
30
30
|
"// Canonical home is @secondlayer/shared/streams-rows (the indexer's decoders\n// use the same helpers); re-exported here so the public SDK surface is\n// unchanged.\nexport {\n\tdecodeClarityValue,\n\ttoJsonSafe,\n} from \"@secondlayer/shared/streams-rows\";\n"
|
|
31
31
|
],
|
|
32
|
-
"mappings": "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",
|
|
33
|
-
"debugId": "
|
|
32
|
+
"mappings": "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",
|
|
33
|
+
"debugId": "17DA719CAEA1958964756E2164756E21",
|
|
34
34
|
"names": []
|
|
35
35
|
}
|