Chatpack
Client

Client realtime

Durable message reconciliation and ephemeral event subscriptions.

const unsubscribe = chatClient.realtime.subscribe((event) => {
  if (event.type === "message.created") console.log(event.message.body);
});

chatClient.realtime.connect();
unsubscribe();

realtime owns one lazy EventSource. Native browser reconnect behavior sends Last-Event-ID; the client does not implement a second cursor protocol. Durable messages are reconciled by id and sequence and remain newest-first. message.created, message.updated, and message.deleted update the cache.

Ephemeral events such as typing and presence are delivered to subscribers and plugins, but are never inserted into message history. Stream status is idle, connecting, open, or closed, with a typed network error when a connection fails.

There is no polling fallback, WebSocket transport, token-in-query behavior, or persistent browser storage in the first client release.