import type { CompressionAlgorithm } from './messaging/messages.js';
export type Path = string;
export type Token = string;
export type Id = string;
export type Binary = Uint8Array;
export interface CreateRoomResponse {
    roomId: Id;
    roomToken: Token;
    loginToken?: Token;
}
export declare namespace CreateRoomResponse {
    function is(arg: unknown): arg is CreateRoomResponse;
    function create(roomId: Id, roomToken: Token, loginToken?: Token): CreateRoomResponse;
}
export interface LoginValidateResponse {
    valid: boolean;
}
export declare namespace LoginValidateResponse {
    function is(arg: unknown): arg is LoginValidateResponse;
    function create(valid: boolean): LoginValidateResponse;
}
export interface LoginInitialResponse {
    pollToken: string;
    auth: AuthMetadata;
}
export declare namespace LoginInitialResponse {
    function is(arg: unknown): arg is LoginInitialResponse;
    function create(pollToken: string, auth: AuthMetadata): LoginInitialResponse;
}
export interface AuthMetadata {
    providers: AuthProvider[];
    loginPageUrl?: string;
    defaultSuccessUrl?: string;
}
export type AuthProvider = FormAuthProvider | WebAuthProvider;
export interface CommonAuthProvider {
    name: string;
    group: InfoMessage;
    label: InfoMessage;
    details?: InfoMessage;
}
export interface FormAuthProvider extends CommonAuthProvider {
    type: 'form';
    endpoint: string;
    fields: FormAuthProviderField[];
}
export interface FormAuthProviderField {
    name: string;
    required: boolean;
    label: InfoMessage;
    placeHolder?: InfoMessage;
}
export interface WebAuthProvider extends CommonAuthProvider {
    type: 'web';
    endpoint: string;
}
export interface LoginPollResponse {
    loginToken?: string;
}
export declare namespace LoginPollResponse {
    function is(arg: unknown): arg is LoginPollResponse;
    function create(loginToken?: string): LoginPollResponse;
}
export interface JoinRoomInitialResponse {
    pollToken: string;
    roomId: string;
}
export declare namespace JoinRoomInitialResponse {
    function is(arg: unknown): arg is JoinRoomInitialResponse;
    function create(pollToken: string, roomId: string): JoinRoomInitialResponse;
}
export interface JoinRoomResponse {
    roomId: Id;
    roomToken: Token;
    loginToken?: Token;
    workspace: Workspace;
    host: Peer;
}
export declare namespace JoinRoomResponse {
    function is(arg: unknown): arg is JoinRoomResponse;
    function create(roomId: Id, roomToken: Token, workspace: Workspace, host: Peer): JoinRoomResponse;
}
export interface JoinRoomPollResponse extends InfoMessage {
    failure: boolean;
}
export declare namespace JoinRoomPollResponse {
    function is(arg: unknown): arg is JoinRoomPollResponse;
    function create(code: string, params: string[], message: string, failure: boolean): JoinRoomPollResponse;
}
export interface ProtocolServerMetaData {
    owner: string;
    version: string;
    transports: string[];
}
export interface InfoMessage {
    code: string;
    params: string[];
    message: string;
}
export declare namespace InfoMessage {
    function is(arg: unknown): arg is InfoMessage;
    function create(code: string, params: string[], message: string): InfoMessage;
}
export interface User {
    name: string;
    email?: string;
    authProvider?: string;
}
export interface JoinResponse {
    workspace: Workspace;
}
export interface Peer {
    id: Id;
    host: boolean;
    name: string;
    email?: string;
    metadata: PeerMetaData;
}
export interface PeerMetaData {
    encryption: EncryptionMetaData;
    compression: CompressionMetaData;
}
export interface EncryptionMetaData {
    publicKey: string;
}
export interface CompressionMetaData {
    supported: CompressionAlgorithm[];
}
export interface InitRequest {
    protocol: string;
}
export interface InitData {
    protocol: string;
    host: Peer;
    guests: Peer[];
    permissions: Permissions;
    capabilities: Capabilities;
    workspace: Workspace;
}
export interface Workspace {
    name: string;
    folders: string[];
}
export interface Capabilities {
}
export interface Room {
    id: string;
    host: Peer;
    guests: Peer[];
    permissions: Permissions;
}
export interface Permissions {
    readonly: boolean;
    [key: string]: string | boolean;
}
export interface FileSystemStat {
    type: FileType;
    mtime: number;
    ctime: number;
    size: number;
    permissions?: FilePermission;
}
export interface FileSystemDirectory {
    [name: string]: FileType;
}
export interface FileData {
    content: Binary;
}
export declare enum FilePermission {
    /**
     * File is readonly.
     */
    Readonly = 1
}
export declare enum FileType {
    Unknown = 0,
    File = 1,
    Directory = 2,
    SymbolicLink = 64
}
export interface FileChangeEvent {
    changes: FileChange[];
}
export interface FileChange {
    type: FileChangeEventType;
    path: Path;
}
export declare enum FileChangeEventType {
    Create = 0,
    Update = 1,
    Delete = 2
}
export interface ClientAwareness {
    /**
     * The peer id of the client.
     */
    peer: string;
    /**
     * The client's current editor selection.
     */
    selection?: ClientSelection;
}
export interface ClientSelection {
    path: Path;
}
export interface ClientTextSelection extends ClientSelection {
    visibleRanges?: Range[];
    textSelections: RelativeTextSelection[];
}
export declare namespace ClientTextSelection {
    function is(selection?: ClientSelection): selection is ClientTextSelection;
}
export declare namespace SelectionDirection {
    const LeftToRight = 1;
    const RightToLeft = 2;
}
export interface ClientId {
    client: number;
    clock: number;
}
export interface RelativeTextSelection {
    start: RelativeTextPosition;
    end: RelativeTextPosition;
    direction: SelectionDirection;
}
export interface RelativeTextPosition {
    type: ClientId | null;
    tname: string | null;
    item: ClientId | null;
    assoc: number;
}
export interface Position {
    line: number;
    character: number;
}
export declare namespace Position {
    function is(arg: any): arg is Position;
    function create(line: number, character: number): Position;
}
export interface Range {
    start: Position;
    end: Position;
}
export declare namespace Range {
    function is(arg: any): arg is Range;
    function create(start: Position, end: Position): Range;
}
export type SelectionDirection = 1 | 2;
//# sourceMappingURL=types.d.ts.map