@liuxb001/master-tab-coordinator
Version:
MasterTabCoordinator:用于多标签页间通信与协调的TypeScript库
237 lines (236 loc) • 5.52 kB
TypeScript
/**
* 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;