moonbridge-ts 0.6.4 → 0.7.0

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.
Files changed (23) hide show
  1. package/dist/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.d.ts +2 -2
  2. package/dist/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.js +2 -2
  3. package/dist/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.js.map +1 -1
  4. package/dist/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.mjs +2 -2
  5. package/dist/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.mjs.map +1 -1
  6. package/dist/moonbridge-ipc/client/types/ipc_messenger.d.ts +24 -8
  7. package/dist/moonbridge-ipc/client/types/ipc_messenger.d.ts.map +1 -1
  8. package/dist/moonbridge-ipc/client/types/ipc_types.d.ts +10 -2
  9. package/dist/moonbridge-ipc/client/types/ipc_types.d.ts.map +1 -1
  10. package/dist/moonbridge-ipc/client/types/ipc_types.js.map +1 -1
  11. package/dist/moonbridge-ipc/client/types/ipc_types.mjs.map +1 -1
  12. package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.d.ts.map +1 -1
  13. package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.js +9 -11
  14. package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.js.map +1 -1
  15. package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.mjs +9 -11
  16. package/dist/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.mjs.map +1 -1
  17. package/package.json +1 -1
  18. package/src/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.ts +9 -9
  19. package/src/moonbridge-ipc/client/types/ipc_messenger.ts +24 -8
  20. package/src/moonbridge-ipc/client/types/ipc_types.ts +10 -2
  21. package/src/moonbridge-ipc/server/internal/moonbridge_ipc_server.internal.ts +10 -14
  22. package/tests/unit/rpc_service_factory.test.ts +6 -6
  23. package/tests/unit/rpc_service_proxy.test.ts +6 -6
@@ -4,7 +4,7 @@
4
4
  import { IpcClientSettings } from './settings/ipc_client_settings';
5
5
  import { IpcConnectionCompletionHandler } from '../types/ipc_types';
6
6
  import { MoonBridgeIpcClient } from '../moonbridge_ipc_client';
7
- import { Messenger, MessageEndpoint, RoutedMessage } from '../types/ipc_messenger';
7
+ import { Messenger, MessageEndpoint, MessageSender } from '../types/ipc_messenger';
8
8
  import { EventBus } from '../types/ipc_event_bus';
9
9
  import { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';
10
10
  import { IpcConnectionManager } from './ipc/connect/ipc_connection_manager';
@@ -34,7 +34,7 @@ export declare class RealMoonBridgeIpcClient implements IpcClientComponentProvid
34
34
  isConnected(): boolean;
35
35
  get messenger(): Messenger;
36
36
  get eventBus(): EventBus;
37
- call(target: MessageEndpoint): RoutedMessage;
37
+ call(target: MessageEndpoint): MessageSender;
38
38
  private sendMessage;
39
39
  private realPostMessage;
40
40
  }
@@ -56,7 +56,7 @@ class RealMoonBridgeIpcClient {
56
56
  baseStrategy.retries,
57
57
  baseStrategy.autoLaunch
58
58
  );
