moonbridge-ts 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.d.ts.map +1 -1
- package/dist/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.js +0 -3
- package/dist/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.js.map +1 -1
- package/dist/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.mjs +0 -3
- package/dist/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.mjs.map +1 -1
- package/dist/moonbridge-ipc/general/transport/websocket/websocket_client.d.ts.map +1 -1
- package/dist/moonbridge-ipc/general/transport/websocket/websocket_client.js +3 -0
- package/dist/moonbridge-ipc/general/transport/websocket/websocket_client.js.map +1 -1
- package/dist/moonbridge-ipc/general/transport/websocket/websocket_client.mjs +3 -0
- package/dist/moonbridge-ipc/general/transport/websocket/websocket_client.mjs.map +1 -1
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.js +2 -2
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.js.map +1 -1
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.mjs +2 -2
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.mjs.map +1 -1
- package/package.json +2 -2
- package/src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts +0 -4
- package/src/moonbridge-ipc/general/transport/websocket/websocket_client.ts +3 -0
- package/src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc_connection_manager.d.ts","sourceRoot":"","sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAG3F,OAAO,EAA0B,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAQ/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEnF;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,qBAAqB,CAA0D;IACvF,OAAO,CAAC,yBAAyB,CAAC,CAA4B;gBAElD,iBAAiB,EAAE,0BAA0B;IAsBzD,UAAU,IAAI,IAAI;IAIlB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAKtD,OAAO,CACX,QAAQ,CAAC,EAAE,8BAA8B,EACzC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAgDV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,WAAW,IAAI,OAAO;IAItB,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,uBAAuB,EACjC,UAAU,EAAE,OAAO,GAClB,IAAI;IAgBP,sBAAsB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAmB/D,IAAI,uBAAuB,IAAI,eAAe,CAE7C;IAID,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,WAAW;IAOnB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAIjC;;;OAGG;YACW,gBAAgB;
|
|
1
|
+
{"version":3,"file":"ipc_connection_manager.d.ts","sourceRoot":"","sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAG3F,OAAO,EAA0B,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAQ/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEnF;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,qBAAqB,CAA0D;IACvF,OAAO,CAAC,yBAAyB,CAAC,CAA4B;gBAElD,iBAAiB,EAAE,0BAA0B;IAsBzD,UAAU,IAAI,IAAI;IAIlB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAKtD,OAAO,CACX,QAAQ,CAAC,EAAE,8BAA8B,EACzC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAgDV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,WAAW,IAAI,OAAO;IAItB,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,uBAAuB,EACjC,UAAU,EAAE,OAAO,GAClB,IAAI;IAgBP,sBAAsB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAmB/D,IAAI,uBAAuB,IAAI,eAAe,CAE7C;IAID,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,WAAW;IAOnB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAIjC;;;OAGG;YACW,gBAAgB;IAyD9B;;OAEG;YACW,0BAA0B;YA+B1B,iBAAiB;IAiE/B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,2BAA2B;IAuBnC,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,sBAAsB;CAO/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":["WebSocketClient","logger","PlatformAppLauncherFactory","IpcError","IpcSessionSetupResponse","Handshake","sendHandshake","MessageType","IpcMessageDecoder","IpcSessionSetupRequest","setupSession"],"mappings":"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","file":"ipc_connection_manager.js","sourcesContent":["// 对应:\n// moonbridge-ipc-flutter/lib/client/internal/ipc/connect/ipc_connection_manager.dart\n//\n// IPC 连接管理器,负责维护 IPC 通信的连接状态。\n// 012 US1:JS 端仅使用 webSocketServerEndpoint 构造 WebSocket 客户端,不使用 socketServerEndpoint。\n// 010 US1:握手在 performHandshake 内等待服务端 TYPE_NAME_HANDSHAKE 响应并校验 magic/role,与 Flutter 一致。\n// 010 US4:当直接连接失败且 shouldAttemptWakeUp 为 true 时,调用 settings.appLauncher.launchApp() 后重试。\n// 019:连接探测——唤醒后立即尝试连接,失败则短间隔重试,成功即停止;launchApp 返回 AppLaunchResult。\n\nimport { IpcClientComponentProvider } from '../ipc_client_component_provider';\nimport { IpcClientSettings } from '../../settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../../../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler } from '../../../types/ipc_types';\nimport { TransportClient } from '../../../../general/transport/interface/transport_client';\nimport { PortCandidateRule } from '../../../../general/config/port_candidate_rule';\nimport { Handshake } from '../../../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../../../general/message/session_setup';\nimport { Request } from '../../../../general/message/request';\nimport { IpcError } from '../../../../general/error/ipc_error';\nimport { MessageType } from '../../../../general/message/constants/message_types';\nimport { IpcMessageDecoder } from '../../../../general/encode/ipc_message_decoder';\nimport { PlatformAppLauncherFactory } from '../../../../general/app_launch/platform_app_launcher';\nimport { logger } from '../../../../utils/logger';\nimport { sendHandshake, setupSession, } from '../../../../general/transport/interface/transport_client_extension';\nimport { WebSocketClient } from '../../../../general/transport/websocket/websocket_client';\n\n/** \n * IPC 通信环境构建结果回调\n */\nexport type IpcSessionSetupCallback = (success: boolean, error?: IpcError) => void;\n\n/**\n * IPC 连接管理器,负责维护 IPC 通信的连接状态\n */\nexport class IpcConnectionManager {\n private readonly settings: IpcClientSettings;\n private readonly componentProvider: IpcClientComponentProvider;\n private readonly clientName: string;\n\n private transportClient: TransportClient;\n private connectionHandlers: Array<IpcConnectionCompletionHandler> = [];\n private sessionSetupCallbacks: Map<string, Array<IpcSessionSetupCallback>> = new Map();\n private onMessageReceivedListener?: (message: string) => void;\n\n constructor(componentProvider: IpcClientComponentProvider) {\n this.componentProvider = componentProvider;\n this.settings = componentProvider.settings;\n this.clientName = componentProvider.settings.clientName;\n\n // 初始化传输通道(JS 端仅实现 WebSocket 通道)\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) {\n throw new Error(\n 'IpcConnectionManager: webSocketServerEndpoint must be provided in IpcClientSettings for JS client.',\n );\n }\n const ports = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n // 使用首个端口创建初始 client;有 portCandidateRule 时 attemptConnection 会按端口列表依次尝试\n this.transportClient = new WebSocketClient(\n ws.address,\n ports[0],\n ws.path,\n ws.useTls,\n );\n }\n\n initialize(): void {\n this.bindTransportEvents();\n }\n\n onMessageReceived(listener: (message: string) => void): void {\n this.onMessageReceivedListener = listener;\n this.transportClient.onMessage(listener);\n }\n\n async connect(\n onResult?: IpcConnectionCompletionHandler,\n options?: { autoLaunch?: boolean },\n ): Promise<void> {\n logger.debug(`[ConnectionManager] connect 开始 clientName=${this.clientName}`);\n if (this.isConnected()) {\n this.handleAlreadyConnected(onResult);\n return;\n }\n\n if (onResult) {\n this.connectionHandlers.push(onResult);\n }\n if (this.connectionHandlers.length > 1) {\n return;\n }\n\n if (\n await this.attemptConnection({\n maxConnectionAttempts: 2,\n notifyIfConnectionFailed: false,\n })\n ) {\n logger.info('直接建立与服务端进程的连接成功!');\n return;\n }\n\n const shouldWakeUp = this.shouldAttemptWakeUp(options?.autoLaunch);\n if (shouldWakeUp) {\n logger.warn('服务端进程不存在,尝试唤醒服务端并建立连接.');\n const appLauncher = this.settings.appLauncher ?? PlatformAppLauncherFactory.create({\n appIdentifier: this.settings.serverLaunchIdentifier,\n appInstallationPath: this.settings.serverInstallationPath,\n });\n\n const result = await appLauncher.launchApp();\n if (!result.isSuccess) {\n logger.fatal(`客户端('${this.clientName}')唤醒服务端 App 失败: ${result.error ?? '未知原因'}`);\n this.handleConnectionFailed(result.error);\n return;\n }\n logger.info(`客户端('${this.clientName}')已触发唤醒,即将进行连接探测!`);\n const connected = await this.attemptConnectionWithProbe();\n if (connected) return;\n this.handleConnectionFailed();\n } else {\n logger.warn('服务端进程不存在,触发服务端 socket 关闭事件.');\n this.onServerClose();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.componentProvider.communicationAgent.unregister();\n await this.transportClient.close();\n }\n\n isConnected(): boolean {\n return this.transportClient.isClientConnected;\n }\n\n setupSession(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n if (!this.isConnected()) {\n logger.info(`客户端('${this.clientName}')未连接,尝试建立连接...`);\n void this.connect((success, error) => {\n if (success) {\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n } else {\n callback(false, error ?? undefined);\n }\n }, { autoLaunch });\n return;\n }\n\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n }\n\n onSessionSetupCallback(response: IpcSessionSetupResponse): void {\n const callbacks = this.sessionSetupCallbacks.get(response.callbackId);\n if (!callbacks) {\n return;\n }\n this.sessionSetupCallbacks.delete(response.callbackId);\n\n const error = new IpcError(\n IpcError.ERROR_IPC_SESSION_ABNORMAL,\n response.message,\n response.userInfo ?? undefined,\n );\n const result = response.result === IpcSessionSetupResponse.success;\n\n for (const cb of callbacks) {\n cb(result, result ? undefined : error);\n }\n }\n\n get transportClientInstance(): TransportClient {\n return this.transportClient;\n }\n\n // PRIVATE HELPERS\n\n private bindTransportEvents(): void {\n this.transportClient.onErrorAndClose({\n onError: this.onError.bind(this),\n onServerClose: this.onServerClose.bind(this),\n });\n\n if (this.onMessageReceivedListener) {\n this.transportClient.onMessage(this.onMessageReceivedListener);\n }\n }\n\n private getPortList(port: number, portCandidateRule?: PortCandidateRule): Array<number> {\n if (portCandidateRule) {\n return portCandidateRule.toOrderedPortList();\n }\n return [port];\n }\n\n /**\n * 生成环境回调 ID,与 Flutter _generateSessionCallbackId 一致。\n * 同一 (fromClient, toClient) 对的多个请求共享同一 sessionCallbackId,仅首次会发送 IpcSessionSetupRequest。\n */\n private generateSessionCallbackId(request: Request): string {\n return `${request.fromClient}_${request.toClient}`;\n }\n\n /**\n * 对指定 client 执行应用层握手,与 Flutter _performHandshake 语义一致:\n * 发送握手请求后,在短超时内等待带相同 magic 与 server 角色的握手响应,成功才返回 true。\n */\n private async performHandshake(client: TransportClient): Promise<boolean> {\n logger.debug(`[ConnectionManager] 开始握手 clientName=${this.clientName}`);\n const hello = new Handshake(\n this.clientName,\n Handshake.ipcMagic,\n Handshake.clientRole,\n Handshake.ipcVersion,\n );\n const sent = await sendHandshake(client, hello);\n if (!sent) {\n return false;\n }\n\n let settled = false;\n let complete: (value: boolean) => void;\n const handshakePromise = new Promise<boolean>((resolve) => {\n complete = resolve;\n });\n const resolveOnce = (value: boolean) => {\n if (settled) return;\n settled = true;\n complete(value);\n };\n\n const onMessage = (message: string): void => {\n if (settled) return;\n // 约定:首条应用层消息若非握手响应,则判定非目标 IPC 服务,立即失败\n if (!message.includes(MessageType.HANDSHAKE)) {\n resolveOnce(false);\n return;\n }\n try {\n const hs = IpcMessageDecoder.decodeHandshake(message);\n const isTargetServer =\n hs.magic === Handshake.ipcMagic && hs.role === Handshake.serverRole;\n resolveOnce(isTargetServer);\n } catch {\n resolveOnce(false);\n }\n };\n\n client.onMessage(onMessage);\n\n const timeoutMs = 1000;\n const timeoutId = setTimeout(() => {\n resolveOnce(false);\n }, timeoutMs);\n\n try {\n const result = await handshakePromise;\n logger.debug(`[ConnectionManager] 握手结束 clientName=${this.clientName} success=${result}`);\n return result;\n } finally {\n clearTimeout(timeoutId);\n if (this.onMessageReceivedListener) {\n client.onMessage(this.onMessageReceivedListener);\n }\n }\n }\n\n /**\n * 019:唤醒后连接探测。立即尝试连接,失败则短间隔重试,成功即停止;支持多轮端口遍历。\n */\n private async attemptConnectionWithProbe(): Promise<boolean> {\n const intervalMs = this.settings.wakeUpProbeIntervalMs;\n const timeoutMs = this.settings.wakeUpProbeTimeoutMs;\n const start = Date.now();\n let round = 0;\n\n // eslint-disable-next-line no-constant-condition -- 连接探测循环,通过 return 退出\n while (true) {\n round += 1;\n logger.debug(\n `[ConnectionManager] 连接探测 第 ${round} 轮 clientName=${this.clientName}`,\n );\n const ok = await this.attemptConnection({\n maxConnectionAttempts: 1,\n notifyIfConnectionFailed: false,\n });\n if (ok) {\n logger.info(`客户端('${this.clientName}')连接探测成功`);\n return true;\n }\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n logger.warn(\n `客户端('${this.clientName}')连接探测超时,已耗时 ${elapsed}ms`,\n );\n return false;\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n }\n\n private async attemptConnection(options?: {\n maxConnectionAttempts?: number;\n notifyIfConnectionFailed?: boolean;\n }): Promise<boolean> {\n const maxAttempts = options?.maxConnectionAttempts ?? 1;\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) return false;\n\n const portList = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n const hasPortRule = portList.length > 1;\n\n if (hasPortRule) {\n // 有 portCandidateRule 时:遍历端口列表,依次尝试 9100、9101、9102...\n logger.debug(`[ConnectionManager] attemptConnection 遍历端口列表,共 ${portList.length} 个端口`);\n for (const port of portList) {\n try {\n const client = new WebSocketClient(ws.address, port, ws.path, ws.useTls);\n if (await client.connectWithServer()) {\n const ok = await this.performHandshake(client);\n if (ok) {\n await this.transportClient.close();\n this.transportClient = client;\n this.bindTransportEvents();\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await client.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n } else {\n // 无 portCandidateRule:沿用原逻辑,重试同一端口\n logger.debug(`[ConnectionManager] attemptConnection maxAttempts=${maxAttempts}`);\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n if (await this.transportClient.connectWithServer()) {\n const ok = await this.performHandshake(this.transportClient);\n if (ok) {\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await this.transportClient.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n }\n\n if (options?.notifyIfConnectionFailed ?? true) {\n this.handleConnectionFailed();\n }\n return false;\n }\n\n private handleConnectionFailed(launchError?: string): void {\n const message = launchError\n ? `Connect server socket failed! Launch error: ${launchError}`\n : 'Connect server socket failed!';\n const userInfo = launchError ? { launchError } : undefined;\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_BIND_SERVER, message, userInfo),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接失败${launchError ? `: ${launchError}` : ''}`);\n }\n\n private handleConnectionException(e: unknown): void {\n this.notifyConnectionResult(\n false,\n new IpcError(\n IpcError.ERROR_BIND_SERVER_EXCEPTION,\n 'Connect server socket exception!',\n ),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接异常: ${String(e)}`);\n }\n\n private handleAlreadyConnected(handler?: IpcConnectionCompletionHandler): void {\n if (handler) {\n handler(true, undefined);\n }\n }\n\n private shouldAttemptWakeUp(autoLaunchOverride?: boolean): boolean {\n if (typeof autoLaunchOverride === 'boolean') {\n return autoLaunchOverride;\n }\n const strategy: IpcMessageStrategy = this.settings.messageStrategy;\n return strategy.autoLaunch;\n }\n\n private setupSessionAfterConnection(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n const sessionCallbackId = this.generateSessionCallbackId(request);\n const callbacks =\n this.sessionSetupCallbacks.get(sessionCallbackId) ?? [];\n callbacks.push(callback);\n this.sessionSetupCallbacks.set(sessionCallbackId, callbacks);\n\n // 仅首次构建目标会话时发起 IpcSessionSetupRequest(与 Flutter 一致)\n if (callbacks.length === 1) {\n const setupRequest = new IpcSessionSetupRequest(\n this.clientName,\n request.toClient,\n sessionCallbackId,\n autoLaunch,\n );\n setupSession(this.transportClient, setupRequest);\n }\n }\n\n private onError(_error: unknown): void {\n logger.error(`客户端('${this.clientName}')与服务端连接出错: ${String(_error)}!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_DISCONNECTED_WITH_SERVER, 'Disconnected from server!'),\n );\n }\n\n private onServerClose(): void {\n logger.error(`客户端('${this.clientName}')断开与服务端的连接,服务端 socket 关闭!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_SERVER_SOCKET_CLOSED, 'Server socket closed!'),\n );\n }\n\n private notifyConnectionResult(success: boolean, error?: IpcError): void {\n const handlers = this.connectionHandlers;\n this.connectionHandlers = [];\n for (const handler of handlers) {\n handler(success, error ?? undefined);\n }\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":["WebSocketClient","logger","PlatformAppLauncherFactory","IpcError","IpcSessionSetupResponse","Handshake","sendHandshake","MessageType","IpcMessageDecoder","IpcSessionSetupRequest","setupSession"],"mappings":"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","file":"ipc_connection_manager.js","sourcesContent":["// 对应:\n// moonbridge-ipc-flutter/lib/client/internal/ipc/connect/ipc_connection_manager.dart\n//\n// IPC 连接管理器,负责维护 IPC 通信的连接状态。\n// 012 US1:JS 端仅使用 webSocketServerEndpoint 构造 WebSocket 客户端,不使用 socketServerEndpoint。\n// 010 US1:握手在 performHandshake 内等待服务端 TYPE_NAME_HANDSHAKE 响应并校验 magic/role,与 Flutter 一致。\n// 010 US4:当直接连接失败且 shouldAttemptWakeUp 为 true 时,调用 settings.appLauncher.launchApp() 后重试。\n// 019:连接探测——唤醒后立即尝试连接,失败则短间隔重试,成功即停止;launchApp 返回 AppLaunchResult。\n\nimport { IpcClientComponentProvider } from '../ipc_client_component_provider';\nimport { IpcClientSettings } from '../../settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../../../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler } from '../../../types/ipc_types';\nimport { TransportClient } from '../../../../general/transport/interface/transport_client';\nimport { PortCandidateRule } from '../../../../general/config/port_candidate_rule';\nimport { Handshake } from '../../../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../../../general/message/session_setup';\nimport { Request } from '../../../../general/message/request';\nimport { IpcError } from '../../../../general/error/ipc_error';\nimport { MessageType } from '../../../../general/message/constants/message_types';\nimport { IpcMessageDecoder } from '../../../../general/encode/ipc_message_decoder';\nimport { PlatformAppLauncherFactory } from '../../../../general/app_launch/platform_app_launcher';\nimport { logger } from '../../../../utils/logger';\nimport { sendHandshake, setupSession, } from '../../../../general/transport/interface/transport_client_extension';\nimport { WebSocketClient } from '../../../../general/transport/websocket/websocket_client';\n\n/** \n * IPC 通信环境构建结果回调\n */\nexport type IpcSessionSetupCallback = (success: boolean, error?: IpcError) => void;\n\n/**\n * IPC 连接管理器,负责维护 IPC 通信的连接状态\n */\nexport class IpcConnectionManager {\n private readonly settings: IpcClientSettings;\n private readonly componentProvider: IpcClientComponentProvider;\n private readonly clientName: string;\n\n private transportClient: TransportClient;\n private connectionHandlers: Array<IpcConnectionCompletionHandler> = [];\n private sessionSetupCallbacks: Map<string, Array<IpcSessionSetupCallback>> = new Map();\n private onMessageReceivedListener?: (message: string) => void;\n\n constructor(componentProvider: IpcClientComponentProvider) {\n this.componentProvider = componentProvider;\n this.settings = componentProvider.settings;\n this.clientName = componentProvider.settings.clientName;\n\n // 初始化传输通道(JS 端仅实现 WebSocket 通道)\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) {\n throw new Error(\n 'IpcConnectionManager: webSocketServerEndpoint must be provided in IpcClientSettings for JS client.',\n );\n }\n const ports = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n // 使用首个端口创建初始 client;有 portCandidateRule 时 attemptConnection 会按端口列表依次尝试\n this.transportClient = new WebSocketClient(\n ws.address,\n ports[0],\n ws.path,\n ws.useTls,\n );\n }\n\n initialize(): void {\n this.bindTransportEvents();\n }\n\n onMessageReceived(listener: (message: string) => void): void {\n this.onMessageReceivedListener = listener;\n this.transportClient.onMessage(listener);\n }\n\n async connect(\n onResult?: IpcConnectionCompletionHandler,\n options?: { autoLaunch?: boolean },\n ): Promise<void> {\n logger.debug(`[ConnectionManager] connect 开始 clientName=${this.clientName}`);\n if (this.isConnected()) {\n this.handleAlreadyConnected(onResult);\n return;\n }\n\n if (onResult) {\n this.connectionHandlers.push(onResult);\n }\n if (this.connectionHandlers.length > 1) {\n return;\n }\n\n if (\n await this.attemptConnection({\n maxConnectionAttempts: 2,\n notifyIfConnectionFailed: false,\n })\n ) {\n logger.info('直接建立与服务端进程的连接成功!');\n return;\n }\n\n const shouldWakeUp = this.shouldAttemptWakeUp(options?.autoLaunch);\n if (shouldWakeUp) {\n logger.warn('服务端进程不存在,尝试唤醒服务端并建立连接.');\n const appLauncher = this.settings.appLauncher ?? PlatformAppLauncherFactory.create({\n appIdentifier: this.settings.serverLaunchIdentifier,\n appInstallationPath: this.settings.serverInstallationPath,\n });\n\n const result = await appLauncher.launchApp();\n if (!result.isSuccess) {\n logger.fatal(`客户端('${this.clientName}')唤醒服务端 App 失败: ${result.error ?? '未知原因'}`);\n this.handleConnectionFailed(result.error);\n return;\n }\n logger.info(`客户端('${this.clientName}')已触发唤醒,即将进行连接探测!`);\n const connected = await this.attemptConnectionWithProbe();\n if (connected) return;\n this.handleConnectionFailed();\n } else {\n logger.warn('服务端进程不存在,触发服务端 socket 关闭事件.');\n this.onServerClose();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.componentProvider.communicationAgent.unregister();\n await this.transportClient.close();\n }\n\n isConnected(): boolean {\n return this.transportClient.isClientConnected;\n }\n\n setupSession(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n if (!this.isConnected()) {\n logger.info(`客户端('${this.clientName}')未连接,尝试建立连接...`);\n void this.connect((success, error) => {\n if (success) {\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n } else {\n callback(false, error ?? undefined);\n }\n }, { autoLaunch });\n return;\n }\n\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n }\n\n onSessionSetupCallback(response: IpcSessionSetupResponse): void {\n const callbacks = this.sessionSetupCallbacks.get(response.callbackId);\n if (!callbacks) {\n return;\n }\n this.sessionSetupCallbacks.delete(response.callbackId);\n\n const error = new IpcError(\n IpcError.ERROR_IPC_SESSION_ABNORMAL,\n response.message,\n response.userInfo ?? undefined,\n );\n const result = response.result === IpcSessionSetupResponse.success;\n\n for (const cb of callbacks) {\n cb(result, result ? undefined : error);\n }\n }\n\n get transportClientInstance(): TransportClient {\n return this.transportClient;\n }\n\n // PRIVATE HELPERS\n\n private bindTransportEvents(): void {\n this.transportClient.onErrorAndClose({\n onError: this.onError.bind(this),\n onServerClose: this.onServerClose.bind(this),\n });\n\n if (this.onMessageReceivedListener) {\n this.transportClient.onMessage(this.onMessageReceivedListener);\n }\n }\n\n private getPortList(port: number, portCandidateRule?: PortCandidateRule): Array<number> {\n if (portCandidateRule) {\n return portCandidateRule.toOrderedPortList();\n }\n return [port];\n }\n\n /**\n * 生成环境回调 ID,与 Flutter _generateSessionCallbackId 一致。\n * 同一 (fromClient, toClient) 对的多个请求共享同一 sessionCallbackId,仅首次会发送 IpcSessionSetupRequest。\n */\n private generateSessionCallbackId(request: Request): string {\n return `${request.fromClient}_${request.toClient}`;\n }\n\n /**\n * 对指定 client 执行应用层握手,与 Flutter _performHandshake 语义一致:\n * 发送握手请求后,在短超时内等待带相同 magic 与 server 角色的握手响应,成功才返回 true。\n */\n private async performHandshake(client: TransportClient): Promise<boolean> {\n logger.debug(`[ConnectionManager] 开始握手 clientName=${this.clientName}`);\n const hello = new Handshake(\n this.clientName,\n Handshake.ipcMagic,\n Handshake.clientRole,\n Handshake.ipcVersion,\n );\n const sent = await sendHandshake(client, hello);\n if (!sent) {\n return false;\n }\n\n let settled = false;\n let complete: (value: boolean) => void;\n const handshakePromise = new Promise<boolean>((resolve) => {\n complete = resolve;\n });\n const resolveOnce = (value: boolean) => {\n if (settled) return;\n settled = true;\n complete(value);\n };\n\n const onMessage = (message: string): void => {\n if (settled) return;\n // 约定:首条应用层消息若非握手响应,则判定非目标 IPC 服务,立即失败\n if (!message.includes(MessageType.HANDSHAKE)) {\n resolveOnce(false);\n return;\n }\n try {\n const hs = IpcMessageDecoder.decodeHandshake(message);\n const isTargetServer =\n hs.magic === Handshake.ipcMagic && hs.role === Handshake.serverRole;\n resolveOnce(isTargetServer);\n } catch {\n resolveOnce(false);\n }\n };\n\n client.onMessage(onMessage);\n\n const timeoutMs = 1000;\n const timeoutId = setTimeout(() => {\n resolveOnce(false);\n }, timeoutMs);\n\n try {\n const result = await handshakePromise;\n logger.debug(`[ConnectionManager] 握手结束 clientName=${this.clientName} success=${result}`);\n return result;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 019:唤醒后连接探测。立即尝试连接,失败则短间隔重试,成功即停止;支持多轮端口遍历。\n */\n private async attemptConnectionWithProbe(): Promise<boolean> {\n const intervalMs = this.settings.wakeUpProbeIntervalMs;\n const timeoutMs = this.settings.wakeUpProbeTimeoutMs;\n const start = Date.now();\n let round = 0;\n\n // eslint-disable-next-line no-constant-condition -- 连接探测循环,通过 return 退出\n while (true) {\n round += 1;\n logger.debug(\n `[ConnectionManager] 连接探测 第 ${round} 轮 clientName=${this.clientName}`,\n );\n const ok = await this.attemptConnection({\n maxConnectionAttempts: 1,\n notifyIfConnectionFailed: false,\n });\n if (ok) {\n logger.info(`客户端('${this.clientName}')连接探测成功`);\n return true;\n }\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n logger.warn(\n `客户端('${this.clientName}')连接探测超时,已耗时 ${elapsed}ms`,\n );\n return false;\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n }\n\n private async attemptConnection(options?: {\n maxConnectionAttempts?: number;\n notifyIfConnectionFailed?: boolean;\n }): Promise<boolean> {\n const maxAttempts = options?.maxConnectionAttempts ?? 1;\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) return false;\n\n const portList = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n const hasPortRule = portList.length > 1;\n\n if (hasPortRule) {\n // 有 portCandidateRule 时:遍历端口列表,依次尝试 9100、9101、9102...\n logger.debug(`[ConnectionManager] attemptConnection 遍历端口列表,共 ${portList.length} 个端口`);\n for (const port of portList) {\n try {\n const client = new WebSocketClient(ws.address, port, ws.path, ws.useTls);\n if (await client.connectWithServer()) {\n const ok = await this.performHandshake(client);\n if (ok) {\n await this.transportClient.close();\n this.transportClient = client;\n this.bindTransportEvents();\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await client.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n } else {\n // 无 portCandidateRule:沿用原逻辑,重试同一端口\n logger.debug(`[ConnectionManager] attemptConnection maxAttempts=${maxAttempts}`);\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n if (await this.transportClient.connectWithServer()) {\n const ok = await this.performHandshake(this.transportClient);\n if (ok) {\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await this.transportClient.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n }\n\n if (options?.notifyIfConnectionFailed ?? true) {\n this.handleConnectionFailed();\n }\n return false;\n }\n\n private handleConnectionFailed(launchError?: string): void {\n const message = launchError\n ? `Connect server socket failed! Launch error: ${launchError}`\n : 'Connect server socket failed!';\n const userInfo = launchError ? { launchError } : undefined;\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_BIND_SERVER, message, userInfo),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接失败${launchError ? `: ${launchError}` : ''}`);\n }\n\n private handleConnectionException(e: unknown): void {\n this.notifyConnectionResult(\n false,\n new IpcError(\n IpcError.ERROR_BIND_SERVER_EXCEPTION,\n 'Connect server socket exception!',\n ),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接异常: ${String(e)}`);\n }\n\n private handleAlreadyConnected(handler?: IpcConnectionCompletionHandler): void {\n if (handler) {\n handler(true, undefined);\n }\n }\n\n private shouldAttemptWakeUp(autoLaunchOverride?: boolean): boolean {\n if (typeof autoLaunchOverride === 'boolean') {\n return autoLaunchOverride;\n }\n const strategy: IpcMessageStrategy = this.settings.messageStrategy;\n return strategy.autoLaunch;\n }\n\n private setupSessionAfterConnection(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n const sessionCallbackId = this.generateSessionCallbackId(request);\n const callbacks =\n this.sessionSetupCallbacks.get(sessionCallbackId) ?? [];\n callbacks.push(callback);\n this.sessionSetupCallbacks.set(sessionCallbackId, callbacks);\n\n // 仅首次构建目标会话时发起 IpcSessionSetupRequest(与 Flutter 一致)\n if (callbacks.length === 1) {\n const setupRequest = new IpcSessionSetupRequest(\n this.clientName,\n request.toClient,\n sessionCallbackId,\n autoLaunch,\n );\n setupSession(this.transportClient, setupRequest);\n }\n }\n\n private onError(_error: unknown): void {\n logger.error(`客户端('${this.clientName}')与服务端连接出错: ${String(_error)}!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_DISCONNECTED_WITH_SERVER, 'Disconnected from server!'),\n );\n }\n\n private onServerClose(): void {\n logger.error(`客户端('${this.clientName}')断开与服务端的连接,服务端 socket 关闭!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_SERVER_SOCKET_CLOSED, 'Server socket closed!'),\n );\n }\n\n private notifyConnectionResult(success: boolean, error?: IpcError): void {\n const handlers = this.connectionHandlers;\n this.connectionHandlers = [];\n for (const handler of handlers) {\n handler(success, error ?? undefined);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":[],"mappings":"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","file":"ipc_connection_manager.mjs","sourcesContent":["// 对应:\n// moonbridge-ipc-flutter/lib/client/internal/ipc/connect/ipc_connection_manager.dart\n//\n// IPC 连接管理器,负责维护 IPC 通信的连接状态。\n// 012 US1:JS 端仅使用 webSocketServerEndpoint 构造 WebSocket 客户端,不使用 socketServerEndpoint。\n// 010 US1:握手在 performHandshake 内等待服务端 TYPE_NAME_HANDSHAKE 响应并校验 magic/role,与 Flutter 一致。\n// 010 US4:当直接连接失败且 shouldAttemptWakeUp 为 true 时,调用 settings.appLauncher.launchApp() 后重试。\n// 019:连接探测——唤醒后立即尝试连接,失败则短间隔重试,成功即停止;launchApp 返回 AppLaunchResult。\n\nimport { IpcClientComponentProvider } from '../ipc_client_component_provider';\nimport { IpcClientSettings } from '../../settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../../../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler } from '../../../types/ipc_types';\nimport { TransportClient } from '../../../../general/transport/interface/transport_client';\nimport { PortCandidateRule } from '../../../../general/config/port_candidate_rule';\nimport { Handshake } from '../../../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../../../general/message/session_setup';\nimport { Request } from '../../../../general/message/request';\nimport { IpcError } from '../../../../general/error/ipc_error';\nimport { MessageType } from '../../../../general/message/constants/message_types';\nimport { IpcMessageDecoder } from '../../../../general/encode/ipc_message_decoder';\nimport { PlatformAppLauncherFactory } from '../../../../general/app_launch/platform_app_launcher';\nimport { logger } from '../../../../utils/logger';\nimport { sendHandshake, setupSession, } from '../../../../general/transport/interface/transport_client_extension';\nimport { WebSocketClient } from '../../../../general/transport/websocket/websocket_client';\n\n/** \n * IPC 通信环境构建结果回调\n */\nexport type IpcSessionSetupCallback = (success: boolean, error?: IpcError) => void;\n\n/**\n * IPC 连接管理器,负责维护 IPC 通信的连接状态\n */\nexport class IpcConnectionManager {\n private readonly settings: IpcClientSettings;\n private readonly componentProvider: IpcClientComponentProvider;\n private readonly clientName: string;\n\n private transportClient: TransportClient;\n private connectionHandlers: Array<IpcConnectionCompletionHandler> = [];\n private sessionSetupCallbacks: Map<string, Array<IpcSessionSetupCallback>> = new Map();\n private onMessageReceivedListener?: (message: string) => void;\n\n constructor(componentProvider: IpcClientComponentProvider) {\n this.componentProvider = componentProvider;\n this.settings = componentProvider.settings;\n this.clientName = componentProvider.settings.clientName;\n\n // 初始化传输通道(JS 端仅实现 WebSocket 通道)\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) {\n throw new Error(\n 'IpcConnectionManager: webSocketServerEndpoint must be provided in IpcClientSettings for JS client.',\n );\n }\n const ports = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n // 使用首个端口创建初始 client;有 portCandidateRule 时 attemptConnection 会按端口列表依次尝试\n this.transportClient = new WebSocketClient(\n ws.address,\n ports[0],\n ws.path,\n ws.useTls,\n );\n }\n\n initialize(): void {\n this.bindTransportEvents();\n }\n\n onMessageReceived(listener: (message: string) => void): void {\n this.onMessageReceivedListener = listener;\n this.transportClient.onMessage(listener);\n }\n\n async connect(\n onResult?: IpcConnectionCompletionHandler,\n options?: { autoLaunch?: boolean },\n ): Promise<void> {\n logger.debug(`[ConnectionManager] connect 开始 clientName=${this.clientName}`);\n if (this.isConnected()) {\n this.handleAlreadyConnected(onResult);\n return;\n }\n\n if (onResult) {\n this.connectionHandlers.push(onResult);\n }\n if (this.connectionHandlers.length > 1) {\n return;\n }\n\n if (\n await this.attemptConnection({\n maxConnectionAttempts: 2,\n notifyIfConnectionFailed: false,\n })\n ) {\n logger.info('直接建立与服务端进程的连接成功!');\n return;\n }\n\n const shouldWakeUp = this.shouldAttemptWakeUp(options?.autoLaunch);\n if (shouldWakeUp) {\n logger.warn('服务端进程不存在,尝试唤醒服务端并建立连接.');\n const appLauncher = this.settings.appLauncher ?? PlatformAppLauncherFactory.create({\n appIdentifier: this.settings.serverLaunchIdentifier,\n appInstallationPath: this.settings.serverInstallationPath,\n });\n\n const result = await appLauncher.launchApp();\n if (!result.isSuccess) {\n logger.fatal(`客户端('${this.clientName}')唤醒服务端 App 失败: ${result.error ?? '未知原因'}`);\n this.handleConnectionFailed(result.error);\n return;\n }\n logger.info(`客户端('${this.clientName}')已触发唤醒,即将进行连接探测!`);\n const connected = await this.attemptConnectionWithProbe();\n if (connected) return;\n this.handleConnectionFailed();\n } else {\n logger.warn('服务端进程不存在,触发服务端 socket 关闭事件.');\n this.onServerClose();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.componentProvider.communicationAgent.unregister();\n await this.transportClient.close();\n }\n\n isConnected(): boolean {\n return this.transportClient.isClientConnected;\n }\n\n setupSession(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n if (!this.isConnected()) {\n logger.info(`客户端('${this.clientName}')未连接,尝试建立连接...`);\n void this.connect((success, error) => {\n if (success) {\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n } else {\n callback(false, error ?? undefined);\n }\n }, { autoLaunch });\n return;\n }\n\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n }\n\n onSessionSetupCallback(response: IpcSessionSetupResponse): void {\n const callbacks = this.sessionSetupCallbacks.get(response.callbackId);\n if (!callbacks) {\n return;\n }\n this.sessionSetupCallbacks.delete(response.callbackId);\n\n const error = new IpcError(\n IpcError.ERROR_IPC_SESSION_ABNORMAL,\n response.message,\n response.userInfo ?? undefined,\n );\n const result = response.result === IpcSessionSetupResponse.success;\n\n for (const cb of callbacks) {\n cb(result, result ? undefined : error);\n }\n }\n\n get transportClientInstance(): TransportClient {\n return this.transportClient;\n }\n\n // PRIVATE HELPERS\n\n private bindTransportEvents(): void {\n this.transportClient.onErrorAndClose({\n onError: this.onError.bind(this),\n onServerClose: this.onServerClose.bind(this),\n });\n\n if (this.onMessageReceivedListener) {\n this.transportClient.onMessage(this.onMessageReceivedListener);\n }\n }\n\n private getPortList(port: number, portCandidateRule?: PortCandidateRule): Array<number> {\n if (portCandidateRule) {\n return portCandidateRule.toOrderedPortList();\n }\n return [port];\n }\n\n /**\n * 生成环境回调 ID,与 Flutter _generateSessionCallbackId 一致。\n * 同一 (fromClient, toClient) 对的多个请求共享同一 sessionCallbackId,仅首次会发送 IpcSessionSetupRequest。\n */\n private generateSessionCallbackId(request: Request): string {\n return `${request.fromClient}_${request.toClient}`;\n }\n\n /**\n * 对指定 client 执行应用层握手,与 Flutter _performHandshake 语义一致:\n * 发送握手请求后,在短超时内等待带相同 magic 与 server 角色的握手响应,成功才返回 true。\n */\n private async performHandshake(client: TransportClient): Promise<boolean> {\n logger.debug(`[ConnectionManager] 开始握手 clientName=${this.clientName}`);\n const hello = new Handshake(\n this.clientName,\n Handshake.ipcMagic,\n Handshake.clientRole,\n Handshake.ipcVersion,\n );\n const sent = await sendHandshake(client, hello);\n if (!sent) {\n return false;\n }\n\n let settled = false;\n let complete: (value: boolean) => void;\n const handshakePromise = new Promise<boolean>((resolve) => {\n complete = resolve;\n });\n const resolveOnce = (value: boolean) => {\n if (settled) return;\n settled = true;\n complete(value);\n };\n\n const onMessage = (message: string): void => {\n if (settled) return;\n // 约定:首条应用层消息若非握手响应,则判定非目标 IPC 服务,立即失败\n if (!message.includes(MessageType.HANDSHAKE)) {\n resolveOnce(false);\n return;\n }\n try {\n const hs = IpcMessageDecoder.decodeHandshake(message);\n const isTargetServer =\n hs.magic === Handshake.ipcMagic && hs.role === Handshake.serverRole;\n resolveOnce(isTargetServer);\n } catch {\n resolveOnce(false);\n }\n };\n\n client.onMessage(onMessage);\n\n const timeoutMs = 1000;\n const timeoutId = setTimeout(() => {\n resolveOnce(false);\n }, timeoutMs);\n\n try {\n const result = await handshakePromise;\n logger.debug(`[ConnectionManager] 握手结束 clientName=${this.clientName} success=${result}`);\n return result;\n } finally {\n clearTimeout(timeoutId);\n if (this.onMessageReceivedListener) {\n client.onMessage(this.onMessageReceivedListener);\n }\n }\n }\n\n /**\n * 019:唤醒后连接探测。立即尝试连接,失败则短间隔重试,成功即停止;支持多轮端口遍历。\n */\n private async attemptConnectionWithProbe(): Promise<boolean> {\n const intervalMs = this.settings.wakeUpProbeIntervalMs;\n const timeoutMs = this.settings.wakeUpProbeTimeoutMs;\n const start = Date.now();\n let round = 0;\n\n // eslint-disable-next-line no-constant-condition -- 连接探测循环,通过 return 退出\n while (true) {\n round += 1;\n logger.debug(\n `[ConnectionManager] 连接探测 第 ${round} 轮 clientName=${this.clientName}`,\n );\n const ok = await this.attemptConnection({\n maxConnectionAttempts: 1,\n notifyIfConnectionFailed: false,\n });\n if (ok) {\n logger.info(`客户端('${this.clientName}')连接探测成功`);\n return true;\n }\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n logger.warn(\n `客户端('${this.clientName}')连接探测超时,已耗时 ${elapsed}ms`,\n );\n return false;\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n }\n\n private async attemptConnection(options?: {\n maxConnectionAttempts?: number;\n notifyIfConnectionFailed?: boolean;\n }): Promise<boolean> {\n const maxAttempts = options?.maxConnectionAttempts ?? 1;\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) return false;\n\n const portList = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n const hasPortRule = portList.length > 1;\n\n if (hasPortRule) {\n // 有 portCandidateRule 时:遍历端口列表,依次尝试 9100、9101、9102...\n logger.debug(`[ConnectionManager] attemptConnection 遍历端口列表,共 ${portList.length} 个端口`);\n for (const port of portList) {\n try {\n const client = new WebSocketClient(ws.address, port, ws.path, ws.useTls);\n if (await client.connectWithServer()) {\n const ok = await this.performHandshake(client);\n if (ok) {\n await this.transportClient.close();\n this.transportClient = client;\n this.bindTransportEvents();\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await client.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n } else {\n // 无 portCandidateRule:沿用原逻辑,重试同一端口\n logger.debug(`[ConnectionManager] attemptConnection maxAttempts=${maxAttempts}`);\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n if (await this.transportClient.connectWithServer()) {\n const ok = await this.performHandshake(this.transportClient);\n if (ok) {\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await this.transportClient.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n }\n\n if (options?.notifyIfConnectionFailed ?? true) {\n this.handleConnectionFailed();\n }\n return false;\n }\n\n private handleConnectionFailed(launchError?: string): void {\n const message = launchError\n ? `Connect server socket failed! Launch error: ${launchError}`\n : 'Connect server socket failed!';\n const userInfo = launchError ? { launchError } : undefined;\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_BIND_SERVER, message, userInfo),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接失败${launchError ? `: ${launchError}` : ''}`);\n }\n\n private handleConnectionException(e: unknown): void {\n this.notifyConnectionResult(\n false,\n new IpcError(\n IpcError.ERROR_BIND_SERVER_EXCEPTION,\n 'Connect server socket exception!',\n ),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接异常: ${String(e)}`);\n }\n\n private handleAlreadyConnected(handler?: IpcConnectionCompletionHandler): void {\n if (handler) {\n handler(true, undefined);\n }\n }\n\n private shouldAttemptWakeUp(autoLaunchOverride?: boolean): boolean {\n if (typeof autoLaunchOverride === 'boolean') {\n return autoLaunchOverride;\n }\n const strategy: IpcMessageStrategy = this.settings.messageStrategy;\n return strategy.autoLaunch;\n }\n\n private setupSessionAfterConnection(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n const sessionCallbackId = this.generateSessionCallbackId(request);\n const callbacks =\n this.sessionSetupCallbacks.get(sessionCallbackId) ?? [];\n callbacks.push(callback);\n this.sessionSetupCallbacks.set(sessionCallbackId, callbacks);\n\n // 仅首次构建目标会话时发起 IpcSessionSetupRequest(与 Flutter 一致)\n if (callbacks.length === 1) {\n const setupRequest = new IpcSessionSetupRequest(\n this.clientName,\n request.toClient,\n sessionCallbackId,\n autoLaunch,\n );\n setupSession(this.transportClient, setupRequest);\n }\n }\n\n private onError(_error: unknown): void {\n logger.error(`客户端('${this.clientName}')与服务端连接出错: ${String(_error)}!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_DISCONNECTED_WITH_SERVER, 'Disconnected from server!'),\n );\n }\n\n private onServerClose(): void {\n logger.error(`客户端('${this.clientName}')断开与服务端的连接,服务端 socket 关闭!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_SERVER_SOCKET_CLOSED, 'Server socket closed!'),\n );\n }\n\n private notifyConnectionResult(success: boolean, error?: IpcError): void {\n const handlers = this.connectionHandlers;\n this.connectionHandlers = [];\n for (const handler of handlers) {\n handler(success, error ?? undefined);\n }\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/moonbridge-ipc/client/internal/ipc/connect/ipc_connection_manager.ts"],"names":[],"mappings":"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","file":"ipc_connection_manager.mjs","sourcesContent":["// 对应:\n// moonbridge-ipc-flutter/lib/client/internal/ipc/connect/ipc_connection_manager.dart\n//\n// IPC 连接管理器,负责维护 IPC 通信的连接状态。\n// 012 US1:JS 端仅使用 webSocketServerEndpoint 构造 WebSocket 客户端,不使用 socketServerEndpoint。\n// 010 US1:握手在 performHandshake 内等待服务端 TYPE_NAME_HANDSHAKE 响应并校验 magic/role,与 Flutter 一致。\n// 010 US4:当直接连接失败且 shouldAttemptWakeUp 为 true 时,调用 settings.appLauncher.launchApp() 后重试。\n// 019:连接探测——唤醒后立即尝试连接,失败则短间隔重试,成功即停止;launchApp 返回 AppLaunchResult。\n\nimport { IpcClientComponentProvider } from '../ipc_client_component_provider';\nimport { IpcClientSettings } from '../../settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../../../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler } from '../../../types/ipc_types';\nimport { TransportClient } from '../../../../general/transport/interface/transport_client';\nimport { PortCandidateRule } from '../../../../general/config/port_candidate_rule';\nimport { Handshake } from '../../../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../../../general/message/session_setup';\nimport { Request } from '../../../../general/message/request';\nimport { IpcError } from '../../../../general/error/ipc_error';\nimport { MessageType } from '../../../../general/message/constants/message_types';\nimport { IpcMessageDecoder } from '../../../../general/encode/ipc_message_decoder';\nimport { PlatformAppLauncherFactory } from '../../../../general/app_launch/platform_app_launcher';\nimport { logger } from '../../../../utils/logger';\nimport { sendHandshake, setupSession, } from '../../../../general/transport/interface/transport_client_extension';\nimport { WebSocketClient } from '../../../../general/transport/websocket/websocket_client';\n\n/** \n * IPC 通信环境构建结果回调\n */\nexport type IpcSessionSetupCallback = (success: boolean, error?: IpcError) => void;\n\n/**\n * IPC 连接管理器,负责维护 IPC 通信的连接状态\n */\nexport class IpcConnectionManager {\n private readonly settings: IpcClientSettings;\n private readonly componentProvider: IpcClientComponentProvider;\n private readonly clientName: string;\n\n private transportClient: TransportClient;\n private connectionHandlers: Array<IpcConnectionCompletionHandler> = [];\n private sessionSetupCallbacks: Map<string, Array<IpcSessionSetupCallback>> = new Map();\n private onMessageReceivedListener?: (message: string) => void;\n\n constructor(componentProvider: IpcClientComponentProvider) {\n this.componentProvider = componentProvider;\n this.settings = componentProvider.settings;\n this.clientName = componentProvider.settings.clientName;\n\n // 初始化传输通道(JS 端仅实现 WebSocket 通道)\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) {\n throw new Error(\n 'IpcConnectionManager: webSocketServerEndpoint must be provided in IpcClientSettings for JS client.',\n );\n }\n const ports = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n // 使用首个端口创建初始 client;有 portCandidateRule 时 attemptConnection 会按端口列表依次尝试\n this.transportClient = new WebSocketClient(\n ws.address,\n ports[0],\n ws.path,\n ws.useTls,\n );\n }\n\n initialize(): void {\n this.bindTransportEvents();\n }\n\n onMessageReceived(listener: (message: string) => void): void {\n this.onMessageReceivedListener = listener;\n this.transportClient.onMessage(listener);\n }\n\n async connect(\n onResult?: IpcConnectionCompletionHandler,\n options?: { autoLaunch?: boolean },\n ): Promise<void> {\n logger.debug(`[ConnectionManager] connect 开始 clientName=${this.clientName}`);\n if (this.isConnected()) {\n this.handleAlreadyConnected(onResult);\n return;\n }\n\n if (onResult) {\n this.connectionHandlers.push(onResult);\n }\n if (this.connectionHandlers.length > 1) {\n return;\n }\n\n if (\n await this.attemptConnection({\n maxConnectionAttempts: 2,\n notifyIfConnectionFailed: false,\n })\n ) {\n logger.info('直接建立与服务端进程的连接成功!');\n return;\n }\n\n const shouldWakeUp = this.shouldAttemptWakeUp(options?.autoLaunch);\n if (shouldWakeUp) {\n logger.warn('服务端进程不存在,尝试唤醒服务端并建立连接.');\n const appLauncher = this.settings.appLauncher ?? PlatformAppLauncherFactory.create({\n appIdentifier: this.settings.serverLaunchIdentifier,\n appInstallationPath: this.settings.serverInstallationPath,\n });\n\n const result = await appLauncher.launchApp();\n if (!result.isSuccess) {\n logger.fatal(`客户端('${this.clientName}')唤醒服务端 App 失败: ${result.error ?? '未知原因'}`);\n this.handleConnectionFailed(result.error);\n return;\n }\n logger.info(`客户端('${this.clientName}')已触发唤醒,即将进行连接探测!`);\n const connected = await this.attemptConnectionWithProbe();\n if (connected) return;\n this.handleConnectionFailed();\n } else {\n logger.warn('服务端进程不存在,触发服务端 socket 关闭事件.');\n this.onServerClose();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.componentProvider.communicationAgent.unregister();\n await this.transportClient.close();\n }\n\n isConnected(): boolean {\n return this.transportClient.isClientConnected;\n }\n\n setupSession(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n if (!this.isConnected()) {\n logger.info(`客户端('${this.clientName}')未连接,尝试建立连接...`);\n void this.connect((success, error) => {\n if (success) {\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n } else {\n callback(false, error ?? undefined);\n }\n }, { autoLaunch });\n return;\n }\n\n this.setupSessionAfterConnection(request, callback, autoLaunch);\n }\n\n onSessionSetupCallback(response: IpcSessionSetupResponse): void {\n const callbacks = this.sessionSetupCallbacks.get(response.callbackId);\n if (!callbacks) {\n return;\n }\n this.sessionSetupCallbacks.delete(response.callbackId);\n\n const error = new IpcError(\n IpcError.ERROR_IPC_SESSION_ABNORMAL,\n response.message,\n response.userInfo ?? undefined,\n );\n const result = response.result === IpcSessionSetupResponse.success;\n\n for (const cb of callbacks) {\n cb(result, result ? undefined : error);\n }\n }\n\n get transportClientInstance(): TransportClient {\n return this.transportClient;\n }\n\n // PRIVATE HELPERS\n\n private bindTransportEvents(): void {\n this.transportClient.onErrorAndClose({\n onError: this.onError.bind(this),\n onServerClose: this.onServerClose.bind(this),\n });\n\n if (this.onMessageReceivedListener) {\n this.transportClient.onMessage(this.onMessageReceivedListener);\n }\n }\n\n private getPortList(port: number, portCandidateRule?: PortCandidateRule): Array<number> {\n if (portCandidateRule) {\n return portCandidateRule.toOrderedPortList();\n }\n return [port];\n }\n\n /**\n * 生成环境回调 ID,与 Flutter _generateSessionCallbackId 一致。\n * 同一 (fromClient, toClient) 对的多个请求共享同一 sessionCallbackId,仅首次会发送 IpcSessionSetupRequest。\n */\n private generateSessionCallbackId(request: Request): string {\n return `${request.fromClient}_${request.toClient}`;\n }\n\n /**\n * 对指定 client 执行应用层握手,与 Flutter _performHandshake 语义一致:\n * 发送握手请求后,在短超时内等待带相同 magic 与 server 角色的握手响应,成功才返回 true。\n */\n private async performHandshake(client: TransportClient): Promise<boolean> {\n logger.debug(`[ConnectionManager] 开始握手 clientName=${this.clientName}`);\n const hello = new Handshake(\n this.clientName,\n Handshake.ipcMagic,\n Handshake.clientRole,\n Handshake.ipcVersion,\n );\n const sent = await sendHandshake(client, hello);\n if (!sent) {\n return false;\n }\n\n let settled = false;\n let complete: (value: boolean) => void;\n const handshakePromise = new Promise<boolean>((resolve) => {\n complete = resolve;\n });\n const resolveOnce = (value: boolean) => {\n if (settled) return;\n settled = true;\n complete(value);\n };\n\n const onMessage = (message: string): void => {\n if (settled) return;\n // 约定:首条应用层消息若非握手响应,则判定非目标 IPC 服务,立即失败\n if (!message.includes(MessageType.HANDSHAKE)) {\n resolveOnce(false);\n return;\n }\n try {\n const hs = IpcMessageDecoder.decodeHandshake(message);\n const isTargetServer =\n hs.magic === Handshake.ipcMagic && hs.role === Handshake.serverRole;\n resolveOnce(isTargetServer);\n } catch {\n resolveOnce(false);\n }\n };\n\n client.onMessage(onMessage);\n\n const timeoutMs = 1000;\n const timeoutId = setTimeout(() => {\n resolveOnce(false);\n }, timeoutMs);\n\n try {\n const result = await handshakePromise;\n logger.debug(`[ConnectionManager] 握手结束 clientName=${this.clientName} success=${result}`);\n return result;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 019:唤醒后连接探测。立即尝试连接,失败则短间隔重试,成功即停止;支持多轮端口遍历。\n */\n private async attemptConnectionWithProbe(): Promise<boolean> {\n const intervalMs = this.settings.wakeUpProbeIntervalMs;\n const timeoutMs = this.settings.wakeUpProbeTimeoutMs;\n const start = Date.now();\n let round = 0;\n\n // eslint-disable-next-line no-constant-condition -- 连接探测循环,通过 return 退出\n while (true) {\n round += 1;\n logger.debug(\n `[ConnectionManager] 连接探测 第 ${round} 轮 clientName=${this.clientName}`,\n );\n const ok = await this.attemptConnection({\n maxConnectionAttempts: 1,\n notifyIfConnectionFailed: false,\n });\n if (ok) {\n logger.info(`客户端('${this.clientName}')连接探测成功`);\n return true;\n }\n const elapsed = Date.now() - start;\n if (elapsed >= timeoutMs) {\n logger.warn(\n `客户端('${this.clientName}')连接探测超时,已耗时 ${elapsed}ms`,\n );\n return false;\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n }\n\n private async attemptConnection(options?: {\n maxConnectionAttempts?: number;\n notifyIfConnectionFailed?: boolean;\n }): Promise<boolean> {\n const maxAttempts = options?.maxConnectionAttempts ?? 1;\n const ws = this.settings.webSocketServerEndpoint;\n if (!ws) return false;\n\n const portList = this.getPortList(ws.port, ws.portCandidateRule ?? undefined);\n const hasPortRule = portList.length > 1;\n\n if (hasPortRule) {\n // 有 portCandidateRule 时:遍历端口列表,依次尝试 9100、9101、9102...\n logger.debug(`[ConnectionManager] attemptConnection 遍历端口列表,共 ${portList.length} 个端口`);\n for (const port of portList) {\n try {\n const client = new WebSocketClient(ws.address, port, ws.path, ws.useTls);\n if (await client.connectWithServer()) {\n const ok = await this.performHandshake(client);\n if (ok) {\n await this.transportClient.close();\n this.transportClient = client;\n this.bindTransportEvents();\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await client.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n } else {\n // 无 portCandidateRule:沿用原逻辑,重试同一端口\n logger.debug(`[ConnectionManager] attemptConnection maxAttempts=${maxAttempts}`);\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n if (await this.transportClient.connectWithServer()) {\n const ok = await this.performHandshake(this.transportClient);\n if (ok) {\n const registered = await this.componentProvider.communicationAgent.register();\n if (registered) {\n logger.info(`客户端(${this.clientName})注册成功.`);\n }\n this.notifyConnectionResult(true, undefined);\n return true;\n }\n await this.transportClient.close();\n }\n } catch (e) {\n this.handleConnectionException(e);\n }\n }\n }\n\n if (options?.notifyIfConnectionFailed ?? true) {\n this.handleConnectionFailed();\n }\n return false;\n }\n\n private handleConnectionFailed(launchError?: string): void {\n const message = launchError\n ? `Connect server socket failed! Launch error: ${launchError}`\n : 'Connect server socket failed!';\n const userInfo = launchError ? { launchError } : undefined;\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_BIND_SERVER, message, userInfo),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接失败${launchError ? `: ${launchError}` : ''}`);\n }\n\n private handleConnectionException(e: unknown): void {\n this.notifyConnectionResult(\n false,\n new IpcError(\n IpcError.ERROR_BIND_SERVER_EXCEPTION,\n 'Connect server socket exception!',\n ),\n );\n logger.error(`客户端('${this.clientName}')与服务端建立连接异常: ${String(e)}`);\n }\n\n private handleAlreadyConnected(handler?: IpcConnectionCompletionHandler): void {\n if (handler) {\n handler(true, undefined);\n }\n }\n\n private shouldAttemptWakeUp(autoLaunchOverride?: boolean): boolean {\n if (typeof autoLaunchOverride === 'boolean') {\n return autoLaunchOverride;\n }\n const strategy: IpcMessageStrategy = this.settings.messageStrategy;\n return strategy.autoLaunch;\n }\n\n private setupSessionAfterConnection(\n request: Request,\n callback: IpcSessionSetupCallback,\n autoLaunch: boolean,\n ): void {\n const sessionCallbackId = this.generateSessionCallbackId(request);\n const callbacks =\n this.sessionSetupCallbacks.get(sessionCallbackId) ?? [];\n callbacks.push(callback);\n this.sessionSetupCallbacks.set(sessionCallbackId, callbacks);\n\n // 仅首次构建目标会话时发起 IpcSessionSetupRequest(与 Flutter 一致)\n if (callbacks.length === 1) {\n const setupRequest = new IpcSessionSetupRequest(\n this.clientName,\n request.toClient,\n sessionCallbackId,\n autoLaunch,\n );\n setupSession(this.transportClient, setupRequest);\n }\n }\n\n private onError(_error: unknown): void {\n logger.error(`客户端('${this.clientName}')与服务端连接出错: ${String(_error)}!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_DISCONNECTED_WITH_SERVER, 'Disconnected from server!'),\n );\n }\n\n private onServerClose(): void {\n logger.error(`客户端('${this.clientName}')断开与服务端的连接,服务端 socket 关闭!`);\n this.notifyConnectionResult(\n false,\n new IpcError(IpcError.ERROR_SERVER_SOCKET_CLOSED, 'Server socket closed!'),\n );\n }\n\n private notifyConnectionResult(success: boolean, error?: IpcError): void {\n const handlers = this.connectionHandlers;\n this.connectionHandlers = [];\n for (const handler of handlers) {\n handler(success, error ?? undefined);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket_client.d.ts","sourceRoot":"","sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAKhE;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAkD;IAClE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,YAAY,CAAsB;gBAE9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,EAAE,MAAM,GAAE,OAAe;IAQhF,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAsC3C,OAAO,CAAC,OAAO;IA2BT,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"websocket_client.d.ts","sourceRoot":"","sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAKhE;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAkD;IAClE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,YAAY,CAAsB;gBAE9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,EAAE,MAAM,GAAE,OAAe;IAQhF,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAsC3C,OAAO,CAAC,OAAO;IA2BT,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAOlD,eAAe,CAAC,SAAS,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI;IAK5F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,iBAAiB,IAAI,OAAO,CAE/B;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":["logger","isNodeEnv","WebSocketMessageChannel"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":["logger","isNodeEnv","WebSocketMessageChannel"],"mappings":"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","file":"websocket_client.js","sourcesContent":["/**\n * WebSocket 客户端,对应 Flutter lib/general/transport/websocket/websocket_client.dart WebSocketClient。\n * 与 SocketClient 保持相同对外 API;内部使用 WebSocketMessageChannel,收发经帧编解码。\n * Node 环境使用 ws,浏览器环境使用原生 WebSocket(per FR-028-009)。\n */\n\nimport { TransportClient } from '../interface/transport_client';\nimport { logger } from '../../../utils/logger';\nimport { isNodeEnv } from '../../../utils/env';\nimport { WebSocketMessageChannel } from './websocket_message_channel';\n\n/**\n * WebSocket 客户端\n */\nexport class WebSocketClient implements TransportClient {\n private readonly _address: string;\n private readonly _port: number;\n private readonly _path: string;\n private readonly _useTls: boolean;\n\n private _channel: WebSocketMessageChannel | undefined = undefined;\n private _isClientConnected = false;\n private readonly _messageCallbacks: Array<(data: string) => void> = [];\n private readonly _errorCallbacks: Array<(err: unknown) => void> = [];\n private readonly _closeCallbacks: Array<() => void> = [];\n private _unsubscribe: (() => void) | void;\n\n constructor(address: string, port: number, path: string = '/', useTls: boolean = false) {\n this._address = address;\n this._port = port;\n this._path = path;\n this._useTls = useTls;\n this._unsubscribe = undefined;\n }\n\n async connectWithServer(): Promise<boolean> {\n if (this._useTls) {\n logger.error('[WebSocket] wss 模式当前不支持(服务端未实现 TLS),请使用 ws');\n return false;\n }\n const scheme = 'ws';\n const url = `${scheme}://${this._address}:${this._port}${this._path}`;\n logger.info('[WebSocket] 正在连接 ' + url);\n try {\n const ws = isNodeEnv()\n ? (() => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const WebSocket = require('ws');\n return new WebSocket(url) as WebSocket;\n })()\n : new window.WebSocket(url);\n ws.binaryType = 'arraybuffer';\n await new Promise<void>((resolve, reject) => {\n ws.onopen = () => resolve();\n ws.onerror = () => reject(new Error('WebSocket connection failed'));\n });\n this._channel = new WebSocketMessageChannel(ws, {\n address: '0.0.0.0',\n port: 0,\n remoteAddress: this._address,\n remotePort: this._port,\n logger: undefined,\n });\n this._isClientConnected = true;\n this._listen();\n logger.info('[WebSocket] 已连接 ' + url);\n return true;\n } catch (e) {\n logger.error(`[WebSocket] 连接到服务端异常 url=${url} error=${String(e)}`);\n return false;\n }\n }\n\n private _listen(): void {\n if (this._channel == null || !this._isClientConnected) return;\n this._unsubscribe = this._channel.subscribe(\n (message: string) => {\n for (const cb of this._messageCallbacks) {\n // 解决一旦出现异常,后续消息无法处理的问题\n try {\n cb(message);\n } catch (e) {\n logger.error('[WebSocket] 消息回调异常,后续消息仍会处理: ' + String(e));\n }\n }\n },\n {\n onError: (error) => {\n logger.error('[WebSocket] 客户端监听到错误: ' + String(error));\n this._errorCallbacks.forEach((cb) => cb(error));\n },\n onDone: () => {\n this._isClientConnected = false;\n this._closeCallbacks.forEach((cb) => cb());\n },\n cancelOnError: false,\n },\n );\n }\n\n async sendData(data: string): Promise<boolean> {\n if (this._channel == null || !this._isClientConnected) {\n logger.error('[WebSocket] 发送失败,当前与服务端连接已断开');\n return false;\n }\n return this._channel.sendMessage(data);\n }\n\n onMessage(onMessage: (data: string) => void): void {\n if (this._messageCallbacks.includes(onMessage)) {\n return;\n }\n this._messageCallbacks.push(onMessage);\n }\n\n onErrorAndClose(callbacks: { onError?: (err: unknown) => void; onServerClose?: () => void }): void {\n if (callbacks.onError) this._errorCallbacks.push(callbacks.onError);\n if (callbacks.onServerClose) this._closeCallbacks.push(callbacks.onServerClose);\n }\n\n async close(): Promise<void> {\n if (typeof this._unsubscribe === 'function') {\n this._unsubscribe();\n }\n await this._channel?.close();\n this._channel = undefined;\n this._isClientConnected = false;\n }\n\n get isClientConnected(): boolean {\n return this._isClientConnected;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../../../src/moonbridge-ipc/general/transport/websocket/websocket_client.ts"],"names":[],"mappings":"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","file":"websocket_client.mjs","sourcesContent":["/**\n * WebSocket 客户端,对应 Flutter lib/general/transport/websocket/websocket_client.dart WebSocketClient。\n * 与 SocketClient 保持相同对外 API;内部使用 WebSocketMessageChannel,收发经帧编解码。\n * Node 环境使用 ws,浏览器环境使用原生 WebSocket(per FR-028-009)。\n */\n\nimport { TransportClient } from '../interface/transport_client';\nimport { logger } from '../../../utils/logger';\nimport { isNodeEnv } from '../../../utils/env';\nimport { WebSocketMessageChannel } from './websocket_message_channel';\n\n/**\n * WebSocket 客户端\n */\nexport class WebSocketClient implements TransportClient {\n private readonly _address: string;\n private readonly _port: number;\n private readonly _path: string;\n private readonly _useTls: boolean;\n\n private _channel: WebSocketMessageChannel | undefined = undefined;\n private _isClientConnected = false;\n private readonly _messageCallbacks: Array<(data: string) => void> = [];\n private readonly _errorCallbacks: Array<(err: unknown) => void> = [];\n private readonly _closeCallbacks: Array<() => void> = [];\n private _unsubscribe: (() => void) | void;\n\n constructor(address: string, port: number, path: string = '/', useTls: boolean = false) {\n this._address = address;\n this._port = port;\n this._path = path;\n this._useTls = useTls;\n this._unsubscribe = undefined;\n }\n\n async connectWithServer(): Promise<boolean> {\n if (this._useTls) {\n logger.error('[WebSocket] wss 模式当前不支持(服务端未实现 TLS),请使用 ws');\n return false;\n }\n const scheme = 'ws';\n const url = `${scheme}://${this._address}:${this._port}${this._path}`;\n logger.info('[WebSocket] 正在连接 ' + url);\n try {\n const ws = isNodeEnv()\n ? (() => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const WebSocket = require('ws');\n return new WebSocket(url) as WebSocket;\n })()\n : new window.WebSocket(url);\n ws.binaryType = 'arraybuffer';\n await new Promise<void>((resolve, reject) => {\n ws.onopen = () => resolve();\n ws.onerror = () => reject(new Error('WebSocket connection failed'));\n });\n this._channel = new WebSocketMessageChannel(ws, {\n address: '0.0.0.0',\n port: 0,\n remoteAddress: this._address,\n remotePort: this._port,\n logger: undefined,\n });\n this._isClientConnected = true;\n this._listen();\n logger.info('[WebSocket] 已连接 ' + url);\n return true;\n } catch (e) {\n logger.error(`[WebSocket] 连接到服务端异常 url=${url} error=${String(e)}`);\n return false;\n }\n }\n\n private _listen(): void {\n if (this._channel == null || !this._isClientConnected) return;\n this._unsubscribe = this._channel.subscribe(\n (message: string) => {\n for (const cb of this._messageCallbacks) {\n // 解决一旦出现异常,后续消息无法处理的问题\n try {\n cb(message);\n } catch (e) {\n logger.error('[WebSocket] 消息回调异常,后续消息仍会处理: ' + String(e));\n }\n }\n },\n {\n onError: (error) => {\n logger.error('[WebSocket] 客户端监听到错误: ' + String(error));\n this._errorCallbacks.forEach((cb) => cb(error));\n },\n onDone: () => {\n this._isClientConnected = false;\n this._closeCallbacks.forEach((cb) => cb());\n },\n cancelOnError: false,\n },\n );\n }\n\n async sendData(data: string): Promise<boolean> {\n if (this._channel == null || !this._isClientConnected) {\n logger.error('[WebSocket] 发送失败,当前与服务端连接已断开');\n return false;\n }\n return this._channel.sendMessage(data);\n }\n\n onMessage(onMessage: (data: string) => void): void {\n if (this._messageCallbacks.includes(onMessage)) {\n return;\n }\n this._messageCallbacks.push(onMessage);\n }\n\n onErrorAndClose(callbacks: { onError?: (err: unknown) => void; onServerClose?: () => void }): void {\n if (callbacks.onError) this._errorCallbacks.push(callbacks.onError);\n if (callbacks.onServerClose) this._closeCallbacks.push(callbacks.onServerClose);\n }\n\n async close(): Promise<void> {\n if (typeof this._unsubscribe === 'function') {\n this._unsubscribe();\n }\n await this._channel?.close();\n this._channel = undefined;\n this._isClientConnected = false;\n }\n\n get isClientConnected(): boolean {\n return this._isClientConnected;\n }\n}\n"]}
|
|
@@ -140,13 +140,13 @@ class RealMoonBridgeIpcServer {
|
|
|
140
140
|
} else if (actualType === message_types.MessageType.SESSION_SETUP_REQUEST) {
|
|
141
141
|
messageType = message_types.MessageType.SESSION_SETUP_REQUEST;
|
|
142
142
|
this._onSessionSetupRequest(ipc_message_decoder.IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
143
|
-
} else if (actualType === message_types.MessageType.HANDSHAKE) {
|
|
143
|
+
} else if (actualType === message_types.MessageType.SESSION_SETUP_RESPONSE) ; else if (actualType === message_types.MessageType.HANDSHAKE) {
|
|
144
144
|
messageType = message_types.MessageType.HANDSHAKE;
|
|
145
145
|
this._onHandshake(ipc_message_decoder.IpcMessageDecoder.decodeHandshake(message), client);
|
|
146
146
|
} else if (actualType === message_types.MessageType.PING) {
|
|
147
147
|
messageType = message_types.MessageType.PING;
|
|
148
148
|
this._onPing(ipc_message_decoder.IpcMessageDecoder.decodePing(message));
|
|
149
|
-
} else
|
|
149
|
+
} else {
|
|
150
150
|
logger.logger.error(`\u65E0\u6CD5\u8BC6\u522B\u7684\u6D88\u606F\u7C7B\u578B: ${message}`);
|
|
151
151
|
}
|
|
152
152
|
const clientName = (_b = this._getClientName(client)) != null ? _b : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":["ClientIdentityManager","_a","logger","WebSocketServer","MessageType","IpcMessageDecoder","sendEvent","sendError","sendRequest","sendResponse","IpcSessionSetupResponse","handshake","Handshake","sendHandshake","sendPing","Ping","PlatformAppLauncherFactory","sendSessionSetupResponse"],"mappings":";;;;;;;;;;;;;AAyCO,MAAM,uBAAA,CAAuD;AAAA,EAgBlE,YACE,UAAA,EACA,uBAAA,EACA,oBACA,uBAAA,EACA,oBAAA,EACA,qBACA,iBAAA,EACA;AAhBF,IAAA,IAAA,CAAiB,gBAAA,uBAAuB,GAAA,EAAkC;AAC1E,IAAA,IAAA,CAAiB,uBAAA,uBAA8B,GAAA,EAAoB;AACnE,IAAA,IAAA,CAAiB,sBAAA,GAAyB,IAAIA,6CAAA,EAAsB;AACpE,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAA2C;AAC5E,IAAA,IAAA,CAAiB,qBAAA,uBAA4B,GAAA,EAAsC;AAajF,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,wBAAA,GAA2B,uBAAA;AAChC,IAAA,IAAA,CAAK,mBAAA,GAAsB,kBAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,GAAwB,oBAAA;AAC7B,IAAA,IAAA,CAAK,oBAAA,GAAuB,mBAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAqB,iBAAA;AAE1B,IAAA,MAAM,SAAA,GAAY,4DAA2B,EAAC;AAC9C,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAA,CAAK,sBAAA,CAAuB,0BAA0B,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAA,GAA0B;AAC9B,IAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAiC;AApFhE,MAAA,IAAA,EAAA;AAqFM,MAAA,IAAI,UAAA,GAAA,CAAa,EAAA,GAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAA1B,IAAA,GAAA,EAAA,GAA+B,EAAA;AAChD,MAAA,MAAA,CAAO,SAAA;AAAA,QACL,CAAC,OAAA,KAAoB;AAvF7B,UAAA,IAAAC,GAAAA;AAwFU,UAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,OAAO,CAAA;AAC/B,UAAA,IAAI,eAAe,EAAA,EAAI;AACrB,YAAA,UAAA,GAAA,CAAaA,MAAA,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,KAA1B,OAAAA,GAAAA,GAA+B,EAAA;AAAA,UAC9C;AAAA,QACF,CAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,YAAAC,aAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,EAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,UACtC,CAAA;AAAA,UACA,QAAQ,MAAM;AAjGxB,YAAA,IAAAD,GAAAA;AAkGY,YAAAC,aAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAO,UAAU,CAAA,yBAAA,CAAO,CAAA;AACrC,YAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AACzB,YAAA,CAAAD,GAAAA,GAAA,IAAA,CAAK,qBAAA,KAAL,IAAA,GAAA,MAAA,GAAAA,IAAA,IAAA,CAAA,IAAA,EAA6B,UAAA,CAAA;AAAA,UAC/B,CAAA;AAAA,UACA,aAAA,EAAe;AAAA;AACjB,OACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,4BAA4B,IAAA,EAAM;AACzC,MAAA,MAAM,KAAK,IAAA,CAAK,wBAAA;AAChB,MAAA,MAAM,QAAA,GACJ,EAAA,CAAG,iBAAA,IAAqB,IAAA,GACpB,EAAA,CAAG,kBAAkB,iBAAA,EAAkB,GACvC,CAAC,EAAA,CAAG,IAAI,CAAA;AAEd,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,MAAA,GAAS,IAAIE,gCAAA,CAAgB,EAAA,CAAG,OAAA,EAAS,MAAM,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,CAAA;AACtE,QAAA,IAAI,MAAM,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA,EAAG;AAC/C,UAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,MAAA,MAAM,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,aAAA,GAAoC;AAtI1C,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuII,IAAA,OAAA,CAAO,sBAAK,gBAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAuB,iBAAA,KAAvB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0C,OAA1C,IAAA,GAAA,EAAA,GAAgD,MAAA;AAAA,EACzD;AAAA,EAEA,IAAI,UAAA,GAAiC;AA1IvC,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2II,IAAA,OAAA,CAAO,sBAAK,gBAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAuB,iBAAA,KAAvB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0C,SAA1C,IAAA,GAAA,EAAA,GAAkD,MAAA;AAAA,EAC3D;AAAA,EAEQ,UAAA,CAAW,gBAAgC,MAAA,EAAoC;AACrF,IAAA,MAAM,aAAa,cAAA,CAAe,UAAA;AAClC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,aAAA,EAAe,UAAU,CAAA;AAC1D,IAAAD,aAAA,CAAO,IAAA,CAAK,CAAA,sCAAA,EAAW,UAAU,CAAA,CAAE,CAAA;AAAA,EACrC;AAAA,EAEQ,cAAc,MAAA,EAAoC;AACxD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,aAAa,CAAA;AACjE,IAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,aAAa,CAAA;AACjD,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,UAAU,CAAA;AAAA,IACzC;AACA,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,sCAAA,EAAW,UAAU,CAAA,CAAE,CAAA;AAAA,EACrC;AAAA,EAEQ,eAAe,MAAA,EAAkD;AACvE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,aAAa,CAAA;AAAA,EACvD;AAAA,EAEQ,kBAAkB,MAAA,EAAsC;AAC9D,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AAAA,EACrD;AAAA,EAEQ,UAAA,CAAW,QAA8B,OAAA,EAAuB;AAzK1E,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA0KI,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,+DAAA,EAAqB,OAAO,CAAA,CAAE,CAAA;AAE1C,IAAA,MAAM,KAAA,GAA2C,CAAC,GAAA,KAAQ,MAAA,CAAO,YAAY,GAAG,CAAA;AAChF,IAAA,IAAA,CAAA,CAAI,EAAA,GAAA,IAAA,CAAK,oBAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAA4B,KAAA,EAAO,cAAa,IAAA,EAAM;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAcE,yBAAA,CAAY,OAAA;AAE9B,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,CAAM,wBAAwB,CAAA;AAC/D,IAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,gBAAA,CAAiB,CAAC,CAAA,GAAI,IAAA;AAE5D,IAAA,IAAI,UAAA,KAAeA,0BAAY,YAAA,EAAc;AAC3C,MAAA,WAAA,GAAcA,yBAAA,CAAY,YAAA;AAC1B,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQC,qCAAA,CAAkB,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,IAC5E,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,cAAA,EAAgB;AACpD,MAAA,WAAA,GAAcA,yBAAA,CAAY,cAAA;AAC1B,MAAA,IAAA,CAAK,iBAAA,CAAkBC,qCAAA,CAAkB,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAAA,IACxE,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,KAAA,EAAO;AAC3C,MAAA,WAAA,GAAcA,yBAAA,CAAY,KAAA;AAC1B,MAAA,IAAA,CAAK,QAAA,CAASC,qCAAA,CAAkB,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,KAAA,EAAO;AAC3C,MAAA,WAAA,GAAcA,yBAAA,CAAY,KAAA;AAC1B,MAAA,IAAA,CAAK,QAAA,CAASC,qCAAA,CAAkB,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,OAAA,EAAS;AAC7C,MAAA,WAAA,GAAcA,yBAAA,CAAY,OAAA;AAC1B,MAAA,IAAA,CAAK,UAAA,CAAWC,qCAAA,CAAkB,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,QAAA,EAAU;AAC9C,MAAA,WAAA,GAAcA,yBAAA,CAAY,QAAA;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAYC,qCAAA,CAAkB,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,IAC5D,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,qBAAA,EAAuB;AAC3D,MAAA,WAAA,GAAcA,yBAAA,CAAY,qBAAA;AAC1B,MAAA,IAAA,CAAK,sBAAA,CAAuBC,qCAAA,CAAkB,yBAAA,CAA0B,OAAO,CAAC,CAAA;AAAA,IAClF,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,SAAA,EAAW;AAC/C,MAAA,WAAA,GAAcA,yBAAA,CAAY,SAAA;AAC1B,MAAA,IAAA,CAAK,YAAA,CAAaC,qCAAA,CAAkB,eAAA,CAAgB,OAAO,GAAG,MAAM,CAAA;AAAA,IACtE,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,IAAA,EAAM;AAC1C,MAAA,WAAA,GAAcA,yBAAA,CAAY,IAAA;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQC,qCAAA,CAAkB,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,UAAA,KAAeD,yBAAA,CAAY,sBAAA,EAAwB,CAG9D,MAAO;AACL,MAAAF,aAAA,CAAO,KAAA,CAAM,CAAA,wDAAA,EAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,UAAA,GAAA,CAAa,EAAA,GAAA,IAAA,CAAK,cAAA,CAAe,MAAM,MAA1B,IAAA,GAAA,EAAA,GAA+B,EAAA;AAClD,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,kBAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAA0B,UAAA,EAAY,WAAA,EAAa,OAAA,CAAA;AAAA,EACrD;AAAA,EAEQ,eAAA,CAAgB,QAA8B,YAAA,EAAkC;AACtF,IAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,uBAAA,CAAwB,UAAU,CAAA,EAAG;AAC7C,MAAAA,aAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAAO,UAAU,CAAA,yEAAA,CAAe,CAAA;AAC7C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,iBAAA,CAAkB,UAAU,CAAA;AACzE,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAmB,UAAU,CAAA;AAClC,IAAA,IAAA,CAAK,6BAA6B,UAAU,CAAA;AAC5C,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAAO,UAAU,CAAA,+BAAA,CAAQ,CAAA;AAAA,EACvC;AAAA,EAEQ,kBAAkB,cAAA,EAAsC;AAC9D,IAAA,MAAM,aAAa,cAAA,CAAe,UAAA;AAClC,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,UAAU,CAAA;AACvC,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,UAAU,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,IAClC;AACA,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAAO,UAAU,CAAA,mBAAA,CAAM,CAAA;AAAA,EACrC;AAAA,EAEQ,SAAS,KAAA,EAAoB;AACnC,IAAA,MAAM,aAAa,CAAC,GAAG,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AACrD,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAAI,0CAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,IACzB;AACA,IAAAJ,aAAA,CAAO,IAAA,CAAK,CAAA,2JAAA,EAA2C,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACjE;AAAA,EAEQ,SAAS,KAAA,EAAoB;AACnC,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,mHAAA,EAA4B,KAAK,CAAA,CAAA,CAAG,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,UAAU,CAAA;AAC7D,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAAK,0CAAA,CAAU,YAAY,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,WAAW,OAAA,EAAwB;AACzC,IAAAL,aAAA,CAAO,IAAA,CAAK,CAAA,qHAAA,EAA8B,OAAO,CAAA,CAAA,CAAG,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAC3D,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAAM,4CAAA,CAAY,UAAU,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,YAAY,QAAA,EAA0B;AAC5C,IAAAN,aAAA,CAAO,IAAA,CAAK,CAAA,sHAAA,EAA+B,QAAQ,CAAA,CAAA,CAAG,CAAA;AACtD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,UAAU,CAAA;AAChE,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAAO,6CAAA,CAAa,YAAY,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,uBAAuB,OAAA,EAAuC;AACpE,IAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,uBAAA,CAAwB,YAAY,CAAA,EAAG;AAC/C,MAAAP,aAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAS,YAAY,CAAA,sCAAA,CAAU,CAAA;AAC5C,MAAA,IAAA,CAAK,0BAA0B,OAAA,EAASQ,qCAAA,CAAwB,OAAA,EAAS,CAAA,oBAAA,EAAuB,YAAY,CAAA,SAAA,CAAW,CAAA;AACvH,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,2BAAA,CAA4B,OAAA,EAAS,YAAY,CAAA,EAAG;AAC3D,MAAAR,aAAA,CAAO,IAAA,CAAK,CAAA,qCAAA,EAAU,YAAY,CAAA,gCAAA,CAAS,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,YAAY,CAAA;AACvD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,YAAA,EAAc,KAAK,CAAA;AAAA,IACpD;AACA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAAW,YAAY,CAAA,4CAAA,CAAW,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,wJAAA,EAAwC,YAAY,CAAA,CAAA,CAAG,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,uDAAA,EAAa,YAAY,CAAA,EAAA,CAAI,CAAA;AACzC,MAAA,IAAA,CAAK,oBAAoB,YAAY,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,6DAAA,EAAc,YAAY,CAAA,4CAAA,CAAW,CAAA;AACjD,MAAA,IAAA,CAAK,0BAA0B,OAAA,EAASQ,qCAAA,CAAwB,OAAA,EAAS,CAAA,cAAA,EAAiB,YAAY,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC9I;AAAA,EACF;AAAA,EAEQ,QAAQ,KAAA,EAAmB;AACjC,IAAAR,aAAA,CAAO,KAAK,sCAAa,CAAA;AAAA,EAC3B;AAAA,EAEQ,YAAA,CAAaS,aAAsB,MAAA,EAAoC;AAC7E,IAAA,IAAIA,WAAA,CAAU,KAAA,KAAUC,mBAAA,CAAU,QAAA,EAAU;AAC1C,MAAAV,aAAA,CAAO,IAAA,CAAK,CAAA,iDAAA,EAAYS,WAAA,CAAU,KAAK,CAAA,oHAAA,CAAuB,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,IAAIA,WAAA,CAAU,IAAA,KAASC,mBAAA,CAAU,UAAA,EAAY;AAC3C,MAAAV,aAAA,CAAO,IAAA,CAAK,CAAA,yDAAA,EAAoBS,WAAA,CAAU,IAAI,CAAA,wDAAA,CAAa,CAAA;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,IAAIC,mBAAA;AAAA,MACdD,WAAA,CAAU,UAAA;AAAA,MACVC,mBAAA,CAAU,QAAA;AAAA,MACVA,mBAAA,CAAU,UAAA;AAAA,MACVA,mBAAA,CAAU;AAAA,KACZ;AACA,IAAAC,8CAAA,CAAc,QAAQ,GAAG,CAAA;AACzB,IAAAX,aAAA,CAAO,IAAA,CAAK,CAAA,oFAAA,EAA2B,GAAA,CAAI,UAAU,CAAA,SAAA,EAAY,IAAI,KAAK,CAAA,WAAA,EAAc,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EACvG;AAAA,EAEQ,wBAAwB,UAAA,EAA6B;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,iBAAA,CAAkB,UAAU,CAAA,IAAK,IAAA;AAC7E,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAAA,aAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAO,UAAU,CAAA,4FAAA,CAAmB,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,2BAAA,CAA4B,SAAiC,YAAA,EAA+B;AAClG,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,YAAY,CAAA;AAC3D,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,IAAI;AACF,QAAAY,yCAAA,CAAS,YAAA,EAAc,IAAIC,SAAA,CAAK,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrD,QAAA,IAAA,CAAK,0BAA0B,OAAA,EAASL,qCAAA,CAAwB,OAAA,EAAS,CAAA,8BAAA,EAAiC,YAAY,CAAA,EAAA,CAAI,CAAA;AAC1H,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAAR,aAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,YAAY,CAAA,eAAA,CAAO,CAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,oBAAoB,YAAA,EAAqC;AACrE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,iBAAA,CAAkB,YAAY,CAAA;AACjF,IAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,MAAAA,aAAA,CAAO,MAAM,6FAAkB,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,mBAAA,IAAuB,IAAA,IAAQ,KAAK,mBAAA,CAAoB,cAAc,MAAM,IAAA,EAAM;AACzF,MAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,yEAAA,EAAgB,YAAY,CAAA,EAAA,CAAI,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,mEAAA,EAAe,YAAY,CAAA,EAAA,CAAI,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAcc,iDAA2B,MAAA,CAAO;AAAA,UACpD,eAAe,cAAA,CAAe,mBAAA;AAAA,UAC9B,qBAAqB,cAAA,CAAe;AAAA,SACrC,CAAA;AACD,QAAA,IAAI,MAAM,WAAA,CAAY,YAAA,EAAa,EAAG;AACpC,UAAAd,aAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAS,YAAY,CAAA,8DAAA,CAAc,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAAA,aAAA,CAAO,IAAA,CAAK,CAAA,uDAAA,EAAa,YAAY,CAAA,EAAA,CAAI,CAAA;AACzC,UAAA,MAAM,YAAY,SAAA,EAAU;AAAA,QAC9B;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAAA,aAAA,CAAO,KAAA,CAAM,CAAA,wEAAA,EAAe,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1C;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAC3C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,QAAAA,aAAA,CAAO,KAAA,CAAM,CAAA,2CAAA,EAAW,YAAY,CAAA,aAAA,CAAK,CAAA;AACzC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,YAAY,CAAA;AACzD,QAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,YAAY,CAAA;AAC9C,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,YAAY,CAAA;AAClC,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,YAAA,IAAA,CAAK,0BAA0B,GAAA,EAAKQ,qCAAA,CAAwB,OAAA,EAAS,CAAA,cAAA,EAAiB,YAAY,CAAA,oBAAA,CAAsB,CAAA;AAAA,UAC1H;AAAA,QACF,CAAA,MAAO;AACL,UAAAR,aAAA,CAAO,MAAM,2HAAuB,CAAA;AAAA,QACtC;AAAA,MACF,GAAG,GAAM,CAAA;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAA,EAAc,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,yBAAA,CAA0B,OAAA,EAAiC,MAAA,EAAgB,OAAA,EAAuB;AACxG,IAAA,MAAM,WAAW,IAAIQ,qCAAA;AAAA,MACnB,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,YAAY,CAAA;AACnE,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAAR,aAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,qCAAA,EAAU,WAAWQ,qCAAA,CAAwB,OAAA,GAAU,eAAA,GAAQ,eAAK,CAAA,CAAE,CAAA;AACjH,MAAAO,yDAAA,CAAyB,cAAc,QAAQ,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAAf,aAAA,CAAO,KAAA,CAAM,CAAA,4DAAA,EAAa,OAAA,CAAQ,YAAY,CAAA,6DAAA,CAAa,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,mBAAmB,UAAA,EAA0B;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,6BAA6B,UAAA,EAA0B;AAC7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAA;AACvD,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,UAAU,CAAA;AAC5C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,QAAA,MAAM,WAAW,IAAIQ,qCAAA;AAAA,UACnB,OAAA,CAAQ,YAAA;AAAA,UACR,OAAA,CAAQ,YAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACRA,qCAAA,CAAwB,OAAA;AAAA,UACxB,iCAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,YAAY,CAAA;AACnE,QAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,UAAAR,aAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,sCAAA,CAAU,CAAA;AACrD,UAAAe,yDAAA,CAAyB,cAAc,QAAQ,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAAf,aAAA,CAAO,KAAA,CAAM,CAAA,4DAAA,EAAa,OAAA,CAAQ,YAAY,CAAA,6DAAA,CAAa,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF","file":"moonbridge_ipc_server.internal.js","sourcesContent":["/**\n * MoonBridge IPC 服务器实现类\n *\n * 该类用于管理 IPC 服务器,包括启动服务器、处理客户端连接和消息等功能。\n */\n\nimport type { SerialMessageChannel } from '../../general/transport/interface/serial_message_channel';\nimport {\n sendResponse,\n sendRequest,\n sendEvent,\n sendError,\n sendPing,\n sendHandshake,\n sendSessionSetupResponse,\n} from '../../general/transport/interface/serial_message_channel_extension';\nimport { WebSocketServer } from '../../general/transport/websocket/websocket_server';\nimport { IpcMessageDecoder } from '../../general/encode/ipc_message_decoder';\nimport { MessageType } from '../../general/message/constants/message_types';\nimport { Handshake } from '../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../general/message/session_setup';\nimport { PlatformAppLauncherFactory } from '../../general/app_launch/platform_app_launcher';\nimport type { WebSocketServerEndpoint } from '../../general/config/websocket_server_endpoint';\nimport type {\n MoonBridgeIpcServer,\n WakeAppInterceptor,\n DisconnectedCallback,\n MessagePreprocessor,\n OnMessageReceived,\n} from '../moonbridge_ipc_server';\nimport type { ClientIdentity, ClientIdentityProvider } from '../credential/client_identity';\nimport { ClientIdentityManager } from './identity/client_identity_manager';\nimport type { Registration } from '../../general/message/registration';\nimport type { Unregistration } from '../../general/message/unregistration';\nimport type { Event } from '../../general/message/event';\nimport type { Error } from '../../general/message/error';\nimport type { Request } from '../../general/message/request';\nimport type { Response } from '../../general/message/response';\nimport { Ping } from '../../general/message/ping';\nimport { logger } from '../../utils/logger';\n\nexport class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {\n private readonly _serverName: string;\n private readonly _wakeAppInterceptor?: WakeAppInterceptor;\n private readonly _onClientDisconnected?: DisconnectedCallback;\n private readonly _messagePreprocessor?: MessagePreprocessor;\n private readonly _onMessageReceived?: OnMessageReceived;\n private readonly _webSocketServerEndpoint?: WebSocketServerEndpoint;\n\n private readonly _clientSocketMap = new Map<string, SerialMessageChannel>();\n private readonly _addressToClientNameMap = new Map<string, string>();\n private readonly _clientIdentityManager = new ClientIdentityManager();\n private readonly _timerMap = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly _sessionSetupRequests = new Map<string, IpcSessionSetupRequest[]>();\n\n private _webSocketServer?: WebSocketServer;\n\n constructor(\n serverName: string,\n webSocketServerEndpoint?: WebSocketServerEndpoint,\n wakeAppInterceptor?: WakeAppInterceptor,\n clientIdentityProviders?: ClientIdentityProvider[],\n onClientDisconnected?: DisconnectedCallback,\n messagePreprocessor?: MessagePreprocessor,\n onMessageReceived?: OnMessageReceived,\n ) {\n this._serverName = serverName;\n this._webSocketServerEndpoint = webSocketServerEndpoint;\n this._wakeAppInterceptor = wakeAppInterceptor;\n this._onClientDisconnected = onClientDisconnected;\n this._messagePreprocessor = messagePreprocessor;\n this._onMessageReceived = onMessageReceived;\n\n const providers = clientIdentityProviders ?? [];\n for (const p of providers) {\n this._clientIdentityManager.addClientIdentityProvider(p);\n }\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n async start(): Promise<boolean> {\n const onClientConnected = (client: SerialMessageChannel) => {\n let clientName = this._getClientName(client) ?? '';\n client.subscribe(\n (message: string) => {\n this._onMessage(client, message);\n if (clientName === '') {\n clientName = this._getClientName(client) ?? '';\n }\n },\n {\n onError: (err) => {\n logger.error(`客户端错误: ${String(err)}`);\n },\n onDone: () => {\n logger.error(`客户端 ${clientName} 断开连接`);\n this._removeClient(client);\n this._onClientDisconnected?.(clientName);\n },\n cancelOnError: false,\n },\n );\n };\n\n if (this._webSocketServerEndpoint != null) {\n const ep = this._webSocketServerEndpoint;\n const portList =\n ep.portCandidateRule != null\n ? ep.portCandidateRule.toOrderedPortList()\n : [ep.port];\n\n for (const port of portList) {\n const server = new WebSocketServer(ep.address, port, { path: ep.path });\n if (await server.startServer(onClientConnected)) {\n this._webSocketServer = server;\n return true;\n }\n }\n }\n\n this._webSocketServer = undefined;\n return false;\n }\n\n async stop(): Promise<void> {\n if (this._webSocketServer != undefined) {\n await this._webSocketServer.close();\n this._webSocketServer = undefined;\n }\n }\n\n get serverAddress(): string | undefined {\n return this._webSocketServer?.serverAddressInfo?.ip ?? undefined;\n }\n\n get serverPort(): number | undefined {\n return this._webSocketServer?.serverAddressInfo?.port ?? undefined;\n }\n\n private _addClient(clientIdentity: ClientIdentity, client: SerialMessageChannel): void {\n const clientName = clientIdentity.clientName;\n const clientAddress = this._getClientAddress(client);\n this._clientSocketMap.set(clientName, client);\n this._addressToClientNameMap.set(clientAddress, clientName);\n logger.info(`客户端已连接: ${clientName}`);\n }\n\n private _removeClient(client: SerialMessageChannel): void {\n const clientAddress = this._getClientAddress(client);\n const clientName = this._addressToClientNameMap.get(clientAddress);\n this._addressToClientNameMap.delete(clientAddress);\n if (clientName != null) {\n this._clientSocketMap.delete(clientName);\n }\n logger.info(`客户端已断开: ${clientName}`);\n }\n\n private _getClientName(client: SerialMessageChannel): string | undefined {\n const clientAddress = this._getClientAddress(client);\n return this._addressToClientNameMap.get(clientAddress);\n }\n\n private _getClientAddress(client: SerialMessageChannel): string {\n return `${client.remoteAddress}:${client.remotePort}`;\n }\n\n private _onMessage(client: SerialMessageChannel, message: string): void {\n logger.info(`服务端接收到消息,message: ${message}`);\n\n const reply: (msg: string) => Promise<boolean> = (msg) => client.sendMessage(msg);\n if (this._messagePreprocessor?.(reply, message) === true) {\n return;\n }\n\n let messageType = MessageType.UNKNOWN;\n\n const messageTypeMatch = message.match(/\"type\"\\s*:\\s*\"([^\"]+)\"/);\n const actualType = messageTypeMatch ? messageTypeMatch[1] : null;\n\n if (actualType === MessageType.REGISTRATION) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (actualType === MessageType.UNREGISTRATION) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (actualType === MessageType.EVENT) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (actualType === MessageType.ERROR) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (actualType === MessageType.REQUEST) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (actualType === MessageType.RESPONSE) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (actualType === MessageType.HANDSHAKE) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (actualType === MessageType.PING) {\n messageType = MessageType.PING;\n this._onPing(IpcMessageDecoder.decodePing(message));\n } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\n } else {\n logger.error(`无法识别的消息类型: ${message}`);\n }\n\n const clientName = this._getClientName(client) ?? '';\n this._onMessageReceived?.(clientName, messageType, message);\n }\n\n private _onRegistration(client: SerialMessageChannel, registration: Registration): void {\n const clientName = registration.clientName;\n if (!this._validateClientIdentity(clientName)) {\n logger.error(`客户端(${clientName})不在白名单中,注册失败.`);\n return;\n }\n const identity = this._clientIdentityManager.getClientIdentity(clientName)!;\n this._addClient(identity, client);\n this._cancelClientTimer(clientName);\n this._processSessionSetupRequests(clientName);\n logger.info(`客户端(${clientName})注册成功.`);\n }\n\n private _onUnregistration(unregistration: Unregistration): void {\n const clientName = unregistration.clientName;\n this._clientSocketMap.delete(clientName);\n this._sessionSetupRequests.delete(clientName);\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n logger.info(`客户端(${clientName})注销.`);\n }\n\n private _onEvent(event: Event): void {\n const allClients = [...this._clientSocketMap.values()];\n for (const client of allClients) {\n sendEvent(client, event);\n }\n logger.info(`接收到 EventBus 事件,并转发给处于连接状态的所有客户端,event: ${event}.`);\n }\n\n private _onError(error: Error): void {\n logger.info(`接收到错误消息,并转发给请求客户端,error: ${error}.`);\n const fromClient = this._clientSocketMap.get(error.fromClient);\n if (fromClient != null) {\n sendError(fromClient, error);\n }\n }\n\n private _onRequest(request: Request): void {\n logger.info(`接收到请求消息,并转发给目标客户端,request: ${request}.`);\n const toClient = this._clientSocketMap.get(request.toClient);\n if (toClient != null) {\n sendRequest(toClient, request);\n }\n }\n\n private _onResponse(response: Response): void {\n logger.info(`接收到响应消息,并转发给请求客户端,response: ${response}.`);\n const fromClient = this._clientSocketMap.get(response.fromClient);\n if (fromClient != null) {\n sendResponse(fromClient, response);\n }\n }\n\n private _onSessionSetupRequest(request: IpcSessionSetupRequest): void {\n const targetClient = request.targetClient;\n if (!this._validateClientIdentity(targetClient)) {\n logger.error(`目标客户端(${targetClient})不在白名单内!`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Match target client(${targetClient}) failed!`);\n return;\n }\n if (this._handleExistingTargetClient(request, targetClient)) {\n logger.info(`与目标客户端(${targetClient})会话连接中.`);\n return;\n }\n let queue = this._sessionSetupRequests.get(targetClient);\n if (queue == null) {\n queue = [];\n this._sessionSetupRequests.set(targetClient, queue);\n }\n queue.push(request);\n logger.info(`缓存目标客户端(${targetClient})唤醒动作至队列.`);\n if (queue.length > 1) {\n logger.info(`正在尝试唤醒目标客户端进程,追加回调至队列中,targetClient: ${targetClient}.`);\n return;\n }\n if (request.autoLaunch) {\n logger.info(`尝试唤醒目标客户端(${targetClient}).`);\n this._wakeUpTargetClient(targetClient);\n } else {\n logger.info(`不尝试唤醒目标客户端(${targetClient}),直接返回失败.`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Target client(${targetClient}) was dead, and wake up is disabled!`);\n }\n }\n\n private _onPing(_ping: Ping): void {\n logger.info('接收到 Ping 消息');\n }\n\n private _onHandshake(handshake: Handshake, client: SerialMessageChannel): void {\n if (handshake.magic !== Handshake.ipcMagic) {\n logger.warn(`收到未知握手魔数(${handshake.magic}),忽略本次握手请求,可能是其他服务误连.`);\n return;\n }\n if (handshake.role !== Handshake.clientRole) {\n logger.warn(`收到非 client 角色的握手(${handshake.role}),忽略本次握手请求.`);\n return;\n }\n const ack = new Handshake(\n handshake.clientName,\n Handshake.ipcMagic,\n Handshake.serverRole,\n Handshake.ipcVersion,\n );\n sendHandshake(client, ack);\n logger.info(`完成与客户端的握手确认,clientName: ${ack.clientName}, magic: ${ack.magic}, version: ${ack.version}`);\n }\n\n private _validateClientIdentity(clientName: string): boolean {\n const isValid = this._clientIdentityManager.getClientIdentity(clientName) != null;\n if (!isValid) {\n logger.fatal(`客户端(${clientName})不在白名单中,可能存在非法访问!`);\n }\n return isValid;\n }\n\n private _handleExistingTargetClient(request: IpcSessionSetupRequest, targetClient: string): boolean {\n const targetSocket = this._clientSocketMap.get(targetClient);\n if (targetSocket != null) {\n try {\n sendPing(targetSocket, new Ping(request.sourceClient));\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.success, `Connecting with target client(${targetClient})!`);\n return true;\n } catch (e) {\n logger.error(`Ping target client(${targetClient}) 失败!`);\n }\n }\n return false;\n }\n\n private async _wakeUpTargetClient(targetClient: string): Promise<void> {\n const clientIdentity = this._clientIdentityManager.getClientIdentity(targetClient);\n if (clientIdentity == null) {\n logger.fatal('唤醒目标客户端,白名单校验失败!');\n return;\n }\n if (this._wakeAppInterceptor != null && this._wakeAppInterceptor(clientIdentity) === true) {\n logger.info(`自定义方式唤醒目标客户端(${targetClient}).`);\n } else {\n logger.info(`默认方式唤醒目标客户端(${targetClient}).`);\n try {\n const appLauncher = PlatformAppLauncherFactory.create({\n appIdentifier: clientIdentity.appLaunchIdentifier,\n appInstallationPath: clientIdentity.appInstallationPath,\n });\n if (await appLauncher.isAppRunning()) {\n logger.warn(`目标客户端(${targetClient})处于存活态,等待注册!`);\n } else {\n logger.info(`尝试唤醒目标客户端(${targetClient})!`);\n await appLauncher.launchApp();\n }\n } catch (e) {\n logger.fatal(`唤醒目标客户端发生异常:${String(e)}!`);\n }\n }\n let timer = this._timerMap.get(targetClient);\n if (timer == null) {\n timer = setTimeout(() => {\n logger.error(`唤醒目标客户端(${targetClient})超时`);\n const queue = this._sessionSetupRequests.get(targetClient);\n this._sessionSetupRequests.delete(targetClient);\n this._timerMap.delete(targetClient);\n if (queue != null) {\n for (const req of queue) {\n this._sendSessionSetupResponse(req, IpcSessionSetupResponse.failure, `Target client(${targetClient}) register time out!`);\n }\n } else {\n logger.error('需要与目标客户端建立会话的发起端队列为空!');\n }\n }, 20_000);\n this._timerMap.set(targetClient, timer);\n }\n }\n\n private _sendSessionSetupResponse(request: IpcSessionSetupRequest, result: number, message: string): void {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n result,\n message,\n undefined,\n );\n const sourceSocket = this._clientSocketMap.get(request.sourceClient);\n if (sourceSocket != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建结果${result === IpcSessionSetupResponse.success ? '成功.' : '失败!'}`);\n sendSessionSetupResponse(sourceSocket, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n\n private _cancelClientTimer(clientName: string): void {\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n }\n\n private _processSessionSetupRequests(clientName: string): void {\n const queue = this._sessionSetupRequests.get(clientName);\n this._sessionSetupRequests.delete(clientName);\n if (queue != null) {\n for (const request of queue) {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n IpcSessionSetupResponse.success,\n 'Target client register success!',\n undefined,\n );\n const sourceClient = this._clientSocketMap.get(request.sourceClient);\n if (sourceClient != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建成功.`);\n sendSessionSetupResponse(sourceClient, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":["ClientIdentityManager","_a","logger","WebSocketServer","MessageType","IpcMessageDecoder","sendEvent","sendError","sendRequest","sendResponse","IpcSessionSetupResponse","handshake","Handshake","sendHandshake","sendPing","Ping","PlatformAppLauncherFactory","sendSessionSetupResponse"],"mappings":"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","file":"moonbridge_ipc_server.internal.js","sourcesContent":["/**\n * MoonBridge IPC 服务器实现类\n *\n * 该类用于管理 IPC 服务器,包括启动服务器、处理客户端连接和消息等功能。\n */\n\nimport type { SerialMessageChannel } from '../../general/transport/interface/serial_message_channel';\nimport {\n sendResponse,\n sendRequest,\n sendEvent,\n sendError,\n sendPing,\n sendHandshake,\n sendSessionSetupResponse,\n} from '../../general/transport/interface/serial_message_channel_extension';\nimport { WebSocketServer } from '../../general/transport/websocket/websocket_server';\nimport { IpcMessageDecoder } from '../../general/encode/ipc_message_decoder';\nimport { MessageType } from '../../general/message/constants/message_types';\nimport { Handshake } from '../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../general/message/session_setup';\nimport { PlatformAppLauncherFactory } from '../../general/app_launch/platform_app_launcher';\nimport type { WebSocketServerEndpoint } from '../../general/config/websocket_server_endpoint';\nimport type {\n MoonBridgeIpcServer,\n WakeAppInterceptor,\n DisconnectedCallback,\n MessagePreprocessor,\n OnMessageReceived,\n} from '../moonbridge_ipc_server';\nimport type { ClientIdentity, ClientIdentityProvider } from '../credential/client_identity';\nimport { ClientIdentityManager } from './identity/client_identity_manager';\nimport type { Registration } from '../../general/message/registration';\nimport type { Unregistration } from '../../general/message/unregistration';\nimport type { Event } from '../../general/message/event';\nimport type { Error } from '../../general/message/error';\nimport type { Request } from '../../general/message/request';\nimport type { Response } from '../../general/message/response';\nimport { Ping } from '../../general/message/ping';\nimport { logger } from '../../utils/logger';\n\nexport class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {\n private readonly _serverName: string;\n private readonly _wakeAppInterceptor?: WakeAppInterceptor;\n private readonly _onClientDisconnected?: DisconnectedCallback;\n private readonly _messagePreprocessor?: MessagePreprocessor;\n private readonly _onMessageReceived?: OnMessageReceived;\n private readonly _webSocketServerEndpoint?: WebSocketServerEndpoint;\n\n private readonly _clientSocketMap = new Map<string, SerialMessageChannel>();\n private readonly _addressToClientNameMap = new Map<string, string>();\n private readonly _clientIdentityManager = new ClientIdentityManager();\n private readonly _timerMap = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly _sessionSetupRequests = new Map<string, IpcSessionSetupRequest[]>();\n\n private _webSocketServer?: WebSocketServer;\n\n constructor(\n serverName: string,\n webSocketServerEndpoint?: WebSocketServerEndpoint,\n wakeAppInterceptor?: WakeAppInterceptor,\n clientIdentityProviders?: ClientIdentityProvider[],\n onClientDisconnected?: DisconnectedCallback,\n messagePreprocessor?: MessagePreprocessor,\n onMessageReceived?: OnMessageReceived,\n ) {\n this._serverName = serverName;\n this._webSocketServerEndpoint = webSocketServerEndpoint;\n this._wakeAppInterceptor = wakeAppInterceptor;\n this._onClientDisconnected = onClientDisconnected;\n this._messagePreprocessor = messagePreprocessor;\n this._onMessageReceived = onMessageReceived;\n\n const providers = clientIdentityProviders ?? [];\n for (const p of providers) {\n this._clientIdentityManager.addClientIdentityProvider(p);\n }\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n async start(): Promise<boolean> {\n const onClientConnected = (client: SerialMessageChannel) => {\n let clientName = this._getClientName(client) ?? '';\n client.subscribe(\n (message: string) => {\n this._onMessage(client, message);\n if (clientName === '') {\n clientName = this._getClientName(client) ?? '';\n }\n },\n {\n onError: (err) => {\n logger.error(`客户端错误: ${String(err)}`);\n },\n onDone: () => {\n logger.error(`客户端 ${clientName} 断开连接`);\n this._removeClient(client);\n this._onClientDisconnected?.(clientName);\n },\n cancelOnError: false,\n },\n );\n };\n\n if (this._webSocketServerEndpoint != null) {\n const ep = this._webSocketServerEndpoint;\n const portList =\n ep.portCandidateRule != null\n ? ep.portCandidateRule.toOrderedPortList()\n : [ep.port];\n\n for (const port of portList) {\n const server = new WebSocketServer(ep.address, port, { path: ep.path });\n if (await server.startServer(onClientConnected)) {\n this._webSocketServer = server;\n return true;\n }\n }\n }\n\n this._webSocketServer = undefined;\n return false;\n }\n\n async stop(): Promise<void> {\n if (this._webSocketServer != undefined) {\n await this._webSocketServer.close();\n this._webSocketServer = undefined;\n }\n }\n\n get serverAddress(): string | undefined {\n return this._webSocketServer?.serverAddressInfo?.ip ?? undefined;\n }\n\n get serverPort(): number | undefined {\n return this._webSocketServer?.serverAddressInfo?.port ?? undefined;\n }\n\n private _addClient(clientIdentity: ClientIdentity, client: SerialMessageChannel): void {\n const clientName = clientIdentity.clientName;\n const clientAddress = this._getClientAddress(client);\n this._clientSocketMap.set(clientName, client);\n this._addressToClientNameMap.set(clientAddress, clientName);\n logger.info(`客户端已连接: ${clientName}`);\n }\n\n private _removeClient(client: SerialMessageChannel): void {\n const clientAddress = this._getClientAddress(client);\n const clientName = this._addressToClientNameMap.get(clientAddress);\n this._addressToClientNameMap.delete(clientAddress);\n if (clientName != null) {\n this._clientSocketMap.delete(clientName);\n }\n logger.info(`客户端已断开: ${clientName}`);\n }\n\n private _getClientName(client: SerialMessageChannel): string | undefined {\n const clientAddress = this._getClientAddress(client);\n return this._addressToClientNameMap.get(clientAddress);\n }\n\n private _getClientAddress(client: SerialMessageChannel): string {\n return `${client.remoteAddress}:${client.remotePort}`;\n }\n\n private _onMessage(client: SerialMessageChannel, message: string): void {\n logger.info(`服务端接收到消息,message: ${message}`);\n\n const reply: (msg: string) => Promise<boolean> = (msg) => client.sendMessage(msg);\n if (this._messagePreprocessor?.(reply, message) === true) {\n return;\n }\n\n let messageType = MessageType.UNKNOWN;\n\n const messageTypeMatch = message.match(/\"type\"\\s*:\\s*\"([^\"]+)\"/);\n const actualType = messageTypeMatch ? messageTypeMatch[1] : null;\n\n if (actualType === MessageType.REGISTRATION) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (actualType === MessageType.UNREGISTRATION) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (actualType === MessageType.EVENT) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (actualType === MessageType.ERROR) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (actualType === MessageType.REQUEST) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (actualType === MessageType.RESPONSE) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\n } else if (actualType === MessageType.HANDSHAKE) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (actualType === MessageType.PING) {\n messageType = MessageType.PING;\n this._onPing(IpcMessageDecoder.decodePing(message));\n } else {\n logger.error(`无法识别的消息类型: ${message}`);\n }\n\n const clientName = this._getClientName(client) ?? '';\n this._onMessageReceived?.(clientName, messageType, message);\n }\n\n private _onRegistration(client: SerialMessageChannel, registration: Registration): void {\n const clientName = registration.clientName;\n if (!this._validateClientIdentity(clientName)) {\n logger.error(`客户端(${clientName})不在白名单中,注册失败.`);\n return;\n }\n const identity = this._clientIdentityManager.getClientIdentity(clientName)!;\n this._addClient(identity, client);\n this._cancelClientTimer(clientName);\n this._processSessionSetupRequests(clientName);\n logger.info(`客户端(${clientName})注册成功.`);\n }\n\n private _onUnregistration(unregistration: Unregistration): void {\n const clientName = unregistration.clientName;\n this._clientSocketMap.delete(clientName);\n this._sessionSetupRequests.delete(clientName);\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n logger.info(`客户端(${clientName})注销.`);\n }\n\n private _onEvent(event: Event): void {\n const allClients = [...this._clientSocketMap.values()];\n for (const client of allClients) {\n sendEvent(client, event);\n }\n logger.info(`接收到 EventBus 事件,并转发给处于连接状态的所有客户端,event: ${event}.`);\n }\n\n private _onError(error: Error): void {\n logger.info(`接收到错误消息,并转发给请求客户端,error: ${error}.`);\n const fromClient = this._clientSocketMap.get(error.fromClient);\n if (fromClient != null) {\n sendError(fromClient, error);\n }\n }\n\n private _onRequest(request: Request): void {\n logger.info(`接收到请求消息,并转发给目标客户端,request: ${request}.`);\n const toClient = this._clientSocketMap.get(request.toClient);\n if (toClient != null) {\n sendRequest(toClient, request);\n }\n }\n\n private _onResponse(response: Response): void {\n logger.info(`接收到响应消息,并转发给请求客户端,response: ${response}.`);\n const fromClient = this._clientSocketMap.get(response.fromClient);\n if (fromClient != null) {\n sendResponse(fromClient, response);\n }\n }\n\n private _onSessionSetupRequest(request: IpcSessionSetupRequest): void {\n const targetClient = request.targetClient;\n if (!this._validateClientIdentity(targetClient)) {\n logger.error(`目标客户端(${targetClient})不在白名单内!`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Match target client(${targetClient}) failed!`);\n return;\n }\n if (this._handleExistingTargetClient(request, targetClient)) {\n logger.info(`与目标客户端(${targetClient})会话连接中.`);\n return;\n }\n let queue = this._sessionSetupRequests.get(targetClient);\n if (queue == null) {\n queue = [];\n this._sessionSetupRequests.set(targetClient, queue);\n }\n queue.push(request);\n logger.info(`缓存目标客户端(${targetClient})唤醒动作至队列.`);\n if (queue.length > 1) {\n logger.info(`正在尝试唤醒目标客户端进程,追加回调至队列中,targetClient: ${targetClient}.`);\n return;\n }\n if (request.autoLaunch) {\n logger.info(`尝试唤醒目标客户端(${targetClient}).`);\n this._wakeUpTargetClient(targetClient);\n } else {\n logger.info(`不尝试唤醒目标客户端(${targetClient}),直接返回失败.`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Target client(${targetClient}) was dead, and wake up is disabled!`);\n }\n }\n\n private _onPing(_ping: Ping): void {\n logger.info('接收到 Ping 消息');\n }\n\n private _onHandshake(handshake: Handshake, client: SerialMessageChannel): void {\n if (handshake.magic !== Handshake.ipcMagic) {\n logger.warn(`收到未知握手魔数(${handshake.magic}),忽略本次握手请求,可能是其他服务误连.`);\n return;\n }\n if (handshake.role !== Handshake.clientRole) {\n logger.warn(`收到非 client 角色的握手(${handshake.role}),忽略本次握手请求.`);\n return;\n }\n const ack = new Handshake(\n handshake.clientName,\n Handshake.ipcMagic,\n Handshake.serverRole,\n Handshake.ipcVersion,\n );\n sendHandshake(client, ack);\n logger.info(`完成与客户端的握手确认,clientName: ${ack.clientName}, magic: ${ack.magic}, version: ${ack.version}`);\n }\n\n private _validateClientIdentity(clientName: string): boolean {\n const isValid = this._clientIdentityManager.getClientIdentity(clientName) != null;\n if (!isValid) {\n logger.fatal(`客户端(${clientName})不在白名单中,可能存在非法访问!`);\n }\n return isValid;\n }\n\n private _handleExistingTargetClient(request: IpcSessionSetupRequest, targetClient: string): boolean {\n const targetSocket = this._clientSocketMap.get(targetClient);\n if (targetSocket != null) {\n try {\n sendPing(targetSocket, new Ping(request.sourceClient));\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.success, `Connecting with target client(${targetClient})!`);\n return true;\n } catch (e) {\n logger.error(`Ping target client(${targetClient}) 失败!`);\n }\n }\n return false;\n }\n\n private async _wakeUpTargetClient(targetClient: string): Promise<void> {\n const clientIdentity = this._clientIdentityManager.getClientIdentity(targetClient);\n if (clientIdentity == null) {\n logger.fatal('唤醒目标客户端,白名单校验失败!');\n return;\n }\n if (this._wakeAppInterceptor != null && this._wakeAppInterceptor(clientIdentity) === true) {\n logger.info(`自定义方式唤醒目标客户端(${targetClient}).`);\n } else {\n logger.info(`默认方式唤醒目标客户端(${targetClient}).`);\n try {\n const appLauncher = PlatformAppLauncherFactory.create({\n appIdentifier: clientIdentity.appLaunchIdentifier,\n appInstallationPath: clientIdentity.appInstallationPath,\n });\n if (await appLauncher.isAppRunning()) {\n logger.warn(`目标客户端(${targetClient})处于存活态,等待注册!`);\n } else {\n logger.info(`尝试唤醒目标客户端(${targetClient})!`);\n await appLauncher.launchApp();\n }\n } catch (e) {\n logger.fatal(`唤醒目标客户端发生异常:${String(e)}!`);\n }\n }\n let timer = this._timerMap.get(targetClient);\n if (timer == null) {\n timer = setTimeout(() => {\n logger.error(`唤醒目标客户端(${targetClient})超时`);\n const queue = this._sessionSetupRequests.get(targetClient);\n this._sessionSetupRequests.delete(targetClient);\n this._timerMap.delete(targetClient);\n if (queue != null) {\n for (const req of queue) {\n this._sendSessionSetupResponse(req, IpcSessionSetupResponse.failure, `Target client(${targetClient}) register time out!`);\n }\n } else {\n logger.error('需要与目标客户端建立会话的发起端队列为空!');\n }\n }, 20_000);\n this._timerMap.set(targetClient, timer);\n }\n }\n\n private _sendSessionSetupResponse(request: IpcSessionSetupRequest, result: number, message: string): void {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n result,\n message,\n undefined,\n );\n const sourceSocket = this._clientSocketMap.get(request.sourceClient);\n if (sourceSocket != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建结果${result === IpcSessionSetupResponse.success ? '成功.' : '失败!'}`);\n sendSessionSetupResponse(sourceSocket, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n\n private _cancelClientTimer(clientName: string): void {\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n }\n\n private _processSessionSetupRequests(clientName: string): void {\n const queue = this._sessionSetupRequests.get(clientName);\n this._sessionSetupRequests.delete(clientName);\n if (queue != null) {\n for (const request of queue) {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n IpcSessionSetupResponse.success,\n 'Target client register success!',\n undefined,\n );\n const sourceClient = this._clientSocketMap.get(request.sourceClient);\n if (sourceClient != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建成功.`);\n sendSessionSetupResponse(sourceClient, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n }\n }\n}\n"]}
|
|
@@ -138,13 +138,13 @@ class RealMoonBridgeIpcServer {
|
|
|
138
138
|
} else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
|
|
139
139
|
messageType = MessageType.SESSION_SETUP_REQUEST;
|
|
140
140
|
this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
141
|
-
} else if (actualType === MessageType.HANDSHAKE) {
|
|
141
|
+
} else if (actualType === MessageType.SESSION_SETUP_RESPONSE) ; else if (actualType === MessageType.HANDSHAKE) {
|
|
142
142
|
messageType = MessageType.HANDSHAKE;
|
|
143
143
|
this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
|
|
144
144
|
} else if (actualType === MessageType.PING) {
|
|
145
145
|
messageType = MessageType.PING;
|
|
146
146
|
this._onPing(IpcMessageDecoder.decodePing(message));
|
|
147
|
-
} else
|
|
147
|
+
} else {
|
|
148
148
|
logger.error(`\u65E0\u6CD5\u8BC6\u522B\u7684\u6D88\u606F\u7C7B\u578B: ${message}`);
|
|
149
149
|
}
|
|
150
150
|
const clientName = (_b = this._getClientName(client)) != null ? _b : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":["_a"],"mappings":"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","file":"moonbridge_ipc_server.internal.mjs","sourcesContent":["/**\n * MoonBridge IPC 服务器实现类\n *\n * 该类用于管理 IPC 服务器,包括启动服务器、处理客户端连接和消息等功能。\n */\n\nimport type { SerialMessageChannel } from '../../general/transport/interface/serial_message_channel';\nimport {\n sendResponse,\n sendRequest,\n sendEvent,\n sendError,\n sendPing,\n sendHandshake,\n sendSessionSetupResponse,\n} from '../../general/transport/interface/serial_message_channel_extension';\nimport { WebSocketServer } from '../../general/transport/websocket/websocket_server';\nimport { IpcMessageDecoder } from '../../general/encode/ipc_message_decoder';\nimport { MessageType } from '../../general/message/constants/message_types';\nimport { Handshake } from '../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../general/message/session_setup';\nimport { PlatformAppLauncherFactory } from '../../general/app_launch/platform_app_launcher';\nimport type { WebSocketServerEndpoint } from '../../general/config/websocket_server_endpoint';\nimport type {\n MoonBridgeIpcServer,\n WakeAppInterceptor,\n DisconnectedCallback,\n MessagePreprocessor,\n OnMessageReceived,\n} from '../moonbridge_ipc_server';\nimport type { ClientIdentity, ClientIdentityProvider } from '../credential/client_identity';\nimport { ClientIdentityManager } from './identity/client_identity_manager';\nimport type { Registration } from '../../general/message/registration';\nimport type { Unregistration } from '../../general/message/unregistration';\nimport type { Event } from '../../general/message/event';\nimport type { Error } from '../../general/message/error';\nimport type { Request } from '../../general/message/request';\nimport type { Response } from '../../general/message/response';\nimport { Ping } from '../../general/message/ping';\nimport { logger } from '../../utils/logger';\n\nexport class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {\n private readonly _serverName: string;\n private readonly _wakeAppInterceptor?: WakeAppInterceptor;\n private readonly _onClientDisconnected?: DisconnectedCallback;\n private readonly _messagePreprocessor?: MessagePreprocessor;\n private readonly _onMessageReceived?: OnMessageReceived;\n private readonly _webSocketServerEndpoint?: WebSocketServerEndpoint;\n\n private readonly _clientSocketMap = new Map<string, SerialMessageChannel>();\n private readonly _addressToClientNameMap = new Map<string, string>();\n private readonly _clientIdentityManager = new ClientIdentityManager();\n private readonly _timerMap = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly _sessionSetupRequests = new Map<string, IpcSessionSetupRequest[]>();\n\n private _webSocketServer?: WebSocketServer;\n\n constructor(\n serverName: string,\n webSocketServerEndpoint?: WebSocketServerEndpoint,\n wakeAppInterceptor?: WakeAppInterceptor,\n clientIdentityProviders?: ClientIdentityProvider[],\n onClientDisconnected?: DisconnectedCallback,\n messagePreprocessor?: MessagePreprocessor,\n onMessageReceived?: OnMessageReceived,\n ) {\n this._serverName = serverName;\n this._webSocketServerEndpoint = webSocketServerEndpoint;\n this._wakeAppInterceptor = wakeAppInterceptor;\n this._onClientDisconnected = onClientDisconnected;\n this._messagePreprocessor = messagePreprocessor;\n this._onMessageReceived = onMessageReceived;\n\n const providers = clientIdentityProviders ?? [];\n for (const p of providers) {\n this._clientIdentityManager.addClientIdentityProvider(p);\n }\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n async start(): Promise<boolean> {\n const onClientConnected = (client: SerialMessageChannel) => {\n let clientName = this._getClientName(client) ?? '';\n client.subscribe(\n (message: string) => {\n this._onMessage(client, message);\n if (clientName === '') {\n clientName = this._getClientName(client) ?? '';\n }\n },\n {\n onError: (err) => {\n logger.error(`客户端错误: ${String(err)}`);\n },\n onDone: () => {\n logger.error(`客户端 ${clientName} 断开连接`);\n this._removeClient(client);\n this._onClientDisconnected?.(clientName);\n },\n cancelOnError: false,\n },\n );\n };\n\n if (this._webSocketServerEndpoint != null) {\n const ep = this._webSocketServerEndpoint;\n const portList =\n ep.portCandidateRule != null\n ? ep.portCandidateRule.toOrderedPortList()\n : [ep.port];\n\n for (const port of portList) {\n const server = new WebSocketServer(ep.address, port, { path: ep.path });\n if (await server.startServer(onClientConnected)) {\n this._webSocketServer = server;\n return true;\n }\n }\n }\n\n this._webSocketServer = undefined;\n return false;\n }\n\n async stop(): Promise<void> {\n if (this._webSocketServer != undefined) {\n await this._webSocketServer.close();\n this._webSocketServer = undefined;\n }\n }\n\n get serverAddress(): string | undefined {\n return this._webSocketServer?.serverAddressInfo?.ip ?? undefined;\n }\n\n get serverPort(): number | undefined {\n return this._webSocketServer?.serverAddressInfo?.port ?? undefined;\n }\n\n private _addClient(clientIdentity: ClientIdentity, client: SerialMessageChannel): void {\n const clientName = clientIdentity.clientName;\n const clientAddress = this._getClientAddress(client);\n this._clientSocketMap.set(clientName, client);\n this._addressToClientNameMap.set(clientAddress, clientName);\n logger.info(`客户端已连接: ${clientName}`);\n }\n\n private _removeClient(client: SerialMessageChannel): void {\n const clientAddress = this._getClientAddress(client);\n const clientName = this._addressToClientNameMap.get(clientAddress);\n this._addressToClientNameMap.delete(clientAddress);\n if (clientName != null) {\n this._clientSocketMap.delete(clientName);\n }\n logger.info(`客户端已断开: ${clientName}`);\n }\n\n private _getClientName(client: SerialMessageChannel): string | undefined {\n const clientAddress = this._getClientAddress(client);\n return this._addressToClientNameMap.get(clientAddress);\n }\n\n private _getClientAddress(client: SerialMessageChannel): string {\n return `${client.remoteAddress}:${client.remotePort}`;\n }\n\n private _onMessage(client: SerialMessageChannel, message: string): void {\n logger.info(`服务端接收到消息,message: ${message}`);\n\n const reply: (msg: string) => Promise<boolean> = (msg) => client.sendMessage(msg);\n if (this._messagePreprocessor?.(reply, message) === true) {\n return;\n }\n\n let messageType = MessageType.UNKNOWN;\n\n const messageTypeMatch = message.match(/\"type\"\\s*:\\s*\"([^\"]+)\"/);\n const actualType = messageTypeMatch ? messageTypeMatch[1] : null;\n\n if (actualType === MessageType.REGISTRATION) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (actualType === MessageType.UNREGISTRATION) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (actualType === MessageType.EVENT) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (actualType === MessageType.ERROR) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (actualType === MessageType.REQUEST) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (actualType === MessageType.RESPONSE) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (actualType === MessageType.HANDSHAKE) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (actualType === MessageType.PING) {\n messageType = MessageType.PING;\n this._onPing(IpcMessageDecoder.decodePing(message));\n } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\n } else {\n logger.error(`无法识别的消息类型: ${message}`);\n }\n\n const clientName = this._getClientName(client) ?? '';\n this._onMessageReceived?.(clientName, messageType, message);\n }\n\n private _onRegistration(client: SerialMessageChannel, registration: Registration): void {\n const clientName = registration.clientName;\n if (!this._validateClientIdentity(clientName)) {\n logger.error(`客户端(${clientName})不在白名单中,注册失败.`);\n return;\n }\n const identity = this._clientIdentityManager.getClientIdentity(clientName)!;\n this._addClient(identity, client);\n this._cancelClientTimer(clientName);\n this._processSessionSetupRequests(clientName);\n logger.info(`客户端(${clientName})注册成功.`);\n }\n\n private _onUnregistration(unregistration: Unregistration): void {\n const clientName = unregistration.clientName;\n this._clientSocketMap.delete(clientName);\n this._sessionSetupRequests.delete(clientName);\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n logger.info(`客户端(${clientName})注销.`);\n }\n\n private _onEvent(event: Event): void {\n const allClients = [...this._clientSocketMap.values()];\n for (const client of allClients) {\n sendEvent(client, event);\n }\n logger.info(`接收到 EventBus 事件,并转发给处于连接状态的所有客户端,event: ${event}.`);\n }\n\n private _onError(error: Error): void {\n logger.info(`接收到错误消息,并转发给请求客户端,error: ${error}.`);\n const fromClient = this._clientSocketMap.get(error.fromClient);\n if (fromClient != null) {\n sendError(fromClient, error);\n }\n }\n\n private _onRequest(request: Request): void {\n logger.info(`接收到请求消息,并转发给目标客户端,request: ${request}.`);\n const toClient = this._clientSocketMap.get(request.toClient);\n if (toClient != null) {\n sendRequest(toClient, request);\n }\n }\n\n private _onResponse(response: Response): void {\n logger.info(`接收到响应消息,并转发给请求客户端,response: ${response}.`);\n const fromClient = this._clientSocketMap.get(response.fromClient);\n if (fromClient != null) {\n sendResponse(fromClient, response);\n }\n }\n\n private _onSessionSetupRequest(request: IpcSessionSetupRequest): void {\n const targetClient = request.targetClient;\n if (!this._validateClientIdentity(targetClient)) {\n logger.error(`目标客户端(${targetClient})不在白名单内!`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Match target client(${targetClient}) failed!`);\n return;\n }\n if (this._handleExistingTargetClient(request, targetClient)) {\n logger.info(`与目标客户端(${targetClient})会话连接中.`);\n return;\n }\n let queue = this._sessionSetupRequests.get(targetClient);\n if (queue == null) {\n queue = [];\n this._sessionSetupRequests.set(targetClient, queue);\n }\n queue.push(request);\n logger.info(`缓存目标客户端(${targetClient})唤醒动作至队列.`);\n if (queue.length > 1) {\n logger.info(`正在尝试唤醒目标客户端进程,追加回调至队列中,targetClient: ${targetClient}.`);\n return;\n }\n if (request.autoLaunch) {\n logger.info(`尝试唤醒目标客户端(${targetClient}).`);\n this._wakeUpTargetClient(targetClient);\n } else {\n logger.info(`不尝试唤醒目标客户端(${targetClient}),直接返回失败.`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Target client(${targetClient}) was dead, and wake up is disabled!`);\n }\n }\n\n private _onPing(_ping: Ping): void {\n logger.info('接收到 Ping 消息');\n }\n\n private _onHandshake(handshake: Handshake, client: SerialMessageChannel): void {\n if (handshake.magic !== Handshake.ipcMagic) {\n logger.warn(`收到未知握手魔数(${handshake.magic}),忽略本次握手请求,可能是其他服务误连.`);\n return;\n }\n if (handshake.role !== Handshake.clientRole) {\n logger.warn(`收到非 client 角色的握手(${handshake.role}),忽略本次握手请求.`);\n return;\n }\n const ack = new Handshake(\n handshake.clientName,\n Handshake.ipcMagic,\n Handshake.serverRole,\n Handshake.ipcVersion,\n );\n sendHandshake(client, ack);\n logger.info(`完成与客户端的握手确认,clientName: ${ack.clientName}, magic: ${ack.magic}, version: ${ack.version}`);\n }\n\n private _validateClientIdentity(clientName: string): boolean {\n const isValid = this._clientIdentityManager.getClientIdentity(clientName) != null;\n if (!isValid) {\n logger.fatal(`客户端(${clientName})不在白名单中,可能存在非法访问!`);\n }\n return isValid;\n }\n\n private _handleExistingTargetClient(request: IpcSessionSetupRequest, targetClient: string): boolean {\n const targetSocket = this._clientSocketMap.get(targetClient);\n if (targetSocket != null) {\n try {\n sendPing(targetSocket, new Ping(request.sourceClient));\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.success, `Connecting with target client(${targetClient})!`);\n return true;\n } catch (e) {\n logger.error(`Ping target client(${targetClient}) 失败!`);\n }\n }\n return false;\n }\n\n private async _wakeUpTargetClient(targetClient: string): Promise<void> {\n const clientIdentity = this._clientIdentityManager.getClientIdentity(targetClient);\n if (clientIdentity == null) {\n logger.fatal('唤醒目标客户端,白名单校验失败!');\n return;\n }\n if (this._wakeAppInterceptor != null && this._wakeAppInterceptor(clientIdentity) === true) {\n logger.info(`自定义方式唤醒目标客户端(${targetClient}).`);\n } else {\n logger.info(`默认方式唤醒目标客户端(${targetClient}).`);\n try {\n const appLauncher = PlatformAppLauncherFactory.create({\n appIdentifier: clientIdentity.appLaunchIdentifier,\n appInstallationPath: clientIdentity.appInstallationPath,\n });\n if (await appLauncher.isAppRunning()) {\n logger.warn(`目标客户端(${targetClient})处于存活态,等待注册!`);\n } else {\n logger.info(`尝试唤醒目标客户端(${targetClient})!`);\n await appLauncher.launchApp();\n }\n } catch (e) {\n logger.fatal(`唤醒目标客户端发生异常:${String(e)}!`);\n }\n }\n let timer = this._timerMap.get(targetClient);\n if (timer == null) {\n timer = setTimeout(() => {\n logger.error(`唤醒目标客户端(${targetClient})超时`);\n const queue = this._sessionSetupRequests.get(targetClient);\n this._sessionSetupRequests.delete(targetClient);\n this._timerMap.delete(targetClient);\n if (queue != null) {\n for (const req of queue) {\n this._sendSessionSetupResponse(req, IpcSessionSetupResponse.failure, `Target client(${targetClient}) register time out!`);\n }\n } else {\n logger.error('需要与目标客户端建立会话的发起端队列为空!');\n }\n }, 20_000);\n this._timerMap.set(targetClient, timer);\n }\n }\n\n private _sendSessionSetupResponse(request: IpcSessionSetupRequest, result: number, message: string): void {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n result,\n message,\n undefined,\n );\n const sourceSocket = this._clientSocketMap.get(request.sourceClient);\n if (sourceSocket != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建结果${result === IpcSessionSetupResponse.success ? '成功.' : '失败!'}`);\n sendSessionSetupResponse(sourceSocket, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n\n private _cancelClientTimer(clientName: string): void {\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n }\n\n private _processSessionSetupRequests(clientName: string): void {\n const queue = this._sessionSetupRequests.get(clientName);\n this._sessionSetupRequests.delete(clientName);\n if (queue != null) {\n for (const request of queue) {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n IpcSessionSetupResponse.success,\n 'Target client register success!',\n undefined,\n );\n const sourceClient = this._clientSocketMap.get(request.sourceClient);\n if (sourceClient != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建成功.`);\n sendSessionSetupResponse(sourceClient, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":["_a"],"mappings":"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","file":"moonbridge_ipc_server.internal.mjs","sourcesContent":["/**\n * MoonBridge IPC 服务器实现类\n *\n * 该类用于管理 IPC 服务器,包括启动服务器、处理客户端连接和消息等功能。\n */\n\nimport type { SerialMessageChannel } from '../../general/transport/interface/serial_message_channel';\nimport {\n sendResponse,\n sendRequest,\n sendEvent,\n sendError,\n sendPing,\n sendHandshake,\n sendSessionSetupResponse,\n} from '../../general/transport/interface/serial_message_channel_extension';\nimport { WebSocketServer } from '../../general/transport/websocket/websocket_server';\nimport { IpcMessageDecoder } from '../../general/encode/ipc_message_decoder';\nimport { MessageType } from '../../general/message/constants/message_types';\nimport { Handshake } from '../../general/message/handshake';\nimport { IpcSessionSetupRequest, IpcSessionSetupResponse } from '../../general/message/session_setup';\nimport { PlatformAppLauncherFactory } from '../../general/app_launch/platform_app_launcher';\nimport type { WebSocketServerEndpoint } from '../../general/config/websocket_server_endpoint';\nimport type {\n MoonBridgeIpcServer,\n WakeAppInterceptor,\n DisconnectedCallback,\n MessagePreprocessor,\n OnMessageReceived,\n} from '../moonbridge_ipc_server';\nimport type { ClientIdentity, ClientIdentityProvider } from '../credential/client_identity';\nimport { ClientIdentityManager } from './identity/client_identity_manager';\nimport type { Registration } from '../../general/message/registration';\nimport type { Unregistration } from '../../general/message/unregistration';\nimport type { Event } from '../../general/message/event';\nimport type { Error } from '../../general/message/error';\nimport type { Request } from '../../general/message/request';\nimport type { Response } from '../../general/message/response';\nimport { Ping } from '../../general/message/ping';\nimport { logger } from '../../utils/logger';\n\nexport class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {\n private readonly _serverName: string;\n private readonly _wakeAppInterceptor?: WakeAppInterceptor;\n private readonly _onClientDisconnected?: DisconnectedCallback;\n private readonly _messagePreprocessor?: MessagePreprocessor;\n private readonly _onMessageReceived?: OnMessageReceived;\n private readonly _webSocketServerEndpoint?: WebSocketServerEndpoint;\n\n private readonly _clientSocketMap = new Map<string, SerialMessageChannel>();\n private readonly _addressToClientNameMap = new Map<string, string>();\n private readonly _clientIdentityManager = new ClientIdentityManager();\n private readonly _timerMap = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly _sessionSetupRequests = new Map<string, IpcSessionSetupRequest[]>();\n\n private _webSocketServer?: WebSocketServer;\n\n constructor(\n serverName: string,\n webSocketServerEndpoint?: WebSocketServerEndpoint,\n wakeAppInterceptor?: WakeAppInterceptor,\n clientIdentityProviders?: ClientIdentityProvider[],\n onClientDisconnected?: DisconnectedCallback,\n messagePreprocessor?: MessagePreprocessor,\n onMessageReceived?: OnMessageReceived,\n ) {\n this._serverName = serverName;\n this._webSocketServerEndpoint = webSocketServerEndpoint;\n this._wakeAppInterceptor = wakeAppInterceptor;\n this._onClientDisconnected = onClientDisconnected;\n this._messagePreprocessor = messagePreprocessor;\n this._onMessageReceived = onMessageReceived;\n\n const providers = clientIdentityProviders ?? [];\n for (const p of providers) {\n this._clientIdentityManager.addClientIdentityProvider(p);\n }\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n async start(): Promise<boolean> {\n const onClientConnected = (client: SerialMessageChannel) => {\n let clientName = this._getClientName(client) ?? '';\n client.subscribe(\n (message: string) => {\n this._onMessage(client, message);\n if (clientName === '') {\n clientName = this._getClientName(client) ?? '';\n }\n },\n {\n onError: (err) => {\n logger.error(`客户端错误: ${String(err)}`);\n },\n onDone: () => {\n logger.error(`客户端 ${clientName} 断开连接`);\n this._removeClient(client);\n this._onClientDisconnected?.(clientName);\n },\n cancelOnError: false,\n },\n );\n };\n\n if (this._webSocketServerEndpoint != null) {\n const ep = this._webSocketServerEndpoint;\n const portList =\n ep.portCandidateRule != null\n ? ep.portCandidateRule.toOrderedPortList()\n : [ep.port];\n\n for (const port of portList) {\n const server = new WebSocketServer(ep.address, port, { path: ep.path });\n if (await server.startServer(onClientConnected)) {\n this._webSocketServer = server;\n return true;\n }\n }\n }\n\n this._webSocketServer = undefined;\n return false;\n }\n\n async stop(): Promise<void> {\n if (this._webSocketServer != undefined) {\n await this._webSocketServer.close();\n this._webSocketServer = undefined;\n }\n }\n\n get serverAddress(): string | undefined {\n return this._webSocketServer?.serverAddressInfo?.ip ?? undefined;\n }\n\n get serverPort(): number | undefined {\n return this._webSocketServer?.serverAddressInfo?.port ?? undefined;\n }\n\n private _addClient(clientIdentity: ClientIdentity, client: SerialMessageChannel): void {\n const clientName = clientIdentity.clientName;\n const clientAddress = this._getClientAddress(client);\n this._clientSocketMap.set(clientName, client);\n this._addressToClientNameMap.set(clientAddress, clientName);\n logger.info(`客户端已连接: ${clientName}`);\n }\n\n private _removeClient(client: SerialMessageChannel): void {\n const clientAddress = this._getClientAddress(client);\n const clientName = this._addressToClientNameMap.get(clientAddress);\n this._addressToClientNameMap.delete(clientAddress);\n if (clientName != null) {\n this._clientSocketMap.delete(clientName);\n }\n logger.info(`客户端已断开: ${clientName}`);\n }\n\n private _getClientName(client: SerialMessageChannel): string | undefined {\n const clientAddress = this._getClientAddress(client);\n return this._addressToClientNameMap.get(clientAddress);\n }\n\n private _getClientAddress(client: SerialMessageChannel): string {\n return `${client.remoteAddress}:${client.remotePort}`;\n }\n\n private _onMessage(client: SerialMessageChannel, message: string): void {\n logger.info(`服务端接收到消息,message: ${message}`);\n\n const reply: (msg: string) => Promise<boolean> = (msg) => client.sendMessage(msg);\n if (this._messagePreprocessor?.(reply, message) === true) {\n return;\n }\n\n let messageType = MessageType.UNKNOWN;\n\n const messageTypeMatch = message.match(/\"type\"\\s*:\\s*\"([^\"]+)\"/);\n const actualType = messageTypeMatch ? messageTypeMatch[1] : null;\n\n if (actualType === MessageType.REGISTRATION) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (actualType === MessageType.UNREGISTRATION) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (actualType === MessageType.EVENT) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (actualType === MessageType.ERROR) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (actualType === MessageType.REQUEST) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (actualType === MessageType.RESPONSE) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\n } else if (actualType === MessageType.HANDSHAKE) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (actualType === MessageType.PING) {\n messageType = MessageType.PING;\n this._onPing(IpcMessageDecoder.decodePing(message));\n } else {\n logger.error(`无法识别的消息类型: ${message}`);\n }\n\n const clientName = this._getClientName(client) ?? '';\n this._onMessageReceived?.(clientName, messageType, message);\n }\n\n private _onRegistration(client: SerialMessageChannel, registration: Registration): void {\n const clientName = registration.clientName;\n if (!this._validateClientIdentity(clientName)) {\n logger.error(`客户端(${clientName})不在白名单中,注册失败.`);\n return;\n }\n const identity = this._clientIdentityManager.getClientIdentity(clientName)!;\n this._addClient(identity, client);\n this._cancelClientTimer(clientName);\n this._processSessionSetupRequests(clientName);\n logger.info(`客户端(${clientName})注册成功.`);\n }\n\n private _onUnregistration(unregistration: Unregistration): void {\n const clientName = unregistration.clientName;\n this._clientSocketMap.delete(clientName);\n this._sessionSetupRequests.delete(clientName);\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n logger.info(`客户端(${clientName})注销.`);\n }\n\n private _onEvent(event: Event): void {\n const allClients = [...this._clientSocketMap.values()];\n for (const client of allClients) {\n sendEvent(client, event);\n }\n logger.info(`接收到 EventBus 事件,并转发给处于连接状态的所有客户端,event: ${event}.`);\n }\n\n private _onError(error: Error): void {\n logger.info(`接收到错误消息,并转发给请求客户端,error: ${error}.`);\n const fromClient = this._clientSocketMap.get(error.fromClient);\n if (fromClient != null) {\n sendError(fromClient, error);\n }\n }\n\n private _onRequest(request: Request): void {\n logger.info(`接收到请求消息,并转发给目标客户端,request: ${request}.`);\n const toClient = this._clientSocketMap.get(request.toClient);\n if (toClient != null) {\n sendRequest(toClient, request);\n }\n }\n\n private _onResponse(response: Response): void {\n logger.info(`接收到响应消息,并转发给请求客户端,response: ${response}.`);\n const fromClient = this._clientSocketMap.get(response.fromClient);\n if (fromClient != null) {\n sendResponse(fromClient, response);\n }\n }\n\n private _onSessionSetupRequest(request: IpcSessionSetupRequest): void {\n const targetClient = request.targetClient;\n if (!this._validateClientIdentity(targetClient)) {\n logger.error(`目标客户端(${targetClient})不在白名单内!`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Match target client(${targetClient}) failed!`);\n return;\n }\n if (this._handleExistingTargetClient(request, targetClient)) {\n logger.info(`与目标客户端(${targetClient})会话连接中.`);\n return;\n }\n let queue = this._sessionSetupRequests.get(targetClient);\n if (queue == null) {\n queue = [];\n this._sessionSetupRequests.set(targetClient, queue);\n }\n queue.push(request);\n logger.info(`缓存目标客户端(${targetClient})唤醒动作至队列.`);\n if (queue.length > 1) {\n logger.info(`正在尝试唤醒目标客户端进程,追加回调至队列中,targetClient: ${targetClient}.`);\n return;\n }\n if (request.autoLaunch) {\n logger.info(`尝试唤醒目标客户端(${targetClient}).`);\n this._wakeUpTargetClient(targetClient);\n } else {\n logger.info(`不尝试唤醒目标客户端(${targetClient}),直接返回失败.`);\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.failure, `Target client(${targetClient}) was dead, and wake up is disabled!`);\n }\n }\n\n private _onPing(_ping: Ping): void {\n logger.info('接收到 Ping 消息');\n }\n\n private _onHandshake(handshake: Handshake, client: SerialMessageChannel): void {\n if (handshake.magic !== Handshake.ipcMagic) {\n logger.warn(`收到未知握手魔数(${handshake.magic}),忽略本次握手请求,可能是其他服务误连.`);\n return;\n }\n if (handshake.role !== Handshake.clientRole) {\n logger.warn(`收到非 client 角色的握手(${handshake.role}),忽略本次握手请求.`);\n return;\n }\n const ack = new Handshake(\n handshake.clientName,\n Handshake.ipcMagic,\n Handshake.serverRole,\n Handshake.ipcVersion,\n );\n sendHandshake(client, ack);\n logger.info(`完成与客户端的握手确认,clientName: ${ack.clientName}, magic: ${ack.magic}, version: ${ack.version}`);\n }\n\n private _validateClientIdentity(clientName: string): boolean {\n const isValid = this._clientIdentityManager.getClientIdentity(clientName) != null;\n if (!isValid) {\n logger.fatal(`客户端(${clientName})不在白名单中,可能存在非法访问!`);\n }\n return isValid;\n }\n\n private _handleExistingTargetClient(request: IpcSessionSetupRequest, targetClient: string): boolean {\n const targetSocket = this._clientSocketMap.get(targetClient);\n if (targetSocket != null) {\n try {\n sendPing(targetSocket, new Ping(request.sourceClient));\n this._sendSessionSetupResponse(request, IpcSessionSetupResponse.success, `Connecting with target client(${targetClient})!`);\n return true;\n } catch (e) {\n logger.error(`Ping target client(${targetClient}) 失败!`);\n }\n }\n return false;\n }\n\n private async _wakeUpTargetClient(targetClient: string): Promise<void> {\n const clientIdentity = this._clientIdentityManager.getClientIdentity(targetClient);\n if (clientIdentity == null) {\n logger.fatal('唤醒目标客户端,白名单校验失败!');\n return;\n }\n if (this._wakeAppInterceptor != null && this._wakeAppInterceptor(clientIdentity) === true) {\n logger.info(`自定义方式唤醒目标客户端(${targetClient}).`);\n } else {\n logger.info(`默认方式唤醒目标客户端(${targetClient}).`);\n try {\n const appLauncher = PlatformAppLauncherFactory.create({\n appIdentifier: clientIdentity.appLaunchIdentifier,\n appInstallationPath: clientIdentity.appInstallationPath,\n });\n if (await appLauncher.isAppRunning()) {\n logger.warn(`目标客户端(${targetClient})处于存活态,等待注册!`);\n } else {\n logger.info(`尝试唤醒目标客户端(${targetClient})!`);\n await appLauncher.launchApp();\n }\n } catch (e) {\n logger.fatal(`唤醒目标客户端发生异常:${String(e)}!`);\n }\n }\n let timer = this._timerMap.get(targetClient);\n if (timer == null) {\n timer = setTimeout(() => {\n logger.error(`唤醒目标客户端(${targetClient})超时`);\n const queue = this._sessionSetupRequests.get(targetClient);\n this._sessionSetupRequests.delete(targetClient);\n this._timerMap.delete(targetClient);\n if (queue != null) {\n for (const req of queue) {\n this._sendSessionSetupResponse(req, IpcSessionSetupResponse.failure, `Target client(${targetClient}) register time out!`);\n }\n } else {\n logger.error('需要与目标客户端建立会话的发起端队列为空!');\n }\n }, 20_000);\n this._timerMap.set(targetClient, timer);\n }\n }\n\n private _sendSessionSetupResponse(request: IpcSessionSetupRequest, result: number, message: string): void {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n result,\n message,\n undefined,\n );\n const sourceSocket = this._clientSocketMap.get(request.sourceClient);\n if (sourceSocket != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建结果${result === IpcSessionSetupResponse.success ? '成功.' : '失败!'}`);\n sendSessionSetupResponse(sourceSocket, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n\n private _cancelClientTimer(clientName: string): void {\n const timer = this._timerMap.get(clientName);\n if (timer != null) {\n clearTimeout(timer);\n this._timerMap.delete(clientName);\n }\n }\n\n private _processSessionSetupRequests(clientName: string): void {\n const queue = this._sessionSetupRequests.get(clientName);\n this._sessionSetupRequests.delete(clientName);\n if (queue != null) {\n for (const request of queue) {\n const response = new IpcSessionSetupResponse(\n request.sourceClient,\n request.targetClient,\n request.callbackId,\n IpcSessionSetupResponse.success,\n 'Target client register success!',\n undefined,\n );\n const sourceClient = this._clientSocketMap.get(request.sourceClient);\n if (sourceClient != null) {\n logger.info(`通知请求发起端(${request.sourceClient})会话构建成功.`);\n sendSessionSetupResponse(sourceClient, response);\n } else {\n logger.error(`未匹配到通信发起端(${request.sourceClient}),检查是否已经关闭!`);\n }\n }\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moonbridge-ts",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "MoonBridge IPC by WebSocket for node(server) and browser(client).",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -61,4 +61,4 @@
|
|
|
61
61
|
"overrides": {
|
|
62
62
|
"esbuild": "^0.25.0"
|
|
63
63
|
}
|
|
64
|
-
}
|
|
64
|
+
}
|
|
@@ -262,9 +262,6 @@ export class IpcConnectionManager {
|
|
|
262
262
|
return result;
|
|
263
263
|
} finally {
|
|
264
264
|
clearTimeout(timeoutId);
|
|
265
|
-
if (this.onMessageReceivedListener) {
|
|
266
|
-
client.onMessage(this.onMessageReceivedListener);
|
|
267
|
-
}
|
|
268
265
|
}
|
|
269
266
|
}
|
|
270
267
|
|
|
@@ -451,4 +448,3 @@ export class IpcConnectionManager {
|
|
|
451
448
|
}
|
|
452
449
|
}
|
|
453
450
|
}
|
|
454
|
-
|
|
@@ -107,6 +107,9 @@ export class WebSocketClient implements TransportClient {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
onMessage(onMessage: (data: string) => void): void {
|
|
110
|
+
if (this._messageCallbacks.includes(onMessage)) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
110
113
|
this._messageCallbacks.push(onMessage);
|
|
111
114
|
}
|
|
112
115
|
|
|
@@ -201,15 +201,15 @@ export class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {
|
|
|
201
201
|
} else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
|
|
202
202
|
messageType = MessageType.SESSION_SETUP_REQUEST;
|
|
203
203
|
this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
204
|
+
} else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {
|
|
205
|
+
// SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理
|
|
206
|
+
// 这里可以添加相关处理逻辑,如果需要的话
|
|
204
207
|
} else if (actualType === MessageType.HANDSHAKE) {
|
|
205
208
|
messageType = MessageType.HANDSHAKE;
|
|
206
209
|
this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
|
|
207
210
|
} else if (actualType === MessageType.PING) {
|
|
208
211
|
messageType = MessageType.PING;
|
|
209
212
|
this._onPing(IpcMessageDecoder.decodePing(message));
|
|
210
|
-
} else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {
|
|
211
|
-
// SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理
|
|
212
|
-
// 这里可以添加相关处理逻辑,如果需要的话
|
|
213
213
|
} else {
|
|
214
214
|
logger.error(`无法识别的消息类型: ${message}`);
|
|
215
215
|
}
|