moonbridge-ts 0.2.1 → 0.2.2
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/server/internal/moonbridge_ipc_server.internal.d.ts.map +1 -1
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.js +12 -10
- 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 +12 -10
- package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.mjs.map +1 -1
- package/package.json +1 -1
- package/src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts +15 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moonbridge_ipc_server.internal.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAkB,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAW5F,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAuB;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAA0B;IAEpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2C;IAC5E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA6B;IACrE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA+B;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA+C;IAErF,OAAO,CAAC,gBAAgB,CAAC,CAAkB;gBAGzC,UAAU,EAAE,MAAM,EAClB,uBAAuB,CAAC,EAAE,uBAAuB,EACjD,kBAAkB,CAAC,EAAE,kBAAkB,EACvC,uBAAuB,CAAC,EAAE,sBAAsB,EAAE,EAClD,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,iBAAiB,CAAC,EAAE,iBAAiB;IAevC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IA4CzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"moonbridge_ipc_server.internal.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAkB,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAW5F,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAuB;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAA0B;IAEpE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2C;IAC5E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA6B;IACrE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA+B;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAC9E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA+C;IAErF,OAAO,CAAC,gBAAgB,CAAC,CAAkB;gBAGzC,UAAU,EAAE,MAAM,EAClB,uBAAuB,CAAC,EAAE,uBAAuB,EACjD,kBAAkB,CAAC,EAAE,kBAAkB,EACvC,uBAAuB,CAAC,EAAE,sBAAsB,EAAE,EAClD,oBAAoB,CAAC,EAAE,oBAAoB,EAC3C,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,iBAAiB,CAAC,EAAE,iBAAiB;IAevC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IA4CzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,UAAU;IAmDlB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,2BAA2B;YAcrB,mBAAmB;IA4CjC,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,4BAA4B;CAuBrC"}
|
|
@@ -117,34 +117,36 @@ class RealMoonBridgeIpcServer {
|
|
|
117
117
|
return;
|
|
118
118
|
}
|
|
119
119
|
let messageType = message_types.MessageType.UNKNOWN;
|
|
120
|
-
|
|
120
|
+
const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
|
|
121
|
+
const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
|
|
122
|
+
if (actualType === message_types.MessageType.REGISTRATION) {
|
|
121
123
|
messageType = message_types.MessageType.REGISTRATION;
|
|
122
124
|
this._onRegistration(client, ipc_message_decoder.IpcMessageDecoder.decodeRegistration(message));
|
|
123
|
-
} else if (
|
|
125
|
+
} else if (actualType === message_types.MessageType.UNREGISTRATION) {
|
|
124
126
|
messageType = message_types.MessageType.UNREGISTRATION;
|
|
125
127
|
this._onUnregistration(ipc_message_decoder.IpcMessageDecoder.decodeUnregistration(message));
|
|
126
|
-
} else if (
|
|
128
|
+
} else if (actualType === message_types.MessageType.EVENT) {
|
|
127
129
|
messageType = message_types.MessageType.EVENT;
|
|
128
130
|
this._onEvent(ipc_message_decoder.IpcMessageDecoder.decodeEvent(message));
|
|
129
|
-
} else if (
|
|
131
|
+
} else if (actualType === message_types.MessageType.ERROR) {
|
|
130
132
|
messageType = message_types.MessageType.ERROR;
|
|
131
133
|
this._onError(ipc_message_decoder.IpcMessageDecoder.decodeError(message));
|
|
132
|
-
} else if (
|
|
134
|
+
} else if (actualType === message_types.MessageType.REQUEST) {
|
|
133
135
|
messageType = message_types.MessageType.REQUEST;
|
|
134
136
|
this._onRequest(ipc_message_decoder.IpcMessageDecoder.decodeRequest(message));
|
|
135
|
-
} else if (
|
|
137
|
+
} else if (actualType === message_types.MessageType.RESPONSE) {
|
|
136
138
|
messageType = message_types.MessageType.RESPONSE;
|
|
137
139
|
this._onResponse(ipc_message_decoder.IpcMessageDecoder.decodeResponse(message));
|
|
138
|
-
} else if (
|
|
140
|
+
} else if (actualType === message_types.MessageType.SESSION_SETUP_REQUEST) {
|
|
139
141
|
messageType = message_types.MessageType.SESSION_SETUP_REQUEST;
|
|
140
142
|
this._onSessionSetupRequest(ipc_message_decoder.IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
141
|
-
} else if (
|
|
143
|
+
} else if (actualType === message_types.MessageType.HANDSHAKE) {
|
|
142
144
|
messageType = message_types.MessageType.HANDSHAKE;
|
|
143
145
|
this._onHandshake(ipc_message_decoder.IpcMessageDecoder.decodeHandshake(message), client);
|
|
144
|
-
} else if (
|
|
146
|
+
} else if (actualType === message_types.MessageType.PING) {
|
|
145
147
|
messageType = message_types.MessageType.PING;
|
|
146
148
|
this._onPing(ipc_message_decoder.IpcMessageDecoder.decodePing(message));
|
|
147
|
-
} else {
|
|
149
|
+
} else if (actualType === message_types.MessageType.SESSION_SETUP_RESPONSE) ; else {
|
|
148
150
|
logger.logger.error(`\u65E0\u6CD5\u8BC6\u522B\u7684\u6D88\u606F\u7C7B\u578B: ${message}`);
|
|
149
151
|
}
|
|
150
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":"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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 if (message.includes(MessageType.REGISTRATION)) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (message.includes(MessageType.UNREGISTRATION)) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (message.includes(MessageType.EVENT)) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (message.includes(MessageType.ERROR)) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (message.includes(MessageType.REQUEST)) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (message.includes(MessageType.RESPONSE)) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (message.includes(MessageType.SESSION_SETUP_REQUEST)) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (message.includes(MessageType.HANDSHAKE)) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (message.includes(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"]}
|
|
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.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"]}
|
|
@@ -115,34 +115,36 @@ class RealMoonBridgeIpcServer {
|
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
let messageType = MessageType.UNKNOWN;
|
|
118
|
-
|
|
118
|
+
const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
|
|
119
|
+
const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
|
|
120
|
+
if (actualType === MessageType.REGISTRATION) {
|
|
119
121
|
messageType = MessageType.REGISTRATION;
|
|
120
122
|
this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));
|
|
121
|
-
} else if (
|
|
123
|
+
} else if (actualType === MessageType.UNREGISTRATION) {
|
|
122
124
|
messageType = MessageType.UNREGISTRATION;
|
|
123
125
|
this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));
|
|
124
|
-
} else if (
|
|
126
|
+
} else if (actualType === MessageType.EVENT) {
|
|
125
127
|
messageType = MessageType.EVENT;
|
|
126
128
|
this._onEvent(IpcMessageDecoder.decodeEvent(message));
|
|
127
|
-
} else if (
|
|
129
|
+
} else if (actualType === MessageType.ERROR) {
|
|
128
130
|
messageType = MessageType.ERROR;
|
|
129
131
|
this._onError(IpcMessageDecoder.decodeError(message));
|
|
130
|
-
} else if (
|
|
132
|
+
} else if (actualType === MessageType.REQUEST) {
|
|
131
133
|
messageType = MessageType.REQUEST;
|
|
132
134
|
this._onRequest(IpcMessageDecoder.decodeRequest(message));
|
|
133
|
-
} else if (
|
|
135
|
+
} else if (actualType === MessageType.RESPONSE) {
|
|
134
136
|
messageType = MessageType.RESPONSE;
|
|
135
137
|
this._onResponse(IpcMessageDecoder.decodeResponse(message));
|
|
136
|
-
} else if (
|
|
138
|
+
} else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
|
|
137
139
|
messageType = MessageType.SESSION_SETUP_REQUEST;
|
|
138
140
|
this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
139
|
-
} else if (
|
|
141
|
+
} else if (actualType === MessageType.HANDSHAKE) {
|
|
140
142
|
messageType = MessageType.HANDSHAKE;
|
|
141
143
|
this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
|
|
142
|
-
} else if (
|
|
144
|
+
} else if (actualType === MessageType.PING) {
|
|
143
145
|
messageType = MessageType.PING;
|
|
144
146
|
this._onPing(IpcMessageDecoder.decodePing(message));
|
|
145
|
-
} else {
|
|
147
|
+
} else if (actualType === MessageType.SESSION_SETUP_RESPONSE) ; else {
|
|
146
148
|
logger.error(`\u65E0\u6CD5\u8BC6\u522B\u7684\u6D88\u606F\u7C7B\u578B: ${message}`);
|
|
147
149
|
}
|
|
148
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 if (message.includes(MessageType.REGISTRATION)) {\n messageType = MessageType.REGISTRATION;\n this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));\n } else if (message.includes(MessageType.UNREGISTRATION)) {\n messageType = MessageType.UNREGISTRATION;\n this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));\n } else if (message.includes(MessageType.EVENT)) {\n messageType = MessageType.EVENT;\n this._onEvent(IpcMessageDecoder.decodeEvent(message));\n } else if (message.includes(MessageType.ERROR)) {\n messageType = MessageType.ERROR;\n this._onError(IpcMessageDecoder.decodeError(message));\n } else if (message.includes(MessageType.REQUEST)) {\n messageType = MessageType.REQUEST;\n this._onRequest(IpcMessageDecoder.decodeRequest(message));\n } else if (message.includes(MessageType.RESPONSE)) {\n messageType = MessageType.RESPONSE;\n this._onResponse(IpcMessageDecoder.decodeResponse(message));\n } else if (message.includes(MessageType.SESSION_SETUP_REQUEST)) {\n messageType = MessageType.SESSION_SETUP_REQUEST;\n this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));\n } else if (message.includes(MessageType.HANDSHAKE)) {\n messageType = MessageType.HANDSHAKE;\n this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);\n } else if (message.includes(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"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -177,33 +177,39 @@ export class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {
|
|
|
177
177
|
|
|
178
178
|
let messageType = MessageType.UNKNOWN;
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
|
|
181
|
+
const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
|
|
182
|
+
|
|
183
|
+
if (actualType === MessageType.REGISTRATION) {
|
|
181
184
|
messageType = MessageType.REGISTRATION;
|
|
182
185
|
this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));
|
|
183
|
-
} else if (
|
|
186
|
+
} else if (actualType === MessageType.UNREGISTRATION) {
|
|
184
187
|
messageType = MessageType.UNREGISTRATION;
|
|
185
188
|
this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));
|
|
186
|
-
} else if (
|
|
189
|
+
} else if (actualType === MessageType.EVENT) {
|
|
187
190
|
messageType = MessageType.EVENT;
|
|
188
191
|
this._onEvent(IpcMessageDecoder.decodeEvent(message));
|
|
189
|
-
} else if (
|
|
192
|
+
} else if (actualType === MessageType.ERROR) {
|
|
190
193
|
messageType = MessageType.ERROR;
|
|
191
194
|
this._onError(IpcMessageDecoder.decodeError(message));
|
|
192
|
-
} else if (
|
|
195
|
+
} else if (actualType === MessageType.REQUEST) {
|
|
193
196
|
messageType = MessageType.REQUEST;
|
|
194
197
|
this._onRequest(IpcMessageDecoder.decodeRequest(message));
|
|
195
|
-
} else if (
|
|
198
|
+
} else if (actualType === MessageType.RESPONSE) {
|
|
196
199
|
messageType = MessageType.RESPONSE;
|
|
197
200
|
this._onResponse(IpcMessageDecoder.decodeResponse(message));
|
|
198
|
-
} else if (
|
|
201
|
+
} else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
|
|
199
202
|
messageType = MessageType.SESSION_SETUP_REQUEST;
|
|
200
203
|
this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
|
|
201
|
-
} else if (
|
|
204
|
+
} else if (actualType === MessageType.HANDSHAKE) {
|
|
202
205
|
messageType = MessageType.HANDSHAKE;
|
|
203
206
|
this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
|
|
204
|
-
} else if (
|
|
207
|
+
} else if (actualType === MessageType.PING) {
|
|
205
208
|
messageType = MessageType.PING;
|
|
206
209
|
this._onPing(IpcMessageDecoder.decodePing(message));
|
|
210
|
+
} else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {
|
|
211
|
+
// SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理
|
|
212
|
+
// 这里可以添加相关处理逻辑,如果需要的话
|
|
207
213
|
} else {
|
|
208
214
|
logger.error(`无法识别的消息类型: ${message}`);
|
|
209
215
|
}
|