@ironflow/browser 0.1.0-test.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.
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ConnectRPC transport implementation for browser
3
+ *
4
+ * Uses @connectrpc/connect-web for browser-compatible gRPC communication.
5
+ */
6
+ import type { ConnectionState, SubscribeOptions as CoreSubscribeOptions, AckType } from "@ironflow/core";
7
+ import type { Transport, TransportCallbacks, TransportOptions } from "./types.js";
8
+ /**
9
+ * ConnectRPC-based transport for browser subscriptions
10
+ *
11
+ * Uses server streaming for auto-ack mode subscriptions.
12
+ */
13
+ export declare class ConnectRPCTransport implements Transport {
14
+ private readonly serverUrl;
15
+ private readonly options;
16
+ private callbacks?;
17
+ private webTransport;
18
+ private client;
19
+ private _connectionState;
20
+ private reconnectAttempt;
21
+ private reconnectTimer;
22
+ private paused;
23
+ private activeSubscriptions;
24
+ private subscriptionIdCounter;
25
+ constructor(serverUrl: string, options: TransportOptions);
26
+ get connectionState(): ConnectionState;
27
+ setCallbacks(callbacks: TransportCallbacks): void;
28
+ connect(): Promise<void>;
29
+ disconnect(): void;
30
+ subscribe(pattern: string, options?: CoreSubscribeOptions): void;
31
+ unsubscribe(subscriptionId: string): void;
32
+ ack(eventId: string, type: AckType, _delay?: number): Promise<void>;
33
+ pause(): void;
34
+ resume(): void;
35
+ /**
36
+ * Start the subscription stream for a given subscription
37
+ */
38
+ private startSubscriptionStream;
39
+ /**
40
+ * Convert protobuf event to SDK event
41
+ */
42
+ private convertProtoEvent;
43
+ /**
44
+ * Handle disconnection
45
+ */
46
+ private handleDisconnect;
47
+ /**
48
+ * Schedule a reconnection attempt
49
+ */
50
+ private scheduleReconnect;
51
+ /**
52
+ * Clear the reconnect timer
53
+ */
54
+ private clearReconnectTimer;
55
+ }
56
+ /**
57
+ * Create a ConnectRPC transport for browser
58
+ */
59
+ export declare function createConnectRPCTransport(serverUrl: string, options: TransportOptions): Transport;
60
+ //# sourceMappingURL=connectrpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectrpc.d.ts","sourceRoot":"","sources":["../../src/transport/connectrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,IAAI,oBAAoB,EACxC,OAAO,EAER,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAwClF;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,YAAY,CAAsD;IAC1E,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,qBAAqB,CAAK;gBAEtB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;IAKxD,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,YAAY,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAI3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC9B,UAAU,IAAI,IAAI;IAgBlB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAqBhE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzE,KAAK,IAAI,IAAI;IAeb,MAAM,IAAI,IAAI;IAOd;;OAEG;YACW,uBAAuB;IAqErC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,SAAS,CAEX"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * ConnectRPC transport implementation for browser
3
+ *
4
+ * Uses @connectrpc/connect-web for browser-compatible gRPC communication.
5
+ */
6
+ import { createClient } from "@connectrpc/connect";
7
+ import { createConnectTransport as createWebTransport } from "@connectrpc/connect-web";
8
+ import { create } from "@bufbuild/protobuf";
9
+ import { PubSubService, calculateBackoff, } from "@ironflow/core";
10
+ import { SubscribeRequestSchema, SubscribeOptionsSchema, AckMode as ProtoAckMode, BackpressureMode as ProtoBackpressureMode, } from "@ironflow/core/gen";
11
+ /**
12
+ * Convert SDK ack mode to protobuf enum
13
+ */
14
+ function toProtoAckMode(mode) {
15
+ switch (mode) {
16
+ case "manual":
17
+ return ProtoAckMode.MANUAL;
18
+ case "auto":
19
+ default:
20
+ return ProtoAckMode.AUTO;
21
+ }
22
+ }
23
+ /**
24
+ * Convert SDK backpressure mode to protobuf enum
25
+ */
26
+ function toProtoBackpressureMode(mode) {
27
+ switch (mode) {
28
+ case "drop":
29
+ return ProtoBackpressureMode.DROP;
30
+ case "block":
31
+ return ProtoBackpressureMode.BLOCK;
32
+ case "buffer":
33
+ default:
34
+ return ProtoBackpressureMode.BUFFER;
35
+ }
36
+ }
37
+ /**
38
+ * ConnectRPC-based transport for browser subscriptions
39
+ *
40
+ * Uses server streaming for auto-ack mode subscriptions.
41
+ */
42
+ export class ConnectRPCTransport {
43
+ serverUrl;
44
+ options;
45
+ callbacks;
46
+ webTransport = null;
47
+ client = null;
48
+ _connectionState = "disconnected";
49
+ reconnectAttempt = 0;
50
+ reconnectTimer = null;
51
+ paused = false;
52
+ // Subscription tracking
53
+ activeSubscriptions = new Map();
54
+ subscriptionIdCounter = 0;
55
+ constructor(serverUrl, options) {
56
+ this.serverUrl = serverUrl;
57
+ this.options = options;
58
+ }
59
+ get connectionState() {
60
+ return this._connectionState;
61
+ }
62
+ setCallbacks(callbacks) {
63
+ this.callbacks = callbacks;
64
+ }
65
+ async connect() {
66
+ if (this._connectionState === "connected") {
67
+ return;
68
+ }
69
+ if (this.paused) {
70
+ return;
71
+ }
72
+ this._connectionState = "connecting";
73
+ this.callbacks?.onConnectionChange("connecting");
74
+ try {
75
+ // Create ConnectRPC transport for web
76
+ this.webTransport = createWebTransport({
77
+ baseUrl: this.serverUrl,
78
+ });
79
+ // Create the PubSub client
80
+ // Type assertion needed due to connect-es v1/v2 type mismatch
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
+ this.client = createClient(PubSubService, this.webTransport);
83
+ // Mark as connected
84
+ this._connectionState = "connected";
85
+ this.reconnectAttempt = 0;
86
+ this.callbacks?.onConnectionChange("connected");
87
+ // Resubscribe all pending subscriptions
88
+ for (const [id, sub] of this.activeSubscriptions) {
89
+ this.startSubscriptionStream(id, sub);
90
+ }
91
+ }
92
+ catch (error) {
93
+ this._connectionState = "disconnected";
94
+ this.callbacks?.onConnectionChange("disconnected");
95
+ throw error;
96
+ }
97
+ }
98
+ disconnect() {
99
+ this.clearReconnectTimer();
100
+ this.paused = false;
101
+ // Abort all active subscriptions
102
+ for (const sub of this.activeSubscriptions.values()) {
103
+ sub.abortController.abort();
104
+ }
105
+ this.webTransport = null;
106
+ this.client = null;
107
+ this._connectionState = "disconnected";
108
+ this.activeSubscriptions.clear();
109
+ this.callbacks?.onConnectionChange("disconnected");
110
+ }
111
+ subscribe(pattern, options) {
112
+ const subscriptionId = `crpc-sub-${++this.subscriptionIdCounter}`;
113
+ // Create abort controller for this subscription
114
+ const abortController = new AbortController();
115
+ // Track the subscription
116
+ const activeSub = {
117
+ pattern,
118
+ options,
119
+ abortController,
120
+ };
121
+ this.activeSubscriptions.set(subscriptionId, activeSub);
122
+ // Start streaming if connected
123
+ if (this._connectionState === "connected") {
124
+ this.startSubscriptionStream(subscriptionId, activeSub);
125
+ }
126
+ }
127
+ unsubscribe(subscriptionId) {
128
+ const sub = this.activeSubscriptions.get(subscriptionId);
129
+ if (sub) {
130
+ sub.abortController.abort();
131
+ this.activeSubscriptions.delete(subscriptionId);
132
+ }
133
+ }
134
+ async ack(eventId, type, _delay) {
135
+ // Manual acks are not yet supported in the browser transport
136
+ // The server streaming only supports auto-ack mode
137
+ // Bidirectional streaming would be needed for manual acks
138
+ throw new Error(`Manual acknowledgments are not yet supported in the browser transport. ` +
139
+ `Cannot send ${type} for event ${eventId}. ` +
140
+ `Use ackMode: "auto" (default) or use WebSocket transport for manual acks.`);
141
+ }
142
+ pause() {
143
+ this.paused = true;
144
+ this.clearReconnectTimer();
145
+ // Abort all active streams
146
+ for (const sub of this.activeSubscriptions.values()) {
147
+ sub.abortController.abort();
148
+ // Create new abort controller for resume
149
+ sub.abortController = new AbortController();
150
+ }
151
+ this._connectionState = "disconnected";
152
+ this.callbacks?.onConnectionChange("disconnected");
153
+ }
154
+ resume() {
155
+ this.paused = false;
156
+ this.connect().catch(() => {
157
+ // Will retry via reconnect logic
158
+ });
159
+ }
160
+ /**
161
+ * Start the subscription stream for a given subscription
162
+ */
163
+ async startSubscriptionStream(subscriptionId, sub) {
164
+ if (!this.client)
165
+ return;
166
+ try {
167
+ // Build subscribe request using protobuf create()
168
+ const request = create(SubscribeRequestSchema, {
169
+ pattern: sub.pattern,
170
+ options: create(SubscribeOptionsSchema, {
171
+ replay: sub.options?.replay ?? 0,
172
+ includeMetadata: sub.options?.includeMetadata ?? false,
173
+ filter: sub.options?.filter ?? "",
174
+ namespace: sub.options?.namespace ?? "default",
175
+ consumerGroup: sub.options?.consumerGroup ?? "",
176
+ ackMode: toProtoAckMode(sub.options?.ackMode),
177
+ backpressure: toProtoBackpressureMode(sub.options?.backpressure),
178
+ }),
179
+ });
180
+ // Notify subscription started
181
+ sub.subscriptionId = subscriptionId;
182
+ this.callbacks?.onSubscribed(sub.pattern, subscriptionId);
183
+ // Start server streaming
184
+ const stream = this.client.subscribe(request, {
185
+ signal: sub.abortController.signal,
186
+ });
187
+ // Process events from the stream
188
+ for await (const event of stream) {
189
+ // Check if subscription was cancelled
190
+ if (!this.activeSubscriptions.has(subscriptionId)) {
191
+ break;
192
+ }
193
+ // Convert protobuf event to SDK event
194
+ const subscriptionEvent = this.convertProtoEvent(event);
195
+ // Invoke callback
196
+ this.callbacks?.onEvent(subscriptionId, subscriptionEvent);
197
+ }
198
+ }
199
+ catch (error) {
200
+ // Ignore abort errors
201
+ if (error.name === "AbortError") {
202
+ return;
203
+ }
204
+ // Check if subscription still exists
205
+ if (!this.activeSubscriptions.has(subscriptionId)) {
206
+ return;
207
+ }
208
+ // Handle connection errors
209
+ this.callbacks?.onError(subscriptionId, {
210
+ subscriptionId,
211
+ code: "STREAM_ERROR",
212
+ message: error.message,
213
+ retrying: this.options.autoReconnect,
214
+ });
215
+ // Trigger reconnect if enabled
216
+ if (this.options.autoReconnect && this._connectionState === "connected") {
217
+ this.handleDisconnect();
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Convert protobuf event to SDK event
223
+ */
224
+ convertProtoEvent(event) {
225
+ // Convert timestamp - protobuf Timestamp has seconds and nanos fields
226
+ let timestamp = new Date().toISOString();
227
+ if (event.metadata?.timestamp) {
228
+ const ts = event.metadata.timestamp;
229
+ // Timestamp has seconds (bigint) and nanos (number)
230
+ const ms = Number(ts.seconds) * 1000 + Math.floor(ts.nanos / 1000000);
231
+ timestamp = new Date(ms).toISOString();
232
+ }
233
+ return {
234
+ topic: event.topic,
235
+ data: (event.data ?? {}),
236
+ meta: event.metadata
237
+ ? {
238
+ timestamp,
239
+ sequence: Number(event.sequence),
240
+ }
241
+ : undefined,
242
+ eventId: event.eventId,
243
+ };
244
+ }
245
+ /**
246
+ * Handle disconnection
247
+ */
248
+ handleDisconnect() {
249
+ const wasConnected = this._connectionState === "connected";
250
+ this._connectionState = "disconnected";
251
+ if (wasConnected) {
252
+ this.callbacks?.onConnectionChange("disconnected");
253
+ }
254
+ // Schedule reconnection if enabled
255
+ if (this.options.autoReconnect && !this.paused) {
256
+ this.scheduleReconnect();
257
+ }
258
+ }
259
+ /**
260
+ * Schedule a reconnection attempt
261
+ */
262
+ scheduleReconnect() {
263
+ if (this.reconnectTimer || this.paused) {
264
+ return;
265
+ }
266
+ this._connectionState = "reconnecting";
267
+ this.callbacks?.onConnectionChange("reconnecting");
268
+ this.reconnectAttempt++;
269
+ const delay = calculateBackoff(this.reconnectAttempt, this.options.reconnectDelay, this.options.maxReconnectDelay, this.options.reconnectBackoff);
270
+ this.reconnectTimer = setTimeout(() => {
271
+ this.reconnectTimer = null;
272
+ // Reset abort controllers for reconnect
273
+ for (const sub of this.activeSubscriptions.values()) {
274
+ sub.abortController = new AbortController();
275
+ }
276
+ this.connect().catch(() => {
277
+ // Will trigger another reconnect via handleDisconnect
278
+ this.handleDisconnect();
279
+ });
280
+ }, delay);
281
+ }
282
+ /**
283
+ * Clear the reconnect timer
284
+ */
285
+ clearReconnectTimer() {
286
+ if (this.reconnectTimer) {
287
+ clearTimeout(this.reconnectTimer);
288
+ this.reconnectTimer = null;
289
+ }
290
+ }
291
+ }
292
+ /**
293
+ * Create a ConnectRPC transport for browser
294
+ */
295
+ export function createConnectRPCTransport(serverUrl, options) {
296
+ return new ConnectRPCTransport(serverUrl, options);
297
+ }
298
+ //# sourceMappingURL=connectrpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectrpc.js","sourceRoot":"","sources":["../../src/transport/connectrpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Transport layer exports
3
+ */
4
+ export type { Transport, TransportCallbacks, TransportFactory, TransportOptions, } from "./types.js";
5
+ export { WebSocketTransport, createWebSocketTransport } from "./websocket.js";
6
+ export { ConnectRPCTransport, createConnectRPCTransport } from "./connectrpc.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Transport layer exports
3
+ */
4
+ export { WebSocketTransport, createWebSocketTransport } from "./websocket.js";
5
+ export { ConnectRPCTransport, createConnectRPCTransport } from "./connectrpc.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Transport layer type definitions
3
+ */
4
+ import type { SubscriptionEvent, SubscriptionErrorInfo, ConnectionState, SubscribeOptions, AckType } from "@ironflow/core";
5
+ /**
6
+ * Transport callbacks
7
+ */
8
+ export interface TransportCallbacks {
9
+ /** Called when an event is received */
10
+ onEvent: (subscriptionId: string, event: SubscriptionEvent) => void;
11
+ /** Called when a subscription error occurs */
12
+ onError: (subscriptionId: string, error: SubscriptionErrorInfo) => void;
13
+ /** Called when connection state changes */
14
+ onConnectionChange: (state: ConnectionState) => void;
15
+ /** Called when a subscription is confirmed */
16
+ onSubscribed: (pattern: string, subscriptionId: string) => void;
17
+ /** Called when a subscription fails */
18
+ onSubscribeFailed: (pattern: string, error: Error) => void;
19
+ }
20
+ /**
21
+ * Transport interface for subscription connections
22
+ */
23
+ export interface Transport {
24
+ /** Current connection state */
25
+ readonly connectionState: ConnectionState;
26
+ /** Connect to the server */
27
+ connect(): Promise<void>;
28
+ /** Disconnect from the server */
29
+ disconnect(): void;
30
+ /** Subscribe to a pattern */
31
+ subscribe(pattern: string, options?: SubscribeOptions): void;
32
+ /** Unsubscribe from a subscription */
33
+ unsubscribe(subscriptionId: string): void;
34
+ /** Send acknowledgment for an event */
35
+ ack(eventId: string, type: AckType, delay?: number): Promise<void>;
36
+ /** Set callbacks */
37
+ setCallbacks(callbacks: TransportCallbacks): void;
38
+ /** Pause the connection (for tab visibility) */
39
+ pause(): void;
40
+ /** Resume the connection */
41
+ resume(): void;
42
+ }
43
+ /**
44
+ * Transport factory function type
45
+ */
46
+ export type TransportFactory = (serverUrl: string, options: TransportOptions) => Transport;
47
+ /**
48
+ * Transport options
49
+ */
50
+ export interface TransportOptions {
51
+ /** Authentication headers */
52
+ auth?: {
53
+ apiKey?: string;
54
+ token?: string;
55
+ };
56
+ /** Auto-reconnect enabled */
57
+ autoReconnect: boolean;
58
+ /** Initial reconnect delay */
59
+ reconnectDelay: number;
60
+ /** Max reconnect delay */
61
+ maxReconnectDelay: number;
62
+ /** Reconnect backoff multiplier */
63
+ reconnectBackoff: number;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,OAAO,EACR,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpE,8CAA8C;IAC9C,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxE,2CAA2C;IAC3C,kBAAkB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,8CAA8C;IAC9C,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,uCAAuC;IACvC,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C,4BAA4B;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,iCAAiC;IACjC,UAAU,IAAI,IAAI,CAAC;IAEnB,6BAA6B;IAC7B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE7D,sCAAsC;IACtC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,uCAAuC;IACvC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,oBAAoB;IACpB,YAAY,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAElD,gDAAgD;IAChD,KAAK,IAAI,IAAI,CAAC;IAEd,4BAA4B;IAC5B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,KACtB,SAAS,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,6BAA6B;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Transport layer type definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * WebSocket transport implementation
3
+ */
4
+ import type { ConnectionState, SubscribeOptions, AckType } from "@ironflow/core";
5
+ import type { Transport, TransportCallbacks, TransportOptions } from "./types.js";
6
+ /**
7
+ * WebSocket-based transport for subscriptions
8
+ */
9
+ export declare class WebSocketTransport implements Transport {
10
+ private readonly wsUrl;
11
+ private readonly options;
12
+ private callbacks?;
13
+ private ws;
14
+ private _connectionState;
15
+ private reconnectAttempt;
16
+ private reconnectTimer;
17
+ private paused;
18
+ private pendingSubscriptions;
19
+ constructor(serverUrl: string, options: TransportOptions);
20
+ get connectionState(): ConnectionState;
21
+ setCallbacks(callbacks: TransportCallbacks): void;
22
+ connect(): Promise<void>;
23
+ disconnect(): void;
24
+ subscribe(pattern: string, options?: SubscribeOptions): void;
25
+ unsubscribe(subscriptionId: string): void;
26
+ ack(eventId: string, type: AckType, delay?: number): Promise<void>;
27
+ pause(): void;
28
+ resume(): void;
29
+ private sendSubscribe;
30
+ private handleMessage;
31
+ private scheduleReconnect;
32
+ private clearReconnectTimer;
33
+ }
34
+ /**
35
+ * Create a WebSocket transport
36
+ */
37
+ export declare function createWebSocketTransport(serverUrl: string, options: TransportOptions): Transport;
38
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,OAAO,EAER,MAAM,gBAAgB,CAAC;AASxB,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,oBAAoB,CAAwD;gBAExE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;IAKxD,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,YAAY,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAI3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgE9B,UAAU,IAAI,IAAI;IAclB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAQ5D,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAYnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxE,KAAK,IAAI,IAAI;IAab,MAAM,IAAI,IAAI;IAOd,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,aAAa;IA4DrB,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,mBAAmB;CAM5B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,SAAS,CAEX"}