import { EntityDict, OpRecord } from 'oak-domain/es/types'; import { EntityDict as BaseEntityDict } from 'oak-domain/es/base-app-domain'; import { Cache } from '../cache'; import { Message } from '../message'; import { Feature } from '../../types/Feature'; import SocketPoint from './socketPoint'; type SubscribeEvent = 'connect' | 'disconnect'; type Callback = (event: string, records: OpRecord[]) => void; /** * WebSocket 订阅管理器 * * 职责: * 1. 管理 WebSocket 连接生命周期(连接、断开、重连) * 2. 管理事件订阅/取消订阅 * 3. 处理服务器推送的数据并同步到缓存 * 4. 提供连接状态事件通知 * * 核心特性: * - 自动重连(指数退避算法) * - 重连后自动恢复订阅 * - 多个订阅调用共享同一个连接 * - 无订阅时自动断开连接 */ export declare class SubScriber extends Feature { private cache; private message; private socketPoint; /** * 事件订阅注册表 * key: 事件名 * value: { callbacks: 回调函数列表, count: 订阅计数 } */ private eventMap; private url?; private path?; private scope?; private socket?; /** 是否被暂停(暂停时不会自动重连) */ private halted; /** 重连定时器 */ private reconnectTimer?; /** 连接失败次数(用于计算退避时间) */ private failureCount; /** 当前连接状态 */ private socketState; /** 当前正在进行的连接 Promise(用于避免重复连接) */ private connectPromise?; /** 任意事件的回调函数映射-全局 */ private eventCallbackMap; /** 指数退避配置 */ private readonly BACKOFF_CONFIG; constructor(cache: Cache, message: Message, socketPoint: SocketPoint); /** * 注册连接/断开事件监听器 */ on(event: SubscribeEvent, callback: (...data: any) => void): () => void; /** * 移除连接/断开事件监听器 */ off(event: SubscribeEvent, callback: () => void): void; /** * 触发连接/断开事件 */ private emit; /** * 初始化 Socket连接点信息(URL和 path) * @throws {OakSocketConnectException} 获取连接信息失败时抛出 */ private initSocketPoint; /** * 计算指数退避延迟时间 * 使用公式: min(initialDelay * (multiplier ^ failureCount), maxDelay) * (1± jitter) */ private calculateBackoffDelay; /** * 设置 Socket 持久监听器 * 这些监听器在整个连接生命周期内保持有效 */ private _setupSocketListeners; /** * 执行实际的连接操作 * @private仅供connect() 调用 */ private _doConnect; /** * 建立 WebSocket 连接 * * 特性: * - 如果已经在连接中,返回现有的连接 Promise(避免重复连接) * - 连接失败会自动重连(指数退避) * - 连接成功后自动订阅所有已注册的事件 */ private connect; /** * 订阅事件 * * @param events 要订阅的事件名列表 * @param callback 可选的回调函数,当事件触发时调用 * @returns 返回取消订阅函数 * * 特性: * - 支持多次订阅同一个事件(引用计数) * - 自动管理连接(有订阅时连接,无订阅时断开) * - 连接过程中的订阅会在连接成功后自动发送 */ sub(events: string[], callback?: Callback): Promise<() => void>; /** * 取消订阅事件 * * @param events 要取消订阅的事件名列表 * @param callback 可选的回调函数,如果提供则只移除该回调 * * 特性: * - 使用引用计数,只有当计数归零时才真正取消订阅 * - 如果所有事件都取消订阅,自动断开连接 */ private unsub; /** * 获取当前 Socket 的唯一标识符 * @returns Socket ID,如果未连接则返回 undefined */ getSubscriberId(): string | undefined; /** * 设置暂停状态 * * @param halted true 表示暂停(不会自动重连),false 表示恢复 * * 特性: * - 暂停时会停止重连尝试 * - 恢复时如果有订阅会自动重连 */ setHalted(halted: boolean): void; /** * 销毁实例,清理所有资源 * * 应在组件卸载时调用,避免内存泄漏 */ destroy(): void; } export {};