@aifabrix/miso-client 3.1.1 → 3.2.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 (84) hide show
  1. package/README.md +1 -1
  2. package/dist/express/client-token-endpoint.d.ts +76 -0
  3. package/dist/express/client-token-endpoint.d.ts.map +1 -0
  4. package/dist/express/client-token-endpoint.js +108 -0
  5. package/dist/express/client-token-endpoint.js.map +1 -0
  6. package/dist/express/index.d.ts +2 -1
  7. package/dist/express/index.d.ts.map +1 -1
  8. package/dist/express/index.js +8 -3
  9. package/dist/express/index.js.map +1 -1
  10. package/dist/express/response-middleware.d.ts.map +1 -1
  11. package/dist/express/response-middleware.js.map +1 -1
  12. package/dist/index.d.ts +8 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +14 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/services/auth.service.js +5 -5
  17. package/dist/services/auth.service.js.map +1 -1
  18. package/dist/services/browser-permission.service.d.ts +60 -0
  19. package/dist/services/browser-permission.service.d.ts.map +1 -0
  20. package/dist/services/browser-permission.service.js +159 -0
  21. package/dist/services/browser-permission.service.js.map +1 -0
  22. package/dist/services/browser-role.service.d.ts +60 -0
  23. package/dist/services/browser-role.service.d.ts.map +1 -0
  24. package/dist/services/browser-role.service.js +159 -0
  25. package/dist/services/browser-role.service.js.map +1 -0
  26. package/dist/services/cache.service.d.ts.map +1 -1
  27. package/dist/services/cache.service.js +4 -0
  28. package/dist/services/cache.service.js.map +1 -1
  29. package/dist/services/logger.service.d.ts +4 -0
  30. package/dist/services/logger.service.d.ts.map +1 -1
  31. package/dist/services/logger.service.js +21 -0
  32. package/dist/services/logger.service.js.map +1 -1
  33. package/dist/types/data-client.types.d.ts +1 -0
  34. package/dist/types/data-client.types.d.ts.map +1 -1
  35. package/dist/types/data-client.types.js.map +1 -1
  36. package/dist/utils/audit-log-queue.d.ts +4 -0
  37. package/dist/utils/audit-log-queue.d.ts.map +1 -1
  38. package/dist/utils/audit-log-queue.js +22 -2
  39. package/dist/utils/audit-log-queue.js.map +1 -1
  40. package/dist/utils/auth-strategy.js +2 -2
  41. package/dist/utils/browser-jwt-decoder.d.ts +20 -0
  42. package/dist/utils/browser-jwt-decoder.d.ts.map +1 -0
  43. package/dist/utils/browser-jwt-decoder.js +75 -0
  44. package/dist/utils/browser-jwt-decoder.js.map +1 -0
  45. package/dist/utils/controller-url-resolver.d.ts +16 -0
  46. package/dist/utils/controller-url-resolver.d.ts.map +1 -1
  47. package/dist/utils/controller-url-resolver.js +12 -0
  48. package/dist/utils/controller-url-resolver.js.map +1 -1
  49. package/dist/utils/data-client-audit.d.ts +24 -0
  50. package/dist/utils/data-client-audit.d.ts.map +1 -0
  51. package/dist/utils/data-client-audit.js +138 -0
  52. package/dist/utils/data-client-audit.js.map +1 -0
  53. package/dist/utils/data-client-auth.d.ts +59 -0
  54. package/dist/utils/data-client-auth.d.ts.map +1 -0
  55. package/dist/utils/data-client-auth.js +427 -0
  56. package/dist/utils/data-client-auth.js.map +1 -0
  57. package/dist/utils/data-client-auto-init.d.ts +66 -0
  58. package/dist/utils/data-client-auto-init.d.ts.map +1 -0
  59. package/dist/utils/data-client-auto-init.js +215 -0
  60. package/dist/utils/data-client-auto-init.js.map +1 -0
  61. package/dist/utils/data-client-cache.d.ts +36 -0
  62. package/dist/utils/data-client-cache.d.ts.map +1 -0
  63. package/dist/utils/data-client-cache.js +55 -0
  64. package/dist/utils/data-client-cache.js.map +1 -0
  65. package/dist/utils/data-client-redirect.d.ts +22 -0
  66. package/dist/utils/data-client-redirect.d.ts.map +1 -0
  67. package/dist/utils/data-client-redirect.js +345 -0
  68. package/dist/utils/data-client-redirect.js.map +1 -0
  69. package/dist/utils/data-client-request.d.ts +32 -0
  70. package/dist/utils/data-client-request.d.ts.map +1 -0
  71. package/dist/utils/data-client-request.js +309 -0
  72. package/dist/utils/data-client-request.js.map +1 -0
  73. package/dist/utils/data-client-utils.d.ts +49 -0
  74. package/dist/utils/data-client-utils.d.ts.map +1 -0
  75. package/dist/utils/data-client-utils.js +139 -0
  76. package/dist/utils/data-client-utils.js.map +1 -0
  77. package/dist/utils/data-client.d.ts +103 -29
  78. package/dist/utils/data-client.d.ts.map +1 -1
  79. package/dist/utils/data-client.js +321 -774
  80. package/dist/utils/data-client.js.map +1 -1
  81. package/dist/utils/internal-http-client.d.ts.map +1 -1
  82. package/dist/utils/internal-http-client.js +7 -3
  83. package/dist/utils/internal-http-client.js.map +1 -1
  84. package/package.json +9 -2
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ /**
3
+ * DataClient request execution utilities
4
+ * Handles HTTP request execution, retry logic, fetch handling, and response parsing
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.extractHeaders = extractHeaders;
8
+ exports.parseResponse = parseResponse;
9
+ exports.mergeSignals = mergeSignals;
10
+ exports.makeFetchRequest = makeFetchRequest;
11
+ exports.executeHttpRequest = executeHttpRequest;
12
+ const data_client_types_1 = require("../types/data-client.types");
13
+ const data_client_utils_1 = require("./data-client-utils");
14
+ const data_client_cache_1 = require("./data-client-cache");
15
+ const data_client_audit_1 = require("./data-client-audit");
16
+ /**
17
+ * Extract headers from Headers object or Record
18
+ */
19
+ function extractHeaders(headers) {
20
+ if (!headers)
21
+ return undefined;
22
+ if (headers instanceof Headers) {
23
+ const result = {};
24
+ headers.forEach((value, key) => {
25
+ result[key] = value;
26
+ });
27
+ return result;
28
+ }
29
+ if (Array.isArray(headers)) {
30
+ const result = {};
31
+ headers.forEach(([key, value]) => {
32
+ result[key] = String(value);
33
+ });
34
+ return result;
35
+ }
36
+ // Convert Record<string, string | readonly string[]> to Record<string, string>
37
+ const result = {};
38
+ Object.entries(headers).forEach(([key, value]) => {
39
+ result[key] = Array.isArray(value) ? value.join(", ") : String(value);
40
+ });
41
+ return result;
42
+ }
43
+ /**
44
+ * Parse response based on content type
45
+ */
46
+ async function parseResponse(response) {
47
+ const contentType = response.headers.get("content-type") || "";
48
+ if (contentType.includes("application/json")) {
49
+ return (await response.json());
50
+ }
51
+ if (contentType.includes("text/")) {
52
+ return (await response.text());
53
+ }
54
+ return (await response.blob());
55
+ }
56
+ /**
57
+ * Merge AbortSignals
58
+ */
59
+ function mergeSignals(signal1, signal2) {
60
+ const controller = new AbortController();
61
+ const abort = () => {
62
+ controller.abort();
63
+ signal1.removeEventListener("abort", abort);
64
+ signal2.removeEventListener("abort", abort);
65
+ };
66
+ if (signal1.aborted || signal2.aborted) {
67
+ controller.abort();
68
+ return controller.signal;
69
+ }
70
+ signal1.addEventListener("abort", abort);
71
+ signal2.addEventListener("abort", abort);
72
+ return controller.signal;
73
+ }
74
+ /**
75
+ * Make fetch request with timeout and authentication
76
+ */
77
+ async function makeFetchRequest(method, url, config, getToken, options) {
78
+ // Build headers
79
+ const headers = new Headers(config.defaultHeaders);
80
+ if (options?.headers) {
81
+ if (options.headers instanceof Headers) {
82
+ options.headers.forEach((value, key) => headers.set(key, value));
83
+ }
84
+ else {
85
+ Object.entries(options.headers).forEach(([key, value]) => {
86
+ headers.set(key, String(value));
87
+ });
88
+ }
89
+ }
90
+ // Add authentication
91
+ if (!options?.skipAuth) {
92
+ const token = getToken();
93
+ if (token) {
94
+ headers.set("Authorization", `Bearer ${token}`);
95
+ }
96
+ // Note: MisoClient client-token is handled server-side, not in browser
97
+ }
98
+ // Create abort controller for timeout
99
+ const timeout = options?.timeout || config.timeout || 30000;
100
+ const controller = new AbortController();
101
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
102
+ // Merge signals
103
+ const signal = options?.signal
104
+ ? mergeSignals(controller.signal, options.signal)
105
+ : controller.signal;
106
+ // Extract custom properties that shouldn't be passed to fetch
107
+ // These are DataClient-specific options, not native RequestInit properties
108
+ const { cache: _customCache, skipAuth: _skipAuth, retries: _retries, skipAudit: _skipAudit, timeout: _timeout, ...fetchOptions } = options || {};
109
+ try {
110
+ const response = await fetch(url, {
111
+ method,
112
+ headers,
113
+ body: fetchOptions.body,
114
+ signal,
115
+ ...fetchOptions,
116
+ });
117
+ clearTimeout(timeoutId);
118
+ return response;
119
+ }
120
+ catch (error) {
121
+ clearTimeout(timeoutId);
122
+ if (error instanceof Error && error.name === "AbortError") {
123
+ throw new data_client_types_1.TimeoutError(`Request timeout after ${timeout}ms`, timeout);
124
+ }
125
+ throw new data_client_types_1.NetworkError(`Network error: ${error instanceof Error ? error.message : "Unknown error"}`, error instanceof Error ? error : undefined);
126
+ }
127
+ }
128
+ /**
129
+ * Process successful response (cache, interceptors, audit)
130
+ */
131
+ async function processSuccessfulResponse(response, data, method, endpoint, startTime, config, cache, cacheKey, cacheEnabled, misoClient, hasAnyToken, getToken, interceptors, metrics, options) {
132
+ const duration = Date.now() - startTime;
133
+ metrics.totalRequests++;
134
+ metrics.responseTimes.push(duration);
135
+ // Cache successful GET responses
136
+ if (cacheEnabled && response.ok) {
137
+ const ttl = options?.cache?.ttl || config.cache?.defaultTTL || 300;
138
+ (0, data_client_cache_1.setCacheEntry)(cache, cacheKey, data, ttl, config.cache?.maxSize || 100);
139
+ }
140
+ // Apply response interceptor
141
+ if (interceptors.onResponse) {
142
+ return await interceptors.onResponse(response, data);
143
+ }
144
+ // Audit logging
145
+ if (!options?.skipAudit) {
146
+ const requestSize = options?.body ? (0, data_client_utils_1.calculateSize)(options.body) : undefined;
147
+ const responseSize = (0, data_client_utils_1.calculateSize)(data);
148
+ await (0, data_client_audit_1.logDataClientAudit)(method, endpoint, response.status, duration, misoClient, config.audit, hasAnyToken, getToken, requestSize, responseSize, undefined, extractHeaders(options?.headers), extractHeaders(response.headers), options?.body, data);
149
+ }
150
+ // Handle error responses
151
+ if (!response.ok) {
152
+ throw new data_client_types_1.ApiError(`Request failed with status ${response.status}`, response.status, response);
153
+ }
154
+ return data;
155
+ }
156
+ /**
157
+ * Handle non-retryable error (audit log and throw)
158
+ */
159
+ async function handleNonRetryableError(error, method, endpoint, startTime, statusCode, responseStatus, config, misoClient, hasAnyToken, getToken, interceptors, metrics, options) {
160
+ const duration = Date.now() - startTime;
161
+ metrics.totalFailures++;
162
+ // Audit log error
163
+ if (!options?.skipAudit) {
164
+ await (0, data_client_audit_1.logDataClientAudit)(method, endpoint, statusCode || responseStatus || 401, duration, misoClient, config.audit, hasAnyToken, getToken, options?.body ? (0, data_client_utils_1.calculateSize)(options.body) : undefined, undefined, error, extractHeaders(options?.headers), undefined, options?.body, undefined);
165
+ }
166
+ throw error;
167
+ }
168
+ /**
169
+ * Handle authentication error and throw immediately - does NOT retry
170
+ */
171
+ /**
172
+ * Handle authentication error cleanup (synchronous only - no await)
173
+ */
174
+ function handleAuthErrorCleanup(error, responseStatus, method, endpoint, startTime, config, misoClient, hasAnyToken, getToken, handleAuthError, metrics, options) {
175
+ // Call handleAuthError callback
176
+ handleAuthError();
177
+ // Update metrics
178
+ metrics.totalFailures++;
179
+ // Handle audit logging (fire and forget - don't await)
180
+ if (!options?.skipAudit) {
181
+ const duration = Date.now() - startTime;
182
+ (0, data_client_audit_1.logDataClientAudit)(method, endpoint, responseStatus, duration, misoClient, config.audit, hasAnyToken, getToken, options?.body ? (0, data_client_utils_1.calculateSize)(options.body) : undefined, undefined, error, extractHeaders(options?.headers), undefined, options?.body, undefined).catch(() => {
183
+ // Ignore audit logging errors
184
+ });
185
+ }
186
+ }
187
+ /**
188
+ * Wait for retry delay
189
+ */
190
+ async function waitForRetry(attempt, baseDelay, maxDelay) {
191
+ const delay = (0, data_client_utils_1.calculateBackoffDelay)(attempt, baseDelay, maxDelay);
192
+ await new Promise((resolve) => setTimeout(resolve, delay));
193
+ }
194
+ /**
195
+ * Execute HTTP request with retry logic
196
+ */
197
+ async function executeHttpRequest(method, fullUrl, endpoint, config, cache, cacheKey, cacheEnabled, startTime, misoClient, hasAnyToken, getToken, handleAuthError, interceptors, metrics, options) {
198
+ const maxRetries = options?.retries !== undefined
199
+ ? options.retries
200
+ : config.retry?.maxRetries || 3;
201
+ const retryEnabled = config.retry?.enabled !== false;
202
+ const baseDelay = config.retry?.baseDelay || 1000;
203
+ const maxDelay = config.retry?.maxDelay || 10000;
204
+ // Flag to prevent retries when auth error is detected
205
+ let authErrorDetected = false;
206
+ // Internal recursive function to handle retries
207
+ async function attemptRequest(attempt) {
208
+ // If auth error was detected, don't make any more requests
209
+ if (authErrorDetected) {
210
+ throw new data_client_types_1.AuthenticationError("Authentication error detected - should not retry");
211
+ }
212
+ let responseStatus;
213
+ let response;
214
+ try {
215
+ response = await makeFetchRequest(method, fullUrl, config, getToken, options);
216
+ responseStatus = response.status;
217
+ // CRITICAL: Check for 401/403 errors IMMEDIATELY - do NOT retry
218
+ // Throw immediately without any retry logic
219
+ if (responseStatus === 401 || responseStatus === 403) {
220
+ authErrorDetected = true; // Set flag to prevent any retries
221
+ const authError = responseStatus === 401
222
+ ? new data_client_types_1.AuthenticationError("Authentication required", response)
223
+ : new data_client_types_1.ApiError("Forbidden", 403, response);
224
+ // Handle cleanup (synchronous only)
225
+ handleAuthErrorCleanup(authError, responseStatus, method, endpoint, startTime, config, misoClient, hasAnyToken, getToken, handleAuthError, metrics, options);
226
+ // Throw immediately - this MUST exit the entire function, no retry, no recursion
227
+ throw authError;
228
+ }
229
+ // Parse response
230
+ const data = await parseResponse(response);
231
+ // Process successful response (cache, interceptors, audit)
232
+ return await processSuccessfulResponse(response, data, method, endpoint, startTime, config, cache, cacheKey, cacheEnabled, misoClient, hasAnyToken, getToken, interceptors, metrics, options);
233
+ }
234
+ catch (error) {
235
+ // CRITICAL: Check error type FIRST - we throw AuthenticationError from try block
236
+ // This is the most reliable check - if it's AuthenticationError, throw immediately
237
+ if (error instanceof data_client_types_1.AuthenticationError) {
238
+ authErrorDetected = true; // Set flag to prevent any retries
239
+ throw error; // This exits the function completely, no retry
240
+ }
241
+ // Check responseStatus - it's set before throw in try block
242
+ if (responseStatus === 401 || responseStatus === 403) {
243
+ authErrorDetected = true; // Set flag to prevent any retries
244
+ throw error; // This exits the function completely, no retry
245
+ }
246
+ // Check error name and statusCode as fallback
247
+ const errorObj = error;
248
+ if (errorObj.name === "AuthenticationError" ||
249
+ errorObj.statusCode === 401 ||
250
+ errorObj.statusCode === 403) {
251
+ authErrorDetected = true; // Set flag to prevent any retries
252
+ throw error; // This exits the function completely, no retry
253
+ }
254
+ // Determine if error is retryable
255
+ const errorResponseStatus = errorObj.response?.status;
256
+ const statusCode = error instanceof data_client_types_1.AuthenticationError
257
+ ? 401
258
+ : (errorObj.statusCode ?? errorResponseStatus ?? responseStatus ?? undefined);
259
+ const isRetryable = retryEnabled &&
260
+ attempt < maxRetries &&
261
+ (0, data_client_utils_1.isRetryableError)(statusCode, error);
262
+ // If not retryable, handle and throw
263
+ // But skip handleNonRetryableError for auth errors - they're already handled
264
+ if (!isRetryable) {
265
+ // Double-check this is not an auth error before calling handleNonRetryableError
266
+ const isAuthError = error instanceof data_client_types_1.AuthenticationError ||
267
+ error.name === "AuthenticationError" ||
268
+ statusCode === 401 ||
269
+ statusCode === 403 ||
270
+ responseStatus === 401 ||
271
+ responseStatus === 403;
272
+ if (isAuthError) {
273
+ // Auth error - throw immediately without calling handleNonRetryableError
274
+ authErrorDetected = true; // Set flag to prevent any retries
275
+ throw error;
276
+ }
277
+ metrics.totalFailures++;
278
+ await handleNonRetryableError(error, method, endpoint, startTime, statusCode, responseStatus, config, misoClient, hasAnyToken, getToken, interceptors, metrics, options);
279
+ }
280
+ // If auth error was detected, don't retry
281
+ if (authErrorDetected) {
282
+ authErrorDetected = true; // Set flag to prevent any retries
283
+ throw error;
284
+ }
285
+ // Wait before retry, then recursively call with attempt+1
286
+ await waitForRetry(attempt, baseDelay, maxDelay);
287
+ return attemptRequest(attempt + 1);
288
+ }
289
+ }
290
+ // Start with attempt 0
291
+ try {
292
+ return await attemptRequest(0);
293
+ }
294
+ catch (error) {
295
+ // Check if this is an auth error - skip interceptor to prevent second call
296
+ const isAuthError = error instanceof data_client_types_1.AuthenticationError ||
297
+ error.name === "AuthenticationError" ||
298
+ error.statusCode === 401 ||
299
+ error.statusCode === 403;
300
+ // All retries exhausted or non-retryable error
301
+ metrics.totalFailures++;
302
+ // Skip interceptor for auth errors - they're already handled
303
+ if (interceptors.onError && !isAuthError) {
304
+ throw await interceptors.onError(error);
305
+ }
306
+ throw error;
307
+ }
308
+ }
309
+ //# sourceMappingURL=data-client-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-client-request.js","sourceRoot":"","sources":["../../src/utils/data-client-request.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAwBH,wCAwBC;AAKD,sCASC;AAKD,oCAqBC;AAKD,4CAsEC;AA6LD,gDAmMC;AAjiBD,kEASoC;AACpC,2DAI6B;AAC7B,2DAAoD;AACpD,2DAAoF;AAGpF;;GAEG;AACH,SAAgB,cAAc,CAC5B,OAAoG;IAEpG,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IAC/E,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAI,QAAkB;IACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,OAAoB,EACpB,OAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACvC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEzC,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,GAAW,EACX,MAAwB,EACxB,QAAoB,EACpB,OAA2B;IAE3B,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,OAAO,YAAY,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACvD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,uEAAuE;IACzE,CAAC;IAED,sCAAsC;IACtC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAEhE,gBAAgB;IAChB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM;QAC5B,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;QACjD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IAEtB,8DAA8D;IAC9D,2EAA2E;IAC3E,MAAM,EACJ,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,QAAQ,EACjB,GAAG,YAAY,EAChB,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,MAAM;YACN,GAAG,YAAY;SAChB,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,gCAAY,CAAC,yBAAyB,OAAO,IAAI,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,IAAI,gCAAY,CACpB,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAC5E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,yBAAyB,CACtC,QAAkB,EAClB,IAAO,EACP,MAAc,EACd,QAAgB,EAChB,SAAiB,EACjB,MAAwB,EACxB,KAA8B,EAC9B,QAAgB,EAChB,YAAqB,EACrB,UAA6B,EAC7B,WAA0B,EAC1B,QAAoB,EACpB,YAA+B,EAC/B,OAAkF,EAClF,OAA2B;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErC,iCAAiC;IACjC,IAAI,YAAY,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,GAAG,CAAC;QACnE,IAAA,iCAAa,EACX,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAC7B,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,MAAM,YAAY,CAAC,UAAU,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,iCAAa,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,YAAY,GAAG,IAAA,iCAAa,EAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAA,sCAAkB,EACtB,MAAM,EACN,QAAQ,EACR,QAAQ,CAAC,MAAM,EACf,QAAQ,EACR,UAAU,EACV,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAChC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAChC,OAAO,EAAE,IAAI,EACb,IAAI,CACL,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,4BAAQ,CAChB,8BAA8B,QAAQ,CAAC,MAAM,EAAE,EAC/C,QAAQ,CAAC,MAAM,EACf,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,uBAAuB,CACpC,KAAY,EACZ,MAAc,EACd,QAAgB,EAChB,SAAiB,EACjB,UAA8B,EAC9B,cAAkC,EAClC,MAAwB,EACxB,UAA6B,EAC7B,WAA0B,EAC1B,QAAoB,EACpB,YAA+B,EAC/B,OAAkF,EAClF,OAA2B;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,aAAa,EAAE,CAAC;IAExB,kBAAkB;IAClB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,IAAA,sCAAkB,EACtB,MAAM,EACN,QAAQ,EACR,UAAU,IAAI,cAAc,IAAI,GAAG,EACnC,QAAQ,EACR,UAAU,EACV,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,iCAAa,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EACvD,SAAS,EACT,KAAK,EACL,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAChC,SAAS,EACT,OAAO,EAAE,IAAI,EACb,SAAS,CACV,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH;;GAEG;AACH,SAAS,sBAAsB,CAC7B,KAAY,EACZ,cAAsB,EACtB,MAAc,EACd,QAAgB,EAChB,SAAiB,EACjB,MAAwB,EACxB,UAA6B,EAC7B,WAA0B,EAC1B,QAAoB,EACpB,eAA2B,EAC3B,OAAkF,EAClF,OAA2B;IAE3B,gCAAgC;IAChC,eAAe,EAAE,CAAC;IAElB,iBAAiB;IACjB,OAAO,CAAC,aAAa,EAAE,CAAC;IAExB,uDAAuD;IACvD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAA,sCAAkB,EAChB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,UAAU,EACV,MAAM,CAAC,KAAK,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,iCAAa,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EACvD,SAAS,EACT,KAAK,EACL,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAChC,SAAS,EACT,OAAO,EAAE,IAAI,EACb,SAAS,CACV,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,8BAA8B;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,SAAiB,EACjB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAA,yCAAqB,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,OAAe,EACf,QAAgB,EAChB,MAAwB,EACxB,KAA8B,EAC9B,QAAgB,EAChB,YAAqB,EACrB,SAAiB,EACjB,UAA6B,EAC7B,WAA0B,EAC1B,QAAoB,EACpB,eAA2B,EAC3B,YAA+B,EAC/B,OAIC,EACD,OAA2B;IAE3B,MAAM,UAAU,GACd,OAAO,EAAE,OAAO,KAAK,SAAS;QAC5B,CAAC,CAAC,OAAO,CAAC,OAAO;QACjB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,IAAI,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC;IAEjD,sDAAsD;IACtD,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,gDAAgD;IAChD,KAAK,UAAU,cAAc,CAAC,OAAe;QAC3C,2DAA2D;QAC3D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,IAAI,uCAAmB,CAAC,kDAAkD,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,cAAkC,CAAC;QACvC,IAAI,QAA8B,CAAC;QAEnC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9E,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;YAEjC,gEAAgE;YAChE,4CAA4C;YAC5C,IAAI,cAAc,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gBACrD,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;gBAC5D,MAAM,SAAS,GAAG,cAAc,KAAK,GAAG;oBACtC,CAAC,CAAC,IAAI,uCAAmB,CAAC,yBAAyB,EAAE,QAAQ,CAAC;oBAC9D,CAAC,CAAC,IAAI,4BAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAE7C,oCAAoC;gBACpC,sBAAsB,CACpB,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,EACR,SAAS,EACT,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,OAAO,EACP,OAAO,CACR,CAAC;gBAEF,iFAAiF;gBACjF,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,iBAAiB;YACjB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAI,QAAQ,CAAC,CAAC;YAE9C,2DAA2D;YAC3D,OAAO,MAAM,yBAAyB,CACpC,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,SAAS,EACT,MAAM,EACN,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iFAAiF;YACjF,mFAAmF;YACnF,IAAI,KAAK,YAAY,uCAAmB,EAAE,CAAC;gBACzC,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;gBAC5D,MAAM,KAAK,CAAC,CAAC,+CAA+C;YAC9D,CAAC;YAED,4DAA4D;YAC5D,IAAI,cAAc,KAAK,GAAG,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gBACrD,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;gBAC5D,MAAM,KAAK,CAAC,CAAC,+CAA+C;YAC9D,CAAC;YAED,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,KAAiB,CAAC;YACnC,IAAI,QAAQ,CAAC,IAAI,KAAK,qBAAqB;gBACvC,QAAQ,CAAC,UAAU,KAAK,GAAG;gBAC3B,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;gBAC5D,MAAM,KAAK,CAAC,CAAC,+CAA+C;YAC9D,CAAC;YAED,kCAAkC;YAClC,MAAM,mBAAmB,GAAI,QAAQ,CAAC,QAAiC,EAAE,MAAM,CAAC;YAChF,MAAM,UAAU,GAAuB,KAAK,YAAY,uCAAmB;gBACzE,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,mBAAmB,IAAI,cAAc,IAAI,SAAS,CAAC,CAAC;YAEhF,MAAM,WAAW,GACf,YAAY;gBACZ,OAAO,GAAG,UAAU;gBACpB,IAAA,oCAAgB,EAAC,UAAU,EAAE,KAAc,CAAC,CAAC;YAE/C,qCAAqC;YACrC,6EAA6E;YAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,gFAAgF;gBAChF,MAAM,WAAW,GAAG,KAAK,YAAY,uCAAmB;oBACpC,KAAkB,CAAC,IAAI,KAAK,qBAAqB;oBAClD,UAAU,KAAK,GAAG;oBAClB,UAAU,KAAK,GAAG;oBAClB,cAAc,KAAK,GAAG;oBACtB,cAAc,KAAK,GAAG,CAAC;gBAE1C,IAAI,WAAW,EAAE,CAAC;oBAChB,yEAAyE;oBACzE,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;oBAC5D,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,OAAO,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,uBAAuB,CAC3B,KAAc,EACd,MAAM,EACN,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,OAAO,CACR,CAAC;YACJ,CAAC;YAED,0CAA0C;YAC1C,IAAI,iBAAiB,EAAE,CAAC;gBACtB,iBAAiB,GAAG,IAAI,CAAC,CAAC,kCAAkC;gBAC5D,MAAM,KAAK,CAAC;YACd,CAAC;YAED,0DAA0D;YAC1D,MAAM,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjD,OAAO,cAAc,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2EAA2E;QAC3E,MAAM,WAAW,GAAG,KAAK,YAAY,uCAAmB;YACpC,KAAkB,CAAC,IAAI,KAAK,qBAAqB;YACjD,KAAkB,CAAC,UAAU,KAAK,GAAG;YACrC,KAAkB,CAAC,UAAU,KAAK,GAAG,CAAC;QAE1D,+CAA+C;QAC/C,OAAO,CAAC,aAAa,EAAE,CAAC;QAExB,6DAA6D;QAC7D,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,MAAM,YAAY,CAAC,OAAO,CAAC,KAAc,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * DataClient utility functions
3
+ * Browser environment utilities and helper functions
4
+ */
5
+ import { ApiRequestOptions } from "../types/data-client.types";
6
+ /**
7
+ * Check if running in browser environment
8
+ */
9
+ export declare function isBrowser(): boolean;
10
+ /**
11
+ * Get value from localStorage (browser only)
12
+ */
13
+ export declare function getLocalStorage(key: string): string | null;
14
+ /**
15
+ * Set value in localStorage (browser only)
16
+ */
17
+ export declare function setLocalStorage(key: string, value: string): void;
18
+ /**
19
+ * Remove value from localStorage (browser only)
20
+ */
21
+ export declare function removeLocalStorage(key: string): void;
22
+ /**
23
+ * Extract userId from JWT token
24
+ */
25
+ export declare function extractUserIdFromToken(token: string): string | null;
26
+ /**
27
+ * Calculate cache key from endpoint and options
28
+ */
29
+ export declare function generateCacheKey(endpoint: string, options?: ApiRequestOptions): string;
30
+ /**
31
+ * Truncate large payloads before masking (performance optimization)
32
+ */
33
+ export declare function truncatePayload(data: unknown, maxSize: number): {
34
+ data: unknown;
35
+ truncated: boolean;
36
+ };
37
+ /**
38
+ * Calculate request/response sizes
39
+ */
40
+ export declare function calculateSize(data: unknown): number;
41
+ /**
42
+ * Check if error is retryable
43
+ */
44
+ export declare function isRetryableError(statusCode?: number, _error?: Error): boolean;
45
+ /**
46
+ * Calculate exponential backoff delay
47
+ */
48
+ export declare function calculateBackoffDelay(attempt: number, baseDelay: number, maxDelay: number): number;
49
+ //# sourceMappingURL=data-client-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-client-utils.d.ts","sourceRoot":"","sources":["../../src/utils/data-client-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAMnC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAItF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CASvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAMnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,CAQ7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * DataClient utility functions
4
+ * Browser environment utilities and helper functions
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.isBrowser = isBrowser;
11
+ exports.getLocalStorage = getLocalStorage;
12
+ exports.setLocalStorage = setLocalStorage;
13
+ exports.removeLocalStorage = removeLocalStorage;
14
+ exports.extractUserIdFromToken = extractUserIdFromToken;
15
+ exports.generateCacheKey = generateCacheKey;
16
+ exports.truncatePayload = truncatePayload;
17
+ exports.calculateSize = calculateSize;
18
+ exports.isRetryableError = isRetryableError;
19
+ exports.calculateBackoffDelay = calculateBackoffDelay;
20
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
21
+ /**
22
+ * Check if running in browser environment
23
+ */
24
+ function isBrowser() {
25
+ return (typeof globalThis.window !== "undefined" &&
26
+ typeof globalThis.localStorage !== "undefined" &&
27
+ typeof globalThis.fetch !== "undefined");
28
+ }
29
+ /**
30
+ * Get value from localStorage (browser only)
31
+ */
32
+ function getLocalStorage(key) {
33
+ if (!isBrowser())
34
+ return null;
35
+ try {
36
+ return globalThis.localStorage.getItem(key);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * Set value in localStorage (browser only)
44
+ */
45
+ function setLocalStorage(key, value) {
46
+ if (!isBrowser())
47
+ return;
48
+ try {
49
+ globalThis.localStorage.setItem(key, value);
50
+ }
51
+ catch {
52
+ // Ignore localStorage errors (SSR, private browsing, etc.)
53
+ }
54
+ }
55
+ /**
56
+ * Remove value from localStorage (browser only)
57
+ */
58
+ function removeLocalStorage(key) {
59
+ if (!isBrowser())
60
+ return;
61
+ try {
62
+ globalThis.localStorage.removeItem(key);
63
+ }
64
+ catch {
65
+ // Ignore localStorage errors (SSR, private browsing, etc.)
66
+ }
67
+ }
68
+ /**
69
+ * Extract userId from JWT token
70
+ */
71
+ function extractUserIdFromToken(token) {
72
+ try {
73
+ const decoded = jsonwebtoken_1.default.decode(token);
74
+ if (!decoded)
75
+ return null;
76
+ return (decoded.sub || decoded.userId || decoded.user_id || decoded.id);
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ /**
83
+ * Calculate cache key from endpoint and options
84
+ */
85
+ function generateCacheKey(endpoint, options) {
86
+ const method = options?.method || "GET";
87
+ const body = options?.body ? JSON.stringify(options.body) : "";
88
+ return `data-client:${method}:${endpoint}:${body}`;
89
+ }
90
+ /**
91
+ * Truncate large payloads before masking (performance optimization)
92
+ */
93
+ function truncatePayload(data, maxSize) {
94
+ const json = JSON.stringify(data);
95
+ if (json.length <= maxSize) {
96
+ return { data, truncated: false };
97
+ }
98
+ return {
99
+ data: { _message: "Payload truncated for performance", _size: json.length },
100
+ truncated: true,
101
+ };
102
+ }
103
+ /**
104
+ * Calculate request/response sizes
105
+ */
106
+ function calculateSize(data) {
107
+ try {
108
+ return JSON.stringify(data).length;
109
+ }
110
+ catch {
111
+ return 0;
112
+ }
113
+ }
114
+ /**
115
+ * Check if error is retryable
116
+ */
117
+ function isRetryableError(statusCode, _error) {
118
+ if (!statusCode)
119
+ return true; // Network errors are retryable
120
+ if (statusCode >= 500)
121
+ return true; // Server errors
122
+ if (statusCode === 408)
123
+ return true; // Timeout
124
+ if (statusCode === 429)
125
+ return true; // Rate limit
126
+ if (statusCode === 401 || statusCode === 403)
127
+ return false; // Auth errors
128
+ if (statusCode >= 400 && statusCode < 500)
129
+ return false; // Client errors
130
+ return false;
131
+ }
132
+ /**
133
+ * Calculate exponential backoff delay
134
+ */
135
+ function calculateBackoffDelay(attempt, baseDelay, maxDelay) {
136
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
137
+ return delay + Math.random() * 1000; // Add jitter
138
+ }
139
+ //# sourceMappingURL=data-client-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-client-utils.js","sourceRoot":"","sources":["../../src/utils/data-client-utils.ts"],"names":[],"mappings":"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"}