Revolutionary "Zero-API" architecture for real-time state synchronization. Change a value on the server, and the UI updates instantly across all clients.
No REST endpoints needed. Just set a value on the server, UI updates instantly.
Changes propagate to all connected clients via WebSocket in milliseconds.
Optionally persist signal values to database for recovery after restart.
Signals sync across all server instances via Redis pub/sub.
CanxJS uses Redis Pub/Sub to sync signals across the cluster. Set cluster: true and you're done.
Use useSignal() to create a reactive variable. Configure sync options based on your needs.
1import { useSignal } from 'canxjs';23// Define a signal with options4const onlineUsers = useSignal('stats:online', 0, {5syncToClient: true, // Broadcast to all connected frontends6persistence: true, // Persist to database7cluster: true // Sync across all server instances8});910// Update value from anywhere in your code11async function userConnected() {12await onlineUsers.set(onlineUsers.value + 1);13// Automatically syncs to Redis cluster + all WebSocket clients14}1516async function userDisconnected() {17await onlineUsers.set(onlineUsers.value - 1);18}
Import from canxjs/client and use the same useSignal() hook. It auto-subscribes via WebSocket.
1// Client-side code (React/Next.js)2import { useSignal } from 'canxjs/client';34export function StatsWidget() {5// Auto-subscribes via WebSocket6const users = useSignal('stats:online');78return (9<div className="stats-card">10<span className="count">{users}</span>11<span className="label">Online Users</span>12</div>13);14}1516// Multiple signals17export function Dashboard() {18const online = useSignal('stats:online');19const orders = useSignal('stats:orders_today');20const revenue = useSignal('stats:revenue');2122return (23<div className="dashboard">24<Stat label="Online" value={online} />25<Stat label="Orders" value={orders} />26<Stat label="Revenue" value={`$${revenue}`} />27</div>28);29}
Signals support complex data, computed values, and auto-refresh intervals.
1// Signals with complex data2const cartSignal = useSignal('cart:user-123', { items: [], total: 0 });34// Update nested data5await cartSignal.set({6...cartSignal.value,7items: [...cartSignal.value.items, newItem],8total: cartSignal.value.total + newItem.price9});1011// Signal with computed values12const statsSignal = useSignal('dashboard:stats', null, {13compute: async () => ({14users: await User.count(),15orders: await Order.countToday(),16revenue: await Order.sumRevenue()17}),18refreshInterval: 5000 // Recompute every 5 seconds19});
| Option | Type | Description |
|---|---|---|
| syncToClient | boolean | Broadcast changes to WebSocket clients |
| persistence | boolean | Persist to database |
| cluster | boolean | Sync across server instances via Redis |
| compute | function | Compute value from async function |
| refreshInterval | number | Auto-recompute interval (ms) |