Skip to content
rhttp.io

Realtime API

All realtime types are exported from the rhttp.io/socket.io.client entry point.

Factory functions

import {
  createRealtimeClient,
  initializeSocketClient,
  getSocketClient,
  socket,
} from "rhttp.io/socket.io.client"; 
FunctionDescription
createRealtimeClient(c)Creates a new RealtimeClient instance.
initializeSocketClient(c)Creates (or returns existing) singleton.
getSocketClient()Returns the singleton or null.
socketObject with .instance, .create(), .connect(), .disconnect(), .destroy().

RealtimeClientConfig

interface RealtimeClientConfig {
  socketUrl: string;
  withCredentials?: boolean;
  extraHeaders?: Record<string, string>;
  auth?: {
    token?: string;
    scheme?: string;
    getToken?: () => Promise<string | null>;
    authFactory?: () => Promise<Record<string, any>>;
  };
  csrf?: {
    enabled: boolean;
    fetchEndpoint: string;
    headerName?: string;    // default: "X-CSRF-Token"
    cookieName?: string;    // default: "csrf-token"
    fetchOptions?: RequestInit;
  };
  rooms?: {
    autoRejoin?: boolean;
    autoJoin?: string[];
  };
  offlineQueue?: {
    enabled: boolean;
    maxSize?: number;       // default: 100
    storageKey?: string;    // default: "rhttp.io/realtime:offline-queue"
  };
  reconnection?: boolean;            // default: true
  reconnectionDelay?: number;        // default: 1000 ms
  reconnectionDelayMax?: number;     // default: 5000 ms
  reconnectionAttempts?: number;     // default: Infinity
  transports?: string[];             // default: ["websocket", "polling"]
  socketOptions?: Record<string, any>;
  logger?: boolean | any;
  eventValidator?: (event: string, data: any, direction: "emit" | "receive") => boolean | Promise<boolean>;
  eventTransformer?: (event: string, data: any, direction: "emit" | "receive") => any | Promise<any>;
  hooks?: {
    onConnect?: () => void | Promise<void>;
    onDisconnect?: (reason: string) => void | Promise<void>;
    onError?: (error: any) => void | Promise<void>;
  };
}

RealtimeClientInstance

The full client interface returned by createRealtimeClient().

Connection

isConnected: boolean;
isConnecting: boolean;
isReconnecting: boolean;
connect(): Promise<void>;     // idempotent, 10s timeout
disconnect(): void;
destroy(): void;              // disconnect + clear all state

Events

emit(event: string, data?: any, callback?: (response: any) => void): void;
emitWithAck(event: string, data?: any, timeout?: number): Promise<any>;
on(event: string, handler: (data: any) => void): () => void;       // returns unsubscribe
off(event: string, handler?: (data: any) => void): void;
once(event: string, handler: (data: any) => void): () => void;    // returns unsubscribe

Rooms

joinRoom(room: string): Promise<void>;
leaveRoom(room: string): Promise<void>;
getRooms(): string[];
isInRoom(room: string): boolean;

Offline queue

getQueueLength(): number;
clearQueue(): void;
flushQueue(): Promise<void>;

State & metrics

onStateChange(handler: (state: ConnectionState) => void): () => void;
getMetrics(): RealtimeMetrics;

RealtimeMetrics

interface RealtimeMetrics {
  totalEventsEmitted: number;
  totalEventsReceived: number;
  reconnectAttempts: number;
  queuedMessages: number;
  uptime: number;
  averageLatency: number;
  connectionStartTime: number | null;
}

ConnectionState

interface ConnectionState {
  connected: boolean;
  connecting: boolean;
  reconnecting: boolean;
}

OfflineMessage

interface OfflineMessage {
  id: string;
  event: string;
  data: any;
  timestamp: number;
  room?: string;
}

React hooks

All hooks are imported from rhttp.io/socket.io.client and require a <RealtimeProvider> ancestor.

import {
  RealtimeProvider,
  useRealtimeClient,
  useConnectionState,
  useSocketEvent,
  useSocketEventOnce,
  useSocketEvents,
  useRoomEvent,
  useSocketEmit,
  useSocketEmitWithAck,
  useRoomManagement,
  useOfflineQueue,
  useConnectionMetrics,
  useSocketConnection,
} from "rhttp.io/socket.io.client"; 

Hook signatures

HookReturns
useRealtimeClient()RealtimeClientInstance — throws if no provider
useConnectionState(){ connected: boolean; connecting: boolean; reconnecting: boolean }
useSocketEvent(event, handler)void — subscribes, auto-cleans on unmount
useSocketEventOnce(event, handler)void — one-shot listener, auto-cleans
useSocketEvents(events)voidevents: Record<string, handler>
useRoomEvent(room, event, handler)void — joins room on mount, listens, leaves on unmount
useSocketEmit()(event: string, data?: any, callback?: (res: any) => void) => void
useSocketEmitWithAck()(event: string, data?: any, timeout?: number) => Promise<any>
useRoomManagement(){ joinRoom, leaveRoom, getRooms, isInRoom }
useOfflineQueue(){ getQueueLength, clearQueue, flushQueue }
useConnectionMetrics()RealtimeMetrics
useSocketConnection(){ connected, connecting, reconnecting, connect, disconnect }

RealtimeProvider props

<RealtimeProvider
  client={RealtimeClientInstance}    // required
  autoConnect?: boolean              // default: true
  prefetchCsrf?: boolean             // default: true
  onConnected?: () => void
  onDisconnected?: (reason: string) => void
  onError?: (error: Error) => void
>
  {children}
</RealtimeProvider>

Realtime errors

import {
  RealtimeError,
  ConnectionError,
  RoomError,
  TimeoutError as RealtimeTimeoutError,
} from "rhttp.io/socket.io.client"; 
ClassCodeThrown when
RealtimeErrorBase error for the realtime module
ConnectionErrorCONNECTION_ERRORConnection timeout or failure
RoomErrorROOM_ERRORServer rejects a room join
RealtimeTimeoutErrorTIMEOUT_ERRORemitWithAck exceeds timeout