@egain/ai-agent-sdk 0.1.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/README.md +295 -0
- package/dist/browser.js +22739 -0
- package/dist/core/AiAgent.d.ts +1126 -0
- package/dist/core/AiAgent.d.ts.map +1 -0
- package/dist/core/AiAgent.js +2037 -0
- package/dist/core/AiAgent.js.map +1 -0
- package/dist/core/api/ApiHelper.d.ts +433 -0
- package/dist/core/api/ApiHelper.d.ts.map +1 -0
- package/dist/core/api/ApiHelper.js +689 -0
- package/dist/core/api/ApiHelper.js.map +1 -0
- package/dist/core/api/CacheAdapter.d.ts +295 -0
- package/dist/core/api/CacheAdapter.d.ts.map +1 -0
- package/dist/core/api/CacheAdapter.js +298 -0
- package/dist/core/api/CacheAdapter.js.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts +87 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.js +257 -0
- package/dist/core/auth/AnonymousAuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthProvider.d.ts +13 -0
- package/dist/core/auth/AuthProvider.d.ts.map +1 -0
- package/dist/core/auth/AuthProvider.js +2 -0
- package/dist/core/auth/AuthProvider.js.map +1 -0
- package/dist/core/auth/AuthStrategy.d.ts +74 -0
- package/dist/core/auth/AuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AuthStrategy.js +2 -0
- package/dist/core/auth/AuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthenticationService.d.ts +226 -0
- package/dist/core/auth/AuthenticationService.d.ts.map +1 -0
- package/dist/core/auth/AuthenticationService.js +344 -0
- package/dist/core/auth/AuthenticationService.js.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts +62 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js +78 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts +136 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.js +409 -0
- package/dist/core/auth/PKCEAuthStrategy.js.map +1 -0
- package/dist/core/auth/PreAuthStrategy.d.ts +101 -0
- package/dist/core/auth/PreAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PreAuthStrategy.js +216 -0
- package/dist/core/auth/PreAuthStrategy.js.map +1 -0
- package/dist/core/auth/msal-browser.js +19683 -0
- package/dist/core/auth/msal-loader.d.ts +14 -0
- package/dist/core/auth/msal-loader.d.ts.map +1 -0
- package/dist/core/auth/msal-loader.js +43 -0
- package/dist/core/auth/msal-loader.js.map +1 -0
- package/dist/core/connection/Connection.d.ts +168 -0
- package/dist/core/connection/Connection.d.ts.map +1 -0
- package/dist/core/connection/Connection.js +290 -0
- package/dist/core/connection/Connection.js.map +1 -0
- package/dist/core/connection/ConnectionState.d.ts +11 -0
- package/dist/core/connection/ConnectionState.d.ts.map +1 -0
- package/dist/core/connection/ConnectionState.js +12 -0
- package/dist/core/connection/ConnectionState.js.map +1 -0
- package/dist/core/connection/Transport.d.ts +98 -0
- package/dist/core/connection/Transport.d.ts.map +1 -0
- package/dist/core/connection/Transport.js +27 -0
- package/dist/core/connection/Transport.js.map +1 -0
- package/dist/core/connection/WebSocketTransport.d.ts +65 -0
- package/dist/core/connection/WebSocketTransport.d.ts.map +1 -0
- package/dist/core/connection/WebSocketTransport.js +177 -0
- package/dist/core/connection/WebSocketTransport.js.map +1 -0
- package/dist/core/errors/SDKError.d.ts +27 -0
- package/dist/core/errors/SDKError.d.ts.map +1 -0
- package/dist/core/errors/SDKError.js +43 -0
- package/dist/core/errors/SDKError.js.map +1 -0
- package/dist/core/events/EventEmitter.d.ts +120 -0
- package/dist/core/events/EventEmitter.d.ts.map +1 -0
- package/dist/core/events/EventEmitter.js +183 -0
- package/dist/core/events/EventEmitter.js.map +1 -0
- package/dist/core/logging/LogLevel.d.ts +33 -0
- package/dist/core/logging/LogLevel.d.ts.map +1 -0
- package/dist/core/logging/LogLevel.js +40 -0
- package/dist/core/logging/LogLevel.js.map +1 -0
- package/dist/core/logging/Logger.d.ts +120 -0
- package/dist/core/logging/Logger.d.ts.map +1 -0
- package/dist/core/logging/Logger.js +204 -0
- package/dist/core/logging/Logger.js.map +1 -0
- package/dist/core/logging/globalLogger.d.ts +8 -0
- package/dist/core/logging/globalLogger.d.ts.map +1 -0
- package/dist/core/logging/globalLogger.js +12 -0
- package/dist/core/logging/globalLogger.js.map +1 -0
- package/dist/core/logging/types.d.ts +45 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +2 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/message/BaseMessageHandler.d.ts +208 -0
- package/dist/core/message/BaseMessageHandler.d.ts.map +1 -0
- package/dist/core/message/BaseMessageHandler.js +155 -0
- package/dist/core/message/BaseMessageHandler.js.map +1 -0
- package/dist/core/message/Message.d.ts +69 -0
- package/dist/core/message/Message.d.ts.map +1 -0
- package/dist/core/message/Message.js +131 -0
- package/dist/core/message/Message.js.map +1 -0
- package/dist/core/message/MessageProcessor.d.ts +51 -0
- package/dist/core/message/MessageProcessor.d.ts.map +1 -0
- package/dist/core/message/MessageProcessor.js +123 -0
- package/dist/core/message/MessageProcessor.js.map +1 -0
- package/dist/core/message/MessageTypes.d.ts +123 -0
- package/dist/core/message/MessageTypes.d.ts.map +1 -0
- package/dist/core/message/MessageTypes.js +106 -0
- package/dist/core/message/MessageTypes.js.map +1 -0
- package/dist/core/message/Transcript.d.ts +373 -0
- package/dist/core/message/Transcript.d.ts.map +1 -0
- package/dist/core/message/Transcript.js +355 -0
- package/dist/core/message/Transcript.js.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts +26 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.js +130 -0
- package/dist/core/message/handlers/AgentMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts +12 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js +49 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts +12 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js +49 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts +12 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.js +46 -0
- package/dist/core/message/handlers/HeartbeatHandler.js.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts +30 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js +84 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js.map +1 -0
- package/dist/core/message/types.d.ts +107 -0
- package/dist/core/message/types.d.ts.map +1 -0
- package/dist/core/message/types.js +30 -0
- package/dist/core/message/types.js.map +1 -0
- package/dist/core/platform/HookContract.d.ts +112 -0
- package/dist/core/platform/HookContract.d.ts.map +1 -0
- package/dist/core/platform/HookContract.js +13 -0
- package/dist/core/platform/HookContract.js.map +1 -0
- package/dist/core/platform/PlatformComponentService.d.ts +40 -0
- package/dist/core/platform/PlatformComponentService.d.ts.map +1 -0
- package/dist/core/platform/PlatformComponentService.js +12 -0
- package/dist/core/platform/PlatformComponentService.js.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts +41 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.js +110 -0
- package/dist/core/platform/PlatformScriptLoader.js.map +1 -0
- package/dist/core/polyfills.d.ts +16 -0
- package/dist/core/polyfills.d.ts.map +1 -0
- package/dist/core/polyfills.js +168 -0
- package/dist/core/polyfills.js.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts +234 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.js +636 -0
- package/dist/core/portal-initializer/PortalInitializer.js.map +1 -0
- package/dist/core/queue/MessageQueue.d.ts +277 -0
- package/dist/core/queue/MessageQueue.d.ts.map +1 -0
- package/dist/core/queue/MessageQueue.js +291 -0
- package/dist/core/queue/MessageQueue.js.map +1 -0
- package/dist/core/types/PortalTypes.d.ts +51 -0
- package/dist/core/types/PortalTypes.d.ts.map +1 -0
- package/dist/core/types/PortalTypes.js +8 -0
- package/dist/core/types/PortalTypes.js.map +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventEmitter } from '../events/EventEmitter.js';
|
|
2
|
+
import { globalLogger } from '../logging/globalLogger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for transport implementations.
|
|
5
|
+
*
|
|
6
|
+
* Any transport mechanism (WebSocket, SSE, HTTP polling, etc.) should extend
|
|
7
|
+
* this class and implement the abstract methods.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* class MyCustomTransport extends Transport {
|
|
12
|
+
* async connect(): Promise<void> { ... }
|
|
13
|
+
* disconnect(): void { ... }
|
|
14
|
+
* async send(data: any): Promise<void> { ... }
|
|
15
|
+
* isConnected(): boolean { ... }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export class Transport extends EventEmitter {
|
|
20
|
+
constructor(config) {
|
|
21
|
+
super();
|
|
22
|
+
this.endpoint = config.endpoint;
|
|
23
|
+
this.connectionTimeout = config.connectionTimeout ?? 10000;
|
|
24
|
+
this.logger = config.logger ?? globalLogger;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=Transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../../src/core/connection/Transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiD1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAgB,SAAU,SAAQ,YAA6B;IAKnE,YAAY,MAAuB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC;IAC9C,CAAC;CA2BF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Transport, TransportConfig } from './Transport.js';
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket transport configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface WebSocketTransportConfig extends TransportConfig {
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket protocols (optional)
|
|
8
|
+
*/
|
|
9
|
+
protocols?: string | string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket-based transport implementation.
|
|
13
|
+
*
|
|
14
|
+
* This transport uses the native WebSocket API to establish
|
|
15
|
+
* bidirectional communication with the server.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const transport = new WebSocketTransport({
|
|
20
|
+
* endpoint: 'wss://api.example.com/ws'
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* transport.on('message', ({ data }) => {
|
|
24
|
+
* console.log('Received:', data);
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* await transport.connect();
|
|
28
|
+
* await transport.send({ text: 'Hello' });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class WebSocketTransport extends Transport {
|
|
32
|
+
private ws;
|
|
33
|
+
private connectTimeoutTimer;
|
|
34
|
+
private protocols?;
|
|
35
|
+
constructor(config: WebSocketTransportConfig);
|
|
36
|
+
/**
|
|
37
|
+
* Get the transport type identifier
|
|
38
|
+
*/
|
|
39
|
+
getType(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Check if the WebSocket is currently connected
|
|
42
|
+
*/
|
|
43
|
+
isConnected(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Establish the WebSocket connection
|
|
46
|
+
*/
|
|
47
|
+
connect(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Close the WebSocket connection
|
|
50
|
+
*/
|
|
51
|
+
disconnect(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Send data through the WebSocket
|
|
54
|
+
*/
|
|
55
|
+
send(data: any): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Handle incoming WebSocket message
|
|
58
|
+
*/
|
|
59
|
+
private handleMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Clear connection timeout timer
|
|
62
|
+
*/
|
|
63
|
+
private clearConnectTimeout;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=WebSocketTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../../src/core/connection/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG5D;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,SAAS,CAAC,CAAoB;gBAE1B,MAAM,EAAE,wBAAwB;IAK5C;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyE9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { Transport } from './Transport.js';
|
|
2
|
+
import { ConnectionError } from '../errors/SDKError.js';
|
|
3
|
+
/**
|
|
4
|
+
* WebSocket-based transport implementation.
|
|
5
|
+
*
|
|
6
|
+
* This transport uses the native WebSocket API to establish
|
|
7
|
+
* bidirectional communication with the server.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const transport = new WebSocketTransport({
|
|
12
|
+
* endpoint: 'wss://api.example.com/ws'
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* transport.on('message', ({ data }) => {
|
|
16
|
+
* console.log('Received:', data);
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* await transport.connect();
|
|
20
|
+
* await transport.send({ text: 'Hello' });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class WebSocketTransport extends Transport {
|
|
24
|
+
constructor(config) {
|
|
25
|
+
super(config);
|
|
26
|
+
this.ws = null;
|
|
27
|
+
this.connectTimeoutTimer = null;
|
|
28
|
+
this.protocols = config.protocols;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the transport type identifier
|
|
32
|
+
*/
|
|
33
|
+
getType() {
|
|
34
|
+
return 'websocket';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if the WebSocket is currently connected
|
|
38
|
+
*/
|
|
39
|
+
isConnected() {
|
|
40
|
+
return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Establish the WebSocket connection
|
|
44
|
+
*/
|
|
45
|
+
async connect() {
|
|
46
|
+
if (this.isConnected()) {
|
|
47
|
+
this.logger.debug('WebSocket already connected', { endpoint: this.endpoint });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.logger.debug('Connecting WebSocket', { endpoint: this.endpoint, protocols: this.protocols });
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
try {
|
|
53
|
+
// Create WebSocket connection
|
|
54
|
+
this.ws = new WebSocket(this.endpoint, this.protocols);
|
|
55
|
+
// Set connection timeout
|
|
56
|
+
this.connectTimeoutTimer = setTimeout(() => {
|
|
57
|
+
if (this.ws && this.ws.readyState !== WebSocket.OPEN) {
|
|
58
|
+
this.ws.close();
|
|
59
|
+
const error = new ConnectionError('Connection timeout');
|
|
60
|
+
this.logger.error('WebSocket connection timeout', error, { endpoint: this.endpoint });
|
|
61
|
+
this.emit('error', { error, timestamp: Date.now() });
|
|
62
|
+
reject(error);
|
|
63
|
+
}
|
|
64
|
+
}, this.connectionTimeout);
|
|
65
|
+
// Handle successful connection
|
|
66
|
+
this.ws.onopen = () => {
|
|
67
|
+
this.clearConnectTimeout();
|
|
68
|
+
this.logger.info('WebSocket connected', { endpoint: this.endpoint });
|
|
69
|
+
this.emit('connected', { timestamp: Date.now() });
|
|
70
|
+
resolve();
|
|
71
|
+
};
|
|
72
|
+
// Handle incoming messages
|
|
73
|
+
this.ws.onmessage = (event) => {
|
|
74
|
+
this.handleMessage(event);
|
|
75
|
+
};
|
|
76
|
+
// Handle errors
|
|
77
|
+
this.ws.onerror = (event) => {
|
|
78
|
+
const error = new ConnectionError('WebSocket error');
|
|
79
|
+
this.logger.error('WebSocket error', error, { endpoint: this.endpoint });
|
|
80
|
+
this.emit('error', { error, timestamp: Date.now() });
|
|
81
|
+
};
|
|
82
|
+
// Handle connection close
|
|
83
|
+
this.ws.onclose = (event) => {
|
|
84
|
+
this.clearConnectTimeout();
|
|
85
|
+
this.ws = null;
|
|
86
|
+
this.logger.info('WebSocket closed', {
|
|
87
|
+
endpoint: this.endpoint,
|
|
88
|
+
code: event.code,
|
|
89
|
+
reason: event.reason
|
|
90
|
+
});
|
|
91
|
+
this.emit('closed', {
|
|
92
|
+
code: event.code,
|
|
93
|
+
reason: event.reason,
|
|
94
|
+
timestamp: Date.now(),
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.clearConnectTimeout();
|
|
100
|
+
const connError = new ConnectionError('Failed to establish WebSocket connection', error instanceof Error ? error : new Error(String(error)));
|
|
101
|
+
this.logger.error('Failed to establish WebSocket connection', connError, { endpoint: this.endpoint });
|
|
102
|
+
this.emit('error', { error: connError, timestamp: Date.now() });
|
|
103
|
+
reject(connError);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Close the WebSocket connection
|
|
109
|
+
*/
|
|
110
|
+
disconnect() {
|
|
111
|
+
this.clearConnectTimeout();
|
|
112
|
+
if (this.ws) {
|
|
113
|
+
this.logger.debug('Disconnecting WebSocket', { endpoint: this.endpoint });
|
|
114
|
+
this.ws.close(1000, 'Client disconnect');
|
|
115
|
+
this.ws = null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Send data through the WebSocket
|
|
120
|
+
*/
|
|
121
|
+
async send(data) {
|
|
122
|
+
if (!this.isConnected() || !this.ws) {
|
|
123
|
+
const error = new ConnectionError('Cannot send message: not connected');
|
|
124
|
+
this.logger.warn('Cannot send message: WebSocket not connected', { endpoint: this.endpoint });
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const message = typeof data === 'string' ? data : JSON.stringify(data);
|
|
129
|
+
this.logger.debug('Sending WebSocket message', { endpoint: this.endpoint, messageLength: message.length });
|
|
130
|
+
this.ws.send(message);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const connError = new ConnectionError('Failed to send message', error instanceof Error ? error : new Error(String(error)));
|
|
134
|
+
this.logger.error('Failed to send WebSocket message', connError, { endpoint: this.endpoint });
|
|
135
|
+
throw connError;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Handle incoming WebSocket message
|
|
140
|
+
*/
|
|
141
|
+
handleMessage(event) {
|
|
142
|
+
try {
|
|
143
|
+
let data;
|
|
144
|
+
if (typeof event.data === 'string') {
|
|
145
|
+
try {
|
|
146
|
+
data = JSON.parse(event.data);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
data = event.data;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
data = event.data;
|
|
154
|
+
}
|
|
155
|
+
this.logger.debug('WebSocket message received', { endpoint: this.endpoint, dataType: typeof data });
|
|
156
|
+
this.emit('message', { data, timestamp: Date.now() });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
160
|
+
this.logger.error('Failed to handle WebSocket message', err, { endpoint: this.endpoint });
|
|
161
|
+
this.emit('error', {
|
|
162
|
+
error: err,
|
|
163
|
+
timestamp: Date.now(),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Clear connection timeout timer
|
|
169
|
+
*/
|
|
170
|
+
clearConnectTimeout() {
|
|
171
|
+
if (this.connectTimeoutTimer) {
|
|
172
|
+
clearTimeout(this.connectTimeoutTimer);
|
|
173
|
+
this.connectTimeoutTimer = null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=WebSocketTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.js","sourceRoot":"","sources":["../../../src/core/connection/WebSocketTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all SDK errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class SDKError extends Error {
|
|
5
|
+
readonly code?: string | undefined;
|
|
6
|
+
readonly cause?: Error | undefined;
|
|
7
|
+
constructor(message: string, code?: string | undefined, cause?: Error | undefined);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Authentication-related errors
|
|
11
|
+
*/
|
|
12
|
+
export declare class AuthError extends SDKError {
|
|
13
|
+
constructor(message: string, cause?: Error);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Connection-related errors
|
|
17
|
+
*/
|
|
18
|
+
export declare class ConnectionError extends SDKError {
|
|
19
|
+
constructor(message: string, cause?: Error);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Message-related errors
|
|
23
|
+
*/
|
|
24
|
+
export declare class MessageError extends SDKError {
|
|
25
|
+
constructor(message: string, cause?: Error);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SDKError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SDKError.d.ts","sourceRoot":"","sources":["../../../src/core/errors/SDKError.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,CAAC;aACL,KAAK,CAAC;gBAFtB,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,oBAAQ,EACb,KAAK,CAAC,mBAAO;CAMhC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,QAAQ;gBACzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAK3C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAK3C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAK3C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all SDK errors
|
|
3
|
+
*/
|
|
4
|
+
export class SDKError extends Error {
|
|
5
|
+
constructor(message, code, cause) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.cause = cause;
|
|
9
|
+
this.name = 'SDKError';
|
|
10
|
+
Object.setPrototypeOf(this, SDKError.prototype);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Authentication-related errors
|
|
15
|
+
*/
|
|
16
|
+
export class AuthError extends SDKError {
|
|
17
|
+
constructor(message, cause) {
|
|
18
|
+
super(message, 'AUTH_ERROR', cause);
|
|
19
|
+
this.name = 'AuthError';
|
|
20
|
+
Object.setPrototypeOf(this, AuthError.prototype);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Connection-related errors
|
|
25
|
+
*/
|
|
26
|
+
export class ConnectionError extends SDKError {
|
|
27
|
+
constructor(message, cause) {
|
|
28
|
+
super(message, 'CONNECTION_ERROR', cause);
|
|
29
|
+
this.name = 'ConnectionError';
|
|
30
|
+
Object.setPrototypeOf(this, ConnectionError.prototype);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Message-related errors
|
|
35
|
+
*/
|
|
36
|
+
export class MessageError extends SDKError {
|
|
37
|
+
constructor(message, cause) {
|
|
38
|
+
super(message, 'MESSAGE_ERROR', cause);
|
|
39
|
+
this.name = 'MessageError';
|
|
40
|
+
Object.setPrototypeOf(this, MessageError.prototype);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=SDKError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SDKError.js","sourceRoot":"","sources":["../../../src/core/errors/SDKError.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YACE,OAAe,EACC,IAAa,EACb,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler function for events.
|
|
3
|
+
* Can be synchronous or return a Promise for async handling.
|
|
4
|
+
* @typeParam T - The event data type
|
|
5
|
+
*/
|
|
6
|
+
type EventHandler<T = any> = (data: T) => void | Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Map of event names to their data types.
|
|
9
|
+
*/
|
|
10
|
+
type EventMap = Record<string, any>;
|
|
11
|
+
/**
|
|
12
|
+
* Type-safe event emitter implementation.
|
|
13
|
+
*
|
|
14
|
+
* Compatible with both browser and Node.js environments.
|
|
15
|
+
* Provides a foundation for event-driven communication throughout the SDK.
|
|
16
|
+
*
|
|
17
|
+
* @typeParam T - Event map defining event names and their data types
|
|
18
|
+
*
|
|
19
|
+
* @example Creating a custom event emitter
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { EventEmitter } from "@eGain/ai-agent-sdk";
|
|
22
|
+
*
|
|
23
|
+
* interface MyEvents {
|
|
24
|
+
* data: { value: number };
|
|
25
|
+
* error: { message: string };
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* class MyService extends EventEmitter<MyEvents> {
|
|
29
|
+
* doSomething() {
|
|
30
|
+
* this.emit("data", { value: 42 });
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* const service = new MyService();
|
|
35
|
+
* service.on("data", (event) => {
|
|
36
|
+
* console.log(event.value); // Typed as number
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @category Events
|
|
41
|
+
*/
|
|
42
|
+
export declare class EventEmitter<T extends EventMap = EventMap> {
|
|
43
|
+
private handlers;
|
|
44
|
+
private onceHandlers;
|
|
45
|
+
/**
|
|
46
|
+
* Register an event handler.
|
|
47
|
+
*
|
|
48
|
+
* The handler will be called every time the event is emitted.
|
|
49
|
+
*
|
|
50
|
+
* @param event - The event name to listen for
|
|
51
|
+
* @param handler - The function to call when the event is emitted
|
|
52
|
+
* @returns `this` for method chaining
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* agent.on("message", (event) => {
|
|
57
|
+
* console.log("Received:", event.payload);
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
on<K extends keyof T>(event: K, handler: EventHandler<T[K]>): this;
|
|
62
|
+
/**
|
|
63
|
+
* Register a one-time event handler.
|
|
64
|
+
*
|
|
65
|
+
* The handler will be called only once, then automatically removed.
|
|
66
|
+
*
|
|
67
|
+
* @param event - The event name to listen for
|
|
68
|
+
* @param handler - The function to call when the event is emitted
|
|
69
|
+
* @returns `this` for method chaining
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* agent.once("connected", () => {
|
|
74
|
+
* console.log("First connection established!");
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
once<K extends keyof T>(event: K, handler: EventHandler<T[K]>): this;
|
|
79
|
+
/**
|
|
80
|
+
* Remove an event handler.
|
|
81
|
+
*
|
|
82
|
+
* If no handler is specified, removes all handlers for the event.
|
|
83
|
+
*
|
|
84
|
+
* @param event - The event name
|
|
85
|
+
* @param handler - The specific handler to remove (optional)
|
|
86
|
+
* @returns `this` for method chaining
|
|
87
|
+
*
|
|
88
|
+
* @example Remove specific handler
|
|
89
|
+
* ```typescript
|
|
90
|
+
* const handler = (event) => console.log(event);
|
|
91
|
+
* agent.on("message", handler);
|
|
92
|
+
* agent.off("message", handler);
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @example Remove all handlers
|
|
96
|
+
* ```typescript
|
|
97
|
+
* agent.off("message");
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
off<K extends keyof T>(event: K, handler?: EventHandler<T[K]>): this;
|
|
101
|
+
/**
|
|
102
|
+
* Emit an event
|
|
103
|
+
* Handlers are protected from exceptions - errors are caught and logged
|
|
104
|
+
*/
|
|
105
|
+
protected emit<K extends keyof T>(event: K, data: T[K]): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Safely execute a handler, catching any exceptions
|
|
108
|
+
*/
|
|
109
|
+
private safeEmit;
|
|
110
|
+
/**
|
|
111
|
+
* Remove all event handlers
|
|
112
|
+
*/
|
|
113
|
+
removeAllListeners<K extends keyof T>(event?: K): this;
|
|
114
|
+
/**
|
|
115
|
+
* Get the number of listeners for an event
|
|
116
|
+
*/
|
|
117
|
+
listenerCount<K extends keyof T>(event: K): number;
|
|
118
|
+
}
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=EventEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../../src/core/events/EventEmitter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,KAAK,YAAY,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/D;;GAEG;AACH,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACrD,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,YAAY,CAA8C;IAElE;;;;;;;;;;;;;;;OAeG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAQlE;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAQpE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAYpE;;;OAGG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAyBhE;;OAEG;IACH,OAAO,CAAC,QAAQ;IAgBhB;;OAEG;IACH,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAWtD;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;CAKnD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe event emitter implementation.
|
|
3
|
+
*
|
|
4
|
+
* Compatible with both browser and Node.js environments.
|
|
5
|
+
* Provides a foundation for event-driven communication throughout the SDK.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam T - Event map defining event names and their data types
|
|
8
|
+
*
|
|
9
|
+
* @example Creating a custom event emitter
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { EventEmitter } from "@eGain/ai-agent-sdk";
|
|
12
|
+
*
|
|
13
|
+
* interface MyEvents {
|
|
14
|
+
* data: { value: number };
|
|
15
|
+
* error: { message: string };
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* class MyService extends EventEmitter<MyEvents> {
|
|
19
|
+
* doSomething() {
|
|
20
|
+
* this.emit("data", { value: 42 });
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* const service = new MyService();
|
|
25
|
+
* service.on("data", (event) => {
|
|
26
|
+
* console.log(event.value); // Typed as number
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category Events
|
|
31
|
+
*/
|
|
32
|
+
export class EventEmitter {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.handlers = new Map();
|
|
35
|
+
this.onceHandlers = new Map();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Register an event handler.
|
|
39
|
+
*
|
|
40
|
+
* The handler will be called every time the event is emitted.
|
|
41
|
+
*
|
|
42
|
+
* @param event - The event name to listen for
|
|
43
|
+
* @param handler - The function to call when the event is emitted
|
|
44
|
+
* @returns `this` for method chaining
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* agent.on("message", (event) => {
|
|
49
|
+
* console.log("Received:", event.payload);
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
on(event, handler) {
|
|
54
|
+
if (!this.handlers.has(event)) {
|
|
55
|
+
this.handlers.set(event, new Set());
|
|
56
|
+
}
|
|
57
|
+
this.handlers.get(event).add(handler);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register a one-time event handler.
|
|
62
|
+
*
|
|
63
|
+
* The handler will be called only once, then automatically removed.
|
|
64
|
+
*
|
|
65
|
+
* @param event - The event name to listen for
|
|
66
|
+
* @param handler - The function to call when the event is emitted
|
|
67
|
+
* @returns `this` for method chaining
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* agent.once("connected", () => {
|
|
72
|
+
* console.log("First connection established!");
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
once(event, handler) {
|
|
77
|
+
if (!this.onceHandlers.has(event)) {
|
|
78
|
+
this.onceHandlers.set(event, new Set());
|
|
79
|
+
}
|
|
80
|
+
this.onceHandlers.get(event).add(handler);
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Remove an event handler.
|
|
85
|
+
*
|
|
86
|
+
* If no handler is specified, removes all handlers for the event.
|
|
87
|
+
*
|
|
88
|
+
* @param event - The event name
|
|
89
|
+
* @param handler - The specific handler to remove (optional)
|
|
90
|
+
* @returns `this` for method chaining
|
|
91
|
+
*
|
|
92
|
+
* @example Remove specific handler
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const handler = (event) => console.log(event);
|
|
95
|
+
* agent.on("message", handler);
|
|
96
|
+
* agent.off("message", handler);
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* @example Remove all handlers
|
|
100
|
+
* ```typescript
|
|
101
|
+
* agent.off("message");
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
off(event, handler) {
|
|
105
|
+
if (handler) {
|
|
106
|
+
this.handlers.get(event)?.delete(handler);
|
|
107
|
+
this.onceHandlers.get(event)?.delete(handler);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Remove all handlers for this event
|
|
111
|
+
this.handlers.delete(event);
|
|
112
|
+
this.onceHandlers.delete(event);
|
|
113
|
+
}
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Emit an event
|
|
118
|
+
* Handlers are protected from exceptions - errors are caught and logged
|
|
119
|
+
*/
|
|
120
|
+
emit(event, data) {
|
|
121
|
+
let hasHandlers = false;
|
|
122
|
+
// Execute regular handlers
|
|
123
|
+
const regularHandlers = this.handlers.get(event);
|
|
124
|
+
if (regularHandlers) {
|
|
125
|
+
hasHandlers = true;
|
|
126
|
+
for (const handler of regularHandlers) {
|
|
127
|
+
this.safeEmit(handler, data);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Execute once handlers and remove them
|
|
131
|
+
const onceHandlers = this.onceHandlers.get(event);
|
|
132
|
+
if (onceHandlers) {
|
|
133
|
+
hasHandlers = true;
|
|
134
|
+
for (const handler of onceHandlers) {
|
|
135
|
+
this.safeEmit(handler, data);
|
|
136
|
+
}
|
|
137
|
+
onceHandlers.clear();
|
|
138
|
+
}
|
|
139
|
+
return hasHandlers;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Safely execute a handler, catching any exceptions
|
|
143
|
+
*/
|
|
144
|
+
safeEmit(handler, data) {
|
|
145
|
+
try {
|
|
146
|
+
const result = handler(data);
|
|
147
|
+
// Handle async handlers
|
|
148
|
+
if (result instanceof Promise) {
|
|
149
|
+
result.catch((error) => {
|
|
150
|
+
// Silently catch async errors to prevent SDK crashes
|
|
151
|
+
// In production, this could be logged to an error reporting service
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
// Silently catch sync errors to prevent SDK crashes
|
|
157
|
+
// In production, this could be logged to an error reporting service
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Remove all event handlers
|
|
162
|
+
*/
|
|
163
|
+
removeAllListeners(event) {
|
|
164
|
+
if (event) {
|
|
165
|
+
this.handlers.delete(event);
|
|
166
|
+
this.onceHandlers.delete(event);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.handlers.clear();
|
|
170
|
+
this.onceHandlers.clear();
|
|
171
|
+
}
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get the number of listeners for an event
|
|
176
|
+
*/
|
|
177
|
+
listenerCount(event) {
|
|
178
|
+
const regular = this.handlers.get(event)?.size ?? 0;
|
|
179
|
+
const once = this.onceHandlers.get(event)?.size ?? 0;
|
|
180
|
+
return regular + once;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=EventEmitter.js.map
|