59
- return new RoutedMessageImpl(
59
+ return new RealMessageSender(
60
60
  strategy,
61
61
  (args, callStrategy, onError) => {
62
62
  this.sendMessage(target, args, callStrategy, onError);
@@ -105,7 +105,7 @@ class RealMoonBridgeIpcClient {
105
105
  );
106
106
  }
107
107
  }
108
- class RoutedMessageImpl {
108
+ class RealMessageSender {
109
109
  constructor(strategy, dispatch) {
110
110
  this.dispatch = dispatch;
111
111
  this.argsList = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.ts"],"names":["IpcConnectionManager","IpcRequestCoordinator","IpcCommunicationAgent","IpcEventBus","IpcConnectionKeeper","IpcClientBridge","DefaultRpcServiceFactory","logger","IpcMessageStrategy"],"mappings":"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","file":"moonbridge_ipc_client.internal.js","sourcesContent":["/**\n * MoonBridge IPC 客户端实际实现与注册表,对应 Flutter lib/client/internal/moonbridge_ipc_client.internal.dart。\n */\n\nimport { IpcClientSettings } from './settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler, IpcErrorCallback } from '../types/ipc_types';\nimport { MoonBridgeIpcClient } from '../moonbridge_ipc_client';\nimport { Messenger, MessageEndpoint, RoutedMessage } from '../types/ipc_messenger';\nimport { EventBus } from '../types/ipc_event_bus';\nimport { logger } from '../../utils/logger';\nimport { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';\nimport { IpcConnectionManager } from './ipc/connect/ipc_connection_manager';\nimport { IpcRequestCoordinator } from './ipc/coordinator/ipc_request_coordinator';\nimport { IpcCommunicationAgent } from './ipc/communication/ipc_communication_agent';\nimport { IpcEventBus } from './ipc/eventbus/ipc_event_bus';\nimport { IpcConnectionKeeper } from './ipc/keep/ipc_connection_keeper';\nimport { IpcClientBridge } from './bridge/ipc_client_bridge';\nimport { DefaultRpcServiceFactory, RpcServiceFactory } from '../rpc/rpc_service_factory';\n\n/**\n * 实际 IPC 客户端实现:继承组件装配,并实现 MoonBridgeIpcClient、Messenger。\n * 装配顺序与 Flutter RealMoonBridgeIpcClient 一致;JS 不传入 moduleFactories(见 spec 012)。\n */\nexport class RealMoonBridgeIpcClient implements IpcClientComponentProvider, MoonBridgeIpcClient, Messenger {\n readonly settings: IpcClientSettings;\n readonly connectionManager: IpcConnectionManager;\n readonly requestCoordinator: IpcRequestCoordinator;\n readonly communicationAgent: IpcCommunicationAgent;\n readonly ipcEventBus: IpcEventBus;\n readonly connectionKeeper: IpcConnectionKeeper;\n readonly bridge: IpcClientBridge;\n readonly rpcServiceFactory: RpcServiceFactory;\n\n // CONSTRUCTOR\n\n constructor(settings: IpcClientSettings) {\n this.settings = settings;\n\n this.connectionManager = new IpcConnectionManager(this);\n this.requestCoordinator = new IpcRequestCoordinator(this);\n this.communicationAgent = new IpcCommunicationAgent(this);\n this.ipcEventBus = new IpcEventBus(this);\n this.connectionKeeper = new IpcConnectionKeeper(this);\n this.bridge = new IpcClientBridge(this, this.communicationAgent);\n this.rpcServiceFactory = new DefaultRpcServiceFactory(this);\n\n this.connectionManager.initialize();\n this.requestCoordinator.initialize();\n this.communicationAgent.initialize();\n this.ipcEventBus.initialize();\n this.connectionKeeper.initialize();\n this.bridge.initialize();\n\n logger.info(`[MoonBridgeIpcClient] 客户端 \"${settings.clientName}\" 已创建`);\n }\n\n // PUBLIC METHODS\n\n get clientName(): string {\n return this.settings.clientName;\n }\n\n connect(onResult?: IpcConnectionCompletionHandler): void {\n this.connectionManager.connect(onResult);\n this.connectionKeeper.startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.connectionKeeper.stopHeartbeat();\n }\n\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n get messenger(): Messenger {\n return this;\n }\n\n get eventBus(): EventBus {\n return this.ipcEventBus;\n }\n\n call(target: MessageEndpoint): RoutedMessage {\n const baseStrategy = this.settings.messageStrategy;\n const strategy = new IpcMessageStrategy(\n baseStrategy.retries,\n baseStrategy.autoLaunch,\n );\n return new RoutedMessageImpl(\n strategy,\n (args, callStrategy, onError) => {\n this.sendMessage(target, args, callStrategy, onError);\n },\n );\n }\n\n // PRIVATE METHODS\n\n private sendMessage(\n target: MessageEndpoint,\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ): void {\n const remainingRetries = Math.max(strategy.retries, 0);\n this.realPostMessage(\n target.clientName,\n target.moduleName,\n target.methodName,\n args,\n onError,\n strategy,\n remainingRetries,\n );\n }\n\n private realPostMessage(\n clientName: string,\n moduleName: string,\n methodName: string,\n argumentsList: unknown[],\n onError: IpcErrorCallback | undefined,\n strategy: IpcMessageStrategy,\n remainingRetries: number,\n ): void {\n const request = this.requestCoordinator.prepareAndCreateIpcRequest({\n toClient: clientName,\n moduleName,\n methodName,\n arguments: argumentsList,\n onError,\n });\n\n this.communicationAgent.sendRequestAfterSetupSession(\n request,\n strategy,\n (success, error) => {\n if (remainingRetries - 1 <= 0) {\n if (!success && error) onError?.(error);\n return;\n }\n this.realPostMessage(\n clientName,\n moduleName,\n methodName,\n argumentsList,\n onError,\n strategy,\n remainingRetries - 1,\n );\n },\n );\n }\n}\n\nclass RoutedMessageImpl implements RoutedMessage {\n private argsList: unknown[] = [];\n private currentStrategy: IpcMessageStrategy;\n private errorCallback?: IpcErrorCallback;\n\n constructor(\n strategy: IpcMessageStrategy,\n private readonly dispatch: (\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ) => void,\n ) {\n this.currentStrategy = strategy;\n }\n\n args(args: unknown[]): RoutedMessage;\n args(...args: unknown[]): RoutedMessage;\n args(...argsOrList: unknown[]): RoutedMessage {\n if (argsOrList.length === 1 && Array.isArray(argsOrList[0])) {\n this.argsList = [...(argsOrList[0] as unknown[])];\n return this;\n }\n this.argsList = [...argsOrList];\n return this;\n }\n\n strategy(strategy: IpcMessageStrategy): RoutedMessage {\n this.currentStrategy = strategy;\n return this;\n }\n\n onError(onError?: IpcErrorCallback): RoutedMessage {\n this.errorCallback = onError;\n return this;\n }\n\n send(): void {\n this.dispatch(this.argsList, this.currentStrategy, this.errorCallback);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.ts"],"names":["IpcConnectionManager","IpcRequestCoordinator","IpcCommunicationAgent","IpcEventBus","IpcConnectionKeeper","IpcClientBridge","DefaultRpcServiceFactory","logger","IpcMessageStrategy"],"mappings":"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","file":"moonbridge_ipc_client.internal.js","sourcesContent":["/**\n * MoonBridge IPC 客户端实际实现与注册表,对应 Flutter lib/client/internal/moonbridge_ipc_client.internal.dart。\n */\n\nimport { IpcClientSettings } from './settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler, IpcErrorCallback } from '../types/ipc_types';\nimport { MoonBridgeIpcClient } from '../moonbridge_ipc_client';\nimport { Messenger, MessageEndpoint, MessageSender } from '../types/ipc_messenger';\nimport { EventBus } from '../types/ipc_event_bus';\nimport { logger } from '../../utils/logger';\nimport { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';\nimport { IpcConnectionManager } from './ipc/connect/ipc_connection_manager';\nimport { IpcRequestCoordinator } from './ipc/coordinator/ipc_request_coordinator';\nimport { IpcCommunicationAgent } from './ipc/communication/ipc_communication_agent';\nimport { IpcEventBus } from './ipc/eventbus/ipc_event_bus';\nimport { IpcConnectionKeeper } from './ipc/keep/ipc_connection_keeper';\nimport { IpcClientBridge } from './bridge/ipc_client_bridge';\nimport { DefaultRpcServiceFactory, RpcServiceFactory } from '../rpc/rpc_service_factory';\n\n/**\n * 实际 IPC 客户端实现:继承组件装配,并实现 MoonBridgeIpcClient、Messenger。\n * 装配顺序与 Flutter RealMoonBridgeIpcClient 一致;JS 不传入 moduleFactories(见 spec 012)。\n */\nexport class RealMoonBridgeIpcClient implements IpcClientComponentProvider, MoonBridgeIpcClient, Messenger {\n readonly settings: IpcClientSettings;\n readonly connectionManager: IpcConnectionManager;\n readonly requestCoordinator: IpcRequestCoordinator;\n readonly communicationAgent: IpcCommunicationAgent;\n readonly ipcEventBus: IpcEventBus;\n readonly connectionKeeper: IpcConnectionKeeper;\n readonly bridge: IpcClientBridge;\n readonly rpcServiceFactory: RpcServiceFactory;\n\n // CONSTRUCTOR\n\n constructor(settings: IpcClientSettings) {\n this.settings = settings;\n\n this.connectionManager = new IpcConnectionManager(this);\n this.requestCoordinator = new IpcRequestCoordinator(this);\n this.communicationAgent = new IpcCommunicationAgent(this);\n this.ipcEventBus = new IpcEventBus(this);\n this.connectionKeeper = new IpcConnectionKeeper(this);\n this.bridge = new IpcClientBridge(this, this.communicationAgent);\n this.rpcServiceFactory = new DefaultRpcServiceFactory(this);\n\n this.connectionManager.initialize();\n this.requestCoordinator.initialize();\n this.communicationAgent.initialize();\n this.ipcEventBus.initialize();\n this.connectionKeeper.initialize();\n this.bridge.initialize();\n\n logger.info(`[MoonBridgeIpcClient] 客户端 \"${settings.clientName}\" 已创建`);\n }\n\n // PUBLIC METHODS\n\n get clientName(): string {\n return this.settings.clientName;\n }\n\n connect(onResult?: IpcConnectionCompletionHandler): void {\n this.connectionManager.connect(onResult);\n this.connectionKeeper.startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.connectionKeeper.stopHeartbeat();\n }\n\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n get messenger(): Messenger {\n return this;\n }\n\n get eventBus(): EventBus {\n return this.ipcEventBus;\n }\n\n call(target: MessageEndpoint): MessageSender {\n const baseStrategy = this.settings.messageStrategy;\n const strategy = new IpcMessageStrategy(\n baseStrategy.retries,\n baseStrategy.autoLaunch,\n );\n return new RealMessageSender(\n strategy,\n (args, callStrategy, onError) => {\n this.sendMessage(target, args, callStrategy, onError);\n },\n );\n }\n\n // PRIVATE METHODS\n\n private sendMessage(\n target: MessageEndpoint,\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ): void {\n const remainingRetries = Math.max(strategy.retries, 0);\n this.realPostMessage(\n target.clientName,\n target.moduleName,\n target.methodName,\n args,\n onError,\n strategy,\n remainingRetries,\n );\n }\n\n private realPostMessage(\n clientName: string,\n moduleName: string,\n methodName: string,\n argumentsList: unknown[],\n onError: IpcErrorCallback | undefined,\n strategy: IpcMessageStrategy,\n remainingRetries: number,\n ): void {\n const request = this.requestCoordinator.prepareAndCreateIpcRequest({\n toClient: clientName,\n moduleName,\n methodName,\n arguments: argumentsList,\n onError,\n });\n\n this.communicationAgent.sendRequestAfterSetupSession(\n request,\n strategy,\n (success, error) => {\n if (remainingRetries - 1 <= 0) {\n if (!success && error) onError?.(error);\n return;\n }\n this.realPostMessage(\n clientName,\n moduleName,\n methodName,\n argumentsList,\n onError,\n strategy,\n remainingRetries - 1,\n );\n },\n );\n }\n}\n\nclass RealMessageSender implements MessageSender {\n private argsList: unknown[] = [];\n private currentStrategy: IpcMessageStrategy;\n private errorCallback?: IpcErrorCallback;\n\n constructor(\n strategy: IpcMessageStrategy,\n private readonly dispatch: (\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ) => void,\n ) {\n this.currentStrategy = strategy;\n }\n\n args(args: unknown[]): MessageSender;\n args(...args: unknown[]): MessageSender;\n args(...argsOrList: unknown[]): MessageSender {\n if (argsOrList.length === 1 && Array.isArray(argsOrList[0])) {\n this.argsList = [...(argsOrList[0] as unknown[])];\n return this;\n }\n this.argsList = [...argsOrList];\n return this;\n }\n\n strategy(strategy: IpcMessageStrategy): MessageSender {\n this.currentStrategy = strategy;\n return this;\n }\n\n onError(onError?: IpcErrorCallback): MessageSender {\n this.errorCallback = onError;\n return this;\n }\n\n send(): void {\n this.dispatch(this.argsList, this.currentStrategy, this.errorCallback);\n }\n}\n"]}
@@ -54,7 +54,7 @@ class RealMoonBridgeIpcClient {
54
54
  baseStrategy.retries,
55
55
  baseStrategy.autoLaunch
56
56
  );
57
- return new RoutedMessageImpl(
57
+ return new RealMessageSender(
58
58
  strategy,
59
59
  (args, callStrategy, onError) => {
60
60
  this.sendMessage(target, args, callStrategy, onError);
@@ -103,7 +103,7 @@ class RealMoonBridgeIpcClient {
103
103
  );
104
104
  }
105
105
  }
106
- class RoutedMessageImpl {
106
+ class RealMessageSender {
107
107
  constructor(strategy, dispatch) {
108
108
  this.dispatch = dispatch;
109
109
  this.argsList = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.ts"],"names":[],"mappings":"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","file":"moonbridge_ipc_client.internal.mjs","sourcesContent":["/**\n * MoonBridge IPC 客户端实际实现与注册表,对应 Flutter lib/client/internal/moonbridge_ipc_client.internal.dart。\n */\n\nimport { IpcClientSettings } from './settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler, IpcErrorCallback } from '../types/ipc_types';\nimport { MoonBridgeIpcClient } from '../moonbridge_ipc_client';\nimport { Messenger, MessageEndpoint, RoutedMessage } from '../types/ipc_messenger';\nimport { EventBus } from '../types/ipc_event_bus';\nimport { logger } from '../../utils/logger';\nimport { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';\nimport { IpcConnectionManager } from './ipc/connect/ipc_connection_manager';\nimport { IpcRequestCoordinator } from './ipc/coordinator/ipc_request_coordinator';\nimport { IpcCommunicationAgent } from './ipc/communication/ipc_communication_agent';\nimport { IpcEventBus } from './ipc/eventbus/ipc_event_bus';\nimport { IpcConnectionKeeper } from './ipc/keep/ipc_connection_keeper';\nimport { IpcClientBridge } from './bridge/ipc_client_bridge';\nimport { DefaultRpcServiceFactory, RpcServiceFactory } from '../rpc/rpc_service_factory';\n\n/**\n * 实际 IPC 客户端实现:继承组件装配,并实现 MoonBridgeIpcClient、Messenger。\n * 装配顺序与 Flutter RealMoonBridgeIpcClient 一致;JS 不传入 moduleFactories(见 spec 012)。\n */\nexport class RealMoonBridgeIpcClient implements IpcClientComponentProvider, MoonBridgeIpcClient, Messenger {\n readonly settings: IpcClientSettings;\n readonly connectionManager: IpcConnectionManager;\n readonly requestCoordinator: IpcRequestCoordinator;\n readonly communicationAgent: IpcCommunicationAgent;\n readonly ipcEventBus: IpcEventBus;\n readonly connectionKeeper: IpcConnectionKeeper;\n readonly bridge: IpcClientBridge;\n readonly rpcServiceFactory: RpcServiceFactory;\n\n // CONSTRUCTOR\n\n constructor(settings: IpcClientSettings) {\n this.settings = settings;\n\n this.connectionManager = new IpcConnectionManager(this);\n this.requestCoordinator = new IpcRequestCoordinator(this);\n this.communicationAgent = new IpcCommunicationAgent(this);\n this.ipcEventBus = new IpcEventBus(this);\n this.connectionKeeper = new IpcConnectionKeeper(this);\n this.bridge = new IpcClientBridge(this, this.communicationAgent);\n this.rpcServiceFactory = new DefaultRpcServiceFactory(this);\n\n this.connectionManager.initialize();\n this.requestCoordinator.initialize();\n this.communicationAgent.initialize();\n this.ipcEventBus.initialize();\n this.connectionKeeper.initialize();\n this.bridge.initialize();\n\n logger.info(`[MoonBridgeIpcClient] 客户端 \"${settings.clientName}\" 已创建`);\n }\n\n // PUBLIC METHODS\n\n get clientName(): string {\n return this.settings.clientName;\n }\n\n connect(onResult?: IpcConnectionCompletionHandler): void {\n this.connectionManager.connect(onResult);\n this.connectionKeeper.startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.connectionKeeper.stopHeartbeat();\n }\n\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n get messenger(): Messenger {\n return this;\n }\n\n get eventBus(): EventBus {\n return this.ipcEventBus;\n }\n\n call(target: MessageEndpoint): RoutedMessage {\n const baseStrategy = this.settings.messageStrategy;\n const strategy = new IpcMessageStrategy(\n baseStrategy.retries,\n baseStrategy.autoLaunch,\n );\n return new RoutedMessageImpl(\n strategy,\n (args, callStrategy, onError) => {\n this.sendMessage(target, args, callStrategy, onError);\n },\n );\n }\n\n // PRIVATE METHODS\n\n private sendMessage(\n target: MessageEndpoint,\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ): void {\n const remainingRetries = Math.max(strategy.retries, 0);\n this.realPostMessage(\n target.clientName,\n target.moduleName,\n target.methodName,\n args,\n onError,\n strategy,\n remainingRetries,\n );\n }\n\n private realPostMessage(\n clientName: string,\n moduleName: string,\n methodName: string,\n argumentsList: unknown[],\n onError: IpcErrorCallback | undefined,\n strategy: IpcMessageStrategy,\n remainingRetries: number,\n ): void {\n const request = this.requestCoordinator.prepareAndCreateIpcRequest({\n toClient: clientName,\n moduleName,\n methodName,\n arguments: argumentsList,\n onError,\n });\n\n this.communicationAgent.sendRequestAfterSetupSession(\n request,\n strategy,\n (success, error) => {\n if (remainingRetries - 1 <= 0) {\n if (!success && error) onError?.(error);\n return;\n }\n this.realPostMessage(\n clientName,\n moduleName,\n methodName,\n argumentsList,\n onError,\n strategy,\n remainingRetries - 1,\n );\n },\n );\n }\n}\n\nclass RoutedMessageImpl implements RoutedMessage {\n private argsList: unknown[] = [];\n private currentStrategy: IpcMessageStrategy;\n private errorCallback?: IpcErrorCallback;\n\n constructor(\n strategy: IpcMessageStrategy,\n private readonly dispatch: (\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ) => void,\n ) {\n this.currentStrategy = strategy;\n }\n\n args(args: unknown[]): RoutedMessage;\n args(...args: unknown[]): RoutedMessage;\n args(...argsOrList: unknown[]): RoutedMessage {\n if (argsOrList.length === 1 && Array.isArray(argsOrList[0])) {\n this.argsList = [...(argsOrList[0] as unknown[])];\n return this;\n }\n this.argsList = [...argsOrList];\n return this;\n }\n\n strategy(strategy: IpcMessageStrategy): RoutedMessage {\n this.currentStrategy = strategy;\n return this;\n }\n\n onError(onError?: IpcErrorCallback): RoutedMessage {\n this.errorCallback = onError;\n return this;\n }\n\n send(): void {\n this.dispatch(this.argsList, this.currentStrategy, this.errorCallback);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/moonbridge-ipc/client/internal/moonbridge_ipc_client.internal.ts"],"names":[],"mappings":"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","file":"moonbridge_ipc_client.internal.mjs","sourcesContent":["/**\n * MoonBridge IPC 客户端实际实现与注册表,对应 Flutter lib/client/internal/moonbridge_ipc_client.internal.dart。\n */\n\nimport { IpcClientSettings } from './settings/ipc_client_settings';\nimport { IpcMessageStrategy } from '../types/ipc_message_strategy';\nimport { IpcConnectionCompletionHandler, IpcErrorCallback } from '../types/ipc_types';\nimport { MoonBridgeIpcClient } from '../moonbridge_ipc_client';\nimport { Messenger, MessageEndpoint, MessageSender } from '../types/ipc_messenger';\nimport { EventBus } from '../types/ipc_event_bus';\nimport { logger } from '../../utils/logger';\nimport { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';\nimport { IpcConnectionManager } from './ipc/connect/ipc_connection_manager';\nimport { IpcRequestCoordinator } from './ipc/coordinator/ipc_request_coordinator';\nimport { IpcCommunicationAgent } from './ipc/communication/ipc_communication_agent';\nimport { IpcEventBus } from './ipc/eventbus/ipc_event_bus';\nimport { IpcConnectionKeeper } from './ipc/keep/ipc_connection_keeper';\nimport { IpcClientBridge } from './bridge/ipc_client_bridge';\nimport { DefaultRpcServiceFactory, RpcServiceFactory } from '../rpc/rpc_service_factory';\n\n/**\n * 实际 IPC 客户端实现:继承组件装配,并实现 MoonBridgeIpcClient、Messenger。\n * 装配顺序与 Flutter RealMoonBridgeIpcClient 一致;JS 不传入 moduleFactories(见 spec 012)。\n */\nexport class RealMoonBridgeIpcClient implements IpcClientComponentProvider, MoonBridgeIpcClient, Messenger {\n readonly settings: IpcClientSettings;\n readonly connectionManager: IpcConnectionManager;\n readonly requestCoordinator: IpcRequestCoordinator;\n readonly communicationAgent: IpcCommunicationAgent;\n readonly ipcEventBus: IpcEventBus;\n readonly connectionKeeper: IpcConnectionKeeper;\n readonly bridge: IpcClientBridge;\n readonly rpcServiceFactory: RpcServiceFactory;\n\n // CONSTRUCTOR\n\n constructor(settings: IpcClientSettings) {\n this.settings = settings;\n\n this.connectionManager = new IpcConnectionManager(this);\n this.requestCoordinator = new IpcRequestCoordinator(this);\n this.communicationAgent = new IpcCommunicationAgent(this);\n this.ipcEventBus = new IpcEventBus(this);\n this.connectionKeeper = new IpcConnectionKeeper(this);\n this.bridge = new IpcClientBridge(this, this.communicationAgent);\n this.rpcServiceFactory = new DefaultRpcServiceFactory(this);\n\n this.connectionManager.initialize();\n this.requestCoordinator.initialize();\n this.communicationAgent.initialize();\n this.ipcEventBus.initialize();\n this.connectionKeeper.initialize();\n this.bridge.initialize();\n\n logger.info(`[MoonBridgeIpcClient] 客户端 \"${settings.clientName}\" 已创建`);\n }\n\n // PUBLIC METHODS\n\n get clientName(): string {\n return this.settings.clientName;\n }\n\n connect(onResult?: IpcConnectionCompletionHandler): void {\n this.connectionManager.connect(onResult);\n this.connectionKeeper.startHeartbeat();\n }\n\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.connectionKeeper.stopHeartbeat();\n }\n\n isConnected(): boolean {\n return this.connectionManager.isConnected();\n }\n\n get messenger(): Messenger {\n return this;\n }\n\n get eventBus(): EventBus {\n return this.ipcEventBus;\n }\n\n call(target: MessageEndpoint): MessageSender {\n const baseStrategy = this.settings.messageStrategy;\n const strategy = new IpcMessageStrategy(\n baseStrategy.retries,\n baseStrategy.autoLaunch,\n );\n return new RealMessageSender(\n strategy,\n (args, callStrategy, onError) => {\n this.sendMessage(target, args, callStrategy, onError);\n },\n );\n }\n\n // PRIVATE METHODS\n\n private sendMessage(\n target: MessageEndpoint,\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ): void {\n const remainingRetries = Math.max(strategy.retries, 0);\n this.realPostMessage(\n target.clientName,\n target.moduleName,\n target.methodName,\n args,\n onError,\n strategy,\n remainingRetries,\n );\n }\n\n private realPostMessage(\n clientName: string,\n moduleName: string,\n methodName: string,\n argumentsList: unknown[],\n onError: IpcErrorCallback | undefined,\n strategy: IpcMessageStrategy,\n remainingRetries: number,\n ): void {\n const request = this.requestCoordinator.prepareAndCreateIpcRequest({\n toClient: clientName,\n moduleName,\n methodName,\n arguments: argumentsList,\n onError,\n });\n\n this.communicationAgent.sendRequestAfterSetupSession(\n request,\n strategy,\n (success, error) => {\n if (remainingRetries - 1 <= 0) {\n if (!success && error) onError?.(error);\n return;\n }\n this.realPostMessage(\n clientName,\n moduleName,\n methodName,\n argumentsList,\n onError,\n strategy,\n remainingRetries - 1,\n );\n },\n );\n }\n}\n\nclass RealMessageSender implements MessageSender {\n private argsList: unknown[] = [];\n private currentStrategy: IpcMessageStrategy;\n private errorCallback?: IpcErrorCallback;\n\n constructor(\n strategy: IpcMessageStrategy,\n private readonly dispatch: (\n args: unknown[],\n strategy: IpcMessageStrategy,\n onError?: IpcErrorCallback,\n ) => void,\n ) {\n this.currentStrategy = strategy;\n }\n\n args(args: unknown[]): MessageSender;\n args(...args: unknown[]): MessageSender;\n args(...argsOrList: unknown[]): MessageSender {\n if (argsOrList.length === 1 && Array.isArray(argsOrList[0])) {\n this.argsList = [...(argsOrList[0] as unknown[])];\n return this;\n }\n this.argsList = [...argsOrList];\n return this;\n }\n\n strategy(strategy: IpcMessageStrategy): MessageSender {\n this.currentStrategy = strategy;\n return this;\n }\n\n onError(onError?: IpcErrorCallback): MessageSender {\n this.errorCallback = onError;\n return this;\n }\n\n send(): void {\n this.dispatch(this.argsList, this.currentStrategy, this.errorCallback);\n }\n}\n"]}
@@ -16,21 +16,29 @@ export type MessageEndpoint = {
16
16
  /**
17
17
  * call API 返回的可链式请求对象。
18
18
  */
19
- export interface RoutedMessage {
19
+ export interface MessageSender {
20
20
  /**
21
21
  * 设置参数。
22
- * 支持 `args([a, b])` 或 `args(a, b)` 两种写法。
22
+ * 支持 `args([a, b])` 或 `args(a, b)` 两种写法。如果需要接收响应,可以在参数中使用 `IpcResponseCallback` 作为参数类型。
23
+ *
24
+ * ```ts
25
+ * messenger
26
+ * .call({ clientName: 'client_b', moduleName: 'CallPhone', methodName: 'callWithCallback' })
27
+ * .args('0431-4610123', (response) => console.log('response:', response))
28
+ * .onError((error) => console.error('ipc error:', error))
29
+ * .send();
30
+ * ```
23
31
  */
24
- args(args: unknown[]): RoutedMessage;
25
- args(...args: unknown[]): RoutedMessage;
32
+ args(args: unknown[]): MessageSender;
33
+ args(...args: unknown[]): MessageSender;
26
34
  /**
27
35
  * 设置消息策略(重试次数、是否自动唤醒)。
28
36
  */
29
- strategy(strategy: IpcMessageStrategy): RoutedMessage;
37
+ strategy(strategy: IpcMessageStrategy): MessageSender;
30
38
  /**
31
39
  * 设置 IPC 发送错误回调。
32
40
  */
33
- onError(onError?: IpcErrorCallback): RoutedMessage;
41
+ onError(onError?: IpcErrorCallback): MessageSender;
34
42
  /**
35
43
  * 发送消息。
36
44
  */
@@ -42,13 +50,21 @@ export interface Messenger {
42
50
  *
43
51
  * 示例:
44
52
  * ```ts
53
+ * import { IpcResponseCallback } from 'moonbridge-ts';
54
+ *
55
+ * const onResponse = (response: unknown[]) => console.log('response:', response);
56
+ *
45
57
  * messenger
46
- * .call({ clientName: 'client_b', moduleName: 'CallPhone', methodName: 'callWithCallback' })
58
+ * .call({
59
+ * clientName: 'client_b',
60
+ * moduleName: 'CallPhone',
61
+ * methodName: 'callWithCallback',
62
+ * })
47
63
  * .args('0431-4610123', onResponse)
48
64
  * .onError(console.error)
49
65
  * .send();
50
66
  * ```
51
67
  */
52
- call(target: MessageEndpoint): RoutedMessage;
68
+ call(target: MessageEndpoint): MessageSender;
53
69
  }
54
70
  //# sourceMappingURL=ipc_messenger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipc_messenger.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/client/types/ipc_messenger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,CAAC;IAEtD;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC;IAEnD;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAAC;CAC9C"}
1
+ {"version":3,"file":"ipc_messenger.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/client/types/ipc_messenger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,CAAC;IAEtD;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC;IAEnD;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAAC;CAC9C"}
@@ -6,9 +6,17 @@ import { IpcError } from '../../general/error/ipc_error';
6
6
  import { Request } from '../../general/message/request';
7
7
  import { Response } from '../../general/message/response';
8
8
  import { Error } from '../../general/message/error';
9
- /** 响应回调:接收动态数组形式的响应载荷。 */
9
+ /**
10
+ * 响应回调:在 IPC 通信过程中,作为接收响应结果的回调函数,在 MessageSender#args 以及定义的 RPC 服务方法中使用。
11
+ */
10
12
  export type IpcResponseCallback = (response: unknown[]) => void;
11
- /** 错误回调:接收 IpcError。 */
13
+ /**
14
+ * 错误回调:接收 IpcError。
15
+ *
16
+ * 注意:
17
+ * IpcErrorCallback 是用来监听 IPC 通信过程的错误,而不是用来处理业务逻辑结果的错误。
18
+ * 业务逻辑结果的错误应该通过 `IpcResponseCallback` 的回调参数来处理。
19
+ */
12
20
  export type IpcErrorCallback = (error: IpcError) => void;
13
21
  /** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */
14
22
  export type IpcConnectionCompletionHandler = (isConnected: boolean, error?: IpcError) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ipc_types.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEpD,0BAA0B;AAC1B,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAEhE,wBAAwB;AACxB,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEzD,yDAAyD;AACzD,MAAM,MAAM,8BAA8B,GAAG,CAC3C,WAAW,EAAE,OAAO,EACpB,KAAK,CAAC,EAAE,QAAQ,KACb,IAAI,CAAC;AAEV;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,0CAA0C;aAC1B,gBAAgB,CAAC,GAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO;IAChE,2BAA2B;aACX,iBAAiB,CAAC,GAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO;IACnE,2BAA2B;aACX,cAAc,CAAC,GAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO;;IAL1D,0CAA0C;IAC1B,gBAAgB,CAAC,GAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,aAAA;IAChE,2BAA2B;IACX,iBAAiB,CAAC,GAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,aAAA;IACnE,2BAA2B;IACX,cAAc,CAAC,GAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,aAAA;CAE7D;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,mBAAmB;aACH,WAAW,CAAC,GAAE,MAAM,IAAI;IACxC,mBAAmB;aACH,cAAc,CAAC,GAAE,MAAM,IAAI;;IAH3C,mBAAmB;IACH,WAAW,CAAC,GAAE,MAAM,IAAI,aAAA;IACxC,mBAAmB;IACH,cAAc,CAAC,GAAE,MAAM,IAAI,aAAA;CAE9C"}
1
+ {"version":3,"file":"ipc_types.d.ts","sourceRoot":"","sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEzD,yDAAyD;AACzD,MAAM,MAAM,8BAA8B,GAAG,CAC3C,WAAW,EAAE,OAAO,EACpB,KAAK,CAAC,EAAE,QAAQ,KACb,IAAI,CAAC;AAEV;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,0CAA0C;aAC1B,gBAAgB,CAAC,GAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO;IAChE,2BAA2B;aACX,iBAAiB,CAAC,GAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO;IACnE,2BAA2B;aACX,cAAc,CAAC,GAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO;;IAL1D,0CAA0C;IAC1B,gBAAgB,CAAC,GAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,aAAA;IAChE,2BAA2B;IACX,iBAAiB,CAAC,GAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,aAAA;IACnE,2BAA2B;IACX,cAAc,CAAC,GAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,aAAA;CAE7D;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,mBAAmB;aACH,WAAW,CAAC,GAAE,MAAM,IAAI;IACxC,mBAAmB;aACH,cAAc,CAAC,GAAE,MAAM,IAAI;;IAH3C,mBAAmB;IACH,WAAW,CAAC,GAAE,MAAM,IAAI,aAAA;IACxC,mBAAmB;IACH,cAAc,CAAC,GAAE,MAAM,IAAI,aAAA;CAE9C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":";;AA0BO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,gBAAA,EAEA,iBAAA,EAEA,cAAA,EAChB;AALgB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN;AAMO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,aAEA,cAAA,EAChB;AAHgB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN","file":"ipc_types.js","sourcesContent":["/**\n * IPC 类型定义,对应 Flutter lib/client/types/ipc_types.dart。\n * 仅定义类型,不包含具体实现逻辑。\n */\n\nimport { IpcError } from '../../general/error/ipc_error';\nimport { Request } from '../../general/message/request';\nimport { Response } from '../../general/message/response';\nimport { Error } from '../../general/message/error';\n\n/** 响应回调:接收动态数组形式的响应载荷。 */\nexport type IpcResponseCallback = (response: unknown[]) => void;\n\n/** 错误回调:接收 IpcError */\nexport type IpcErrorCallback = (error: IpcError) => void;\n\n/** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */\nexport type IpcConnectionCompletionHandler = (\n isConnected: boolean,\n error?: IpcError,\n) => void;\n\n/**\n * IPC 消息拦截器,用于拦截和处理 IPC 消息。\n * 对应 Flutter MessageInterceptor。\n */\nexport class MessageInterceptor {\n constructor(\n /** 拦截请求消息;返回 true 表示已处理,false 表示继续默认逻辑 */\n public readonly interceptRequest?: (request: Request) => boolean,\n /** 拦截响应消息;返回 true 表示已处理 */\n public readonly interceptResponse?: (response: Response) => boolean,\n /** 拦截错误消息;返回 true 表示已处理 */\n public readonly interceptError?: (error: Error) => boolean,\n ) { }\n}\n\n/**\n * IPC 连接状态观察器,定义处理与服务端连接状态变化的方式。\n * 对应 Flutter ConnectionObserver。\n */\nexport class ConnectionObserver {\n constructor(\n /** 当与服务端建立连接时调用 */\n public readonly onConnected?: () => void,\n /** 当与服务端断开连接时调用 */\n public readonly onDisconnected?: () => void,\n ) { }\n}\n\n"]}
1
+ {"version":3,"sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":";;AAkCO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,gBAAA,EAEA,iBAAA,EAEA,cAAA,EAChB;AALgB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN;AAMO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,aAEA,cAAA,EAChB;AAHgB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN","file":"ipc_types.js","sourcesContent":["/**\n * IPC 类型定义,对应 Flutter lib/client/types/ipc_types.dart。\n * 仅定义类型,不包含具体实现逻辑。\n */\n\nimport { IpcError } from '../../general/error/ipc_error';\nimport { Request } from '../../general/message/request';\nimport { Response } from '../../general/message/response';\nimport { Error } from '../../general/message/error';\n\n/** \n * 响应回调:在 IPC 通信过程中,作为接收响应结果的回调函数,在 MessageSender#args 以及定义的 RPC 服务方法中使用。 \n */\nexport type IpcResponseCallback = (response: unknown[]) => void;\n\n/** \n * 错误回调:接收 IpcError。\n * \n * 注意:\n * IpcErrorCallback 是用来监听 IPC 通信过程的错误,而不是用来处理业务逻辑结果的错误。\n * 业务逻辑结果的错误应该通过 `IpcResponseCallback` 的回调参数来处理。\n */\nexport type IpcErrorCallback = (error: IpcError) => void;\n\n/** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */\nexport type IpcConnectionCompletionHandler = (\n isConnected: boolean,\n error?: IpcError,\n) => void;\n\n/**\n * IPC 消息拦截器,用于拦截和处理 IPC 消息。\n * 对应 Flutter MessageInterceptor。\n */\nexport class MessageInterceptor {\n constructor(\n /** 拦截请求消息;返回 true 表示已处理,false 表示继续默认逻辑 */\n public readonly interceptRequest?: (request: Request) => boolean,\n /** 拦截响应消息;返回 true 表示已处理 */\n public readonly interceptResponse?: (response: Response) => boolean,\n /** 拦截错误消息;返回 true 表示已处理 */\n public readonly interceptError?: (error: Error) => boolean,\n ) { }\n}\n\n/**\n * IPC 连接状态观察器,定义处理与服务端连接状态变化的方式。\n * 对应 Flutter ConnectionObserver。\n */\nexport class ConnectionObserver {\n constructor(\n /** 当与服务端建立连接时调用 */\n public readonly onConnected?: () => void,\n /** 当与服务端断开连接时调用 */\n public readonly onDisconnected?: () => void,\n ) { }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":"AA0BO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,gBAAA,EAEA,iBAAA,EAEA,cAAA,EAChB;AALgB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN;AAMO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,aAEA,cAAA,EAChB;AAHgB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN","file":"ipc_types.mjs","sourcesContent":["/**\n * IPC 类型定义,对应 Flutter lib/client/types/ipc_types.dart。\n * 仅定义类型,不包含具体实现逻辑。\n */\n\nimport { IpcError } from '../../general/error/ipc_error';\nimport { Request } from '../../general/message/request';\nimport { Response } from '../../general/message/response';\nimport { Error } from '../../general/message/error';\n\n/** 响应回调:接收动态数组形式的响应载荷。 */\nexport type IpcResponseCallback = (response: unknown[]) => void;\n\n/** 错误回调:接收 IpcError */\nexport type IpcErrorCallback = (error: IpcError) => void;\n\n/** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */\nexport type IpcConnectionCompletionHandler = (\n isConnected: boolean,\n error?: IpcError,\n) => void;\n\n/**\n * IPC 消息拦截器,用于拦截和处理 IPC 消息。\n * 对应 Flutter MessageInterceptor。\n */\nexport class MessageInterceptor {\n constructor(\n /** 拦截请求消息;返回 true 表示已处理,false 表示继续默认逻辑 */\n public readonly interceptRequest?: (request: Request) => boolean,\n /** 拦截响应消息;返回 true 表示已处理 */\n public readonly interceptResponse?: (response: Response) => boolean,\n /** 拦截错误消息;返回 true 表示已处理 */\n public readonly interceptError?: (error: Error) => boolean,\n ) { }\n}\n\n/**\n * IPC 连接状态观察器,定义处理与服务端连接状态变化的方式。\n * 对应 Flutter ConnectionObserver。\n */\nexport class ConnectionObserver {\n constructor(\n /** 当与服务端建立连接时调用 */\n public readonly onConnected?: () => void,\n /** 当与服务端断开连接时调用 */\n public readonly onDisconnected?: () => void,\n ) { }\n}\n\n"]}
1
+ {"version":3,"sources":["../../../../src/moonbridge-ipc/client/types/ipc_types.ts"],"names":[],"mappings":"AAkCO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,gBAAA,EAEA,iBAAA,EAEA,cAAA,EAChB;AALgB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN;AAMO,MAAM,kBAAA,CAAmB;AAAA,EAC9B,WAAA,CAEkB,aAEA,cAAA,EAChB;AAHgB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACd;AACN","file":"ipc_types.mjs","sourcesContent":["/**\n * IPC 类型定义,对应 Flutter lib/client/types/ipc_types.dart。\n * 仅定义类型,不包含具体实现逻辑。\n */\n\nimport { IpcError } from '../../general/error/ipc_error';\nimport { Request } from '../../general/message/request';\nimport { Response } from '../../general/message/response';\nimport { Error } from '../../general/message/error';\n\n/** \n * 响应回调:在 IPC 通信过程中,作为接收响应结果的回调函数,在 MessageSender#args 以及定义的 RPC 服务方法中使用。 \n */\nexport type IpcResponseCallback = (response: unknown[]) => void;\n\n/** \n * 错误回调:接收 IpcError。\n * \n * 注意:\n * IpcErrorCallback 是用来监听 IPC 通信过程的错误,而不是用来处理业务逻辑结果的错误。\n * 业务逻辑结果的错误应该通过 `IpcResponseCallback` 的回调参数来处理。\n */\nexport type IpcErrorCallback = (error: IpcError) => void;\n\n/** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */\nexport type IpcConnectionCompletionHandler = (\n isConnected: boolean,\n error?: IpcError,\n) => void;\n\n/**\n * IPC 消息拦截器,用于拦截和处理 IPC 消息。\n * 对应 Flutter MessageInterceptor。\n */\nexport class MessageInterceptor {\n constructor(\n /** 拦截请求消息;返回 true 表示已处理,false 表示继续默认逻辑 */\n public readonly interceptRequest?: (request: Request) => boolean,\n /** 拦截响应消息;返回 true 表示已处理 */\n public readonly interceptResponse?: (response: Response) => boolean,\n /** 拦截错误消息;返回 true 表示已处理 */\n public readonly interceptError?: (error: Error) => boolean,\n ) { }\n}\n\n/**\n * IPC 连接状态观察器,定义处理与服务端连接状态变化的方式。\n * 对应 Flutter ConnectionObserver。\n */\nexport class ConnectionObserver {\n constructor(\n /** 当与服务端建立连接时调用 */\n public readonly onConnected?: () => void,\n /** 当与服务端断开连接时调用 */\n public readonly onDisconnected?: () => void,\n ) { }\n}\n\n"]}
@@ -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;IAID,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"}
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;IAID,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,UAAU;IA+ClB,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"}
@@ -118,33 +118,31 @@ class RealMoonBridgeIpcServer {
118
118
  return;
119
119
  }
120
120
  let messageType = message_types.MessageType.UNKNOWN;
121
- const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
122
- const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
123
- if (actualType === message_types.MessageType.REGISTRATION) {
121
+ if (message.includes(message_types.MessageType.REGISTRATION)) {
124
122
  messageType = message_types.MessageType.REGISTRATION;
125
123
  this._onRegistration(client, ipc_message_decoder.IpcMessageDecoder.decodeRegistration(message));
126
- } else if (actualType === message_types.MessageType.UNREGISTRATION) {
124
+ } else if (message.includes(message_types.MessageType.UNREGISTRATION)) {
127
125
  messageType = message_types.MessageType.UNREGISTRATION;
128
126
  this._onUnregistration(ipc_message_decoder.IpcMessageDecoder.decodeUnregistration(message));
129
- } else if (actualType === message_types.MessageType.EVENT) {
127
+ } else if (message.includes(message_types.MessageType.EVENT)) {
130
128
  messageType = message_types.MessageType.EVENT;
131
129
  this._onEvent(ipc_message_decoder.IpcMessageDecoder.decodeEvent(message));
132
- } else if (actualType === message_types.MessageType.ERROR) {
130
+ } else if (message.includes(message_types.MessageType.ERROR)) {
133
131
  messageType = message_types.MessageType.ERROR;
134
132
  this._onError(ipc_message_decoder.IpcMessageDecoder.decodeError(message));
135
- } else if (actualType === message_types.MessageType.REQUEST) {
133
+ } else if (message.includes(message_types.MessageType.REQUEST)) {
136
134
  messageType = message_types.MessageType.REQUEST;
137
135
  this._onRequest(ipc_message_decoder.IpcMessageDecoder.decodeRequest(message));
138
- } else if (actualType === message_types.MessageType.RESPONSE) {
136
+ } else if (message.includes(message_types.MessageType.RESPONSE)) {
139
137
  messageType = message_types.MessageType.RESPONSE;
140
138
  this._onResponse(ipc_message_decoder.IpcMessageDecoder.decodeResponse(message));
141
- } else if (actualType === message_types.MessageType.SESSION_SETUP_REQUEST) {
139
+ } else if (message.includes(message_types.MessageType.SESSION_SETUP_REQUEST)) {
142
140
  messageType = message_types.MessageType.SESSION_SETUP_REQUEST;
143
141
  this._onSessionSetupRequest(ipc_message_decoder.IpcMessageDecoder.decodeSessionSetupRequest(message));
144
- } else if (actualType === message_types.MessageType.SESSION_SETUP_RESPONSE) ; else if (actualType === message_types.MessageType.HANDSHAKE) {
142
+ } else if (message.includes(message_types.MessageType.HANDSHAKE)) {
145
143
  messageType = message_types.MessageType.HANDSHAKE;
146
144
  this._onHandshake(ipc_message_decoder.IpcMessageDecoder.decodeHandshake(message), client);
147
- } else if (actualType === message_types.MessageType.PING) {
145
+ } else if (message.includes(message_types.MessageType.PING)) {
148
146
  messageType = message_types.MessageType.PING;
149
147
  this._onPing(ipc_message_decoder.IpcMessageDecoder.decodePing(message));
150
148
  } else {
@@ -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 METHODS\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"]}
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 METHODS\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 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.SESSION_SETUP_RESPONSE)) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\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"]}
@@ -116,33 +116,31 @@ class RealMoonBridgeIpcServer {
116
116
  return;
117
117
  }
118
118
  let messageType = MessageType.UNKNOWN;
119
- const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
120
- const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
121
- if (actualType === MessageType.REGISTRATION) {
119
+ if (message.includes(MessageType.REGISTRATION)) {
122
120
  messageType = MessageType.REGISTRATION;
123
121
  this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));
124
- } else if (actualType === MessageType.UNREGISTRATION) {
122
+ } else if (message.includes(MessageType.UNREGISTRATION)) {
125
123
  messageType = MessageType.UNREGISTRATION;
126
124
  this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));
127
- } else if (actualType === MessageType.EVENT) {
125
+ } else if (message.includes(MessageType.EVENT)) {
128
126
  messageType = MessageType.EVENT;
129
127
  this._onEvent(IpcMessageDecoder.decodeEvent(message));
130
- } else if (actualType === MessageType.ERROR) {
128
+ } else if (message.includes(MessageType.ERROR)) {
131
129
  messageType = MessageType.ERROR;
132
130
  this._onError(IpcMessageDecoder.decodeError(message));
133
- } else if (actualType === MessageType.REQUEST) {
131
+ } else if (message.includes(MessageType.REQUEST)) {
134
132
  messageType = MessageType.REQUEST;
135
133
  this._onRequest(IpcMessageDecoder.decodeRequest(message));
136
- } else if (actualType === MessageType.RESPONSE) {
134
+ } else if (message.includes(MessageType.RESPONSE)) {
137
135
  messageType = MessageType.RESPONSE;
138
136
  this._onResponse(IpcMessageDecoder.decodeResponse(message));
139
- } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
137
+ } else if (message.includes(MessageType.SESSION_SETUP_REQUEST)) {
140
138
  messageType = MessageType.SESSION_SETUP_REQUEST;
141
139
  this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
142
- } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) ; else if (actualType === MessageType.HANDSHAKE) {
140
+ } else if (message.includes(MessageType.HANDSHAKE)) {
143
141
  messageType = MessageType.HANDSHAKE;
144
142
  this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
145
- } else if (actualType === MessageType.PING) {
143
+ } else if (message.includes(MessageType.PING)) {
146
144
  messageType = MessageType.PING;
147
145
  this._onPing(IpcMessageDecoder.decodePing(message));
148
146
  } else {
@@ -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 METHODS\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"]}
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 METHODS\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 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.SESSION_SETUP_RESPONSE)) {\n // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理\n // 这里可以添加相关处理逻辑,如果需要的话\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moonbridge-ts",
3
- "version": "0.6.4",
3
+ "version": "0.7.0",
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",
@@ -6,7 +6,7 @@ import { IpcClientSettings } from './settings/ipc_client_settings';
6
6
  import { IpcMessageStrategy } from '../types/ipc_message_strategy';
7
7
  import { IpcConnectionCompletionHandler, IpcErrorCallback } from '../types/ipc_types';
8
8
  import { MoonBridgeIpcClient } from '../moonbridge_ipc_client';
9
- import { Messenger, MessageEndpoint, RoutedMessage } from '../types/ipc_messenger';
9
+ import { Messenger, MessageEndpoint, MessageSender } from '../types/ipc_messenger';
10
10
  import { EventBus } from '../types/ipc_event_bus';
11
11
  import { logger } from '../../utils/logger';
12
12
  import { IpcClientComponentProvider } from './ipc/ipc_client_component_provider';
@@ -83,13 +83,13 @@ export class RealMoonBridgeIpcClient implements IpcClientComponentProvider, Moon
83
83
  return this.ipcEventBus;
84
84
  }
85
85
 
86
- call(target: MessageEndpoint): RoutedMessage {
86
+ call(target: MessageEndpoint): MessageSender {
87
87
  const baseStrategy = this.settings.messageStrategy;
88
88
  const strategy = new IpcMessageStrategy(
89
89
  baseStrategy.retries,
90
90
  baseStrategy.autoLaunch,
91
91
  );
92
- return new RoutedMessageImpl(
92
+ return new RealMessageSender(
93
93
  strategy,
94
94
  (args, callStrategy, onError) => {
95
95
  this.sendMessage(target, args, callStrategy, onError);
@@ -156,7 +156,7 @@ export class RealMoonBridgeIpcClient implements IpcClientComponentProvider, Moon
156
156
  }
157
157
  }
158
158
 
159
- class RoutedMessageImpl implements RoutedMessage {
159
+ class RealMessageSender implements MessageSender {
160
160
  private argsList: unknown[] = [];
161
161
  private currentStrategy: IpcMessageStrategy;
162
162
  private errorCallback?: IpcErrorCallback;
@@ -172,9 +172,9 @@ class RoutedMessageImpl implements RoutedMessage {
172
172
  this.currentStrategy = strategy;
173
173
  }
174
174
 
175
- args(args: unknown[]): RoutedMessage;
176
- args(...args: unknown[]): RoutedMessage;
177
- args(...argsOrList: unknown[]): RoutedMessage {
175
+ args(args: unknown[]): MessageSender;
176
+ args(...args: unknown[]): MessageSender;
177
+ args(...argsOrList: unknown[]): MessageSender {
178
178
  if (argsOrList.length === 1 && Array.isArray(argsOrList[0])) {
179
179
  this.argsList = [...(argsOrList[0] as unknown[])];
180
180
  return this;
@@ -183,12 +183,12 @@ class RoutedMessageImpl implements RoutedMessage {
183
183
  return this;
184
184
  }
185
185
 
186
- strategy(strategy: IpcMessageStrategy): RoutedMessage {
186
+ strategy(strategy: IpcMessageStrategy): MessageSender {
187
187
  this.currentStrategy = strategy;
188
188
  return this;
189
189
  }
190
190
 
191
- onError(onError?: IpcErrorCallback): RoutedMessage {
191
+ onError(onError?: IpcErrorCallback): MessageSender {
192
192
  this.errorCallback = onError;
193
193
  return this;
194
194
  }
@@ -19,23 +19,31 @@ export type MessageEndpoint = {
19
19
  /**
20
20
  * call API 返回的可链式请求对象。
21
21
  */
22
- export interface RoutedMessage {
22
+ export interface MessageSender {
23
23
  /**
24
24
  * 设置参数。
25
- * 支持 `args([a, b])` 或 `args(a, b)` 两种写法。
25
+ * 支持 `args([a, b])` 或 `args(a, b)` 两种写法。如果需要接收响应,可以在参数中使用 `IpcResponseCallback` 作为参数类型。
26
+ *
27
+ * ```ts
28
+ * messenger
29
+ * .call({ clientName: 'client_b', moduleName: 'CallPhone', methodName: 'callWithCallback' })
30
+ * .args('0431-4610123', (response) => console.log('response:', response))
31
+ * .onError((error) => console.error('ipc error:', error))
32
+ * .send();
33
+ * ```
26
34
  */
27
- args(args: unknown[]): RoutedMessage;
28
- args(...args: unknown[]): RoutedMessage;
35
+ args(args: unknown[]): MessageSender;
36
+ args(...args: unknown[]): MessageSender;
29
37
 
30
38
  /**
31
39
  * 设置消息策略(重试次数、是否自动唤醒)。
32
40
  */
33
- strategy(strategy: IpcMessageStrategy): RoutedMessage;
41
+ strategy(strategy: IpcMessageStrategy): MessageSender;
34
42
 
35
43
  /**
36
44
  * 设置 IPC 发送错误回调。
37
45
  */
38
- onError(onError?: IpcErrorCallback): RoutedMessage;
46
+ onError(onError?: IpcErrorCallback): MessageSender;
39
47
 
40
48
  /**
41
49
  * 发送消息。
@@ -49,12 +57,20 @@ export interface Messenger {
49
57
  *
50
58
  * 示例:
51
59
  * ```ts
60
+ * import { IpcResponseCallback } from 'moonbridge-ts';
61
+ *
62
+ * const onResponse = (response: unknown[]) => console.log('response:', response);
63
+ *
52
64
  * messenger
53
- * .call({ clientName: 'client_b', moduleName: 'CallPhone', methodName: 'callWithCallback' })
65
+ * .call({
66
+ * clientName: 'client_b',
67
+ * moduleName: 'CallPhone',
68
+ * methodName: 'callWithCallback',
69
+ * })
54
70
  * .args('0431-4610123', onResponse)
55
71
  * .onError(console.error)
56
72
  * .send();
57
73
  * ```
58
74
  */
59
- call(target: MessageEndpoint): RoutedMessage;
75
+ call(target: MessageEndpoint): MessageSender;
60
76
  }
@@ -8,10 +8,18 @@ import { Request } from '../../general/message/request';
8
8
  import { Response } from '../../general/message/response';
9
9
  import { Error } from '../../general/message/error';
10
10
 
11
- /** 响应回调:接收动态数组形式的响应载荷。 */
11
+ /**
12
+ * 响应回调:在 IPC 通信过程中,作为接收响应结果的回调函数,在 MessageSender#args 以及定义的 RPC 服务方法中使用。
13
+ */
12
14
  export type IpcResponseCallback = (response: unknown[]) => void;
13
15
 
14
- /** 错误回调:接收 IpcError。 */
16
+ /**
17
+ * 错误回调:接收 IpcError。
18
+ *
19
+ * 注意:
20
+ * IpcErrorCallback 是用来监听 IPC 通信过程的错误,而不是用来处理业务逻辑结果的错误。
21
+ * 业务逻辑结果的错误应该通过 `IpcResponseCallback` 的回调参数来处理。
22
+ */
15
23
  export type IpcErrorCallback = (error: IpcError) => void;
16
24
 
17
25
  /** 服务端进程连接完成处理器。US2:统一使用 undefined 表示无错误,不再使用 | null。 */
@@ -178,38 +178,34 @@ export class RealMoonBridgeIpcServer implements MoonBridgeIpcServer {
178
178
  }
179
179
 
180
180
  let messageType = MessageType.UNKNOWN;
181
-
182
- const messageTypeMatch = message.match(/"type"\s*:\s*"([^"]+)"/);
183
- const actualType = messageTypeMatch ? messageTypeMatch[1] : null;
184
-
185
- if (actualType === MessageType.REGISTRATION) {
181
+ if (message.includes(MessageType.REGISTRATION)) {
186
182
  messageType = MessageType.REGISTRATION;
187
183
  this._onRegistration(client, IpcMessageDecoder.decodeRegistration(message));
188
- } else if (actualType === MessageType.UNREGISTRATION) {
184
+ } else if (message.includes(MessageType.UNREGISTRATION)) {
189
185
  messageType = MessageType.UNREGISTRATION;
190
186
  this._onUnregistration(IpcMessageDecoder.decodeUnregistration(message));
191
- } else if (actualType === MessageType.EVENT) {
187
+ } else if (message.includes(MessageType.EVENT)) {
192
188
  messageType = MessageType.EVENT;
193
189
  this._onEvent(IpcMessageDecoder.decodeEvent(message));
194
- } else if (actualType === MessageType.ERROR) {
190
+ } else if (message.includes(MessageType.ERROR)) {
195
191
  messageType = MessageType.ERROR;
196
192
  this._onError(IpcMessageDecoder.decodeError(message));
197
- } else if (actualType === MessageType.REQUEST) {
193
+ } else if (message.includes(MessageType.REQUEST)) {
198
194
  messageType = MessageType.REQUEST;
199
195
  this._onRequest(IpcMessageDecoder.decodeRequest(message));
200
- } else if (actualType === MessageType.RESPONSE) {
196
+ } else if (message.includes(MessageType.RESPONSE)) {
201
197
  messageType = MessageType.RESPONSE;
202
198
  this._onResponse(IpcMessageDecoder.decodeResponse(message));
203
- } else if (actualType === MessageType.SESSION_SETUP_REQUEST) {
199
+ } else if (message.includes(MessageType.SESSION_SETUP_REQUEST)) {
204
200
  messageType = MessageType.SESSION_SETUP_REQUEST;
205
201
  this._onSessionSetupRequest(IpcMessageDecoder.decodeSessionSetupRequest(message));
206
- } else if (actualType === MessageType.SESSION_SETUP_RESPONSE) {
202
+ } /*else if (message.includes(MessageType.SESSION_SETUP_RESPONSE)) {
207
203
  // SESSION_SETUP_RESPONSE 单独处理,不设置 messageType 以避免重复处理
208
204
  // 这里可以添加相关处理逻辑,如果需要的话
209
- } else if (actualType === MessageType.HANDSHAKE) {
205
+ }*/ else if (message.includes(MessageType.HANDSHAKE)) {
210
206
  messageType = MessageType.HANDSHAKE;
211
207
  this._onHandshake(IpcMessageDecoder.decodeHandshake(message), client);
212
- } else if (actualType === MessageType.PING) {
208
+ } else if (message.includes(MessageType.PING)) {
213
209
  messageType = MessageType.PING;
214
210
  this._onPing(IpcMessageDecoder.decodePing(message));
215
211
  } else {
@@ -6,7 +6,7 @@ import {
6
6
  } from '../../src/moonbridge-ipc/client/rpc/rpc_annotation';
7
7
  import { IpcMessageStrategy } from '../../src/moonbridge-ipc/client/types/ipc_message_strategy';
8
8
  import { IpcRequestJob } from '../../src/moonbridge-ipc/client/rpc/service/job/ipc_request_job';
9
- import { MessageEndpoint, Messenger, RoutedMessage } from '../../src/moonbridge-ipc/client/types/ipc_messenger';
9
+ import { MessageEndpoint, Messenger, MessageSender } from '../../src/moonbridge-ipc/client/types/ipc_messenger';
10
10
 
11
11
  abstract class DemoService {
12
12
  abstract ping(message: string): IpcRequestJob;
@@ -29,11 +29,11 @@ type RoutedCall = {
29
29
  function createMessengerMock(): { messenger: Messenger; calls: RoutedCall[] } {
30
30
  const calls: RoutedCall[] = [];
31
31
  const messenger: Messenger = {
32
- call(target: MessageEndpoint): RoutedMessage {
32
+ call(target: MessageEndpoint): MessageSender {
33
33
  let argsList: unknown[] = [];
34
34
  let strategy: IpcMessageStrategy | undefined;
35
- const routed: RoutedMessage = {
36
- args(args: unknown[] | unknown, ...rest: unknown[]): RoutedMessage {
35
+ const routed: MessageSender = {
36
+ args(args: unknown[] | unknown, ...rest: unknown[]): MessageSender {
37
37
  if (Array.isArray(args) && rest.length === 0) {
38
38
  argsList = [...args];
39
39
  return routed;
@@ -41,11 +41,11 @@ function createMessengerMock(): { messenger: Messenger; calls: RoutedCall[] } {
41
41
  argsList = [args, ...rest];
42
42
  return routed;
43
43
  },
44
- strategy(nextStrategy: IpcMessageStrategy): RoutedMessage {
44
+ strategy(nextStrategy: IpcMessageStrategy): MessageSender {
45
45
  strategy = nextStrategy;
46
46
  return routed;
47
47
  },
48
- onError(): RoutedMessage {
48
+ onError(): MessageSender {
49
49
  return routed;
50
50
  },
51
51
  send(): void {
@@ -7,7 +7,7 @@ import {
7
7
  } from '../../src/moonbridge-ipc/client/rpc/rpc_annotation';
8
8
  import { IpcMessageStrategy } from '../../src/moonbridge-ipc/client/types/ipc_message_strategy';
9
9
  import { IpcRequestJob } from '../../src/moonbridge-ipc/client/rpc/service/job/ipc_request_job';
10
- import { MessageEndpoint, Messenger, RoutedMessage } from '../../src/moonbridge-ipc/client/types/ipc_messenger';
10
+ import { MessageEndpoint, Messenger, MessageSender } from '../../src/moonbridge-ipc/client/types/ipc_messenger';
11
11
 
12
12
  abstract class CallPhoneService {
13
13
  abstract callPhone(number: string): IpcRequestJob;
@@ -51,12 +51,12 @@ type RoutedCall = {
51
51
  function createMessengerMock(): { messenger: Messenger; calls: RoutedCall[] } {
52
52
  const calls: RoutedCall[] = [];
53
53
  const messenger: Messenger = {
54
- call(target: MessageEndpoint): RoutedMessage {
54
+ call(target: MessageEndpoint): MessageSender {
55
55
  let argsList: unknown[] = [];
56
56
  let strategy: IpcMessageStrategy | undefined;
57
57
  let onError: ((error: unknown) => void) | undefined;
58
- const routed: RoutedMessage = {
59
- args(args: unknown[] | unknown, ...rest: unknown[]): RoutedMessage {
58
+ const routed: MessageSender = {
59
+ args(args: unknown[] | unknown, ...rest: unknown[]): MessageSender {
60
60
  if (Array.isArray(args) && rest.length === 0) {
61
61
  argsList = [...args];
62
62
  return routed;
@@ -64,11 +64,11 @@ function createMessengerMock(): { messenger: Messenger; calls: RoutedCall[] } {
64
64
  argsList = [args, ...rest];
65
65
  return routed;
66
66
  },
67
- strategy(nextStrategy: IpcMessageStrategy): RoutedMessage {
67
+ strategy(nextStrategy: IpcMessageStrategy): MessageSender {
68
68
  strategy = nextStrategy;
69
69
  return routed;
70
70
  },
71
- onError(nextOnError?: (error: unknown) => void): RoutedMessage {
71
+ onError(nextOnError?: (error: unknown) => void): MessageSender {
72
72
  onError = nextOnError;
73
73
  return routed;
74
74
  },