import type { ConnectConfig, ConnectConfigSettingParams } from './interface/manager'; import type { SessionDataInfo, SessionInterface, SessionMessageModel, SessionSendModel } from './interface/session'; import type { CreateSessionProps } from './interface/socket-session-manager'; import { type TaskConfig, type TaskMessageModel } from './interface/task'; export interface CreateSessionResult { session: SessionInterface; retryCount?: number; openSessionTime?: number; confirmSessionTime?: number; } /** * 用于管理 Socket 和 Session 的关系 * 两者的关系应该是多对多的关系,一个 Socket 可以有多个 Session * 多个 Socket 也可以有同一个 Session。(因为会存在 Socket 断链,需要重新链接的情况 */ export default class SocketSessionManager { /** * 管理 socket 的实例,在一个 web 当中应该仅维护一个。 * * @private * @type {Socket} * @memberof SocketSessionManager */ private _socket; /** * 管理 session 的实例,key 为 session id * * @private * @type {Record} * @memberof SocketSessionManager */ private _sessionMap; /** * 用于所有的参数配置 * * @private * @type {ConnectConfigSettingParams} * @memberof SocketSessionManager */ private _config?; /** * 是否展示 debug 信息 * * @private * @type {boolean} * @memberof SocketSessionManager */ private _showDebug; private _unSavedCallback; /** * 正在创建 session */ private creatingSessionList; /** * config 配置信息,这里使用 getter 是因为只读,防止被外部修改 * * @readonly * @type {ConnectConfig} * @memberof SocketSessionManager */ get config(): ConnectConfig; /** * 还存在的 session 信息 * * @readonly * @type {SessionDataInfo[]} * @memberof SocketSessionManager */ get sessionDetailList(): Record; constructor(data: { config?: ConnectConfigSettingParams; showDebug: boolean; }); /** * 对外暴露,用于重置SSM实例的时候清除管理的socket和session * @returns */ destructor(): void; /** * 对外暴露,根据当前session信息查询历史消息 * @returns createSession() 返回的 session 基本信息 */ fetchHistoryMessage(data: CreateSessionProps): Promise; /** * 对外暴露,用于创建 Session * @returns createSession() 返回的 session 基本信息 */ createSession(data: CreateSessionProps): Promise; createTask(config: Omit, 'urlConfig'>): void; /** * * @param sessionId sessionId * @returns */ startReceiveMsg(sessionId: string): Promise; /** * 对外暴露,用于关闭 session,现在 session 不是一次性的,所以没有关闭的必要了。 * @param sessionId * @returns */ closeSession(sessionId: string): void; /** * 发送消息 * @param data 发送的消息,以及往某个特定地方发送的 sessionId * @returns */ sendMessage(data: { sessionId: string; msg: SessionSendModel; }): Promise; /** * 获得当前 session 某条消息之前的历史记录 * @param sessionId sessionId * @param cursorMessageId message 的游标Id,一般是最近收到的一条消息,如果没有,那么获取 session 完整的信息 */ fetchSessionHistory(sessionId: string, seqId?: string): Promise; /** * * @param session 拉取 task 历史记录的 sessionId * @param seqId 对应的 seqId * @returns */ fetchTaskHistory(session: string, seqId?: string): Promise; /** * 用于创建 session * @param mindId 心识 Id * @param mindType 心识类型 * @param mode 模式 * @param callback session 消息回调 * @returns */ private _createSession; /** * 创建session类实例 */ private _createPrivateSession; /** * socket 开启的回调处理,主要是断线重连后对已有session的处理 */ private _socketOpenCallback; /** * socket 关闭的回调处理,主要是断线时对已有session的处理 */ private _socketCloseCallback; /** * socket 异常关闭的回调处理,包括错误信息逻辑 */ private _socketErrorCallback; private getSessionModelWithMindInfo; private getSessionWithSessionId; private getTaskWithSessionId; private hasSessionId; /** * 日志信息 * @param type log 类型 * @param message log 信息 * @param optionalParams log 信息 */ private _log; }