@usageflow/core 0.1.3 → 0.1.5

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/dist/base.d.ts CHANGED
@@ -1,23 +1,29 @@
1
- import { Route, UsageFlowConfig, RoutesMap, Headers } from "./types";
1
+ import { Route, UsageFlowConfig, RoutesMap, Headers, RequestForAllocation, RequestMetadata, UsageFlowRequest } from "./types";
2
+ import { UsageFlowSocketManger } from "./socket";
2
3
  export declare abstract class UsageFlowAPI {
3
4
  protected apiKey: string | null;
4
5
  protected usageflowUrl: string;
5
- protected apiConfig: UsageFlowConfig | null;
6
+ protected webServer: 'express' | 'fastify' | 'nestjs';
7
+ protected apiConfigs: UsageFlowConfig[];
6
8
  private configUpdateInterval;
9
+ socketManager: UsageFlowSocketManger | null;
10
+ private applicationId;
7
11
  /**
8
12
  * Initialize the UsageFlow API with credentials
9
13
  */
10
14
  init(apiKey: string, usageflowUrl?: string): UsageFlowAPI;
15
+ setWebServer(webServer: 'express' | 'fastify' | 'nestjs'): void;
11
16
  getApiKey(): string | null;
12
17
  getUsageflowUrl(): string;
13
18
  /**
14
19
  * Start background config update process
15
20
  */
16
21
  private startConfigUpdater;
17
- /**
18
- * Fetch API configuration from UsageFlow
19
- */
20
- private fetchApiConfig;
22
+ protected getRoutePattern(request: UsageFlowRequest): string;
23
+ guessLedgerId(request: UsageFlowRequest): string;
24
+ private fetchApiPolicies;
25
+ useAllocationRequest(payload: RequestForAllocation): Promise<void>;
26
+ allocationRequest(request: UsageFlowRequest, payload: RequestForAllocation, metadata: RequestMetadata): Promise<void>;
21
27
  /**
22
28
  * Convert routes list to a map for faster lookup
23
29
  */
@@ -39,6 +45,10 @@ export declare abstract class UsageFlowAPI {
39
45
  */
40
46
  destroy(): void;
41
47
  extractBearerToken(authHeader?: string): string | null;
48
+ /**
49
+ * Get header value from headers object (handles both Record and Headers types)
50
+ */
51
+ private getHeaderValue;
42
52
  /**
43
53
  * Decodes a JWT token without verifying the signature
44
54
  * @param token The JWT token to decode
package/dist/base.js CHANGED
@@ -1,17 +1,16 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.UsageFlowAPI = void 0;
7
- const axios_1 = __importDefault(require("axios"));
8
- const types_1 = require("./types");
4
+ const socket_1 = require("./socket");
9
5
  class UsageFlowAPI {
10
6
  constructor() {
11
7
  this.apiKey = null;
12
8
  this.usageflowUrl = "https://api.usageflow.io";
13
- this.apiConfig = null;
9
+ this.webServer = 'express';
10
+ this.apiConfigs = [];
14
11
  this.configUpdateInterval = null;
12
+ this.socketManager = null;
13
+ this.applicationId = false;
15
14
  }
16
15
  /**
17
16
  * Initialize the UsageFlow API with credentials
@@ -19,9 +18,19 @@ class UsageFlowAPI {
19
18
  init(apiKey, usageflowUrl = "https://api.usageflow.io") {
20
19
  this.apiKey = apiKey;
21
20
  this.usageflowUrl = usageflowUrl;
22
- this.startConfigUpdater();
21
+ // this.startConfigUpdater();
22
+ this.socketManager = new socket_1.UsageFlowSocketManger(apiKey);
23
+ // Connect the socket manager
24
+ this.socketManager.connect().catch((error) => {
25
+ console.error("[UsageFlow] Failed to establish WebSocket connection:", error);
26
+ }).then(() => {
27
+ this.startConfigUpdater();
28
+ });
23
29
  return this;
24
30
  }
31
+ setWebServer(webServer) {
32
+ this.webServer = webServer;
33
+ }
25
34
  getApiKey() {
26
35
  return this.apiKey;
27
36
  }
@@ -36,35 +45,231 @@ class UsageFlowAPI {
36
45
  clearInterval(this.configUpdateInterval);
37
46
  }
38
47
  this.configUpdateInterval = setInterval(async () => {
39
- try {
40
- const config = await this.fetchApiConfig();
41
- if (config) {
42
- this.apiConfig = config;
48
+ await this.fetchApiPolicies();
49
+ }, 60000);
50
+ // this.fetchApiConfig().catch(console.error);
51
+ }
52
+ getRoutePattern(request) {
53
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
54
+ if (this.webServer === 'fastify') {
55
+ return ((_a = request === null || request === void 0 ? void 0 : request.routeOptions) === null || _a === void 0 ? void 0 : _a.url) || request.url || '';
56
+ }
57
+ const routePattern = ((_b = request.route) === null || _b === void 0 ? void 0 : _b.path) || ((_d = (_c = request.app._router.stack.find((route) => {
58
+ // a => a.path == request.url
59
+ if (!route.route)
60
+ return false;
61
+ if (route.path) {
62
+ return route.path == request.url;
63
+ }
64
+ if (route.regexp) {
65
+ return route.regexp.test(request.url);
66
+ }
67
+ })) === null || _c === void 0 ? void 0 : _c.route) === null || _d === void 0 ? void 0 : _d.path);
68
+ if (routePattern) {
69
+ return routePattern;
70
+ }
71
+ // Method 1: Use request.route.path (available after route matching)
72
+ if ((_e = request.route) === null || _e === void 0 ? void 0 : _e.path) {
73
+ const baseUrl = request.baseUrl || "";
74
+ const routePath = request.route.path;
75
+ // Combine baseUrl and routePath to get full pattern
76
+ const fullPath = baseUrl + routePath;
77
+ return fullPath || "/";
78
+ }
79
+ // Method 2: Try to find route from router stack
80
+ try {
81
+ const app = request.app;
82
+ const router = app._router;
83
+ if (router && router.stack) {
84
+ const method = request.method.toLowerCase();
85
+ const path = request.path || ((_f = request.url) === null || _f === void 0 ? void 0 : _f.split("?")[0]) || "";
86
+ // Search through router stack for matching route
87
+ for (const layer of router.stack) {
88
+ if (layer.route) {
89
+ const route = layer.route;
90
+ const routePath = route.path;
91
+ const routeMethods = Object.keys(route.methods).map(m => m.toLowerCase());
92
+ // Check if method matches and path pattern matches
93
+ if (routeMethods.includes(method) || routeMethods.includes("*")) {
94
+ // Try to match the pattern by checking if params match
95
+ const pattern = (request.baseUrl || "") + routePath;
96
+ // Simple check: if we have params and the route has params, it might match
97
+ if (request.params && Object.keys(request.params).length > 0) {
98
+ // Check if route path contains the param names
99
+ const paramNames = Object.keys(request.params);
100
+ const routeHasParams = paramNames.some(param => routePath.includes(`:${param}`));
101
+ if (routeHasParams) {
102
+ return pattern;
103
+ }
104
+ }
105
+ else if (!routePath.includes(":")) {
106
+ // If no params in request and route has no params, check exact match
107
+ if (path === pattern || path === routePath) {
108
+ return pattern;
109
+ }
110
+ }
111
+ }
112
+ }
113
+ else if (layer.name === "router" && layer.handle && layer.handle.stack) {
114
+ // Handle router middleware (nested routers)
115
+ const mountPath = layer.regexp.source
116
+ .replace("\\/?", "")
117
+ .replace("(?=\\/|$)", "")
118
+ .replace(/\\\//g, "/")
119
+ .replace(/\^/g, "")
120
+ .replace(/\$/g, "")
121
+ .replace(/\\/g, "");
122
+ for (const subLayer of layer.handle.stack) {
123
+ if (subLayer.route) {
124
+ const route = subLayer.route;
125
+ const routePath = route.path;
126
+ const routeMethods = Object.keys(route.methods).map(m => m.toLowerCase());
127
+ if (routeMethods.includes(method) || routeMethods.includes("*")) {
128
+ const fullPath = mountPath + routePath;
129
+ // Check if this route matches by examining params
130
+ if (request.params && Object.keys(request.params).length > 0) {
131
+ const paramNames = Object.keys(request.params);
132
+ const routeHasParams = paramNames.some(param => routePath.includes(`:${param}`));
133
+ if (routeHasParams) {
134
+ return fullPath;
135
+ }
136
+ }
137
+ else if (!routePath.includes(":")) {
138
+ const currentPath = request.path || ((_g = request.url) === null || _g === void 0 ? void 0 : _g.split("?")[0]) || "";
139
+ if (currentPath === fullPath || currentPath === routePath) {
140
+ return fullPath;
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
43
147
  }
44
148
  }
45
- catch (error) {
46
- console.error("Error fetching API config:", error);
149
+ }
150
+ catch (error) {
151
+ // Silently fail and try next method
152
+ console.debug("[UsageFlow] Could not extract route from router stack:", error);
153
+ }
154
+ // Method 3: Reconstruct pattern from params and path
155
+ if (request.params && Object.keys(request.params).length > 0) {
156
+ let path = request.path || ((_h = request.url) === null || _h === void 0 ? void 0 : _h.split("?")[0]) || "/";
157
+ const baseUrl = request.baseUrl || "";
158
+ // Split path into segments and replace matching segments with param names
159
+ const pathSegments = path.split("/");
160
+ const paramEntries = Object.entries(request.params);
161
+ // Replace segments that match param values with :paramName
162
+ for (let i = 0; i < pathSegments.length; i++) {
163
+ for (const [paramName, paramValue] of paramEntries) {
164
+ if (pathSegments[i] === paramValue) {
165
+ pathSegments[i] = `:${paramName}`;
166
+ break; // Only replace once per segment
167
+ }
168
+ }
47
169
  }
48
- }, 60000);
49
- this.fetchApiConfig().catch(console.error);
170
+ const pattern = baseUrl + pathSegments.join("/");
171
+ return pattern;
172
+ }
173
+ // Fallback: return baseUrl + path or just path
174
+ const baseUrl = request.baseUrl || "";
175
+ const path = request.path || ((_j = request.url) === null || _j === void 0 ? void 0 : _j.split("?")[0]) || "/";
176
+ return baseUrl + path || "/";
50
177
  }
51
- /**
52
- * Fetch API configuration from UsageFlow
53
- */
54
- async fetchApiConfig() {
55
- if (!this.apiKey) {
56
- throw new types_1.UsageFlowError("API key not initialized");
178
+ guessLedgerId(request) {
179
+ var _a, _b, _c;
180
+ const method = request.method;
181
+ const url = this.getRoutePattern(request);
182
+ const configs = this.apiConfigs;
183
+ if (!configs.length) {
184
+ return `${method} ${url}`;
57
185
  }
58
- try {
59
- const response = await axios_1.default.get(`${this.usageflowUrl}/api/v1/strategies/application`, {
60
- headers: { "x-usage-key": this.apiKey },
61
- timeout: 10000,
186
+ for (const config of configs) {
187
+ const fieldName = config.identityFieldName;
188
+ const location = config.identityFieldLocation;
189
+ switch (location) {
190
+ case "path_params":
191
+ if ((_a = request.params) === null || _a === void 0 ? void 0 : _a[fieldName]) {
192
+ return `${method} ${url} ${request.params[fieldName]}`;
193
+ }
194
+ break;
195
+ case "query_params":
196
+ if ((_b = request.query) === null || _b === void 0 ? void 0 : _b[fieldName]) {
197
+ return `${method} ${url} ${request.query[fieldName]}`;
198
+ }
199
+ break;
200
+ case "body":
201
+ if ((_c = request.body) === null || _c === void 0 ? void 0 : _c[fieldName]) {
202
+ return `${method} ${url} ${request.body[fieldName]}`;
203
+ }
204
+ break;
205
+ case "bearer_token":
206
+ const authHeader = this.getHeaderValue(request.headers, 'authorization');
207
+ const token = this.extractBearerToken(authHeader || undefined);
208
+ if (token) {
209
+ const claims = this.decodeJwtUnverified(token);
210
+ if (claims === null || claims === void 0 ? void 0 : claims[fieldName]) {
211
+ return `${method} ${url} ${claims[fieldName]}`;
212
+ }
213
+ }
214
+ break;
215
+ case "headers": {
216
+ const headerValue = this.getHeaderValue(request.headers, fieldName);
217
+ if (headerValue) {
218
+ return `${method} ${url} ${headerValue}`;
219
+ }
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ return `${method} ${url}`;
225
+ }
226
+ async fetchApiPolicies() {
227
+ var _a;
228
+ if (this.socketManager && this.socketManager.isConnected()) {
229
+ const response = await this.socketManager.sendAsync({
230
+ type: "get_application_policies",
231
+ payload: null,
62
232
  });
63
- return response.data;
233
+ if (response.type === 'success') {
234
+ this.apiConfigs = ((_a = response.payload) === null || _a === void 0 ? void 0 : _a.policies) || [];
235
+ }
64
236
  }
65
- catch (error) {
66
- console.error("Error fetching API config:", error);
67
- return null;
237
+ }
238
+ async useAllocationRequest(payload) {
239
+ if (this.socketManager && this.socketManager.isConnected()) {
240
+ this.socketManager.sendAsync({
241
+ type: "use_allocation",
242
+ payload
243
+ }).catch((error) => {
244
+ console.error("[UsageFlow] Error sending finalization via WebSocket:", error);
245
+ throw error;
246
+ });
247
+ }
248
+ }
249
+ async allocationRequest(request, payload, metadata) {
250
+ if (this.socketManager && this.socketManager.isConnected()) {
251
+ try {
252
+ const allocationResponse = await this.socketManager.sendAsync({
253
+ type: "request_for_allocation",
254
+ payload
255
+ });
256
+ if (allocationResponse.type === 'error') {
257
+ throw new Error(allocationResponse.message || allocationResponse.error);
258
+ }
259
+ if (allocationResponse.type === 'success') {
260
+ request.usageflow.eventId = allocationResponse.payload.allocationId;
261
+ request.usageflow.metadata = metadata;
262
+ return;
263
+ }
264
+ else {
265
+ throw new Error(allocationResponse.message || "Unknown error occurred");
266
+ }
267
+ }
268
+ catch (error) {
269
+ console.error("[UsageFlow] WebSocket allocation failed, falling back to HTTP:", error);
270
+ throw error;
271
+ // Fall through to HTTP request
272
+ }
68
273
  }
69
274
  }
70
275
  /**
@@ -152,6 +357,24 @@ class UsageFlowAPI {
152
357
  }
153
358
  return parts[1];
154
359
  }
360
+ /**
361
+ * Get header value from headers object (handles both Record and Headers types)
362
+ */
363
+ getHeaderValue(headers, key) {
364
+ // Check if it's a Headers object (from Fetch API) by checking for the 'get' method
365
+ if (headers && typeof headers.get === 'function') {
366
+ return headers.get(key) || null;
367
+ }
368
+ // Otherwise, treat it as a Record
369
+ const value = headers[key];
370
+ if (typeof value === 'string') {
371
+ return value;
372
+ }
373
+ if (Array.isArray(value) && value.length > 0) {
374
+ return value[0];
375
+ }
376
+ return null;
377
+ }
155
378
  /**
156
379
  * Decodes a JWT token without verifying the signature
157
380
  * @param token The JWT token to decode
package/dist/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
2
  export * from './base';
3
+ export * from './socket';
package/dist/index.js CHANGED
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./types"), exports);
18
18
  __exportStar(require("./base"), exports);
19
+ __exportStar(require("./socket"), exports);
19
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,yCAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,yCAAuB;AACvB,2CAAyB"}
@@ -0,0 +1,21 @@
1
+ import WebSocket from "ws";
2
+ import { UsageFlowSocketMessage, UsageFlowSocketResponse } from "./types";
3
+ export declare class UsageFlowSocketManger {
4
+ private apiKey;
5
+ private ws;
6
+ private wsUrl;
7
+ private wsConnected;
8
+ constructor(apiKey: string);
9
+ establishWebSocketConnection(): Promise<void>;
10
+ connect(): Promise<void>;
11
+ sendAsync<T>(payload: UsageFlowSocketMessage): Promise<UsageFlowSocketResponse<T>>;
12
+ send(payload: UsageFlowSocketMessage): void;
13
+ close(): void;
14
+ isConnected(): boolean;
15
+ getWs(): WebSocket | null;
16
+ private _asyncSend;
17
+ /**
18
+ * Clean up resources including WebSocket connection
19
+ */
20
+ destroy(): void;
21
+ }
package/dist/socket.js ADDED
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UsageFlowSocketManger = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ class UsageFlowSocketManger {
9
+ constructor(apiKey) {
10
+ this.apiKey = apiKey;
11
+ this.ws = null;
12
+ this.wsUrl = "wss://api.usageflow.io/ws";
13
+ this.wsConnected = false;
14
+ this.apiKey = apiKey;
15
+ // Connection is explicit - call connect() when ready
16
+ // Do NOT auto-connect in constructor to avoid immediate execution
17
+ }
18
+ async establishWebSocketConnection() {
19
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
20
+ this.wsConnected = true;
21
+ return;
22
+ }
23
+ if (!this.apiKey) {
24
+ console.warn("[UsageFlow] Cannot establish WebSocket connection: API key not initialized");
25
+ return;
26
+ }
27
+ return new Promise((resolve, reject) => {
28
+ try {
29
+ if (!this.apiKey) {
30
+ reject(new Error("API key not available"));
31
+ return;
32
+ }
33
+ const headers = {
34
+ "x-usage-key": this.apiKey,
35
+ };
36
+ this.ws = new ws_1.default(this.wsUrl, {
37
+ headers,
38
+ family: 4 // This forces IPv4
39
+ });
40
+ this.ws.on("open", () => {
41
+ this.wsConnected = true;
42
+ resolve();
43
+ });
44
+ this.ws.on("error", (error) => {
45
+ console.error("[UsageFlow] WebSocket error:", error);
46
+ this.wsConnected = false;
47
+ reject(error);
48
+ });
49
+ this.ws.on("close", () => {
50
+ this.wsConnected = false;
51
+ // Attempt to reconnect after a delay
52
+ setTimeout(() => {
53
+ if (this.apiKey) {
54
+ this.establishWebSocketConnection().catch(console.error);
55
+ }
56
+ }, 5000);
57
+ });
58
+ this.ws.on("message", (data) => {
59
+ // Message handling done in _asyncSend
60
+ });
61
+ }
62
+ catch (error) {
63
+ console.error("[UsageFlow] Error creating WebSocket connection:", error);
64
+ this.wsConnected = false;
65
+ reject(error);
66
+ }
67
+ });
68
+ }
69
+ async connect() {
70
+ if (!this.apiKey) {
71
+ console.warn("[UsageFlow] Cannot establish WebSocket connection: API key not initialized");
72
+ return;
73
+ }
74
+ return new Promise((resolve, reject) => {
75
+ try {
76
+ const headers = {
77
+ "x-usage-key": this.apiKey,
78
+ };
79
+ this.ws = new ws_1.default(this.wsUrl, {
80
+ headers,
81
+ family: 4 // This forces IPv4
82
+ });
83
+ this.ws.on("open", () => {
84
+ console.debug("[UsageFlow] WebSocket connection established");
85
+ this.wsConnected = true;
86
+ resolve();
87
+ });
88
+ this.ws.on("error", (error) => {
89
+ console.debug("[UsageFlow] WebSocket error:", error);
90
+ this.wsConnected = false;
91
+ reject(error);
92
+ });
93
+ this.ws.on("close", () => {
94
+ console.debug("[UsageFlow] WebSocket connection closed");
95
+ this.wsConnected = false;
96
+ // Attempt to reconnect after a delay
97
+ setTimeout(() => {
98
+ if (this.apiKey) {
99
+ this.connect().catch(console.error);
100
+ }
101
+ }, 5000);
102
+ });
103
+ this.ws.on("message", (data) => {
104
+ console.debug("[UsageFlow] WebSocket message received:", data.toString());
105
+ });
106
+ }
107
+ catch (error) {
108
+ console.debug("[UsageFlow] Error creating WebSocket connection:", error);
109
+ this.wsConnected = false;
110
+ reject(error);
111
+ }
112
+ });
113
+ }
114
+ async sendAsync(payload) {
115
+ if (!this.ws || !this.wsConnected) {
116
+ throw new Error("WebSocket not connected");
117
+ }
118
+ const socketResponse = await this._asyncSend(payload);
119
+ return socketResponse;
120
+ }
121
+ send(payload) {
122
+ if (!this.ws || !this.wsConnected) {
123
+ throw new Error("WebSocket not connected");
124
+ }
125
+ this.ws.send(JSON.stringify(payload));
126
+ }
127
+ close() {
128
+ if (this.ws) {
129
+ this.ws.close();
130
+ }
131
+ this.ws = null;
132
+ this.wsConnected = false;
133
+ }
134
+ isConnected() {
135
+ return this.wsConnected;
136
+ }
137
+ getWs() {
138
+ return this.ws;
139
+ }
140
+ async _asyncSend(payload) {
141
+ return new Promise((resolve, reject) => {
142
+ if (!this.ws || !this.wsConnected) {
143
+ reject(new Error("WebSocket not connected"));
144
+ return;
145
+ }
146
+ const id = Math.random().toString(36).slice(2) + Date.now().toString(36);
147
+ const message = { id, ...payload };
148
+ let isResolved = false;
149
+ // Set up timeout to prevent handlers from accumulating forever
150
+ const timeout = setTimeout(() => {
151
+ if (!isResolved) {
152
+ isResolved = true;
153
+ if (this.ws) {
154
+ this.ws.off('message', handleMessage);
155
+ }
156
+ reject(new Error(`WebSocket request timeout for id: ${id}`));
157
+ }
158
+ }, 30000); // 30 second timeout
159
+ // Wrap resolve to clear timeout
160
+ const wrappedResolve = (value) => {
161
+ if (!isResolved) {
162
+ clearTimeout(timeout);
163
+ isResolved = true;
164
+ resolve(value);
165
+ }
166
+ };
167
+ const handleMessage = (data) => {
168
+ if (isResolved)
169
+ return; // Prevent multiple processing
170
+ try {
171
+ const response = JSON.parse(data.toString());
172
+ // Use strict equality and check if this response matches our request
173
+ if (response.id === id || response.replyTo === id) {
174
+ console.debug("[UsageFlow] WebSocket message received for id:", id, response);
175
+ // Remove handler immediately before resolving
176
+ if (this.ws) {
177
+ this.ws.off('message', handleMessage);
178
+ }
179
+ wrappedResolve(response);
180
+ }
181
+ }
182
+ catch (error) {
183
+ // Ignore parse errors for messages that don't match
184
+ }
185
+ };
186
+ this.ws.on('message', handleMessage);
187
+ this.ws.send(JSON.stringify(message), (err) => {
188
+ if (err) {
189
+ clearTimeout(timeout);
190
+ if (!isResolved) {
191
+ isResolved = true;
192
+ if (this.ws) {
193
+ this.ws.off('message', handleMessage);
194
+ }
195
+ reject(err);
196
+ }
197
+ }
198
+ });
199
+ });
200
+ }
201
+ /**
202
+ * Clean up resources including WebSocket connection
203
+ */
204
+ destroy() {
205
+ if (this.ws) {
206
+ this.ws.removeAllListeners();
207
+ if (this.ws.readyState === ws_1.default.OPEN || this.ws.readyState === ws_1.default.CONNECTING) {
208
+ this.ws.close();
209
+ }
210
+ this.ws = null;
211
+ this.wsConnected = false;
212
+ }
213
+ }
214
+ }
215
+ exports.UsageFlowSocketManger = UsageFlowSocketManger;
216
+ //# sourceMappingURL=socket.js.map