UNPKG

@liuxb001/master-tab-coordinator

Version:

MasterTabCoordinator:用于多标签页间通信与协调的TypeScript库

237 lines (236 loc) 5.52 kB
/** * MasterTabCoordinator - 主从标签管理类,在多标签环境中,选出一个主标签 * * 支持功能: * - 检测标签页打开/关闭/隐藏/显示 * - 主从标签页选举(基于页面活动时间) * - 单实例应用模式 * - 标签页间消息传递 * - 状态同步 * - 心跳停止(当长时间无其他标签页活动时) */ export declare class MasterTabCoordinator { private static instance; private channelName; private channel; private tabId; private isClosing; private isMaster; private isHidden; private isInitialized; private masterTabId; private lastActiveTime; private lastHeartbeatReceived; private heartbeatInterval; private _isHeartbeatStopped; private heartbeatMode; private otherTabsDetected; private heartbeatStopTimeout; private firstHeartbeatAfterRestore; private knownTabsCache; private cleanupTimeout; private masterElectionTimeout; private options; private static readonly DEFAULT_OPTIONS; /** * 获取 TabManager 实例(单例模式) */ static getInstance(options?: Partial<TabManagerOptions>): MasterTabCoordinator; /** * 私有构造函数,防止直接创建实例 */ private constructor(); /** * 设置活动追踪 */ private setupActivityTracking; /** * 更新活动时间 */ private updateActivityTime; /** * 更新选项 */ updateOptions(options: Partial<TabManagerOptions>): void; private eventHandlers; /** * 添加事件监听器 */ on<K extends keyof TabManagerEvents>(event: K, handler: TabManagerEvents[K]): this; /** * 移除事件监听器 */ off<K extends keyof TabManagerEvents>(event: K, handler: TabManagerEvents[K]): this; /** * 触发事件 */ private emit; /** * 添加或更新标签页信息 */ private setTabInfo; /** * 删除标签页信息 */ private deleteTabInfo; /** * 更新心跳调度 * 根据当前状态设置心跳频率 */ private updateHeartbeatSchedule; /** * 停止心跳发送 */ private stopHeartbeat; /** * 恢复心跳发送 */ private restoreHeartbeat; /** * 收到其他标签页消息时的处理 * 这是恢复心跳的唯一途径 */ private handleExternalMessage; /** * 初始化 MasterTabCoordinator */ initialize(): this; /** * 重新初始化 (例如当通道名称改变时) */ private reinitialize; /** * 销毁 TabManager */ destroy(): void; /** * 生成唯一的标签页 ID */ private generateTabId; /** * 日志记录 */ private log; /** * 发送消息 */ private sendMessage; /** * 发送心跳 */ private sendHeartbeat; /** * 发送关闭消息 */ private sendCloseMessage; /** * 清理过期标签页 */ private cleanupStaleTabs; /** * 执行主标签页选举 */ private electMaster; /** * 处理重复标签页 */ private handleDuplicate; /** * 处理状态同步请求 */ private handleStateSyncRequest; /** * 请求状态同步 */ requestStateSync(): void; /** * 处理页面可见性变化 */ private handleVisibilityChange; /** * 处理页面卸载 */ private handleBeforeUnload; /** * 处理接收到的消息 */ private handleMessage; /** * 发送自定义消息到所有标签页 * 即使心跳已停止,也会发送此消息 */ broadcast(data: any): void; /** * 获取当前是否为主标签页 */ isMasterTab(): boolean; /** * 获取当前标签页是否隐藏 */ isTabHidden(): boolean; /** * 获取当前标签页 ID */ getTabId(): string; /** * 获取主标签页 ID */ getMasterTabId(): string | null; /** * 获取已知标签页数量 */ getTabCount(): number; /** * 获取所有已知标签页 */ getKnownTabs(): Map<string, { lastSeen: number; isHidden?: boolean; lastActive?: number; }>; /** * 获取当前心跳模式 */ getHeartbeatMode(): "active" | "stopped"; /** * 手动更新活动时间 * 可在用户重要交互时调用 */ updateLastActiveTime(): void; /** * 获取心跳是否已停止 */ isHeartbeatStopped(): boolean; /** * 设置要同步的应用状态 */ setState(state: any): void; /** * 获取当前应用状态 */ getState(): any; } interface TabManagerOptions { channelName: string; debug: boolean; allowMultipleTabs: boolean; heartbeatIntervalMs: number; heartbeatStopThresholdMs: number; initialDetectionTimeMs: number; tabTimeoutMs: number; redirectUrl: string; redirectDelay: number; state?: any; } interface TabManagerEvents { master: () => void; slave: () => void; tabOpened: (tabId: string, data: any) => void; tabClosed: (tabId: string) => void; tabHidden: (tabId: string) => void; tabVisible: (tabId: string) => void; message: (message: any, tabId: string) => void; duplicate: () => void; stateReceived: (state: any) => void; } export default MasterTabCoordinator;