imsdk-server-core
Version:
轻量级Web服务器框架、WebSocket服务器框架。采用Typescript编写,简单易用。
282 lines (281 loc) • 8.76 kB
TypeScript
/// <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;
}