@ironflow/node 0.19.3 → 0.20.2
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/LICENSE +181 -0
- package/README.md +5 -2
- package/package.json +20 -14
- package/dist/client.d.ts +0 -924
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -1526
- package/dist/client.js.map +0 -1
- package/dist/command-dedup.d.ts +0 -61
- package/dist/command-dedup.d.ts.map +0 -1
- package/dist/command-dedup.js +0 -129
- package/dist/command-dedup.js.map +0 -1
- package/dist/config-client.d.ts +0 -58
- package/dist/config-client.d.ts.map +0 -1
- package/dist/config-client.js +0 -171
- package/dist/config-client.js.map +0 -1
- package/dist/function.d.ts +0 -53
- package/dist/function.d.ts.map +0 -1
- package/dist/function.js +0 -56
- package/dist/function.js.map +0 -1
- package/dist/index.d.ts +0 -71
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -70
- package/dist/index.js.map +0 -1
- package/dist/internal/context.d.ts +0 -142
- package/dist/internal/context.d.ts.map +0 -1
- package/dist/internal/context.js +0 -306
- package/dist/internal/context.js.map +0 -1
- package/dist/internal/errors.d.ts +0 -66
- package/dist/internal/errors.d.ts.map +0 -1
- package/dist/internal/errors.js +0 -29
- package/dist/internal/errors.js.map +0 -1
- package/dist/internal/run-context.d.ts +0 -10
- package/dist/internal/run-context.d.ts.map +0 -1
- package/dist/internal/run-context.js +0 -23
- package/dist/internal/run-context.js.map +0 -1
- package/dist/kv.d.ts +0 -86
- package/dist/kv.d.ts.map +0 -1
- package/dist/kv.js +0 -261
- package/dist/kv.js.map +0 -1
- package/dist/projection-runner.d.ts +0 -83
- package/dist/projection-runner.d.ts.map +0 -1
- package/dist/projection-runner.js +0 -470
- package/dist/projection-runner.js.map +0 -1
- package/dist/projection.d.ts +0 -36
- package/dist/projection.d.ts.map +0 -1
- package/dist/projection.js +0 -55
- package/dist/projection.js.map +0 -1
- package/dist/secrets.d.ts +0 -6
- package/dist/secrets.d.ts.map +0 -1
- package/dist/secrets.js +0 -19
- package/dist/secrets.js.map +0 -1
- package/dist/serve.d.ts +0 -71
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -434
- package/dist/serve.js.map +0 -1
- package/dist/step.d.ts +0 -18
- package/dist/step.d.ts.map +0 -1
- package/dist/step.js +0 -581
- package/dist/step.js.map +0 -1
- package/dist/subscribe.d.ts +0 -164
- package/dist/subscribe.d.ts.map +0 -1
- package/dist/subscribe.js +0 -487
- package/dist/subscribe.js.map +0 -1
- package/dist/test/index.d.ts +0 -22
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/index.js +0 -112
- package/dist/test/index.js.map +0 -1
- package/dist/test/test-step.d.ts +0 -21
- package/dist/test/test-step.d.ts.map +0 -1
- package/dist/test/test-step.js +0 -83
- package/dist/test/test-step.js.map +0 -1
- package/dist/types.d.ts +0 -108
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/types.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -4
- package/dist/version.js.map +0 -1
- package/dist/webhook.d.ts +0 -22
- package/dist/webhook.d.ts.map +0 -1
- package/dist/webhook.js +0 -23
- package/dist/webhook.js.map +0 -1
- package/dist/worker-streaming.d.ts +0 -17
- package/dist/worker-streaming.d.ts.map +0 -1
- package/dist/worker-streaming.js +0 -510
- package/dist/worker-streaming.js.map +0 -1
- package/dist/worker.d.ts +0 -28
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -540
- package/dist/worker.js.map +0 -1
package/dist/subscribe.d.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Node.js SubscriptionClient for real-time event subscriptions via WebSocket.
|
|
3
|
-
*
|
|
4
|
-
* Uses the same WebSocket protocol as the browser SDK but designed for
|
|
5
|
-
* server-side Node.js usage (long-running processes, workers).
|
|
6
|
-
*/
|
|
7
|
-
import type { ConnectionState, SubscribeOptions, SubscriptionEvent, SubscriptionErrorInfo, Subscription, AckableSubscription } from "@ironflow/core";
|
|
8
|
-
export { patterns } from "@ironflow/core";
|
|
9
|
-
/**
|
|
10
|
-
* Configuration for the SubscriptionClient
|
|
11
|
-
*/
|
|
12
|
-
export interface SubscriptionClientConfig {
|
|
13
|
-
/** Server URL (e.g., "http://localhost:9123"). WebSocket URL is derived automatically. */
|
|
14
|
-
serverUrl: string;
|
|
15
|
-
/** API key for authentication */
|
|
16
|
-
apiKey?: string;
|
|
17
|
-
/** Environment for environment-scoped subscriptions */
|
|
18
|
-
environment?: string;
|
|
19
|
-
/** Enable automatic reconnection (default: true) */
|
|
20
|
-
autoReconnect?: boolean;
|
|
21
|
-
/** Initial reconnect delay in ms (default: 1000) */
|
|
22
|
-
reconnectDelay?: number;
|
|
23
|
-
/** Maximum reconnect delay in ms (default: 30000) */
|
|
24
|
-
maxReconnectDelay?: number;
|
|
25
|
-
/** Reconnect backoff multiplier (default: 1.5) */
|
|
26
|
-
reconnectBackoff?: number;
|
|
27
|
-
/** Connection timeout in ms (default: 10000) */
|
|
28
|
-
connectionTimeout?: number;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Subscription callbacks for event-driven usage
|
|
32
|
-
*/
|
|
33
|
-
export interface SubscriptionCallbacks<T = unknown> {
|
|
34
|
-
/** Called when an event is received */
|
|
35
|
-
onEvent?: (event: SubscriptionEvent<T>) => void;
|
|
36
|
-
/** Called when a subscription error occurs */
|
|
37
|
-
onError?: (error: SubscriptionErrorInfo) => void;
|
|
38
|
-
/** Called when connection state changes */
|
|
39
|
-
onStateChange?: (state: ConnectionState) => void;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* WebSocket-based subscription client for Node.js.
|
|
43
|
-
*
|
|
44
|
-
* Connects to the Ironflow server and provides real-time event subscriptions
|
|
45
|
-
* with auto-reconnect, pattern helpers, and ackable subscriptions.
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* import { createSubscriptionClient, patterns } from "@ironflow/node";
|
|
50
|
-
*
|
|
51
|
-
* const subClient = createSubscriptionClient({
|
|
52
|
-
* serverUrl: "http://localhost:9123",
|
|
53
|
-
* });
|
|
54
|
-
*
|
|
55
|
-
* await subClient.connect();
|
|
56
|
-
*
|
|
57
|
-
* const sub = await subClient.subscribe(patterns.allSecrets(), {
|
|
58
|
-
* onEvent: (event) => {
|
|
59
|
-
* console.log(`Secret ${event.data.name} was ${event.data.action}`);
|
|
60
|
-
* },
|
|
61
|
-
* });
|
|
62
|
-
*
|
|
63
|
-
* // Later: clean up
|
|
64
|
-
* sub.unsubscribe();
|
|
65
|
-
* subClient.close();
|
|
66
|
-
* ```
|
|
67
|
-
*/
|
|
68
|
-
export declare class SubscriptionClient {
|
|
69
|
-
private readonly config;
|
|
70
|
-
private readonly wsUrl;
|
|
71
|
-
private ws;
|
|
72
|
-
private _connectionState;
|
|
73
|
-
private reconnectAttempt;
|
|
74
|
-
private reconnectTimer;
|
|
75
|
-
private closed;
|
|
76
|
-
private pending;
|
|
77
|
-
private subscriptions;
|
|
78
|
-
private patternToId;
|
|
79
|
-
private connectionCallbacks;
|
|
80
|
-
private errorCallbacks;
|
|
81
|
-
constructor(config: SubscriptionClientConfig);
|
|
82
|
-
/** Current connection state */
|
|
83
|
-
get connectionState(): ConnectionState;
|
|
84
|
-
/** Whether the client is connected */
|
|
85
|
-
get isConnected(): boolean;
|
|
86
|
-
/**
|
|
87
|
-
* Connect to the Ironflow server.
|
|
88
|
-
*/
|
|
89
|
-
connect(): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Close the connection and clean up all subscriptions.
|
|
92
|
-
*/
|
|
93
|
-
close(): void;
|
|
94
|
-
/**
|
|
95
|
-
* Subscribe to events matching a pattern.
|
|
96
|
-
*
|
|
97
|
-
* @example
|
|
98
|
-
* ```typescript
|
|
99
|
-
* // Callback-based
|
|
100
|
-
* const sub = await client.subscribe("system.secret.*", {
|
|
101
|
-
* onEvent: (event) => console.log(event.topic, event.data),
|
|
102
|
-
* onError: (err) => console.error(err.message),
|
|
103
|
-
* });
|
|
104
|
-
*
|
|
105
|
-
* // With options
|
|
106
|
-
* const sub = await client.subscribe("system.run.>", {
|
|
107
|
-
* replay: 10,
|
|
108
|
-
* includeMetadata: true,
|
|
109
|
-
* onEvent: (event) => console.log(event),
|
|
110
|
-
* });
|
|
111
|
-
*
|
|
112
|
-
* // Ackable subscription
|
|
113
|
-
* const sub = await client.subscribe("order.*", {
|
|
114
|
-
* ackMode: "manual",
|
|
115
|
-
* consumerGroup: "processors",
|
|
116
|
-
* onEvent: (event) => {
|
|
117
|
-
* processOrder(event);
|
|
118
|
-
* sub.ack(event.eventId!);
|
|
119
|
-
* },
|
|
120
|
-
* });
|
|
121
|
-
* ```
|
|
122
|
-
*/
|
|
123
|
-
subscribe<T = unknown>(pattern: string, callbacksAndOptions?: SubscriptionCallbacks<T> & SubscribeOptions): Promise<Subscription | AckableSubscription>;
|
|
124
|
-
/**
|
|
125
|
-
* Register a global connection state change callback.
|
|
126
|
-
* Returns an unsubscribe function.
|
|
127
|
-
*/
|
|
128
|
-
onConnectionChange(callback: (state: ConnectionState) => void): () => void;
|
|
129
|
-
/**
|
|
130
|
-
* Register a global error callback.
|
|
131
|
-
* Returns an unsubscribe function.
|
|
132
|
-
*/
|
|
133
|
-
onError(callback: (error: SubscriptionErrorInfo) => void): () => void;
|
|
134
|
-
private sendSubscribe;
|
|
135
|
-
private sendUnsubscribe;
|
|
136
|
-
private sendAck;
|
|
137
|
-
private handleMessage;
|
|
138
|
-
private handleSubscribed;
|
|
139
|
-
private handleSubscribeFailed;
|
|
140
|
-
private unsubscribeById;
|
|
141
|
-
private notifyConnectionChange;
|
|
142
|
-
private scheduleReconnect;
|
|
143
|
-
private clearReconnectTimer;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Create a new SubscriptionClient.
|
|
147
|
-
*
|
|
148
|
-
* @example
|
|
149
|
-
* ```typescript
|
|
150
|
-
* import { createSubscriptionClient, patterns } from "@ironflow/node";
|
|
151
|
-
*
|
|
152
|
-
* const client = createSubscriptionClient({
|
|
153
|
-
* serverUrl: "http://localhost:9123",
|
|
154
|
-
* });
|
|
155
|
-
*
|
|
156
|
-
* await client.connect();
|
|
157
|
-
*
|
|
158
|
-
* const sub = await client.subscribe(patterns.allSecrets(), {
|
|
159
|
-
* onEvent: (event) => console.log(event.data),
|
|
160
|
-
* });
|
|
161
|
-
* ```
|
|
162
|
-
*/
|
|
163
|
-
export declare function createSubscriptionClient(config: SubscriptionClientConfig): SubscriptionClient;
|
|
164
|
-
//# sourceMappingURL=subscribe.d.ts.map
|
package/dist/subscribe.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"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"}
|
package/dist/subscribe.js
DELETED
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Node.js SubscriptionClient for real-time event subscriptions via WebSocket.
|
|
3
|
-
*
|
|
4
|
-
* Uses the same WebSocket protocol as the browser SDK but designed for
|
|
5
|
-
* server-side Node.js usage (long-running processes, workers).
|
|
6
|
-
*/
|
|
7
|
-
import { getWebSocketUrl, WSServerMessageSchema, calculateBackoff, } from "@ironflow/core";
|
|
8
|
-
// Re-export patterns for convenience
|
|
9
|
-
export { patterns } from "@ironflow/core";
|
|
10
|
-
// ============================================================================
|
|
11
|
-
// SubscriptionClient
|
|
12
|
-
// ============================================================================
|
|
13
|
-
/**
|
|
14
|
-
* WebSocket-based subscription client for Node.js.
|
|
15
|
-
*
|
|
16
|
-
* Connects to the Ironflow server and provides real-time event subscriptions
|
|
17
|
-
* with auto-reconnect, pattern helpers, and ackable subscriptions.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* import { createSubscriptionClient, patterns } from "@ironflow/node";
|
|
22
|
-
*
|
|
23
|
-
* const subClient = createSubscriptionClient({
|
|
24
|
-
* serverUrl: "http://localhost:9123",
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* await subClient.connect();
|
|
28
|
-
*
|
|
29
|
-
* const sub = await subClient.subscribe(patterns.allSecrets(), {
|
|
30
|
-
* onEvent: (event) => {
|
|
31
|
-
* console.log(`Secret ${event.data.name} was ${event.data.action}`);
|
|
32
|
-
* },
|
|
33
|
-
* });
|
|
34
|
-
*
|
|
35
|
-
* // Later: clean up
|
|
36
|
-
* sub.unsubscribe();
|
|
37
|
-
* subClient.close();
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export class SubscriptionClient {
|
|
41
|
-
config;
|
|
42
|
-
wsUrl;
|
|
43
|
-
ws = null;
|
|
44
|
-
_connectionState = "disconnected";
|
|
45
|
-
reconnectAttempt = 0;
|
|
46
|
-
reconnectTimer = null;
|
|
47
|
-
closed = false;
|
|
48
|
-
// Subscription tracking
|
|
49
|
-
pending = new Map(); // pattern -> pending
|
|
50
|
-
subscriptions = new Map(); // subId -> active
|
|
51
|
-
patternToId = new Map(); // pattern -> subId
|
|
52
|
-
// Global callbacks
|
|
53
|
-
connectionCallbacks = new Set();
|
|
54
|
-
errorCallbacks = new Set();
|
|
55
|
-
constructor(config) {
|
|
56
|
-
this.config = {
|
|
57
|
-
autoReconnect: true,
|
|
58
|
-
reconnectDelay: 1000,
|
|
59
|
-
maxReconnectDelay: 30000,
|
|
60
|
-
reconnectBackoff: 1.5,
|
|
61
|
-
connectionTimeout: 10000,
|
|
62
|
-
...config,
|
|
63
|
-
};
|
|
64
|
-
// Build WebSocket URL with auth/env params
|
|
65
|
-
const baseWsUrl = getWebSocketUrl(config.serverUrl);
|
|
66
|
-
const params = [];
|
|
67
|
-
if (config.environment) {
|
|
68
|
-
params.push(`env=${encodeURIComponent(config.environment)}`);
|
|
69
|
-
}
|
|
70
|
-
if (config.apiKey) {
|
|
71
|
-
params.push(`token=${encodeURIComponent(config.apiKey)}`);
|
|
72
|
-
}
|
|
73
|
-
if (params.length > 0) {
|
|
74
|
-
const separator = baseWsUrl.includes("?") ? "&" : "?";
|
|
75
|
-
this.wsUrl = `${baseWsUrl}${separator}${params.join("&")}`;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
this.wsUrl = baseWsUrl;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/** Current connection state */
|
|
82
|
-
get connectionState() {
|
|
83
|
-
return this._connectionState;
|
|
84
|
-
}
|
|
85
|
-
/** Whether the client is connected */
|
|
86
|
-
get isConnected() {
|
|
87
|
-
return this._connectionState === "connected";
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Connect to the Ironflow server.
|
|
91
|
-
*/
|
|
92
|
-
async connect() {
|
|
93
|
-
if (this._connectionState === "connected") {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
if (this.closed) {
|
|
97
|
-
throw new Error("Client is closed");
|
|
98
|
-
}
|
|
99
|
-
const timeout = this.config.connectionTimeout;
|
|
100
|
-
return new Promise((resolve, reject) => {
|
|
101
|
-
this._connectionState = "connecting";
|
|
102
|
-
this.notifyConnectionChange("connecting");
|
|
103
|
-
const timeoutId = setTimeout(() => {
|
|
104
|
-
if (this._connectionState === "connecting") {
|
|
105
|
-
if (this.ws) {
|
|
106
|
-
this.ws.onopen = null;
|
|
107
|
-
this.ws.onclose = null;
|
|
108
|
-
this.ws.onerror = null;
|
|
109
|
-
this.ws.close();
|
|
110
|
-
this.ws = null;
|
|
111
|
-
}
|
|
112
|
-
this._connectionState = "disconnected";
|
|
113
|
-
this.notifyConnectionChange("disconnected");
|
|
114
|
-
reject(new Error(`WebSocket connection timeout after ${timeout}ms`));
|
|
115
|
-
}
|
|
116
|
-
}, timeout);
|
|
117
|
-
try {
|
|
118
|
-
this.ws = new WebSocket(this.wsUrl);
|
|
119
|
-
this.ws.onopen = () => {
|
|
120
|
-
clearTimeout(timeoutId);
|
|
121
|
-
this._connectionState = "connected";
|
|
122
|
-
this.reconnectAttempt = 0;
|
|
123
|
-
this.notifyConnectionChange("connected");
|
|
124
|
-
// Re-subscribe all active subscriptions on reconnect
|
|
125
|
-
for (const sub of this.subscriptions.values()) {
|
|
126
|
-
this.sendSubscribe(sub.pattern, sub.options);
|
|
127
|
-
}
|
|
128
|
-
resolve();
|
|
129
|
-
};
|
|
130
|
-
this.ws.onclose = (event) => {
|
|
131
|
-
clearTimeout(timeoutId);
|
|
132
|
-
const wasConnected = this._connectionState === "connected";
|
|
133
|
-
this._connectionState = "disconnected";
|
|
134
|
-
this.notifyConnectionChange("disconnected");
|
|
135
|
-
if (this.config.autoReconnect &&
|
|
136
|
-
!this.closed &&
|
|
137
|
-
event.code !== 1000) {
|
|
138
|
-
this.scheduleReconnect();
|
|
139
|
-
}
|
|
140
|
-
if (!wasConnected && this._connectionState === "disconnected") {
|
|
141
|
-
reject(new Error("WebSocket connection failed"));
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
this.ws.onerror = () => {
|
|
145
|
-
clearTimeout(timeoutId);
|
|
146
|
-
if (this._connectionState === "connecting") {
|
|
147
|
-
reject(new Error("WebSocket connection error"));
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
this.ws.onmessage = (event) => {
|
|
151
|
-
const data = typeof event.data === "string"
|
|
152
|
-
? event.data
|
|
153
|
-
: event.data.toString();
|
|
154
|
-
this.handleMessage(data);
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
clearTimeout(timeoutId);
|
|
159
|
-
this._connectionState = "disconnected";
|
|
160
|
-
reject(error);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Close the connection and clean up all subscriptions.
|
|
166
|
-
*/
|
|
167
|
-
close() {
|
|
168
|
-
this.closed = true;
|
|
169
|
-
this.clearReconnectTimer();
|
|
170
|
-
if (this.ws) {
|
|
171
|
-
const ws = this.ws;
|
|
172
|
-
this.ws = null;
|
|
173
|
-
ws.close(1000, "Client close");
|
|
174
|
-
}
|
|
175
|
-
// Reject any pending subscriptions
|
|
176
|
-
for (const pending of this.pending.values()) {
|
|
177
|
-
pending.reject(new Error("Client closed"));
|
|
178
|
-
}
|
|
179
|
-
this._connectionState = "disconnected";
|
|
180
|
-
this.pending.clear();
|
|
181
|
-
this.subscriptions.clear();
|
|
182
|
-
this.patternToId.clear();
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Subscribe to events matching a pattern.
|
|
186
|
-
*
|
|
187
|
-
* @example
|
|
188
|
-
* ```typescript
|
|
189
|
-
* // Callback-based
|
|
190
|
-
* const sub = await client.subscribe("system.secret.*", {
|
|
191
|
-
* onEvent: (event) => console.log(event.topic, event.data),
|
|
192
|
-
* onError: (err) => console.error(err.message),
|
|
193
|
-
* });
|
|
194
|
-
*
|
|
195
|
-
* // With options
|
|
196
|
-
* const sub = await client.subscribe("system.run.>", {
|
|
197
|
-
* replay: 10,
|
|
198
|
-
* includeMetadata: true,
|
|
199
|
-
* onEvent: (event) => console.log(event),
|
|
200
|
-
* });
|
|
201
|
-
*
|
|
202
|
-
* // Ackable subscription
|
|
203
|
-
* const sub = await client.subscribe("order.*", {
|
|
204
|
-
* ackMode: "manual",
|
|
205
|
-
* consumerGroup: "processors",
|
|
206
|
-
* onEvent: (event) => {
|
|
207
|
-
* processOrder(event);
|
|
208
|
-
* sub.ack(event.eventId!);
|
|
209
|
-
* },
|
|
210
|
-
* });
|
|
211
|
-
* ```
|
|
212
|
-
*/
|
|
213
|
-
async subscribe(pattern, callbacksAndOptions = {}) {
|
|
214
|
-
if (!this.isConnected) {
|
|
215
|
-
throw new Error("Not connected to server");
|
|
216
|
-
}
|
|
217
|
-
// Check for duplicate
|
|
218
|
-
if (this.patternToId.has(pattern)) {
|
|
219
|
-
throw new Error(`Already subscribed to pattern: ${pattern}`);
|
|
220
|
-
}
|
|
221
|
-
// Extract options from callbacks
|
|
222
|
-
const { onEvent, onError, onStateChange, ...options } = callbacksAndOptions;
|
|
223
|
-
const callbacks = {
|
|
224
|
-
onEvent,
|
|
225
|
-
onError,
|
|
226
|
-
onStateChange,
|
|
227
|
-
};
|
|
228
|
-
return new Promise((resolve, reject) => {
|
|
229
|
-
const pending = {
|
|
230
|
-
pattern,
|
|
231
|
-
options: Object.keys(options).length > 0 ? options : undefined,
|
|
232
|
-
callbacks: callbacks,
|
|
233
|
-
resolve: resolve,
|
|
234
|
-
reject,
|
|
235
|
-
};
|
|
236
|
-
this.pending.set(pattern, pending);
|
|
237
|
-
this.sendSubscribe(pattern, pending.options);
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Register a global connection state change callback.
|
|
242
|
-
* Returns an unsubscribe function.
|
|
243
|
-
*/
|
|
244
|
-
onConnectionChange(callback) {
|
|
245
|
-
this.connectionCallbacks.add(callback);
|
|
246
|
-
return () => this.connectionCallbacks.delete(callback);
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Register a global error callback.
|
|
250
|
-
* Returns an unsubscribe function.
|
|
251
|
-
*/
|
|
252
|
-
onError(callback) {
|
|
253
|
-
this.errorCallbacks.add(callback);
|
|
254
|
-
return () => this.errorCallbacks.delete(callback);
|
|
255
|
-
}
|
|
256
|
-
// ============================================================================
|
|
257
|
-
// Private methods
|
|
258
|
-
// ============================================================================
|
|
259
|
-
sendSubscribe(pattern, options) {
|
|
260
|
-
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
const request = {
|
|
264
|
-
type: "subscribe",
|
|
265
|
-
subscription: {
|
|
266
|
-
pattern,
|
|
267
|
-
options: options
|
|
268
|
-
? {
|
|
269
|
-
replay: options.replay,
|
|
270
|
-
includeMetadata: options.includeMetadata,
|
|
271
|
-
filter: options.filter,
|
|
272
|
-
consumerGroup: options.consumerGroup,
|
|
273
|
-
ackMode: options.ackMode,
|
|
274
|
-
backpressure: options.backpressure,
|
|
275
|
-
namespace: options.namespace,
|
|
276
|
-
}
|
|
277
|
-
: undefined,
|
|
278
|
-
},
|
|
279
|
-
};
|
|
280
|
-
this.ws.send(JSON.stringify(request));
|
|
281
|
-
}
|
|
282
|
-
sendUnsubscribe(subscriptionId) {
|
|
283
|
-
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
const request = {
|
|
287
|
-
type: "unsubscribe",
|
|
288
|
-
subscriptionId,
|
|
289
|
-
};
|
|
290
|
-
this.ws.send(JSON.stringify(request));
|
|
291
|
-
}
|
|
292
|
-
sendAck(eventId, ackType, delay) {
|
|
293
|
-
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
294
|
-
throw new Error("Not connected");
|
|
295
|
-
}
|
|
296
|
-
const request = {
|
|
297
|
-
type: "ack",
|
|
298
|
-
eventId,
|
|
299
|
-
ackType,
|
|
300
|
-
};
|
|
301
|
-
if (delay !== undefined && ackType === "nak") {
|
|
302
|
-
request.redeliverDelay = delay;
|
|
303
|
-
}
|
|
304
|
-
this.ws.send(JSON.stringify(request));
|
|
305
|
-
}
|
|
306
|
-
handleMessage(data) {
|
|
307
|
-
let parsed;
|
|
308
|
-
try {
|
|
309
|
-
parsed = JSON.parse(data);
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
const result = WSServerMessageSchema.safeParse(parsed);
|
|
315
|
-
if (!result.success) {
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
const message = result.data;
|
|
319
|
-
switch (message.type) {
|
|
320
|
-
case "subscription_result":
|
|
321
|
-
for (const sub of message.results) {
|
|
322
|
-
if (sub.status === "ok" && sub.subscriptionId) {
|
|
323
|
-
this.handleSubscribed(sub.pattern, sub.subscriptionId);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
this.handleSubscribeFailed(sub.pattern, new Error(sub.message ?? `Subscription failed: ${sub.code}`));
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
break;
|
|
330
|
-
case "event": {
|
|
331
|
-
const active = this.subscriptions.get(message.subscriptionId);
|
|
332
|
-
if (active) {
|
|
333
|
-
const event = {
|
|
334
|
-
topic: message.topic,
|
|
335
|
-
data: message.data,
|
|
336
|
-
meta: message.meta,
|
|
337
|
-
eventId: message.eventId,
|
|
338
|
-
};
|
|
339
|
-
active.callbacks.onEvent?.(event);
|
|
340
|
-
}
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
case "subscription_error": {
|
|
344
|
-
const errorInfo = {
|
|
345
|
-
subscriptionId: message.subscriptionId,
|
|
346
|
-
code: message.code,
|
|
347
|
-
message: message.message,
|
|
348
|
-
retrying: message.retrying,
|
|
349
|
-
};
|
|
350
|
-
// Call global error handlers
|
|
351
|
-
for (const cb of this.errorCallbacks) {
|
|
352
|
-
cb(errorInfo);
|
|
353
|
-
}
|
|
354
|
-
// Call subscription-specific handler
|
|
355
|
-
const active = this.subscriptions.get(message.subscriptionId);
|
|
356
|
-
active?.callbacks.onError?.(errorInfo);
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
case "error": {
|
|
360
|
-
const errorInfo = {
|
|
361
|
-
code: message.code,
|
|
362
|
-
message: message.message,
|
|
363
|
-
};
|
|
364
|
-
for (const cb of this.errorCallbacks) {
|
|
365
|
-
cb(errorInfo);
|
|
366
|
-
}
|
|
367
|
-
break;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
handleSubscribed(pattern, subscriptionId) {
|
|
372
|
-
const pending = this.pending.get(pattern);
|
|
373
|
-
if (!pending) {
|
|
374
|
-
return;
|
|
375
|
-
}
|
|
376
|
-
this.pending.delete(pattern);
|
|
377
|
-
// Store as active
|
|
378
|
-
const active = {
|
|
379
|
-
id: subscriptionId,
|
|
380
|
-
pattern,
|
|
381
|
-
options: pending.options,
|
|
382
|
-
callbacks: pending.callbacks,
|
|
383
|
-
};
|
|
384
|
-
this.subscriptions.set(subscriptionId, active);
|
|
385
|
-
this.patternToId.set(pattern, subscriptionId);
|
|
386
|
-
const isManualAck = pending.options?.ackMode === "manual";
|
|
387
|
-
if (isManualAck) {
|
|
388
|
-
const ackableSub = {
|
|
389
|
-
id: subscriptionId,
|
|
390
|
-
pattern,
|
|
391
|
-
connectionState: this._connectionState,
|
|
392
|
-
unsubscribe: () => this.unsubscribeById(subscriptionId),
|
|
393
|
-
ack: (eventId) => {
|
|
394
|
-
this.sendAck(eventId, "ack");
|
|
395
|
-
return Promise.resolve();
|
|
396
|
-
},
|
|
397
|
-
nak: (eventId, delay) => {
|
|
398
|
-
this.sendAck(eventId, "nak", delay);
|
|
399
|
-
return Promise.resolve();
|
|
400
|
-
},
|
|
401
|
-
term: (eventId) => {
|
|
402
|
-
this.sendAck(eventId, "term");
|
|
403
|
-
return Promise.resolve();
|
|
404
|
-
},
|
|
405
|
-
};
|
|
406
|
-
pending.resolve(ackableSub);
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
const sub = {
|
|
410
|
-
id: subscriptionId,
|
|
411
|
-
pattern,
|
|
412
|
-
connectionState: this._connectionState,
|
|
413
|
-
unsubscribe: () => this.unsubscribeById(subscriptionId),
|
|
414
|
-
};
|
|
415
|
-
pending.resolve(sub);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
handleSubscribeFailed(pattern, error) {
|
|
419
|
-
const pending = this.pending.get(pattern);
|
|
420
|
-
if (!pending) {
|
|
421
|
-
return;
|
|
422
|
-
}
|
|
423
|
-
this.pending.delete(pattern);
|
|
424
|
-
pending.reject(error);
|
|
425
|
-
}
|
|
426
|
-
unsubscribeById(subscriptionId) {
|
|
427
|
-
const active = this.subscriptions.get(subscriptionId);
|
|
428
|
-
if (!active) {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
this.sendUnsubscribe(subscriptionId);
|
|
432
|
-
this.subscriptions.delete(subscriptionId);
|
|
433
|
-
this.patternToId.delete(active.pattern);
|
|
434
|
-
}
|
|
435
|
-
notifyConnectionChange(state) {
|
|
436
|
-
for (const cb of this.connectionCallbacks) {
|
|
437
|
-
cb(state);
|
|
438
|
-
}
|
|
439
|
-
// Notify all active subscriptions
|
|
440
|
-
for (const sub of this.subscriptions.values()) {
|
|
441
|
-
sub.callbacks.onStateChange?.(state);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
scheduleReconnect() {
|
|
445
|
-
if (this.reconnectTimer || this.closed) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
this._connectionState = "reconnecting";
|
|
449
|
-
this.notifyConnectionChange("reconnecting");
|
|
450
|
-
this.reconnectAttempt++;
|
|
451
|
-
const delay = calculateBackoff(this.reconnectAttempt, this.config.reconnectDelay, this.config.maxReconnectDelay, this.config.reconnectBackoff);
|
|
452
|
-
this.reconnectTimer = setTimeout(() => {
|
|
453
|
-
this.reconnectTimer = null;
|
|
454
|
-
this.connect().catch(() => {
|
|
455
|
-
// Will trigger another reconnect via onclose
|
|
456
|
-
});
|
|
457
|
-
}, delay);
|
|
458
|
-
}
|
|
459
|
-
clearReconnectTimer() {
|
|
460
|
-
if (this.reconnectTimer) {
|
|
461
|
-
clearTimeout(this.reconnectTimer);
|
|
462
|
-
this.reconnectTimer = null;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* Create a new SubscriptionClient.
|
|
468
|
-
*
|
|
469
|
-
* @example
|
|
470
|
-
* ```typescript
|
|
471
|
-
* import { createSubscriptionClient, patterns } from "@ironflow/node";
|
|
472
|
-
*
|
|
473
|
-
* const client = createSubscriptionClient({
|
|
474
|
-
* serverUrl: "http://localhost:9123",
|
|
475
|
-
* });
|
|
476
|
-
*
|
|
477
|
-
* await client.connect();
|
|
478
|
-
*
|
|
479
|
-
* const sub = await client.subscribe(patterns.allSecrets(), {
|
|
480
|
-
* onEvent: (event) => console.log(event.data),
|
|
481
|
-
* });
|
|
482
|
-
* ```
|
|
483
|
-
*/
|
|
484
|
-
export function createSubscriptionClient(config) {
|
|
485
|
-
return new SubscriptionClient(config);
|
|
486
|
-
}
|
|
487
|
-
//# sourceMappingURL=subscribe.js.map
|
package/dist/subscribe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAOxB,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA2D1C,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAUI;IACV,KAAK,CAAS;IAEvB,EAAE,GAAqB,IAAI,CAAC;IAC5B,gBAAgB,GAAoB,cAAc,CAAC;IACnD,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAyC,IAAI,CAAC;IAC5D,MAAM,GAAG,KAAK,CAAC;IAEvB,wBAAwB;IAChB,OAAO,GAAqC,IAAI,GAAG,EAAE,CAAC,CAAC,qBAAqB;IAC5E,aAAa,GAAoC,IAAI,GAAG,EAAE,CAAC,CAAC,kBAAkB;IAC9E,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,mBAAmB;IAEzE,mBAAmB;IACX,mBAAmB,GACzB,IAAI,GAAG,EAAE,CAAC;IACJ,cAAc,GACpB,IAAI,GAAG,EAAE,CAAC;IAEZ,YAAY,MAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG;YACZ,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,KAAK;YACxB,gBAAgB,EAAE,GAAG;YACrB,iBAAiB,EAAE,KAAK;YACxB,GAAG,MAAM;SACV,CAAC;QAEF,2CAA2C;QAC3C,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,SAAS,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,IAAI,CAAC,KAAK,GAAG,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,sCAAsC;IACtC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,gBAAgB,KAAK,WAAW,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAE9C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;YACrC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,IAAI,IAAI,CAAC,gBAAgB,KAAK,YAAY,EAAE,CAAC;oBAC3C,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;wBACZ,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;wBACtB,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;wBAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;oBACjB,CAAC;oBACD,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;oBACvC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;oBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,OAAO,IAAI,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEpC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;oBACpB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;oBACpC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;oBAEzC,qDAAqD;oBACrD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC9C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC/C,CAAC;oBAED,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;oBAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,KAAK,WAAW,CAAC;oBAC3D,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;oBACvC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;oBAE5C,IACE,IAAI,CAAC,MAAM,CAAC,aAAa;wBACzB,CAAC,IAAI,CAAC,MAAM;wBACZ,KAAK,CAAC,IAAI,KAAK,IAAI,EACnB,CAAC;wBACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,CAAC;oBAED,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,KAAK,cAAc,EAAE,CAAC;wBAC9D,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;oBACrB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,IAAI,IAAI,CAAC,gBAAgB,KAAK,YAAY,EAAE,CAAC;wBAC3C,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;oBAC5B,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAC5B,CAAC,CAAC,KAAK,CAAC,IAAI;wBACZ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;gBACvC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,SAAS,CACb,OAAe,EACf,sBAAmE,EAAE;QAErE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,iCAAiC;QACjC,MAAM,EACJ,OAAO,EACP,OAAO,EACP,aAAa,EACb,GAAG,OAAO,EACX,GAAG,mBAAmB,CAAC;QAExB,MAAM,SAAS,GAA6B;YAC1C,OAAO;YACP,OAAO;YACP,aAAa;SACd,CAAC;QAEF,OAAO,IAAI,OAAO,CAAqC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzE,MAAM,OAAO,GAAwB;gBACnC,OAAO;gBACP,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBAC9D,SAAS,EAAE,SAAkC;gBAC7C,OAAO,EAAE,OAA4D;gBACrE,MAAM;aACP,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,QAA0C;QAC3D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,QAAgD;QACtD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,+EAA+E;IAC/E,kBAAkB;IAClB,+EAA+E;IAEvE,aAAa,CAAC,OAAe,EAAE,OAA0B;QAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAuB;YAClC,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE;gBACZ,OAAO;gBACP,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC;wBACE,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,eAAe,EAAE,OAAO,CAAC,eAAe;wBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,aAAa,EAAE,OAAO,CAAC,aAAa;wBACpC,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,YAAY,EAAE,OAAO,CAAC,YAAY;wBAClC,SAAS,EAAE,OAAO,CAAC,SAAS;qBAC7B;oBACH,CAAC,CAAC,SAAS;aACd;SACF,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,eAAe,CAAC,cAAsB;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAyB;YACpC,IAAI,EAAE,aAAa;YACnB,cAAc;SACf,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,OAAO,CAAC,OAAe,EAAE,OAAgB,EAAE,KAAc;QAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAiB;YAC5B,IAAI,EAAE,KAAK;YACX,OAAO;YACP,OAAO;SACR,CAAC;QAEF,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7C,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QAE5B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,qBAAqB;gBACxB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;wBAC9C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;oBACzD,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,qBAAqB,CACxB,GAAG,CAAC,OAAO,EACX,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,wBAAwB,GAAG,CAAC,IAAI,EAAE,CAAC,CAC7D,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM;YAER,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC9D,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,KAAK,GAAsB;wBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;qBACzB,CAAC;oBACF,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,SAAS,GAA0B;oBACvC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC;gBAEF,6BAA6B;gBAC7B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACrC,EAAE,CAAC,SAAS,CAAC,CAAC;gBAChB,CAAC;gBAED,qCAAqC;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC9D,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM;YACR,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,SAAS,GAA0B;oBACvC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,CAAC;gBACF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACrC,EAAE,CAAC,SAAS,CAAC,CAAC;gBAChB,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,cAAsB;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE7B,kBAAkB;QAClB,MAAM,MAAM,GAAuB;YACjC,EAAE,EAAE,cAAc;YAClB,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAE9C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC;QAE1D,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAwB;gBACtC,EAAE,EAAE,cAAc;gBAClB,OAAO;gBACP,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBACvD,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;oBACvB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBACD,GAAG,EAAE,CAAC,OAAe,EAAE,KAAc,EAAE,EAAE;oBACvC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBACpC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBACD,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;oBACxB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC9B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;aACF,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAiB;gBACxB,EAAE,EAAE,cAAc;gBAClB,OAAO;gBACP,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;aACxD,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,OAAe,EAAE,KAAY;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEO,eAAe,CAAC,cAAsB;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,sBAAsB,CAAC,KAAsB;QACnD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1C,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;QACD,kCAAkC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;QACvC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,gBAAgB,CAC5B,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAC7B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACxB,6CAA6C;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAgC;IAEhC,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|