import { Pubby } from "../../client";
import { PubbyStream } from "../../lib/streams";
import { PubbyModule } from "../../module";
import { User } from "../../models/user";
import { RoomUpdateResponse, UserLeaveResponse, UserSetResponse } from "../../websocket/incoming";
import { Room } from "../../models/room";
declare module "../../client" {
    interface Pubby {
        room: RoomModule;
    }
}
export interface RoomState {
    room: Room | null;
    users: Map<string, User>;
    usersRoles: Map<string, Set<string>>;
}
export declare class RoomModule extends PubbyModule {
    state$: PubbyStream<RoomState, RoomState>;
    userUpdate$: PubbyStream<UserSetResponse>;
    userLeave$: PubbyStream<UserLeaveResponse>;
    roomUpdate$: PubbyStream<RoomUpdateResponse>;
    get state(): RoomState | {
        room: any;
        users: Map<any, any>;
        usersRoles: Map<any, any>;
    };
    constructor(client: Pubby);
    init(): void;
    join(slug: string, password?: string): Promise<void>;
    on(event: "load", ...cb: ((state: any) => void)[]): this;
    on(event: "user-join", ...cb: ((user: User) => void)[]): this;
    on(event: "user-update", ...cb: ((newUser: User, old: User) => void)[]): this;
    on(event: "user-leave", ...cb: ((user: User) => void)[]): this;
}
