import type * as types from './types.js';
import { Encryption } from './messaging/encryption.js';
import { AbstractBroadcastConnection, BroadcastConnection, Handler } from './messaging/abstract-connection.js';
import { MessageTarget } from './messaging/messages.js';
import { MessageTransport } from './transport/transport.js';
export interface RoomHandler {
    onJoin(handler: Handler<[types.Peer]>): void;
    leave(): Promise<void>;
    onLeave(handler: Handler<[types.Peer]>): void;
    onClose(handler: Handler<[]>): void;
    onPermissions(handler: Handler<[types.Permissions]>): void;
    updatePermissions(permissions: types.Permissions): Promise<void>;
}
export interface PeerHandler {
    onJoinRequest(handler: Handler<[types.User], types.JoinResponse | undefined>): void;
    onInfo(handler: Handler<[types.Peer]>): void;
    onInit(handler: Handler<[types.InitData]>): void;
    init(target: MessageTarget, data: types.InitData): Promise<void>;
}
export interface EditorHandler {
    onOpen(handler: Handler<[string]>): void;
    open(target: MessageTarget, path: types.Path): Promise<void>;
    onClose(handler: Handler<[types.Path]>): void;
    close(path: types.Path): Promise<void>;
}
export interface FileSystemHandler {
    onReadFile(handler: Handler<[types.Path], types.FileData>): void;
    readFile(target: MessageTarget, path: types.Path): Promise<types.FileData>;
    onWriteFile(handler: Handler<[types.Path, types.FileData]>): void;
    writeFile(target: MessageTarget, path: types.Path, content: types.FileData): Promise<void>;
    onStat(handler: Handler<[types.Path], types.FileSystemStat>): void;
    stat(target: MessageTarget, path: types.Path): Promise<types.FileSystemStat>;
    onMkdir(handler: Handler<[types.Path]>): void;
    mkdir(target: MessageTarget, path: types.Path): Promise<void>;
    onReaddir(handler: Handler<[types.Path], types.FileSystemDirectory>): void;
    readdir(target: MessageTarget, path: types.Path): Promise<types.FileSystemDirectory>;
    onDelete(handler: Handler<[types.Path]>): void;
    delete(target: MessageTarget, path: types.Path): Promise<void>;
    onRename(handler: Handler<[types.Path, types.Path]>): void;
    rename(target: MessageTarget, from: types.Path, to: types.Path): Promise<void>;
    onChange(handler: Handler<[types.FileChangeEvent]>): void;
    change(event: types.FileChangeEvent): Promise<void>;
}
export interface SyncHandler {
    onDataUpdate(handler: Handler<[types.Binary]>): void;
    dataUpdate(data: types.Binary): Promise<void>;
    dataUpdate(target: MessageTarget, data: types.Binary): Promise<void>;
    onAwarenessUpdate(handler: Handler<[types.Binary]>): void;
    awarenessUpdate(data: types.Binary): Promise<void>;
    awarenessUpdate(target: MessageTarget, data: types.Binary): Promise<void>;
    onAwarenessQuery(handler: Handler<[]>): void;
    awarenessQuery(): Promise<void>;
}
export interface ProtocolBroadcastConnection extends BroadcastConnection {
    room: RoomHandler;
    peer: PeerHandler;
    fs: FileSystemHandler;
    editor: EditorHandler;
    sync: SyncHandler;
}
export interface ProtocolBroadcastConnectionOptions {
    privateKey: string;
    host?: types.Peer;
    transport: MessageTransport;
}
export declare function createConnection(options: ProtocolBroadcastConnectionOptions): ProtocolBroadcastConnection;
export declare class ProtocolBroadcastConnectionImpl extends AbstractBroadcastConnection {
    room: RoomHandler;
    peer: PeerHandler;
    fs: FileSystemHandler;
    editor: EditorHandler;
    sync: SyncHandler;
    private peers;
    constructor(options: ProtocolBroadcastConnectionOptions);
    protected getPublicKey(origin: string): Encryption.AsymmetricKey;
    private onDidJoinRoom;
    private onDidLeaveRoom;
    private onDidClose;
    private onDidInit;
    protected getPublicKeys(): Encryption.AsymmetricKey[];
    protected getPublicKeysLength(): number;
}
//# sourceMappingURL=connection.d.ts.map