@teneo-protocol/sdk 1.0.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.
- package/.dockerignore +14 -0
- package/.env.test.example +14 -0
- package/.eslintrc.json +26 -0
- package/.github/workflows/claude-code-review.yml +78 -0
- package/.github/workflows/claude-reviewer.yml +64 -0
- package/.github/workflows/publish-npm.yml +38 -0
- package/.github/workflows/push-to-main.yml +23 -0
- package/.node-version +1 -0
- package/.prettierrc +11 -0
- package/Dockerfile +25 -0
- package/LICENCE +661 -0
- package/README.md +709 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +45 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/websocket-client.d.ts +261 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +875 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/formatters/response-formatter.d.ts +354 -0
- package/dist/formatters/response-formatter.d.ts.map +1 -0
- package/dist/formatters/response-formatter.js +575 -0
- package/dist/formatters/response-formatter.js.map +1 -0
- package/dist/handlers/message-handler-registry.d.ts +155 -0
- package/dist/handlers/message-handler-registry.d.ts.map +1 -0
- package/dist/handlers/message-handler-registry.js +216 -0
- package/dist/handlers/message-handler-registry.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +112 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js +40 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +25 -0
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +71 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.js +30 -0
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.js +60 -0
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.js +23 -0
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.js +51 -0
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/base-handler.d.ts +55 -0
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/base-handler.js +83 -0
- package/dist/handlers/message-handlers/base-handler.js.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts +73 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.js +47 -0
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.js +29 -0
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/index.d.ts +28 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -0
- package/dist/handlers/message-handlers/index.js +100 -0
- package/dist/handlers/message-handlers/index.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +122 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +30 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +104 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js +36 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +56 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js +59 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +44 -0
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/types.d.ts +51 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -0
- package/dist/handlers/message-handlers/types.js +7 -0
- package/dist/handlers/message-handlers/types.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +202 -0
- package/dist/handlers/webhook-handler.d.ts.map +1 -0
- package/dist/handlers/webhook-handler.js +511 -0
- package/dist/handlers/webhook-handler.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +173 -0
- package/dist/managers/agent-registry.d.ts.map +1 -0
- package/dist/managers/agent-registry.js +310 -0
- package/dist/managers/agent-registry.js.map +1 -0
- package/dist/managers/connection-manager.d.ts +134 -0
- package/dist/managers/connection-manager.d.ts.map +1 -0
- package/dist/managers/connection-manager.js +176 -0
- package/dist/managers/connection-manager.js.map +1 -0
- package/dist/managers/index.d.ts +9 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +16 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/message-router.d.ts +112 -0
- package/dist/managers/message-router.d.ts.map +1 -0
- package/dist/managers/message-router.js +260 -0
- package/dist/managers/message-router.js.map +1 -0
- package/dist/managers/room-manager.d.ts +165 -0
- package/dist/managers/room-manager.d.ts.map +1 -0
- package/dist/managers/room-manager.js +227 -0
- package/dist/managers/room-manager.js.map +1 -0
- package/dist/teneo-sdk.d.ts +703 -0
- package/dist/teneo-sdk.d.ts.map +1 -0
- package/dist/teneo-sdk.js +907 -0
- package/dist/teneo-sdk.js.map +1 -0
- package/dist/types/config.d.ts +1047 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +720 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/error-codes.d.ts +29 -0
- package/dist/types/error-codes.d.ts.map +1 -0
- package/dist/types/error-codes.js +41 -0
- package/dist/types/error-codes.js.map +1 -0
- package/dist/types/events.d.ts +616 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +261 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/health.d.ts +40 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +6 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +123 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +3734 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +482 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/validation.d.ts +81 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +115 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/bounded-queue.d.ts +127 -0
- package/dist/utils/bounded-queue.d.ts.map +1 -0
- package/dist/utils/bounded-queue.js +181 -0
- package/dist/utils/bounded-queue.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +141 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +215 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/deduplication-cache.d.ts +110 -0
- package/dist/utils/deduplication-cache.d.ts.map +1 -0
- package/dist/utils/deduplication-cache.js +177 -0
- package/dist/utils/deduplication-cache.js.map +1 -0
- package/dist/utils/event-waiter.d.ts +101 -0
- package/dist/utils/event-waiter.d.ts.map +1 -0
- package/dist/utils/event-waiter.js +118 -0
- package/dist/utils/event-waiter.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +72 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +122 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +190 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry-policy.d.ts +191 -0
- package/dist/utils/retry-policy.d.ts.map +1 -0
- package/dist/utils/retry-policy.js +225 -0
- package/dist/utils/retry-policy.js.map +1 -0
- package/dist/utils/secure-private-key.d.ts +113 -0
- package/dist/utils/secure-private-key.d.ts.map +1 -0
- package/dist/utils/secure-private-key.js +188 -0
- package/dist/utils/secure-private-key.js.map +1 -0
- package/dist/utils/signature-verifier.d.ts +143 -0
- package/dist/utils/signature-verifier.d.ts.map +1 -0
- package/dist/utils/signature-verifier.js +238 -0
- package/dist/utils/signature-verifier.js.map +1 -0
- package/dist/utils/ssrf-validator.d.ts +36 -0
- package/dist/utils/ssrf-validator.d.ts.map +1 -0
- package/dist/utils/ssrf-validator.js +195 -0
- package/dist/utils/ssrf-validator.js.map +1 -0
- package/examples/.env.example +17 -0
- package/examples/basic-usage.ts +211 -0
- package/examples/production-dashboard/.env.example +153 -0
- package/examples/production-dashboard/package.json +39 -0
- package/examples/production-dashboard/public/dashboard.html +642 -0
- package/examples/production-dashboard/server.ts +753 -0
- package/examples/webhook-integration.ts +239 -0
- package/examples/x-influencer-battle-redesign.html +1065 -0
- package/examples/x-influencer-battle-server.ts +217 -0
- package/examples/x-influencer-battle.html +787 -0
- package/package.json +65 -0
- package/src/constants.ts +43 -0
- package/src/core/websocket-client.test.ts +512 -0
- package/src/core/websocket-client.ts +1056 -0
- package/src/formatters/response-formatter.test.ts +571 -0
- package/src/formatters/response-formatter.ts +677 -0
- package/src/handlers/message-handler-registry.ts +239 -0
- package/src/handlers/message-handlers/agent-selected-handler.ts +40 -0
- package/src/handlers/message-handlers/agents-list-handler.ts +26 -0
- package/src/handlers/message-handlers/auth-error-handler.ts +31 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +66 -0
- package/src/handlers/message-handlers/auth-required-handler.ts +23 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +57 -0
- package/src/handlers/message-handlers/base-handler.ts +101 -0
- package/src/handlers/message-handlers/challenge-handler.ts +57 -0
- package/src/handlers/message-handlers/error-message-handler.ts +27 -0
- package/src/handlers/message-handlers/index.ts +77 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +28 -0
- package/src/handlers/message-handlers/ping-pong-handler.ts +30 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +65 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +47 -0
- package/src/handlers/message-handlers/task-response-handler.ts +45 -0
- package/src/handlers/message-handlers/types.ts +77 -0
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +47 -0
- package/src/handlers/webhook-handler.test.ts +789 -0
- package/src/handlers/webhook-handler.ts +576 -0
- package/src/index.ts +269 -0
- package/src/managers/agent-registry.test.ts +466 -0
- package/src/managers/agent-registry.ts +347 -0
- package/src/managers/connection-manager.ts +195 -0
- package/src/managers/index.ts +9 -0
- package/src/managers/message-router.ts +349 -0
- package/src/managers/room-manager.ts +248 -0
- package/src/teneo-sdk.ts +1022 -0
- package/src/types/config.test.ts +325 -0
- package/src/types/config.ts +799 -0
- package/src/types/error-codes.ts +44 -0
- package/src/types/events.test.ts +302 -0
- package/src/types/events.ts +382 -0
- package/src/types/health.ts +46 -0
- package/src/types/index.ts +199 -0
- package/src/types/messages.test.ts +660 -0
- package/src/types/messages.ts +570 -0
- package/src/types/validation.ts +123 -0
- package/src/utils/bounded-queue.test.ts +356 -0
- package/src/utils/bounded-queue.ts +205 -0
- package/src/utils/circuit-breaker.test.ts +394 -0
- package/src/utils/circuit-breaker.ts +262 -0
- package/src/utils/deduplication-cache.test.ts +380 -0
- package/src/utils/deduplication-cache.ts +198 -0
- package/src/utils/event-waiter.test.ts +381 -0
- package/src/utils/event-waiter.ts +172 -0
- package/src/utils/index.ts +74 -0
- package/src/utils/logger.ts +87 -0
- package/src/utils/rate-limiter.test.ts +341 -0
- package/src/utils/rate-limiter.ts +211 -0
- package/src/utils/retry-policy.test.ts +558 -0
- package/src/utils/retry-policy.ts +272 -0
- package/src/utils/secure-private-key.test.ts +356 -0
- package/src/utils/secure-private-key.ts +205 -0
- package/src/utils/signature-verifier.test.ts +464 -0
- package/src/utils/signature-verifier.ts +298 -0
- package/src/utils/ssrf-validator.test.ts +372 -0
- package/src/utils/ssrf-validator.ts +224 -0
- package/tests/integration/real-server.test.ts +740 -0
- package/tests/integration/websocket.test.ts +381 -0
- package/tests/integration-setup.ts +16 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +32 -0
- package/vitest.config.ts +42 -0
- package/vitest.integration.config.ts +23 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageRouter - Manages message sending and routing
|
|
3
|
+
* Handles user messages, direct commands, and message-response patterns
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "eventemitter3";
|
|
6
|
+
import { WebSocketClient } from "../core/websocket-client";
|
|
7
|
+
import { WebhookHandler } from "../handlers/webhook-handler";
|
|
8
|
+
import { ResponseFormatter, FormattedResponse } from "../formatters/response-formatter";
|
|
9
|
+
import { Logger, ResponseFormat } from "../types";
|
|
10
|
+
import { SDKEvents } from "../types/events";
|
|
11
|
+
export interface SendMessageOptions {
|
|
12
|
+
room: string;
|
|
13
|
+
from?: string;
|
|
14
|
+
waitForResponse?: boolean;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
format?: ResponseFormat | "raw" | "humanized";
|
|
17
|
+
}
|
|
18
|
+
export interface AgentCommand {
|
|
19
|
+
agent: string;
|
|
20
|
+
command: string;
|
|
21
|
+
room: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class MessageRouter extends EventEmitter<SDKEvents> {
|
|
24
|
+
private readonly wsClient;
|
|
25
|
+
private readonly webhookHandler;
|
|
26
|
+
private readonly responseFormatter;
|
|
27
|
+
private readonly logger;
|
|
28
|
+
private readonly messageTimeout;
|
|
29
|
+
private readonly responseFormat;
|
|
30
|
+
constructor(wsClient: WebSocketClient, webhookHandler: WebhookHandler, responseFormatter: ResponseFormatter, logger: Logger, config: {
|
|
31
|
+
messageTimeout?: number;
|
|
32
|
+
responseFormat?: ResponseFormat;
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Sends a message to agents via the coordinator.
|
|
36
|
+
* The coordinator intelligently selects the most appropriate agent.
|
|
37
|
+
* Supports optional response waiting with configurable timeout and format.
|
|
38
|
+
*
|
|
39
|
+
* @param content - The message content to send
|
|
40
|
+
* @param options - Configuration for message sending
|
|
41
|
+
* @param options.room - Room to send to (required)
|
|
42
|
+
* @param options.from - Sender address (defaults to authenticated wallet)
|
|
43
|
+
* @param options.waitForResponse - Whether to wait for response (default: false)
|
|
44
|
+
* @param options.timeout - Response timeout in ms (default: 60000)
|
|
45
|
+
* @param options.format - Response format: 'raw', 'humanized', or 'both'
|
|
46
|
+
* @returns Promise resolving to FormattedResponse if waiting, void otherwise
|
|
47
|
+
* @throws {SDKError} If not connected
|
|
48
|
+
* @throws {ValidationError} If content is empty, room not specified, or options invalid
|
|
49
|
+
* @throws {TimeoutError} If waitForResponse and timeout exceeded
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* // Fire and forget
|
|
54
|
+
* await messageRouter.sendMessage('What is the weather?', { room: 'general' });
|
|
55
|
+
*
|
|
56
|
+
* // Wait for response
|
|
57
|
+
* const response = await messageRouter.sendMessage('Calculate 2+2', {
|
|
58
|
+
* room: 'general',
|
|
59
|
+
* waitForResponse: true,
|
|
60
|
+
* timeout: 30000
|
|
61
|
+
* });
|
|
62
|
+
* console.log(response.humanized);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
sendMessage(content: string, options: SendMessageOptions): Promise<FormattedResponse | void>;
|
|
66
|
+
/**
|
|
67
|
+
* Sends a direct command to a specific agent, bypassing the coordinator.
|
|
68
|
+
* Formats command as "@agentName command" internally.
|
|
69
|
+
*
|
|
70
|
+
* @param command - The direct agent command configuration
|
|
71
|
+
* @param command.agent - Agent ID or name to send command to
|
|
72
|
+
* @param command.command - Command text to send
|
|
73
|
+
* @param command.room - Room to send in (required)
|
|
74
|
+
* @returns Promise that resolves when command is sent
|
|
75
|
+
* @throws {SDKError} If not connected
|
|
76
|
+
* @throws {ValidationError} If agent/command empty or room not specified
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* await messageRouter.sendDirectCommand({
|
|
81
|
+
* agent: 'weather-agent',
|
|
82
|
+
* command: 'Get forecast for Tokyo',
|
|
83
|
+
* room: 'general'
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
sendDirectCommand(command: AgentCommand): Promise<FormattedResponse | void>;
|
|
88
|
+
/**
|
|
89
|
+
* Send message and wait for agent response
|
|
90
|
+
* Uses event-waiter utility for clean Promise-based waiting with automatic cleanup
|
|
91
|
+
*/
|
|
92
|
+
private sendMessageAndWaitForResponse;
|
|
93
|
+
/**
|
|
94
|
+
* Set up event forwarding from WebSocket client
|
|
95
|
+
*/
|
|
96
|
+
private setupEventForwarding;
|
|
97
|
+
/**
|
|
98
|
+
* Destroys the message router and cleans up resources.
|
|
99
|
+
* Removes all event listeners and marks the router as destroyed.
|
|
100
|
+
* After destruction, the router cannot be reused.
|
|
101
|
+
*
|
|
102
|
+
* Note: Any pending waitForEvent calls will automatically timeout and clean up.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* messageRouter.destroy();
|
|
107
|
+
* console.log('Message router destroyed');
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
destroy(): void;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=message-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/managers/message-router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAGL,MAAM,EACN,cAAc,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAA4C,MAAM,iBAAiB,CAAC;AAUtF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,WAAW,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,SAAS,CAAC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAG9C,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,cAAc,CAAC;KACjC;IAaH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACU,WAAW,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAiCpC;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAmCxF;;;OAGG;YACW,6BAA6B;IA8C3C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkF5B;;;;;;;;;;;;OAYG;IACI,OAAO,IAAI,IAAI;CAOvB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MessageRouter - Manages message sending and routing
|
|
4
|
+
* Handles user messages, direct commands, and message-response patterns
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MessageRouter = void 0;
|
|
8
|
+
const eventemitter3_1 = require("eventemitter3");
|
|
9
|
+
const uuid_1 = require("uuid");
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
const events_1 = require("../types/events");
|
|
12
|
+
const error_codes_1 = require("../types/error-codes");
|
|
13
|
+
const constants_1 = require("../constants");
|
|
14
|
+
const validation_1 = require("../types/validation");
|
|
15
|
+
const event_waiter_1 = require("../utils/event-waiter");
|
|
16
|
+
class MessageRouter extends eventemitter3_1.EventEmitter {
|
|
17
|
+
constructor(wsClient, webhookHandler, responseFormatter, logger, config) {
|
|
18
|
+
super();
|
|
19
|
+
this.wsClient = wsClient;
|
|
20
|
+
this.webhookHandler = webhookHandler;
|
|
21
|
+
this.responseFormatter = responseFormatter;
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
this.messageTimeout = config.messageTimeout ?? constants_1.TIMEOUTS.DEFAULT_MESSAGE_TIMEOUT;
|
|
24
|
+
this.responseFormat = config.responseFormat ?? "humanized";
|
|
25
|
+
this.setupEventForwarding();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Sends a message to agents via the coordinator.
|
|
29
|
+
* The coordinator intelligently selects the most appropriate agent.
|
|
30
|
+
* Supports optional response waiting with configurable timeout and format.
|
|
31
|
+
*
|
|
32
|
+
* @param content - The message content to send
|
|
33
|
+
* @param options - Configuration for message sending
|
|
34
|
+
* @param options.room - Room to send to (required)
|
|
35
|
+
* @param options.from - Sender address (defaults to authenticated wallet)
|
|
36
|
+
* @param options.waitForResponse - Whether to wait for response (default: false)
|
|
37
|
+
* @param options.timeout - Response timeout in ms (default: 60000)
|
|
38
|
+
* @param options.format - Response format: 'raw', 'humanized', or 'both'
|
|
39
|
+
* @returns Promise resolving to FormattedResponse if waiting, void otherwise
|
|
40
|
+
* @throws {SDKError} If not connected
|
|
41
|
+
* @throws {ValidationError} If content is empty, room not specified, or options invalid
|
|
42
|
+
* @throws {TimeoutError} If waitForResponse and timeout exceeded
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* // Fire and forget
|
|
47
|
+
* await messageRouter.sendMessage('What is the weather?', { room: 'general' });
|
|
48
|
+
*
|
|
49
|
+
* // Wait for response
|
|
50
|
+
* const response = await messageRouter.sendMessage('Calculate 2+2', {
|
|
51
|
+
* room: 'general',
|
|
52
|
+
* waitForResponse: true,
|
|
53
|
+
* timeout: 30000
|
|
54
|
+
* });
|
|
55
|
+
* console.log(response.humanized);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
async sendMessage(content, options) {
|
|
59
|
+
if (!this.wsClient.isConnected) {
|
|
60
|
+
throw new events_1.SDKError("Not connected to Teneo network", error_codes_1.ErrorCode.NOT_CONNECTED);
|
|
61
|
+
}
|
|
62
|
+
// Validate content
|
|
63
|
+
const validatedContent = validation_1.MessageContentSchema.parse(content);
|
|
64
|
+
const room = options.room;
|
|
65
|
+
if (!room) {
|
|
66
|
+
throw new events_1.ValidationError("Room parameter is required");
|
|
67
|
+
}
|
|
68
|
+
// Use custom 'from' address if provided, otherwise use wallet address from auth state
|
|
69
|
+
const authState = this.wsClient.getAuthState();
|
|
70
|
+
const fromAddress = options.from ?? authState.walletAddress;
|
|
71
|
+
const message = (0, types_1.createUserMessage)(validatedContent, room, fromAddress);
|
|
72
|
+
this.logger.debug("MessageRouter: Sending message", {
|
|
73
|
+
content: validatedContent,
|
|
74
|
+
room,
|
|
75
|
+
from: fromAddress
|
|
76
|
+
});
|
|
77
|
+
if (options.waitForResponse) {
|
|
78
|
+
return await this.sendMessageAndWaitForResponse(message, options);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
await this.wsClient.sendMessage(message);
|
|
82
|
+
await this.webhookHandler.sendMessageWebhook(message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Sends a direct command to a specific agent, bypassing the coordinator.
|
|
87
|
+
* Formats command as "@agentName command" internally.
|
|
88
|
+
*
|
|
89
|
+
* @param command - The direct agent command configuration
|
|
90
|
+
* @param command.agent - Agent ID or name to send command to
|
|
91
|
+
* @param command.command - Command text to send
|
|
92
|
+
* @param command.room - Room to send in (required)
|
|
93
|
+
* @returns Promise that resolves when command is sent
|
|
94
|
+
* @throws {SDKError} If not connected
|
|
95
|
+
* @throws {ValidationError} If agent/command empty or room not specified
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* await messageRouter.sendDirectCommand({
|
|
100
|
+
* agent: 'weather-agent',
|
|
101
|
+
* command: 'Get forecast for Tokyo',
|
|
102
|
+
* room: 'general'
|
|
103
|
+
* });
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
async sendDirectCommand(command) {
|
|
107
|
+
if (!this.wsClient.isConnected) {
|
|
108
|
+
throw new events_1.SDKError("Not connected to Teneo network", error_codes_1.ErrorCode.NOT_CONNECTED);
|
|
109
|
+
}
|
|
110
|
+
// Validate command
|
|
111
|
+
const validatedAgent = validation_1.AgentIdSchema.parse(command.agent);
|
|
112
|
+
const validatedCommand = validation_1.AgentCommandContentSchema.parse(command.command);
|
|
113
|
+
const room = command.room;
|
|
114
|
+
if (!room) {
|
|
115
|
+
throw new events_1.ValidationError("Room parameter is required");
|
|
116
|
+
}
|
|
117
|
+
// Get wallet address from auth state
|
|
118
|
+
const authState = this.wsClient.getAuthState();
|
|
119
|
+
const walletAddress = authState.walletAddress;
|
|
120
|
+
// Format as direct command
|
|
121
|
+
const content = `@${validatedAgent} ${validatedCommand}`;
|
|
122
|
+
const message = (0, types_1.createUserMessage)(content, room, walletAddress);
|
|
123
|
+
this.logger.debug("MessageRouter: Sending direct command", {
|
|
124
|
+
agent: validatedAgent,
|
|
125
|
+
command: validatedCommand,
|
|
126
|
+
room,
|
|
127
|
+
from: walletAddress
|
|
128
|
+
});
|
|
129
|
+
await this.wsClient.sendMessage(message);
|
|
130
|
+
await this.webhookHandler.sendMessageWebhook(message);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Send message and wait for agent response
|
|
134
|
+
* Uses event-waiter utility for clean Promise-based waiting with automatic cleanup
|
|
135
|
+
*/
|
|
136
|
+
async sendMessageAndWaitForResponse(message, options) {
|
|
137
|
+
// Generate unique request ID for correlation
|
|
138
|
+
const requestId = (0, uuid_1.v4)();
|
|
139
|
+
const timeout = options.timeout ?? this.messageTimeout;
|
|
140
|
+
const format = options.format ?? this.responseFormat;
|
|
141
|
+
// Add client_request_id to message data for server-side correlation
|
|
142
|
+
const messageWithId = {
|
|
143
|
+
...message,
|
|
144
|
+
data: {
|
|
145
|
+
...(message.data || {}),
|
|
146
|
+
client_request_id: requestId
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
this.logger.debug("Sending message with request tracking", { requestId });
|
|
150
|
+
// Send message first (fail fast if send fails)
|
|
151
|
+
await this.wsClient.sendMessage(messageWithId);
|
|
152
|
+
// Wait for agent response with automatic timeout and cleanup
|
|
153
|
+
// The filter ensures we only match responses for THIS specific request
|
|
154
|
+
const response = await (0, event_waiter_1.waitForEvent)(this.wsClient, "agent:response", {
|
|
155
|
+
timeout,
|
|
156
|
+
filter: (r) => {
|
|
157
|
+
// Try to match by client_request_id if server echoes it back
|
|
158
|
+
const responseRequestId = r.raw?.data && "client_request_id" in r.raw.data
|
|
159
|
+
? r.raw.data.client_request_id
|
|
160
|
+
: undefined;
|
|
161
|
+
return responseRequestId === requestId;
|
|
162
|
+
},
|
|
163
|
+
timeoutMessage: `Message timeout - no response received after ${timeout}ms (requestId: ${requestId})`
|
|
164
|
+
});
|
|
165
|
+
// Format response according to requested format
|
|
166
|
+
if (format === "raw" && response.raw) {
|
|
167
|
+
return response.raw;
|
|
168
|
+
}
|
|
169
|
+
return response;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Set up event forwarding from WebSocket client
|
|
173
|
+
*/
|
|
174
|
+
setupEventForwarding() {
|
|
175
|
+
// Forward message events
|
|
176
|
+
this.wsClient.on("message:sent", (message) => {
|
|
177
|
+
this.emit("message:sent", message);
|
|
178
|
+
// Fire and forget - don't block event emission
|
|
179
|
+
this.webhookHandler.sendMessageWebhook(message).catch((error) => {
|
|
180
|
+
this.logger.error("Failed to send webhook for message:sent", error);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
this.wsClient.on("message:received", (message) => {
|
|
184
|
+
this.emit("message:received", message);
|
|
185
|
+
// Send webhook for received messages (fire-and-forget)
|
|
186
|
+
if (message.type !== "ping" && message.type !== "pong") {
|
|
187
|
+
this.webhookHandler.sendMessageWebhook(message).catch((error) => {
|
|
188
|
+
this.logger.error("Failed to send webhook for message:received", error);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
this.wsClient.on("message:error", (error, message) => this.emit("message:error", error, message));
|
|
193
|
+
// Forward agent events
|
|
194
|
+
this.wsClient.on("agent:selected", (data) => {
|
|
195
|
+
this.emit("agent:selected", data);
|
|
196
|
+
// Fire and forget - don't block event emission
|
|
197
|
+
this.webhookHandler
|
|
198
|
+
.sendWebhook("agent_selected", data, {
|
|
199
|
+
agentId: data.agentId
|
|
200
|
+
})
|
|
201
|
+
.catch((error) => {
|
|
202
|
+
this.logger.error("Failed to send webhook for agent:selected", error);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
this.wsClient.on("agent:response", (response) => {
|
|
206
|
+
// Format response only if raw message is available
|
|
207
|
+
let enhancedResponse = response;
|
|
208
|
+
if (response.raw) {
|
|
209
|
+
try {
|
|
210
|
+
const formatted = this.responseFormatter.formatTaskResponse(response.raw);
|
|
211
|
+
enhancedResponse = {
|
|
212
|
+
...response,
|
|
213
|
+
...formatted
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
this.logger.debug("Could not format response, using original", {
|
|
218
|
+
error
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Emit event (waitForEvent listeners will receive this)
|
|
223
|
+
this.emit("agent:response", enhancedResponse);
|
|
224
|
+
// Fire and forget - don't block event emission
|
|
225
|
+
this.webhookHandler
|
|
226
|
+
.sendWebhook("task_response", enhancedResponse, {
|
|
227
|
+
agentId: response.agentId,
|
|
228
|
+
taskId: response.taskId
|
|
229
|
+
})
|
|
230
|
+
.catch((error) => {
|
|
231
|
+
this.logger.error("Failed to send webhook for agent:response", error);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
// Forward coordinator events
|
|
235
|
+
this.wsClient.on("coordinator:processing", (request) => this.emit("coordinator:processing", request));
|
|
236
|
+
this.wsClient.on("coordinator:selected", (agentId, reasoning) => this.emit("coordinator:selected", agentId, reasoning));
|
|
237
|
+
this.wsClient.on("coordinator:error", (error) => this.emit("coordinator:error", error));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Destroys the message router and cleans up resources.
|
|
241
|
+
* Removes all event listeners and marks the router as destroyed.
|
|
242
|
+
* After destruction, the router cannot be reused.
|
|
243
|
+
*
|
|
244
|
+
* Note: Any pending waitForEvent calls will automatically timeout and clean up.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```typescript
|
|
248
|
+
* messageRouter.destroy();
|
|
249
|
+
* console.log('Message router destroyed');
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
destroy() {
|
|
253
|
+
this.logger.info("MessageRouter: Destroying");
|
|
254
|
+
// Remove all event listeners
|
|
255
|
+
// Any pending waitForEvent calls will automatically timeout and clean up
|
|
256
|
+
this.removeAllListeners();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.MessageRouter = MessageRouter;
|
|
260
|
+
//# sourceMappingURL=message-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/managers/message-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoomManager - Manages room state and operations
|
|
3
|
+
* Handles joining, leaving, and tracking rooms
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "eventemitter3";
|
|
6
|
+
import { WebSocketClient } from "../core/websocket-client";
|
|
7
|
+
import { Room, Logger, RoomInfo } from "../types";
|
|
8
|
+
import { SDKEvents } from "../types/events";
|
|
9
|
+
export declare class RoomManager extends EventEmitter<SDKEvents> {
|
|
10
|
+
private readonly wsClient;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
private readonly rooms;
|
|
13
|
+
private readonly subscribedRooms;
|
|
14
|
+
constructor(wsClient: WebSocketClient, logger: Logger);
|
|
15
|
+
/**
|
|
16
|
+
* Subscribes to a public room in the Teneo network.
|
|
17
|
+
* Validates room ID and sends subscribe message to the server.
|
|
18
|
+
* The actual subscription state is updated when the server confirms via room:subscribed event.
|
|
19
|
+
*
|
|
20
|
+
* @param roomId - The ID of the room to subscribe to
|
|
21
|
+
* @returns Promise that resolves when subscribed
|
|
22
|
+
* @throws {SDKError} If not connected to the network
|
|
23
|
+
* @throws {ValidationError} If roomId is empty or invalid
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* await roomManager.subscribeToRoom('general');
|
|
28
|
+
* console.log('Subscription request sent to general room');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
subscribeToRoom(roomId: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Unsubscribes from a room in the Teneo network.
|
|
34
|
+
* Validates room ID and sends unsubscribe message to the server.
|
|
35
|
+
* The actual subscription state is updated when the server confirms via room:unsubscribed event.
|
|
36
|
+
*
|
|
37
|
+
* @param roomId - The ID of the room to unsubscribe from
|
|
38
|
+
* @returns Promise that resolves when unsubscribed
|
|
39
|
+
* @throws {SDKError} If not connected to the network
|
|
40
|
+
* @throws {ValidationError} If roomId is empty or invalid
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* await roomManager.unsubscribeFromRoom('general');
|
|
45
|
+
* console.log('Unsubscription request sent for general room');
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
unsubscribeFromRoom(roomId: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Updates the subscription state from server response.
|
|
51
|
+
* This is the authoritative source of which rooms you're subscribed to.
|
|
52
|
+
* Called internally when receiving subscribe/unsubscribe responses.
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
* @param subscriptions - Array of room IDs from server response
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* // Internal SDK usage
|
|
60
|
+
* roomManager.updateSubscriptions(['general', 'support', 'trading']);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
updateSubscriptions(subscriptions: string[]): void;
|
|
64
|
+
/**
|
|
65
|
+
* Gets all rooms currently subscribed to.
|
|
66
|
+
* Returns array of room IDs that you're actively listening to.
|
|
67
|
+
*
|
|
68
|
+
* @returns Array of subscribed room IDs
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const rooms = roomManager.getSubscribedRooms();
|
|
73
|
+
* console.log(`Subscribed to ${rooms.length} rooms:`, rooms);
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
getSubscribedRooms(): string[];
|
|
77
|
+
/**
|
|
78
|
+
* Gets a list of all available rooms.
|
|
79
|
+
* Returns rooms the user has access to based on authentication.
|
|
80
|
+
* Returns a read-only array with defensive copies to prevent external modification.
|
|
81
|
+
*
|
|
82
|
+
* @returns Read-only array of room copies
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const rooms = roomManager.getRooms();
|
|
87
|
+
* rooms.forEach(room => console.log(`${room.id}: ${room.name}`));
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
getRooms(): ReadonlyArray<Readonly<Room>>;
|
|
91
|
+
/**
|
|
92
|
+
* Gets a specific room by its ID.
|
|
93
|
+
* Returns a defensive copy to prevent external modification of room state.
|
|
94
|
+
* Returns undefined if room doesn't exist or user doesn't have access.
|
|
95
|
+
*
|
|
96
|
+
* @param roomId - The ID of the room to retrieve
|
|
97
|
+
* @returns Copy of the room object if found, undefined otherwise
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const room = roomManager.getRoom('general');
|
|
102
|
+
* if (room) {
|
|
103
|
+
* console.log(`Room: ${room.name}`);
|
|
104
|
+
* console.log(`Members: ${room.members?.length ?? 0}`);
|
|
105
|
+
* }
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
getRoom(roomId: string): Readonly<Room> | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* Fetches the list of rooms from the server.
|
|
111
|
+
* Sends list_rooms message and waits for response from server.
|
|
112
|
+
* Returns array of rooms the user owns or has access to.
|
|
113
|
+
*
|
|
114
|
+
* @returns Promise that resolves to array of room information
|
|
115
|
+
* @throws {SDKError} If not connected to the network
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const rooms = await roomManager.listRooms();
|
|
120
|
+
* rooms.forEach(room => {
|
|
121
|
+
* console.log(`${room.name} (${room.is_public ? 'public' : 'private'})`);
|
|
122
|
+
* console.log(`Owner: ${room.is_owner}`);
|
|
123
|
+
* });
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
listRooms(): Promise<RoomInfo[]>;
|
|
127
|
+
/**
|
|
128
|
+
* Updates the room list from authentication state.
|
|
129
|
+
* Called internally after successful authentication to populate accessible rooms.
|
|
130
|
+
*
|
|
131
|
+
* @internal This method is for internal SDK use
|
|
132
|
+
* @param rooms - Array of rooms to update in the manager
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* // Internal SDK usage after auth
|
|
137
|
+
* roomManager.updateRoomsFromAuth(authState.roomObjects);
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
updateRoomsFromAuth(rooms: Room[]): void;
|
|
141
|
+
/**
|
|
142
|
+
* Clears all rooms from the manager.
|
|
143
|
+
* Clears subscription state.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* roomManager.clear();
|
|
148
|
+
* console.log('All rooms cleared');
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
clear(): void;
|
|
152
|
+
/**
|
|
153
|
+
* Destroys the room manager and cleans up resources.
|
|
154
|
+
* Clears all rooms and removes all event listeners.
|
|
155
|
+
* After destruction, the manager cannot be reused.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* roomManager.destroy();
|
|
160
|
+
* console.log('Room manager destroyed');
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
destroy(): void;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=room-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-manager.d.ts","sourceRoot":"","sources":["../../src/managers/room-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAuD,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvG,OAAO,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAItD,qBAAa,WAAY,SAAQ,YAAY,CAAC,SAAS,CAAC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;gBAEzC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM;IAMrD;;;;;;;;;;;;;;;OAeG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D;;;;;;;;;;;;;;;OAeG;IACU,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;;;;;;;;;;;;OAaG;IACI,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IASzD;;;;;;;;;;;OAWG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAIrC;;;;;;;;;;;;OAYG;IACI,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAIhD;;;;;;;;;;;;;;;;OAgBG;IACI,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS;IAK1D;;;;;;;;;;;;;;;;OAgBG;IACU,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgB7C;;;;;;;;;;;;OAYG;IACI,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAQ/C;;;;;;;;;OASG;IACI,KAAK,IAAI,IAAI;IAKpB;;;;;;;;;;OAUG;IACI,OAAO,IAAI,IAAI;CAKvB"}
|