@mxf-dev/core 1.0.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/adapters/FrameworkAdapter.js +1 -1
- package/dist/adapters/FrameworkAdapter.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +9 -8
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +47 -17
- package/dist/config/ConfigManager.js.map +1 -1
- package/dist/config/memory-strata.config.d.ts +25 -0
- package/dist/config/memory-strata.config.d.ts.map +1 -0
- package/dist/config/memory-strata.config.js +107 -0
- package/dist/config/memory-strata.config.js.map +1 -0
- package/dist/constants/ToolNames.d.ts +1 -29
- package/dist/constants/ToolNames.d.ts.map +1 -1
- package/dist/constants/ToolNames.js +4 -17
- package/dist/constants/ToolNames.js.map +1 -1
- package/dist/database/DatabaseAdapterFactory.d.ts +14 -2
- package/dist/database/DatabaseAdapterFactory.d.ts.map +1 -1
- package/dist/database/DatabaseAdapterFactory.js +21 -6
- package/dist/database/DatabaseAdapterFactory.js.map +1 -1
- package/dist/database/adapters/mongodb/MongoBaseRepository.d.ts +7 -1
- package/dist/database/adapters/mongodb/MongoBaseRepository.d.ts.map +1 -1
- package/dist/database/adapters/mongodb/MongoBaseRepository.js +12 -2
- package/dist/database/adapters/mongodb/MongoBaseRepository.js.map +1 -1
- package/dist/events/ClientEventBus.d.ts +16 -77
- package/dist/events/ClientEventBus.d.ts.map +1 -1
- package/dist/events/ClientEventBus.js +38 -311
- package/dist/events/ClientEventBus.js.map +1 -1
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/events/EventBus.js +5 -4
- package/dist/events/EventBus.js.map +1 -1
- package/dist/events/EventBusBase.d.ts +139 -34
- package/dist/events/EventBusBase.d.ts.map +1 -1
- package/dist/events/EventBusBase.js +366 -88
- package/dist/events/EventBusBase.js.map +1 -1
- package/dist/events/EventNames.d.ts +10 -1
- package/dist/events/EventNames.d.ts.map +1 -1
- package/dist/events/EventNames.js +3 -0
- package/dist/events/EventNames.js.map +1 -1
- package/dist/events/PublicEvents.d.ts +6 -2
- package/dist/events/PublicEvents.d.ts.map +1 -1
- package/dist/events/PublicEvents.js +7 -4
- package/dist/events/PublicEvents.js.map +1 -1
- package/dist/events/ServerEventBus.d.ts +23 -112
- package/dist/events/ServerEventBus.d.ts.map +1 -1
- package/dist/events/ServerEventBus.js +58 -323
- package/dist/events/ServerEventBus.js.map +1 -1
- package/dist/events/event-definitions/LlmBudgetEvents.d.ts +68 -0
- package/dist/events/event-definitions/LlmBudgetEvents.d.ts.map +1 -0
- package/dist/events/event-definitions/LlmBudgetEvents.js +35 -0
- package/dist/events/event-definitions/LlmBudgetEvents.js.map +1 -0
- package/dist/interfaces/IMemoryPersistence.d.ts +41 -0
- package/dist/interfaces/IMemoryPersistence.d.ts.map +1 -0
- package/dist/interfaces/IMemoryPersistence.js +15 -0
- package/dist/interfaces/IMemoryPersistence.js.map +1 -0
- package/dist/middleware/MxpMiddleware.d.ts +8 -1
- package/dist/middleware/MxpMiddleware.d.ts.map +1 -1
- package/dist/middleware/MxpMiddleware.js +42 -20
- package/dist/middleware/MxpMiddleware.js.map +1 -1
- package/dist/models/channelKey.d.ts +1 -0
- package/dist/models/channelKey.d.ts.map +1 -1
- package/dist/models/channelKey.js +5 -0
- package/dist/models/channelKey.js.map +1 -1
- package/dist/models/memoryUtility.d.ts +39 -0
- package/dist/models/memoryUtility.d.ts.map +1 -0
- package/dist/models/memoryUtility.js +39 -0
- package/dist/models/memoryUtility.js.map +1 -0
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/user.js +23 -1
- package/dist/models/user.js.map +1 -1
- package/dist/mxp/BinaryProtocolLayer.d.ts +24 -8
- package/dist/mxp/BinaryProtocolLayer.d.ts.map +1 -1
- package/dist/mxp/BinaryProtocolLayer.js +90 -103
- package/dist/mxp/BinaryProtocolLayer.js.map +1 -1
- package/dist/mxp/ContextCompressionEngine.d.ts +57 -10
- package/dist/mxp/ContextCompressionEngine.d.ts.map +1 -1
- package/dist/mxp/ContextCompressionEngine.js +170 -128
- package/dist/mxp/ContextCompressionEngine.js.map +1 -1
- package/dist/mxp/MxpTokenOptimizer.d.ts +7 -3
- package/dist/mxp/MxpTokenOptimizer.d.ts.map +1 -1
- package/dist/mxp/MxpTokenOptimizer.js +8 -5
- package/dist/mxp/MxpTokenOptimizer.js.map +1 -1
- package/dist/prompts/MxfAgentSystemPrompt.d.ts +1 -1
- package/dist/prompts/MxfAgentSystemPrompt.d.ts.map +1 -1
- package/dist/prompts/MxfAgentSystemPrompt.js +47 -57
- package/dist/prompts/MxfAgentSystemPrompt.js.map +1 -1
- package/dist/protocols/mcp/ToolError.d.ts +123 -0
- package/dist/protocols/mcp/ToolError.d.ts.map +1 -0
- package/dist/protocols/mcp/ToolError.js +108 -0
- package/dist/protocols/mcp/ToolError.js.map +1 -0
- package/dist/protocols/mcp/defineTool.d.ts +133 -0
- package/dist/protocols/mcp/defineTool.d.ts.map +1 -0
- package/dist/protocols/mcp/defineTool.js +236 -0
- package/dist/protocols/mcp/defineTool.js.map +1 -0
- package/dist/protocols/mcp/security/HttpTargetGuard.d.ts +38 -0
- package/dist/protocols/mcp/security/HttpTargetGuard.d.ts.map +1 -0
- package/dist/protocols/mcp/security/HttpTargetGuard.js +227 -0
- package/dist/protocols/mcp/security/HttpTargetGuard.js.map +1 -0
- package/dist/protocols/mcp/security/McpSecurityGuard.d.ts +9 -1
- package/dist/protocols/mcp/security/McpSecurityGuard.d.ts.map +1 -1
- package/dist/protocols/mcp/security/McpSecurityGuard.js +10 -2
- package/dist/protocols/mcp/security/McpSecurityGuard.js.map +1 -1
- package/dist/protocols/mcp/security/McpToolPolicy.d.ts +81 -0
- package/dist/protocols/mcp/security/McpToolPolicy.d.ts.map +1 -0
- package/dist/protocols/mcp/security/McpToolPolicy.js +202 -0
- package/dist/protocols/mcp/security/McpToolPolicy.js.map +1 -0
- package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts +51 -18
- package/dist/protocols/mcp/services/ExternalMcpServerManager.d.ts.map +1 -1
- package/dist/protocols/mcp/services/ExternalMcpServerManager.js +256 -283
- package/dist/protocols/mcp/services/ExternalMcpServerManager.js.map +1 -1
- package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts +39 -6
- package/dist/protocols/mcp/services/ExternalServerConfigs.d.ts.map +1 -1
- package/dist/protocols/mcp/services/ExternalServerConfigs.js +76 -18
- package/dist/protocols/mcp/services/ExternalServerConfigs.js.map +1 -1
- package/dist/protocols/mcp/tools/AnalyticsTools.js +1 -1
- package/dist/protocols/mcp/tools/AnalyticsTools.js.map +1 -1
- package/dist/protocols/mcp/tools/CodeAnalysisTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/CodeAnalysisTools.js +15 -0
- package/dist/protocols/mcp/tools/CodeAnalysisTools.js.map +1 -1
- package/dist/protocols/mcp/tools/EffectivenessTools.js +3 -3
- package/dist/protocols/mcp/tools/EffectivenessTools.js.map +1 -1
- package/dist/protocols/mcp/tools/GitTools.d.ts +9 -369
- package/dist/protocols/mcp/tools/GitTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/GitTools.js +222 -517
- package/dist/protocols/mcp/tools/GitTools.js.map +1 -1
- package/dist/protocols/mcp/tools/InfrastructureTools.d.ts +56 -24
- package/dist/protocols/mcp/tools/InfrastructureTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/InfrastructureTools.js +117 -26
- package/dist/protocols/mcp/tools/InfrastructureTools.js.map +1 -1
- package/dist/protocols/mcp/tools/MemorySearchTools.d.ts +0 -3
- package/dist/protocols/mcp/tools/MemorySearchTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/MemorySearchTools.js +58 -1
- package/dist/protocols/mcp/tools/MemorySearchTools.js.map +1 -1
- package/dist/protocols/mcp/tools/OrparTools.d.ts +8 -0
- package/dist/protocols/mcp/tools/OrparTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/OrparTools.js +66 -0
- package/dist/protocols/mcp/tools/OrparTools.js.map +1 -1
- package/dist/protocols/mcp/tools/SafetyTools.d.ts +7 -525
- package/dist/protocols/mcp/tools/SafetyTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/SafetyTools.js +349 -514
- package/dist/protocols/mcp/tools/SafetyTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TaskPlanningTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TaskPlanningTools.js +56 -26
- package/dist/protocols/mcp/tools/TaskPlanningTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TestTools.d.ts +15 -376
- package/dist/protocols/mcp/tools/TestTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TestTools.js +241 -363
- package/dist/protocols/mcp/tools/TestTools.js.map +1 -1
- package/dist/protocols/mcp/tools/TypeScriptTools.d.ts +6 -276
- package/dist/protocols/mcp/tools/TypeScriptTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/TypeScriptTools.js +223 -337
- package/dist/protocols/mcp/tools/TypeScriptTools.js.map +1 -1
- package/dist/protocols/mcp/tools/WebTools.d.ts +15 -728
- package/dist/protocols/mcp/tools/WebTools.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/WebTools.js +151 -257
- package/dist/protocols/mcp/tools/WebTools.js.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts +5 -3
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.d.ts.map +1 -1
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js +31 -6
- package/dist/protocols/mcp/tools/shell/ShellExecuteHandler.js.map +1 -1
- package/dist/schemas/EventPayloadSchema.d.ts +21 -0
- package/dist/schemas/EventPayloadSchema.d.ts.map +1 -1
- package/dist/schemas/EventPayloadSchema.js +14 -0
- package/dist/schemas/EventPayloadSchema.js.map +1 -1
- package/dist/services/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/services/BackgroundTaskManager.js +12 -4
- package/dist/services/BackgroundTaskManager.js.map +1 -1
- package/dist/services/BrowserManager.d.ts +1 -1
- package/dist/services/BrowserManager.d.ts.map +1 -1
- package/dist/services/BrowserManager.js +26 -3
- package/dist/services/BrowserManager.js.map +1 -1
- package/dist/services/MemoryCompressor.d.ts +11 -2
- package/dist/services/MemoryCompressor.d.ts.map +1 -1
- package/dist/services/MemoryCompressor.js +8 -26
- package/dist/services/MemoryCompressor.js.map +1 -1
- package/dist/services/MemoryService.d.ts +16 -3
- package/dist/services/MemoryService.d.ts.map +1 -1
- package/dist/services/MemoryService.js +79 -55
- package/dist/services/MemoryService.js.map +1 -1
- package/dist/services/MxfMLService.d.ts +5 -0
- package/dist/services/MxfMLService.d.ts.map +1 -1
- package/dist/services/MxfMLService.js +32 -6
- package/dist/services/MxfMLService.js.map +1 -1
- package/dist/services/PredictiveAnalyticsService.d.ts +45 -9
- package/dist/services/PredictiveAnalyticsService.d.ts.map +1 -1
- package/dist/services/PredictiveAnalyticsService.js +82 -44
- package/dist/services/PredictiveAnalyticsService.js.map +1 -1
- package/dist/services/QValueManager.d.ts +7 -0
- package/dist/services/QValueManager.d.ts.map +1 -1
- package/dist/services/QValueManager.js +9 -0
- package/dist/services/QValueManager.js.map +1 -1
- package/dist/services/RewardSignalProcessor.d.ts +38 -1
- package/dist/services/RewardSignalProcessor.d.ts.map +1 -1
- package/dist/services/RewardSignalProcessor.js +109 -7
- package/dist/services/RewardSignalProcessor.js.map +1 -1
- package/dist/services/SharedStateService.d.ts +16 -2
- package/dist/services/SharedStateService.d.ts.map +1 -1
- package/dist/services/SharedStateService.js +44 -3
- package/dist/services/SharedStateService.js.map +1 -1
- package/dist/services/TaskEffectivenessService.d.ts +34 -18
- package/dist/services/TaskEffectivenessService.d.ts.map +1 -1
- package/dist/services/TaskEffectivenessService.js +91 -155
- package/dist/services/TaskEffectivenessService.js.map +1 -1
- package/dist/services/WebSearchService.d.ts.map +1 -1
- package/dist/services/WebSearchService.js.map +1 -1
- package/dist/services/dag/TaskDagService.d.ts.map +1 -1
- package/dist/services/dag/TaskDagService.js +2 -0
- package/dist/services/dag/TaskDagService.js.map +1 -1
- package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts +7 -0
- package/dist/services/orpar-memory/OrparMemoryCoordinator.d.ts.map +1 -1
- package/dist/services/orpar-memory/OrparMemoryCoordinator.js +71 -10
- package/dist/services/orpar-memory/OrparMemoryCoordinator.js.map +1 -1
- package/dist/types/MemoryUtilityTypes.d.ts +2 -0
- package/dist/types/MemoryUtilityTypes.d.ts.map +1 -1
- package/dist/types/MemoryUtilityTypes.js.map +1 -1
- package/dist/utils/Logger.d.ts +43 -3
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +78 -36
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/MxpEncryption.d.ts +19 -6
- package/dist/utils/MxpEncryption.d.ts.map +1 -1
- package/dist/utils/MxpEncryption.js +48 -16
- package/dist/utils/MxpEncryption.js.map +1 -1
- package/package.json +19 -4
- package/src/adapters/FrameworkAdapter.ts +1 -1
- package/src/config/ConfigManager.ts +52 -19
- package/src/config/memory-strata.config.ts +136 -0
- package/src/constants/ToolNames.ts +4 -18
- package/src/database/DatabaseAdapterFactory.ts +23 -6
- package/src/database/adapters/mongodb/MongoBaseRepository.ts +16 -2
- package/src/events/ClientEventBus.ts +68 -403
- package/src/events/EventBus.ts +7 -8
- package/src/events/EventBusBase.ts +479 -116
- package/src/events/EventNames.ts +6 -0
- package/src/events/PublicEvents.ts +7 -4
- package/src/events/ServerEventBus.ts +78 -473
- package/src/events/event-definitions/LlmBudgetEvents.ts +74 -0
- package/src/interfaces/IMemoryPersistence.ts +51 -0
- package/src/middleware/MxpMiddleware.ts +51 -24
- package/src/models/channelKey.ts +18 -4
- package/src/models/memoryUtility.ts +64 -0
- package/src/models/user.ts +36 -4
- package/src/mxp/BinaryProtocolLayer.ts +108 -124
- package/src/mxp/ContextCompressionEngine.ts +219 -161
- package/src/mxp/MxpTokenOptimizer.ts +10 -10
- package/src/prompts/MxfAgentSystemPrompt.ts +45 -55
- package/src/protocols/mcp/ToolError.ts +201 -0
- package/src/protocols/mcp/defineTool.ts +379 -0
- package/src/protocols/mcp/security/HttpTargetGuard.ts +267 -0
- package/src/protocols/mcp/security/McpSecurityGuard.ts +10 -3
- package/src/protocols/mcp/security/McpToolPolicy.ts +221 -0
- package/src/protocols/mcp/services/ExternalMcpServerManager.ts +340 -322
- package/src/protocols/mcp/services/ExternalServerConfigs.ts +82 -19
- package/src/protocols/mcp/tools/AnalyticsTools.ts +1 -1
- package/src/protocols/mcp/tools/CodeAnalysisTools.ts +15 -0
- package/src/protocols/mcp/tools/EffectivenessTools.ts +3 -3
- package/src/protocols/mcp/tools/GitTools.ts +290 -569
- package/src/protocols/mcp/tools/InfrastructureTools.ts +189 -43
- package/src/protocols/mcp/tools/MemorySearchTools.ts +77 -1
- package/src/protocols/mcp/tools/OrparTools.ts +87 -0
- package/src/protocols/mcp/tools/SafetyTools.ts +501 -579
- package/src/protocols/mcp/tools/TaskPlanningTools.ts +81 -39
- package/src/protocols/mcp/tools/TestTools.ts +339 -419
- package/src/protocols/mcp/tools/TypeScriptTools.ts +316 -376
- package/src/protocols/mcp/tools/WebTools.ts +209 -307
- package/src/protocols/mcp/tools/shell/ShellExecuteHandler.ts +53 -14
- package/src/schemas/EventPayloadSchema.ts +37 -0
- package/src/services/BackgroundTaskManager.ts +12 -4
- package/src/services/BrowserManager.ts +41 -1
- package/src/services/MemoryCompressor.ts +20 -32
- package/src/services/MemoryService.ts +96 -58
- package/src/services/MxfMLService.ts +41 -7
- package/src/services/PredictiveAnalyticsService.ts +101 -51
- package/src/services/QValueManager.ts +10 -0
- package/src/services/RewardSignalProcessor.ts +138 -9
- package/src/services/SharedStateService.ts +56 -8
- package/src/services/TaskEffectivenessService.ts +114 -187
- package/src/services/WebSearchService.ts +2 -1
- package/src/services/dag/TaskDagService.ts +2 -0
- package/src/services/orpar-memory/OrparMemoryCoordinator.ts +86 -10
- package/src/types/MemoryUtilityTypes.ts +2 -0
- package/src/utils/Logger.ts +116 -40
- package/src/utils/MxpEncryption.ts +69 -34
- package/dist/mxp/MxpEventForwardingEnhancer.d.ts +0 -134
- package/dist/mxp/MxpEventForwardingEnhancer.d.ts.map +0 -1
- package/dist/mxp/MxpEventForwardingEnhancer.js +0 -361
- package/dist/mxp/MxpEventForwardingEnhancer.js.map +0 -1
- package/dist/protocols/mcp/services/ToolSchemaEnhancements.d.ts +0 -56
- package/dist/protocols/mcp/services/ToolSchemaEnhancements.d.ts.map +0 -1
- package/dist/protocols/mcp/services/ToolSchemaEnhancements.js +0 -57
- package/dist/protocols/mcp/services/ToolSchemaEnhancements.js.map +0 -1
- package/dist/protocols/mcp/tools/ControlLoopLifecycle.d.ts +0 -270
- package/dist/protocols/mcp/tools/ControlLoopLifecycle.d.ts.map +0 -1
- package/dist/protocols/mcp/tools/ControlLoopLifecycle.js +0 -256
- package/dist/protocols/mcp/tools/ControlLoopLifecycle.js.map +0 -1
- package/dist/protocols/mcp/tools/LspTools.d.ts +0 -495
- package/dist/protocols/mcp/tools/LspTools.d.ts.map +0 -1
- package/dist/protocols/mcp/tools/LspTools.js +0 -469
- package/dist/protocols/mcp/tools/LspTools.js.map +0 -1
- package/src/mxp/MxpEventForwardingEnhancer.ts +0 -471
- package/src/protocols/mcp/services/ToolSchemaEnhancements.ts +0 -92
- package/src/protocols/mcp/tools/ControlLoopLifecycle.ts +0 -302
- package/src/protocols/mcp/tools/LspTools.ts +0 -476
package/src/events/EventNames.ts
CHANGED
|
@@ -154,6 +154,10 @@ import { MeilisearchEvents } from './event-definitions/MeilisearchEvents.js';
|
|
|
154
154
|
import type { MeilisearchPayloads } from './event-definitions/MeilisearchEvents.js';
|
|
155
155
|
export { MeilisearchEvents };
|
|
156
156
|
export type { MeilisearchPayloads };
|
|
157
|
+
import { LlmBudgetEvents } from './event-definitions/LlmBudgetEvents.js';
|
|
158
|
+
import type { LlmBudgetPayloads } from './event-definitions/LlmBudgetEvents.js';
|
|
159
|
+
export { LlmBudgetEvents };
|
|
160
|
+
export type { LlmBudgetPayloads };
|
|
157
161
|
|
|
158
162
|
import { CodeExecutionEvents } from './event-definitions/CodeExecutionEvents.js';
|
|
159
163
|
import type { CodeExecutionPayloads } from './event-definitions/CodeExecutionEvents.js';
|
|
@@ -252,6 +256,7 @@ export namespace Events {
|
|
|
252
256
|
export const Auth = AuthEvents;
|
|
253
257
|
export const Mxp = MxpEvents;
|
|
254
258
|
export const Meilisearch = MeilisearchEvents;
|
|
259
|
+
export const LlmBudget = LlmBudgetEvents;
|
|
255
260
|
export const CodeExecution = CodeExecutionEvents;
|
|
256
261
|
export const Shell = ShellExecutionEvents;
|
|
257
262
|
export const Workflow = WorkflowEvents;
|
|
@@ -288,6 +293,7 @@ export type EventMap =
|
|
|
288
293
|
BulkPayloads &
|
|
289
294
|
MxpPayloads &
|
|
290
295
|
MeilisearchPayloads &
|
|
296
|
+
LlmBudgetPayloads &
|
|
291
297
|
CodeExecutionPayloads &
|
|
292
298
|
ShellExecutionPayloads &
|
|
293
299
|
WorkflowPayloads &
|
|
@@ -154,12 +154,15 @@ export const PUBLIC_USER_INPUT_EVENTS = [
|
|
|
154
154
|
|
|
155
155
|
/**
|
|
156
156
|
* Public Meilisearch Events - Semantic search operations
|
|
157
|
+
*
|
|
158
|
+
* Result events only. The *:request events stay internal, and there is no
|
|
159
|
+
* search event: search is a request/response call, not something the framework
|
|
160
|
+
* publishes.
|
|
157
161
|
*/
|
|
158
162
|
export const PUBLIC_MEILISEARCH_EVENTS = [
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
'meilisearch:search',
|
|
163
|
+
Events.Meilisearch.INDEX,
|
|
164
|
+
Events.Meilisearch.BACKFILL_COMPLETE,
|
|
165
|
+
Events.Meilisearch.BACKFILL_PARTIAL,
|
|
163
166
|
] as const;
|
|
164
167
|
|
|
165
168
|
/**
|
|
@@ -26,29 +26,19 @@
|
|
|
26
26
|
* and event routing to agents and channels.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import { Subject
|
|
30
|
-
import {
|
|
31
|
-
import type { Server as SocketIOServer, Socket } from 'socket.io';
|
|
32
|
-
import { Events, ChannelActionTypes, MessageEvents } from './EventNames.js';
|
|
33
|
-
import type { EventMap } from './EventNames.js';
|
|
29
|
+
import { Subject } from 'rxjs';
|
|
30
|
+
import type { Server as SocketIOServer } from 'socket.io';
|
|
34
31
|
import { ControlLoopEvents } from './event-definitions/ControlLoopEvents.js';
|
|
35
32
|
import { OrparEvents } from './event-definitions/OrparEvents.js';
|
|
36
33
|
import { McpEvents } from './event-definitions/McpEvents.js';
|
|
37
34
|
import { TaskEvents } from './event-definitions/TaskEvents.js';
|
|
38
|
-
import {
|
|
39
|
-
AnyEventName,
|
|
40
|
-
BaseEventBusImplementation,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
isReservedEvent
|
|
46
|
-
, invokeHandlerSafely, PayloadOf } from './EventBusBase.js';
|
|
47
|
-
import {
|
|
48
|
-
createAgentEventPayload,
|
|
49
|
-
createChannelEventPayload,
|
|
50
|
-
createBaseEventPayload
|
|
51
|
-
} from '../schemas/EventPayloadSchema.js';
|
|
35
|
+
import {
|
|
36
|
+
AnyEventName,
|
|
37
|
+
BaseEventBusImplementation,
|
|
38
|
+
EventMessage,
|
|
39
|
+
isReservedEvent,
|
|
40
|
+
PayloadOf
|
|
41
|
+
} from './EventBusBase.js';
|
|
52
42
|
import { createStrictValidator } from '../utils/validation.js';
|
|
53
43
|
import { Logger } from '../utils/Logger.js';
|
|
54
44
|
|
|
@@ -75,91 +65,64 @@ export interface IServerEventBus extends BaseEventBusImplementation {
|
|
|
75
65
|
*/
|
|
76
66
|
clearSocketServer(): this;
|
|
77
67
|
|
|
78
|
-
/**
|
|
79
|
-
* Emit an event
|
|
80
|
-
* @param event Event name
|
|
81
|
-
* @param payload Event payload
|
|
82
|
-
*/
|
|
83
|
-
emit<K extends AnyEventName>(event: K, payload: PayloadOf<K>): void;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Subscribe to all events in the server event bus
|
|
87
|
-
*
|
|
88
|
-
* @param listener Listener function that receives both event type and payload
|
|
89
|
-
* @returns Subscription that can be unsubscribed to stop listening
|
|
90
|
-
*/
|
|
91
|
-
onAll(listener: (eventType: string, payload: any) => void): Subscription;
|
|
92
|
-
|
|
93
68
|
/**
|
|
94
69
|
* Remove all server event listeners
|
|
95
70
|
* @returns this (for chaining)
|
|
96
71
|
*/
|
|
97
72
|
removeAllSocketListeners(): this;
|
|
98
|
-
|
|
73
|
+
|
|
99
74
|
/**
|
|
100
75
|
* Clean up all subscriptions and listeners
|
|
101
76
|
* @returns this (for chaining)
|
|
102
77
|
*/
|
|
103
78
|
cleanup(): this;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Enable or disable debug mode to log all events
|
|
107
|
-
*
|
|
108
|
-
* @param enabled Whether debug mode should be enabled
|
|
109
|
-
* @returns this (for chaining)
|
|
110
|
-
*/
|
|
111
|
-
enableDebugMode(enabled?: boolean): this;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Subscribe to an event with category for grouped subscription management
|
|
115
|
-
*
|
|
116
|
-
* @param category Category name for grouping subscriptions
|
|
117
|
-
* @param event Event name to subscribe to
|
|
118
|
-
* @param listener Listener function to call when the event is emitted
|
|
119
|
-
* @returns Subscription that can be unsubscribed to stop listening
|
|
120
|
-
*/
|
|
121
|
-
onWithCategory<T extends AnyEventName>(
|
|
122
|
-
category: string,
|
|
123
|
-
event: T,
|
|
124
|
-
listener: (payload: any) => void
|
|
125
|
-
): Subscription;
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Unsubscribe from all events in a specific category
|
|
129
|
-
*
|
|
130
|
-
* @param category Category name to unsubscribe from
|
|
131
|
-
* @returns this (for chaining)
|
|
132
|
-
*/
|
|
133
|
-
unsubscribeCategory(category: string): this;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Remove all event listeners for a specific event or all events
|
|
137
|
-
* @param event Optional specific event name to remove listeners for
|
|
138
|
-
* @returns this (for chaining)
|
|
139
|
-
*/
|
|
140
|
-
removeAllListeners(event?: AnyEventName): this;
|
|
141
79
|
}
|
|
142
80
|
|
|
143
81
|
/**
|
|
144
82
|
* Server-side event bus implementation
|
|
145
83
|
*/
|
|
146
84
|
export class ServerEventBus extends BaseEventBusImplementation implements IServerEventBus {
|
|
85
|
+
/**
|
|
86
|
+
* Events delivered to specific agents/channels by eventForwardingHandlers.
|
|
87
|
+
* Broadcasting these over io.emit() would deliver them twice.
|
|
88
|
+
*/
|
|
89
|
+
private static readonly AGENT_SPECIFIC_EVENTS: ReadonlySet<string> = new Set<string>([
|
|
90
|
+
...Object.values(ControlLoopEvents),
|
|
91
|
+
...Object.values(OrparEvents),
|
|
92
|
+
// MCP response events
|
|
93
|
+
McpEvents.TOOL_RESULT,
|
|
94
|
+
McpEvents.TOOL_ERROR,
|
|
95
|
+
McpEvents.TOOL_REGISTERED,
|
|
96
|
+
McpEvents.TOOL_UNREGISTERED,
|
|
97
|
+
McpEvents.MXF_TOOL_LIST_RESULT,
|
|
98
|
+
McpEvents.MXF_TOOL_LIST_ERROR,
|
|
99
|
+
McpEvents.RESOURCE_RESULT,
|
|
100
|
+
McpEvents.RESOURCE_ERROR,
|
|
101
|
+
McpEvents.EXTERNAL_SERVER_REGISTERED,
|
|
102
|
+
McpEvents.EXTERNAL_SERVER_UNREGISTERED,
|
|
103
|
+
McpEvents.EXTERNAL_SERVER_REGISTRATION_FAILED,
|
|
104
|
+
McpEvents.CHANNEL_SERVER_REGISTERED,
|
|
105
|
+
McpEvents.CHANNEL_SERVER_UNREGISTERED,
|
|
106
|
+
McpEvents.CHANNEL_SERVER_REGISTRATION_FAILED,
|
|
107
|
+
// Task lifecycle events
|
|
108
|
+
TaskEvents.CREATED,
|
|
109
|
+
TaskEvents.ASSIGNED,
|
|
110
|
+
TaskEvents.STARTED,
|
|
111
|
+
TaskEvents.PROGRESS_UPDATED,
|
|
112
|
+
TaskEvents.COMPLETED,
|
|
113
|
+
TaskEvents.FAILED,
|
|
114
|
+
TaskEvents.ERROR,
|
|
115
|
+
TaskEvents.CANCELLED,
|
|
116
|
+
]);
|
|
117
|
+
|
|
147
118
|
private ioInstance: SocketIOServer | null = null;
|
|
148
|
-
|
|
149
|
-
private categorySubscriptions: Map<string, Subscription[]> = new Map();
|
|
150
|
-
|
|
151
|
-
// Track subscriptions by event and handler for proper off() support
|
|
152
|
-
private handlerSubscriptions: Map<string, Map<EventHandler<any>, Subscription>> = new Map();
|
|
153
|
-
private debugMode: boolean = false;
|
|
154
|
-
private debugSubscription: Subscription | null = null;
|
|
155
|
-
|
|
119
|
+
|
|
156
120
|
/**
|
|
157
121
|
* Create a new ServerEventBus
|
|
158
122
|
* @param eventSubject Subject to use for events
|
|
159
123
|
*/
|
|
160
124
|
constructor(eventSubject: Subject<EventMessage>) {
|
|
161
|
-
super(eventSubject);
|
|
162
|
-
//;
|
|
125
|
+
super(eventSubject, logger);
|
|
163
126
|
}
|
|
164
127
|
|
|
165
128
|
/**
|
|
@@ -195,412 +158,54 @@ export class ServerEventBus extends BaseEventBusImplementation implements IServe
|
|
|
195
158
|
}
|
|
196
159
|
|
|
197
160
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
payload = {} as PayloadOf<K>;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Special logging for critical events like agent registration
|
|
217
|
-
if (event.startsWith('agent:')) {
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Emit to local event bus first
|
|
221
|
-
this.eventSubject.next({
|
|
222
|
-
type: event,
|
|
223
|
-
payload,
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// Also emit to the Socket.IO server if available
|
|
227
|
-
// IMPORTANT: Do NOT broadcast agent-specific events via io.emit().
|
|
228
|
-
// These events are forwarded to specific agents/channels via
|
|
229
|
-
// eventForwardingHandlers.forwardEventToAgent()/forwardEventToChannel().
|
|
230
|
-
// Broadcasting them causes duplicates: the SDK's ClientEventBus.setupClientSocketForwarding()
|
|
231
|
-
// has socket.onAny() that re-injects received socket events back into the RxJS Subject,
|
|
232
|
-
// so MxfChannelMonitor sees each broadcast event twice (once from Subject push, once from
|
|
233
|
-
// socket re-injection).
|
|
234
|
-
const agentSpecificEvents = new Set([
|
|
235
|
-
...Object.values(ControlLoopEvents),
|
|
236
|
-
...Object.values(OrparEvents),
|
|
237
|
-
// MCP response events — already forwarded to specific agents via eventForwardingHandlers
|
|
238
|
-
McpEvents.TOOL_RESULT,
|
|
239
|
-
McpEvents.TOOL_ERROR,
|
|
240
|
-
McpEvents.TOOL_REGISTERED,
|
|
241
|
-
McpEvents.TOOL_UNREGISTERED,
|
|
242
|
-
McpEvents.MXF_TOOL_LIST_RESULT,
|
|
243
|
-
McpEvents.MXF_TOOL_LIST_ERROR,
|
|
244
|
-
McpEvents.RESOURCE_RESULT,
|
|
245
|
-
McpEvents.RESOURCE_ERROR,
|
|
246
|
-
McpEvents.EXTERNAL_SERVER_REGISTERED,
|
|
247
|
-
McpEvents.EXTERNAL_SERVER_UNREGISTERED,
|
|
248
|
-
McpEvents.EXTERNAL_SERVER_REGISTRATION_FAILED,
|
|
249
|
-
McpEvents.CHANNEL_SERVER_REGISTERED,
|
|
250
|
-
McpEvents.CHANNEL_SERVER_UNREGISTERED,
|
|
251
|
-
McpEvents.CHANNEL_SERVER_REGISTRATION_FAILED,
|
|
252
|
-
// Task lifecycle events — already forwarded to specific agents/channels
|
|
253
|
-
TaskEvents.CREATED,
|
|
254
|
-
TaskEvents.ASSIGNED,
|
|
255
|
-
TaskEvents.STARTED,
|
|
256
|
-
TaskEvents.PROGRESS_UPDATED,
|
|
257
|
-
TaskEvents.COMPLETED,
|
|
258
|
-
TaskEvents.FAILED,
|
|
259
|
-
TaskEvents.ERROR,
|
|
260
|
-
TaskEvents.CANCELLED,
|
|
261
|
-
]);
|
|
262
|
-
|
|
263
|
-
if (this.ioInstance && !isReservedEvent(event) && !agentSpecificEvents.has(event)) {
|
|
264
|
-
//;
|
|
265
|
-
this.ioInstance.emit(event, payload);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
//;
|
|
269
|
-
} catch (error) {
|
|
270
|
-
logger.error(`[ServerEventBus] Error emitting event '${event}':`, error instanceof Error ? error.message : String(error));
|
|
271
|
-
|
|
272
|
-
// Re-throw the error for the caller to handle
|
|
273
|
-
throw error;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Override the base on method to track handlers and subscriptions
|
|
279
|
-
* @param event Event name
|
|
280
|
-
* @param handler Event handler function
|
|
281
|
-
* @returns Subscription to use for unsubscribing
|
|
282
|
-
*/
|
|
283
|
-
public override on<K extends AnyEventName>(event: K, handler: EventHandler<PayloadOf<K>>): Subscription {
|
|
284
|
-
// Create a filtered observable for this event
|
|
285
|
-
const observable = this.eventSubject.pipe(
|
|
286
|
-
filter((e: EventMessage) => e.type === event),
|
|
287
|
-
map((e: EventMessage) => e.payload)
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
// Subscribe with throw/rejection isolation so one bad handler cannot
|
|
291
|
-
// kill the subscription or fail silently.
|
|
292
|
-
const subscription = observable.subscribe((payload) =>
|
|
293
|
-
invokeHandlerSafely(logger, event, handler, payload)
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// Store the subscription for cleanup
|
|
297
|
-
this.subscriptions.push(subscription);
|
|
298
|
-
|
|
299
|
-
// Track handlers for off() support
|
|
300
|
-
if (!this.handlerSubscriptions.has(event)) {
|
|
301
|
-
this.handlerSubscriptions.set(event, new Map());
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const eventHandlers = this.handlerSubscriptions.get(event);
|
|
305
|
-
if (eventHandlers) {
|
|
306
|
-
eventHandlers.set(handler, subscription);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return subscription;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Override the base once method to track handlers and subscriptions
|
|
314
|
-
* Once the event is fired, the subscription is automatically removed
|
|
315
|
-
*
|
|
316
|
-
* @param event Event name
|
|
317
|
-
* @param handler Event handler function
|
|
318
|
-
* @returns Subscription to use for unsubscribing
|
|
319
|
-
*/
|
|
320
|
-
public override once<K extends AnyEventName>(event: K, handler: EventHandler<any>): Subscription {
|
|
321
|
-
// Create a filtered observable for this event
|
|
322
|
-
const observable = this.eventSubject.pipe(
|
|
323
|
-
filter((e: EventMessage) => e.type === event),
|
|
324
|
-
map((e: EventMessage) => e.payload)
|
|
325
|
-
);
|
|
326
|
-
|
|
327
|
-
// Create a wrapper handler that will unsubscribe after first execution
|
|
328
|
-
const onceHandler = (payload: any) => {
|
|
329
|
-
try {
|
|
330
|
-
invokeHandlerSafely(logger, event, handler, payload);
|
|
331
|
-
} finally {
|
|
332
|
-
// Always unsubscribe — once means once, even when the handler throws.
|
|
333
|
-
this.off(event, onceHandler);
|
|
334
|
-
}
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
// Subscribe to the observable with the one-time handler
|
|
338
|
-
const subscription = observable.subscribe(onceHandler);
|
|
339
|
-
|
|
340
|
-
// Store the subscription for cleanup
|
|
341
|
-
this.subscriptions.push(subscription);
|
|
342
|
-
|
|
343
|
-
// Track handlers for off() support
|
|
344
|
-
if (!this.handlerSubscriptions.has(event)) {
|
|
345
|
-
this.handlerSubscriptions.set(event, new Map());
|
|
161
|
+
* Forward an emitted event to the Socket.IO server.
|
|
162
|
+
*
|
|
163
|
+
* Called by BaseEventBusImplementation.emit() after validation and local
|
|
164
|
+
* delivery.
|
|
165
|
+
*
|
|
166
|
+
* Agent-specific events are NOT broadcast with io.emit(). They are routed
|
|
167
|
+
* to individual agents/channels by eventForwardingHandlers. Broadcasting
|
|
168
|
+
* them would duplicate delivery: the SDK's ClientEventBus.setupClientSocketForwarding()
|
|
169
|
+
* re-injects everything the socket receives back into the shared RxJS Subject,
|
|
170
|
+
* so a broadcast event would be seen twice (once from the Subject push, once
|
|
171
|
+
* from the socket re-injection).
|
|
172
|
+
*/
|
|
173
|
+
protected override forwardToTransport<K extends AnyEventName>(event: K, payload: PayloadOf<K>): void {
|
|
174
|
+
if (!this.ioInstance) {
|
|
175
|
+
return;
|
|
346
176
|
}
|
|
347
|
-
|
|
348
|
-
const
|
|
349
|
-
if (
|
|
350
|
-
|
|
177
|
+
|
|
178
|
+
const eventName = String(event);
|
|
179
|
+
if (isReservedEvent(eventName) || ServerEventBus.AGENT_SPECIFIC_EVENTS.has(eventName)) {
|
|
180
|
+
return;
|
|
351
181
|
}
|
|
352
|
-
|
|
353
|
-
return subscription;
|
|
354
|
-
}
|
|
355
182
|
|
|
356
|
-
|
|
357
|
-
* Subscribe to all events in the server event bus
|
|
358
|
-
*
|
|
359
|
-
* @param listener Listener function that receives both event type and payload
|
|
360
|
-
* @returns Subscription that can be unsubscribed to stop listening
|
|
361
|
-
*/
|
|
362
|
-
public onAll(listener: (eventType: string, payload: any) => void): Subscription {
|
|
363
|
-
// Create an observable that passes both event type and payload
|
|
364
|
-
const observable = this.eventSubject.pipe(
|
|
365
|
-
map((e: EventMessage) => ({ type: e.type, payload: e.payload }))
|
|
366
|
-
);
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
// Subscribe to the observable with the listener
|
|
370
|
-
const subscription = observable.subscribe(event => {
|
|
371
|
-
listener(event.type, event.payload);
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
// Store the subscription for cleanup
|
|
375
|
-
this.subscriptions.push(subscription);
|
|
376
|
-
|
|
377
|
-
return subscription;
|
|
183
|
+
this.ioInstance.emit(eventName, payload);
|
|
378
184
|
}
|
|
379
|
-
|
|
185
|
+
|
|
380
186
|
/**
|
|
381
|
-
*
|
|
187
|
+
* Drop the Socket.IO server reference so no further events are broadcast.
|
|
188
|
+
*
|
|
189
|
+
* The bus attaches no listeners to the Socket.IO server — it only calls
|
|
190
|
+
* io.emit() — so there is nothing else to detach here.
|
|
191
|
+
*
|
|
382
192
|
* @returns this (for chaining)
|
|
383
193
|
*/
|
|
384
194
|
public removeAllSocketListeners(): this {
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
// Since Socket.IO Server doesn't have a direct equivalent to removeAllListeners(),
|
|
388
|
-
// we would need to track all listeners separately if we want to remove them.
|
|
389
|
-
// For now, we log that this operation is not fully implemented.
|
|
390
|
-
} catch (error) {
|
|
391
|
-
logger.error('[ServerEventBus] Error removing socket listeners:', error instanceof Error ? error.message : String(error));
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
195
|
+
this.ioInstance = null;
|
|
196
|
+
|
|
395
197
|
return this;
|
|
396
198
|
}
|
|
397
|
-
|
|
199
|
+
|
|
398
200
|
/**
|
|
399
|
-
*
|
|
201
|
+
* Dispose every subscription and detach the Socket.IO server.
|
|
202
|
+
*
|
|
400
203
|
* @returns this (for chaining)
|
|
401
204
|
*/
|
|
402
205
|
public cleanup(): this {
|
|
403
|
-
|
|
404
|
-
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
405
|
-
this.subscriptions = [];
|
|
406
|
-
|
|
407
|
-
// Clear category subscriptions
|
|
408
|
-
this.categorySubscriptions.clear();
|
|
409
|
-
|
|
410
|
-
// Remove socket listeners
|
|
206
|
+
this.removeAllListeners();
|
|
411
207
|
this.removeAllSocketListeners();
|
|
412
|
-
|
|
413
|
-
// Reset debug mode
|
|
414
|
-
this.debugMode = false;
|
|
415
|
-
this.debugSubscription = null;
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
return this;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
/**
|
|
422
|
-
* Enable or disable debug mode to log all events
|
|
423
|
-
*
|
|
424
|
-
* @param enabled Whether debug mode should be enabled
|
|
425
|
-
* @returns this (for chaining)
|
|
426
|
-
*/
|
|
427
|
-
public enableDebugMode(enabled: boolean = true): this {
|
|
428
|
-
// If already in the requested mode, do nothing
|
|
429
|
-
if (this.debugMode === enabled) {
|
|
430
|
-
return this;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
this.debugMode = enabled;
|
|
434
|
-
|
|
435
|
-
// If enabling debug mode
|
|
436
|
-
if (enabled) {
|
|
437
|
-
|
|
438
|
-
// Create a subscription to all events
|
|
439
|
-
this.debugSubscription = this.onAll((eventType, payload) => {
|
|
440
|
-
// ;
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
// Make sure it's tracked for cleanup
|
|
444
|
-
if (this.debugSubscription) {
|
|
445
|
-
this.subscriptions.push(this.debugSubscription);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
// If disabling debug mode
|
|
449
|
-
else if (this.debugSubscription) {
|
|
450
|
-
|
|
451
|
-
// Unsubscribe from the debug subscription
|
|
452
|
-
this.debugSubscription.unsubscribe();
|
|
453
|
-
|
|
454
|
-
// Remove from subscriptions array
|
|
455
|
-
const index = this.subscriptions.indexOf(this.debugSubscription);
|
|
456
|
-
if (index !== -1) {
|
|
457
|
-
this.subscriptions.splice(index, 1);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
this.debugSubscription = null;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
return this;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
/**
|
|
467
|
-
* Subscribe to an event with category for grouped subscription management
|
|
468
|
-
*
|
|
469
|
-
* @param category Category name for grouping subscriptions
|
|
470
|
-
* @param event Event name to subscribe to
|
|
471
|
-
* @param listener Listener function to call when the event is emitted
|
|
472
|
-
* @returns Subscription that can be unsubscribed to stop listening
|
|
473
|
-
*/
|
|
474
|
-
public onWithCategory<T extends AnyEventName>(
|
|
475
|
-
category: string,
|
|
476
|
-
event: T,
|
|
477
|
-
listener: (payload: any) => void
|
|
478
|
-
): Subscription {
|
|
479
|
-
// Create a subscription using the standard on method
|
|
480
|
-
const subscription = this.on(event, listener);
|
|
481
|
-
|
|
482
|
-
// Store in the category map
|
|
483
|
-
if (!this.categorySubscriptions.has(category)) {
|
|
484
|
-
this.categorySubscriptions.set(category, []);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const categorySubs = this.categorySubscriptions.get(category);
|
|
488
|
-
if (categorySubs) {
|
|
489
|
-
categorySubs.push(subscription);
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
// ;
|
|
493
|
-
|
|
494
|
-
return subscription;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
/**
|
|
498
|
-
* Unsubscribe from all events in a specific category
|
|
499
|
-
*
|
|
500
|
-
* @param category Category name to unsubscribe from
|
|
501
|
-
* @returns this (for chaining)
|
|
502
|
-
*/
|
|
503
|
-
public unsubscribeCategory(category: string): this {
|
|
504
|
-
const subscriptions = this.categorySubscriptions.get(category) || [];
|
|
505
|
-
|
|
506
|
-
if (subscriptions.length > 0) {
|
|
507
|
-
|
|
508
|
-
// Unsubscribe from each subscription in the category
|
|
509
|
-
subscriptions.forEach(subscription => {
|
|
510
|
-
subscription.unsubscribe();
|
|
511
|
-
|
|
512
|
-
// Also remove from the main subscriptions array
|
|
513
|
-
const index = this.subscriptions.indexOf(subscription);
|
|
514
|
-
if (index !== -1) {
|
|
515
|
-
this.subscriptions.splice(index, 1);
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
// Clear the category
|
|
520
|
-
this.categorySubscriptions.delete(category);
|
|
521
|
-
} else {
|
|
522
|
-
// ;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
return this;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
/**
|
|
529
|
-
* Unsubscribe from an event
|
|
530
|
-
* @param event Event name
|
|
531
|
-
* @param handler Event handler function (optional)
|
|
532
|
-
*/
|
|
533
|
-
public override off<K extends AnyEventName>(event: K, handler?: EventHandler<any>): void {
|
|
534
|
-
validateEventName(event);
|
|
535
|
-
|
|
536
|
-
const eventHandlers = this.handlerSubscriptions.get(event);
|
|
537
|
-
if (!eventHandlers) {
|
|
538
|
-
// No handlers for this event found
|
|
539
|
-
// ;
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
if (handler) {
|
|
544
|
-
// If specific handler provided, just unsubscribe that one
|
|
545
|
-
const subscription = eventHandlers.get(handler);
|
|
546
|
-
if (subscription) {
|
|
547
|
-
// Unsubscribe from the RxJS subscription
|
|
548
|
-
subscription.unsubscribe();
|
|
549
|
-
|
|
550
|
-
// Remove from our handler registry
|
|
551
|
-
eventHandlers.delete(handler);
|
|
552
|
-
|
|
553
|
-
// Remove from the array if present
|
|
554
|
-
const index = this.subscriptions.indexOf(subscription);
|
|
555
|
-
if (index !== -1) {
|
|
556
|
-
this.subscriptions.splice(index, 1);
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
// ;
|
|
560
|
-
} else {
|
|
561
|
-
// ;
|
|
562
|
-
}
|
|
563
|
-
} else {
|
|
564
|
-
// If no specific handler, unsubscribe all handlers for this event
|
|
565
|
-
let unsubscribedCount = 0;
|
|
566
|
-
|
|
567
|
-
eventHandlers.forEach((subscription) => {
|
|
568
|
-
// Unsubscribe from the RxJS subscription
|
|
569
|
-
subscription.unsubscribe();
|
|
570
|
-
|
|
571
|
-
// Remove from the array if present
|
|
572
|
-
const index = this.subscriptions.indexOf(subscription);
|
|
573
|
-
if (index !== -1) {
|
|
574
|
-
this.subscriptions.splice(index, 1);
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
unsubscribedCount++;
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
// Clear all handlers for this event
|
|
581
|
-
eventHandlers.clear();
|
|
582
|
-
|
|
583
|
-
// ;
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
/**
|
|
588
|
-
* Remove all event listeners for a specific event or all events
|
|
589
|
-
* @param event Optional specific event name to remove listeners for
|
|
590
|
-
* @returns this (for chaining)
|
|
591
|
-
*/
|
|
592
|
-
public removeAllListeners(event?: AnyEventName): this {
|
|
593
|
-
// Remove all event listeners
|
|
594
|
-
this.eventSubject.observers = [];
|
|
595
|
-
|
|
596
|
-
// Also clear our handler registries if appropriate
|
|
597
|
-
if (event) {
|
|
598
|
-
this.handlerSubscriptions.delete(event);
|
|
599
|
-
} else {
|
|
600
|
-
this.handlerSubscriptions.clear();
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
|
|
208
|
+
|
|
604
209
|
return this;
|
|
605
210
|
}
|
|
606
211
|
}
|