@calimero-network/mero-js 1.0.2 → 2.0.0-beta.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 +341 -319
- package/dist/api/admin/aliases.d.ts +54 -0
- package/dist/api/admin/aliases.d.ts.map +1 -0
- package/dist/api/admin/aliases.js +43 -0
- package/dist/api/admin/aliases.js.map +1 -0
- package/dist/api/admin/applications.d.ts +52 -0
- package/dist/api/admin/applications.d.ts.map +1 -0
- package/dist/api/admin/applications.js +31 -0
- package/dist/api/admin/applications.js.map +1 -0
- package/dist/api/admin/blobs.d.ts +24 -0
- package/dist/api/admin/blobs.d.ts.map +1 -0
- package/dist/api/admin/blobs.js +58 -0
- package/dist/api/admin/blobs.js.map +1 -0
- package/dist/api/admin/capabilities.d.ts +26 -0
- package/dist/api/admin/capabilities.d.ts.map +1 -0
- package/dist/api/admin/capabilities.js +13 -0
- package/dist/api/admin/capabilities.js.map +1 -0
- package/dist/api/admin/client.d.ts +63 -0
- package/dist/api/admin/client.d.ts.map +1 -0
- package/dist/api/admin/client.js +103 -0
- package/dist/api/admin/client.js.map +1 -0
- package/dist/api/admin/contexts.d.ts +110 -0
- package/dist/api/admin/contexts.d.ts.map +1 -0
- package/dist/api/admin/contexts.js +61 -0
- package/dist/api/admin/contexts.js.map +1 -0
- package/dist/api/admin/factory.d.ts +4 -0
- package/dist/api/admin/factory.d.ts.map +1 -0
- package/dist/api/admin/factory.js +5 -0
- package/dist/api/admin/factory.js.map +1 -0
- package/dist/api/admin/identity.d.ts +10 -0
- package/dist/api/admin/identity.d.ts.map +1 -0
- package/dist/api/admin/identity.js +10 -0
- package/dist/api/admin/identity.js.map +1 -0
- package/dist/api/admin/index.d.ts +23 -0
- package/dist/api/admin/index.d.ts.map +1 -0
- package/dist/api/admin/index.js +26 -0
- package/dist/api/admin/index.js.map +1 -0
- package/dist/api/admin/network.d.ts +10 -0
- package/dist/api/admin/network.d.ts.map +1 -0
- package/dist/api/admin/network.js +9 -0
- package/dist/api/admin/network.js.map +1 -0
- package/dist/api/admin/proposals.d.ts +49 -0
- package/dist/api/admin/proposals.d.ts.map +1 -0
- package/dist/api/admin/proposals.js +34 -0
- package/dist/api/admin/proposals.js.map +1 -0
- package/dist/api/admin/public.d.ts +15 -0
- package/dist/api/admin/public.d.ts.map +1 -0
- package/dist/api/admin/public.js +18 -0
- package/dist/api/admin/public.js.map +1 -0
- package/dist/api/admin/tee.d.ts +74 -0
- package/dist/api/admin/tee.d.ts.map +1 -0
- package/dist/api/admin/tee.js +16 -0
- package/dist/api/admin/tee.js.map +1 -0
- package/dist/api/auth/client.d.ts +55 -0
- package/dist/api/auth/client.d.ts.map +1 -0
- package/dist/api/auth/client.js +127 -0
- package/dist/api/auth/client.js.map +1 -0
- package/dist/api/auth/factory.d.ts +4 -0
- package/dist/api/auth/factory.d.ts.map +1 -0
- package/dist/api/auth/factory.js +5 -0
- package/dist/api/auth/factory.js.map +1 -0
- package/dist/api/auth/index.d.ts +4 -0
- package/dist/api/auth/index.d.ts.map +1 -0
- package/dist/api/auth/index.js +4 -0
- package/dist/api/auth/index.js.map +1 -0
- package/dist/api/auth/types.d.ts +94 -0
- package/dist/api/auth/types.d.ts.map +1 -0
- package/dist/api/auth/types.js +4 -0
- package/dist/api/auth/types.js.map +1 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +18 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/rpc/client.d.ts +76 -0
- package/dist/api/rpc/client.d.ts.map +1 -0
- package/dist/api/rpc/client.js +126 -0
- package/dist/api/rpc/client.js.map +1 -0
- package/dist/api/rpc/index.d.ts +3 -0
- package/dist/api/rpc/index.d.ts.map +1 -0
- package/dist/api/rpc/index.js +2 -0
- package/dist/api/rpc/index.js.map +1 -0
- package/dist/api/rpc/types.d.ts +74 -0
- package/dist/api/rpc/types.d.ts.map +1 -0
- package/dist/api/rpc/types.js +6 -0
- package/dist/api/rpc/types.js.map +1 -0
- package/dist/api/sse/client.d.ts +76 -0
- package/dist/api/sse/client.d.ts.map +1 -0
- package/dist/api/sse/client.js +203 -0
- package/dist/api/sse/client.js.map +1 -0
- package/dist/api/sse/index.d.ts +4 -0
- package/dist/api/sse/index.d.ts.map +1 -0
- package/dist/api/sse/index.js +2 -0
- package/dist/api/sse/index.js.map +1 -0
- package/dist/api/sse/types.d.ts +35 -0
- package/dist/api/sse/types.d.ts.map +1 -0
- package/dist/api/sse/types.js +6 -0
- package/dist/api/sse/types.js.map +1 -0
- package/dist/api/utils.d.ts +68 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/api/utils.js +83 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/ws/client.d.ts +72 -0
- package/dist/api/ws/client.d.ts.map +1 -0
- package/dist/api/ws/client.js +202 -0
- package/dist/api/ws/client.js.map +1 -0
- package/dist/api/ws/index.d.ts +4 -0
- package/dist/api/ws/index.d.ts.map +1 -0
- package/dist/api/ws/index.js +2 -0
- package/dist/api/ws/index.js.map +1 -0
- package/dist/api/ws/types.d.ts +32 -0
- package/dist/api/ws/types.d.ts.map +1 -0
- package/dist/api/ws/types.js +6 -0
- package/dist/api/ws/types.js.map +1 -0
- package/dist/http-client/http-factory.d.ts +18 -0
- package/dist/http-client/http-factory.d.ts.map +1 -1
- package/dist/http-client/http-factory.js +2 -0
- package/dist/http-client/http-factory.js.map +1 -1
- package/dist/http-client/http-types.d.ts +6 -0
- package/dist/http-client/http-types.d.ts.map +1 -1
- package/dist/http-client/index.d.ts +1 -1
- package/dist/http-client/index.d.ts.map +1 -1
- package/dist/http-client/index.js +2 -1
- package/dist/http-client/index.js.map +1 -1
- package/dist/http-client/web-client.d.ts +5 -3
- package/dist/http-client/web-client.d.ts.map +1 -1
- package/dist/http-client/web-client.js +142 -59
- package/dist/http-client/web-client.js.map +1 -1
- package/dist/index.browser.mjs +1 -1
- package/dist/index.browser.mjs.map +4 -4
- package/dist/index.cjs +1669 -341
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1675 -341
- package/dist/index.mjs.map +4 -4
- package/dist/mero-js.d.ts +198 -7
- package/dist/mero-js.d.ts.map +1 -1
- package/dist/mero-js.js +329 -38
- package/dist/mero-js.js.map +1 -1
- package/package.json +42 -7
- package/dist/admin-api/admin-client.d.ts +0 -38
- package/dist/admin-api/admin-client.d.ts.map +0 -1
- package/dist/admin-api/admin-client.js +0 -104
- package/dist/admin-api/admin-client.js.map +0 -1
- package/dist/admin-api/admin-factory.d.ts +0 -8
- package/dist/admin-api/admin-factory.d.ts.map +0 -1
- package/dist/admin-api/admin-factory.js +0 -42
- package/dist/admin-api/admin-factory.js.map +0 -1
- package/dist/admin-api/admin-types.d.ts +0 -213
- package/dist/admin-api/admin-types.d.ts.map +0 -1
- package/dist/admin-api/admin-types.js +0 -3
- package/dist/admin-api/admin-types.js.map +0 -1
- package/dist/admin-api/index.d.ts +0 -4
- package/dist/admin-api/index.d.ts.map +0 -1
- package/dist/admin-api/index.js +0 -5
- package/dist/admin-api/index.js.map +0 -1
- package/dist/auth-api/auth-client.d.ts +0 -34
- package/dist/auth-api/auth-client.d.ts.map +0 -1
- package/dist/auth-api/auth-client.js +0 -112
- package/dist/auth-api/auth-client.js.map +0 -1
- package/dist/auth-api/auth-factory.d.ts +0 -8
- package/dist/auth-api/auth-factory.d.ts.map +0 -1
- package/dist/auth-api/auth-factory.js +0 -42
- package/dist/auth-api/auth-factory.js.map +0 -1
- package/dist/auth-api/auth-types.d.ts +0 -127
- package/dist/auth-api/auth-types.d.ts.map +0 -1
- package/dist/auth-api/auth-types.js +0 -3
- package/dist/auth-api/auth-types.js.map +0 -1
- package/dist/auth-api/index.d.ts +0 -4
- package/dist/auth-api/index.d.ts.map +0 -1
- package/dist/auth-api/index.js +0 -5
- package/dist/auth-api/index.js.map +0 -1
- package/dist/http-client/api-response.d.ts +0 -16
- package/dist/http-client/api-response.d.ts.map +0 -1
- package/dist/http-client/api-response.js +0 -2
- package/dist/http-client/api-response.js.map +0 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Client
|
|
3
|
+
*
|
|
4
|
+
* Server-Sent Events for real-time event streaming.
|
|
5
|
+
* Uses standard EventSource with manual subscription management.
|
|
6
|
+
*/
|
|
7
|
+
import type { HttpClient } from '../../http-client';
|
|
8
|
+
import type { SseSubscriptionResponse, SseSessionResponse, SseEventHandler, SseErrorHandler } from './types';
|
|
9
|
+
export interface SseClientOptions {
|
|
10
|
+
/** Base URL */
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
/** HTTP client for subscription requests */
|
|
13
|
+
httpClient: HttpClient;
|
|
14
|
+
/** Function to get current auth token */
|
|
15
|
+
getAuthToken?: () => Promise<string | null>;
|
|
16
|
+
/** Auto-reconnect on disconnect */
|
|
17
|
+
autoReconnect?: boolean;
|
|
18
|
+
/** Reconnect delay in ms */
|
|
19
|
+
reconnectDelay?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class SseClient {
|
|
22
|
+
private eventSource;
|
|
23
|
+
private options;
|
|
24
|
+
private sessionId;
|
|
25
|
+
private eventHandlers;
|
|
26
|
+
private errorHandlers;
|
|
27
|
+
private subscribedContexts;
|
|
28
|
+
private _lastEventId;
|
|
29
|
+
constructor(options: SseClientOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Connect to the SSE stream
|
|
32
|
+
*/
|
|
33
|
+
connect(): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Disconnect from the SSE stream
|
|
36
|
+
*/
|
|
37
|
+
disconnect(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to context events
|
|
40
|
+
*/
|
|
41
|
+
subscribe(contextIds: string[]): Promise<SseSubscriptionResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* Unsubscribe from context events
|
|
44
|
+
*/
|
|
45
|
+
unsubscribe(contextIds: string[]): Promise<SseSubscriptionResponse>;
|
|
46
|
+
/**
|
|
47
|
+
* Get session information
|
|
48
|
+
*/
|
|
49
|
+
getSession(): Promise<SseSessionResponse>;
|
|
50
|
+
/**
|
|
51
|
+
* Add event handler
|
|
52
|
+
*/
|
|
53
|
+
onEvent(handler: SseEventHandler): () => void;
|
|
54
|
+
/**
|
|
55
|
+
* Add error handler
|
|
56
|
+
*/
|
|
57
|
+
onError(handler: SseErrorHandler): () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Check if connected
|
|
60
|
+
*/
|
|
61
|
+
isConnected(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Get current session ID
|
|
64
|
+
*/
|
|
65
|
+
getSessionId(): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* Get subscribed context IDs
|
|
68
|
+
*/
|
|
69
|
+
getSubscribedContexts(): string[];
|
|
70
|
+
/**
|
|
71
|
+
* Get the last event ID (useful for resumable connections)
|
|
72
|
+
*/
|
|
73
|
+
getLastEventId(): string | null;
|
|
74
|
+
private handleDisconnect;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/sse/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAEV,uBAAuB,EACvB,kBAAkB,EAElB,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,gBAAgB;IAC/B,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,UAAU,EAAE,UAAU,CAAC;IACvB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4BAA4B;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,OAAO,CAAC,YAAY,CAAuB;gBAE/B,OAAO,EAAE,gBAAgB;IASrC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAoEhC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAuBvE;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAuBzE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAU/C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI;IAO7C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI;IAO7C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,OAAO,CAAC,gBAAgB;CAiBzB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Client
|
|
3
|
+
*
|
|
4
|
+
* Server-Sent Events for real-time event streaming.
|
|
5
|
+
* Uses standard EventSource with manual subscription management.
|
|
6
|
+
*/
|
|
7
|
+
export class SseClient {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.eventSource = null;
|
|
10
|
+
this.sessionId = null;
|
|
11
|
+
this.eventHandlers = [];
|
|
12
|
+
this.errorHandlers = [];
|
|
13
|
+
this.subscribedContexts = new Set();
|
|
14
|
+
// Track last event ID for reconnection (used for resumable streams)
|
|
15
|
+
this._lastEventId = null;
|
|
16
|
+
this.options = {
|
|
17
|
+
autoReconnect: true,
|
|
18
|
+
reconnectDelay: 1000,
|
|
19
|
+
getAuthToken: async () => null,
|
|
20
|
+
...options,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Connect to the SSE stream
|
|
25
|
+
*/
|
|
26
|
+
async connect() {
|
|
27
|
+
if (this.eventSource) {
|
|
28
|
+
throw new Error('Already connected');
|
|
29
|
+
}
|
|
30
|
+
const token = await this.options.getAuthToken();
|
|
31
|
+
let url = `${this.options.baseUrl}/sse`;
|
|
32
|
+
if (token) {
|
|
33
|
+
url += `?token=${encodeURIComponent(token)}`;
|
|
34
|
+
}
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
this.eventSource = new EventSource(url, {
|
|
37
|
+
withCredentials: true,
|
|
38
|
+
});
|
|
39
|
+
// Handle connect event (first event with session_id)
|
|
40
|
+
this.eventSource.addEventListener('connect', (event) => {
|
|
41
|
+
const messageEvent = event;
|
|
42
|
+
try {
|
|
43
|
+
// Session ID may be in data or as plain string
|
|
44
|
+
const data = messageEvent.data;
|
|
45
|
+
this.sessionId = typeof data === 'string' && data.startsWith('{')
|
|
46
|
+
? JSON.parse(data).session_id || JSON.parse(data).sessionId
|
|
47
|
+
: data;
|
|
48
|
+
resolve(this.sessionId);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
this.sessionId = messageEvent.data;
|
|
52
|
+
resolve(this.sessionId);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
this.eventSource.onmessage = (event) => {
|
|
56
|
+
this._lastEventId = event.lastEventId;
|
|
57
|
+
try {
|
|
58
|
+
const data = JSON.parse(event.data);
|
|
59
|
+
const sseEvent = {
|
|
60
|
+
id: event.lastEventId,
|
|
61
|
+
event: 'message',
|
|
62
|
+
data,
|
|
63
|
+
};
|
|
64
|
+
this.eventHandlers.forEach(h => h(sseEvent));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Non-JSON message
|
|
68
|
+
const sseEvent = {
|
|
69
|
+
id: event.lastEventId,
|
|
70
|
+
event: 'message',
|
|
71
|
+
data: event.data,
|
|
72
|
+
};
|
|
73
|
+
this.eventHandlers.forEach(h => h(sseEvent));
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
this.eventSource.onerror = (_event) => {
|
|
77
|
+
const error = new Error('SSE connection error');
|
|
78
|
+
this.errorHandlers.forEach(h => h(error));
|
|
79
|
+
if (this.eventSource?.readyState === EventSource.CLOSED) {
|
|
80
|
+
this.handleDisconnect();
|
|
81
|
+
if (!this.sessionId) {
|
|
82
|
+
reject(error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Disconnect from the SSE stream
|
|
90
|
+
*/
|
|
91
|
+
disconnect() {
|
|
92
|
+
this.options.autoReconnect = false;
|
|
93
|
+
this.eventSource?.close();
|
|
94
|
+
this.eventSource = null;
|
|
95
|
+
this.sessionId = null;
|
|
96
|
+
this.subscribedContexts.clear();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Subscribe to context events
|
|
100
|
+
*/
|
|
101
|
+
async subscribe(contextIds) {
|
|
102
|
+
if (!this.sessionId) {
|
|
103
|
+
throw new Error('Not connected');
|
|
104
|
+
}
|
|
105
|
+
const request = {
|
|
106
|
+
id: this.sessionId,
|
|
107
|
+
method: 'subscribe',
|
|
108
|
+
params: { contextIds },
|
|
109
|
+
};
|
|
110
|
+
const response = await this.options.httpClient.post('/sse/subscription', request);
|
|
111
|
+
if (!response.error) {
|
|
112
|
+
contextIds.forEach(id => this.subscribedContexts.add(id));
|
|
113
|
+
}
|
|
114
|
+
return response;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Unsubscribe from context events
|
|
118
|
+
*/
|
|
119
|
+
async unsubscribe(contextIds) {
|
|
120
|
+
if (!this.sessionId) {
|
|
121
|
+
throw new Error('Not connected');
|
|
122
|
+
}
|
|
123
|
+
const request = {
|
|
124
|
+
id: this.sessionId,
|
|
125
|
+
method: 'unsubscribe',
|
|
126
|
+
params: { contextIds },
|
|
127
|
+
};
|
|
128
|
+
const response = await this.options.httpClient.post('/sse/subscription', request);
|
|
129
|
+
if (!response.error) {
|
|
130
|
+
contextIds.forEach(id => this.subscribedContexts.delete(id));
|
|
131
|
+
}
|
|
132
|
+
return response;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get session information
|
|
136
|
+
*/
|
|
137
|
+
async getSession() {
|
|
138
|
+
if (!this.sessionId) {
|
|
139
|
+
throw new Error('Not connected');
|
|
140
|
+
}
|
|
141
|
+
return this.options.httpClient.get(`/sse/session/${this.sessionId}`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Add event handler
|
|
145
|
+
*/
|
|
146
|
+
onEvent(handler) {
|
|
147
|
+
this.eventHandlers.push(handler);
|
|
148
|
+
return () => {
|
|
149
|
+
this.eventHandlers = this.eventHandlers.filter(h => h !== handler);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Add error handler
|
|
154
|
+
*/
|
|
155
|
+
onError(handler) {
|
|
156
|
+
this.errorHandlers.push(handler);
|
|
157
|
+
return () => {
|
|
158
|
+
this.errorHandlers = this.errorHandlers.filter(h => h !== handler);
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if connected
|
|
163
|
+
*/
|
|
164
|
+
isConnected() {
|
|
165
|
+
return this.eventSource?.readyState === EventSource.OPEN;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get current session ID
|
|
169
|
+
*/
|
|
170
|
+
getSessionId() {
|
|
171
|
+
return this.sessionId;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get subscribed context IDs
|
|
175
|
+
*/
|
|
176
|
+
getSubscribedContexts() {
|
|
177
|
+
return Array.from(this.subscribedContexts);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the last event ID (useful for resumable connections)
|
|
181
|
+
*/
|
|
182
|
+
getLastEventId() {
|
|
183
|
+
return this._lastEventId;
|
|
184
|
+
}
|
|
185
|
+
handleDisconnect() {
|
|
186
|
+
if (!this.options.autoReconnect) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
setTimeout(async () => {
|
|
190
|
+
try {
|
|
191
|
+
await this.connect();
|
|
192
|
+
// Resubscribe to previous contexts
|
|
193
|
+
if (this.subscribedContexts.size > 0) {
|
|
194
|
+
await this.subscribe(Array.from(this.subscribedContexts));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Will retry via handleDisconnect on next error
|
|
199
|
+
}
|
|
200
|
+
}, this.options.reconnectDelay);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/sse/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SseClient } from './client';
|
|
2
|
+
export type { SseClientOptions } from './client';
|
|
3
|
+
export type { SseSubscriptionRequest, SseSubscriptionResponse, SseSessionResponse, SseEvent, SseEventHandler, SseErrorHandler, } from './types';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Types
|
|
3
|
+
* Based on OpenAPI spec: /sse endpoints
|
|
4
|
+
*/
|
|
5
|
+
export interface SseSubscriptionRequest {
|
|
6
|
+
/** Session ID from connect event */
|
|
7
|
+
id: string;
|
|
8
|
+
method: 'subscribe' | 'unsubscribe';
|
|
9
|
+
params: {
|
|
10
|
+
contextIds: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface SseSubscriptionResponse {
|
|
14
|
+
data?: {
|
|
15
|
+
subscribedContextIds?: string[];
|
|
16
|
+
unsubscribedContextIds?: string[];
|
|
17
|
+
};
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SseSessionResponse {
|
|
21
|
+
data?: {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
subscribedContextIds: string[];
|
|
24
|
+
connectedAt: string;
|
|
25
|
+
};
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SseEvent {
|
|
29
|
+
id?: string;
|
|
30
|
+
event: string;
|
|
31
|
+
data: unknown;
|
|
32
|
+
}
|
|
33
|
+
export type SseEventHandler = (event: SseEvent) => void;
|
|
34
|
+
export type SseErrorHandler = (error: Error) => void;
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/api/sse/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC;IACpC,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE;QACL,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;KACnC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/sse/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for API clients
|
|
3
|
+
*/
|
|
4
|
+
export type ApiResponseWrapper<T> = {
|
|
5
|
+
data: T;
|
|
6
|
+
error?: never;
|
|
7
|
+
} | {
|
|
8
|
+
data?: never;
|
|
9
|
+
error: ApiError;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* API-level error structure (returned in response body even with HTTP 200)
|
|
13
|
+
* Common in RPC-style APIs where errors are semantic, not transport-level.
|
|
14
|
+
*/
|
|
15
|
+
export interface ApiError {
|
|
16
|
+
type?: string;
|
|
17
|
+
code?: number;
|
|
18
|
+
message: string;
|
|
19
|
+
data?: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Custom error class for API errors that includes structured error data.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ApiResponseError extends Error {
|
|
25
|
+
readonly type?: string;
|
|
26
|
+
readonly code?: number;
|
|
27
|
+
readonly data?: unknown;
|
|
28
|
+
constructor(error: ApiError);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Unwraps a response from the API format { data: T } to T.
|
|
32
|
+
*
|
|
33
|
+
* This function handles:
|
|
34
|
+
* 1. Standard success responses: { data: T }
|
|
35
|
+
* 2. RPC-style error responses: { error: { message, type?, code? } }
|
|
36
|
+
* 3. Null/undefined data detection
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* // Success case
|
|
41
|
+
* const apps = await unwrap(client.get<{ data: App[] }>('/apps'));
|
|
42
|
+
* // apps is App[]
|
|
43
|
+
*
|
|
44
|
+
* // Error case (throws ApiResponseError)
|
|
45
|
+
* const result = await unwrap(client.post('/rpc', badRequest));
|
|
46
|
+
* // throws ApiResponseError with message, type, code
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @param response - Promise resolving to an ApiResponseWrapper<T>
|
|
50
|
+
* @returns Promise resolving to the unwrapped data
|
|
51
|
+
* @throws ApiResponseError if the response contains an error payload
|
|
52
|
+
* @throws Error if data is null or undefined
|
|
53
|
+
*/
|
|
54
|
+
export declare function unwrap<T>(response: Promise<ApiResponseWrapper<T> | {
|
|
55
|
+
data: T;
|
|
56
|
+
}>): Promise<T>;
|
|
57
|
+
/**
|
|
58
|
+
* Safely unwraps a response, returning null instead of throwing on missing data.
|
|
59
|
+
* Still throws on explicit error payloads.
|
|
60
|
+
*
|
|
61
|
+
* @param response - Promise resolving to an ApiResponseWrapper<T>
|
|
62
|
+
* @returns Promise resolving to the unwrapped data or null
|
|
63
|
+
* @throws ApiResponseError if the response contains an error payload
|
|
64
|
+
*/
|
|
65
|
+
export declare function unwrapOrNull<T>(response: Promise<ApiResponseWrapper<T> | {
|
|
66
|
+
data: T;
|
|
67
|
+
}>): Promise<T | null>;
|
|
68
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/api/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEnG;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEnB,KAAK,EAAE,QAAQ;CAO5B;AAkBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,GACrD,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,GACrD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAanB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for API clients
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Custom error class for API errors that includes structured error data.
|
|
6
|
+
*/
|
|
7
|
+
export class ApiResponseError extends Error {
|
|
8
|
+
constructor(error) {
|
|
9
|
+
super(error.message);
|
|
10
|
+
this.name = 'ApiResponseError';
|
|
11
|
+
this.type = error.type;
|
|
12
|
+
this.code = error.code;
|
|
13
|
+
this.data = error.data;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if a response contains an error payload.
|
|
18
|
+
*/
|
|
19
|
+
function hasErrorPayload(response) {
|
|
20
|
+
return (typeof response === 'object' &&
|
|
21
|
+
response !== null &&
|
|
22
|
+
'error' in response &&
|
|
23
|
+
response.error !== null &&
|
|
24
|
+
response.error !== undefined &&
|
|
25
|
+
typeof response.error === 'object');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Unwraps a response from the API format { data: T } to T.
|
|
29
|
+
*
|
|
30
|
+
* This function handles:
|
|
31
|
+
* 1. Standard success responses: { data: T }
|
|
32
|
+
* 2. RPC-style error responses: { error: { message, type?, code? } }
|
|
33
|
+
* 3. Null/undefined data detection
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Success case
|
|
38
|
+
* const apps = await unwrap(client.get<{ data: App[] }>('/apps'));
|
|
39
|
+
* // apps is App[]
|
|
40
|
+
*
|
|
41
|
+
* // Error case (throws ApiResponseError)
|
|
42
|
+
* const result = await unwrap(client.post('/rpc', badRequest));
|
|
43
|
+
* // throws ApiResponseError with message, type, code
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @param response - Promise resolving to an ApiResponseWrapper<T>
|
|
47
|
+
* @returns Promise resolving to the unwrapped data
|
|
48
|
+
* @throws ApiResponseError if the response contains an error payload
|
|
49
|
+
* @throws Error if data is null or undefined
|
|
50
|
+
*/
|
|
51
|
+
export async function unwrap(response) {
|
|
52
|
+
const result = await response;
|
|
53
|
+
// Check for RPC-style error payload (even with HTTP 200)
|
|
54
|
+
if (hasErrorPayload(result)) {
|
|
55
|
+
throw new ApiResponseError(result.error);
|
|
56
|
+
}
|
|
57
|
+
// Check specifically for null/undefined, not falsy values
|
|
58
|
+
// This allows valid responses like 0, false, or empty strings
|
|
59
|
+
if (result.data === null || result.data === undefined) {
|
|
60
|
+
throw new Error('Response data is null or undefined');
|
|
61
|
+
}
|
|
62
|
+
return result.data;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Safely unwraps a response, returning null instead of throwing on missing data.
|
|
66
|
+
* Still throws on explicit error payloads.
|
|
67
|
+
*
|
|
68
|
+
* @param response - Promise resolving to an ApiResponseWrapper<T>
|
|
69
|
+
* @returns Promise resolving to the unwrapped data or null
|
|
70
|
+
* @throws ApiResponseError if the response contains an error payload
|
|
71
|
+
*/
|
|
72
|
+
export async function unwrapOrNull(response) {
|
|
73
|
+
const result = await response;
|
|
74
|
+
// Check for RPC-style error payload
|
|
75
|
+
if (hasErrorPayload(result)) {
|
|
76
|
+
throw new ApiResponseError(result.error);
|
|
77
|
+
}
|
|
78
|
+
if (result.data === null || result.data === undefined) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return result.data;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/api/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAKzC,YAAY,KAAe;QACzB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,QAAiB;IAEjB,OAAO,CACL,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,OAAO,IAAI,QAAQ;QACnB,QAAQ,CAAC,KAAK,KAAK,IAAI;QACvB,QAAQ,CAAC,KAAK,KAAK,SAAS;QAC5B,OAAQ,QAA+B,CAAC,KAAK,KAAK,QAAQ,CAC3D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAsD;IAEtD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;IAE9B,yDAAyD;IACzD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;QAC3B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1C;IAED,0DAA0D;IAC1D,8DAA8D;IAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;QACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;KACvD;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAsD;IAEtD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;IAE9B,oCAAoC;IACpC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;QAC3B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1C;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;QACrD,OAAO,IAAI,CAAC;KACb;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Client
|
|
3
|
+
*
|
|
4
|
+
* Real-time event subscriptions via WebSocket.
|
|
5
|
+
* Events are pushed from server to client.
|
|
6
|
+
* For queries/mutations, use the JSON-RPC endpoint.
|
|
7
|
+
*/
|
|
8
|
+
import type { WebSocketResponse, WebSocketEventHandler, WebSocketErrorHandler, WebSocketCloseHandler } from './types';
|
|
9
|
+
export interface WebSocketClientOptions {
|
|
10
|
+
/** Base URL (will be converted to ws:// or wss://) */
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
/** Function to get current auth token */
|
|
13
|
+
getAuthToken?: () => Promise<string | null>;
|
|
14
|
+
/** Auto-reconnect on disconnect */
|
|
15
|
+
autoReconnect?: boolean;
|
|
16
|
+
/** Reconnect delay in ms */
|
|
17
|
+
reconnectDelay?: number;
|
|
18
|
+
/** Max reconnect attempts */
|
|
19
|
+
maxReconnectAttempts?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class WebSocketClient {
|
|
22
|
+
private ws;
|
|
23
|
+
private options;
|
|
24
|
+
private requestId;
|
|
25
|
+
private pendingRequests;
|
|
26
|
+
private eventHandlers;
|
|
27
|
+
private errorHandlers;
|
|
28
|
+
private closeHandlers;
|
|
29
|
+
private reconnectAttempts;
|
|
30
|
+
private subscribedContexts;
|
|
31
|
+
constructor(options: WebSocketClientOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Connect to the WebSocket server
|
|
34
|
+
*/
|
|
35
|
+
connect(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Disconnect from the WebSocket server
|
|
38
|
+
*/
|
|
39
|
+
disconnect(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Subscribe to context events
|
|
42
|
+
*/
|
|
43
|
+
subscribe(contextIds: string[]): Promise<WebSocketResponse>;
|
|
44
|
+
/**
|
|
45
|
+
* Unsubscribe from context events
|
|
46
|
+
*/
|
|
47
|
+
unsubscribe(contextIds: string[]): Promise<WebSocketResponse>;
|
|
48
|
+
/**
|
|
49
|
+
* Add event handler
|
|
50
|
+
*/
|
|
51
|
+
onEvent(handler: WebSocketEventHandler): () => void;
|
|
52
|
+
/**
|
|
53
|
+
* Add error handler
|
|
54
|
+
*/
|
|
55
|
+
onError(handler: WebSocketErrorHandler): () => void;
|
|
56
|
+
/**
|
|
57
|
+
* Add close handler
|
|
58
|
+
*/
|
|
59
|
+
onClose(handler: WebSocketCloseHandler): () => void;
|
|
60
|
+
/**
|
|
61
|
+
* Check if connected
|
|
62
|
+
*/
|
|
63
|
+
isConnected(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Get subscribed context IDs
|
|
66
|
+
*/
|
|
67
|
+
getSubscribedContexts(): string[];
|
|
68
|
+
private send;
|
|
69
|
+
private handleMessage;
|
|
70
|
+
private handleDisconnect;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/ws/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,iBAAiB,EAEjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4BAA4B;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAGlB;IACL,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,OAAO,EAAE,sBAAsB;IAU3C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAcjE;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAcnE;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAOnD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAOnD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAOnD;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;YAInB,IAAI;IAuBlB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,gBAAgB;CAyBzB"}
|