Skip to content

Live Provider

LiveProvider enables real-time data updates through WebSocket or Server-Sent Events.

interface LiveProvider {
subscribe(params: { resource: string; callback: (event: LiveEvent) => void }): () => void;
unsubscribe?(params: { resource: string }): void;
publish?(event: LiveEvent): void;
}
interface LiveEvent {
type: 'INSERT' | 'UPDATE' | 'DELETE';
resource: string;
payload: Record<string, unknown>;
}
import { createWebSocketLiveProvider } from '@svadmin/core';
const liveProvider = createWebSocketLiveProvider({ url: 'ws://localhost:3001' });
import { createSSELiveProvider } from '@svadmin/core';
const liveProvider = createSSELiveProvider({ url: 'http://localhost:3001/events' });
import { createSupabaseLiveProvider } from '@svadmin/supabase';
const liveProvider = createSupabaseLiveProvider(supabaseClient);

Supports publish() via Supabase Realtime broadcast channels.

import { createAppwriteLiveProvider } from '@svadmin/appwrite';
const liveProvider = createAppwriteLiveProvider({ client, databaseId: 'main' });
import { createPocketBaseLiveProvider } from '@svadmin/pocketbase';
const liveProvider = createPocketBaseLiveProvider({ pb });

PocketBase uses SSE-based realtime subscriptions.

useLive(liveProvider, 'posts', {
liveMode: 'auto', // 'auto' | 'manual' | 'off'
onLiveEvent: (event) => {}, // optional callback
});

useSubscription — Manual channel subscription

Section titled “useSubscription — Manual channel subscription”
useSubscription({
resource: 'notifications',
liveProvider,
onLiveEvent: (event) => console.log(event),
});
const publish = usePublish(liveProvider);
publish({ type: 'UPDATE', resource: 'posts', payload: { id: 1 } });
ModeBehavior
autoAutomatically invalidates queries on events (default)
manualCalls onLiveEvent but doesn’t invalidate — you decide
offNo subscription