export type RoomSchemaShape = {
    [k: string]: {
        presence?: {
            [k: string]: any;
        };
        topics?: {
            [k: string]: {
                [k: string]: any;
            };
        };
    };
};
export type PresenceOpts<PresenceShape, Keys extends keyof PresenceShape> = {
    user?: boolean;
    peers?: string[];
    keys?: Keys[];
    /**
     * If you haven't joined this room yet, initialPresence lets you set
     * the very first presence state for the user.
     */
    initialPresence?: Partial<PresenceShape>;
    /** @deprecated use `initialPresence` */
    initialData?: Partial<PresenceShape>;
};
type PresencePeer<PresenceShape, Keys extends keyof PresenceShape> = Pick<PresenceShape, Keys> & {
    peerId: string;
};
export type PresenceSlice<PresenceShape, Keys extends keyof PresenceShape> = {
    user?: PresencePeer<PresenceShape, Keys>;
    peers: {
        [peerId: string]: PresencePeer<PresenceShape, Keys>;
    };
};
export type PresenceResponse<PresenceShape, Keys extends keyof PresenceShape> = PresenceSlice<PresenceShape, Keys> & {
    isLoading: boolean;
    error?: string;
};
export declare function buildPresenceSlice<PresenceShape, Keys extends keyof PresenceShape>(data: {
    user?: PresenceShape;
    peers: Record<string, PresenceShape>;
}, opts: PresenceOpts<PresenceShape, Keys>, userPeerId: string): PresenceSlice<PresenceShape, Keys>;
/**
 * Compare two presence slices
 * 0. compare isLoading and error
 * 1. shallow compare user
 * 2. compare peers keys
 * 3. shallow compare each peer
 */
export declare function hasPresenceResponseChanged<PresenceShape, Keys extends keyof PresenceShape>(a: PresenceResponse<PresenceShape, Keys>, b: PresenceResponse<PresenceShape, Keys>): boolean;
export {};
//# sourceMappingURL=presence.d.ts.map