{"version":3,"file":"protocol.a291e075.mjs","sources":["../../src/rpc/config.ts","../../src/rpc/helpers.ts","../../src/rpc/chain-tracker.ts","../../src/rpc/otel.ts","../../src/rpc/data-stream.ts","../../src/rpc/client.ts"],"sourcesContent":["import type { Bytes, Cursor } from \"../common\";\n\nexport type FetchBlockRangeArgs<TFilter> = {\n  startBlock: bigint;\n  maxBlock: bigint;\n  force: boolean;\n  clampAllowed: boolean;\n  filter: TFilter;\n};\n\nexport type FetchBlockRangeResult<TBlock> = {\n  startBlock: bigint;\n  endBlock: bigint;\n  data: FetchBlockResult<TBlock>[];\n};\n\nexport type FetchBlockResult<TBlock> = {\n  block: TBlock | null;\n  cursor: Cursor | undefined;\n  endCursor: Cursor;\n};\n\nexport type BlockInfo = {\n  blockNumber: bigint;\n  blockHash: Bytes;\n  parentBlockHash: Bytes;\n};\n\nexport type FetchBlockByHashArgs<TFilter> = {\n  blockHash: Bytes;\n};\n\nexport type FetchBlockByHashResult<TBlock> = {\n  data: FetchBlockResult<TBlock>;\n  blockInfo: BlockInfo;\n};\n\nexport type FetchCursorRangeArgs = {\n  startBlockNumber: bigint;\n  endBlockNumber: bigint;\n};\n\nexport type FetchCursorArgs =\n  | {\n      blockTag: \"latest\" | \"finalized\";\n      blockNumber?: undefined;\n      blockHash?: undefined;\n    }\n  | {\n      blockTag?: undefined;\n      blockNumber: bigint;\n      blockHash?: undefined;\n    }\n  | {\n      blockTag?: undefined;\n      blockNumber?: undefined;\n      blockHash: Bytes;\n    };\n\nexport type ValidateFilterResult =\n  | {\n      valid: true;\n      error?: undefined;\n    }\n  | {\n      valid: false;\n      error: string;\n    };\n\nexport abstract class RpcStreamConfig<TFilter, TBlock> {\n  abstract headRefreshIntervalMs(): number;\n  abstract finalizedRefreshIntervalMs(): number;\n\n  abstract fetchCursorRange(args: FetchCursorRangeArgs): Promise<BlockInfo[]>;\n  abstract fetchCursor(args: FetchCursorArgs): Promise<BlockInfo | null>;\n\n  abstract validateFilter(filter: TFilter): ValidateFilterResult;\n\n  abstract fetchBlockRange(\n    args: FetchBlockRangeArgs<TFilter>,\n  ): Promise<FetchBlockRangeResult<TBlock>>;\n\n  abstract fetchHeaderByHash(\n    args: FetchBlockByHashArgs<TFilter>,\n  ): Promise<FetchBlockByHashResult<TBlock>>;\n}\n","import type { Cursor } from \"../common\";\nimport type { BlockInfo } from \"./config\";\n\nexport function blockInfoToCursor(blockInfo: BlockInfo): Cursor {\n  return {\n    orderKey: blockInfo.blockNumber,\n    uniqueKey: blockInfo.blockHash,\n  };\n}\n","import { fromHex } from \"viem\";\nimport type { Bytes, Cursor } from \"../common\";\nimport type { BlockInfo, FetchCursorRangeArgs } from \"./config\";\nimport { blockInfoToCursor } from \"./helpers\";\n\ntype UpdateHeadArgs = {\n  newHead: BlockInfo;\n  fetchCursorByHash: (hash: Bytes) => Promise<BlockInfo | null>;\n  fetchCursorRange: (args: FetchCursorRangeArgs) => Promise<BlockInfo[]>;\n};\n\ntype UpdateHeadResult =\n  | {\n      status: \"unchanged\";\n    }\n  | {\n      status: \"success\";\n    }\n  | {\n      status: \"reorg\";\n      cursor: Cursor;\n    };\n\nexport class ChainTracker {\n  #finalized: BlockInfo;\n  #head: BlockInfo;\n  #canonical: Map<bigint, BlockInfo>;\n  #batchSize: bigint;\n\n  constructor({\n    head,\n    finalized,\n    batchSize,\n  }: {\n    finalized: BlockInfo;\n    head: BlockInfo;\n    batchSize: bigint;\n  }) {\n    this.#finalized = finalized;\n    this.#head = head;\n    this.#batchSize = batchSize;\n\n    this.#canonical = new Map([\n      [finalized.blockNumber, finalized],\n      [head.blockNumber, head],\n    ]);\n  }\n\n  head(): Cursor {\n    return blockInfoToCursor(this.#head);\n  }\n\n  finalized(): Cursor {\n    return blockInfoToCursor(this.#finalized);\n  }\n\n  updateFinalized(newFinalized: BlockInfo) {\n    // console.log(\n    //   `[CT] updateFinalized: new=${newFinalized.blockNumber} old=${this.#finalized.blockNumber}`,\n    // );\n\n    if (newFinalized.blockNumber < this.#finalized.blockNumber) {\n      throw new Error(\"Finalized cursor moved backwards\");\n    }\n\n    if (newFinalized.blockNumber === this.#finalized.blockNumber) {\n      if (newFinalized.blockHash !== this.#finalized.blockHash) {\n        throw new Error(\"Received a different finalized cursor\");\n      }\n\n      return false;\n    }\n\n    // Delete all blocks that are now finalized.\n    for (\n      let bn = this.#finalized.blockNumber;\n      bn < newFinalized.blockNumber;\n      bn++\n    ) {\n      this.#canonical.delete(bn);\n    }\n\n    this.#canonical.set(newFinalized.blockNumber, newFinalized);\n    this.#finalized = newFinalized;\n\n    return true;\n  }\n\n  addToCanonicalChain({ blockInfo }: { blockInfo: BlockInfo }) {\n    // console.log(`[CT] addToCanonicalChain: block=${blockInfo.blockNumber}`);\n\n    const existing = this.#canonical.get(blockInfo.blockNumber);\n\n    if (existing) {\n      if (existing.blockHash !== blockInfo.blockHash) {\n        throw new Error(\n          `Block already exists in canonical chain: previous ${existing.blockHash}, new ${blockInfo.blockHash}`,\n        );\n      }\n    }\n\n    const parent = this.#canonical.get(blockInfo.blockNumber - 1n);\n    if (!parent) {\n      throw new Error(\"Parent block not in canonical chain\");\n    }\n\n    if (parent.blockHash !== blockInfo.parentBlockHash) {\n      throw new Error(\"Parent block hash mismatch.\");\n    }\n\n    this.#canonical.set(blockInfo.blockNumber, blockInfo);\n\n    // console.log(\"Canon updated: \", canonical);\n\n    return { status: \"success\" };\n  }\n\n  async updateHead({\n    newHead,\n    fetchCursorByHash,\n    fetchCursorRange,\n  }: UpdateHeadArgs): Promise<UpdateHeadResult> {\n    // console.log(\n    //   `[CT] updateHead: new=${newHead.blockNumber} old=${this.#head.blockNumber}`,\n    // );\n\n    // No changes to the chain.\n    if (\n      newHead.blockNumber === this.#head.blockNumber &&\n      newHead.blockHash === this.#head.blockHash\n    ) {\n      return { status: \"unchanged\" };\n    }\n\n    // Most common case: the new head is the block after the current head.\n    if (\n      newHead.blockNumber === this.#head.blockNumber + 1n &&\n      newHead.parentBlockHash === this.#head.blockHash\n    ) {\n      this.#canonical.set(newHead.blockNumber, newHead);\n      this.#head = newHead;\n      return { status: \"success\" };\n    }\n\n    // The new chain is not longer.\n    if (newHead.blockNumber <= this.#head.blockNumber) {\n      // console.log(\"head=\", this.#head, \"newhead=\", newHead);\n      let currentNewHead = newHead;\n      // Delete all blocks from canonical chain after the new head.\n      for (\n        let bn = newHead.blockNumber + 1n;\n        bn <= this.#head.blockNumber;\n        bn++\n      ) {\n        this.#canonical.delete(bn);\n      }\n\n      // Check if the chain was simply shrunk to this block.\n      const existing = this.#canonical.get(currentNewHead.blockNumber);\n      if (existing && existing.blockHash === currentNewHead.blockHash) {\n        this.#head = existing;\n        return {\n          status: \"reorg\",\n          cursor: blockInfoToCursor(existing),\n        };\n      }\n\n      while (currentNewHead.blockNumber > this.#finalized.blockNumber) {\n        this.#canonical.delete(currentNewHead.blockNumber);\n\n        const canonicalParent = this.#canonical.get(\n          currentNewHead.blockNumber - 1n,\n        );\n\n        if (!canonicalParent) {\n          throw new Error(\n            \"Cannot reconcile new head with canonical chain: missing parent in canonical chain\",\n          );\n        }\n\n        // We found the common ancestor.\n        if (canonicalParent.blockHash === currentNewHead.parentBlockHash) {\n          this.#head = canonicalParent;\n          return {\n            status: \"reorg\",\n            cursor: blockInfoToCursor(canonicalParent),\n          };\n        }\n\n        const parent = await fetchCursorByHash(currentNewHead.parentBlockHash);\n\n        if (!parent) {\n          throw new Error(\n            \"Cannot reconcile new head with canonical chain: failed to fetch parent\",\n          );\n        }\n\n        currentNewHead = parent;\n      }\n\n      throw new Error(\"Cannot reconcile new head with canonical chain.\");\n    }\n\n    // In all other cases we need to \"join\" the new head with the existing chain.\n    // The new chain is longer and we need the missing blocks.\n    // This may result in reorgs.\n\n    // console.log(\n    //   `[CT] moving from ${this.#head.blockNumber} to ${newHead.blockNumber} (${newHead.blockNumber - this.#head.blockNumber} blocks)`,\n    // );\n\n    let currentBlockNumber = this.#head.blockNumber + 1n;\n\n    while (true) {\n      let endBlockNumber = currentBlockNumber + this.#batchSize;\n      if (endBlockNumber > newHead.blockNumber) {\n        endBlockNumber = newHead.blockNumber;\n      }\n\n      const missing = await fetchCursorRange({\n        startBlockNumber: currentBlockNumber,\n        endBlockNumber,\n      });\n\n      for (const block of missing) {\n        const canonicalParent = this.#canonical.get(block.blockNumber - 1n);\n        if (\n          !canonicalParent ||\n          canonicalParent.blockHash !== block.parentBlockHash\n        ) {\n          throw new Error(\n            \"Chain reorganization detected. Recovery not implemented\",\n          );\n        }\n\n        this.#canonical.set(block.blockNumber, block);\n      }\n\n      if (endBlockNumber === newHead.blockNumber) {\n        break;\n      }\n\n      currentBlockNumber = endBlockNumber + 1n;\n    }\n\n    this.#head = newHead;\n\n    return { status: \"success\" };\n  }\n\n  isCanonical({ orderKey, uniqueKey }: Cursor) {\n    if (!uniqueKey) {\n      return true;\n    }\n\n    const block = this.#canonical.get(orderKey);\n    if (!block) {\n      return true;\n    }\n\n    return block.blockHash === uniqueKey;\n  }\n\n  async initializeStartingCursor({\n    cursor,\n    fetchCursor,\n  }: {\n    cursor: Cursor;\n    fetchCursor: (blockNumber: bigint) => Promise<BlockInfo | null>;\n  }): Promise<\n    | { canonical: true; reason?: undefined; fullCursor: Cursor }\n    | { canonical: false; reason: string; fullCursor?: undefined }\n  > {\n    const head = this.head();\n    const finalized = this.finalized();\n\n    if (cursor.orderKey > head.orderKey) {\n      return { canonical: false, reason: \"cursor is ahead of head\" };\n    }\n\n    const expectedInfo = await fetchCursor(cursor.orderKey);\n    if (!cursor.uniqueKey) {\n      if (expectedInfo === null) {\n        throw new Error(\"Failed to initialize canonical cursor\");\n      }\n\n      if (expectedInfo.blockNumber > finalized.orderKey) {\n        this.#canonical.set(expectedInfo.blockNumber, expectedInfo);\n      }\n\n      return { canonical: true, fullCursor: blockInfoToCursor(expectedInfo) };\n    }\n\n    if (expectedInfo === null) {\n      return {\n        canonical: false,\n        reason: \"expected block does not exist\",\n      };\n    }\n\n    const expectedCursor = blockInfoToCursor(expectedInfo);\n\n    // These two checks are redundant, but they are kept to avoid issues with bad config implementations.\n    if (!expectedCursor.uniqueKey) {\n      return {\n        canonical: false,\n        reason: \"expected cursor has no unique key (hash)\",\n      };\n    }\n\n    if (expectedCursor.orderKey !== cursor.orderKey) {\n      return {\n        canonical: false,\n        reason: \"cursor order key does not match expected order key\",\n      };\n    }\n\n    if (\n      fromHex(expectedCursor.uniqueKey, \"bigint\") !==\n      fromHex(cursor.uniqueKey, \"bigint\")\n    ) {\n      return {\n        canonical: false,\n        reason: `cursor hash does not match expected hash: ${cursor.uniqueKey} !== ${expectedCursor.uniqueKey}`,\n      };\n    }\n\n    if (expectedInfo.blockNumber > finalized.orderKey) {\n      this.#canonical.set(expectedInfo.blockNumber, expectedInfo);\n    }\n\n    return { canonical: true, fullCursor: expectedCursor };\n  }\n}\n\nexport function createChainTracker({\n  head,\n  finalized,\n  batchSize,\n}: {\n  head: BlockInfo;\n  finalized: BlockInfo;\n  batchSize: bigint;\n}): ChainTracker {\n  return new ChainTracker({ finalized, head, batchSize });\n}\n","import { trace } from \"@opentelemetry/api\";\n\nexport function createTracer() {\n  return trace.getTracer(\"@apibara/protocol\");\n}\n","import type { StreamDataOptions } from \"../client\";\nimport type { Cursor } from \"../common\";\nimport type { StreamDataRequest, StreamDataResponse } from \"../stream\";\nimport { type ChainTracker, createChainTracker } from \"./chain-tracker\";\nimport type { RpcStreamConfig } from \"./config\";\nimport { blockInfoToCursor } from \"./helpers\";\nimport { createTracer } from \"./otel\";\n\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;\n\nconst tracer = createTracer();\n\ntype State<TFilter, TBlock> = {\n  // The network-specific config.\n  config: RpcStreamConfig<TFilter, TBlock>;\n  // The current cursor, that is the last block that was filtered.\n  cursor: Cursor;\n  // When the finalized block was last refreshed.\n  lastFinalizedRefresh: number;\n  // When the head was last refreshed.\n  lastHeadRefresh: number;\n  // When the last heartbeat was sent.\n  lastHeartbeat: number;\n  // When the last backfill message was sent.\n  lastBackfillMessage: number;\n  // The last empty header sent.\n  lastEmptyBlockNumber: bigint | undefined;\n  // Track the chain's state.\n  chainTracker: ChainTracker;\n  // Heartbeat interval in milliseconds.\n  heartbeatIntervalMs: number;\n  // The request filter.\n  filter: TFilter;\n  // The request options.\n  options?: StreamDataOptions;\n};\n\nexport class RpcDataStream<TFilter, TBlock> {\n  private heartbeatIntervalMs: number;\n\n  constructor(\n    private config: RpcStreamConfig<TFilter, TBlock>,\n    private request: StreamDataRequest<TFilter>,\n    private options?: StreamDataOptions,\n  ) {\n    this.heartbeatIntervalMs = request.heartbeatInterval\n      ? Number(request.heartbeatInterval.seconds) * 1000\n      : DEFAULT_HEARTBEAT_INTERVAL_MS;\n  }\n\n  async *[Symbol.asyncIterator](): AsyncIterator<StreamDataResponse<TBlock>> {\n    const startingState = await this.initialize();\n    yield* dataStreamLoop(startingState);\n  }\n\n  private async initialize(): Promise<State<TFilter, TBlock>> {\n    if (this.request.filter.length === 0) {\n      throw new Error(\"Request.filter: empty.\");\n    }\n\n    if (this.request.filter.length > 1) {\n      throw new Error(\"Request.filter: only one filter is supported.\");\n    }\n\n    const [head, finalized] = await Promise.all([\n      this.config.fetchCursor({ blockTag: \"latest\" }),\n      this.config.fetchCursor({ blockTag: \"finalized\" }),\n    ]);\n\n    if (finalized === null) {\n      throw new Error(\"EvmRpcStream requires a finalized block\");\n    }\n\n    if (head === null) {\n      throw new Error(\"EvmRpcStream requires a chain with blocks.\");\n    }\n\n    const chainTracker = createChainTracker({\n      head,\n      finalized,\n      batchSize: 20n,\n    });\n\n    let cursor: Cursor;\n    if (this.request.startingCursor) {\n      cursor = this.request.startingCursor;\n\n      const { canonical, reason, fullCursor } =\n        await chainTracker.initializeStartingCursor({\n          cursor,\n          fetchCursor: (blockNumber) =>\n            this.config.fetchCursor({ blockNumber }),\n        });\n\n      if (!canonical) {\n        throw new Error(`Starting cursor is not canonical: ${reason}`);\n      }\n\n      cursor = fullCursor;\n    } else {\n      cursor = { orderKey: -1n };\n    }\n\n    return {\n      cursor,\n      lastHeartbeat: Date.now(),\n      lastFinalizedRefresh: Date.now(),\n      lastHeadRefresh: Date.now(),\n      lastBackfillMessage: Date.now(),\n      lastEmptyBlockNumber: undefined,\n      chainTracker,\n      config: this.config,\n      heartbeatIntervalMs: this.heartbeatIntervalMs,\n      filter: this.request.filter[0],\n      options: this.options,\n    };\n  }\n}\n\nasync function* dataStreamLoop<TFilter, TBlock>(\n  state: State<TFilter, TBlock>,\n): AsyncGenerator<StreamDataResponse<TBlock>> {\n  while (shouldContinue(state)) {\n    const messages = await tracer.startActiveSpan(\n      \"data-stream.loop\",\n      async (span) => {\n        try {\n          const { cursor, chainTracker } = state;\n\n          const attributes: Record<string, string | number | boolean> = {\n            cursor: cursor.orderKey.toString(),\n            head: chainTracker.head().orderKey.toString(),\n            finalized: chainTracker.finalized().orderKey.toString(),\n            actionSendHeartbeat: false,\n            actionRefreshFinalized: false,\n            actionBackfillFinalized: false,\n            actionWaitForHeadChange: false,\n            actionProduceLiveBlocks: false,\n          };\n\n          const messages: StreamDataResponse<TBlock>[] = [];\n\n          if (shouldSendHeartbeat(state)) {\n            state.lastHeartbeat = Date.now();\n            attributes.actionSendHeartbeat = true;\n            messages.push({ _tag: \"heartbeat\" });\n          }\n\n          if (shouldRefreshFinalized(state)) {\n            attributes.actionRefreshFinalized = true;\n            const finalizedInfo = await state.config.fetchCursor({\n              blockTag: \"finalized\",\n            });\n\n            if (finalizedInfo === null) {\n              throw new Error(\"Failed to fetch finalized cursor\");\n            }\n\n            const finalized = blockInfoToCursor(finalizedInfo);\n            const finalizedChanged =\n              state.chainTracker.updateFinalized(finalizedInfo);\n\n            if (\n              finalizedChanged &&\n              state.cursor.orderKey > finalized.orderKey\n            ) {\n              messages.push({\n                _tag: \"finalize\",\n                finalize: { cursor: finalized },\n              });\n            }\n\n            state.lastFinalizedRefresh = Date.now();\n          }\n\n          const finalized = chainTracker.finalized();\n\n          if (cursor.orderKey < finalized.orderKey) {\n            attributes.actionBackfillFinalized = true;\n            for await (const msg of backfillFinalizedBlocks(state)) {\n              messages.push(msg);\n            }\n          } else {\n            if (isAtHead(state)) {\n              attributes.actionWaitForHeadChange = true;\n              for await (const msg of waitForHeadChange(state)) {\n                messages.push(msg);\n              }\n            } else {\n              attributes.actionProduceLiveBlocks = true;\n              for await (const msg of produceLiveBlocks(state)) {\n                messages.push(msg);\n              }\n            }\n          }\n\n          span.setAttributes(attributes);\n\n          return messages;\n        } catch (error) {\n          span.recordException(error as Error);\n          throw error;\n        } finally {\n          span.end();\n        }\n      },\n    );\n\n    for (const message of messages) {\n      yield message;\n    }\n  }\n}\n\nasync function* backfillFinalizedBlocks<TFilter, TBlock>(\n  state: State<TFilter, TBlock>,\n): AsyncGenerator<StreamDataResponse<TBlock>> {\n  const { cursor, chainTracker, config, filter } = state;\n  const finalized = chainTracker.finalized();\n\n  // While backfilling we want to regularly send some blocks (even if empty) so\n  // that the client can store the cursor.\n  const force = shouldForceBackfill(state);\n\n  const filterData = await config.fetchBlockRange({\n    startBlock: cursor.orderKey + 1n,\n    maxBlock: finalized.orderKey,\n    force,\n    clampAllowed: true,\n    filter,\n  });\n\n  if (filterData.endBlock > finalized.orderKey) {\n    throw new Error(\n      \"Network-specific stream returned invalid data, crossing the finalized block.\",\n    );\n  }\n\n  for (const data of filterData.data) {\n    state.lastHeartbeat = Date.now();\n    state.lastBackfillMessage = Date.now();\n    yield {\n      _tag: \"data\",\n      data: {\n        cursor: data.cursor,\n        endCursor: data.endCursor,\n        data: [data.block],\n        finality: \"finalized\",\n        production: \"backfill\",\n      },\n    };\n  }\n\n  // Notice that we check that filteredData.endBlock <= finalized.orderKey above.\n  if (filterData.endBlock === finalized.orderKey) {\n    // Prepare for transition to non-finalized data.\n    state.cursor = finalized;\n  } else {\n    state.cursor = { orderKey: filterData.endBlock };\n  }\n}\n\n// This is a generator to possibly produce data for live blocks.\n//\n// It's a generator because it's not guaranteed to produce data for the next block.\nasync function* produceLiveBlocks<TFilter, TBlock>(\n  state: State<TFilter, TBlock>,\n): AsyncGenerator<StreamDataResponse<TBlock>> {\n  const { config, cursor, chainTracker, filter } = state;\n\n  if (shouldRefreshHead(state)) {\n    const maybeNewHead = await config.fetchCursor({ blockTag: \"latest\" });\n    if (maybeNewHead === null) {\n      throw new Error(\"Failed to fetch the latest block\");\n    }\n\n    const result = await chainTracker.updateHead({\n      newHead: maybeNewHead,\n      fetchCursorByHash: (blockHash) => config.fetchCursor({ blockHash }),\n      fetchCursorRange: (args) => config.fetchCursorRange(args),\n    });\n\n    state.lastHeadRefresh = Date.now();\n\n    if (result.status === \"reorg\") {\n      const { cursor } = result;\n      // Only handle reorgs if they involve blocks already processed.\n      if (shouldInvalidateProcessedLiveData(state, cursor)) {\n        state.cursor = cursor;\n        state.lastEmptyBlockNumber = undefined;\n\n        yield {\n          _tag: \"invalidate\",\n          invalidate: { cursor },\n        };\n\n        return;\n      }\n    }\n  }\n\n  const head = chainTracker.head();\n\n  const filterData = await config.fetchBlockRange({\n    startBlock: cursor.orderKey + 1n,\n    maxBlock: head.orderKey,\n    force: false,\n    clampAllowed: false,\n    filter,\n  });\n\n  if (filterData.data.length === 0 && head.uniqueKey !== undefined) {\n    // Send an empty block if we reached the head, but don't update the cursor.\n    if (\n      state.lastEmptyBlockNumber === undefined ||\n      head.orderKey > state.lastEmptyBlockNumber\n    ) {\n      const { data } = await config.fetchHeaderByHash({\n        blockHash: head.uniqueKey,\n      });\n\n      yield {\n        _tag: \"data\",\n        data: {\n          cursor: data.cursor,\n          endCursor: data.endCursor,\n          data: [data.block],\n          finality: \"accepted\",\n          production: \"live\",\n        },\n      };\n\n      state.lastEmptyBlockNumber = head.orderKey;\n    }\n  }\n\n  for (const { cursor, endCursor, block } of filterData.data) {\n    if (!chainTracker.isCanonical(endCursor)) {\n      throw new Error(\"Trying to process non-canonical block\");\n    }\n\n    if (block !== null) {\n      state.lastHeartbeat = Date.now();\n      const production = isAtHead(state) ? \"live\" : \"backfill\";\n\n      yield {\n        _tag: \"data\",\n        data: {\n          cursor,\n          endCursor,\n          data: [block],\n          finality: \"accepted\",\n          production,\n        },\n      };\n    }\n\n    state.cursor = {\n      orderKey: endCursor.orderKey,\n      uniqueKey: endCursor.uniqueKey,\n    };\n  }\n}\n\nasync function* waitForHeadChange<TBlock>(\n  state: State<unknown, TBlock>,\n): AsyncGenerator<StreamDataResponse<TBlock>> {\n  const { chainTracker, config } = state;\n\n  const heartbeatDeadline = state.lastHeartbeat + state.heartbeatIntervalMs;\n  const finalizedRefreshDeadline =\n    state.lastFinalizedRefresh + config.finalizedRefreshIntervalMs();\n\n  while (true) {\n    const now = Date.now();\n    // Allow the outer loop to send the heartbeat message or refresh finalized blocks.\n    if (now >= heartbeatDeadline || now >= finalizedRefreshDeadline) {\n      return;\n    }\n\n    const maybeNewHead = await config.fetchCursor({ blockTag: \"latest\" });\n\n    if (maybeNewHead === null) {\n      throw new Error(\"Failed to fetch the latest block\");\n    }\n\n    const result = await chainTracker.updateHead({\n      newHead: maybeNewHead,\n      fetchCursorByHash: (blockHash) => config.fetchCursor({ blockHash }),\n      fetchCursorRange: (args) => config.fetchCursorRange(args),\n    });\n\n    switch (result.status) {\n      case \"unchanged\": {\n        const heartbeatTimeout = heartbeatDeadline - now;\n        const finalizedTimeout = finalizedRefreshDeadline - now;\n\n        // Wait until whatever happens next.\n        await sleep(\n          Math.min(\n            heartbeatTimeout,\n            finalizedTimeout,\n            config.headRefreshIntervalMs(),\n          ),\n        );\n\n        break;\n      }\n      case \"reorg\": {\n        const { cursor } = result;\n        // Only handle reorgs if they involve blocks already processed.\n        if (shouldInvalidateProcessedLiveData(state, cursor)) {\n          state.cursor = cursor;\n          state.lastEmptyBlockNumber = undefined;\n\n          yield {\n            _tag: \"invalidate\",\n            invalidate: { cursor },\n          };\n        }\n\n        break;\n      }\n      case \"success\": {\n        // Chain grew without any issues. Go back to the top-level loop to produce data.\n        return;\n      }\n    }\n  }\n}\n\nfunction shouldSendHeartbeat(state: State<unknown, unknown>): boolean {\n  const { heartbeatIntervalMs, lastHeartbeat } = state;\n  const now = Date.now();\n  return now - lastHeartbeat >= heartbeatIntervalMs;\n}\n\nfunction shouldForceBackfill(state: State<unknown, unknown>): boolean {\n  const { lastBackfillMessage, heartbeatIntervalMs } = state;\n  const now = Date.now();\n  return now - lastBackfillMessage >= heartbeatIntervalMs;\n}\n\nfunction shouldContinue(state: State<unknown, unknown>): boolean {\n  const { endingCursor } = state.options || {};\n  if (endingCursor === undefined) return true;\n\n  return state.cursor.orderKey < endingCursor.orderKey;\n}\n\nfunction shouldRefreshFinalized(state: State<unknown, unknown>): boolean {\n  const { lastFinalizedRefresh, config } = state;\n  const now = Date.now();\n  return now - lastFinalizedRefresh >= config.finalizedRefreshIntervalMs();\n}\n\nfunction shouldRefreshHead(state: State<unknown, unknown>): boolean {\n  const { lastHeadRefresh, config } = state;\n  const now = Date.now();\n  return now - lastHeadRefresh >= config.headRefreshIntervalMs();\n}\n\nfunction isAtHead(state: State<unknown, unknown>): boolean {\n  const head = state.chainTracker.head();\n  return (\n    state.cursor.orderKey === head.orderKey ||\n    state.lastEmptyBlockNumber === head.orderKey\n  );\n}\n\nfunction shouldInvalidateProcessedLiveData(\n  state: State<unknown, unknown>,\n  cursor: Cursor,\n): boolean {\n  return (\n    cursor.orderKey < state.cursor.orderKey ||\n    (state.lastEmptyBlockNumber !== undefined &&\n      cursor.orderKey < state.lastEmptyBlockNumber)\n  );\n}\n\nfunction lastProcessedLiveBlock(state: State<unknown, unknown>): bigint {\n  if (\n    state.lastEmptyBlockNumber !== undefined &&\n    state.lastEmptyBlockNumber > state.cursor.orderKey\n  ) {\n    return state.lastEmptyBlockNumber;\n  }\n\n  return state.cursor.orderKey;\n}\n\nfunction sleep(duration: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, duration));\n}\n","import type { Client, ClientCallOptions, StreamDataOptions } from \"../client\";\nimport type { Cursor } from \"../common\";\nimport type { StatusRequest, StatusResponse } from \"../status\";\nimport type { StreamDataRequest, StreamDataResponse } from \"../stream\";\nimport type { RpcStreamConfig } from \"./config\";\nimport { RpcDataStream } from \"./data-stream\";\nimport { blockInfoToCursor } from \"./helpers\";\n\nexport class RpcClient<TFilter, TBlock> implements Client<TFilter, TBlock> {\n  constructor(private config: RpcStreamConfig<TFilter, TBlock>) {}\n\n  async status(\n    _request?: StatusRequest,\n    _options?: ClientCallOptions,\n  ): Promise<StatusResponse> {\n    const [currentHead, finalized] = await Promise.all([\n      this.config.fetchCursor({ blockTag: \"latest\" }),\n      this.config.fetchCursor({ blockTag: \"finalized\" }),\n    ]);\n\n    const starting: Cursor = { orderKey: 0n };\n\n    return {\n      currentHead: currentHead ? blockInfoToCursor(currentHead) : undefined,\n      lastIngested: currentHead ? blockInfoToCursor(currentHead) : undefined,\n      finalized: finalized ? blockInfoToCursor(finalized) : undefined,\n      starting,\n    };\n  }\n\n  streamData(\n    request: StreamDataRequest<TFilter>,\n    options?: StreamDataOptions,\n  ): AsyncIterable<StreamDataResponse<TBlock>> {\n    const index = 0;\n    for (const filter of request.filter) {\n      const { valid, error } = this.config.validateFilter(filter);\n      if (!valid) {\n        throw new Error(`Filter at position ${index} is invalid: ${error}`);\n      }\n    }\n\n    return new RpcDataStream(this.config, request, options);\n  }\n}\n\nexport function createRpcClient<TFilter, TBlock>(\n  config: RpcStreamConfig<TFilter, TBlock>,\n): RpcClient<TFilter, TBlock> {\n  return new RpcClient(config);\n}\n"],"names":["messages","finalized","cursor"],"mappings":"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"}