UNPKG

imsdk-server-core

Version:

轻量级Web服务器框架、WebSocket服务器框架。采用Typescript编写,简单易用。

282 lines (281 loc) 8.76 kB
/// <reference types="node" /> import WebSocket from 'ws'; import https from 'https'; import http from 'http'; import { WssUIDLike, WssSession } from './WssSession'; import { WssBridge, WssBridgePackData, WssBridgeResponse } from '../client/AllExport'; import type { Logger } from 'log4js'; import type { EnvContext } from './EnvContext'; export interface WssServerConfig { pwd?: string; secret?: string; binary?: boolean; cycle?: number; timeout?: number; reqIdCache?: number; } export interface ServerCyclerListener { (server: WssServer, totalSocket: number, totalSession: number): void; } export interface SessionCloseListener { (server: WssServer, session: WssSession, code: number, reason: string): void; } export interface RouterListener { (server: WssServer, session: WssSession, pack: WssBridgePackData): void; } export interface RemoteListener { (server: WssServer, session: WssSession, pack: WssBridgePackData): void; } export interface PushChannelCustomCallback { (uid: WssUIDLike, message: any): any; } export interface ClusterDispatchCallback { (cluster: ClusterNode[], tid: WssUIDLike, innerData: InnerData): number; } export interface ClusterNode { grp: string; url: string; rmc: WssBridge; } export interface GroupChannel { count: number; sessions: { [key: string]: WssSession; }; } export interface InnerData { tid?: WssUIDLike; route?: string; message?: any; word?: string; sign?: any; } export declare class WssServer { private _context; private _config; private _logger; private _wsscfg; private _wssapp; private _server; private _routerMap; private _remoteMap; private _socketMap; private _sessionMap; private _channelMap; private _clusterMap; private _totalSocket; private _totalSession; private _cycleTicker; private _serverCyclerListener; private _sessionCloseListener; /** * @param context 上下文包装类实例 * @param category 日志分类 * @param config 配置信息 * @param wsscfg 库ws配置信息,参考依赖库 https://github.com/websockets/ws * * 本类将过滤掉wsscfg.host参数和wsscfg.port参数,请通过context来传入 */ constructor(context: EnvContext, category: string, config?: WssServerConfig, wsscfg?: WebSocket.ServerOptions); /** * 初始化集群 */ initClusters(): void; /** * 设置周期监听器 * @param serverCyclerListener * @param sessionCloseListener */ setListeners(serverCyclerListener: ServerCyclerListener, sessionCloseListener: SessionCloseListener): void; /** * 设置路由监听器 * @param route * @param listener */ setRouter(route: string, listener: RouterListener): void; /** * 设置远程监听器 * @param route * @param listener */ setRemote(route: string, listener: RemoteListener): void; /** * 绑定uid到session * @param session * @param uid * @param closeold */ bindUid(session: WssSession, uid: WssUIDLike, closeold?: boolean): void; /** * 解绑session的uid * @param session */ unbindUid(session: WssSession): void; /** * 根据uid从本节点获取session * @param uid */ getSession(uid: WssUIDLike): WssSession; /** * 加入本节点的某个消息推送组 * @param session * @param gid */ joinChannel(session: WssSession, gid: WssUIDLike): void; /** * 退出本节点的某个消息推送组 * @param session * @param gid */ quitChannel(session: WssSession, gid: WssUIDLike): void; /** * 删除本节点的某个消息推送组 * @param gid */ deleteChannel(gid: WssUIDLike): void; /** * 响应本节点的某个session的请求 * @param session * @param reqPack * @param message */ response(session: WssSession, reqPack: WssBridgePackData, message: WssBridgeResponse): void; /** * 推送消息到本节点的某个session * @param uid * @param route * @param message */ pushSession(uid: WssUIDLike, route: string, message: any): void; /** * 推送消息到本节点的某批session * @param uids * @param route * @param message */ pushSessionBatch(uids: WssUIDLike[], route: string, message: any): void; /** * 推送消息到本节点的某个消息推送组 * @param gid * @param route * @param message */ pushChannel(gid: WssUIDLike, route: string, message: any): void; /** * 推送消息到本节点的某个消息推送组,每个成员的数据都进过差异处理 * @param gid * @param route * @param message * @param customCallback 在这个函数中对每个成员的数据进行差异处理 */ pushChannelCustom(gid: WssUIDLike, route: string, message: any, customCallback: PushChannelCustomCallback): void; /** * 推送消息到本节点的已经绑定过uid的全部session * @param route * @param message */ broadcast(route: string, message: any): void; /** * 推送消息到某个节点的某个session,建议通过dispatchCallback来优化推送性能 * @param appName 节点分组名 * @param uid * @param route * @param message * @param dispatchCallback 分配节点,如果未指定该函数,则从该节点分组的全部节点中搜索对应uid的session */ pushClusterSession(appName: string, uid: WssUIDLike, route: string, message: any, dispatchCallback?: ClusterDispatchCallback): void; /** * 推送消息到某个节点的某个消息推送组,建议通过dispatchCallback来优化推送性能 * @param appName 节点分组名 * @param gid * @param route * @param message * @param dispatchCallback 分配节点,如果未指定该函数,则从该节点分组的全部节点中搜索对应gid的channel */ pushClusterChannel(appName: string, gid: WssUIDLike, route: string, message: any, dispatchCallback?: ClusterDispatchCallback): void; /** * 推送消息到某个节点的已经绑定过uid的全部session * @param appName 节点分组名 * @param route * @param message * @param dispatchCallback 分配节点,如果未指定该函数,将推送到该节点分组的全部节点 */ clusterBroadcast(appName: string, route: string, message: any, dispatchCallback?: ClusterDispatchCallback): void; /** * 节点间远程路由异步调用 * @param appName 节点分组名 * @param route * @param message * @param dispatchCallback 分配节点,如果未指定该函数,则从该节点分组的全部节点中随机选择一个节点 */ callRemote(appName: string, route: string, message: any, dispatchCallback?: ClusterDispatchCallback): void; /** * 节点间远程路由异步调用,并返回结果 * @param appName 节点分组名 * @param route * @param message * @param dispatchCallback 分配节点,如果未指定该函数,则从该节点分组的全部节点中随机选择一个节点 */ callRemoteForResult(appName: string, route: string, message: any, dispatchCallback?: ClusterDispatchCallback): Promise<WssBridgeResponse>; /** * 开启服务器 * @param callback 服务器启动后的回调函数 */ start(callback?: () => void): void; /** * 关闭服务器 * @param callback */ close(callback?: (error?: Error) => void): void; /** * 周期循环 */ private _onServerLifeCycle; /** * 收到连接后注册监听 * @param socket * @param request */ private _onWebSocketConnection; /** * * @param session * @param data */ private _onWebSocketMessage; /** * 返回发送数据到客户端websocket的选项 */ private _getSendOptions; /** * 响应心跳包 * @param session * @param reqPack */ private _sendHeartick; /** * 连接到集群节点 * @param node */ private _connectForCluster; /** * 生成内部签名数据包 * @param tid * @param route * @param message */ private _generateInnerData; /** * 校验内部签名数据包 * @param data */ private _validateInnerData; /** * 返回Logger实例 */ get logger(): Logger; get wssapp(): WebSocket.Server; get server(): http.Server | https.Server; get wssPwd(): string; get wssSecret(): string; }