Targets
A target consumes baseline rows and change events for a table. Different targets serve different use cases.
SyncTarget interface
type SyncTarget interface {
OnInit(ctx context.Context, table TableIdentifier, columns []ColumnDefinition) error
OnBaselineRow(ctx context.Context, table TableIdentifier, row Row) error
OnBaselineComplete(ctx context.Context, table TableIdentifier) error
OnInsert(ctx context.Context, table TableIdentifier, columns Row) error
OnUpdate(ctx context.Context, table TableIdentifier, columns Row, identity Row) error
OnDelete(ctx context.Context, table TableIdentifier, identity Row) error
OnTruncate(ctx context.Context, table TableIdentifier) error
IsDurable() bool
OnSchemaChange(ctx context.Context, table TableIdentifier, oldColumns, newColumns []ColumnDefinition) SchemaChangeResponse
ExportSnapshot(ctx context.Context) ([]SnapshotEntry, error)
RestoreSnapshot(ctx context.Context, metadata TableSnapshotInfo, entries []SnapshotEntry) error
OnClose(ctx context.Context, table TableIdentifier) error
}
Available targets
Indexed In-Memory
Schema-agnostic in-memory table replica with configurable secondary indexes. Stores raw rows. Best for general-purpose lookups.
IsDurable(): alwaystrue(memory is the store)- Query API:
Lookup(),LookupAll(),Get(),All(),Count(),Listen()
Compiled In-Memory
Deserializes each row into a strongly-typed domain object via a pluggable compiler function. Best when you need typed data.
- Compiler:
func(Row) (any, error) IsDurable(): alwaystrue
HTTP Sync
Forwards every row change to a downstream HTTP service as batched POST requests. The downstream owns the data; this target is stateless.
- Batches baseline rows and changes (configurable batch size and flush interval)
IsDurable():trueonly after batch flush with 2xx HTTP response
Replication Fan-Out
Multiplexes one source to N downstream gRPC clients. Maintains in-memory state, a bounded change journal, and periodic snapshots. Clients connect and receive a consistent snapshot followed by a live change stream.
IsDurable(): alwaystrue- Conceptually similar to Netflix Hollow
Durability and ACK
The IsDurable() method controls when the engine ACKs the source:
- In-memory targets return
trueimmediately — memory is the store - HTTP sync returns
trueonly after the downstream confirms receipt - The engine ACKs the minimum durable position across all targets sharing a source