@ironflow/node 0.20.2 → 0.21.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.
Files changed (145) hide show
  1. package/dist/agent/agent.d.ts +60 -0
  2. package/dist/agent/agent.d.ts.map +1 -0
  3. package/dist/agent/agent.js +133 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/approve.d.ts +23 -0
  6. package/dist/agent/approve.d.ts.map +1 -0
  7. package/dist/agent/approve.js +42 -0
  8. package/dist/agent/approve.js.map +1 -0
  9. package/dist/agent/dispatch.d.ts +63 -0
  10. package/dist/agent/dispatch.d.ts.map +1 -0
  11. package/dist/agent/dispatch.js +130 -0
  12. package/dist/agent/dispatch.js.map +1 -0
  13. package/dist/agent/errors.d.ts +90 -0
  14. package/dist/agent/errors.d.ts.map +1 -0
  15. package/dist/agent/errors.js +136 -0
  16. package/dist/agent/errors.js.map +1 -0
  17. package/dist/agent/index.d.ts +35 -0
  18. package/dist/agent/index.d.ts.map +1 -0
  19. package/dist/agent/index.js +32 -0
  20. package/dist/agent/index.js.map +1 -0
  21. package/dist/agent/internal-registry.d.ts +27 -0
  22. package/dist/agent/internal-registry.d.ts.map +1 -0
  23. package/dist/agent/internal-registry.js +36 -0
  24. package/dist/agent/internal-registry.js.map +1 -0
  25. package/dist/agent/internal.d.ts +24 -0
  26. package/dist/agent/internal.d.ts.map +1 -0
  27. package/dist/agent/internal.js +29 -0
  28. package/dist/agent/internal.js.map +1 -0
  29. package/dist/agent/llm.d.ts +39 -0
  30. package/dist/agent/llm.d.ts.map +1 -0
  31. package/dist/agent/llm.js +59 -0
  32. package/dist/agent/llm.js.map +1 -0
  33. package/dist/agent/mcp.d.ts +51 -0
  34. package/dist/agent/mcp.d.ts.map +1 -0
  35. package/dist/agent/mcp.js +155 -0
  36. package/dist/agent/mcp.js.map +1 -0
  37. package/dist/agent/memory.d.ts +74 -0
  38. package/dist/agent/memory.d.ts.map +1 -0
  39. package/dist/agent/memory.js +130 -0
  40. package/dist/agent/memory.js.map +1 -0
  41. package/dist/agent/spawn.d.ts +20 -0
  42. package/dist/agent/spawn.d.ts.map +1 -0
  43. package/dist/agent/spawn.js +29 -0
  44. package/dist/agent/spawn.js.map +1 -0
  45. package/dist/agent/tool.d.ts +39 -0
  46. package/dist/agent/tool.d.ts.map +1 -0
  47. package/dist/agent/tool.js +103 -0
  48. package/dist/agent/tool.js.map +1 -0
  49. package/dist/agent/types.d.ts +363 -0
  50. package/dist/agent/types.d.ts.map +1 -0
  51. package/dist/agent/types.js +9 -0
  52. package/dist/agent/types.js.map +1 -0
  53. package/dist/client.d.ts +942 -0
  54. package/dist/client.d.ts.map +1 -0
  55. package/dist/client.js +1557 -0
  56. package/dist/client.js.map +1 -0
  57. package/dist/command-dedup.d.ts +61 -0
  58. package/dist/command-dedup.d.ts.map +1 -0
  59. package/dist/command-dedup.js +129 -0
  60. package/dist/command-dedup.js.map +1 -0
  61. package/dist/config-client.d.ts +58 -0
  62. package/dist/config-client.d.ts.map +1 -0
  63. package/dist/config-client.js +171 -0
  64. package/dist/config-client.js.map +1 -0
  65. package/dist/function.d.ts +53 -0
  66. package/dist/function.d.ts.map +1 -0
  67. package/dist/function.js +72 -0
  68. package/dist/function.js.map +1 -0
  69. package/dist/index.d.ts +71 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +70 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/internal/assert-defined.d.ts +10 -0
  74. package/dist/internal/assert-defined.d.ts.map +1 -0
  75. package/dist/internal/assert-defined.js +15 -0
  76. package/dist/internal/assert-defined.js.map +1 -0
  77. package/dist/internal/context.d.ts +142 -0
  78. package/dist/internal/context.d.ts.map +1 -0
  79. package/dist/internal/context.js +306 -0
  80. package/dist/internal/context.js.map +1 -0
  81. package/dist/internal/errors.d.ts +66 -0
  82. package/dist/internal/errors.d.ts.map +1 -0
  83. package/dist/internal/errors.js +29 -0
  84. package/dist/internal/errors.js.map +1 -0
  85. package/dist/internal/run-context.d.ts +10 -0
  86. package/dist/internal/run-context.d.ts.map +1 -0
  87. package/dist/internal/run-context.js +23 -0
  88. package/dist/internal/run-context.js.map +1 -0
  89. package/dist/kv.d.ts +86 -0
  90. package/dist/kv.d.ts.map +1 -0
  91. package/dist/kv.js +261 -0
  92. package/dist/kv.js.map +1 -0
  93. package/dist/projection-runner.d.ts +83 -0
  94. package/dist/projection-runner.d.ts.map +1 -0
  95. package/dist/projection-runner.js +498 -0
  96. package/dist/projection-runner.js.map +1 -0
  97. package/dist/projection.d.ts +36 -0
  98. package/dist/projection.d.ts.map +1 -0
  99. package/dist/projection.js +55 -0
  100. package/dist/projection.js.map +1 -0
  101. package/dist/secrets.d.ts +6 -0
  102. package/dist/secrets.d.ts.map +1 -0
  103. package/dist/secrets.js +19 -0
  104. package/dist/secrets.js.map +1 -0
  105. package/dist/serve.d.ts +71 -0
  106. package/dist/serve.d.ts.map +1 -0
  107. package/dist/serve.js +460 -0
  108. package/dist/serve.js.map +1 -0
  109. package/dist/step.d.ts +18 -0
  110. package/dist/step.d.ts.map +1 -0
  111. package/dist/step.js +581 -0
  112. package/dist/step.js.map +1 -0
  113. package/dist/subscribe.d.ts +164 -0
  114. package/dist/subscribe.d.ts.map +1 -0
  115. package/dist/subscribe.js +487 -0
  116. package/dist/subscribe.js.map +1 -0
  117. package/dist/test/index.d.ts +22 -0
  118. package/dist/test/index.d.ts.map +1 -0
  119. package/dist/test/index.js +112 -0
  120. package/dist/test/index.js.map +1 -0
  121. package/dist/test/test-step.d.ts +21 -0
  122. package/dist/test/test-step.d.ts.map +1 -0
  123. package/dist/test/test-step.js +83 -0
  124. package/dist/test/test-step.js.map +1 -0
  125. package/dist/types.d.ts +108 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +5 -0
  128. package/dist/types.js.map +1 -0
  129. package/dist/version.d.ts +2 -0
  130. package/dist/version.d.ts.map +1 -0
  131. package/dist/version.js +4 -0
  132. package/dist/version.js.map +1 -0
  133. package/dist/webhook.d.ts +22 -0
  134. package/dist/webhook.d.ts.map +1 -0
  135. package/dist/webhook.js +23 -0
  136. package/dist/webhook.js.map +1 -0
  137. package/dist/worker-streaming.d.ts +17 -0
  138. package/dist/worker-streaming.d.ts.map +1 -0
  139. package/dist/worker-streaming.js +510 -0
  140. package/dist/worker-streaming.js.map +1 -0
  141. package/dist/worker.d.ts +28 -0
  142. package/dist/worker.d.ts.map +1 -0
  143. package/dist/worker.js +559 -0
  144. package/dist/worker.js.map +1 -0
  145. package/package.json +3 -3
@@ -0,0 +1,164 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EAEpB,MAAM,gBAAgB,CAAC;AAaxB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM1C;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,uCAAuC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjD,2CAA2C;IAC3C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAClD;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAUI;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,WAAW,CAAkC;IAGrD,OAAO,CAAC,mBAAmB,CACf;IACZ,OAAO,CAAC,cAAc,CACV;gBAEA,MAAM,EAAE,wBAAwB;IA2B5C,+BAA+B;IAC/B,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,sCAAsC;IACtC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuF9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,OAAO,EAAE,MAAM,EACf,mBAAmB,GAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,gBAAqB,GACpE,OAAO,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAsC9C;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1E;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IASrE,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,aAAa;IA2ErB,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,mBAAmB;CAM5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,kBAAkB,CAEpB"}
@@ -0,0 +1,487 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"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"}