resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
75 lines (74 loc) • 2.51 kB
TypeScript
/**
* Real-time Sync System
* Uses CRDT.merge() via BroadcastChannel with commutative monoid operations
*/
import { Signal } from '../core/signal';
import { CRDT } from '../crdt';
export interface SyncMessage<T = any> {
type: 'operation' | 'state' | 'heartbeat' | 'join' | 'leave';
nodeId: string;
timestamp: number;
data: T;
operationId: string;
vectorClock: Record<string, number>;
}
export interface SyncConfig {
channelName: string;
nodeId: string;
heartbeatInterval?: number;
conflictResolution?: 'lww' | 'vector-clock' | 'custom';
customResolver?: <T>(local: T, remote: T, context: SyncContext) => T;
}
export interface SyncContext {
localTimestamp: number;
remoteTimestamp: number;
localNodeId: string;
remoteNodeId: string;
operationType: string;
}
export interface ConnectionState {
isConnected: boolean;
connectedNodes: Set<string>;
lastHeartbeat: number;
messageQueue: SyncMessage[];
syncErrors: Error[];
}
export declare class RealtimeSync {
private config;
private channel;
private nodeId;
private vectorClock;
private connectionState;
private crdts;
private operationLog;
private heartbeatTimer;
constructor(config: SyncConfig);
private setupChannel;
private handleMessage;
private handleOperation;
private handleStateSync;
private handleHeartbeat;
private handleNodeJoin;
private handleNodeLeave;
private mergeVectorClock;
private incrementVectorClock;
private sendMessage;
private generateOperationId;
private startHeartbeat;
private announceJoin;
private sendStateToNode;
private requestStateSync;
private handleSyncError;
private notifySubscribers;
registerCRDT<T>(id: string, crdt: CRDT<T>): void;
unregisterCRDT(id: string): void;
getCRDT<T>(id: string): CRDT<T> | undefined;
getConnectionState(): Signal<ConnectionState>;
getOperationLog(): Signal<SyncMessage[]>;
forcSync(): void;
disconnect(): void;
}
export declare const createSyncedCounter: (sync: RealtimeSync, id: string, nodeId: string, _initialValue?: number) => Signal<number>;
export declare const createSyncedSet: <T>(sync: RealtimeSync, id: string, nodeId: string, initialItems?: T[]) => Signal<Set<T>>;
export declare const createSyncedRegister: <T>(sync: RealtimeSync, id: string, nodeId: string, initialValue: T) => Signal<T>;
export declare const createRealtimeSync: (config: SyncConfig) => RealtimeSync;