import { BroadcastChange, Change, ClientBroadcastChangeData, GeneralQueuedBroadcastChange, QueuedBroadcastChange, Removal, ServerCreation, Subscription, Syncable } from 'syncable';
import { Server, Socket, Visibility } from './server';
export declare abstract class SyncableDefinition<TSyncable extends Syncable, TSubscription extends Subscription, TSession, TClientSession, TServer extends Server<TSession, TClientSession>> {
    readonly server: TServer;
    /** Override to customize. */
    pruneBroadcastChange(change: QueuedBroadcastChange): BroadcastChange;
    /** Override to customize. */
    testVisibility(_object: TSyncable, _subscription: TSubscription, _socket: Socket<TClientSession>): Visibility;
    /** Override to customize. */
    loadSnapshotsUponRequest(_resources: string[], _subscription: TSubscription, _socket: Socket<TClientSession>): Promise<TSyncable[]>;
    abstract onChange(change: GeneralQueuedBroadcastChange, changeSession: TSession, subscription: TSubscription, socket: Socket<TClientSession>): boolean;
    abstract loadSnapshots(subscription: TSubscription, socket: Socket<TClientSession>): Promise<TSyncable[]>;
    abstract loadChanges(subscription: TSubscription, socket: Socket<TClientSession>): Promise<ClientBroadcastChangeData<BroadcastChange, TClientSession>[]>;
    abstract create(change: ServerCreation, timestamp: number, session: TSession): Promise<TSyncable>;
    abstract update(change: Change, timestamp: number, session: TSession): Promise<TSyncable>;
    abstract remove(change: Removal, timestamp: number, session: TSession): Promise<void>;
}
