@djangocfg/monitor 2.1.216 → 2.1.218

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/index.mjs CHANGED
@@ -1 +1,1240 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+
28
+ // ../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry_operation.js
29
+ var require_retry_operation = __commonJS({
30
+ "../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry_operation.js"(exports, module) {
31
+ function RetryOperation(timeouts, options) {
32
+ if (typeof options === "boolean") {
33
+ options = { forever: options };
34
+ }
35
+ this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));
36
+ this._timeouts = timeouts;
37
+ this._options = options || {};
38
+ this._maxRetryTime = options && options.maxRetryTime || Infinity;
39
+ this._fn = null;
40
+ this._errors = [];
41
+ this._attempts = 1;
42
+ this._operationTimeout = null;
43
+ this._operationTimeoutCb = null;
44
+ this._timeout = null;
45
+ this._operationStart = null;
46
+ this._timer = null;
47
+ if (this._options.forever) {
48
+ this._cachedTimeouts = this._timeouts.slice(0);
49
+ }
50
+ }
51
+ __name(RetryOperation, "RetryOperation");
52
+ module.exports = RetryOperation;
53
+ RetryOperation.prototype.reset = function() {
54
+ this._attempts = 1;
55
+ this._timeouts = this._originalTimeouts.slice(0);
56
+ };
57
+ RetryOperation.prototype.stop = function() {
58
+ if (this._timeout) {
59
+ clearTimeout(this._timeout);
60
+ }
61
+ if (this._timer) {
62
+ clearTimeout(this._timer);
63
+ }
64
+ this._timeouts = [];
65
+ this._cachedTimeouts = null;
66
+ };
67
+ RetryOperation.prototype.retry = function(err) {
68
+ if (this._timeout) {
69
+ clearTimeout(this._timeout);
70
+ }
71
+ if (!err) {
72
+ return false;
73
+ }
74
+ var currentTime = (/* @__PURE__ */ new Date()).getTime();
75
+ if (err && currentTime - this._operationStart >= this._maxRetryTime) {
76
+ this._errors.push(err);
77
+ this._errors.unshift(new Error("RetryOperation timeout occurred"));
78
+ return false;
79
+ }
80
+ this._errors.push(err);
81
+ var timeout = this._timeouts.shift();
82
+ if (timeout === void 0) {
83
+ if (this._cachedTimeouts) {
84
+ this._errors.splice(0, this._errors.length - 1);
85
+ timeout = this._cachedTimeouts.slice(-1);
86
+ } else {
87
+ return false;
88
+ }
89
+ }
90
+ var self = this;
91
+ this._timer = setTimeout(function() {
92
+ self._attempts++;
93
+ if (self._operationTimeoutCb) {
94
+ self._timeout = setTimeout(function() {
95
+ self._operationTimeoutCb(self._attempts);
96
+ }, self._operationTimeout);
97
+ if (self._options.unref) {
98
+ self._timeout.unref();
99
+ }
100
+ }
101
+ self._fn(self._attempts);
102
+ }, timeout);
103
+ if (this._options.unref) {
104
+ this._timer.unref();
105
+ }
106
+ return true;
107
+ };
108
+ RetryOperation.prototype.attempt = function(fn, timeoutOps) {
109
+ this._fn = fn;
110
+ if (timeoutOps) {
111
+ if (timeoutOps.timeout) {
112
+ this._operationTimeout = timeoutOps.timeout;
113
+ }
114
+ if (timeoutOps.cb) {
115
+ this._operationTimeoutCb = timeoutOps.cb;
116
+ }
117
+ }
118
+ var self = this;
119
+ if (this._operationTimeoutCb) {
120
+ this._timeout = setTimeout(function() {
121
+ self._operationTimeoutCb();
122
+ }, self._operationTimeout);
123
+ }
124
+ this._operationStart = (/* @__PURE__ */ new Date()).getTime();
125
+ this._fn(this._attempts);
126
+ };
127
+ RetryOperation.prototype.try = function(fn) {
128
+ console.log("Using RetryOperation.try() is deprecated");
129
+ this.attempt(fn);
130
+ };
131
+ RetryOperation.prototype.start = function(fn) {
132
+ console.log("Using RetryOperation.start() is deprecated");
133
+ this.attempt(fn);
134
+ };
135
+ RetryOperation.prototype.start = RetryOperation.prototype.try;
136
+ RetryOperation.prototype.errors = function() {
137
+ return this._errors;
138
+ };
139
+ RetryOperation.prototype.attempts = function() {
140
+ return this._attempts;
141
+ };
142
+ RetryOperation.prototype.mainError = function() {
143
+ if (this._errors.length === 0) {
144
+ return null;
145
+ }
146
+ var counts = {};
147
+ var mainError = null;
148
+ var mainErrorCount = 0;
149
+ for (var i = 0; i < this._errors.length; i++) {
150
+ var error = this._errors[i];
151
+ var message = error.message;
152
+ var count = (counts[message] || 0) + 1;
153
+ counts[message] = count;
154
+ if (count >= mainErrorCount) {
155
+ mainError = error;
156
+ mainErrorCount = count;
157
+ }
158
+ }
159
+ return mainError;
160
+ };
161
+ }
162
+ });
163
+
164
+ // ../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry.js
165
+ var require_retry = __commonJS({
166
+ "../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry.js"(exports) {
167
+ var RetryOperation = require_retry_operation();
168
+ exports.operation = function(options) {
169
+ var timeouts = exports.timeouts(options);
170
+ return new RetryOperation(timeouts, {
171
+ forever: options && (options.forever || options.retries === Infinity),
172
+ unref: options && options.unref,
173
+ maxRetryTime: options && options.maxRetryTime
174
+ });
175
+ };
176
+ exports.timeouts = function(options) {
177
+ if (options instanceof Array) {
178
+ return [].concat(options);
179
+ }
180
+ var opts = {
181
+ retries: 10,
182
+ factor: 2,
183
+ minTimeout: 1 * 1e3,
184
+ maxTimeout: Infinity,
185
+ randomize: false
186
+ };
187
+ for (var key in options) {
188
+ opts[key] = options[key];
189
+ }
190
+ if (opts.minTimeout > opts.maxTimeout) {
191
+ throw new Error("minTimeout is greater than maxTimeout");
192
+ }
193
+ var timeouts = [];
194
+ for (var i = 0; i < opts.retries; i++) {
195
+ timeouts.push(this.createTimeout(i, opts));
196
+ }
197
+ if (options && options.forever && !timeouts.length) {
198
+ timeouts.push(this.createTimeout(i, opts));
199
+ }
200
+ timeouts.sort(function(a, b) {
201
+ return a - b;
202
+ });
203
+ return timeouts;
204
+ };
205
+ exports.createTimeout = function(attempt, opts) {
206
+ var random = opts.randomize ? Math.random() + 1 : 1;
207
+ var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));
208
+ timeout = Math.min(timeout, opts.maxTimeout);
209
+ return timeout;
210
+ };
211
+ exports.wrap = function(obj, options, methods) {
212
+ if (options instanceof Array) {
213
+ methods = options;
214
+ options = null;
215
+ }
216
+ if (!methods) {
217
+ methods = [];
218
+ for (var key in obj) {
219
+ if (typeof obj[key] === "function") {
220
+ methods.push(key);
221
+ }
222
+ }
223
+ }
224
+ for (var i = 0; i < methods.length; i++) {
225
+ var method = methods[i];
226
+ var original = obj[method];
227
+ obj[method] = (/* @__PURE__ */ __name(function retryWrapper(original2) {
228
+ var op = exports.operation(options);
229
+ var args = Array.prototype.slice.call(arguments, 1);
230
+ var callback = args.pop();
231
+ args.push(function(err) {
232
+ if (op.retry(err)) {
233
+ return;
234
+ }
235
+ if (err) {
236
+ arguments[0] = op.mainError();
237
+ }
238
+ callback.apply(this, arguments);
239
+ });
240
+ op.attempt(function() {
241
+ original2.apply(obj, args);
242
+ });
243
+ }, "retryWrapper")).bind(obj, original);
244
+ obj[method].options = options;
245
+ }
246
+ };
247
+ }
248
+ });
249
+
250
+ // ../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/index.js
251
+ var require_retry2 = __commonJS({
252
+ "../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/index.js"(exports, module) {
253
+ module.exports = require_retry();
254
+ }
255
+ });
256
+
257
+ // src/_api/generated/cfg_monitor/monitor/client.ts
258
+ var _Monitor = class _Monitor {
259
+ constructor(client) {
260
+ this.client = client;
261
+ }
262
+ /**
263
+ * Ingest browser events
264
+ *
265
+ * Accepts a batch of up to 50 frontend events. No authentication required.
266
+ */
267
+ async ingestCreate(data) {
268
+ const response = await this.client.request("POST", "/cfg/monitor/ingest/", { body: data });
269
+ return response;
270
+ }
271
+ };
272
+ __name(_Monitor, "Monitor");
273
+ var Monitor = _Monitor;
274
+
275
+ // src/_api/generated/cfg_monitor/http.ts
276
+ var _FetchAdapter = class _FetchAdapter {
277
+ async request(request) {
278
+ const { method, url, headers, body, params, formData, binaryBody } = request;
279
+ let finalUrl = url;
280
+ if (params) {
281
+ const searchParams = new URLSearchParams();
282
+ Object.entries(params).forEach(([key, value]) => {
283
+ if (value !== null && value !== void 0) {
284
+ searchParams.append(key, String(value));
285
+ }
286
+ });
287
+ const queryString = searchParams.toString();
288
+ if (queryString) {
289
+ finalUrl = url.includes("?") ? `${url}&${queryString}` : `${url}?${queryString}`;
290
+ }
291
+ }
292
+ const finalHeaders = { ...headers };
293
+ let requestBody;
294
+ if (formData) {
295
+ requestBody = formData;
296
+ } else if (binaryBody) {
297
+ finalHeaders["Content-Type"] = "application/octet-stream";
298
+ requestBody = binaryBody;
299
+ } else if (body) {
300
+ finalHeaders["Content-Type"] = "application/json";
301
+ requestBody = JSON.stringify(body);
302
+ }
303
+ const response = await fetch(finalUrl, {
304
+ method,
305
+ headers: finalHeaders,
306
+ body: requestBody,
307
+ credentials: "include"
308
+ // Include Django session cookies
309
+ });
310
+ let data = null;
311
+ const contentType = response.headers.get("content-type");
312
+ if (response.status !== 204 && contentType?.includes("application/json")) {
313
+ data = await response.json();
314
+ } else if (response.status !== 204) {
315
+ data = await response.text();
316
+ }
317
+ const responseHeaders = {};
318
+ response.headers.forEach((value, key) => {
319
+ responseHeaders[key] = value;
320
+ });
321
+ return {
322
+ data,
323
+ status: response.status,
324
+ statusText: response.statusText,
325
+ headers: responseHeaders
326
+ };
327
+ }
328
+ };
329
+ __name(_FetchAdapter, "FetchAdapter");
330
+ var FetchAdapter = _FetchAdapter;
331
+
332
+ // src/_api/generated/cfg_monitor/errors.ts
333
+ var _APIError = class _APIError extends Error {
334
+ constructor(statusCode, statusText, response, url, message) {
335
+ super(message || `HTTP ${statusCode}: ${statusText}`);
336
+ this.statusCode = statusCode;
337
+ this.statusText = statusText;
338
+ this.response = response;
339
+ this.url = url;
340
+ this.name = "APIError";
341
+ }
342
+ /**
343
+ * Get error details from response.
344
+ * DRF typically returns: { "detail": "Error message" } or { "field": ["error1", "error2"] }
345
+ */
346
+ get details() {
347
+ if (typeof this.response === "object" && this.response !== null) {
348
+ return this.response;
349
+ }
350
+ return null;
351
+ }
352
+ /**
353
+ * Get field-specific validation errors from DRF.
354
+ * Returns: { "field_name": ["error1", "error2"], ... }
355
+ */
356
+ get fieldErrors() {
357
+ const details = this.details;
358
+ if (!details) return null;
359
+ const fieldErrors = {};
360
+ for (const [key, value] of Object.entries(details)) {
361
+ if (Array.isArray(value)) {
362
+ fieldErrors[key] = value;
363
+ }
364
+ }
365
+ return Object.keys(fieldErrors).length > 0 ? fieldErrors : null;
366
+ }
367
+ /**
368
+ * Get single error message from DRF.
369
+ * Checks for "detail", "message", or first field error.
370
+ */
371
+ get errorMessage() {
372
+ const details = this.details;
373
+ if (!details) return this.message;
374
+ if (details.detail) {
375
+ return Array.isArray(details.detail) ? details.detail.join(", ") : String(details.detail);
376
+ }
377
+ if (details.message) {
378
+ return String(details.message);
379
+ }
380
+ const fieldErrors = this.fieldErrors;
381
+ if (fieldErrors) {
382
+ const firstField = Object.keys(fieldErrors)[0];
383
+ if (firstField) {
384
+ return `${firstField}: ${fieldErrors[firstField]?.join(", ")}`;
385
+ }
386
+ }
387
+ return this.message;
388
+ }
389
+ // Helper methods for common HTTP status codes
390
+ get isValidationError() {
391
+ return this.statusCode === 400;
392
+ }
393
+ get isAuthError() {
394
+ return this.statusCode === 401;
395
+ }
396
+ get isPermissionError() {
397
+ return this.statusCode === 403;
398
+ }
399
+ get isNotFoundError() {
400
+ return this.statusCode === 404;
401
+ }
402
+ get isServerError() {
403
+ return this.statusCode >= 500 && this.statusCode < 600;
404
+ }
405
+ };
406
+ __name(_APIError, "APIError");
407
+ var APIError = _APIError;
408
+ var _NetworkError = class _NetworkError extends Error {
409
+ constructor(message, url, originalError) {
410
+ super(message);
411
+ this.url = url;
412
+ this.originalError = originalError;
413
+ this.name = "NetworkError";
414
+ }
415
+ };
416
+ __name(_NetworkError, "NetworkError");
417
+ var NetworkError = _NetworkError;
418
+
419
+ // src/_api/generated/cfg_monitor/logger.ts
420
+ import { createConsola } from "consola";
421
+ var DEFAULT_CONFIG = {
422
+ enabled: process.env.NODE_ENV !== "production",
423
+ logRequests: true,
424
+ logResponses: true,
425
+ logErrors: true,
426
+ logBodies: true,
427
+ logHeaders: false
428
+ };
429
+ var SENSITIVE_HEADERS = [
430
+ "authorization",
431
+ "cookie",
432
+ "set-cookie",
433
+ "x-api-key",
434
+ "x-csrf-token"
435
+ ];
436
+ var _APILogger = class _APILogger {
437
+ constructor(config = {}) {
438
+ this.config = { ...DEFAULT_CONFIG, ...config };
439
+ this.consola = config.consola || createConsola({
440
+ level: this.config.enabled ? 4 : 0
441
+ });
442
+ }
443
+ /**
444
+ * Enable logging
445
+ */
446
+ enable() {
447
+ this.config.enabled = true;
448
+ }
449
+ /**
450
+ * Disable logging
451
+ */
452
+ disable() {
453
+ this.config.enabled = false;
454
+ }
455
+ /**
456
+ * Update configuration
457
+ */
458
+ setConfig(config) {
459
+ this.config = { ...this.config, ...config };
460
+ }
461
+ /**
462
+ * Filter sensitive headers
463
+ */
464
+ filterHeaders(headers) {
465
+ if (!headers) return {};
466
+ const filtered = {};
467
+ Object.keys(headers).forEach((key) => {
468
+ const lowerKey = key.toLowerCase();
469
+ if (SENSITIVE_HEADERS.includes(lowerKey)) {
470
+ filtered[key] = "***";
471
+ } else {
472
+ filtered[key] = headers[key] || "";
473
+ }
474
+ });
475
+ return filtered;
476
+ }
477
+ /**
478
+ * Log request
479
+ */
480
+ logRequest(request) {
481
+ if (!this.config.enabled || !this.config.logRequests) return;
482
+ const { method, url, headers, body } = request;
483
+ this.consola.start(`${method} ${url}`);
484
+ if (this.config.logHeaders && headers) {
485
+ this.consola.debug("Headers:", this.filterHeaders(headers));
486
+ }
487
+ if (this.config.logBodies && body) {
488
+ this.consola.debug("Body:", body);
489
+ }
490
+ }
491
+ /**
492
+ * Log response
493
+ */
494
+ logResponse(request, response) {
495
+ if (!this.config.enabled || !this.config.logResponses) return;
496
+ const { method, url } = request;
497
+ const { status, statusText, data, duration } = response;
498
+ const statusColor = status >= 500 ? "red" : status >= 400 ? "yellow" : status >= 300 ? "cyan" : "green";
499
+ this.consola.success(
500
+ `${method} ${url} ${status} ${statusText} (${duration}ms)`
501
+ );
502
+ if (this.config.logBodies && data) {
503
+ this.consola.debug("Response:", data);
504
+ }
505
+ }
506
+ /**
507
+ * Log error
508
+ */
509
+ logError(request, error) {
510
+ if (!this.config.enabled || !this.config.logErrors) return;
511
+ const { method, url } = request;
512
+ const { message, statusCode, fieldErrors, duration } = error;
513
+ this.consola.error(
514
+ `${method} ${url} ${statusCode || "Network"} Error (${duration}ms)`
515
+ );
516
+ this.consola.error("Message:", message);
517
+ if (fieldErrors && Object.keys(fieldErrors).length > 0) {
518
+ this.consola.error("Field Errors:");
519
+ Object.entries(fieldErrors).forEach(([field, errors]) => {
520
+ errors.forEach((err) => {
521
+ this.consola.error(` \u2022 ${field}: ${err}`);
522
+ });
523
+ });
524
+ }
525
+ }
526
+ /**
527
+ * Log general info
528
+ */
529
+ info(message, ...args) {
530
+ if (!this.config.enabled) return;
531
+ this.consola.info(message, ...args);
532
+ }
533
+ /**
534
+ * Log warning
535
+ */
536
+ warn(message, ...args) {
537
+ if (!this.config.enabled) return;
538
+ this.consola.warn(message, ...args);
539
+ }
540
+ /**
541
+ * Log error
542
+ */
543
+ error(message, ...args) {
544
+ if (!this.config.enabled) return;
545
+ this.consola.error(message, ...args);
546
+ }
547
+ /**
548
+ * Log debug
549
+ */
550
+ debug(message, ...args) {
551
+ if (!this.config.enabled) return;
552
+ this.consola.debug(message, ...args);
553
+ }
554
+ /**
555
+ * Log success
556
+ */
557
+ success(message, ...args) {
558
+ if (!this.config.enabled) return;
559
+ this.consola.success(message, ...args);
560
+ }
561
+ /**
562
+ * Create a sub-logger with prefix
563
+ */
564
+ withTag(tag) {
565
+ return this.consola.withTag(tag);
566
+ }
567
+ };
568
+ __name(_APILogger, "APILogger");
569
+ var APILogger = _APILogger;
570
+ var defaultLogger = new APILogger();
571
+
572
+ // ../../node_modules/.pnpm/p-retry@6.2.1/node_modules/p-retry/index.js
573
+ var import_retry = __toESM(require_retry2(), 1);
574
+
575
+ // ../../node_modules/.pnpm/is-network-error@1.3.0/node_modules/is-network-error/index.js
576
+ var objectToString = Object.prototype.toString;
577
+ var isError = /* @__PURE__ */ __name((value) => objectToString.call(value) === "[object Error]", "isError");
578
+ var errorMessages = /* @__PURE__ */ new Set([
579
+ "network error",
580
+ // Chrome
581
+ "Failed to fetch",
582
+ // Chrome
583
+ "NetworkError when attempting to fetch resource.",
584
+ // Firefox
585
+ "The Internet connection appears to be offline.",
586
+ // Safari 16
587
+ "Network request failed",
588
+ // `cross-fetch`
589
+ "fetch failed",
590
+ // Undici (Node.js)
591
+ "terminated",
592
+ // Undici (Node.js)
593
+ " A network error occurred.",
594
+ // Bun (WebKit)
595
+ "Network connection lost"
596
+ // Cloudflare Workers (fetch)
597
+ ]);
598
+ function isNetworkError(error) {
599
+ const isValid = error && isError(error) && error.name === "TypeError" && typeof error.message === "string";
600
+ if (!isValid) {
601
+ return false;
602
+ }
603
+ const { message, stack } = error;
604
+ if (message === "Load failed") {
605
+ return stack === void 0 || "__sentry_captured__" in error;
606
+ }
607
+ if (message.startsWith("error sending request for url")) {
608
+ return true;
609
+ }
610
+ return errorMessages.has(message);
611
+ }
612
+ __name(isNetworkError, "isNetworkError");
613
+
614
+ // ../../node_modules/.pnpm/p-retry@6.2.1/node_modules/p-retry/index.js
615
+ var _AbortError = class _AbortError extends Error {
616
+ constructor(message) {
617
+ super();
618
+ if (message instanceof Error) {
619
+ this.originalError = message;
620
+ ({ message } = message);
621
+ } else {
622
+ this.originalError = new Error(message);
623
+ this.originalError.stack = this.stack;
624
+ }
625
+ this.name = "AbortError";
626
+ this.message = message;
627
+ }
628
+ };
629
+ __name(_AbortError, "AbortError");
630
+ var AbortError = _AbortError;
631
+ var decorateErrorWithCounts = /* @__PURE__ */ __name((error, attemptNumber, options) => {
632
+ const retriesLeft = options.retries - (attemptNumber - 1);
633
+ error.attemptNumber = attemptNumber;
634
+ error.retriesLeft = retriesLeft;
635
+ return error;
636
+ }, "decorateErrorWithCounts");
637
+ async function pRetry(input, options) {
638
+ return new Promise((resolve, reject) => {
639
+ options = { ...options };
640
+ options.onFailedAttempt ?? (options.onFailedAttempt = () => {
641
+ });
642
+ options.shouldRetry ?? (options.shouldRetry = () => true);
643
+ options.retries ?? (options.retries = 10);
644
+ const operation = import_retry.default.operation(options);
645
+ const abortHandler = /* @__PURE__ */ __name(() => {
646
+ operation.stop();
647
+ reject(options.signal?.reason);
648
+ }, "abortHandler");
649
+ if (options.signal && !options.signal.aborted) {
650
+ options.signal.addEventListener("abort", abortHandler, { once: true });
651
+ }
652
+ const cleanUp = /* @__PURE__ */ __name(() => {
653
+ options.signal?.removeEventListener("abort", abortHandler);
654
+ operation.stop();
655
+ }, "cleanUp");
656
+ operation.attempt(async (attemptNumber) => {
657
+ try {
658
+ const result = await input(attemptNumber);
659
+ cleanUp();
660
+ resolve(result);
661
+ } catch (error) {
662
+ try {
663
+ if (!(error instanceof Error)) {
664
+ throw new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`);
665
+ }
666
+ if (error instanceof AbortError) {
667
+ throw error.originalError;
668
+ }
669
+ if (error instanceof TypeError && !isNetworkError(error)) {
670
+ throw error;
671
+ }
672
+ decorateErrorWithCounts(error, attemptNumber, options);
673
+ if (!await options.shouldRetry(error)) {
674
+ operation.stop();
675
+ reject(error);
676
+ }
677
+ await options.onFailedAttempt(error);
678
+ if (!operation.retry(error)) {
679
+ throw operation.mainError();
680
+ }
681
+ } catch (finalError) {
682
+ decorateErrorWithCounts(finalError, attemptNumber, options);
683
+ cleanUp();
684
+ reject(finalError);
685
+ }
686
+ }
687
+ });
688
+ });
689
+ }
690
+ __name(pRetry, "pRetry");
691
+
692
+ // src/_api/generated/cfg_monitor/retry.ts
693
+ var DEFAULT_RETRY_CONFIG = {
694
+ retries: 3,
695
+ factor: 2,
696
+ minTimeout: 1e3,
697
+ maxTimeout: 6e4,
698
+ randomize: true,
699
+ onFailedAttempt: /* @__PURE__ */ __name(() => {
700
+ }, "onFailedAttempt")
701
+ };
702
+ function shouldRetry(error) {
703
+ if (error instanceof NetworkError) {
704
+ return true;
705
+ }
706
+ if (error instanceof APIError) {
707
+ const status = error.statusCode;
708
+ if (status >= 500 && status < 600) {
709
+ return true;
710
+ }
711
+ if (status === 429) {
712
+ return true;
713
+ }
714
+ return false;
715
+ }
716
+ return true;
717
+ }
718
+ __name(shouldRetry, "shouldRetry");
719
+ async function withRetry(fn, config) {
720
+ const finalConfig = { ...DEFAULT_RETRY_CONFIG, ...config };
721
+ return pRetry(
722
+ async () => {
723
+ try {
724
+ return await fn();
725
+ } catch (error) {
726
+ if (!shouldRetry(error)) {
727
+ throw new AbortError(error);
728
+ }
729
+ throw error;
730
+ }
731
+ },
732
+ {
733
+ retries: finalConfig.retries,
734
+ factor: finalConfig.factor,
735
+ minTimeout: finalConfig.minTimeout,
736
+ maxTimeout: finalConfig.maxTimeout,
737
+ randomize: finalConfig.randomize,
738
+ onFailedAttempt: finalConfig.onFailedAttempt ? (error) => {
739
+ const pRetryError = error;
740
+ finalConfig.onFailedAttempt({
741
+ error: pRetryError,
742
+ attemptNumber: pRetryError.attemptNumber,
743
+ retriesLeft: pRetryError.retriesLeft
744
+ });
745
+ } : void 0
746
+ }
747
+ );
748
+ }
749
+ __name(withRetry, "withRetry");
750
+
751
+ // src/_api/generated/cfg_monitor/client.ts
752
+ var _APIClient = class _APIClient {
753
+ constructor(baseUrl, options) {
754
+ this.logger = null;
755
+ this.retryConfig = null;
756
+ this.tokenGetter = null;
757
+ this.baseUrl = baseUrl.replace(/\/$/, "");
758
+ this.httpClient = options?.httpClient || new FetchAdapter();
759
+ this.tokenGetter = options?.tokenGetter || null;
760
+ if (options?.loggerConfig !== void 0) {
761
+ this.logger = new APILogger(options.loggerConfig);
762
+ }
763
+ if (options?.retryConfig !== void 0) {
764
+ this.retryConfig = options.retryConfig;
765
+ }
766
+ this.monitor = new Monitor(this);
767
+ }
768
+ /**
769
+ * Get CSRF token from cookies (for SessionAuthentication).
770
+ *
771
+ * Returns null if cookie doesn't exist (JWT-only auth).
772
+ */
773
+ getCsrfToken() {
774
+ const name = "csrftoken";
775
+ const value = `; ${document.cookie}`;
776
+ const parts = value.split(`; ${name}=`);
777
+ if (parts.length === 2) {
778
+ return parts.pop()?.split(";").shift() || null;
779
+ }
780
+ return null;
781
+ }
782
+ /**
783
+ * Get the base URL for building streaming/download URLs.
784
+ */
785
+ getBaseUrl() {
786
+ return this.baseUrl;
787
+ }
788
+ /**
789
+ * Get JWT token for URL authentication (used in streaming endpoints).
790
+ * Returns null if no token getter is configured or no token is available.
791
+ */
792
+ getToken() {
793
+ return this.tokenGetter ? this.tokenGetter() : null;
794
+ }
795
+ /**
796
+ * Make HTTP request with Django CSRF and session handling.
797
+ * Automatically retries on network errors and 5xx server errors.
798
+ */
799
+ async request(method, path, options) {
800
+ if (this.retryConfig) {
801
+ return withRetry(() => this._makeRequest(method, path, options), {
802
+ ...this.retryConfig,
803
+ onFailedAttempt: /* @__PURE__ */ __name((info) => {
804
+ if (this.logger) {
805
+ this.logger.warn(
806
+ `Retry attempt ${info.attemptNumber}/${info.retriesLeft + info.attemptNumber} for ${method} ${path}: ${info.error.message}`
807
+ );
808
+ }
809
+ this.retryConfig?.onFailedAttempt?.(info);
810
+ }, "onFailedAttempt")
811
+ });
812
+ }
813
+ return this._makeRequest(method, path, options);
814
+ }
815
+ /**
816
+ * Internal request method (without retry wrapper).
817
+ * Used by request() method with optional retry logic.
818
+ */
819
+ async _makeRequest(method, path, options) {
820
+ const url = this.baseUrl ? `${this.baseUrl}${path}` : path;
821
+ const startTime = Date.now();
822
+ const headers = {
823
+ ...options?.headers || {}
824
+ };
825
+ if (!options?.formData && !options?.binaryBody && !headers["Content-Type"]) {
826
+ headers["Content-Type"] = "application/json";
827
+ }
828
+ if (this.logger) {
829
+ this.logger.logRequest({
830
+ method,
831
+ url,
832
+ headers,
833
+ body: options?.formData || options?.body,
834
+ timestamp: startTime
835
+ });
836
+ }
837
+ try {
838
+ const response = await this.httpClient.request({
839
+ method,
840
+ url,
841
+ headers,
842
+ params: options?.params,
843
+ body: options?.body,
844
+ formData: options?.formData,
845
+ binaryBody: options?.binaryBody
846
+ });
847
+ const duration = Date.now() - startTime;
848
+ if (response.status >= 400) {
849
+ const error = new APIError(
850
+ response.status,
851
+ response.statusText,
852
+ response.data,
853
+ url
854
+ );
855
+ if (this.logger) {
856
+ this.logger.logError(
857
+ {
858
+ method,
859
+ url,
860
+ headers,
861
+ body: options?.formData || options?.body,
862
+ timestamp: startTime
863
+ },
864
+ {
865
+ message: error.message,
866
+ statusCode: response.status,
867
+ duration,
868
+ timestamp: Date.now()
869
+ }
870
+ );
871
+ }
872
+ throw error;
873
+ }
874
+ if (this.logger) {
875
+ this.logger.logResponse(
876
+ {
877
+ method,
878
+ url,
879
+ headers,
880
+ body: options?.formData || options?.body,
881
+ timestamp: startTime
882
+ },
883
+ {
884
+ status: response.status,
885
+ statusText: response.statusText,
886
+ data: response.data,
887
+ duration,
888
+ timestamp: Date.now()
889
+ }
890
+ );
891
+ }
892
+ return response.data;
893
+ } catch (error) {
894
+ const duration = Date.now() - startTime;
895
+ if (error instanceof APIError) {
896
+ throw error;
897
+ }
898
+ const isCORSError = error instanceof TypeError && (error.message.toLowerCase().includes("cors") || error.message.toLowerCase().includes("failed to fetch") || error.message.toLowerCase().includes("network request failed"));
899
+ if (this.logger) {
900
+ if (isCORSError) {
901
+ this.logger.error(`\u{1F6AB} CORS Error: ${method} ${url}`);
902
+ this.logger.error(` \u2192 ${error instanceof Error ? error.message : String(error)}`);
903
+ this.logger.error(` \u2192 Configure security_domains parameter on the server`);
904
+ } else {
905
+ this.logger.error(`\u26A0\uFE0F Network Error: ${method} ${url}`);
906
+ this.logger.error(` \u2192 ${error instanceof Error ? error.message : String(error)}`);
907
+ }
908
+ }
909
+ if (typeof window !== "undefined") {
910
+ try {
911
+ if (isCORSError) {
912
+ window.dispatchEvent(new CustomEvent("cors-error", {
913
+ detail: {
914
+ url,
915
+ method,
916
+ error: error instanceof Error ? error.message : String(error),
917
+ timestamp: /* @__PURE__ */ new Date()
918
+ },
919
+ bubbles: true,
920
+ cancelable: false
921
+ }));
922
+ } else {
923
+ window.dispatchEvent(new CustomEvent("network-error", {
924
+ detail: {
925
+ url,
926
+ method,
927
+ error: error instanceof Error ? error.message : String(error),
928
+ timestamp: /* @__PURE__ */ new Date()
929
+ },
930
+ bubbles: true,
931
+ cancelable: false
932
+ }));
933
+ }
934
+ } catch (eventError) {
935
+ }
936
+ }
937
+ const networkError = error instanceof Error ? new NetworkError(error.message, url, error) : new NetworkError("Unknown error", url);
938
+ if (this.logger) {
939
+ this.logger.logError(
940
+ {
941
+ method,
942
+ url,
943
+ headers,
944
+ body: options?.formData || options?.body,
945
+ timestamp: startTime
946
+ },
947
+ {
948
+ message: networkError.message,
949
+ duration,
950
+ timestamp: Date.now()
951
+ }
952
+ );
953
+ }
954
+ throw networkError;
955
+ }
956
+ }
957
+ };
958
+ __name(_APIClient, "APIClient");
959
+ var APIClient = _APIClient;
960
+
961
+ // src/_api/generated/cfg_monitor/storage.ts
962
+ var _LocalStorageAdapter = class _LocalStorageAdapter {
963
+ constructor(logger) {
964
+ this.logger = logger;
965
+ }
966
+ getItem(key) {
967
+ try {
968
+ if (typeof window !== "undefined" && window.localStorage) {
969
+ const value = localStorage.getItem(key);
970
+ this.logger?.debug(`LocalStorage.getItem("${key}"): ${value ? "found" : "not found"}`);
971
+ return value;
972
+ }
973
+ this.logger?.warn("LocalStorage not available: window.localStorage is undefined");
974
+ } catch (error) {
975
+ this.logger?.error("LocalStorage.getItem failed:", error);
976
+ }
977
+ return null;
978
+ }
979
+ setItem(key, value) {
980
+ try {
981
+ if (typeof window !== "undefined" && window.localStorage) {
982
+ localStorage.setItem(key, value);
983
+ this.logger?.debug(`LocalStorage.setItem("${key}"): success`);
984
+ } else {
985
+ this.logger?.warn("LocalStorage not available: window.localStorage is undefined");
986
+ }
987
+ } catch (error) {
988
+ this.logger?.error("LocalStorage.setItem failed:", error);
989
+ }
990
+ }
991
+ removeItem(key) {
992
+ try {
993
+ if (typeof window !== "undefined" && window.localStorage) {
994
+ localStorage.removeItem(key);
995
+ this.logger?.debug(`LocalStorage.removeItem("${key}"): success`);
996
+ } else {
997
+ this.logger?.warn("LocalStorage not available: window.localStorage is undefined");
998
+ }
999
+ } catch (error) {
1000
+ this.logger?.error("LocalStorage.removeItem failed:", error);
1001
+ }
1002
+ }
1003
+ };
1004
+ __name(_LocalStorageAdapter, "LocalStorageAdapter");
1005
+ var LocalStorageAdapter = _LocalStorageAdapter;
1006
+ var _MemoryStorageAdapter = class _MemoryStorageAdapter {
1007
+ constructor(logger) {
1008
+ this.storage = /* @__PURE__ */ new Map();
1009
+ this.logger = logger;
1010
+ }
1011
+ getItem(key) {
1012
+ const value = this.storage.get(key) || null;
1013
+ this.logger?.debug(`MemoryStorage.getItem("${key}"): ${value ? "found" : "not found"}`);
1014
+ return value;
1015
+ }
1016
+ setItem(key, value) {
1017
+ this.storage.set(key, value);
1018
+ this.logger?.debug(`MemoryStorage.setItem("${key}"): success`);
1019
+ }
1020
+ removeItem(key) {
1021
+ this.storage.delete(key);
1022
+ this.logger?.debug(`MemoryStorage.removeItem("${key}"): success`);
1023
+ }
1024
+ };
1025
+ __name(_MemoryStorageAdapter, "MemoryStorageAdapter");
1026
+ var MemoryStorageAdapter = _MemoryStorageAdapter;
1027
+
1028
+ // src/_api/generated/cfg_monitor/enums.ts
1029
+ var FrontendEventIngestRequestEventType = /* @__PURE__ */ ((FrontendEventIngestRequestEventType2) => {
1030
+ FrontendEventIngestRequestEventType2["ERROR"] = "ERROR";
1031
+ FrontendEventIngestRequestEventType2["WARNING"] = "WARNING";
1032
+ FrontendEventIngestRequestEventType2["INFO"] = "INFO";
1033
+ FrontendEventIngestRequestEventType2["PAGE_VIEW"] = "PAGE_VIEW";
1034
+ FrontendEventIngestRequestEventType2["PERFORMANCE"] = "PERFORMANCE";
1035
+ FrontendEventIngestRequestEventType2["NETWORK_ERROR"] = "NETWORK_ERROR";
1036
+ FrontendEventIngestRequestEventType2["JS_ERROR"] = "JS_ERROR";
1037
+ FrontendEventIngestRequestEventType2["CONSOLE"] = "CONSOLE";
1038
+ return FrontendEventIngestRequestEventType2;
1039
+ })(FrontendEventIngestRequestEventType || {});
1040
+ var FrontendEventIngestRequestLevel = /* @__PURE__ */ ((FrontendEventIngestRequestLevel2) => {
1041
+ FrontendEventIngestRequestLevel2["ERROR"] = "error";
1042
+ FrontendEventIngestRequestLevel2["WARN"] = "warn";
1043
+ FrontendEventIngestRequestLevel2["INFO"] = "info";
1044
+ FrontendEventIngestRequestLevel2["DEBUG"] = "debug";
1045
+ return FrontendEventIngestRequestLevel2;
1046
+ })(FrontendEventIngestRequestLevel || {});
1047
+
1048
+ // src/_api/generated/cfg_monitor/_utils/schemas/FrontendEventIngestRequest.schema.ts
1049
+ import { z } from "zod";
1050
+ var FrontendEventIngestRequestSchema = z.object({
1051
+ event_type: z.nativeEnum(FrontendEventIngestRequestEventType),
1052
+ message: z.string().min(1).max(5e3),
1053
+ level: z.nativeEnum(FrontendEventIngestRequestLevel).optional(),
1054
+ stack_trace: z.string().max(2e4).optional(),
1055
+ url: z.string().max(2e3).optional(),
1056
+ fingerprint: z.string().max(64).optional(),
1057
+ http_status: z.number().int().nullable().optional(),
1058
+ http_method: z.string().max(10).optional(),
1059
+ http_url: z.string().max(2e3).optional(),
1060
+ user_agent: z.string().max(500).optional(),
1061
+ session_id: z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i).nullable().optional(),
1062
+ browser_fingerprint: z.string().max(64).optional(),
1063
+ extra: z.record(z.string(), z.any()).optional(),
1064
+ project_name: z.string().max(100).optional(),
1065
+ environment: z.string().max(20).optional()
1066
+ });
1067
+
1068
+ // src/_api/generated/cfg_monitor/_utils/schemas/IngestBatchRequest.schema.ts
1069
+ import { z as z2 } from "zod";
1070
+ var IngestBatchRequestSchema = z2.object({
1071
+ events: z2.array(FrontendEventIngestRequestSchema)
1072
+ });
1073
+
1074
+ // src/_api/generated/cfg_monitor/index.ts
1075
+ var TOKEN_KEY = "auth_token";
1076
+ var REFRESH_TOKEN_KEY = "refresh_token";
1077
+ function detectLocale() {
1078
+ try {
1079
+ if (typeof document !== "undefined") {
1080
+ const match = document.cookie.match(/(?:^|;\s*)NEXT_LOCALE=([^;]*)/);
1081
+ if (match) return match[1];
1082
+ }
1083
+ if (typeof navigator !== "undefined" && navigator.language) {
1084
+ return navigator.language;
1085
+ }
1086
+ } catch {
1087
+ }
1088
+ return null;
1089
+ }
1090
+ __name(detectLocale, "detectLocale");
1091
+ var _API = class _API {
1092
+ constructor(baseUrl, options) {
1093
+ this._token = null;
1094
+ this._refreshToken = null;
1095
+ this._locale = null;
1096
+ this.baseUrl = baseUrl;
1097
+ this.options = options;
1098
+ const logger = options?.loggerConfig ? new APILogger(options.loggerConfig) : void 0;
1099
+ this.storage = options?.storage || new LocalStorageAdapter(logger);
1100
+ this._locale = options?.locale || null;
1101
+ this._loadTokensFromStorage();
1102
+ this._client = new APIClient(this.baseUrl, {
1103
+ httpClient: this.options?.httpClient,
1104
+ retryConfig: this.options?.retryConfig,
1105
+ loggerConfig: this.options?.loggerConfig,
1106
+ tokenGetter: /* @__PURE__ */ __name(() => this.getToken(), "tokenGetter")
1107
+ });
1108
+ this._injectAuthHeader();
1109
+ this.monitor = this._client.monitor;
1110
+ }
1111
+ _loadTokensFromStorage() {
1112
+ this._token = this.storage.getItem(TOKEN_KEY);
1113
+ this._refreshToken = this.storage.getItem(REFRESH_TOKEN_KEY);
1114
+ }
1115
+ _reinitClients() {
1116
+ this._client = new APIClient(this.baseUrl, {
1117
+ httpClient: this.options?.httpClient,
1118
+ retryConfig: this.options?.retryConfig,
1119
+ loggerConfig: this.options?.loggerConfig,
1120
+ tokenGetter: /* @__PURE__ */ __name(() => this.getToken(), "tokenGetter")
1121
+ });
1122
+ this._injectAuthHeader();
1123
+ this.monitor = this._client.monitor;
1124
+ }
1125
+ _injectAuthHeader() {
1126
+ const originalRequest = this._client.request.bind(this._client);
1127
+ this._client.request = async (method, path, options) => {
1128
+ const token = this.getToken();
1129
+ const locale = this._locale || detectLocale();
1130
+ const mergedOptions = {
1131
+ ...options,
1132
+ headers: {
1133
+ ...options?.headers || {},
1134
+ ...token ? { "Authorization": `Bearer ${token}` } : {},
1135
+ ...locale ? { "Accept-Language": locale } : {}
1136
+ }
1137
+ };
1138
+ return originalRequest(method, path, mergedOptions);
1139
+ };
1140
+ }
1141
+ /**
1142
+ * Get current JWT token
1143
+ */
1144
+ getToken() {
1145
+ return this.storage.getItem(TOKEN_KEY);
1146
+ }
1147
+ /**
1148
+ * Get current refresh token
1149
+ */
1150
+ getRefreshToken() {
1151
+ return this.storage.getItem(REFRESH_TOKEN_KEY);
1152
+ }
1153
+ /**
1154
+ * Set JWT token and refresh token
1155
+ * @param token - JWT access token
1156
+ * @param refreshToken - JWT refresh token (optional)
1157
+ */
1158
+ setToken(token, refreshToken) {
1159
+ this._token = token;
1160
+ this.storage.setItem(TOKEN_KEY, token);
1161
+ if (refreshToken) {
1162
+ this._refreshToken = refreshToken;
1163
+ this.storage.setItem(REFRESH_TOKEN_KEY, refreshToken);
1164
+ }
1165
+ this._reinitClients();
1166
+ }
1167
+ /**
1168
+ * Clear all tokens
1169
+ */
1170
+ clearTokens() {
1171
+ this._token = null;
1172
+ this._refreshToken = null;
1173
+ this.storage.removeItem(TOKEN_KEY);
1174
+ this.storage.removeItem(REFRESH_TOKEN_KEY);
1175
+ this._reinitClients();
1176
+ }
1177
+ /**
1178
+ * Check if user is authenticated
1179
+ */
1180
+ isAuthenticated() {
1181
+ return !!this.getToken();
1182
+ }
1183
+ /**
1184
+ * Update base URL and reinitialize clients
1185
+ * @param url - New base URL
1186
+ */
1187
+ setBaseUrl(url) {
1188
+ this.baseUrl = url;
1189
+ this._reinitClients();
1190
+ }
1191
+ /**
1192
+ * Get current base URL
1193
+ */
1194
+ getBaseUrl() {
1195
+ return this.baseUrl;
1196
+ }
1197
+ /**
1198
+ * Set locale for Accept-Language header
1199
+ * @param locale - Locale string (e.g. 'en', 'ko', 'ru') or null to clear
1200
+ */
1201
+ setLocale(locale) {
1202
+ this._locale = locale;
1203
+ }
1204
+ /**
1205
+ * Get current locale
1206
+ */
1207
+ getLocale() {
1208
+ return this._locale;
1209
+ }
1210
+ /**
1211
+ * Get OpenAPI schema path
1212
+ * @returns Path to the OpenAPI schema JSON file
1213
+ *
1214
+ * Note: The OpenAPI schema is available in the schema.json file.
1215
+ * You can load it dynamically using:
1216
+ * ```typescript
1217
+ * const schema = await fetch('./schema.json').then(r => r.json());
1218
+ * // or using fs in Node.js:
1219
+ * // const schema = JSON.parse(fs.readFileSync('./schema.json', 'utf-8'));
1220
+ * ```
1221
+ */
1222
+ getSchemaPath() {
1223
+ return "./schema.json";
1224
+ }
1225
+ };
1226
+ __name(_API, "API");
1227
+ var API = _API;
1228
+
1229
+ // src/_api/BaseClient.ts
1230
+ var monitorApi = new API("", { storage: new MemoryStorageAdapter() });
1231
+ var _BaseClient = class _BaseClient {
1232
+ };
1233
+ __name(_BaseClient, "BaseClient");
1234
+ _BaseClient.monitorApi = monitorApi;
1235
+ var BaseClient = _BaseClient;
1236
+ export {
1237
+ FrontendEventIngestRequestLevel as EventLevel,
1238
+ FrontendEventIngestRequestEventType as EventType
1239
+ };
1
1240
  //# sourceMappingURL=index.mjs.map