import { WebSocketGroup } from '../types/WebSocketSubscriptions';
import { OrderBookCache } from './OrderBookCache';
export declare class GroupRegistry {
    /**
     * Atomic mutate helper.
     *
     * @param fn - The function to run atomically.
     * @returns The result of the function.
     */
    mutate<T>(fn: (groups: WebSocketGroup[]) => T | Promise<T>): Promise<T>;
    /**
     * Read-only copy of the registry.
     *
     * Only to be used in test suite.
     */
    snapshot(): WebSocketGroup[];
    /**
     * Find the first group with capacity to hold new assets.
     *
     * Returns the groupId if found, otherwise null.
     */
    findGroupWithCapacity(newAssetLen: number, maxPerWS: number): string | null;
    /**
     * Get the indices of all groups that contain the asset.
     *
     * Returns an array of indices.
     */
    getGroupIndicesForAsset(assetId: string): number[];
    /**
     * Check if any group contains the asset.
     */
    hasAsset(assetId: string): boolean;
    /**
     * Find the group by groupId.
     *
     * Returns the group if found, otherwise undefined.
     */
    findGroupById(groupId: string): WebSocketGroup | undefined;
    /**
     * Atomically remove **all** groups from the registry and return them so the
     * caller can perform any asynchronous cleanup (closing sockets, etc.)
     * outside the lock.
     *
     * Returns the removed groups.
     */
    clearAllGroups(): Promise<WebSocketGroup[]>;
    /**
     * Add new asset subscriptions.
     *
     * – Ignores assets that are already subscribed.
     * – Either reuses an existing group with capacity or creates new groups (size ≤ maxPerWS).
     * – If appending to a group:
     *  - A new group is created with the updated assetIds.
     *  - The old group is marked for cleanup.
     *  - The group is added to the list of groups to connect.
     *
     * @param assetIds - The assetIds to add.
     * @param maxPerWS - The maximum number of assets per WebSocket group.
     * @returns An array of *new* groupIds that need websocket connections.
     */
    addAssets(assetIds: string[], maxPerWS: number): Promise<string[]>;
    /**
     * Remove asset subscriptions from every group that contains the asset.
     *
     * It should be only one group that contains the asset, we search all of them
     * regardless.
     *
     * Returns the list of assetIds that were removed.
     */
    removeAssets(assetIds: string[], bookCache: OrderBookCache): Promise<string[]>;
    /**
     * Disconnect a group.
     */
    disconnectGroup(group: WebSocketGroup): void;
    /**
     * Check status of groups and reconnect or cleanup as needed.
     *
     * – Empty groups are removed from the global array and returned.
     * – Dead (but non-empty) groups are reset so that caller can reconnect them.
     * – Pending groups are returned so that caller can connect them.
     *
     * Returns an array of group IDs that need to be reconnected, after cleaning up empty and cleanup-marked groups.
     */
    getGroupsToReconnectAndCleanup(): Promise<string[]>;
}
