Skip to Content
🚀 KalamDB v0.3.0-alpha2 is out — Learn more
SDK & ClientRealtime Subscriptions

Realtime Subscriptions

kalam-link supports realtime subscriptions via WebSocket.

Table subscription (sugar API)

const unsub = await client.subscribe('app.messages', (event) => { console.log(event.type); });

In source, this is sugar for:

client.subscribeWithSql(`SELECT * FROM ${tableName}`, callback, options)

SQL subscription

const unsub = await client.subscribeWithSql( 'SELECT * FROM app.messages WHERE conversation_id = $1', (event) => { if (event.type === 'change') { console.log(event.change_type, event.rows); } }, { batch_size: 100, last_rows: 50 } );

Event model

Use runtime enums from types.ts:

import { MessageType, ChangeType } from 'kalam-link';

Event sequence commonly observed:

  1. subscription_ack
  2. one or more initial_data_batch
  3. change events (insert|update|delete)
  4. optional error

Subscription options

{ batch_size?: number; last_rows?: number; from_seq_id?: string; }

Use from_seq_id for resume patterns after reconnect.

Unsubscribe patterns

const unsub = await client.subscribe('app.messages', cb); await unsub(); await client.unsubscribe('<subscription-id>'); await client.unsubscribeAll();

Subscription introspection

client.getSubscriptionCount(); client.getSubscriptions(); client.isSubscribedTo('SELECT * FROM app.messages'); client.getLastSeqId('<subscription-id>');

getLastSeqId() is useful for checkpointing consumption progress.

Error handling guidance

  • Parse event.type === MessageType.Error and inspect code/message.
  • Keep callbacks resilient (non-throwing) to avoid app-level disruption.
  • For mission-critical streams, persist last sequence IDs and re-subscribe with from_seq_id.
Last updated on