Skip to main content

createTarget

Create a data sink.
createTarget(config: TargetConfig): Target
Parameters:
  • write: Write function async ({ctx, read}) => void (required)
  • fork: Fork handler async (previousBlocks: BlockCursor[]) => BlockCursor | null (optional)
Example:
const target = createTarget({
  write: async ({ logger, read }) => {
    for await (const { data } of read()) {
      await database.save(data);
    }
  },
  onRollback: async ({ cursor }) => {
    await database.deleteAfter(cursor.number);
  },
});

clickhouseTarget

ClickHouse target with automatic cursor management.
clickhouseTarget(config: ClickhouseTargetConfig): Target
Parameters:
  • client: ClickHouse client instance (required)
  • settings: Configuration options (optional)
  • onStart: Initialization handler async ({store, logger}) => void (optional)
  • onData: Data handler async ({store, data, ctx}) => void (required)
  • onRollback: Rollback handler async ({store, safeCursor, type}) => void (optional)
Example:
const target = clickhouseTarget({
  client,
  onData: async ({store, data}) => {
    store.insert({
      table: 'swaps',
      values: data.swap.map(s => ({
        slot_number: s.blockNumber,
        transaction_hash: s.transaction.signatures[0],
        program_id: s.programId,
      })),
      format: 'JSONEachRow'
    })
  },
  onRollback: async ({store, safeCursor}) => {
    await store.removeAllRows({
      tables: ['swaps'],
      where: `slot_number > ${safeCursor.number}`
    })
  }
})

Next Steps