/**
 * 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;
