import { RpcSocket } from './socket.js';
import type { ConnectionID, RpcMetadata } from './types/payload.js';
import type { RpcObject } from './types/utils.js';
declare const kOnClose: unique symbol;
declare const kMetadata: unique symbol;
declare const kReplaceSocket: unique symbol;
/** 认证过的 socket */
type WebSocketWithMetadata = WebSocket & {
    [kMetadata]: RpcMetadata;
};
/**
 * 客户端认证方法
 * @param metadata 客户端传入的认证元数据
 * @returns 服务端返回客户端的认证元数据
 * @throws 认证失败时抛出异常
 */
type RpcClientAuthenticator = (metadata: RpcMetadata) => RpcMetadata | Promise<RpcMetadata>;
/** 由 WS Server 建立的 RPC 连接组 */
export declare class RpcServer<TRemote extends object, TLocal extends object> {
    /** 客户端认证方法 */
    readonly authenticator: RpcClientAuthenticator;
    constructor(
    /** 服务端 RPC 实现 */
    local?: RpcObject<TLocal> | ((socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>), 
    /** 客户端认证方法 */
    authenticator?: RpcClientAuthenticator);
    /** 用于响应调用的本地对象 */
    readonly local?: (socket: RpcServerSocket<TRemote, TLocal>) => RpcObject<TLocal>;
    /** 已建立连接的客户端 */
    protected readonly _sockets: Map<ConnectionID, RpcServerSocket<TRemote, TLocal>>;
    /** 已建立连接的客户端 */
    get sockets(): ReadonlyMap<ConnectionID, RpcServerSocket<TRemote, TLocal>>;
    /** WebSocket 连接后调用此方法建立 RPC 连接 */
    connect(socket: WebSocket): Promise<RpcServerSocket<TRemote, TLocal>>;
    /** 认证客户端 */
    protected authSocket(socket: WebSocket, tempId: string): Promise<[ConnectionID, RpcMetadata]>;
    private readonly disconnectingSockets;
    /** WebSocket 断开时调用 */
    [kOnClose](socket: RpcServerSocket<TRemote, TLocal>): void;
}
/** 由 WS Server 建立的 RPC 连接 */
export declare class RpcServerSocket<TRemote extends object, TLocal extends object> extends RpcSocket<TRemote, TLocal> {
    readonly server: RpcServer<TRemote, TLocal>;
    constructor(id: ConnectionID, server: RpcServer<TRemote, TLocal>);
    /** @inheritdoc */
    protected authSocket(): Promise<RpcMetadata>;
    /** @inheritdoc */
    protected get local(): RpcObject<TLocal> | undefined;
    /** @inheritdoc */
    protected onClose(ev: CloseEvent): void;
    /** 替换 socket */
    [kReplaceSocket](newSocket: WebSocketWithMetadata): Promise<void>;
}
export {};
//# sourceMappingURL=server.d.ts.map