@ryuzaki13/react-foundation-lib 2.0.0 → 2.0.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/error-report/breadcrumbs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAcrD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,QAkBzG;AAED,wBAAgB,yBAAyB,4BAExC;AAED,wBAAgB,2BAA2B,SAE1C;
|
|
1
|
+
{"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/error-report/breadcrumbs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAcrD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,QAkBzG;AAED,wBAAgB,yBAAyB,4BAExC;AAED,wBAAgB,2BAA2B,SAE1C;AAiID;;GAEG;AACH,wBAAgB,oCAAoC,eAyBnD"}
|
|
@@ -133,8 +133,7 @@ var pe = 20, me = 120, he = [
|
|
|
133
133
|
"input",
|
|
134
134
|
"select",
|
|
135
135
|
"textarea",
|
|
136
|
-
"[role]"
|
|
137
|
-
"[data-error-report-target]"
|
|
136
|
+
"[role]"
|
|
138
137
|
].join(","), ge = /^[a-z0-9][a-z0-9._:/-]*$/i, v = [];
|
|
139
138
|
function _e() {
|
|
140
139
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -166,48 +165,52 @@ function xe(e) {
|
|
|
166
165
|
let t = be(e.getAttribute("data-error-report-target"));
|
|
167
166
|
return t && ge.test(t) ? t : void 0;
|
|
168
167
|
}
|
|
169
|
-
function
|
|
168
|
+
function b(e, t) {
|
|
170
169
|
let n = be(e.getAttribute(t));
|
|
171
170
|
return n && ge.test(n) ? n : void 0;
|
|
172
171
|
}
|
|
173
|
-
function
|
|
172
|
+
function Se(e) {
|
|
173
|
+
let t = xe(e);
|
|
174
174
|
return {
|
|
175
|
-
role:
|
|
176
|
-
type:
|
|
177
|
-
errorReportTarget:
|
|
175
|
+
role: b(e, "role"),
|
|
176
|
+
type: b(e, "type"),
|
|
177
|
+
errorReportTarget: t,
|
|
178
|
+
dataUi: t ? void 0 : b(e, "data-ui"),
|
|
179
|
+
dataAction: t ? void 0 : b(e, "data-action")
|
|
178
180
|
};
|
|
179
181
|
}
|
|
180
|
-
function
|
|
182
|
+
function x(e) {
|
|
181
183
|
return typeof CSS < "u" && typeof CSS.escape == "function" ? CSS.escape(e) : e.replace(/["\\#.[\]>~+:]/g, "\\$&");
|
|
182
184
|
}
|
|
183
|
-
function
|
|
184
|
-
let t =
|
|
185
|
-
return t.role && n.push(`[role="${t.role}"]`), t.type && n.push(`[type="${t.type}"]`), t.errorReportTarget
|
|
185
|
+
function Ce(e) {
|
|
186
|
+
let t = Se(e), n = [e.tagName.toLowerCase()];
|
|
187
|
+
return t.role && n.push(`[role="${t.role}"]`), t.type && n.push(`[type="${t.type}"]`), t.errorReportTarget ? n.push(`[data-error-report-target="${x(t.errorReportTarget)}"]`) : (t.dataUi && n.push(`[data-ui="${x(t.dataUi)}"]`), t.dataAction && n.push(`[data-action="${x(t.dataAction)}"]`)), n.join("");
|
|
186
188
|
}
|
|
187
|
-
function
|
|
188
|
-
let t =
|
|
189
|
+
function we(e) {
|
|
190
|
+
let t = Se(e);
|
|
189
191
|
return {
|
|
190
192
|
tag: e.tagName.toLowerCase(),
|
|
191
|
-
selector:
|
|
193
|
+
selector: Ce(e),
|
|
192
194
|
...t
|
|
193
195
|
};
|
|
194
196
|
}
|
|
195
|
-
function
|
|
197
|
+
function Te(e) {
|
|
196
198
|
return Object.fromEntries(Object.entries(e).filter(([, e]) => e !== void 0 && (!Array.isArray(e) || e.length > 0)));
|
|
197
199
|
}
|
|
198
|
-
function
|
|
200
|
+
function S(e) {
|
|
199
201
|
let t = [], n = e;
|
|
200
202
|
for (; n && n !== document.documentElement && t.length < pe && (t.push(n), n !== document.body);) n = n.parentElement;
|
|
201
203
|
return t;
|
|
202
204
|
}
|
|
203
|
-
function
|
|
204
|
-
|
|
205
|
+
function Ee(e) {
|
|
206
|
+
let t = S(e);
|
|
207
|
+
return t.find((e) => xe(e)) || (t.find((e) => e.matches(he) || b(e, "data-action") !== void 0 || b(e, "data-ui") !== void 0) ?? e);
|
|
205
208
|
}
|
|
206
|
-
function
|
|
207
|
-
if (e instanceof Element) return
|
|
209
|
+
function De(e) {
|
|
210
|
+
if (e instanceof Element) return S(Ee(e)).map((e) => Ce(e)).join(" > ");
|
|
208
211
|
}
|
|
209
|
-
function
|
|
210
|
-
let t = e.target instanceof Element ? e.target : void 0, n = t ?
|
|
212
|
+
function Oe(e) {
|
|
213
|
+
let t = e.target instanceof Element ? e.target : void 0, n = t ? Ee(t) : void 0, r = n ? S(n).map((e) => Te(we(e))) : [];
|
|
211
214
|
return _({
|
|
212
215
|
button: e.button,
|
|
213
216
|
ctrlKey: e.ctrlKey,
|
|
@@ -215,20 +218,20 @@ function Ae(e) {
|
|
|
215
218
|
altKey: e.altKey,
|
|
216
219
|
clientX: e.clientX,
|
|
217
220
|
clientY: e.clientY,
|
|
218
|
-
target: n ?
|
|
221
|
+
target: n ? Te(we(n)) : void 0,
|
|
219
222
|
chain: r
|
|
220
223
|
}, {
|
|
221
224
|
scope: "breadcrumb-detail",
|
|
222
225
|
source: "click"
|
|
223
226
|
});
|
|
224
227
|
}
|
|
225
|
-
function
|
|
228
|
+
function ke() {
|
|
226
229
|
if (typeof window > "u") return () => void 0;
|
|
227
230
|
let e = (e) => {
|
|
228
231
|
y({
|
|
229
232
|
type: "click",
|
|
230
|
-
target:
|
|
231
|
-
detail:
|
|
233
|
+
target: De(e.target),
|
|
234
|
+
detail: Oe(e)
|
|
232
235
|
});
|
|
233
236
|
}, t = () => {
|
|
234
237
|
y({
|
|
@@ -245,33 +248,33 @@ function je() {
|
|
|
245
248
|
}
|
|
246
249
|
//#endregion
|
|
247
250
|
//#region src/error-report/payload.ts
|
|
248
|
-
var
|
|
249
|
-
function
|
|
251
|
+
var Ae = 1, C = 262144, w = 65536, je = 32768, Me = 256, Ne = 128, Pe = 2048;
|
|
252
|
+
function Fe(e) {
|
|
250
253
|
return new TextEncoder().encode(JSON.stringify(e)).byteLength;
|
|
251
254
|
}
|
|
252
|
-
function
|
|
253
|
-
return d(e.split(/[?#]/, 1)[0] ?? e,
|
|
255
|
+
function Ie(e) {
|
|
256
|
+
return d(e.split(/[?#]/, 1)[0] ?? e, Pe);
|
|
254
257
|
}
|
|
255
|
-
function
|
|
258
|
+
function T(e, t, n, r = "characters") {
|
|
256
259
|
let i = g(r === "bytes" ? p(e, n) : d(e, n), t, n);
|
|
257
260
|
if (typeof i == "string") return r === "bytes" ? p(i, n) : d(i, n);
|
|
258
261
|
}
|
|
259
|
-
function
|
|
262
|
+
function E(e, t) {
|
|
260
263
|
return {
|
|
261
264
|
name: d(e.name, 256),
|
|
262
|
-
message:
|
|
265
|
+
message: T(e.message, {
|
|
263
266
|
scope: "error-message",
|
|
264
267
|
source: t
|
|
265
268
|
}, 4096) ?? "[REDACTED]",
|
|
266
269
|
code: e.code ? d(e.code, 128) : void 0,
|
|
267
|
-
stackTrace: e.stackTrace ?
|
|
270
|
+
stackTrace: e.stackTrace ? T(e.stackTrace, {
|
|
268
271
|
scope: "stack-trace",
|
|
269
272
|
source: t
|
|
270
|
-
},
|
|
273
|
+
}, w, "bytes") : void 0,
|
|
271
274
|
httpStatus: e.httpStatus
|
|
272
275
|
};
|
|
273
276
|
}
|
|
274
|
-
function
|
|
277
|
+
function Le(e) {
|
|
275
278
|
return {
|
|
276
279
|
...e,
|
|
277
280
|
queryHash: d(e.queryHash, 512),
|
|
@@ -287,18 +290,18 @@ function ze(e) {
|
|
|
287
290
|
scope: "query-data-shape",
|
|
288
291
|
source: e.queryHash
|
|
289
292
|
}) : void 0,
|
|
290
|
-
error: e.error ?
|
|
293
|
+
error: e.error ? E(e.error, e.queryHash) : void 0
|
|
291
294
|
};
|
|
292
295
|
}
|
|
293
|
-
function
|
|
296
|
+
function Re(e) {
|
|
294
297
|
return {
|
|
295
298
|
...e,
|
|
296
299
|
mutationKey: e.mutationKey ? g(e.mutationKey, { scope: "mutation-key" }) : void 0,
|
|
297
300
|
meta: _(e.meta, { scope: "mutation-meta" }),
|
|
298
|
-
error: e.error ?
|
|
301
|
+
error: e.error ? E(e.error, "mutation") : void 0
|
|
299
302
|
};
|
|
300
303
|
}
|
|
301
|
-
function
|
|
304
|
+
function ze(e) {
|
|
302
305
|
return {
|
|
303
306
|
...e,
|
|
304
307
|
buster: e.buster ? d(e.buster, 512) : void 0,
|
|
@@ -307,21 +310,21 @@ function Ve(e) {
|
|
|
307
310
|
scope: "persisted-query-key",
|
|
308
311
|
source: e.queryHash
|
|
309
312
|
}) : void 0,
|
|
310
|
-
error: e.error ?
|
|
313
|
+
error: e.error ? E(e.error, e.queryHash) : void 0
|
|
311
314
|
};
|
|
312
315
|
}
|
|
313
|
-
function
|
|
314
|
-
return
|
|
316
|
+
function D(e) {
|
|
317
|
+
return Fe(e);
|
|
315
318
|
}
|
|
316
|
-
function
|
|
319
|
+
function Be(e) {
|
|
317
320
|
return {
|
|
318
321
|
...e,
|
|
319
322
|
reportId: d(e.reportId, 128),
|
|
320
323
|
sessionId: d(e.sessionId, 128),
|
|
321
324
|
createdUtc: d(e.createdUtc, 64),
|
|
322
|
-
application: d(e.application,
|
|
323
|
-
source: d(e.source,
|
|
324
|
-
error:
|
|
325
|
+
application: d(e.application, Ne),
|
|
326
|
+
source: d(e.source, Me),
|
|
327
|
+
error: E(e.error, e.source),
|
|
325
328
|
environment: {
|
|
326
329
|
...e.environment,
|
|
327
330
|
buildId: e.environment.buildId ? d(e.environment.buildId, 128) : void 0
|
|
@@ -332,20 +335,20 @@ function He(e) {
|
|
|
332
335
|
timeZone: e.client.timeZone ? d(e.client.timeZone, 128) : void 0
|
|
333
336
|
} : void 0,
|
|
334
337
|
location: e.location ? {
|
|
335
|
-
pathname:
|
|
336
|
-
origin: e.location.origin ? d(e.location.origin.split(/[?#]/, 1)[0] ?? e.location.origin,
|
|
338
|
+
pathname: Ie(e.location.pathname),
|
|
339
|
+
origin: e.location.origin ? d(e.location.origin.split(/[?#]/, 1)[0] ?? e.location.origin, Pe) : void 0
|
|
337
340
|
} : void 0,
|
|
338
|
-
react: e.react?.componentStack ? { componentStack:
|
|
341
|
+
react: e.react?.componentStack ? { componentStack: T(e.react.componentStack, {
|
|
339
342
|
scope: "stack-trace",
|
|
340
343
|
source: "react-component-stack"
|
|
341
|
-
},
|
|
342
|
-
query: e.query ?
|
|
343
|
-
mutation: e.mutation ?
|
|
344
|
+
}, je, "bytes") } : void 0,
|
|
345
|
+
query: e.query ? Le(e.query) : void 0,
|
|
346
|
+
mutation: e.mutation ? Re(e.mutation) : void 0,
|
|
344
347
|
queryClient: e.queryClient ? {
|
|
345
|
-
queries: e.queryClient.queries.slice(-40).map(
|
|
346
|
-
mutations: e.queryClient.mutations.slice(-40).map(
|
|
348
|
+
queries: e.queryClient.queries.slice(-40).map(Le),
|
|
349
|
+
mutations: e.queryClient.mutations.slice(-40).map(Re)
|
|
347
350
|
} : void 0,
|
|
348
|
-
persistedQueries: e.persistedQueries?.slice(-40).map(
|
|
351
|
+
persistedQueries: e.persistedQueries?.slice(-40).map(ze),
|
|
349
352
|
breadcrumbs: e.breadcrumbs.slice(-80).map((e) => ({
|
|
350
353
|
...e,
|
|
351
354
|
utc: d(e.utc, 64),
|
|
@@ -364,19 +367,19 @@ function He(e) {
|
|
|
364
367
|
})
|
|
365
368
|
};
|
|
366
369
|
}
|
|
367
|
-
function
|
|
368
|
-
let t =
|
|
370
|
+
function Ve(e) {
|
|
371
|
+
let t = Be(e), n = D(t);
|
|
369
372
|
if (n <= 262144) return t;
|
|
370
373
|
let r = [], i = {
|
|
371
374
|
...t,
|
|
372
375
|
truncation: {
|
|
373
376
|
reason: "payload-size",
|
|
374
|
-
limitBytes:
|
|
377
|
+
limitBytes: C,
|
|
375
378
|
originalBytes: n,
|
|
376
379
|
droppedSections: r
|
|
377
380
|
}
|
|
378
381
|
}, a = (e, t, n) => {
|
|
379
|
-
!t(i) ||
|
|
382
|
+
!t(i) || D(i) <= 262144 || (r.push(e), i = n(i));
|
|
380
383
|
};
|
|
381
384
|
return a("queryClient", (e) => e.queryClient !== void 0, (e) => ({
|
|
382
385
|
...e,
|
|
@@ -430,15 +433,15 @@ function Ue(e) {
|
|
|
430
433
|
}
|
|
431
434
|
//#endregion
|
|
432
435
|
//#region src/error-report/errorInfo.ts
|
|
433
|
-
var
|
|
434
|
-
function
|
|
435
|
-
return t(e) ? d(e) :
|
|
436
|
+
var He = "Неизвестная ошибка";
|
|
437
|
+
function O(e) {
|
|
438
|
+
return t(e) ? d(e) : He;
|
|
436
439
|
}
|
|
437
|
-
function
|
|
440
|
+
function Ue(e) {
|
|
438
441
|
let t = e.status ?? e.statusCode ?? e.httpStatus;
|
|
439
442
|
return typeof t == "number" && Number.isFinite(t) ? t : void 0;
|
|
440
443
|
}
|
|
441
|
-
function
|
|
444
|
+
function We(e) {
|
|
442
445
|
if (!e || typeof e != "object") return null;
|
|
443
446
|
let n = e.appError;
|
|
444
447
|
if (!n || typeof n != "object") return null;
|
|
@@ -447,40 +450,40 @@ function Ge(e) {
|
|
|
447
450
|
name: "AppError",
|
|
448
451
|
message: d(i),
|
|
449
452
|
code: t(r.code) ? d(String(r.code), 128) : void 0,
|
|
450
|
-
httpStatus:
|
|
453
|
+
httpStatus: Ue(r)
|
|
451
454
|
} : null;
|
|
452
455
|
}
|
|
453
|
-
function
|
|
454
|
-
let t =
|
|
456
|
+
function k(e) {
|
|
457
|
+
let t = We(e);
|
|
455
458
|
if (t) return t;
|
|
456
459
|
if (e instanceof Error) return {
|
|
457
460
|
name: d(e.name || "Error", 256),
|
|
458
|
-
message:
|
|
459
|
-
stackTrace: e.stack ? p(e.stack,
|
|
461
|
+
message: O(e.message),
|
|
462
|
+
stackTrace: e.stack ? p(e.stack, w) : void 0
|
|
460
463
|
};
|
|
461
464
|
if (e && typeof e == "object") {
|
|
462
465
|
let t = e;
|
|
463
466
|
return {
|
|
464
467
|
name: d(typeof t.name == "string" ? t.name : "Error", 256),
|
|
465
|
-
message:
|
|
466
|
-
stackTrace: typeof t.stack == "string" ? p(t.stack,
|
|
467
|
-
httpStatus:
|
|
468
|
+
message: O(typeof t.message == "string" ? t.message : String(e)),
|
|
469
|
+
stackTrace: typeof t.stack == "string" ? p(t.stack, w) : void 0,
|
|
470
|
+
httpStatus: Ue(t)
|
|
468
471
|
};
|
|
469
472
|
}
|
|
470
473
|
return {
|
|
471
474
|
name: "Error",
|
|
472
|
-
message:
|
|
475
|
+
message: O(typeof e == "string" ? e : String(e ?? He))
|
|
473
476
|
};
|
|
474
477
|
}
|
|
475
478
|
//#endregion
|
|
476
479
|
//#region src/error-report/diagnostics.ts
|
|
477
|
-
function
|
|
480
|
+
function Ge(e, t, n) {
|
|
478
481
|
return _(e, {
|
|
479
482
|
scope: t,
|
|
480
483
|
source: n
|
|
481
484
|
});
|
|
482
485
|
}
|
|
483
|
-
function
|
|
486
|
+
function A(e) {
|
|
484
487
|
let t = g(e.queryKey, { scope: "query-key" }) ?? { type: "redacted" }, i = r(n(t));
|
|
485
488
|
return {
|
|
486
489
|
queryHash: i,
|
|
@@ -492,31 +495,31 @@ function k(e) {
|
|
|
492
495
|
failureCount: e.state.fetchFailureCount,
|
|
493
496
|
isInvalidated: e.state.isInvalidated,
|
|
494
497
|
observersCount: e.getObserversCount(),
|
|
495
|
-
meta:
|
|
498
|
+
meta: Ge(e.meta, "query-meta", i),
|
|
496
499
|
dataShape: g(h(e.state.data), {
|
|
497
500
|
scope: "query-data-shape",
|
|
498
501
|
source: i
|
|
499
502
|
}),
|
|
500
|
-
error: e.state.error ?
|
|
503
|
+
error: e.state.error ? k(e.state.error) : void 0
|
|
501
504
|
};
|
|
502
505
|
}
|
|
503
|
-
function
|
|
506
|
+
function j(e) {
|
|
504
507
|
return {
|
|
505
508
|
mutationKey: e.options.mutationKey ? g(e.options.mutationKey, { scope: "mutation-key" }) : void 0,
|
|
506
509
|
status: e.state.status,
|
|
507
510
|
failureCount: e.state.failureCount,
|
|
508
511
|
submittedAt: e.state.submittedAt,
|
|
509
|
-
meta:
|
|
510
|
-
error: e.state.error ?
|
|
512
|
+
meta: Ge(e.meta, "mutation-meta"),
|
|
513
|
+
error: e.state.error ? k(e.state.error) : void 0
|
|
511
514
|
};
|
|
512
515
|
}
|
|
513
|
-
function
|
|
516
|
+
function M(e) {
|
|
514
517
|
return {
|
|
515
|
-
queries: e.getQueryCache().getAll().slice(-40).map(
|
|
516
|
-
mutations: e.getMutationCache().getAll().slice(-40).map(
|
|
518
|
+
queries: e.getQueryCache().getAll().slice(-40).map(A),
|
|
519
|
+
mutations: e.getMutationCache().getAll().slice(-40).map(j)
|
|
517
520
|
};
|
|
518
521
|
}
|
|
519
|
-
function
|
|
522
|
+
function Ke(e) {
|
|
520
523
|
let t = e.state, i = g(e.queryKey, { scope: "persisted-query-key" }), a = i ? r(n(i)) : void 0;
|
|
521
524
|
return {
|
|
522
525
|
buster: e.buster ? d(e.buster, 512) : void 0,
|
|
@@ -527,31 +530,31 @@ function qe(e) {
|
|
|
527
530
|
dataUpdatedAt: t.dataUpdatedAt,
|
|
528
531
|
errorUpdatedAt: t.errorUpdatedAt,
|
|
529
532
|
failureCount: t.fetchFailureCount,
|
|
530
|
-
error: t.error ?
|
|
533
|
+
error: t.error ? k(t.error) : void 0
|
|
531
534
|
};
|
|
532
535
|
}
|
|
533
|
-
async function
|
|
536
|
+
async function N() {
|
|
534
537
|
let e = o();
|
|
535
538
|
if (!e?.entries) return [];
|
|
536
539
|
try {
|
|
537
|
-
return (await e.entries()).slice(-40).map(([, e]) =>
|
|
540
|
+
return (await e.entries()).slice(-40).map(([, e]) => Ke(e));
|
|
538
541
|
} catch {
|
|
539
542
|
return [];
|
|
540
543
|
}
|
|
541
544
|
}
|
|
542
545
|
//#endregion
|
|
543
546
|
//#region src/error-report/environment.ts
|
|
544
|
-
function
|
|
547
|
+
function qe(e = {}) {
|
|
545
548
|
let t = e.isDev ?? __DEV__;
|
|
546
549
|
return typeof window < "u" && !t;
|
|
547
550
|
}
|
|
548
|
-
function
|
|
551
|
+
function Je() {
|
|
549
552
|
return {
|
|
550
553
|
mode: __DEV__ ? "development" : "production",
|
|
551
554
|
buildId: typeof __APP_BUILD_ID__ == "string" ? __APP_BUILD_ID__ : void 0
|
|
552
555
|
};
|
|
553
556
|
}
|
|
554
|
-
function
|
|
557
|
+
function Ye() {
|
|
555
558
|
if (!(typeof window > "u")) return {
|
|
556
559
|
userAgent: window.navigator.userAgent,
|
|
557
560
|
language: window.navigator.language,
|
|
@@ -560,20 +563,20 @@ function Xe() {
|
|
|
560
563
|
}
|
|
561
564
|
//#endregion
|
|
562
565
|
//#region src/error-report/schema.ts
|
|
563
|
-
var
|
|
566
|
+
var P = c.lazy(() => c.union([
|
|
564
567
|
c.string().max(4096),
|
|
565
568
|
c.number().finite(),
|
|
566
569
|
c.boolean(),
|
|
567
570
|
c.null(),
|
|
568
|
-
c.array(
|
|
569
|
-
c.record(c.string(),
|
|
570
|
-
])),
|
|
571
|
+
c.array(P).max(20),
|
|
572
|
+
c.record(c.string(), P).refine((e) => Object.keys(e).length <= 40)
|
|
573
|
+
])), F = c.record(c.string(), P).refine((e) => Object.keys(e).length <= 40), I = c.object({
|
|
571
574
|
name: c.string().min(1).max(256),
|
|
572
575
|
message: c.string().min(1).max(4096),
|
|
573
576
|
code: c.string().max(128).optional(),
|
|
574
577
|
stackTrace: c.string().refine((e) => f(e) <= 65536).optional(),
|
|
575
578
|
httpStatus: c.number().finite().optional()
|
|
576
|
-
}).strict(),
|
|
579
|
+
}).strict(), Xe = c.object({
|
|
577
580
|
utc: c.string().min(1).max(64),
|
|
578
581
|
type: c.enum([
|
|
579
582
|
"route",
|
|
@@ -587,10 +590,10 @@ var N = c.lazy(() => c.union([
|
|
|
587
590
|
appId: c.string().max(128).optional(),
|
|
588
591
|
viewId: c.string().max(128).optional(),
|
|
589
592
|
target: c.string().max(2048).optional(),
|
|
590
|
-
detail:
|
|
591
|
-
}).strict(),
|
|
593
|
+
detail: F.optional()
|
|
594
|
+
}).strict(), Ze = c.object({
|
|
592
595
|
queryHash: c.string().max(512),
|
|
593
|
-
queryKey:
|
|
596
|
+
queryKey: P,
|
|
594
597
|
status: c.string().max(64).optional(),
|
|
595
598
|
fetchStatus: c.string().max(64).optional(),
|
|
596
599
|
dataUpdatedAt: c.number().finite().optional(),
|
|
@@ -598,27 +601,27 @@ var N = c.lazy(() => c.union([
|
|
|
598
601
|
failureCount: c.number().finite().optional(),
|
|
599
602
|
isInvalidated: c.boolean().optional(),
|
|
600
603
|
observersCount: c.number().finite().optional(),
|
|
601
|
-
meta:
|
|
602
|
-
dataShape:
|
|
603
|
-
error:
|
|
604
|
-
}).strict(),
|
|
605
|
-
mutationKey:
|
|
604
|
+
meta: F.optional(),
|
|
605
|
+
dataShape: P.optional(),
|
|
606
|
+
error: I.optional()
|
|
607
|
+
}).strict(), Qe = c.object({
|
|
608
|
+
mutationKey: P.optional(),
|
|
606
609
|
status: c.string().max(64).optional(),
|
|
607
610
|
failureCount: c.number().finite().optional(),
|
|
608
611
|
submittedAt: c.number().finite().optional(),
|
|
609
|
-
meta:
|
|
610
|
-
error:
|
|
611
|
-
}).strict(),
|
|
612
|
+
meta: F.optional(),
|
|
613
|
+
error: I.optional()
|
|
614
|
+
}).strict(), $e = c.object({
|
|
612
615
|
buster: c.string().max(512).optional(),
|
|
613
616
|
queryHash: c.string().max(512).optional(),
|
|
614
|
-
queryKey:
|
|
617
|
+
queryKey: P.optional(),
|
|
615
618
|
status: c.string().max(64).optional(),
|
|
616
619
|
fetchStatus: c.string().max(64).optional(),
|
|
617
620
|
dataUpdatedAt: c.number().finite().optional(),
|
|
618
621
|
errorUpdatedAt: c.number().finite().optional(),
|
|
619
622
|
failureCount: c.number().finite().optional(),
|
|
620
|
-
error:
|
|
621
|
-
}).strict(),
|
|
623
|
+
error: I.optional()
|
|
624
|
+
}).strict(), et = c.object({
|
|
622
625
|
payloadVersion: c.literal(1),
|
|
623
626
|
application: c.string().min(1).max(128),
|
|
624
627
|
reportId: c.string().uuid(),
|
|
@@ -631,7 +634,7 @@ var N = c.lazy(() => c.union([
|
|
|
631
634
|
"react"
|
|
632
635
|
]),
|
|
633
636
|
source: c.string().min(1).max(256),
|
|
634
|
-
error:
|
|
637
|
+
error: I,
|
|
635
638
|
environment: c.object({
|
|
636
639
|
mode: c.enum(["development", "production"]),
|
|
637
640
|
buildId: c.string().max(128).optional()
|
|
@@ -651,22 +654,22 @@ var N = c.lazy(() => c.union([
|
|
|
651
654
|
devicePixelRatio: c.number().finite().optional()
|
|
652
655
|
}).strict().optional(),
|
|
653
656
|
react: c.object({ componentStack: c.string().refine((e) => f(e) <= 32768).optional() }).strict().optional(),
|
|
654
|
-
query:
|
|
655
|
-
mutation:
|
|
657
|
+
query: Ze.optional(),
|
|
658
|
+
mutation: Qe.optional(),
|
|
656
659
|
queryClient: c.object({
|
|
657
|
-
queries: c.array(
|
|
658
|
-
mutations: c.array(
|
|
660
|
+
queries: c.array(Ze).max(40),
|
|
661
|
+
mutations: c.array(Qe).max(40)
|
|
659
662
|
}).strict().optional(),
|
|
660
|
-
persistedQueries: c.array(
|
|
661
|
-
breadcrumbs: c.array(
|
|
662
|
-
context:
|
|
663
|
+
persistedQueries: c.array($e).max(40).optional(),
|
|
664
|
+
breadcrumbs: c.array(Xe).max(80),
|
|
665
|
+
context: F.optional(),
|
|
663
666
|
truncation: c.object({
|
|
664
667
|
reason: c.literal("payload-size"),
|
|
665
|
-
limitBytes: c.literal(
|
|
668
|
+
limitBytes: c.literal(C),
|
|
666
669
|
originalBytes: c.number().int().positive(),
|
|
667
670
|
droppedSections: c.array(c.string().max(128)).max(32)
|
|
668
671
|
}).strict().optional()
|
|
669
|
-
}).strict().refine((e) =>
|
|
672
|
+
}).strict().refine((e) => D(e) <= C), tt = c.object({
|
|
670
673
|
reportId: c.string().uuid(),
|
|
671
674
|
sessionId: c.string().uuid(),
|
|
672
675
|
createdUtc: c.string().min(1).max(64),
|
|
@@ -684,14 +687,14 @@ var N = c.lazy(() => c.union([
|
|
|
684
687
|
]),
|
|
685
688
|
sentUtc: c.string().min(1).max(64).optional(),
|
|
686
689
|
failedReason: c.string().max(4096).optional(),
|
|
687
|
-
payload:
|
|
690
|
+
payload: et
|
|
688
691
|
}).strict().superRefine((e, t) => {
|
|
689
692
|
(e.reportId !== e.payload.reportId || e.sessionId !== e.payload.sessionId || e.createdUtc !== e.payload.createdUtc || e.category !== e.payload.category) && t.addIssue({
|
|
690
693
|
code: "custom",
|
|
691
694
|
message: "Draft identity должна совпадать с payload identity."
|
|
692
695
|
});
|
|
693
696
|
});
|
|
694
|
-
function
|
|
697
|
+
function nt(e, t) {
|
|
695
698
|
try {
|
|
696
699
|
return new TextEncoder().encode(JSON.stringify(e)).byteLength <= t;
|
|
697
700
|
} catch {
|
|
@@ -699,16 +702,16 @@ function I(e, t) {
|
|
|
699
702
|
}
|
|
700
703
|
}
|
|
701
704
|
function L(e) {
|
|
702
|
-
if (
|
|
703
|
-
let t =
|
|
705
|
+
if (nt(e, 262144)) try {
|
|
706
|
+
let t = et.safeParse(e);
|
|
704
707
|
return t.success ? t.data : void 0;
|
|
705
708
|
} catch {
|
|
706
709
|
return;
|
|
707
710
|
}
|
|
708
711
|
}
|
|
709
712
|
function R(e) {
|
|
710
|
-
if (
|
|
711
|
-
let t =
|
|
713
|
+
if (nt(e, 278528)) try {
|
|
714
|
+
let t = tt.safeParse(e);
|
|
712
715
|
return t.success ? t.data : void 0;
|
|
713
716
|
} catch {
|
|
714
717
|
return;
|
|
@@ -779,8 +782,8 @@ function mt() {
|
|
|
779
782
|
return z;
|
|
780
783
|
}
|
|
781
784
|
function B(e) {
|
|
782
|
-
if (!
|
|
783
|
-
let t = i(), n = s(at), r = ot(), a =
|
|
785
|
+
if (!qe()) return;
|
|
786
|
+
let t = i(), n = s(at), r = ot(), a = Ve({
|
|
784
787
|
payloadVersion: 1,
|
|
785
788
|
application: __APP_ID__,
|
|
786
789
|
reportId: t,
|
|
@@ -789,8 +792,8 @@ function B(e) {
|
|
|
789
792
|
category: e.category,
|
|
790
793
|
source: d(e.source, 256),
|
|
791
794
|
error: e.error,
|
|
792
|
-
environment:
|
|
793
|
-
client:
|
|
795
|
+
environment: Je(),
|
|
796
|
+
client: Ye(),
|
|
794
797
|
location: lt(),
|
|
795
798
|
viewport: ut(),
|
|
796
799
|
react: e.react,
|
|
@@ -911,12 +914,12 @@ async function Nt(e, t, n, r) {
|
|
|
911
914
|
source: i
|
|
912
915
|
})
|
|
913
916
|
});
|
|
914
|
-
let [a, o] = await Promise.all([
|
|
917
|
+
let [a, o] = await Promise.all([N(), Promise.resolve(M(n))]);
|
|
915
918
|
return B({
|
|
916
919
|
category: "query",
|
|
917
920
|
source: i,
|
|
918
|
-
error: r?.errorInfo ??
|
|
919
|
-
query:
|
|
921
|
+
error: r?.errorInfo ?? k(e),
|
|
922
|
+
query: A(t),
|
|
920
923
|
queryClient: o,
|
|
921
924
|
persistedQueries: a,
|
|
922
925
|
context: _(r?.detail, {
|
|
@@ -938,12 +941,12 @@ async function Pt(e, t, n, r = {}) {
|
|
|
938
941
|
source: i
|
|
939
942
|
})
|
|
940
943
|
});
|
|
941
|
-
let [a, o] = await Promise.all([
|
|
944
|
+
let [a, o] = await Promise.all([N(), Promise.resolve(M(n))]);
|
|
942
945
|
return B({
|
|
943
946
|
category: "mutation",
|
|
944
947
|
source: i,
|
|
945
|
-
error: r.errorInfo ??
|
|
946
|
-
mutation:
|
|
948
|
+
error: r.errorInfo ?? k(e),
|
|
949
|
+
mutation: j(t),
|
|
947
950
|
queryClient: o,
|
|
948
951
|
persistedQueries: a,
|
|
949
952
|
context: _(r.detail, {
|
|
@@ -953,7 +956,7 @@ async function Pt(e, t, n, r = {}) {
|
|
|
953
956
|
});
|
|
954
957
|
}
|
|
955
958
|
function Ft(e, t = {}, n) {
|
|
956
|
-
let r = t.category ?? "runtime", i = t.source ?? t.category ?? "runtime", a = t.errorInfo ??
|
|
959
|
+
let r = t.category ?? "runtime", i = t.source ?? t.category ?? "runtime", a = t.errorInfo ?? k(e), o = _(t.detail, {
|
|
957
960
|
scope: "context",
|
|
958
961
|
source: i
|
|
959
962
|
}), s = async () => {
|
|
@@ -968,7 +971,7 @@ function Ft(e, t = {}, n) {
|
|
|
968
971
|
source: i
|
|
969
972
|
})
|
|
970
973
|
});
|
|
971
|
-
let [e, s] = n ? await Promise.all([
|
|
974
|
+
let [e, s] = n ? await Promise.all([N(), Promise.resolve(M(n))]) : [void 0, void 0];
|
|
972
975
|
return B({
|
|
973
976
|
category: r,
|
|
974
977
|
source: i,
|
|
@@ -1233,6 +1236,6 @@ async function Yt(e, t = {}) {
|
|
|
1233
1236
|
} catch {}
|
|
1234
1237
|
}
|
|
1235
1238
|
//#endregion
|
|
1236
|
-
export {
|
|
1239
|
+
export { C as ERROR_REPORT_PAYLOAD_MAX_BYTES, Ae as ERROR_REPORT_PAYLOAD_VERSION, zt as ERROR_REPORT_QUEUE_LEASE_MS, Lt as ERROR_REPORT_QUEUE_MAX_ITEMS, Rt as ERROR_REPORT_QUEUE_TTL_MS, It as ERROR_REPORT_QUEUE_VERSION, w as ERROR_REPORT_STACK_TRACE_MAX_BYTES, y as addErrorReportBreadcrumb, B as captureErrorReportDraft, Pt as captureMutationErrorReport, Nt as captureQueryErrorReport, Ft as captureRuntimeErrorReport, ye as clearErrorReportBreadcrumbs, j as collectMutationDiagnostics, N as collectPersistedQueryDiagnostics, M as collectQueryClientDiagnostics, A as collectQueryDiagnostics, h as createDataShape, de as createDiagnosticValue, k as createErrorInfo, qt as createErrorReportQueue, ve as getErrorReportBreadcrumbs, Ye as getErrorReportClientEnvironment, ft as getErrorReportDraft, mt as getErrorReportDrafts, Je as getErrorReportEnvironment, D as getErrorReportPayloadSize, f as getUtf8TextSize, ke as installErrorReportBrowserBreadcrumbs, qe as isErrorReportingEnabled, jt as isTransportErrorReportScheduled, Ve as limitErrorReportPayload, J as normalizeErrorReportQueueRecords, R as parseErrorReportDraft, rt as parseErrorReportDrafts, L as parseErrorReportPayload, Wt as parseErrorReportQueueRecord, Yt as reportRuntimeError, Mt as reportTransportError, _ as sanitizeDetail, d as sanitizeDiagnosticText, p as sanitizeDiagnosticTextBytes, g as sanitizeErrorReportValue, Jt as setErrorReportRuntimeErrorReporter, fe as setErrorReportSanitizer, At as setErrorReportTransportErrorReporter, G as suppressTransportErrorReport, pt as updateErrorReportDraft };
|
|
1237
1240
|
|
|
1238
1241
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/error-report/safeValue.ts","../../src/error-report/breadcrumbs.ts","../../src/error-report/payload.ts","../../src/error-report/errorInfo.ts","../../src/error-report/diagnostics.ts","../../src/error-report/environment.ts","../../src/error-report/schema.ts","../../src/error-report/drafts.ts","../../src/error-report/runtimeDeduplication.ts","../../src/error-report/transport.ts","../../src/error-report/capture.ts","../../src/error-report/queueContract.ts","../../src/error-report/queueRecord.ts","../../src/error-report/queue.ts","../../src/error-report/runtime.ts"],"sourcesContent":["import type { ErrorReportSafeValue, ErrorReportSanitizationContext, ErrorReportSanitizer } from \"./types\";\n\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\nconst MAX_OBJECT_KEYS = 40;\nconst MAX_DIAGNOSTIC_STRING_LENGTH = 4_096;\nconst REDACTED_VALUE = \"[REDACTED]\";\nconst SENSITIVE_KEY_PARTS = [\n\t\"apikey\",\n\t\"authorization\",\n\t\"cookie\",\n\t\"csrf\",\n\t\"password\",\n\t\"passwd\",\n\t\"refreshtoken\",\n\t\"secret\",\n\t\"sessiontoken\",\n\t\"token\"\n];\nconst URL_KEY_SUFFIX = \"url\";\n\nlet errorReportSanitizer: ErrorReportSanitizer | undefined;\n\nfunction normalizeKey(key: string) {\n\treturn key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction isSensitiveKey(key: string) {\n\tconst normalizedKey = normalizeKey(key);\n\treturn SENSITIVE_KEY_PARTS.some((part) => normalizedKey.includes(part));\n}\n\nfunction isUrlKey(key: string) {\n\treturn normalizeKey(key).endsWith(URL_KEY_SUFFIX);\n}\n\nfunction looksLikeUrlWithPrivateParts(value: string) {\n\treturn /^(?:https?:\\/\\/|\\/)[^\\s]*[?#]/i.test(value);\n}\n\nfunction stripUrlSearchAndHash(value: string) {\n\ttry {\n\t\tconst parsed = new URL(value, \"https://error-report.invalid\");\n\t\tconst pathname = parsed.pathname;\n\t\treturn parsed.origin === \"https://error-report.invalid\" ? pathname : `${parsed.origin}${pathname}`;\n\t} catch {\n\t\treturn value.split(/[?#]/, 1)[0] ?? value;\n\t}\n}\n\n/**\n * Удаляет наиболее узнаваемые секреты и email из свободного диагностического\n * текста. Это страховочная сетка; предметные персональные данные приложение\n * обязано исключить своим allow-list sanitizer.\n */\nexport function sanitizeDiagnosticText(value: string, maxLength = MAX_DIAGNOSTIC_STRING_LENGTH) {\n\tlet sanitizedValue = value.slice(0, maxLength);\n\tif (/\\bbearer\\s/i.test(sanitizedValue)) {\n\t\tsanitizedValue = sanitizedValue.replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]{8,}/gi, \"Bearer [REDACTED]\");\n\t}\n\tif (sanitizedValue.includes(\"@\")) {\n\t\tsanitizedValue = sanitizedValue.replace(/[A-Z0-9._%+-]{1,254}@[A-Z0-9.-]{1,253}\\.[A-Z]{2,63}/gi, \"[REDACTED_EMAIL]\");\n\t}\n\n\treturn sanitizedValue;\n}\n\n/** Возвращает размер строки в UTF-8, совпадающий с размером JSON transport. */\nexport function getUtf8TextSize(value: string) {\n\treturn new TextEncoder().encode(value).byteLength;\n}\n\n/**\n * Обрезает уже очищенный текст по UTF-8 bytes без разрыва surrogate pair.\n * Binary search нужен для Unicode stack traces, где число code units не равно\n * размеру transport payload.\n */\nexport function sanitizeDiagnosticTextBytes(value: string, maxBytes: number) {\n\tconst sanitizedValue = sanitizeDiagnosticText(value, maxBytes);\n\tif (getUtf8TextSize(sanitizedValue) <= maxBytes) return sanitizedValue;\n\n\tlet left = 0;\n\tlet right = sanitizedValue.length;\n\twhile (left < right) {\n\t\tconst middle = Math.ceil((left + right) / 2);\n\t\tif (getUtf8TextSize(sanitizedValue.slice(0, middle)) <= maxBytes) left = middle;\n\t\telse right = middle - 1;\n\t}\n\n\tconst lastCodeUnit = sanitizedValue.charCodeAt(left - 1);\n\tconst safeEnd = lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff ? left - 1 : left;\n\treturn sanitizedValue.slice(0, safeEnd);\n}\n\ntype DiagnosticValueState = {\n\tseen: WeakSet<object>;\n\tmaxStringLength: number;\n};\n\nfunction createDiagnosticValueInternal(value: unknown, depth: number, state: DiagnosticValueState, key?: string): ErrorReportSafeValue {\n\tif (key && isSensitiveKey(key)) return REDACTED_VALUE;\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") return Number.isFinite(value) ? value : { type: \"non-finite-number\" };\n\tif (typeof value === \"string\") {\n\t\tconst normalizedValue = (key && isUrlKey(key)) || looksLikeUrlWithPrivateParts(value) ? stripUrlSearchAndHash(value) : value;\n\t\treturn sanitizeDiagnosticText(normalizedValue, state.maxStringLength);\n\t}\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (value instanceof Date) return Number.isNaN(value.getTime()) ? { type: \"invalid-date\" } : value.toISOString();\n\tif (typeof value === \"object\") {\n\t\tif (state.seen.has(value)) return { type: \"circular\" };\n\t\tstate.seen.add(value);\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.slice(0, MAX_ARRAY_ITEMS).map((item) => createDiagnosticValueInternal(item, depth + 1, state));\n\t}\n\tif (typeof value === \"object\") {\n\t\ttry {\n\t\t\tconst entries = Object.entries(value as Record<string, unknown>)\n\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t.slice(0, MAX_OBJECT_KEYS);\n\n\t\t\treturn Object.fromEntries(\n\t\t\t\tentries.map(([entryKey, item]) => [entryKey, createDiagnosticValueInternal(item, depth + 1, state, entryKey)])\n\t\t\t);\n\t\t} catch {\n\t\t\treturn { type: \"unreadable\" };\n\t\t}\n\t}\n\tif (typeof value === \"function\") return { type: \"function\" };\n\tif (typeof value === \"symbol\") return { type: \"symbol\" };\n\tif (typeof value === \"bigint\") return value.toString();\n\n\treturn { type: \"unknown\" };\n}\n\n/**\n * Превращает произвольное значение в JSON-совместимую диагностическую форму.\n * Значения сохраняются читаемыми, потому что queryKey/meta/context нужны\n * для восстановления пользовательского сценария; тяжелые данные query cache\n * отсекаются отдельно и сюда не передаются.\n */\nexport function createDiagnosticValue(value: unknown, depth = 0): ErrorReportSafeValue {\n\treturn createDiagnosticValueInternal(value, depth, {\n\t\tseen: new WeakSet(),\n\t\tmaxStringLength: MAX_DIAGNOSTIC_STRING_LENGTH\n\t});\n}\n\n/**\n * Описывает форму данных кеша без самих значений: типы, размеры массивов и ключи объектов.\n */\nexport function createDataShape(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null) return { type: \"null\" };\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (Array.isArray(value)) {\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tlength: value.length,\n\t\t\tfirstItemsShape: value.slice(0, 3).map((item) => createDataShape(item, depth + 1))\n\t\t};\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tkeys: entries.map(([key]) => key),\n\t\t\tshape: Object.fromEntries(entries.map(([key, item]) => [key, createDataShape(item, depth + 1)]))\n\t\t};\n\t}\n\n\treturn { type: typeof value };\n}\n\n/**\n * Подключает предметный sanitizer приложения. `undefined` отключает callback и\n * одновременно предотвращает утечку старой policy при hot reload и в тестах.\n */\nexport function setErrorReportSanitizer(sanitizer: ErrorReportSanitizer | undefined) {\n\terrorReportSanitizer = sanitizer;\n}\n\n/**\n * Выполняет built-in нормализацию, затем предметную policy приложения и ещё\n * одну bounded-нормализацию результата перед включением секции в payload.\n */\nexport function sanitizeErrorReportValue(\n\tvalue: unknown,\n\tcontext: ErrorReportSanitizationContext,\n\tmaxStringLength = MAX_DIAGNOSTIC_STRING_LENGTH\n) {\n\tconst createBoundedValue = (candidate: unknown) =>\n\t\tcreateDiagnosticValueInternal(candidate, 0, { seen: new WeakSet(), maxStringLength });\n\tconst safeValue = createBoundedValue(value);\n\tif (!errorReportSanitizer) return safeValue;\n\n\ttry {\n\t\tconst appSanitizedValue = errorReportSanitizer(safeValue, context);\n\t\treturn appSanitizedValue === undefined ? undefined : createBoundedValue(appSanitizedValue);\n\t} catch {\n\t\t// Ошибка optional sanitizer безопаснее приводит к удалению секции, а не к\n\t\t// сохранению потенциально чувствительного исходного значения.\n\t\treturn undefined;\n\t}\n}\n\nexport function sanitizeDetail(\n\tdetail: Record<string, unknown> | undefined,\n\tcontext: ErrorReportSanitizationContext = { scope: \"context\" }\n): Record<string, ErrorReportSafeValue> | undefined {\n\tif (!detail) return undefined;\n\n\tconst sanitizedValue = sanitizeErrorReportValue(detail, context);\n\tif (!sanitizedValue || Array.isArray(sanitizedValue) || typeof sanitizedValue !== \"object\") return undefined;\n\n\treturn Object.keys(sanitizedValue).length ? sanitizedValue : undefined;\n}\n","import { truncateText } from \"../formatters\";\n\nimport { sanitizeDetail, sanitizeDiagnosticText } from \"./safeValue\";\n\nimport type { ErrorReportBreadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 80;\nconst MAX_ELEMENT_CHAIN = 20;\nconst MAX_ATTRIBUTE_LENGTH = 120;\nconst CLICK_TARGET_SELECTOR = [\"button\", \"a\", \"input\", \"select\", \"textarea\", \"[role]\", \"[data-error-report-target]\"].join(\",\");\nconst SAFE_TARGET_VALUE = /^[a-z0-9][a-z0-9._:/-]*$/i;\n\nlet breadcrumbs: ErrorReportBreadcrumb[] = [];\n\nfunction nowUtc() {\n\treturn new Date().toISOString();\n}\n\nexport function addErrorReportBreadcrumb(breadcrumb: Omit<ErrorReportBreadcrumb, \"utc\"> & { utc?: string }) {\n\tbreadcrumbs = [\n\t\t...breadcrumbs,\n\t\t{\n\t\t\t...breadcrumb,\n\t\t\tutc: sanitizeDiagnosticText(breadcrumb.utc ?? nowUtc(), 64),\n\t\t\trouteId: breadcrumb.routeId\n\t\t\t\t? sanitizeDiagnosticText(breadcrumb.routeId.split(/[?#]/, 1)[0] ?? breadcrumb.routeId, 512)\n\t\t\t\t: undefined,\n\t\t\tappId: breadcrumb.appId ? sanitizeDiagnosticText(breadcrumb.appId, 128) : undefined,\n\t\t\tviewId: breadcrumb.viewId ? sanitizeDiagnosticText(breadcrumb.viewId, 128) : undefined,\n\t\t\ttarget: breadcrumb.target ? sanitizeDiagnosticText(breadcrumb.target, 2_048) : undefined,\n\t\t\tdetail: sanitizeDetail(breadcrumb.detail, {\n\t\t\t\tscope: \"breadcrumb-detail\",\n\t\t\t\tsource: breadcrumb.type\n\t\t\t})\n\t\t}\n\t].slice(-MAX_BREADCRUMBS);\n}\n\nexport function getErrorReportBreadcrumbs() {\n\treturn breadcrumbs.slice();\n}\n\nexport function clearErrorReportBreadcrumbs() {\n\tbreadcrumbs = [];\n}\n\nfunction truncateAttributeText(value: string | null | undefined) {\n\treturn truncateText(value, MAX_ATTRIBUTE_LENGTH);\n}\n\nfunction readSafeTargetValue(element: Element) {\n\tconst value = truncateAttributeText(element.getAttribute(\"data-error-report-target\"));\n\treturn value && SAFE_TARGET_VALUE.test(value) ? value : undefined;\n}\n\nfunction readTechnicalAttribute(element: Element, name: string) {\n\tconst value = truncateAttributeText(element.getAttribute(name));\n\treturn value && SAFE_TARGET_VALUE.test(value) ? value : undefined;\n}\n\nfunction readTechnicalAttributes(element: Element) {\n\treturn {\n\t\trole: readTechnicalAttribute(element, \"role\"),\n\t\ttype: readTechnicalAttribute(element, \"type\"),\n\t\terrorReportTarget: readSafeTargetValue(element)\n\t};\n}\n\nfunction escapeSelectorPart(value: string) {\n\tif (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n\t\treturn CSS.escape(value);\n\t}\n\n\treturn value.replace(/[\"\\\\#.[\\]>~+:]/g, \"\\\\$&\");\n}\n\nfunction buildElementSelector(element: Element) {\n\tconst attrs = readTechnicalAttributes(element);\n\tconst parts = [element.tagName.toLowerCase()];\n\n\tif (attrs.role) parts.push(`[role=\"${attrs.role}\"]`);\n\tif (attrs.type) parts.push(`[type=\"${attrs.type}\"]`);\n\tif (attrs.errorReportTarget) {\n\t\tparts.push(`[data-error-report-target=\"${escapeSelectorPart(attrs.errorReportTarget)}\"]`);\n\t}\n\n\treturn parts.join(\"\");\n}\n\nfunction describeElement(element: Element) {\n\tconst attrs = readTechnicalAttributes(element);\n\n\treturn {\n\t\ttag: element.tagName.toLowerCase(),\n\t\tselector: buildElementSelector(element),\n\t\t...attrs\n\t};\n}\n\nfunction compactElementDescription(description: ReturnType<typeof describeElement>) {\n\treturn Object.fromEntries(\n\t\tObject.entries(description).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n\t);\n}\n\nfunction getClickElementChain(target: Element) {\n\tconst chain: Element[] = [];\n\tlet current: Element | null = target;\n\n\twhile (current && current !== document.documentElement && chain.length < MAX_ELEMENT_CHAIN) {\n\t\tchain.push(current);\n\t\tif (current === document.body) break;\n\t\tcurrent = current.parentElement;\n\t}\n\n\treturn chain;\n}\n\nfunction findMeaningfulClickTarget(target: Element) {\n\treturn target.closest(CLICK_TARGET_SELECTOR) ?? target;\n}\n\nfunction describeClickTarget(target: EventTarget | null) {\n\tif (!(target instanceof Element)) return undefined;\n\n\tconst meaningfulTarget = findMeaningfulClickTarget(target);\n\tconst chain = getClickElementChain(meaningfulTarget);\n\n\treturn chain.map((element) => buildElementSelector(element)).join(\" > \");\n}\n\nfunction describeClickDetail(event: MouseEvent) {\n\tconst target = event.target instanceof Element ? event.target : undefined;\n\tconst meaningfulTarget = target ? findMeaningfulClickTarget(target) : undefined;\n\tconst chain = meaningfulTarget\n\t\t? getClickElementChain(meaningfulTarget).map((element) => compactElementDescription(describeElement(element)))\n\t\t: [];\n\n\treturn sanitizeDetail(\n\t\t{\n\t\t\tbutton: event.button,\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\ttarget: meaningfulTarget ? compactElementDescription(describeElement(meaningfulTarget)) : undefined,\n\t\t\tchain\n\t\t},\n\t\t{ scope: \"breadcrumb-detail\", source: \"click\" }\n\t);\n}\n\n/**\n * Подключает breadcrumbs по действиям пользователя без тел запросов.\n */\nexport function installErrorReportBrowserBreadcrumbs() {\n\tif (typeof window === \"undefined\") return () => undefined;\n\n\tconst onClick = (event: MouseEvent) => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"click\",\n\t\t\ttarget: describeClickTarget(event.target),\n\t\t\tdetail: describeClickDetail(event)\n\t\t});\n\t};\n\n\tconst onVisibilityChange = () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"visibility\",\n\t\t\tdetail: sanitizeDetail({ visibilityState: document.visibilityState }, { scope: \"breadcrumb-detail\", source: \"visibility\" })\n\t\t});\n\t};\n\n\twindow.addEventListener(\"click\", onClick, true);\n\tdocument.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n\treturn () => {\n\t\twindow.removeEventListener(\"click\", onClick, true);\n\t\tdocument.removeEventListener(\"visibilitychange\", onVisibilityChange);\n\t};\n}\n","import { sanitizeDetail, sanitizeDiagnosticText, sanitizeDiagnosticTextBytes, sanitizeErrorReportValue } from \"./safeValue\";\n\nimport type {\n\tErrorReportErrorInfo,\n\tErrorReportMutationDiagnostics,\n\tErrorReportPayload,\n\tErrorReportPersistedQueryDiagnostics,\n\tErrorReportQueryDiagnostics\n} from \"./types\";\n\nexport const ERROR_REPORT_PAYLOAD_VERSION = 1 as const;\nexport const ERROR_REPORT_PAYLOAD_MAX_BYTES = 256 * 1_024;\nexport const ERROR_REPORT_STACK_TRACE_MAX_BYTES = 64 * 1_024;\n\nconst ERROR_REPORT_COMPONENT_STACK_MAX_BYTES = 32 * 1_024;\nconst ERROR_REPORT_SOURCE_MAX_LENGTH = 256;\nconst ERROR_REPORT_APPLICATION_MAX_LENGTH = 128;\nconst ERROR_REPORT_LOCATION_MAX_LENGTH = 2_048;\n\nfunction serializedByteLength(value: unknown) {\n\treturn new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\nfunction sanitizePathname(value: string) {\n\treturn sanitizeDiagnosticText(value.split(/[?#]/, 1)[0] ?? value, ERROR_REPORT_LOCATION_MAX_LENGTH);\n}\n\nfunction sanitizeScopedText(\n\tvalue: string,\n\tcontext: { scope: \"error-message\" | \"stack-trace\"; source?: string },\n\tlimit: number,\n\tlimitUnit: \"bytes\" | \"characters\" = \"characters\"\n) {\n\tconst builtInValue = limitUnit === \"bytes\" ? sanitizeDiagnosticTextBytes(value, limit) : sanitizeDiagnosticText(value, limit);\n\tconst sanitizedValue = sanitizeErrorReportValue(builtInValue, context, limit);\n\tif (typeof sanitizedValue !== \"string\") return undefined;\n\treturn limitUnit === \"bytes\" ? sanitizeDiagnosticTextBytes(sanitizedValue, limit) : sanitizeDiagnosticText(sanitizedValue, limit);\n}\n\nfunction sanitizeErrorInfo(error: ErrorReportErrorInfo, source?: string): ErrorReportErrorInfo {\n\treturn {\n\t\tname: sanitizeDiagnosticText(error.name, 256),\n\t\tmessage: sanitizeScopedText(error.message, { scope: \"error-message\", source }, 4_096) ?? \"[REDACTED]\",\n\t\tcode: error.code ? sanitizeDiagnosticText(error.code, 128) : undefined,\n\t\tstackTrace: error.stackTrace\n\t\t\t? sanitizeScopedText(error.stackTrace, { scope: \"stack-trace\", source }, ERROR_REPORT_STACK_TRACE_MAX_BYTES, \"bytes\")\n\t\t\t: undefined,\n\t\thttpStatus: error.httpStatus\n\t};\n}\n\nfunction sanitizeQueryDiagnostics(query: ErrorReportQueryDiagnostics): ErrorReportQueryDiagnostics {\n\treturn {\n\t\t...query,\n\t\tqueryHash: sanitizeDiagnosticText(query.queryHash, 512),\n\t\tqueryKey: sanitizeErrorReportValue(query.queryKey, {\n\t\t\tscope: \"query-key\",\n\t\t\tsource: query.queryHash\n\t\t}) ?? { type: \"redacted\" },\n\t\tmeta: sanitizeDetail(query.meta, { scope: \"query-meta\", source: query.queryHash }),\n\t\tdataShape: query.dataShape\n\t\t\t? sanitizeErrorReportValue(query.dataShape, { scope: \"query-data-shape\", source: query.queryHash })\n\t\t\t: undefined,\n\t\terror: query.error ? sanitizeErrorInfo(query.error, query.queryHash) : undefined\n\t};\n}\n\nfunction sanitizeMutationDiagnostics(mutation: ErrorReportMutationDiagnostics): ErrorReportMutationDiagnostics {\n\treturn {\n\t\t...mutation,\n\t\tmutationKey: mutation.mutationKey ? sanitizeErrorReportValue(mutation.mutationKey, { scope: \"mutation-key\" }) : undefined,\n\t\tmeta: sanitizeDetail(mutation.meta, { scope: \"mutation-meta\" }),\n\t\terror: mutation.error ? sanitizeErrorInfo(mutation.error, \"mutation\") : undefined\n\t};\n}\n\nfunction sanitizePersistedQueryDiagnostics(query: ErrorReportPersistedQueryDiagnostics): ErrorReportPersistedQueryDiagnostics {\n\treturn {\n\t\t...query,\n\t\tbuster: query.buster ? sanitizeDiagnosticText(query.buster, 512) : undefined,\n\t\tqueryHash: query.queryHash ? sanitizeDiagnosticText(query.queryHash, 512) : undefined,\n\t\tqueryKey: query.queryKey\n\t\t\t? sanitizeErrorReportValue(query.queryKey, {\n\t\t\t\t\tscope: \"persisted-query-key\",\n\t\t\t\t\tsource: query.queryHash\n\t\t\t\t})\n\t\t\t: undefined,\n\t\terror: query.error ? sanitizeErrorInfo(query.error, query.queryHash) : undefined\n\t};\n}\n\n/** Возвращает точный UTF-8 размер JSON-формы, которую получит transport. */\nexport function getErrorReportPayloadSize(payload: ErrorReportPayload) {\n\treturn serializedByteLength(payload);\n}\n\nfunction normalizePayloadStrings(payload: ErrorReportPayload): ErrorReportPayload {\n\treturn {\n\t\t...payload,\n\t\treportId: sanitizeDiagnosticText(payload.reportId, 128),\n\t\tsessionId: sanitizeDiagnosticText(payload.sessionId, 128),\n\t\tcreatedUtc: sanitizeDiagnosticText(payload.createdUtc, 64),\n\t\tapplication: sanitizeDiagnosticText(payload.application, ERROR_REPORT_APPLICATION_MAX_LENGTH),\n\t\tsource: sanitizeDiagnosticText(payload.source, ERROR_REPORT_SOURCE_MAX_LENGTH),\n\t\terror: sanitizeErrorInfo(payload.error, payload.source),\n\t\tenvironment: {\n\t\t\t...payload.environment,\n\t\t\tbuildId: payload.environment.buildId ? sanitizeDiagnosticText(payload.environment.buildId, 128) : undefined\n\t\t},\n\t\tclient: payload.client\n\t\t\t? {\n\t\t\t\t\tuserAgent: payload.client.userAgent ? sanitizeDiagnosticText(payload.client.userAgent) : undefined,\n\t\t\t\t\tlanguage: payload.client.language ? sanitizeDiagnosticText(payload.client.language, 128) : undefined,\n\t\t\t\t\ttimeZone: payload.client.timeZone ? sanitizeDiagnosticText(payload.client.timeZone, 128) : undefined\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tlocation: payload.location\n\t\t\t? {\n\t\t\t\t\tpathname: sanitizePathname(payload.location.pathname),\n\t\t\t\t\torigin: payload.location.origin\n\t\t\t\t\t\t? sanitizeDiagnosticText(\n\t\t\t\t\t\t\t\tpayload.location.origin.split(/[?#]/, 1)[0] ?? payload.location.origin,\n\t\t\t\t\t\t\t\tERROR_REPORT_LOCATION_MAX_LENGTH\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t: undefined,\n\t\treact: payload.react?.componentStack\n\t\t\t? {\n\t\t\t\t\tcomponentStack: sanitizeScopedText(\n\t\t\t\t\t\tpayload.react.componentStack,\n\t\t\t\t\t\t{ scope: \"stack-trace\", source: \"react-component-stack\" },\n\t\t\t\t\t\tERROR_REPORT_COMPONENT_STACK_MAX_BYTES,\n\t\t\t\t\t\t\"bytes\"\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tquery: payload.query ? sanitizeQueryDiagnostics(payload.query) : undefined,\n\t\tmutation: payload.mutation ? sanitizeMutationDiagnostics(payload.mutation) : undefined,\n\t\tqueryClient: payload.queryClient\n\t\t\t? {\n\t\t\t\t\tqueries: payload.queryClient.queries.slice(-40).map(sanitizeQueryDiagnostics),\n\t\t\t\t\tmutations: payload.queryClient.mutations.slice(-40).map(sanitizeMutationDiagnostics)\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tpersistedQueries: payload.persistedQueries?.slice(-40).map(sanitizePersistedQueryDiagnostics),\n\t\tbreadcrumbs: payload.breadcrumbs.slice(-80).map((breadcrumb) => ({\n\t\t\t...breadcrumb,\n\t\t\tutc: sanitizeDiagnosticText(breadcrumb.utc, 64),\n\t\t\trouteId: breadcrumb.routeId ? sanitizeDiagnosticText(breadcrumb.routeId, 512) : undefined,\n\t\t\tappId: breadcrumb.appId ? sanitizeDiagnosticText(breadcrumb.appId, 128) : undefined,\n\t\t\tviewId: breadcrumb.viewId ? sanitizeDiagnosticText(breadcrumb.viewId, 128) : undefined,\n\t\t\ttarget: breadcrumb.target ? sanitizeDiagnosticText(breadcrumb.target, 2_048) : undefined,\n\t\t\tdetail: sanitizeDetail(breadcrumb.detail, {\n\t\t\t\tscope: \"breadcrumb-detail\",\n\t\t\t\tsource: breadcrumb.type\n\t\t\t})\n\t\t})),\n\t\tcontext: sanitizeDetail(payload.context, { scope: \"context\", source: payload.source })\n\t};\n}\n\n/**\n * Удаляет диагностические секции в фиксированном порядке, пока payload не\n * помещается в transport/storage limit. Identity, классификация и ошибка\n * сохраняются всегда; маркер перечисляет каждую фактически удалённую секцию.\n */\nexport function limitErrorReportPayload(input: ErrorReportPayload): ErrorReportPayload {\n\tconst normalized = normalizePayloadStrings(input);\n\tconst originalBytes = getErrorReportPayloadSize(normalized);\n\tif (originalBytes <= ERROR_REPORT_PAYLOAD_MAX_BYTES) return normalized;\n\n\tconst droppedSections: string[] = [];\n\tlet payload: ErrorReportPayload = {\n\t\t...normalized,\n\t\ttruncation: {\n\t\t\treason: \"payload-size\",\n\t\t\tlimitBytes: ERROR_REPORT_PAYLOAD_MAX_BYTES,\n\t\t\toriginalBytes,\n\t\t\tdroppedSections\n\t\t}\n\t};\n\n\tconst drop = (\n\t\tsection: string,\n\t\tisPresent: (current: ErrorReportPayload) => boolean,\n\t\tupdate: (current: ErrorReportPayload) => ErrorReportPayload\n\t) => {\n\t\tif (!isPresent(payload) || getErrorReportPayloadSize(payload) <= ERROR_REPORT_PAYLOAD_MAX_BYTES) return;\n\t\tdroppedSections.push(section);\n\t\tpayload = update(payload);\n\t};\n\n\tdrop(\n\t\t\"queryClient\",\n\t\t(current) => current.queryClient !== undefined,\n\t\t(current) => ({ ...current, queryClient: undefined })\n\t);\n\tdrop(\n\t\t\"persistedQueries\",\n\t\t(current) => current.persistedQueries !== undefined,\n\t\t(current) => ({ ...current, persistedQueries: undefined })\n\t);\n\tdrop(\n\t\t\"context\",\n\t\t(current) => current.context !== undefined,\n\t\t(current) => ({ ...current, context: undefined })\n\t);\n\tdrop(\n\t\t\"query.meta\",\n\t\t(current) => current.query?.meta !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tquery: current.query ? { ...current.query, meta: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"query.dataShape\",\n\t\t(current) => current.query?.dataShape !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tquery: current.query ? { ...current.query, dataShape: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"mutation.meta\",\n\t\t(current) => current.mutation?.meta !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tmutation: current.mutation ? { ...current.mutation, meta: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"breadcrumbs:oldest\",\n\t\t(current) => current.breadcrumbs.length > 20,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tbreadcrumbs: current.breadcrumbs.slice(-20)\n\t\t})\n\t);\n\tdrop(\n\t\t\"query\",\n\t\t(current) => current.query !== undefined,\n\t\t(current) => ({ ...current, query: undefined })\n\t);\n\tdrop(\n\t\t\"mutation\",\n\t\t(current) => current.mutation !== undefined,\n\t\t(current) => ({ ...current, mutation: undefined })\n\t);\n\tdrop(\n\t\t\"react\",\n\t\t(current) => current.react !== undefined,\n\t\t(current) => ({ ...current, react: undefined })\n\t);\n\tdrop(\n\t\t\"breadcrumbs\",\n\t\t(current) => current.breadcrumbs.length > 0,\n\t\t(current) => ({ ...current, breadcrumbs: [] })\n\t);\n\tdrop(\n\t\t\"client\",\n\t\t(current) => current.client !== undefined,\n\t\t(current) => ({ ...current, client: undefined })\n\t);\n\tdrop(\n\t\t\"viewport\",\n\t\t(current) => current.viewport !== undefined,\n\t\t(current) => ({ ...current, viewport: undefined })\n\t);\n\n\treturn payload;\n}\n","import { normalizeText } from \"../formatters\";\n\nimport { ERROR_REPORT_STACK_TRACE_MAX_BYTES } from \"./payload\";\nimport { sanitizeDiagnosticText, sanitizeDiagnosticTextBytes } from \"./safeValue\";\n\nimport type { ErrorReportErrorInfo } from \"./types\";\n\nconst DEFAULT_ERROR_MESSAGE = \"Неизвестная ошибка\";\n\n/**\n * Гарантирует непустое диагностическое сообщение, сохраняя исходный текст ошибки.\n * Fallback нужен для Error без message и для брошенных пустых строк.\n */\nfunction resolveErrorMessage(message: string) {\n\treturn normalizeText(message) ? sanitizeDiagnosticText(message) : DEFAULT_ERROR_MESSAGE;\n}\n\nfunction readStatus(value: Record<string, unknown>) {\n\tconst status = value.status ?? value.statusCode ?? value.httpStatus;\n\treturn typeof status === \"number\" && Number.isFinite(status) ? status : undefined;\n}\n\nfunction readServerFnTransportErrorInfo(error: unknown): ErrorReportErrorInfo | null {\n\tif (!error || typeof error !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst transport = error as Record<string, unknown>;\n\tconst appError = transport.appError;\n\tif (!appError || typeof appError !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst payload = appError as Record<string, unknown>;\n\tconst message = normalizeText(payload.message);\n\tif (!message) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tname: \"AppError\",\n\t\tmessage: sanitizeDiagnosticText(message),\n\t\tcode: normalizeText(payload.code) ? sanitizeDiagnosticText(String(payload.code), 128) : undefined,\n\t\thttpStatus: readStatus(payload)\n\t};\n}\n\n/**\n * Нормализует любое брошенное значение в форму, удобную для поиска и сохранения.\n * Stacktrace намеренно сохраняется полностью: это основная диагностическая ценность отчета.\n */\nexport function createErrorInfo(error: unknown): ErrorReportErrorInfo {\n\tconst serverFnErrorInfo = readServerFnTransportErrorInfo(error);\n\tif (serverFnErrorInfo) {\n\t\treturn serverFnErrorInfo;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\tname: sanitizeDiagnosticText(error.name || \"Error\", 256),\n\t\t\tmessage: resolveErrorMessage(error.message),\n\t\t\tstackTrace: error.stack ? sanitizeDiagnosticTextBytes(error.stack, ERROR_REPORT_STACK_TRACE_MAX_BYTES) : undefined\n\t\t};\n\t}\n\n\tif (error && typeof error === \"object\") {\n\t\tconst record = error as Record<string, unknown>;\n\t\treturn {\n\t\t\tname: sanitizeDiagnosticText(typeof record.name === \"string\" ? record.name : \"Error\", 256),\n\t\t\tmessage: resolveErrorMessage(typeof record.message === \"string\" ? record.message : String(error)),\n\t\t\tstackTrace:\n\t\t\t\ttypeof record.stack === \"string\"\n\t\t\t\t\t? sanitizeDiagnosticTextBytes(record.stack, ERROR_REPORT_STACK_TRACE_MAX_BYTES)\n\t\t\t\t\t: undefined,\n\t\t\thttpStatus: readStatus(record)\n\t\t};\n\t}\n\n\treturn {\n\t\tname: \"Error\",\n\t\tmessage: resolveErrorMessage(typeof error === \"string\" ? error : String(error ?? DEFAULT_ERROR_MESSAGE))\n\t};\n}\n","import { type PersistedQuery } from \"@tanstack/query-persist-client-core\";\nimport { type MutationKey, type MutationState, type QueryClient, type QueryKey, type QueryState } from \"@tanstack/react-query\";\n\nimport { hashString128 } from \"../crypto\";\nimport { createIndexedDbQueryStorage } from \"../query-client\";\nimport { stableStringify } from \"../utils\";\n\nimport { createErrorInfo } from \"./errorInfo\";\nimport { createDataShape, sanitizeDetail, sanitizeDiagnosticText, sanitizeErrorReportValue } from \"./safeValue\";\nimport {\n\ttype ErrorReportMutationDiagnostics,\n\ttype ErrorReportPersistedQueryDiagnostics,\n\ttype ErrorReportQueryDiagnostics,\n\ttype ErrorReportSafeValue\n} from \"./types\";\n\ntype QueryDiagnosticSource = {\n\tqueryHash: string;\n\tqueryKey: QueryKey;\n\tstate: QueryState<unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n\tgetObserversCount: () => number;\n};\n\ntype MutationDiagnosticSource = {\n\toptions: {\n\t\tmutationKey?: MutationKey;\n\t};\n\tstate: MutationState<unknown, unknown, unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n};\n\nconst MAX_QUERY_DIAGNOSTICS = 40;\nconst MAX_MUTATION_DIAGNOSTICS = 40;\nconst MAX_PERSISTED_QUERY_DIAGNOSTICS = 40;\n\nfunction sanitizeMeta(\n\tmeta: Record<string, unknown> | undefined,\n\tscope: \"mutation-meta\" | \"query-meta\",\n\tsource?: string\n): Record<string, ErrorReportSafeValue> | undefined {\n\treturn sanitizeDetail(meta, { scope, source });\n}\n\nexport function collectQueryDiagnostics(query: QueryDiagnosticSource): ErrorReportQueryDiagnostics {\n\tconst queryKey = sanitizeErrorReportValue(query.queryKey, { scope: \"query-key\" }) ?? { type: \"redacted\" };\n\tconst queryHash = hashString128(stableStringify(queryKey));\n\n\treturn {\n\t\tqueryHash,\n\t\tqueryKey,\n\t\tstatus: query.state.status,\n\t\tfetchStatus: query.state.fetchStatus,\n\t\tdataUpdatedAt: query.state.dataUpdatedAt,\n\t\terrorUpdatedAt: query.state.errorUpdatedAt,\n\t\tfailureCount: query.state.fetchFailureCount,\n\t\tisInvalidated: query.state.isInvalidated,\n\t\tobserversCount: query.getObserversCount(),\n\t\tmeta: sanitizeMeta(query.meta, \"query-meta\", queryHash),\n\t\tdataShape: sanitizeErrorReportValue(createDataShape(query.state.data), {\n\t\t\tscope: \"query-data-shape\",\n\t\t\tsource: queryHash\n\t\t}),\n\t\terror: query.state.error ? createErrorInfo(query.state.error) : undefined\n\t};\n}\n\nexport function collectMutationDiagnostics(mutation: MutationDiagnosticSource): ErrorReportMutationDiagnostics {\n\treturn {\n\t\tmutationKey: mutation.options.mutationKey\n\t\t\t? sanitizeErrorReportValue(mutation.options.mutationKey, { scope: \"mutation-key\" })\n\t\t\t: undefined,\n\t\tstatus: mutation.state.status,\n\t\tfailureCount: mutation.state.failureCount,\n\t\tsubmittedAt: mutation.state.submittedAt,\n\t\tmeta: sanitizeMeta(mutation.meta, \"mutation-meta\"),\n\t\terror: mutation.state.error ? createErrorInfo(mutation.state.error) : undefined\n\t};\n}\n\nexport function collectQueryClientDiagnostics(queryClient: QueryClient) {\n\treturn {\n\t\tqueries: queryClient.getQueryCache().getAll().slice(-MAX_QUERY_DIAGNOSTICS).map(collectQueryDiagnostics),\n\t\tmutations: queryClient.getMutationCache().getAll().slice(-MAX_MUTATION_DIAGNOSTICS).map(collectMutationDiagnostics)\n\t};\n}\n\nfunction collectPersistedStateDiagnostics(persistedQuery: PersistedQuery): ErrorReportPersistedQueryDiagnostics {\n\tconst state = persistedQuery.state;\n\tconst queryKey = sanitizeErrorReportValue(persistedQuery.queryKey, { scope: \"persisted-query-key\" });\n\tconst queryHash = queryKey ? hashString128(stableStringify(queryKey)) : undefined;\n\n\treturn {\n\t\tbuster: persistedQuery.buster ? sanitizeDiagnosticText(persistedQuery.buster, 512) : undefined,\n\t\tqueryHash,\n\t\tqueryKey,\n\t\tstatus: state.status,\n\t\tfetchStatus: state.fetchStatus,\n\t\tdataUpdatedAt: state.dataUpdatedAt,\n\t\terrorUpdatedAt: state.errorUpdatedAt,\n\t\tfailureCount: state.fetchFailureCount,\n\t\terror: state.error ? createErrorInfo(state.error) : undefined\n\t};\n}\n\n/**\n * Читает IndexedDB persistence и возвращает только технические поля.\n * `state.data` и другие значения кеша не попадают в результат.\n */\nexport async function collectPersistedQueryDiagnostics(): Promise<ErrorReportPersistedQueryDiagnostics[]> {\n\tconst storage = createIndexedDbQueryStorage<PersistedQuery>();\n\tif (!storage?.entries) return [];\n\n\ttry {\n\t\tconst entries = await storage.entries();\n\t\treturn entries\n\t\t\t.slice(-MAX_PERSISTED_QUERY_DIAGNOSTICS)\n\t\t\t.map(([, persistedQuery]) => collectPersistedStateDiagnostics(persistedQuery));\n\t} catch {\n\t\treturn [];\n\t}\n}\n","type ErrorReportEnvironmentOptions = {\n\tisDev?: boolean;\n};\n\n/**\n * Отчеты собираются только в браузере и только вне dev-режима.\n * На серверном рендеринге draft не создается, чтобы не смешивать SSR-ошибки с клиентской диагностикой.\n */\nexport function isErrorReportingEnabled(options: ErrorReportEnvironmentOptions = {}) {\n\tconst isDev = options.isDev ?? __DEV__;\n\n\treturn typeof window !== \"undefined\" && !isDev;\n}\n\nexport function getErrorReportEnvironment() {\n\tconst mode: \"development\" | \"production\" = __DEV__ ? \"development\" : \"production\";\n\n\treturn {\n\t\tmode,\n\t\tbuildId: typeof __APP_BUILD_ID__ === \"string\" ? __APP_BUILD_ID__ : undefined\n\t};\n}\n\nexport function getErrorReportClientEnvironment() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tuserAgent: window.navigator.userAgent,\n\t\tlanguage: window.navigator.language,\n\t\ttimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n\t};\n}\n","import { z } from \"zod\";\n\nimport { ERROR_REPORT_PAYLOAD_MAX_BYTES, getErrorReportPayloadSize } from \"./payload\";\nimport { getUtf8TextSize } from \"./safeValue\";\n\nimport type { ErrorReportDraft, ErrorReportPayload, ErrorReportSafeValue } from \"./types\";\n\nconst safeValueSchema: z.ZodType<ErrorReportSafeValue> = z.lazy(() =>\n\tz.union([\n\t\tz.string().max(4_096),\n\t\tz.number().finite(),\n\t\tz.boolean(),\n\t\tz.null(),\n\t\tz.array(safeValueSchema).max(20),\n\t\tz.record(z.string(), safeValueSchema).refine((value) => Object.keys(value).length <= 40)\n\t])\n);\n\nconst safeRecordSchema = z.record(z.string(), safeValueSchema).refine((value) => Object.keys(value).length <= 40);\nconst errorInfoSchema = z\n\t.object({\n\t\tname: z.string().min(1).max(256),\n\t\tmessage: z.string().min(1).max(4_096),\n\t\tcode: z.string().max(128).optional(),\n\t\tstackTrace: z\n\t\t\t.string()\n\t\t\t.refine((value) => getUtf8TextSize(value) <= 64 * 1_024)\n\t\t\t.optional(),\n\t\thttpStatus: z.number().finite().optional()\n\t})\n\t.strict();\nconst breadcrumbSchema = z\n\t.object({\n\t\tutc: z.string().min(1).max(64),\n\t\ttype: z.enum([\"route\", \"click\", \"visibility\", \"query-error\", \"mutation-error\", \"runtime-error\"]),\n\t\trouteId: z.string().max(512).optional(),\n\t\tappId: z.string().max(128).optional(),\n\t\tviewId: z.string().max(128).optional(),\n\t\ttarget: z.string().max(2_048).optional(),\n\t\tdetail: safeRecordSchema.optional()\n\t})\n\t.strict();\nconst queryDiagnosticsSchema = z\n\t.object({\n\t\tqueryHash: z.string().max(512),\n\t\tqueryKey: safeValueSchema,\n\t\tstatus: z.string().max(64).optional(),\n\t\tfetchStatus: z.string().max(64).optional(),\n\t\tdataUpdatedAt: z.number().finite().optional(),\n\t\terrorUpdatedAt: z.number().finite().optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\tisInvalidated: z.boolean().optional(),\n\t\tobserversCount: z.number().finite().optional(),\n\t\tmeta: safeRecordSchema.optional(),\n\t\tdataShape: safeValueSchema.optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\nconst mutationDiagnosticsSchema = z\n\t.object({\n\t\tmutationKey: safeValueSchema.optional(),\n\t\tstatus: z.string().max(64).optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\tsubmittedAt: z.number().finite().optional(),\n\t\tmeta: safeRecordSchema.optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\nconst persistedQueryDiagnosticsSchema = z\n\t.object({\n\t\tbuster: z.string().max(512).optional(),\n\t\tqueryHash: z.string().max(512).optional(),\n\t\tqueryKey: safeValueSchema.optional(),\n\t\tstatus: z.string().max(64).optional(),\n\t\tfetchStatus: z.string().max(64).optional(),\n\t\tdataUpdatedAt: z.number().finite().optional(),\n\t\terrorUpdatedAt: z.number().finite().optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\n\nconst errorReportPayloadSchema: z.ZodType<ErrorReportPayload> = z\n\t.object({\n\t\tpayloadVersion: z.literal(1),\n\t\tapplication: z.string().min(1).max(128),\n\t\treportId: z.string().uuid(),\n\t\tsessionId: z.string().uuid(),\n\t\tcreatedUtc: z.string().min(1).max(64),\n\t\tcategory: z.enum([\"query\", \"mutation\", \"runtime\", \"react\"]),\n\t\tsource: z.string().min(1).max(256),\n\t\terror: errorInfoSchema,\n\t\tenvironment: z\n\t\t\t.object({\n\t\t\t\tmode: z.enum([\"development\", \"production\"]),\n\t\t\t\tbuildId: z.string().max(128).optional()\n\t\t\t})\n\t\t\t.strict(),\n\t\tclient: z\n\t\t\t.object({\n\t\t\t\tuserAgent: z.string().max(4_096).optional(),\n\t\t\t\tlanguage: z.string().max(128).optional(),\n\t\t\t\ttimeZone: z.string().max(128).optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tlocation: z\n\t\t\t.object({\n\t\t\t\tpathname: z.string().max(2_048),\n\t\t\t\torigin: z.string().max(2_048).optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tviewport: z\n\t\t\t.object({\n\t\t\t\twidth: z.number().finite(),\n\t\t\t\theight: z.number().finite(),\n\t\t\t\tdevicePixelRatio: z.number().finite().optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\treact: z\n\t\t\t.object({\n\t\t\t\tcomponentStack: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.refine((value) => getUtf8TextSize(value) <= 32 * 1_024)\n\t\t\t\t\t.optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tquery: queryDiagnosticsSchema.optional(),\n\t\tmutation: mutationDiagnosticsSchema.optional(),\n\t\tqueryClient: z\n\t\t\t.object({\n\t\t\t\tqueries: z.array(queryDiagnosticsSchema).max(40),\n\t\t\t\tmutations: z.array(mutationDiagnosticsSchema).max(40)\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tpersistedQueries: z.array(persistedQueryDiagnosticsSchema).max(40).optional(),\n\t\tbreadcrumbs: z.array(breadcrumbSchema).max(80),\n\t\tcontext: safeRecordSchema.optional(),\n\t\ttruncation: z\n\t\t\t.object({\n\t\t\t\treason: z.literal(\"payload-size\"),\n\t\t\t\tlimitBytes: z.literal(ERROR_REPORT_PAYLOAD_MAX_BYTES),\n\t\t\t\toriginalBytes: z.number().int().positive(),\n\t\t\t\tdroppedSections: z.array(z.string().max(128)).max(32)\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional()\n\t})\n\t.strict()\n\t.refine((payload) => getErrorReportPayloadSize(payload) <= ERROR_REPORT_PAYLOAD_MAX_BYTES);\n\nconst errorReportDraftSchema: z.ZodType<ErrorReportDraft> = z\n\t.object({\n\t\treportId: z.string().uuid(),\n\t\tsessionId: z.string().uuid(),\n\t\tcreatedUtc: z.string().min(1).max(64),\n\t\tcategory: z.enum([\"query\", \"mutation\", \"runtime\", \"react\"]),\n\t\tstatus: z.enum([\"pending\", \"sending\", \"sent\", \"failed\"]),\n\t\tsentUtc: z.string().min(1).max(64).optional(),\n\t\tfailedReason: z.string().max(4_096).optional(),\n\t\tpayload: errorReportPayloadSchema\n\t})\n\t.strict()\n\t.superRefine((draft, context) => {\n\t\tconst matchingIdentity =\n\t\t\tdraft.reportId === draft.payload.reportId &&\n\t\t\tdraft.sessionId === draft.payload.sessionId &&\n\t\t\tdraft.createdUtc === draft.payload.createdUtc &&\n\t\t\tdraft.category === draft.payload.category;\n\n\t\tif (!matchingIdentity) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Draft identity должна совпадать с payload identity.\"\n\t\t\t});\n\t\t}\n\t});\n\nfunction isSerializedInputWithinLimit(value: unknown, maxBytes: number) {\n\ttry {\n\t\treturn new TextEncoder().encode(JSON.stringify(value)).byteLength <= maxBytes;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Парсит только текущую versioned форму. Unversioned и будущие payload\n * отклоняются явно, чтобы storage/delivery не угадывали форму контракта.\n */\nexport function parseErrorReportPayload(value: unknown) {\n\tif (!isSerializedInputWithinLimit(value, ERROR_REPORT_PAYLOAD_MAX_BYTES)) return undefined;\n\n\ttry {\n\t\tconst result = errorReportPayloadSchema.safeParse(value);\n\t\treturn result.success ? result.data : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Проверяет одну draft-запись, включая совпадение её identity с payload. */\nexport function parseErrorReportDraft(value: unknown) {\n\tif (!isSerializedInputWithinLimit(value, ERROR_REPORT_PAYLOAD_MAX_BYTES + 16 * 1_024)) return undefined;\n\n\ttry {\n\t\tconst result = errorReportDraftSchema.safeParse(value);\n\t\treturn result.success ? result.data : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Восстанавливает все валидные drafts независимо: одна повреждённая запись не\n * должна уничтожить остальные элементы browser storage.\n */\nexport function parseErrorReportDrafts(value: unknown) {\n\tif (!Array.isArray(value)) return [];\n\treturn value.flatMap((draft) => {\n\t\tconst parsed = parseErrorReportDraft(draft);\n\t\treturn parsed ? [parsed] : [];\n\t});\n}\n","import { uuidv4 } from \"../crypto\";\nimport { formatDateAsODataDatetime } from \"../formatters\";\nimport { getSessionStorageId } from \"../session-storage\";\n\nimport { getErrorReportBreadcrumbs } from \"./breadcrumbs\";\nimport { getErrorReportClientEnvironment, getErrorReportEnvironment, isErrorReportingEnabled } from \"./environment\";\nimport { ERROR_REPORT_PAYLOAD_VERSION, limitErrorReportPayload } from \"./payload\";\nimport { sanitizeDetail, sanitizeDiagnosticText, sanitizeErrorReportValue } from \"./safeValue\";\nimport { parseErrorReportDraft, parseErrorReportDrafts } from \"./schema\";\n\nimport type {\n\tErrorReportCategory,\n\tErrorReportDraft,\n\tErrorReportDraftLifecyclePatch,\n\tErrorReportErrorInfo,\n\tErrorReportPayload,\n\tErrorReportSafeValue\n} from \"./types\";\n\nconst STORAGE_KEY = `${__APP_ID__}.errorReport.drafts.v2`;\nconst SESSION_STORAGE_KEY = `${__APP_ID__}.errorReport.sessionId.v1`;\nconst MAX_DRAFTS = 10;\n\nlet drafts = loadDrafts();\n\nfunction nowUtc() {\n\treturn formatDateAsODataDatetime(new Date());\n}\n\nfunction loadDrafts(): ErrorReportDraft[] {\n\tif (typeof sessionStorage === \"undefined\") return [];\n\n\ttry {\n\t\tconst raw = sessionStorage.getItem(STORAGE_KEY);\n\t\treturn parseErrorReportDrafts(raw ? JSON.parse(raw) : []);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction saveDrafts(nextDrafts: ErrorReportDraft[]) {\n\tdrafts = nextDrafts.slice(-MAX_DRAFTS);\n\tif (typeof sessionStorage === \"undefined\") return;\n\n\ttry {\n\t\tsessionStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));\n\t} catch {\n\t\t// Переполнение sessionStorage не должно ломать пользовательский сценарий.\n\t}\n}\n\nfunction getLocationSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tpathname: window.location.pathname,\n\t\torigin: window.location.origin\n\t};\n}\n\nfunction getViewportSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight,\n\t\tdevicePixelRatio: window.devicePixelRatio\n\t};\n}\n\nfunction sanitizeFailedReason(value: string | undefined) {\n\tif (!value) return undefined;\n\tconst sanitizedValue = sanitizeErrorReportValue(value, { scope: \"draft-failed-reason\", source: \"delivery\" });\n\treturn typeof sanitizedValue === \"string\" ? sanitizedValue : undefined;\n}\n\nexport function getErrorReportDraft(reportId: string) {\n\treturn drafts.find((draft) => draft.reportId === reportId);\n}\n\nexport function updateErrorReportDraft(reportId: string, patch: ErrorReportDraftLifecyclePatch) {\n\tconst current = getErrorReportDraft(reportId);\n\tif (!current) return undefined;\n\n\tconst next = {\n\t\t...current,\n\t\t...patch,\n\t\tsentUtc: \"sentUtc\" in patch ? (patch.sentUtc ? sanitizeDiagnosticText(patch.sentUtc, 64) : undefined) : current.sentUtc,\n\t\tfailedReason: \"failedReason\" in patch ? sanitizeFailedReason(patch.failedReason) : current.failedReason\n\t};\n\tconst parsed = parseErrorReportDraft(next);\n\tif (!parsed) return undefined;\n\n\tsaveDrafts(drafts.map((draft) => (draft.reportId === reportId ? parsed : draft)));\n\treturn parsed;\n}\n\nexport function getErrorReportDrafts() {\n\treturn drafts;\n}\n\nexport function captureErrorReportDraft(args: {\n\tcategory: ErrorReportCategory;\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tquery?: ErrorReportPayload[\"query\"];\n\tmutation?: ErrorReportPayload[\"mutation\"];\n\tqueryClient?: ErrorReportPayload[\"queryClient\"];\n\tpersistedQueries?: ErrorReportPayload[\"persistedQueries\"];\n\treact?: ErrorReportPayload[\"react\"];\n\tcontext?: Record<string, ErrorReportSafeValue>;\n}) {\n\tif (!isErrorReportingEnabled()) return undefined;\n\n\tconst reportId = uuidv4();\n\tconst sessionId = getSessionStorageId(SESSION_STORAGE_KEY);\n\tconst createdUtc = nowUtc();\n\tconst payload = limitErrorReportPayload({\n\t\tpayloadVersion: ERROR_REPORT_PAYLOAD_VERSION,\n\t\tapplication: __APP_ID__,\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tsource: sanitizeDiagnosticText(args.source, 256),\n\t\terror: args.error,\n\t\tenvironment: getErrorReportEnvironment(),\n\t\tclient: getErrorReportClientEnvironment(),\n\t\tlocation: getLocationSnapshot(),\n\t\tviewport: getViewportSnapshot(),\n\t\treact: args.react,\n\t\tquery: args.query,\n\t\tmutation: args.mutation,\n\t\tqueryClient: args.queryClient,\n\t\tpersistedQueries: args.persistedQueries,\n\t\tbreadcrumbs: getErrorReportBreadcrumbs(),\n\t\tcontext: sanitizeDetail(args.context, { scope: \"context\", source: args.source })\n\t} satisfies ErrorReportPayload);\n\tconst draft: ErrorReportDraft = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tstatus: \"pending\",\n\t\tpayload\n\t};\n\tconst parsed = parseErrorReportDraft(draft);\n\tif (!parsed) return undefined;\n\n\tsaveDrafts([...drafts, parsed]);\n\treturn parsed;\n}\n","import { hashString128 } from \"../crypto\";\nimport { stableStringify } from \"../utils\";\n\nimport type { ErrorReportDraft, ErrorReportErrorInfo, ErrorReportSafeValue } from \"./types\";\n\nexport const RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS = 60_000;\n\nconst MAX_RECENT_RUNTIME_ERROR_REPORTS = 100;\nconst recentRuntimeErrorReports = new Map<\n\tstring,\n\t{\n\t\tcapturedAt: number;\n\t\tcapture: Promise<ErrorReportDraft | undefined>;\n\t\texpirationTimer: ReturnType<typeof setTimeout>;\n\t}\n>();\n\ntype RuntimeErrorReportDeduplicationInput = {\n\tcategory: \"runtime\" | \"react\";\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tpathname?: string;\n\tscope?: {\n\t\tcomponentStack?: string;\n\t\tdetail?: Record<string, ErrorReportSafeValue>;\n\t};\n};\n\nfunction normalizeStackTrace(stackTrace: string | undefined) {\n\tif (!stackTrace) return undefined;\n\n\treturn stackTrace\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\nfunction createRuntimeErrorReportFingerprint(input: RuntimeErrorReportDeduplicationInput) {\n\treturn hashString128(\n\t\tstableStringify({\n\t\t\tcategory: input.category,\n\t\t\tsource: input.source,\n\t\t\terror: {\n\t\t\t\t...input.error,\n\t\t\t\tstackTrace: normalizeStackTrace(input.error.stackTrace)\n\t\t\t},\n\t\t\tpathname: input.pathname,\n\t\t\tscope: input.scope\n\t\t})\n\t);\n}\n\n/**\n * Удаляет только ожидаемую запись и освобождает связанный таймер.\n * Проверка Promise защищает новую запись того же fingerprint от завершения\n * или отклонения старого capture после lifecycle-сброса.\n */\nfunction removeRuntimeErrorReport(fingerprint: string, expectedCapture?: Promise<ErrorReportDraft | undefined>) {\n\tconst recentReport = recentRuntimeErrorReports.get(fingerprint);\n\tif (!recentReport || (expectedCapture && recentReport.capture !== expectedCapture)) {\n\t\treturn;\n\t}\n\n\tclearTimeout(recentReport.expirationTimer);\n\trecentRuntimeErrorReports.delete(fingerprint);\n}\n\nfunction removeExpiredRuntimeErrorReports(now: number) {\n\tfor (const [fingerprint, recentReport] of recentRuntimeErrorReports) {\n\t\tif (now - recentReport.capturedAt >= RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS) {\n\t\t\tremoveRuntimeErrorReport(fingerprint, recentReport.capture);\n\t\t}\n\t}\n}\n\nfunction removeOldestRuntimeErrorReport() {\n\tconst oldestFingerprint = recentRuntimeErrorReports.keys().next().value;\n\tif (oldestFingerprint) {\n\t\tremoveRuntimeErrorReport(oldestFingerprint);\n\t}\n}\n\n/**\n * Объединяет одинаковые runtime capture-вызовы вокруг одной Promise.\n * Все потребители получают один draft, поэтому capture-only boundary не может\n * заблокировать последующую app-level доставку того же отчёта.\n */\nexport function coalesceRuntimeErrorReportCapture(\n\tinput: RuntimeErrorReportDeduplicationInput,\n\tcapture: () => Promise<ErrorReportDraft | undefined>\n) {\n\tconst now = Date.now();\n\tconst fingerprint = createRuntimeErrorReportFingerprint(input);\n\tconst recentReport = recentRuntimeErrorReports.get(fingerprint);\n\n\tif (recentReport && now - recentReport.capturedAt < RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS) {\n\t\treturn recentReport.capture;\n\t}\n\n\tremoveExpiredRuntimeErrorReports(now);\n\twhile (recentRuntimeErrorReports.size >= MAX_RECENT_RUNTIME_ERROR_REPORTS) {\n\t\tremoveOldestRuntimeErrorReport();\n\t}\n\n\tconst capturePromise = capture();\n\tconst expirationTimer = setTimeout(() => {\n\t\tremoveRuntimeErrorReport(fingerprint, capturePromise);\n\t}, RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS);\n\n\trecentRuntimeErrorReports.set(fingerprint, {\n\t\tcapturedAt: now,\n\t\tcapture: capturePromise,\n\t\texpirationTimer\n\t});\n\n\tvoid capturePromise.catch(() => {\n\t\tremoveRuntimeErrorReport(fingerprint, capturePromise);\n\t});\n\n\treturn capturePromise;\n}\n\n/**\n * Очищает модульное состояние при смене app-level runtime reporter.\n * Функция не входит в публичный package subpath и нужна lifecycle-коду и тестам.\n */\nexport function clearRuntimeErrorReportDeduplication() {\n\tfor (const recentReport of recentRuntimeErrorReports.values()) {\n\t\tclearTimeout(recentReport.expirationTimer);\n\t}\n\trecentRuntimeErrorReports.clear();\n}\n","export type ErrorReportTransportHtmlSummary = {\n\tlength: number;\n\tformCount?: number;\n\tinputNames?: string[];\n};\n\nexport type ErrorReportTransportErrorContext = {\n\tsource: \"fetch.parseResponse\" | \"fetch.buildHttpError\";\n\trequestUrl?: string;\n\tresponseUrl?: string;\n\tmethod?: string;\n\tbaseUrlType?: string;\n\tsapClient?: string | null;\n\tstatus?: number;\n\tstatusText?: string;\n\tcontentType?: string;\n\tredirected?: boolean;\n\tresponseType?: string;\n\thtml?: ErrorReportTransportHtmlSummary;\n};\n\nexport type ErrorReportTransportErrorReporter = (error: Error, context: ErrorReportTransportErrorContext) => void | Promise<void>;\n\nconst DEDUPLICATION_INTERVAL_MS = 60_000;\nconst MAX_RECENT_REPORT_KEYS = 100;\nconst TRANSPORT_REPORT_DELAY_MS = 250;\n\nlet transportErrorReporter: ErrorReportTransportErrorReporter | undefined;\nconst scheduledTransportErrors = new WeakSet<Error>();\nconst suppressedTransportErrors = new WeakSet<Error>();\nconst recentReportKeys = new Map<string, number>();\n\nfunction createReportKey(context: ErrorReportTransportErrorContext) {\n\treturn [context.source, context.method, context.status, context.requestUrl, context.responseUrl].filter(Boolean).join(\"|\");\n}\n\nfunction shouldSkipByRecentKey(context: ErrorReportTransportErrorContext) {\n\tconst now = Date.now();\n\tconst key = createReportKey(context);\n\n\tfor (const [recentKey, timestamp] of recentReportKeys) {\n\t\tif (now - timestamp > DEDUPLICATION_INTERVAL_MS || recentReportKeys.size > MAX_RECENT_REPORT_KEYS) {\n\t\t\trecentReportKeys.delete(recentKey);\n\t\t}\n\t}\n\n\tconst lastReportedAt = recentReportKeys.get(key);\n\tif (lastReportedAt && now - lastReportedAt < DEDUPLICATION_INTERVAL_MS) return true;\n\n\trecentReportKeys.set(key, now);\n\treturn false;\n}\n\n/**\n * Регистрирует приложение как получателя транспортных ошибок.\n * Сам OData transport не знает про QueryClient и UI, поэтому только публикует событие,\n * а app-слой решает, как именно создать и отправить отчет.\n */\nexport function setErrorReportTransportErrorReporter(reporter: ErrorReportTransportErrorReporter | undefined) {\n\ttransportErrorReporter = reporter;\n\trecentReportKeys.clear();\n}\n\nexport function isTransportErrorReportScheduled(error: unknown) {\n\treturn error instanceof Error && scheduledTransportErrors.has(error);\n}\n\nexport function suppressTransportErrorReport(error: unknown) {\n\tif (error instanceof Error) {\n\t\tsuppressedTransportErrors.add(error);\n\t}\n}\n\nexport function reportTransportError(error: Error, context: ErrorReportTransportErrorContext) {\n\tscheduledTransportErrors.add(error);\n\n\t// Даем React Query шанс перехватить эту же ошибку и создать query/mutation-отчет\n\t// с более полезным снимком кеша. Если такого перехвата нет, transport-отчет уйдет сам.\n\tsetTimeout(() => {\n\t\tif (suppressedTransportErrors.has(error)) return;\n\t\tif (!transportErrorReporter) return;\n\t\tif (shouldSkipByRecentKey(context)) return;\n\n\t\ttry {\n\t\t\tconst result = transportErrorReporter(error, context);\n\t\t\tvoid Promise.resolve(result).catch(() => undefined);\n\t\t} catch {\n\t\t\t// Ошибка диагностического hook не должна менять поведение исходного fetch.\n\t\t}\n\t}, TRANSPORT_REPORT_DELAY_MS);\n}\n","import { type Mutation, type Query, type QueryClient } from \"@tanstack/react-query\";\n\nimport { addErrorReportBreadcrumb } from \"./breadcrumbs\";\nimport {\n\tcollectMutationDiagnostics,\n\tcollectPersistedQueryDiagnostics,\n\tcollectQueryClientDiagnostics,\n\tcollectQueryDiagnostics\n} from \"./diagnostics\";\nimport { captureErrorReportDraft } from \"./drafts\";\nimport { createErrorInfo } from \"./errorInfo\";\nimport { coalesceRuntimeErrorReportCapture } from \"./runtimeDeduplication\";\nimport { sanitizeDetail } from \"./safeValue\";\nimport { suppressTransportErrorReport } from \"./transport\";\n\nimport type { ErrorReportMutationContext, ErrorReportQueryContext, ErrorReportRuntimeContext } from \"./types\";\n\nexport async function captureQueryErrorReport(\n\terror: unknown,\n\tquery: Query<unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext?: ErrorReportQueryContext\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context?.source ?? \"query\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"query-error\",\n\t\tdetail: sanitizeDetail(\n\t\t\t{\n\t\t\t\tqueryKey: context?.queryKey ?? query.queryKey,\n\t\t\t\t...context?.detail\n\t\t\t},\n\t\t\t{ scope: \"breadcrumb-detail\", source }\n\t\t)\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"query\",\n\t\tsource,\n\t\terror: context?.errorInfo ?? createErrorInfo(error),\n\t\tquery: collectQueryDiagnostics(query),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context?.detail, { scope: \"context\", source })\n\t});\n}\n\nexport async function captureMutationErrorReport(\n\terror: unknown,\n\tmutation: Mutation<unknown, unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext: ErrorReportMutationContext = {}\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context.source ?? \"mutation\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"mutation-error\",\n\t\tdetail: sanitizeDetail({ mutationKey: mutation.options.mutationKey, ...context.detail }, { scope: \"breadcrumb-detail\", source })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"mutation\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\tmutation: collectMutationDiagnostics(mutation),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context.detail, { scope: \"context\", source })\n\t});\n}\n\nexport function captureRuntimeErrorReport(error: unknown, context: ErrorReportRuntimeContext = {}, queryClient?: QueryClient) {\n\tconst category = context.category ?? \"runtime\";\n\tconst source = context.source ?? context.category ?? \"runtime\";\n\tconst errorInfo = context.errorInfo ?? createErrorInfo(error);\n\tconst detail = sanitizeDetail(context.detail, { scope: \"context\", source });\n\n\tconst captureDraft = async () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"runtime-error\",\n\t\t\tdetail: sanitizeDetail({ category, source, ...context.detail }, { scope: \"breadcrumb-detail\", source })\n\t\t});\n\n\t\tconst [persistedQueries, queryClientDiagnostics] = queryClient\n\t\t\t? await Promise.all([collectPersistedQueryDiagnostics(), Promise.resolve(collectQueryClientDiagnostics(queryClient))])\n\t\t\t: [undefined, undefined];\n\n\t\treturn captureErrorReportDraft({\n\t\t\tcategory,\n\t\t\tsource,\n\t\t\terror: errorInfo,\n\t\t\treact: context.componentStack ? { componentStack: context.componentStack } : undefined,\n\t\t\tqueryClient: queryClientDiagnostics,\n\t\t\tpersistedQueries,\n\t\t\tcontext: detail\n\t\t});\n\t};\n\n\t/**\n\t * Error report draft создаётся только в браузере. Прямой вызов capture\n\t * сохраняет прежнее SSR-поведение без клиентского TTL-таймера, который\n\t * иначе удерживал бы Node-процесс после no-op результата.\n\t */\n\tif (typeof window === \"undefined\") {\n\t\treturn captureDraft();\n\t}\n\n\treturn coalesceRuntimeErrorReportCapture(\n\t\t{\n\t\t\tcategory,\n\t\t\tsource,\n\t\t\terror: errorInfo,\n\t\t\tpathname: window.location.pathname,\n\t\t\tscope: {\n\t\t\t\tcomponentStack: context.componentStack,\n\t\t\t\tdetail\n\t\t\t}\n\t\t},\n\t\tcaptureDraft\n\t);\n}\n","import { type ErrorReportPayload } from \"./types\";\n\nexport const ERROR_REPORT_QUEUE_VERSION = 1 as const;\nexport const ERROR_REPORT_QUEUE_MAX_ITEMS = 50;\nexport const ERROR_REPORT_QUEUE_TTL_MS = 7 * 24 * 60 * 60 * 1_000;\nexport const ERROR_REPORT_QUEUE_LEASE_MS = 30 * 1_000;\n\nexport type ErrorReportQueueFailureKind = \"http\" | \"network\" | \"timeout\" | \"unknown\";\n\nexport type ErrorReportQueueRecord = {\n\treadonly queueVersion: typeof ERROR_REPORT_QUEUE_VERSION;\n\treadonly reportId: string;\n\treadonly enqueuedUtc: string;\n\treadonly expiresUtc: string;\n\treadonly nextAttemptUtc: string;\n\treadonly attemptCount: number;\n\treadonly payload: ErrorReportPayload;\n\treadonly lease?: {\n\t\treadonly ownerId: string;\n\t\treadonly expiresUtc: string;\n\t};\n\treadonly lastFailure?: {\n\t\treadonly utc: string;\n\t\treadonly kind: ErrorReportQueueFailureKind;\n\t\treadonly httpStatus?: number;\n\t};\n};\n\nexport type ErrorReportQueueEnqueueResult =\n\t| { readonly status: \"enqueued\"; readonly evictedReportId?: string }\n\t| { readonly status: \"duplicate\" }\n\t| { readonly status: \"invalid-payload\" }\n\t| { readonly status: \"capacity-exceeded\" };\n\nexport type ErrorReportQueueLeaseOptions = {\n\treadonly ownerId: string;\n\treadonly now?: Date;\n\treadonly leaseDurationMs?: number;\n};\n\nexport type ErrorReportQueueTransitionResult = \"updated\" | \"missing\" | \"lease-mismatch\";\n\nexport type ErrorReportQueueRetry = {\n\treadonly nextAttemptUtc: string;\n\treadonly failure: {\n\t\treadonly utc: string;\n\t\treadonly kind: ErrorReportQueueFailureKind;\n\t\treadonly httpStatus?: number;\n\t};\n};\n\n/**\n * Durable queue contract отделяет delivery policy от конкретной IndexedDB\n * реализации. Все переходы, зависящие от lease owner, выполняются атомарно.\n */\nexport type ErrorReportQueue = {\n\treadonly enqueue: (payload: ErrorReportPayload, now?: Date) => Promise<ErrorReportQueueEnqueueResult>;\n\treadonly leaseNext: (options: ErrorReportQueueLeaseOptions) => Promise<ErrorReportQueueRecord | undefined>;\n\treadonly acknowledge: (reportId: string, ownerId: string) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly reschedule: (reportId: string, ownerId: string, retry: ErrorReportQueueRetry) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly discard: (reportId: string, ownerId: string) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly getRecords: (now?: Date) => Promise<readonly ErrorReportQueueRecord[]>;\n\treadonly getNextWakeUtc: (now?: Date) => Promise<string | undefined>;\n};\n","import {\n\tERROR_REPORT_QUEUE_MAX_ITEMS,\n\tERROR_REPORT_QUEUE_VERSION,\n\ttype ErrorReportQueueFailureKind,\n\ttype ErrorReportQueueRecord\n} from \"./queueContract\";\nimport { parseErrorReportPayload } from \"./schema\";\n\nconst FAILURE_KINDS = new Set<ErrorReportQueueFailureKind>([\"http\", \"network\", \"timeout\", \"unknown\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isUtc(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.length <= 64 && Number.isFinite(Date.parse(value));\n}\n\nfunction isSafeCount(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseFailure(value: unknown): ErrorReportQueueRecord[\"lastFailure\"] {\n\tif (value === undefined) return undefined;\n\tif (!isRecord(value) || !isUtc(value.utc) || typeof value.kind !== \"string\") return undefined;\n\tif (!FAILURE_KINDS.has(value.kind as ErrorReportQueueFailureKind)) return undefined;\n\tif (\n\t\tvalue.httpStatus !== undefined &&\n\t\t(typeof value.httpStatus !== \"number\" || !Number.isInteger(value.httpStatus) || value.httpStatus < 100 || value.httpStatus > 599)\n\t) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tutc: value.utc,\n\t\tkind: value.kind as ErrorReportQueueFailureKind,\n\t\thttpStatus: value.httpStatus as number | undefined\n\t};\n}\n\nfunction parseLease(value: unknown): ErrorReportQueueRecord[\"lease\"] {\n\tif (value === undefined) return undefined;\n\tif (!isRecord(value) || typeof value.ownerId !== \"string\" || value.ownerId.length === 0 || value.ownerId.length > 128) {\n\t\treturn undefined;\n\t}\n\tif (!isUtc(value.expiresUtc)) return undefined;\n\n\treturn { ownerId: value.ownerId, expiresUtc: value.expiresUtc };\n}\n\n/**\n * Queue parser не угадывает прежние storage-формы. Повреждённая или будущая\n * запись отбрасывается отдельно, не уничтожая соседние валидные отчёты.\n */\nexport function parseErrorReportQueueRecord(value: unknown): ErrorReportQueueRecord | undefined {\n\tif (!isRecord(value) || value.queueVersion !== ERROR_REPORT_QUEUE_VERSION) return undefined;\n\tif (typeof value.reportId !== \"string\" || !isUtc(value.enqueuedUtc) || !isUtc(value.expiresUtc)) return undefined;\n\tif (!isUtc(value.nextAttemptUtc) || !isSafeCount(value.attemptCount)) return undefined;\n\n\tconst payload = parseErrorReportPayload(value.payload);\n\tif (!payload || payload.reportId !== value.reportId) return undefined;\n\n\tconst lease = parseLease(value.lease);\n\tif (value.lease !== undefined && !lease) return undefined;\n\tconst lastFailure = parseFailure(value.lastFailure);\n\tif (value.lastFailure !== undefined && !lastFailure) return undefined;\n\n\treturn {\n\t\tqueueVersion: ERROR_REPORT_QUEUE_VERSION,\n\t\treportId: value.reportId,\n\t\tenqueuedUtc: value.enqueuedUtc,\n\t\texpiresUtc: value.expiresUtc,\n\t\tnextAttemptUtc: value.nextAttemptUtc,\n\t\tattemptCount: value.attemptCount,\n\t\tpayload,\n\t\tlease,\n\t\tlastFailure\n\t};\n}\n\n/** Возвращает bounded текущую очередь без истёкших и повторяющихся ID. */\nexport function normalizeErrorReportQueueRecords(value: unknown, nowMs: number): ErrorReportQueueRecord[] {\n\tif (!Array.isArray(value)) return [];\n\n\tconst reportIds = new Set<string>();\n\tconst records: ErrorReportQueueRecord[] = [];\n\tfor (const valueRecord of value) {\n\t\tconst record = parseErrorReportQueueRecord(valueRecord);\n\t\tif (!record || Date.parse(record.expiresUtc) <= nowMs || reportIds.has(record.reportId)) continue;\n\n\t\treportIds.add(record.reportId);\n\t\trecords.push(record);\n\t\tif (records.length === ERROR_REPORT_QUEUE_MAX_ITEMS) break;\n\t}\n\n\treturn records;\n}\n","import { createIndexedDbQueryStorage, type IndexedDbQueryStorage } from \"../query-client\";\n\nimport {\n\tERROR_REPORT_QUEUE_LEASE_MS,\n\tERROR_REPORT_QUEUE_MAX_ITEMS,\n\tERROR_REPORT_QUEUE_TTL_MS,\n\tERROR_REPORT_QUEUE_VERSION,\n\ttype ErrorReportQueue,\n\ttype ErrorReportQueueEnqueueResult,\n\ttype ErrorReportQueueRecord,\n\ttype ErrorReportQueueTransitionResult\n} from \"./queueContract\";\nimport { normalizeErrorReportQueueRecords } from \"./queueRecord\";\nimport { parseErrorReportPayload } from \"./schema\";\nimport { type ErrorReportPayload } from \"./types\";\n\nconst QUEUE_STORAGE_KEY = \"queue.v1\";\nconst QUEUE_STORE_NAME = \"records\";\n\nexport type CreateErrorReportQueueOptions = {\n\treadonly dbName?: string;\n\treadonly indexedDB?: IDBFactory;\n\t/** Тестовая/альтернативная storage boundary; browser-приложения обычно её не задают. */\n\treadonly storage?: Pick<IndexedDbQueryStorage<unknown>, \"getItem\" | \"updateItem\">;\n};\n\nfunction toUtc(value: number) {\n\treturn new Date(value).toISOString();\n}\n\nfunction normalizeOwnerId(value: string) {\n\tconst ownerId = value.trim();\n\tif (ownerId.length === 0 || ownerId.length > 128) {\n\t\tthrow new Error(\"Error report lease owner должен содержать от 1 до 128 символов\");\n\t}\n\treturn ownerId;\n}\n\nfunction compareQueueOrder(left: ErrorReportQueueRecord, right: ErrorReportQueueRecord) {\n\treturn (\n\t\tDate.parse(left.nextAttemptUtc) - Date.parse(right.nextAttemptUtc) || Date.parse(left.enqueuedUtc) - Date.parse(right.enqueuedUtc)\n\t);\n}\n\nfunction resolveTransition(\n\trecords: ErrorReportQueueRecord[],\n\treportId: string,\n\townerId: string\n): { readonly index: number; readonly result: ErrorReportQueueTransitionResult } {\n\tconst index = records.findIndex((record) => record.reportId === reportId);\n\tif (index < 0) return { index, result: \"missing\" };\n\tif (records[index]?.lease?.ownerId !== ownerId) return { index, result: \"lease-mismatch\" };\n\treturn { index, result: \"updated\" };\n}\n\n/**\n * Создаёт IndexedDB-backed очередь. Одна запись-envelope намеренно хранит не\n * более 50 payload: существующий atomic update primitive тогда сериализует\n * выбор lease между вкладками без дополнительного локального storage слоя.\n */\nexport function createErrorReportQueue(options: CreateErrorReportQueueOptions = {}): ErrorReportQueue | undefined {\n\tconst storage =\n\t\toptions.storage ??\n\t\tcreateIndexedDbQueryStorage<unknown>({\n\t\t\tdbName: options.dbName ?? `${__APP_ID__}.error-report.queue.v1`,\n\t\t\tstoreName: QUEUE_STORE_NAME,\n\t\t\tindexedDB: options.indexedDB\n\t\t});\n\tif (!storage) return undefined;\n\tconst queueStorage = storage;\n\n\tfunction update<TResult>(\n\t\tnowMs: number,\n\t\toperation: (records: ErrorReportQueueRecord[]) => { readonly records: ErrorReportQueueRecord[]; readonly result: TResult }\n\t) {\n\t\treturn queueStorage.updateItem(QUEUE_STORAGE_KEY, (storedValue) => {\n\t\t\tconst decision = operation(normalizeErrorReportQueueRecords(storedValue, nowMs));\n\t\t\treturn { action: \"set\" as const, value: decision.records, result: decision.result };\n\t\t});\n\t}\n\n\treturn {\n\t\tenqueue: async (payload: ErrorReportPayload, now = new Date()) => {\n\t\t\tconst parsedPayload = parseErrorReportPayload(payload);\n\t\t\tif (!parsedPayload) return { status: \"invalid-payload\" as const };\n\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return { status: \"invalid-payload\" as const };\n\n\t\t\treturn update<ErrorReportQueueEnqueueResult>(nowMs, (records) => {\n\t\t\t\tif (records.some((record) => record.reportId === parsedPayload.reportId)) {\n\t\t\t\t\treturn { records, result: { status: \"duplicate\" as const } };\n\t\t\t\t}\n\n\t\t\t\tlet evictedReportId: string | undefined;\n\t\t\t\tif (records.length >= ERROR_REPORT_QUEUE_MAX_ITEMS) {\n\t\t\t\t\tconst evictedIndex = records\n\t\t\t\t\t\t.map((record, index) => ({ record, index }))\n\t\t\t\t\t\t.filter(({ record }) => record.lease === undefined)\n\t\t\t\t\t\t.sort((left, right) => Date.parse(left.record.enqueuedUtc) - Date.parse(right.record.enqueuedUtc))[0]?.index;\n\n\t\t\t\t\tif (evictedIndex === undefined) {\n\t\t\t\t\t\treturn { records, result: { status: \"capacity-exceeded\" as const } };\n\t\t\t\t\t}\n\n\t\t\t\t\tevictedReportId = records[evictedIndex]?.reportId;\n\t\t\t\t\trecords.splice(evictedIndex, 1);\n\t\t\t\t}\n\n\t\t\t\tconst nowUtc = toUtc(nowMs);\n\t\t\t\trecords.push({\n\t\t\t\t\tqueueVersion: ERROR_REPORT_QUEUE_VERSION,\n\t\t\t\t\treportId: parsedPayload.reportId,\n\t\t\t\t\tenqueuedUtc: nowUtc,\n\t\t\t\t\texpiresUtc: toUtc(nowMs + ERROR_REPORT_QUEUE_TTL_MS),\n\t\t\t\t\tnextAttemptUtc: nowUtc,\n\t\t\t\t\tattemptCount: 0,\n\t\t\t\t\tpayload: parsedPayload\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\trecords,\n\t\t\t\t\tresult: evictedReportId ? { status: \"enqueued\" as const, evictedReportId } : { status: \"enqueued\" as const }\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tleaseNext: async ({ ownerId: inputOwnerId, now = new Date(), leaseDurationMs = ERROR_REPORT_QUEUE_LEASE_MS }) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs) || !Number.isFinite(leaseDurationMs) || leaseDurationMs <= 0) {\n\t\t\t\tthrow new Error(\"Error report lease требует валидное время и положительную длительность\");\n\t\t\t}\n\n\t\t\treturn update(nowMs, (records) => {\n\t\t\t\tconst record = records\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\t\tDate.parse(candidate.nextAttemptUtc) <= nowMs &&\n\t\t\t\t\t\t\t(candidate.lease === undefined || Date.parse(candidate.lease.expiresUtc) <= nowMs)\n\t\t\t\t\t)\n\t\t\t\t\t.sort(compareQueueOrder)[0];\n\t\t\t\tif (!record) return { records, result: undefined };\n\n\t\t\t\tconst leasedRecord: ErrorReportQueueRecord = {\n\t\t\t\t\t...record,\n\t\t\t\t\tattemptCount: record.attemptCount + 1,\n\t\t\t\t\tlease: { ownerId, expiresUtc: toUtc(nowMs + leaseDurationMs) }\n\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\trecords: records.map((candidate) => (candidate.reportId === record.reportId ? leasedRecord : candidate)),\n\t\t\t\t\tresult: leasedRecord\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tacknowledge: async (reportId, inputOwnerId) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\treturn update(Date.now(), (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\trecords.splice(transition.index, 1);\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\treschedule: async (reportId, inputOwnerId, retry) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\tconst nextAttemptMs = Date.parse(retry.nextAttemptUtc);\n\t\t\tconst failureUtcMs = Date.parse(retry.failure.utc);\n\t\t\tif (!Number.isFinite(nextAttemptMs) || !Number.isFinite(failureUtcMs)) {\n\t\t\t\tthrow new Error(\"Error report retry требует валидные UTC timestamps\");\n\t\t\t}\n\n\t\t\treturn update(failureUtcMs, (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\tconst record = records[transition.index];\n\t\t\t\tif (!record) return { records, result: \"missing\" as const };\n\t\t\t\trecords[transition.index] = {\n\t\t\t\t\t...record,\n\t\t\t\t\tnextAttemptUtc: retry.nextAttemptUtc,\n\t\t\t\t\tlease: undefined,\n\t\t\t\t\tlastFailure: retry.failure\n\t\t\t\t};\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\tdiscard: async (reportId, inputOwnerId) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\treturn update(Date.now(), (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\trecords.splice(transition.index, 1);\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\tgetRecords: async (now = new Date()) => {\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return [];\n\t\t\tconst storedValue = await queueStorage.getItem(QUEUE_STORAGE_KEY);\n\t\t\treturn normalizeErrorReportQueueRecords(storedValue, nowMs).sort(compareQueueOrder);\n\t\t},\n\t\tgetNextWakeUtc: async (now = new Date()) => {\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return undefined;\n\t\t\tconst records = normalizeErrorReportQueueRecords(await queueStorage.getItem(QUEUE_STORAGE_KEY), nowMs);\n\t\t\tconst nextWakeMs = records.reduce<number | undefined>((current, record) => {\n\t\t\t\tconst recordWakeMs = Math.max(Date.parse(record.nextAttemptUtc), record.lease ? Date.parse(record.lease.expiresUtc) : 0);\n\t\t\t\treturn current === undefined || recordWakeMs < current ? recordWakeMs : current;\n\t\t\t}, undefined);\n\t\t\treturn nextWakeMs === undefined ? undefined : toUtc(nextWakeMs);\n\t\t}\n\t};\n}\n","import { clearRuntimeErrorReportDeduplication } from \"./runtimeDeduplication\";\n\nimport type { ErrorReportRuntimeContext } from \"./types\";\n\nexport type ErrorReportRuntimeErrorReporter = (error: unknown, context: ErrorReportRuntimeContext) => void | Promise<void>;\n\nlet runtimeErrorReporter: ErrorReportRuntimeErrorReporter | undefined;\n\n/**\n * Регистрирует app-слой как получателя ручных runtime-ошибок.\n * Shared-код может вызвать reportRuntimeError без знания о QueryClient, UI и режиме доставки.\n */\nexport function setErrorReportRuntimeErrorReporter(reporter: ErrorReportRuntimeErrorReporter | undefined) {\n\truntimeErrorReporter = reporter;\n\tclearRuntimeErrorReportDeduplication();\n}\n\n/**\n * Ручная отправка runtime-ошибки из try/catch или другого кода вне React-компонента.\n * Функция не бросает исключений: диагностический отчет не должен ломать основной сценарий.\n *\n * @example\n *\n * try {\n * // ...\n * } catch (error) {\n * reportRuntimeError(error, {\n * detail: {\n * source: \"s3-download\",\n * action: \"download-from-s3\"\n * }\n * });\n * }\n */\nexport async function reportRuntimeError(error: unknown, context: ErrorReportRuntimeContext = {}) {\n\tif (!runtimeErrorReporter) return;\n\n\ttry {\n\t\tawait runtimeErrorReporter(error, context);\n\t} catch {\n\t\t// Ошибка диагностического hook не должна менять поведение пользовательского кода.\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/error-report/safeValue.ts","../../src/error-report/breadcrumbs.ts","../../src/error-report/payload.ts","../../src/error-report/errorInfo.ts","../../src/error-report/diagnostics.ts","../../src/error-report/environment.ts","../../src/error-report/schema.ts","../../src/error-report/drafts.ts","../../src/error-report/runtimeDeduplication.ts","../../src/error-report/transport.ts","../../src/error-report/capture.ts","../../src/error-report/queueContract.ts","../../src/error-report/queueRecord.ts","../../src/error-report/queue.ts","../../src/error-report/runtime.ts"],"sourcesContent":["import type { ErrorReportSafeValue, ErrorReportSanitizationContext, ErrorReportSanitizer } from \"./types\";\n\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\nconst MAX_OBJECT_KEYS = 40;\nconst MAX_DIAGNOSTIC_STRING_LENGTH = 4_096;\nconst REDACTED_VALUE = \"[REDACTED]\";\nconst SENSITIVE_KEY_PARTS = [\n\t\"apikey\",\n\t\"authorization\",\n\t\"cookie\",\n\t\"csrf\",\n\t\"password\",\n\t\"passwd\",\n\t\"refreshtoken\",\n\t\"secret\",\n\t\"sessiontoken\",\n\t\"token\"\n];\nconst URL_KEY_SUFFIX = \"url\";\n\nlet errorReportSanitizer: ErrorReportSanitizer | undefined;\n\nfunction normalizeKey(key: string) {\n\treturn key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction isSensitiveKey(key: string) {\n\tconst normalizedKey = normalizeKey(key);\n\treturn SENSITIVE_KEY_PARTS.some((part) => normalizedKey.includes(part));\n}\n\nfunction isUrlKey(key: string) {\n\treturn normalizeKey(key).endsWith(URL_KEY_SUFFIX);\n}\n\nfunction looksLikeUrlWithPrivateParts(value: string) {\n\treturn /^(?:https?:\\/\\/|\\/)[^\\s]*[?#]/i.test(value);\n}\n\nfunction stripUrlSearchAndHash(value: string) {\n\ttry {\n\t\tconst parsed = new URL(value, \"https://error-report.invalid\");\n\t\tconst pathname = parsed.pathname;\n\t\treturn parsed.origin === \"https://error-report.invalid\" ? pathname : `${parsed.origin}${pathname}`;\n\t} catch {\n\t\treturn value.split(/[?#]/, 1)[0] ?? value;\n\t}\n}\n\n/**\n * Удаляет наиболее узнаваемые секреты и email из свободного диагностического\n * текста. Это страховочная сетка; предметные персональные данные приложение\n * обязано исключить своим allow-list sanitizer.\n */\nexport function sanitizeDiagnosticText(value: string, maxLength = MAX_DIAGNOSTIC_STRING_LENGTH) {\n\tlet sanitizedValue = value.slice(0, maxLength);\n\tif (/\\bbearer\\s/i.test(sanitizedValue)) {\n\t\tsanitizedValue = sanitizedValue.replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]{8,}/gi, \"Bearer [REDACTED]\");\n\t}\n\tif (sanitizedValue.includes(\"@\")) {\n\t\tsanitizedValue = sanitizedValue.replace(/[A-Z0-9._%+-]{1,254}@[A-Z0-9.-]{1,253}\\.[A-Z]{2,63}/gi, \"[REDACTED_EMAIL]\");\n\t}\n\n\treturn sanitizedValue;\n}\n\n/** Возвращает размер строки в UTF-8, совпадающий с размером JSON transport. */\nexport function getUtf8TextSize(value: string) {\n\treturn new TextEncoder().encode(value).byteLength;\n}\n\n/**\n * Обрезает уже очищенный текст по UTF-8 bytes без разрыва surrogate pair.\n * Binary search нужен для Unicode stack traces, где число code units не равно\n * размеру transport payload.\n */\nexport function sanitizeDiagnosticTextBytes(value: string, maxBytes: number) {\n\tconst sanitizedValue = sanitizeDiagnosticText(value, maxBytes);\n\tif (getUtf8TextSize(sanitizedValue) <= maxBytes) return sanitizedValue;\n\n\tlet left = 0;\n\tlet right = sanitizedValue.length;\n\twhile (left < right) {\n\t\tconst middle = Math.ceil((left + right) / 2);\n\t\tif (getUtf8TextSize(sanitizedValue.slice(0, middle)) <= maxBytes) left = middle;\n\t\telse right = middle - 1;\n\t}\n\n\tconst lastCodeUnit = sanitizedValue.charCodeAt(left - 1);\n\tconst safeEnd = lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff ? left - 1 : left;\n\treturn sanitizedValue.slice(0, safeEnd);\n}\n\ntype DiagnosticValueState = {\n\tseen: WeakSet<object>;\n\tmaxStringLength: number;\n};\n\nfunction createDiagnosticValueInternal(value: unknown, depth: number, state: DiagnosticValueState, key?: string): ErrorReportSafeValue {\n\tif (key && isSensitiveKey(key)) return REDACTED_VALUE;\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") return Number.isFinite(value) ? value : { type: \"non-finite-number\" };\n\tif (typeof value === \"string\") {\n\t\tconst normalizedValue = (key && isUrlKey(key)) || looksLikeUrlWithPrivateParts(value) ? stripUrlSearchAndHash(value) : value;\n\t\treturn sanitizeDiagnosticText(normalizedValue, state.maxStringLength);\n\t}\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (value instanceof Date) return Number.isNaN(value.getTime()) ? { type: \"invalid-date\" } : value.toISOString();\n\tif (typeof value === \"object\") {\n\t\tif (state.seen.has(value)) return { type: \"circular\" };\n\t\tstate.seen.add(value);\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.slice(0, MAX_ARRAY_ITEMS).map((item) => createDiagnosticValueInternal(item, depth + 1, state));\n\t}\n\tif (typeof value === \"object\") {\n\t\ttry {\n\t\t\tconst entries = Object.entries(value as Record<string, unknown>)\n\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t.slice(0, MAX_OBJECT_KEYS);\n\n\t\t\treturn Object.fromEntries(\n\t\t\t\tentries.map(([entryKey, item]) => [entryKey, createDiagnosticValueInternal(item, depth + 1, state, entryKey)])\n\t\t\t);\n\t\t} catch {\n\t\t\treturn { type: \"unreadable\" };\n\t\t}\n\t}\n\tif (typeof value === \"function\") return { type: \"function\" };\n\tif (typeof value === \"symbol\") return { type: \"symbol\" };\n\tif (typeof value === \"bigint\") return value.toString();\n\n\treturn { type: \"unknown\" };\n}\n\n/**\n * Превращает произвольное значение в JSON-совместимую диагностическую форму.\n * Значения сохраняются читаемыми, потому что queryKey/meta/context нужны\n * для восстановления пользовательского сценария; тяжелые данные query cache\n * отсекаются отдельно и сюда не передаются.\n */\nexport function createDiagnosticValue(value: unknown, depth = 0): ErrorReportSafeValue {\n\treturn createDiagnosticValueInternal(value, depth, {\n\t\tseen: new WeakSet(),\n\t\tmaxStringLength: MAX_DIAGNOSTIC_STRING_LENGTH\n\t});\n}\n\n/**\n * Описывает форму данных кеша без самих значений: типы, размеры массивов и ключи объектов.\n */\nexport function createDataShape(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null) return { type: \"null\" };\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (Array.isArray(value)) {\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tlength: value.length,\n\t\t\tfirstItemsShape: value.slice(0, 3).map((item) => createDataShape(item, depth + 1))\n\t\t};\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tkeys: entries.map(([key]) => key),\n\t\t\tshape: Object.fromEntries(entries.map(([key, item]) => [key, createDataShape(item, depth + 1)]))\n\t\t};\n\t}\n\n\treturn { type: typeof value };\n}\n\n/**\n * Подключает предметный sanitizer приложения. `undefined` отключает callback и\n * одновременно предотвращает утечку старой policy при hot reload и в тестах.\n */\nexport function setErrorReportSanitizer(sanitizer: ErrorReportSanitizer | undefined) {\n\terrorReportSanitizer = sanitizer;\n}\n\n/**\n * Выполняет built-in нормализацию, затем предметную policy приложения и ещё\n * одну bounded-нормализацию результата перед включением секции в payload.\n */\nexport function sanitizeErrorReportValue(\n\tvalue: unknown,\n\tcontext: ErrorReportSanitizationContext,\n\tmaxStringLength = MAX_DIAGNOSTIC_STRING_LENGTH\n) {\n\tconst createBoundedValue = (candidate: unknown) =>\n\t\tcreateDiagnosticValueInternal(candidate, 0, { seen: new WeakSet(), maxStringLength });\n\tconst safeValue = createBoundedValue(value);\n\tif (!errorReportSanitizer) return safeValue;\n\n\ttry {\n\t\tconst appSanitizedValue = errorReportSanitizer(safeValue, context);\n\t\treturn appSanitizedValue === undefined ? undefined : createBoundedValue(appSanitizedValue);\n\t} catch {\n\t\t// Ошибка optional sanitizer безопаснее приводит к удалению секции, а не к\n\t\t// сохранению потенциально чувствительного исходного значения.\n\t\treturn undefined;\n\t}\n}\n\nexport function sanitizeDetail(\n\tdetail: Record<string, unknown> | undefined,\n\tcontext: ErrorReportSanitizationContext = { scope: \"context\" }\n): Record<string, ErrorReportSafeValue> | undefined {\n\tif (!detail) return undefined;\n\n\tconst sanitizedValue = sanitizeErrorReportValue(detail, context);\n\tif (!sanitizedValue || Array.isArray(sanitizedValue) || typeof sanitizedValue !== \"object\") return undefined;\n\n\treturn Object.keys(sanitizedValue).length ? sanitizedValue : undefined;\n}\n","import { truncateText } from \"../formatters\";\n\nimport { sanitizeDetail, sanitizeDiagnosticText } from \"./safeValue\";\n\nimport type { ErrorReportBreadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 80;\nconst MAX_ELEMENT_CHAIN = 20;\nconst MAX_ATTRIBUTE_LENGTH = 120;\nconst INTERACTIVE_CLICK_TARGET_SELECTOR = [\"button\", \"a\", \"input\", \"select\", \"textarea\", \"[role]\"].join(\",\");\nconst SAFE_TARGET_VALUE = /^[a-z0-9][a-z0-9._:/-]*$/i;\n\nlet breadcrumbs: ErrorReportBreadcrumb[] = [];\n\nfunction nowUtc() {\n\treturn new Date().toISOString();\n}\n\nexport function addErrorReportBreadcrumb(breadcrumb: Omit<ErrorReportBreadcrumb, \"utc\"> & { utc?: string }) {\n\tbreadcrumbs = [\n\t\t...breadcrumbs,\n\t\t{\n\t\t\t...breadcrumb,\n\t\t\tutc: sanitizeDiagnosticText(breadcrumb.utc ?? nowUtc(), 64),\n\t\t\trouteId: breadcrumb.routeId\n\t\t\t\t? sanitizeDiagnosticText(breadcrumb.routeId.split(/[?#]/, 1)[0] ?? breadcrumb.routeId, 512)\n\t\t\t\t: undefined,\n\t\t\tappId: breadcrumb.appId ? sanitizeDiagnosticText(breadcrumb.appId, 128) : undefined,\n\t\t\tviewId: breadcrumb.viewId ? sanitizeDiagnosticText(breadcrumb.viewId, 128) : undefined,\n\t\t\ttarget: breadcrumb.target ? sanitizeDiagnosticText(breadcrumb.target, 2_048) : undefined,\n\t\t\tdetail: sanitizeDetail(breadcrumb.detail, {\n\t\t\t\tscope: \"breadcrumb-detail\",\n\t\t\t\tsource: breadcrumb.type\n\t\t\t})\n\t\t}\n\t].slice(-MAX_BREADCRUMBS);\n}\n\nexport function getErrorReportBreadcrumbs() {\n\treturn breadcrumbs.slice();\n}\n\nexport function clearErrorReportBreadcrumbs() {\n\tbreadcrumbs = [];\n}\n\nfunction truncateAttributeText(value: string | null | undefined) {\n\treturn truncateText(value, MAX_ATTRIBUTE_LENGTH);\n}\n\nfunction readSafeTargetValue(element: Element) {\n\tconst value = truncateAttributeText(element.getAttribute(\"data-error-report-target\"));\n\treturn value && SAFE_TARGET_VALUE.test(value) ? value : undefined;\n}\n\nfunction readTechnicalAttribute(element: Element, name: string) {\n\tconst value = truncateAttributeText(element.getAttribute(name));\n\treturn value && SAFE_TARGET_VALUE.test(value) ? value : undefined;\n}\n\nfunction readTechnicalAttributes(element: Element) {\n\tconst errorReportTarget = readSafeTargetValue(element);\n\n\t// Специализированный маркер однозначно переопределяет прежнюю host-разметку.\n\t// Fallback сохраняет уже внедрённые data-ui/data-action без возврата к DOM text.\n\treturn {\n\t\trole: readTechnicalAttribute(element, \"role\"),\n\t\ttype: readTechnicalAttribute(element, \"type\"),\n\t\terrorReportTarget,\n\t\tdataUi: errorReportTarget ? undefined : readTechnicalAttribute(element, \"data-ui\"),\n\t\tdataAction: errorReportTarget ? undefined : readTechnicalAttribute(element, \"data-action\")\n\t};\n}\n\nfunction escapeSelectorPart(value: string) {\n\tif (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n\t\treturn CSS.escape(value);\n\t}\n\n\treturn value.replace(/[\"\\\\#.[\\]>~+:]/g, \"\\\\$&\");\n}\n\nfunction buildElementSelector(element: Element) {\n\tconst attrs = readTechnicalAttributes(element);\n\tconst parts = [element.tagName.toLowerCase()];\n\n\tif (attrs.role) parts.push(`[role=\"${attrs.role}\"]`);\n\tif (attrs.type) parts.push(`[type=\"${attrs.type}\"]`);\n\tif (attrs.errorReportTarget) {\n\t\tparts.push(`[data-error-report-target=\"${escapeSelectorPart(attrs.errorReportTarget)}\"]`);\n\t} else {\n\t\tif (attrs.dataUi) parts.push(`[data-ui=\"${escapeSelectorPart(attrs.dataUi)}\"]`);\n\t\tif (attrs.dataAction) parts.push(`[data-action=\"${escapeSelectorPart(attrs.dataAction)}\"]`);\n\t}\n\n\treturn parts.join(\"\");\n}\n\nfunction describeElement(element: Element) {\n\tconst attrs = readTechnicalAttributes(element);\n\n\treturn {\n\t\ttag: element.tagName.toLowerCase(),\n\t\tselector: buildElementSelector(element),\n\t\t...attrs\n\t};\n}\n\nfunction compactElementDescription(description: ReturnType<typeof describeElement>) {\n\treturn Object.fromEntries(\n\t\tObject.entries(description).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n\t);\n}\n\nfunction getClickElementChain(target: Element) {\n\tconst chain: Element[] = [];\n\tlet current: Element | null = target;\n\n\twhile (current && current !== document.documentElement && chain.length < MAX_ELEMENT_CHAIN) {\n\t\tchain.push(current);\n\t\tif (current === document.body) break;\n\t\tcurrent = current.parentElement;\n\t}\n\n\treturn chain;\n}\n\nfunction findMeaningfulClickTarget(target: Element) {\n\tconst chain = getClickElementChain(target);\n\tconst explicitTarget = chain.find((element) => readSafeTargetValue(element));\n\tif (explicitTarget) return explicitTarget;\n\n\treturn (\n\t\tchain.find(\n\t\t\t(element) =>\n\t\t\t\telement.matches(INTERACTIVE_CLICK_TARGET_SELECTOR) ||\n\t\t\t\treadTechnicalAttribute(element, \"data-action\") !== undefined ||\n\t\t\t\treadTechnicalAttribute(element, \"data-ui\") !== undefined\n\t\t) ?? target\n\t);\n}\n\nfunction describeClickTarget(target: EventTarget | null) {\n\tif (!(target instanceof Element)) return undefined;\n\n\tconst meaningfulTarget = findMeaningfulClickTarget(target);\n\tconst chain = getClickElementChain(meaningfulTarget);\n\n\treturn chain.map((element) => buildElementSelector(element)).join(\" > \");\n}\n\nfunction describeClickDetail(event: MouseEvent) {\n\tconst target = event.target instanceof Element ? event.target : undefined;\n\tconst meaningfulTarget = target ? findMeaningfulClickTarget(target) : undefined;\n\tconst chain = meaningfulTarget\n\t\t? getClickElementChain(meaningfulTarget).map((element) => compactElementDescription(describeElement(element)))\n\t\t: [];\n\n\treturn sanitizeDetail(\n\t\t{\n\t\t\tbutton: event.button,\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\ttarget: meaningfulTarget ? compactElementDescription(describeElement(meaningfulTarget)) : undefined,\n\t\t\tchain\n\t\t},\n\t\t{ scope: \"breadcrumb-detail\", source: \"click\" }\n\t);\n}\n\n/**\n * Подключает breadcrumbs по действиям пользователя без тел запросов.\n */\nexport function installErrorReportBrowserBreadcrumbs() {\n\tif (typeof window === \"undefined\") return () => undefined;\n\n\tconst onClick = (event: MouseEvent) => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"click\",\n\t\t\ttarget: describeClickTarget(event.target),\n\t\t\tdetail: describeClickDetail(event)\n\t\t});\n\t};\n\n\tconst onVisibilityChange = () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"visibility\",\n\t\t\tdetail: sanitizeDetail({ visibilityState: document.visibilityState }, { scope: \"breadcrumb-detail\", source: \"visibility\" })\n\t\t});\n\t};\n\n\twindow.addEventListener(\"click\", onClick, true);\n\tdocument.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n\treturn () => {\n\t\twindow.removeEventListener(\"click\", onClick, true);\n\t\tdocument.removeEventListener(\"visibilitychange\", onVisibilityChange);\n\t};\n}\n","import { sanitizeDetail, sanitizeDiagnosticText, sanitizeDiagnosticTextBytes, sanitizeErrorReportValue } from \"./safeValue\";\n\nimport type {\n\tErrorReportErrorInfo,\n\tErrorReportMutationDiagnostics,\n\tErrorReportPayload,\n\tErrorReportPersistedQueryDiagnostics,\n\tErrorReportQueryDiagnostics\n} from \"./types\";\n\nexport const ERROR_REPORT_PAYLOAD_VERSION = 1 as const;\nexport const ERROR_REPORT_PAYLOAD_MAX_BYTES = 256 * 1_024;\nexport const ERROR_REPORT_STACK_TRACE_MAX_BYTES = 64 * 1_024;\n\nconst ERROR_REPORT_COMPONENT_STACK_MAX_BYTES = 32 * 1_024;\nconst ERROR_REPORT_SOURCE_MAX_LENGTH = 256;\nconst ERROR_REPORT_APPLICATION_MAX_LENGTH = 128;\nconst ERROR_REPORT_LOCATION_MAX_LENGTH = 2_048;\n\nfunction serializedByteLength(value: unknown) {\n\treturn new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\nfunction sanitizePathname(value: string) {\n\treturn sanitizeDiagnosticText(value.split(/[?#]/, 1)[0] ?? value, ERROR_REPORT_LOCATION_MAX_LENGTH);\n}\n\nfunction sanitizeScopedText(\n\tvalue: string,\n\tcontext: { scope: \"error-message\" | \"stack-trace\"; source?: string },\n\tlimit: number,\n\tlimitUnit: \"bytes\" | \"characters\" = \"characters\"\n) {\n\tconst builtInValue = limitUnit === \"bytes\" ? sanitizeDiagnosticTextBytes(value, limit) : sanitizeDiagnosticText(value, limit);\n\tconst sanitizedValue = sanitizeErrorReportValue(builtInValue, context, limit);\n\tif (typeof sanitizedValue !== \"string\") return undefined;\n\treturn limitUnit === \"bytes\" ? sanitizeDiagnosticTextBytes(sanitizedValue, limit) : sanitizeDiagnosticText(sanitizedValue, limit);\n}\n\nfunction sanitizeErrorInfo(error: ErrorReportErrorInfo, source?: string): ErrorReportErrorInfo {\n\treturn {\n\t\tname: sanitizeDiagnosticText(error.name, 256),\n\t\tmessage: sanitizeScopedText(error.message, { scope: \"error-message\", source }, 4_096) ?? \"[REDACTED]\",\n\t\tcode: error.code ? sanitizeDiagnosticText(error.code, 128) : undefined,\n\t\tstackTrace: error.stackTrace\n\t\t\t? sanitizeScopedText(error.stackTrace, { scope: \"stack-trace\", source }, ERROR_REPORT_STACK_TRACE_MAX_BYTES, \"bytes\")\n\t\t\t: undefined,\n\t\thttpStatus: error.httpStatus\n\t};\n}\n\nfunction sanitizeQueryDiagnostics(query: ErrorReportQueryDiagnostics): ErrorReportQueryDiagnostics {\n\treturn {\n\t\t...query,\n\t\tqueryHash: sanitizeDiagnosticText(query.queryHash, 512),\n\t\tqueryKey: sanitizeErrorReportValue(query.queryKey, {\n\t\t\tscope: \"query-key\",\n\t\t\tsource: query.queryHash\n\t\t}) ?? { type: \"redacted\" },\n\t\tmeta: sanitizeDetail(query.meta, { scope: \"query-meta\", source: query.queryHash }),\n\t\tdataShape: query.dataShape\n\t\t\t? sanitizeErrorReportValue(query.dataShape, { scope: \"query-data-shape\", source: query.queryHash })\n\t\t\t: undefined,\n\t\terror: query.error ? sanitizeErrorInfo(query.error, query.queryHash) : undefined\n\t};\n}\n\nfunction sanitizeMutationDiagnostics(mutation: ErrorReportMutationDiagnostics): ErrorReportMutationDiagnostics {\n\treturn {\n\t\t...mutation,\n\t\tmutationKey: mutation.mutationKey ? sanitizeErrorReportValue(mutation.mutationKey, { scope: \"mutation-key\" }) : undefined,\n\t\tmeta: sanitizeDetail(mutation.meta, { scope: \"mutation-meta\" }),\n\t\terror: mutation.error ? sanitizeErrorInfo(mutation.error, \"mutation\") : undefined\n\t};\n}\n\nfunction sanitizePersistedQueryDiagnostics(query: ErrorReportPersistedQueryDiagnostics): ErrorReportPersistedQueryDiagnostics {\n\treturn {\n\t\t...query,\n\t\tbuster: query.buster ? sanitizeDiagnosticText(query.buster, 512) : undefined,\n\t\tqueryHash: query.queryHash ? sanitizeDiagnosticText(query.queryHash, 512) : undefined,\n\t\tqueryKey: query.queryKey\n\t\t\t? sanitizeErrorReportValue(query.queryKey, {\n\t\t\t\t\tscope: \"persisted-query-key\",\n\t\t\t\t\tsource: query.queryHash\n\t\t\t\t})\n\t\t\t: undefined,\n\t\terror: query.error ? sanitizeErrorInfo(query.error, query.queryHash) : undefined\n\t};\n}\n\n/** Возвращает точный UTF-8 размер JSON-формы, которую получит transport. */\nexport function getErrorReportPayloadSize(payload: ErrorReportPayload) {\n\treturn serializedByteLength(payload);\n}\n\nfunction normalizePayloadStrings(payload: ErrorReportPayload): ErrorReportPayload {\n\treturn {\n\t\t...payload,\n\t\treportId: sanitizeDiagnosticText(payload.reportId, 128),\n\t\tsessionId: sanitizeDiagnosticText(payload.sessionId, 128),\n\t\tcreatedUtc: sanitizeDiagnosticText(payload.createdUtc, 64),\n\t\tapplication: sanitizeDiagnosticText(payload.application, ERROR_REPORT_APPLICATION_MAX_LENGTH),\n\t\tsource: sanitizeDiagnosticText(payload.source, ERROR_REPORT_SOURCE_MAX_LENGTH),\n\t\terror: sanitizeErrorInfo(payload.error, payload.source),\n\t\tenvironment: {\n\t\t\t...payload.environment,\n\t\t\tbuildId: payload.environment.buildId ? sanitizeDiagnosticText(payload.environment.buildId, 128) : undefined\n\t\t},\n\t\tclient: payload.client\n\t\t\t? {\n\t\t\t\t\tuserAgent: payload.client.userAgent ? sanitizeDiagnosticText(payload.client.userAgent) : undefined,\n\t\t\t\t\tlanguage: payload.client.language ? sanitizeDiagnosticText(payload.client.language, 128) : undefined,\n\t\t\t\t\ttimeZone: payload.client.timeZone ? sanitizeDiagnosticText(payload.client.timeZone, 128) : undefined\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tlocation: payload.location\n\t\t\t? {\n\t\t\t\t\tpathname: sanitizePathname(payload.location.pathname),\n\t\t\t\t\torigin: payload.location.origin\n\t\t\t\t\t\t? sanitizeDiagnosticText(\n\t\t\t\t\t\t\t\tpayload.location.origin.split(/[?#]/, 1)[0] ?? payload.location.origin,\n\t\t\t\t\t\t\t\tERROR_REPORT_LOCATION_MAX_LENGTH\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t: undefined,\n\t\treact: payload.react?.componentStack\n\t\t\t? {\n\t\t\t\t\tcomponentStack: sanitizeScopedText(\n\t\t\t\t\t\tpayload.react.componentStack,\n\t\t\t\t\t\t{ scope: \"stack-trace\", source: \"react-component-stack\" },\n\t\t\t\t\t\tERROR_REPORT_COMPONENT_STACK_MAX_BYTES,\n\t\t\t\t\t\t\"bytes\"\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tquery: payload.query ? sanitizeQueryDiagnostics(payload.query) : undefined,\n\t\tmutation: payload.mutation ? sanitizeMutationDiagnostics(payload.mutation) : undefined,\n\t\tqueryClient: payload.queryClient\n\t\t\t? {\n\t\t\t\t\tqueries: payload.queryClient.queries.slice(-40).map(sanitizeQueryDiagnostics),\n\t\t\t\t\tmutations: payload.queryClient.mutations.slice(-40).map(sanitizeMutationDiagnostics)\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tpersistedQueries: payload.persistedQueries?.slice(-40).map(sanitizePersistedQueryDiagnostics),\n\t\tbreadcrumbs: payload.breadcrumbs.slice(-80).map((breadcrumb) => ({\n\t\t\t...breadcrumb,\n\t\t\tutc: sanitizeDiagnosticText(breadcrumb.utc, 64),\n\t\t\trouteId: breadcrumb.routeId ? sanitizeDiagnosticText(breadcrumb.routeId, 512) : undefined,\n\t\t\tappId: breadcrumb.appId ? sanitizeDiagnosticText(breadcrumb.appId, 128) : undefined,\n\t\t\tviewId: breadcrumb.viewId ? sanitizeDiagnosticText(breadcrumb.viewId, 128) : undefined,\n\t\t\ttarget: breadcrumb.target ? sanitizeDiagnosticText(breadcrumb.target, 2_048) : undefined,\n\t\t\tdetail: sanitizeDetail(breadcrumb.detail, {\n\t\t\t\tscope: \"breadcrumb-detail\",\n\t\t\t\tsource: breadcrumb.type\n\t\t\t})\n\t\t})),\n\t\tcontext: sanitizeDetail(payload.context, { scope: \"context\", source: payload.source })\n\t};\n}\n\n/**\n * Удаляет диагностические секции в фиксированном порядке, пока payload не\n * помещается в transport/storage limit. Identity, классификация и ошибка\n * сохраняются всегда; маркер перечисляет каждую фактически удалённую секцию.\n */\nexport function limitErrorReportPayload(input: ErrorReportPayload): ErrorReportPayload {\n\tconst normalized = normalizePayloadStrings(input);\n\tconst originalBytes = getErrorReportPayloadSize(normalized);\n\tif (originalBytes <= ERROR_REPORT_PAYLOAD_MAX_BYTES) return normalized;\n\n\tconst droppedSections: string[] = [];\n\tlet payload: ErrorReportPayload = {\n\t\t...normalized,\n\t\ttruncation: {\n\t\t\treason: \"payload-size\",\n\t\t\tlimitBytes: ERROR_REPORT_PAYLOAD_MAX_BYTES,\n\t\t\toriginalBytes,\n\t\t\tdroppedSections\n\t\t}\n\t};\n\n\tconst drop = (\n\t\tsection: string,\n\t\tisPresent: (current: ErrorReportPayload) => boolean,\n\t\tupdate: (current: ErrorReportPayload) => ErrorReportPayload\n\t) => {\n\t\tif (!isPresent(payload) || getErrorReportPayloadSize(payload) <= ERROR_REPORT_PAYLOAD_MAX_BYTES) return;\n\t\tdroppedSections.push(section);\n\t\tpayload = update(payload);\n\t};\n\n\tdrop(\n\t\t\"queryClient\",\n\t\t(current) => current.queryClient !== undefined,\n\t\t(current) => ({ ...current, queryClient: undefined })\n\t);\n\tdrop(\n\t\t\"persistedQueries\",\n\t\t(current) => current.persistedQueries !== undefined,\n\t\t(current) => ({ ...current, persistedQueries: undefined })\n\t);\n\tdrop(\n\t\t\"context\",\n\t\t(current) => current.context !== undefined,\n\t\t(current) => ({ ...current, context: undefined })\n\t);\n\tdrop(\n\t\t\"query.meta\",\n\t\t(current) => current.query?.meta !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tquery: current.query ? { ...current.query, meta: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"query.dataShape\",\n\t\t(current) => current.query?.dataShape !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tquery: current.query ? { ...current.query, dataShape: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"mutation.meta\",\n\t\t(current) => current.mutation?.meta !== undefined,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tmutation: current.mutation ? { ...current.mutation, meta: undefined } : undefined\n\t\t})\n\t);\n\tdrop(\n\t\t\"breadcrumbs:oldest\",\n\t\t(current) => current.breadcrumbs.length > 20,\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\tbreadcrumbs: current.breadcrumbs.slice(-20)\n\t\t})\n\t);\n\tdrop(\n\t\t\"query\",\n\t\t(current) => current.query !== undefined,\n\t\t(current) => ({ ...current, query: undefined })\n\t);\n\tdrop(\n\t\t\"mutation\",\n\t\t(current) => current.mutation !== undefined,\n\t\t(current) => ({ ...current, mutation: undefined })\n\t);\n\tdrop(\n\t\t\"react\",\n\t\t(current) => current.react !== undefined,\n\t\t(current) => ({ ...current, react: undefined })\n\t);\n\tdrop(\n\t\t\"breadcrumbs\",\n\t\t(current) => current.breadcrumbs.length > 0,\n\t\t(current) => ({ ...current, breadcrumbs: [] })\n\t);\n\tdrop(\n\t\t\"client\",\n\t\t(current) => current.client !== undefined,\n\t\t(current) => ({ ...current, client: undefined })\n\t);\n\tdrop(\n\t\t\"viewport\",\n\t\t(current) => current.viewport !== undefined,\n\t\t(current) => ({ ...current, viewport: undefined })\n\t);\n\n\treturn payload;\n}\n","import { normalizeText } from \"../formatters\";\n\nimport { ERROR_REPORT_STACK_TRACE_MAX_BYTES } from \"./payload\";\nimport { sanitizeDiagnosticText, sanitizeDiagnosticTextBytes } from \"./safeValue\";\n\nimport type { ErrorReportErrorInfo } from \"./types\";\n\nconst DEFAULT_ERROR_MESSAGE = \"Неизвестная ошибка\";\n\n/**\n * Гарантирует непустое диагностическое сообщение, сохраняя исходный текст ошибки.\n * Fallback нужен для Error без message и для брошенных пустых строк.\n */\nfunction resolveErrorMessage(message: string) {\n\treturn normalizeText(message) ? sanitizeDiagnosticText(message) : DEFAULT_ERROR_MESSAGE;\n}\n\nfunction readStatus(value: Record<string, unknown>) {\n\tconst status = value.status ?? value.statusCode ?? value.httpStatus;\n\treturn typeof status === \"number\" && Number.isFinite(status) ? status : undefined;\n}\n\nfunction readServerFnTransportErrorInfo(error: unknown): ErrorReportErrorInfo | null {\n\tif (!error || typeof error !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst transport = error as Record<string, unknown>;\n\tconst appError = transport.appError;\n\tif (!appError || typeof appError !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst payload = appError as Record<string, unknown>;\n\tconst message = normalizeText(payload.message);\n\tif (!message) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tname: \"AppError\",\n\t\tmessage: sanitizeDiagnosticText(message),\n\t\tcode: normalizeText(payload.code) ? sanitizeDiagnosticText(String(payload.code), 128) : undefined,\n\t\thttpStatus: readStatus(payload)\n\t};\n}\n\n/**\n * Нормализует любое брошенное значение в форму, удобную для поиска и сохранения.\n * Stacktrace намеренно сохраняется полностью: это основная диагностическая ценность отчета.\n */\nexport function createErrorInfo(error: unknown): ErrorReportErrorInfo {\n\tconst serverFnErrorInfo = readServerFnTransportErrorInfo(error);\n\tif (serverFnErrorInfo) {\n\t\treturn serverFnErrorInfo;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\tname: sanitizeDiagnosticText(error.name || \"Error\", 256),\n\t\t\tmessage: resolveErrorMessage(error.message),\n\t\t\tstackTrace: error.stack ? sanitizeDiagnosticTextBytes(error.stack, ERROR_REPORT_STACK_TRACE_MAX_BYTES) : undefined\n\t\t};\n\t}\n\n\tif (error && typeof error === \"object\") {\n\t\tconst record = error as Record<string, unknown>;\n\t\treturn {\n\t\t\tname: sanitizeDiagnosticText(typeof record.name === \"string\" ? record.name : \"Error\", 256),\n\t\t\tmessage: resolveErrorMessage(typeof record.message === \"string\" ? record.message : String(error)),\n\t\t\tstackTrace:\n\t\t\t\ttypeof record.stack === \"string\"\n\t\t\t\t\t? sanitizeDiagnosticTextBytes(record.stack, ERROR_REPORT_STACK_TRACE_MAX_BYTES)\n\t\t\t\t\t: undefined,\n\t\t\thttpStatus: readStatus(record)\n\t\t};\n\t}\n\n\treturn {\n\t\tname: \"Error\",\n\t\tmessage: resolveErrorMessage(typeof error === \"string\" ? error : String(error ?? DEFAULT_ERROR_MESSAGE))\n\t};\n}\n","import { type PersistedQuery } from \"@tanstack/query-persist-client-core\";\nimport { type MutationKey, type MutationState, type QueryClient, type QueryKey, type QueryState } from \"@tanstack/react-query\";\n\nimport { hashString128 } from \"../crypto\";\nimport { createIndexedDbQueryStorage } from \"../query-client\";\nimport { stableStringify } from \"../utils\";\n\nimport { createErrorInfo } from \"./errorInfo\";\nimport { createDataShape, sanitizeDetail, sanitizeDiagnosticText, sanitizeErrorReportValue } from \"./safeValue\";\nimport {\n\ttype ErrorReportMutationDiagnostics,\n\ttype ErrorReportPersistedQueryDiagnostics,\n\ttype ErrorReportQueryDiagnostics,\n\ttype ErrorReportSafeValue\n} from \"./types\";\n\ntype QueryDiagnosticSource = {\n\tqueryHash: string;\n\tqueryKey: QueryKey;\n\tstate: QueryState<unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n\tgetObserversCount: () => number;\n};\n\ntype MutationDiagnosticSource = {\n\toptions: {\n\t\tmutationKey?: MutationKey;\n\t};\n\tstate: MutationState<unknown, unknown, unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n};\n\nconst MAX_QUERY_DIAGNOSTICS = 40;\nconst MAX_MUTATION_DIAGNOSTICS = 40;\nconst MAX_PERSISTED_QUERY_DIAGNOSTICS = 40;\n\nfunction sanitizeMeta(\n\tmeta: Record<string, unknown> | undefined,\n\tscope: \"mutation-meta\" | \"query-meta\",\n\tsource?: string\n): Record<string, ErrorReportSafeValue> | undefined {\n\treturn sanitizeDetail(meta, { scope, source });\n}\n\nexport function collectQueryDiagnostics(query: QueryDiagnosticSource): ErrorReportQueryDiagnostics {\n\tconst queryKey = sanitizeErrorReportValue(query.queryKey, { scope: \"query-key\" }) ?? { type: \"redacted\" };\n\tconst queryHash = hashString128(stableStringify(queryKey));\n\n\treturn {\n\t\tqueryHash,\n\t\tqueryKey,\n\t\tstatus: query.state.status,\n\t\tfetchStatus: query.state.fetchStatus,\n\t\tdataUpdatedAt: query.state.dataUpdatedAt,\n\t\terrorUpdatedAt: query.state.errorUpdatedAt,\n\t\tfailureCount: query.state.fetchFailureCount,\n\t\tisInvalidated: query.state.isInvalidated,\n\t\tobserversCount: query.getObserversCount(),\n\t\tmeta: sanitizeMeta(query.meta, \"query-meta\", queryHash),\n\t\tdataShape: sanitizeErrorReportValue(createDataShape(query.state.data), {\n\t\t\tscope: \"query-data-shape\",\n\t\t\tsource: queryHash\n\t\t}),\n\t\terror: query.state.error ? createErrorInfo(query.state.error) : undefined\n\t};\n}\n\nexport function collectMutationDiagnostics(mutation: MutationDiagnosticSource): ErrorReportMutationDiagnostics {\n\treturn {\n\t\tmutationKey: mutation.options.mutationKey\n\t\t\t? sanitizeErrorReportValue(mutation.options.mutationKey, { scope: \"mutation-key\" })\n\t\t\t: undefined,\n\t\tstatus: mutation.state.status,\n\t\tfailureCount: mutation.state.failureCount,\n\t\tsubmittedAt: mutation.state.submittedAt,\n\t\tmeta: sanitizeMeta(mutation.meta, \"mutation-meta\"),\n\t\terror: mutation.state.error ? createErrorInfo(mutation.state.error) : undefined\n\t};\n}\n\nexport function collectQueryClientDiagnostics(queryClient: QueryClient) {\n\treturn {\n\t\tqueries: queryClient.getQueryCache().getAll().slice(-MAX_QUERY_DIAGNOSTICS).map(collectQueryDiagnostics),\n\t\tmutations: queryClient.getMutationCache().getAll().slice(-MAX_MUTATION_DIAGNOSTICS).map(collectMutationDiagnostics)\n\t};\n}\n\nfunction collectPersistedStateDiagnostics(persistedQuery: PersistedQuery): ErrorReportPersistedQueryDiagnostics {\n\tconst state = persistedQuery.state;\n\tconst queryKey = sanitizeErrorReportValue(persistedQuery.queryKey, { scope: \"persisted-query-key\" });\n\tconst queryHash = queryKey ? hashString128(stableStringify(queryKey)) : undefined;\n\n\treturn {\n\t\tbuster: persistedQuery.buster ? sanitizeDiagnosticText(persistedQuery.buster, 512) : undefined,\n\t\tqueryHash,\n\t\tqueryKey,\n\t\tstatus: state.status,\n\t\tfetchStatus: state.fetchStatus,\n\t\tdataUpdatedAt: state.dataUpdatedAt,\n\t\terrorUpdatedAt: state.errorUpdatedAt,\n\t\tfailureCount: state.fetchFailureCount,\n\t\terror: state.error ? createErrorInfo(state.error) : undefined\n\t};\n}\n\n/**\n * Читает IndexedDB persistence и возвращает только технические поля.\n * `state.data` и другие значения кеша не попадают в результат.\n */\nexport async function collectPersistedQueryDiagnostics(): Promise<ErrorReportPersistedQueryDiagnostics[]> {\n\tconst storage = createIndexedDbQueryStorage<PersistedQuery>();\n\tif (!storage?.entries) return [];\n\n\ttry {\n\t\tconst entries = await storage.entries();\n\t\treturn entries\n\t\t\t.slice(-MAX_PERSISTED_QUERY_DIAGNOSTICS)\n\t\t\t.map(([, persistedQuery]) => collectPersistedStateDiagnostics(persistedQuery));\n\t} catch {\n\t\treturn [];\n\t}\n}\n","type ErrorReportEnvironmentOptions = {\n\tisDev?: boolean;\n};\n\n/**\n * Отчеты собираются только в браузере и только вне dev-режима.\n * На серверном рендеринге draft не создается, чтобы не смешивать SSR-ошибки с клиентской диагностикой.\n */\nexport function isErrorReportingEnabled(options: ErrorReportEnvironmentOptions = {}) {\n\tconst isDev = options.isDev ?? __DEV__;\n\n\treturn typeof window !== \"undefined\" && !isDev;\n}\n\nexport function getErrorReportEnvironment() {\n\tconst mode: \"development\" | \"production\" = __DEV__ ? \"development\" : \"production\";\n\n\treturn {\n\t\tmode,\n\t\tbuildId: typeof __APP_BUILD_ID__ === \"string\" ? __APP_BUILD_ID__ : undefined\n\t};\n}\n\nexport function getErrorReportClientEnvironment() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tuserAgent: window.navigator.userAgent,\n\t\tlanguage: window.navigator.language,\n\t\ttimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n\t};\n}\n","import { z } from \"zod\";\n\nimport { ERROR_REPORT_PAYLOAD_MAX_BYTES, getErrorReportPayloadSize } from \"./payload\";\nimport { getUtf8TextSize } from \"./safeValue\";\n\nimport type { ErrorReportDraft, ErrorReportPayload, ErrorReportSafeValue } from \"./types\";\n\nconst safeValueSchema: z.ZodType<ErrorReportSafeValue> = z.lazy(() =>\n\tz.union([\n\t\tz.string().max(4_096),\n\t\tz.number().finite(),\n\t\tz.boolean(),\n\t\tz.null(),\n\t\tz.array(safeValueSchema).max(20),\n\t\tz.record(z.string(), safeValueSchema).refine((value) => Object.keys(value).length <= 40)\n\t])\n);\n\nconst safeRecordSchema = z.record(z.string(), safeValueSchema).refine((value) => Object.keys(value).length <= 40);\nconst errorInfoSchema = z\n\t.object({\n\t\tname: z.string().min(1).max(256),\n\t\tmessage: z.string().min(1).max(4_096),\n\t\tcode: z.string().max(128).optional(),\n\t\tstackTrace: z\n\t\t\t.string()\n\t\t\t.refine((value) => getUtf8TextSize(value) <= 64 * 1_024)\n\t\t\t.optional(),\n\t\thttpStatus: z.number().finite().optional()\n\t})\n\t.strict();\nconst breadcrumbSchema = z\n\t.object({\n\t\tutc: z.string().min(1).max(64),\n\t\ttype: z.enum([\"route\", \"click\", \"visibility\", \"query-error\", \"mutation-error\", \"runtime-error\"]),\n\t\trouteId: z.string().max(512).optional(),\n\t\tappId: z.string().max(128).optional(),\n\t\tviewId: z.string().max(128).optional(),\n\t\ttarget: z.string().max(2_048).optional(),\n\t\tdetail: safeRecordSchema.optional()\n\t})\n\t.strict();\nconst queryDiagnosticsSchema = z\n\t.object({\n\t\tqueryHash: z.string().max(512),\n\t\tqueryKey: safeValueSchema,\n\t\tstatus: z.string().max(64).optional(),\n\t\tfetchStatus: z.string().max(64).optional(),\n\t\tdataUpdatedAt: z.number().finite().optional(),\n\t\terrorUpdatedAt: z.number().finite().optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\tisInvalidated: z.boolean().optional(),\n\t\tobserversCount: z.number().finite().optional(),\n\t\tmeta: safeRecordSchema.optional(),\n\t\tdataShape: safeValueSchema.optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\nconst mutationDiagnosticsSchema = z\n\t.object({\n\t\tmutationKey: safeValueSchema.optional(),\n\t\tstatus: z.string().max(64).optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\tsubmittedAt: z.number().finite().optional(),\n\t\tmeta: safeRecordSchema.optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\nconst persistedQueryDiagnosticsSchema = z\n\t.object({\n\t\tbuster: z.string().max(512).optional(),\n\t\tqueryHash: z.string().max(512).optional(),\n\t\tqueryKey: safeValueSchema.optional(),\n\t\tstatus: z.string().max(64).optional(),\n\t\tfetchStatus: z.string().max(64).optional(),\n\t\tdataUpdatedAt: z.number().finite().optional(),\n\t\terrorUpdatedAt: z.number().finite().optional(),\n\t\tfailureCount: z.number().finite().optional(),\n\t\terror: errorInfoSchema.optional()\n\t})\n\t.strict();\n\nconst errorReportPayloadSchema: z.ZodType<ErrorReportPayload> = z\n\t.object({\n\t\tpayloadVersion: z.literal(1),\n\t\tapplication: z.string().min(1).max(128),\n\t\treportId: z.string().uuid(),\n\t\tsessionId: z.string().uuid(),\n\t\tcreatedUtc: z.string().min(1).max(64),\n\t\tcategory: z.enum([\"query\", \"mutation\", \"runtime\", \"react\"]),\n\t\tsource: z.string().min(1).max(256),\n\t\terror: errorInfoSchema,\n\t\tenvironment: z\n\t\t\t.object({\n\t\t\t\tmode: z.enum([\"development\", \"production\"]),\n\t\t\t\tbuildId: z.string().max(128).optional()\n\t\t\t})\n\t\t\t.strict(),\n\t\tclient: z\n\t\t\t.object({\n\t\t\t\tuserAgent: z.string().max(4_096).optional(),\n\t\t\t\tlanguage: z.string().max(128).optional(),\n\t\t\t\ttimeZone: z.string().max(128).optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tlocation: z\n\t\t\t.object({\n\t\t\t\tpathname: z.string().max(2_048),\n\t\t\t\torigin: z.string().max(2_048).optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tviewport: z\n\t\t\t.object({\n\t\t\t\twidth: z.number().finite(),\n\t\t\t\theight: z.number().finite(),\n\t\t\t\tdevicePixelRatio: z.number().finite().optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\treact: z\n\t\t\t.object({\n\t\t\t\tcomponentStack: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.refine((value) => getUtf8TextSize(value) <= 32 * 1_024)\n\t\t\t\t\t.optional()\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tquery: queryDiagnosticsSchema.optional(),\n\t\tmutation: mutationDiagnosticsSchema.optional(),\n\t\tqueryClient: z\n\t\t\t.object({\n\t\t\t\tqueries: z.array(queryDiagnosticsSchema).max(40),\n\t\t\t\tmutations: z.array(mutationDiagnosticsSchema).max(40)\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tpersistedQueries: z.array(persistedQueryDiagnosticsSchema).max(40).optional(),\n\t\tbreadcrumbs: z.array(breadcrumbSchema).max(80),\n\t\tcontext: safeRecordSchema.optional(),\n\t\ttruncation: z\n\t\t\t.object({\n\t\t\t\treason: z.literal(\"payload-size\"),\n\t\t\t\tlimitBytes: z.literal(ERROR_REPORT_PAYLOAD_MAX_BYTES),\n\t\t\t\toriginalBytes: z.number().int().positive(),\n\t\t\t\tdroppedSections: z.array(z.string().max(128)).max(32)\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional()\n\t})\n\t.strict()\n\t.refine((payload) => getErrorReportPayloadSize(payload) <= ERROR_REPORT_PAYLOAD_MAX_BYTES);\n\nconst errorReportDraftSchema: z.ZodType<ErrorReportDraft> = z\n\t.object({\n\t\treportId: z.string().uuid(),\n\t\tsessionId: z.string().uuid(),\n\t\tcreatedUtc: z.string().min(1).max(64),\n\t\tcategory: z.enum([\"query\", \"mutation\", \"runtime\", \"react\"]),\n\t\tstatus: z.enum([\"pending\", \"sending\", \"sent\", \"failed\"]),\n\t\tsentUtc: z.string().min(1).max(64).optional(),\n\t\tfailedReason: z.string().max(4_096).optional(),\n\t\tpayload: errorReportPayloadSchema\n\t})\n\t.strict()\n\t.superRefine((draft, context) => {\n\t\tconst matchingIdentity =\n\t\t\tdraft.reportId === draft.payload.reportId &&\n\t\t\tdraft.sessionId === draft.payload.sessionId &&\n\t\t\tdraft.createdUtc === draft.payload.createdUtc &&\n\t\t\tdraft.category === draft.payload.category;\n\n\t\tif (!matchingIdentity) {\n\t\t\tcontext.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"Draft identity должна совпадать с payload identity.\"\n\t\t\t});\n\t\t}\n\t});\n\nfunction isSerializedInputWithinLimit(value: unknown, maxBytes: number) {\n\ttry {\n\t\treturn new TextEncoder().encode(JSON.stringify(value)).byteLength <= maxBytes;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Парсит только текущую versioned форму. Unversioned и будущие payload\n * отклоняются явно, чтобы storage/delivery не угадывали форму контракта.\n */\nexport function parseErrorReportPayload(value: unknown) {\n\tif (!isSerializedInputWithinLimit(value, ERROR_REPORT_PAYLOAD_MAX_BYTES)) return undefined;\n\n\ttry {\n\t\tconst result = errorReportPayloadSchema.safeParse(value);\n\t\treturn result.success ? result.data : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Проверяет одну draft-запись, включая совпадение её identity с payload. */\nexport function parseErrorReportDraft(value: unknown) {\n\tif (!isSerializedInputWithinLimit(value, ERROR_REPORT_PAYLOAD_MAX_BYTES + 16 * 1_024)) return undefined;\n\n\ttry {\n\t\tconst result = errorReportDraftSchema.safeParse(value);\n\t\treturn result.success ? result.data : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Восстанавливает все валидные drafts независимо: одна повреждённая запись не\n * должна уничтожить остальные элементы browser storage.\n */\nexport function parseErrorReportDrafts(value: unknown) {\n\tif (!Array.isArray(value)) return [];\n\treturn value.flatMap((draft) => {\n\t\tconst parsed = parseErrorReportDraft(draft);\n\t\treturn parsed ? [parsed] : [];\n\t});\n}\n","import { uuidv4 } from \"../crypto\";\nimport { formatDateAsODataDatetime } from \"../formatters\";\nimport { getSessionStorageId } from \"../session-storage\";\n\nimport { getErrorReportBreadcrumbs } from \"./breadcrumbs\";\nimport { getErrorReportClientEnvironment, getErrorReportEnvironment, isErrorReportingEnabled } from \"./environment\";\nimport { ERROR_REPORT_PAYLOAD_VERSION, limitErrorReportPayload } from \"./payload\";\nimport { sanitizeDetail, sanitizeDiagnosticText, sanitizeErrorReportValue } from \"./safeValue\";\nimport { parseErrorReportDraft, parseErrorReportDrafts } from \"./schema\";\n\nimport type {\n\tErrorReportCategory,\n\tErrorReportDraft,\n\tErrorReportDraftLifecyclePatch,\n\tErrorReportErrorInfo,\n\tErrorReportPayload,\n\tErrorReportSafeValue\n} from \"./types\";\n\nconst STORAGE_KEY = `${__APP_ID__}.errorReport.drafts.v2`;\nconst SESSION_STORAGE_KEY = `${__APP_ID__}.errorReport.sessionId.v1`;\nconst MAX_DRAFTS = 10;\n\nlet drafts = loadDrafts();\n\nfunction nowUtc() {\n\treturn formatDateAsODataDatetime(new Date());\n}\n\nfunction loadDrafts(): ErrorReportDraft[] {\n\tif (typeof sessionStorage === \"undefined\") return [];\n\n\ttry {\n\t\tconst raw = sessionStorage.getItem(STORAGE_KEY);\n\t\treturn parseErrorReportDrafts(raw ? JSON.parse(raw) : []);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction saveDrafts(nextDrafts: ErrorReportDraft[]) {\n\tdrafts = nextDrafts.slice(-MAX_DRAFTS);\n\tif (typeof sessionStorage === \"undefined\") return;\n\n\ttry {\n\t\tsessionStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));\n\t} catch {\n\t\t// Переполнение sessionStorage не должно ломать пользовательский сценарий.\n\t}\n}\n\nfunction getLocationSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tpathname: window.location.pathname,\n\t\torigin: window.location.origin\n\t};\n}\n\nfunction getViewportSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight,\n\t\tdevicePixelRatio: window.devicePixelRatio\n\t};\n}\n\nfunction sanitizeFailedReason(value: string | undefined) {\n\tif (!value) return undefined;\n\tconst sanitizedValue = sanitizeErrorReportValue(value, { scope: \"draft-failed-reason\", source: \"delivery\" });\n\treturn typeof sanitizedValue === \"string\" ? sanitizedValue : undefined;\n}\n\nexport function getErrorReportDraft(reportId: string) {\n\treturn drafts.find((draft) => draft.reportId === reportId);\n}\n\nexport function updateErrorReportDraft(reportId: string, patch: ErrorReportDraftLifecyclePatch) {\n\tconst current = getErrorReportDraft(reportId);\n\tif (!current) return undefined;\n\n\tconst next = {\n\t\t...current,\n\t\t...patch,\n\t\tsentUtc: \"sentUtc\" in patch ? (patch.sentUtc ? sanitizeDiagnosticText(patch.sentUtc, 64) : undefined) : current.sentUtc,\n\t\tfailedReason: \"failedReason\" in patch ? sanitizeFailedReason(patch.failedReason) : current.failedReason\n\t};\n\tconst parsed = parseErrorReportDraft(next);\n\tif (!parsed) return undefined;\n\n\tsaveDrafts(drafts.map((draft) => (draft.reportId === reportId ? parsed : draft)));\n\treturn parsed;\n}\n\nexport function getErrorReportDrafts() {\n\treturn drafts;\n}\n\nexport function captureErrorReportDraft(args: {\n\tcategory: ErrorReportCategory;\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tquery?: ErrorReportPayload[\"query\"];\n\tmutation?: ErrorReportPayload[\"mutation\"];\n\tqueryClient?: ErrorReportPayload[\"queryClient\"];\n\tpersistedQueries?: ErrorReportPayload[\"persistedQueries\"];\n\treact?: ErrorReportPayload[\"react\"];\n\tcontext?: Record<string, ErrorReportSafeValue>;\n}) {\n\tif (!isErrorReportingEnabled()) return undefined;\n\n\tconst reportId = uuidv4();\n\tconst sessionId = getSessionStorageId(SESSION_STORAGE_KEY);\n\tconst createdUtc = nowUtc();\n\tconst payload = limitErrorReportPayload({\n\t\tpayloadVersion: ERROR_REPORT_PAYLOAD_VERSION,\n\t\tapplication: __APP_ID__,\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tsource: sanitizeDiagnosticText(args.source, 256),\n\t\terror: args.error,\n\t\tenvironment: getErrorReportEnvironment(),\n\t\tclient: getErrorReportClientEnvironment(),\n\t\tlocation: getLocationSnapshot(),\n\t\tviewport: getViewportSnapshot(),\n\t\treact: args.react,\n\t\tquery: args.query,\n\t\tmutation: args.mutation,\n\t\tqueryClient: args.queryClient,\n\t\tpersistedQueries: args.persistedQueries,\n\t\tbreadcrumbs: getErrorReportBreadcrumbs(),\n\t\tcontext: sanitizeDetail(args.context, { scope: \"context\", source: args.source })\n\t} satisfies ErrorReportPayload);\n\tconst draft: ErrorReportDraft = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tstatus: \"pending\",\n\t\tpayload\n\t};\n\tconst parsed = parseErrorReportDraft(draft);\n\tif (!parsed) return undefined;\n\n\tsaveDrafts([...drafts, parsed]);\n\treturn parsed;\n}\n","import { hashString128 } from \"../crypto\";\nimport { stableStringify } from \"../utils\";\n\nimport type { ErrorReportDraft, ErrorReportErrorInfo, ErrorReportSafeValue } from \"./types\";\n\nexport const RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS = 60_000;\n\nconst MAX_RECENT_RUNTIME_ERROR_REPORTS = 100;\nconst recentRuntimeErrorReports = new Map<\n\tstring,\n\t{\n\t\tcapturedAt: number;\n\t\tcapture: Promise<ErrorReportDraft | undefined>;\n\t\texpirationTimer: ReturnType<typeof setTimeout>;\n\t}\n>();\n\ntype RuntimeErrorReportDeduplicationInput = {\n\tcategory: \"runtime\" | \"react\";\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tpathname?: string;\n\tscope?: {\n\t\tcomponentStack?: string;\n\t\tdetail?: Record<string, ErrorReportSafeValue>;\n\t};\n};\n\nfunction normalizeStackTrace(stackTrace: string | undefined) {\n\tif (!stackTrace) return undefined;\n\n\treturn stackTrace\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\nfunction createRuntimeErrorReportFingerprint(input: RuntimeErrorReportDeduplicationInput) {\n\treturn hashString128(\n\t\tstableStringify({\n\t\t\tcategory: input.category,\n\t\t\tsource: input.source,\n\t\t\terror: {\n\t\t\t\t...input.error,\n\t\t\t\tstackTrace: normalizeStackTrace(input.error.stackTrace)\n\t\t\t},\n\t\t\tpathname: input.pathname,\n\t\t\tscope: input.scope\n\t\t})\n\t);\n}\n\n/**\n * Удаляет только ожидаемую запись и освобождает связанный таймер.\n * Проверка Promise защищает новую запись того же fingerprint от завершения\n * или отклонения старого capture после lifecycle-сброса.\n */\nfunction removeRuntimeErrorReport(fingerprint: string, expectedCapture?: Promise<ErrorReportDraft | undefined>) {\n\tconst recentReport = recentRuntimeErrorReports.get(fingerprint);\n\tif (!recentReport || (expectedCapture && recentReport.capture !== expectedCapture)) {\n\t\treturn;\n\t}\n\n\tclearTimeout(recentReport.expirationTimer);\n\trecentRuntimeErrorReports.delete(fingerprint);\n}\n\nfunction removeExpiredRuntimeErrorReports(now: number) {\n\tfor (const [fingerprint, recentReport] of recentRuntimeErrorReports) {\n\t\tif (now - recentReport.capturedAt >= RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS) {\n\t\t\tremoveRuntimeErrorReport(fingerprint, recentReport.capture);\n\t\t}\n\t}\n}\n\nfunction removeOldestRuntimeErrorReport() {\n\tconst oldestFingerprint = recentRuntimeErrorReports.keys().next().value;\n\tif (oldestFingerprint) {\n\t\tremoveRuntimeErrorReport(oldestFingerprint);\n\t}\n}\n\n/**\n * Объединяет одинаковые runtime capture-вызовы вокруг одной Promise.\n * Все потребители получают один draft, поэтому capture-only boundary не может\n * заблокировать последующую app-level доставку того же отчёта.\n */\nexport function coalesceRuntimeErrorReportCapture(\n\tinput: RuntimeErrorReportDeduplicationInput,\n\tcapture: () => Promise<ErrorReportDraft | undefined>\n) {\n\tconst now = Date.now();\n\tconst fingerprint = createRuntimeErrorReportFingerprint(input);\n\tconst recentReport = recentRuntimeErrorReports.get(fingerprint);\n\n\tif (recentReport && now - recentReport.capturedAt < RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS) {\n\t\treturn recentReport.capture;\n\t}\n\n\tremoveExpiredRuntimeErrorReports(now);\n\twhile (recentRuntimeErrorReports.size >= MAX_RECENT_RUNTIME_ERROR_REPORTS) {\n\t\tremoveOldestRuntimeErrorReport();\n\t}\n\n\tconst capturePromise = capture();\n\tconst expirationTimer = setTimeout(() => {\n\t\tremoveRuntimeErrorReport(fingerprint, capturePromise);\n\t}, RUNTIME_ERROR_REPORT_DEDUPLICATION_WINDOW_MS);\n\n\trecentRuntimeErrorReports.set(fingerprint, {\n\t\tcapturedAt: now,\n\t\tcapture: capturePromise,\n\t\texpirationTimer\n\t});\n\n\tvoid capturePromise.catch(() => {\n\t\tremoveRuntimeErrorReport(fingerprint, capturePromise);\n\t});\n\n\treturn capturePromise;\n}\n\n/**\n * Очищает модульное состояние при смене app-level runtime reporter.\n * Функция не входит в публичный package subpath и нужна lifecycle-коду и тестам.\n */\nexport function clearRuntimeErrorReportDeduplication() {\n\tfor (const recentReport of recentRuntimeErrorReports.values()) {\n\t\tclearTimeout(recentReport.expirationTimer);\n\t}\n\trecentRuntimeErrorReports.clear();\n}\n","export type ErrorReportTransportHtmlSummary = {\n\tlength: number;\n\tformCount?: number;\n\tinputNames?: string[];\n};\n\nexport type ErrorReportTransportErrorContext = {\n\tsource: \"fetch.parseResponse\" | \"fetch.buildHttpError\";\n\trequestUrl?: string;\n\tresponseUrl?: string;\n\tmethod?: string;\n\tbaseUrlType?: string;\n\tsapClient?: string | null;\n\tstatus?: number;\n\tstatusText?: string;\n\tcontentType?: string;\n\tredirected?: boolean;\n\tresponseType?: string;\n\thtml?: ErrorReportTransportHtmlSummary;\n};\n\nexport type ErrorReportTransportErrorReporter = (error: Error, context: ErrorReportTransportErrorContext) => void | Promise<void>;\n\nconst DEDUPLICATION_INTERVAL_MS = 60_000;\nconst MAX_RECENT_REPORT_KEYS = 100;\nconst TRANSPORT_REPORT_DELAY_MS = 250;\n\nlet transportErrorReporter: ErrorReportTransportErrorReporter | undefined;\nconst scheduledTransportErrors = new WeakSet<Error>();\nconst suppressedTransportErrors = new WeakSet<Error>();\nconst recentReportKeys = new Map<string, number>();\n\nfunction createReportKey(context: ErrorReportTransportErrorContext) {\n\treturn [context.source, context.method, context.status, context.requestUrl, context.responseUrl].filter(Boolean).join(\"|\");\n}\n\nfunction shouldSkipByRecentKey(context: ErrorReportTransportErrorContext) {\n\tconst now = Date.now();\n\tconst key = createReportKey(context);\n\n\tfor (const [recentKey, timestamp] of recentReportKeys) {\n\t\tif (now - timestamp > DEDUPLICATION_INTERVAL_MS || recentReportKeys.size > MAX_RECENT_REPORT_KEYS) {\n\t\t\trecentReportKeys.delete(recentKey);\n\t\t}\n\t}\n\n\tconst lastReportedAt = recentReportKeys.get(key);\n\tif (lastReportedAt && now - lastReportedAt < DEDUPLICATION_INTERVAL_MS) return true;\n\n\trecentReportKeys.set(key, now);\n\treturn false;\n}\n\n/**\n * Регистрирует приложение как получателя транспортных ошибок.\n * Сам OData transport не знает про QueryClient и UI, поэтому только публикует событие,\n * а app-слой решает, как именно создать и отправить отчет.\n */\nexport function setErrorReportTransportErrorReporter(reporter: ErrorReportTransportErrorReporter | undefined) {\n\ttransportErrorReporter = reporter;\n\trecentReportKeys.clear();\n}\n\nexport function isTransportErrorReportScheduled(error: unknown) {\n\treturn error instanceof Error && scheduledTransportErrors.has(error);\n}\n\nexport function suppressTransportErrorReport(error: unknown) {\n\tif (error instanceof Error) {\n\t\tsuppressedTransportErrors.add(error);\n\t}\n}\n\nexport function reportTransportError(error: Error, context: ErrorReportTransportErrorContext) {\n\tscheduledTransportErrors.add(error);\n\n\t// Даем React Query шанс перехватить эту же ошибку и создать query/mutation-отчет\n\t// с более полезным снимком кеша. Если такого перехвата нет, transport-отчет уйдет сам.\n\tsetTimeout(() => {\n\t\tif (suppressedTransportErrors.has(error)) return;\n\t\tif (!transportErrorReporter) return;\n\t\tif (shouldSkipByRecentKey(context)) return;\n\n\t\ttry {\n\t\t\tconst result = transportErrorReporter(error, context);\n\t\t\tvoid Promise.resolve(result).catch(() => undefined);\n\t\t} catch {\n\t\t\t// Ошибка диагностического hook не должна менять поведение исходного fetch.\n\t\t}\n\t}, TRANSPORT_REPORT_DELAY_MS);\n}\n","import { type Mutation, type Query, type QueryClient } from \"@tanstack/react-query\";\n\nimport { addErrorReportBreadcrumb } from \"./breadcrumbs\";\nimport {\n\tcollectMutationDiagnostics,\n\tcollectPersistedQueryDiagnostics,\n\tcollectQueryClientDiagnostics,\n\tcollectQueryDiagnostics\n} from \"./diagnostics\";\nimport { captureErrorReportDraft } from \"./drafts\";\nimport { createErrorInfo } from \"./errorInfo\";\nimport { coalesceRuntimeErrorReportCapture } from \"./runtimeDeduplication\";\nimport { sanitizeDetail } from \"./safeValue\";\nimport { suppressTransportErrorReport } from \"./transport\";\n\nimport type { ErrorReportMutationContext, ErrorReportQueryContext, ErrorReportRuntimeContext } from \"./types\";\n\nexport async function captureQueryErrorReport(\n\terror: unknown,\n\tquery: Query<unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext?: ErrorReportQueryContext\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context?.source ?? \"query\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"query-error\",\n\t\tdetail: sanitizeDetail(\n\t\t\t{\n\t\t\t\tqueryKey: context?.queryKey ?? query.queryKey,\n\t\t\t\t...context?.detail\n\t\t\t},\n\t\t\t{ scope: \"breadcrumb-detail\", source }\n\t\t)\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"query\",\n\t\tsource,\n\t\terror: context?.errorInfo ?? createErrorInfo(error),\n\t\tquery: collectQueryDiagnostics(query),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context?.detail, { scope: \"context\", source })\n\t});\n}\n\nexport async function captureMutationErrorReport(\n\terror: unknown,\n\tmutation: Mutation<unknown, unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext: ErrorReportMutationContext = {}\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context.source ?? \"mutation\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"mutation-error\",\n\t\tdetail: sanitizeDetail({ mutationKey: mutation.options.mutationKey, ...context.detail }, { scope: \"breadcrumb-detail\", source })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"mutation\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\tmutation: collectMutationDiagnostics(mutation),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context.detail, { scope: \"context\", source })\n\t});\n}\n\nexport function captureRuntimeErrorReport(error: unknown, context: ErrorReportRuntimeContext = {}, queryClient?: QueryClient) {\n\tconst category = context.category ?? \"runtime\";\n\tconst source = context.source ?? context.category ?? \"runtime\";\n\tconst errorInfo = context.errorInfo ?? createErrorInfo(error);\n\tconst detail = sanitizeDetail(context.detail, { scope: \"context\", source });\n\n\tconst captureDraft = async () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"runtime-error\",\n\t\t\tdetail: sanitizeDetail({ category, source, ...context.detail }, { scope: \"breadcrumb-detail\", source })\n\t\t});\n\n\t\tconst [persistedQueries, queryClientDiagnostics] = queryClient\n\t\t\t? await Promise.all([collectPersistedQueryDiagnostics(), Promise.resolve(collectQueryClientDiagnostics(queryClient))])\n\t\t\t: [undefined, undefined];\n\n\t\treturn captureErrorReportDraft({\n\t\t\tcategory,\n\t\t\tsource,\n\t\t\terror: errorInfo,\n\t\t\treact: context.componentStack ? { componentStack: context.componentStack } : undefined,\n\t\t\tqueryClient: queryClientDiagnostics,\n\t\t\tpersistedQueries,\n\t\t\tcontext: detail\n\t\t});\n\t};\n\n\t/**\n\t * Error report draft создаётся только в браузере. Прямой вызов capture\n\t * сохраняет прежнее SSR-поведение без клиентского TTL-таймера, который\n\t * иначе удерживал бы Node-процесс после no-op результата.\n\t */\n\tif (typeof window === \"undefined\") {\n\t\treturn captureDraft();\n\t}\n\n\treturn coalesceRuntimeErrorReportCapture(\n\t\t{\n\t\t\tcategory,\n\t\t\tsource,\n\t\t\terror: errorInfo,\n\t\t\tpathname: window.location.pathname,\n\t\t\tscope: {\n\t\t\t\tcomponentStack: context.componentStack,\n\t\t\t\tdetail\n\t\t\t}\n\t\t},\n\t\tcaptureDraft\n\t);\n}\n","import { type ErrorReportPayload } from \"./types\";\n\nexport const ERROR_REPORT_QUEUE_VERSION = 1 as const;\nexport const ERROR_REPORT_QUEUE_MAX_ITEMS = 50;\nexport const ERROR_REPORT_QUEUE_TTL_MS = 7 * 24 * 60 * 60 * 1_000;\nexport const ERROR_REPORT_QUEUE_LEASE_MS = 30 * 1_000;\n\nexport type ErrorReportQueueFailureKind = \"http\" | \"network\" | \"timeout\" | \"unknown\";\n\nexport type ErrorReportQueueRecord = {\n\treadonly queueVersion: typeof ERROR_REPORT_QUEUE_VERSION;\n\treadonly reportId: string;\n\treadonly enqueuedUtc: string;\n\treadonly expiresUtc: string;\n\treadonly nextAttemptUtc: string;\n\treadonly attemptCount: number;\n\treadonly payload: ErrorReportPayload;\n\treadonly lease?: {\n\t\treadonly ownerId: string;\n\t\treadonly expiresUtc: string;\n\t};\n\treadonly lastFailure?: {\n\t\treadonly utc: string;\n\t\treadonly kind: ErrorReportQueueFailureKind;\n\t\treadonly httpStatus?: number;\n\t};\n};\n\nexport type ErrorReportQueueEnqueueResult =\n\t| { readonly status: \"enqueued\"; readonly evictedReportId?: string }\n\t| { readonly status: \"duplicate\" }\n\t| { readonly status: \"invalid-payload\" }\n\t| { readonly status: \"capacity-exceeded\" };\n\nexport type ErrorReportQueueLeaseOptions = {\n\treadonly ownerId: string;\n\treadonly now?: Date;\n\treadonly leaseDurationMs?: number;\n};\n\nexport type ErrorReportQueueTransitionResult = \"updated\" | \"missing\" | \"lease-mismatch\";\n\nexport type ErrorReportQueueRetry = {\n\treadonly nextAttemptUtc: string;\n\treadonly failure: {\n\t\treadonly utc: string;\n\t\treadonly kind: ErrorReportQueueFailureKind;\n\t\treadonly httpStatus?: number;\n\t};\n};\n\n/**\n * Durable queue contract отделяет delivery policy от конкретной IndexedDB\n * реализации. Все переходы, зависящие от lease owner, выполняются атомарно.\n */\nexport type ErrorReportQueue = {\n\treadonly enqueue: (payload: ErrorReportPayload, now?: Date) => Promise<ErrorReportQueueEnqueueResult>;\n\treadonly leaseNext: (options: ErrorReportQueueLeaseOptions) => Promise<ErrorReportQueueRecord | undefined>;\n\treadonly acknowledge: (reportId: string, ownerId: string) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly reschedule: (reportId: string, ownerId: string, retry: ErrorReportQueueRetry) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly discard: (reportId: string, ownerId: string) => Promise<ErrorReportQueueTransitionResult>;\n\treadonly getRecords: (now?: Date) => Promise<readonly ErrorReportQueueRecord[]>;\n\treadonly getNextWakeUtc: (now?: Date) => Promise<string | undefined>;\n};\n","import {\n\tERROR_REPORT_QUEUE_MAX_ITEMS,\n\tERROR_REPORT_QUEUE_VERSION,\n\ttype ErrorReportQueueFailureKind,\n\ttype ErrorReportQueueRecord\n} from \"./queueContract\";\nimport { parseErrorReportPayload } from \"./schema\";\n\nconst FAILURE_KINDS = new Set<ErrorReportQueueFailureKind>([\"http\", \"network\", \"timeout\", \"unknown\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isUtc(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.length <= 64 && Number.isFinite(Date.parse(value));\n}\n\nfunction isSafeCount(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseFailure(value: unknown): ErrorReportQueueRecord[\"lastFailure\"] {\n\tif (value === undefined) return undefined;\n\tif (!isRecord(value) || !isUtc(value.utc) || typeof value.kind !== \"string\") return undefined;\n\tif (!FAILURE_KINDS.has(value.kind as ErrorReportQueueFailureKind)) return undefined;\n\tif (\n\t\tvalue.httpStatus !== undefined &&\n\t\t(typeof value.httpStatus !== \"number\" || !Number.isInteger(value.httpStatus) || value.httpStatus < 100 || value.httpStatus > 599)\n\t) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tutc: value.utc,\n\t\tkind: value.kind as ErrorReportQueueFailureKind,\n\t\thttpStatus: value.httpStatus as number | undefined\n\t};\n}\n\nfunction parseLease(value: unknown): ErrorReportQueueRecord[\"lease\"] {\n\tif (value === undefined) return undefined;\n\tif (!isRecord(value) || typeof value.ownerId !== \"string\" || value.ownerId.length === 0 || value.ownerId.length > 128) {\n\t\treturn undefined;\n\t}\n\tif (!isUtc(value.expiresUtc)) return undefined;\n\n\treturn { ownerId: value.ownerId, expiresUtc: value.expiresUtc };\n}\n\n/**\n * Queue parser не угадывает прежние storage-формы. Повреждённая или будущая\n * запись отбрасывается отдельно, не уничтожая соседние валидные отчёты.\n */\nexport function parseErrorReportQueueRecord(value: unknown): ErrorReportQueueRecord | undefined {\n\tif (!isRecord(value) || value.queueVersion !== ERROR_REPORT_QUEUE_VERSION) return undefined;\n\tif (typeof value.reportId !== \"string\" || !isUtc(value.enqueuedUtc) || !isUtc(value.expiresUtc)) return undefined;\n\tif (!isUtc(value.nextAttemptUtc) || !isSafeCount(value.attemptCount)) return undefined;\n\n\tconst payload = parseErrorReportPayload(value.payload);\n\tif (!payload || payload.reportId !== value.reportId) return undefined;\n\n\tconst lease = parseLease(value.lease);\n\tif (value.lease !== undefined && !lease) return undefined;\n\tconst lastFailure = parseFailure(value.lastFailure);\n\tif (value.lastFailure !== undefined && !lastFailure) return undefined;\n\n\treturn {\n\t\tqueueVersion: ERROR_REPORT_QUEUE_VERSION,\n\t\treportId: value.reportId,\n\t\tenqueuedUtc: value.enqueuedUtc,\n\t\texpiresUtc: value.expiresUtc,\n\t\tnextAttemptUtc: value.nextAttemptUtc,\n\t\tattemptCount: value.attemptCount,\n\t\tpayload,\n\t\tlease,\n\t\tlastFailure\n\t};\n}\n\n/** Возвращает bounded текущую очередь без истёкших и повторяющихся ID. */\nexport function normalizeErrorReportQueueRecords(value: unknown, nowMs: number): ErrorReportQueueRecord[] {\n\tif (!Array.isArray(value)) return [];\n\n\tconst reportIds = new Set<string>();\n\tconst records: ErrorReportQueueRecord[] = [];\n\tfor (const valueRecord of value) {\n\t\tconst record = parseErrorReportQueueRecord(valueRecord);\n\t\tif (!record || Date.parse(record.expiresUtc) <= nowMs || reportIds.has(record.reportId)) continue;\n\n\t\treportIds.add(record.reportId);\n\t\trecords.push(record);\n\t\tif (records.length === ERROR_REPORT_QUEUE_MAX_ITEMS) break;\n\t}\n\n\treturn records;\n}\n","import { createIndexedDbQueryStorage, type IndexedDbQueryStorage } from \"../query-client\";\n\nimport {\n\tERROR_REPORT_QUEUE_LEASE_MS,\n\tERROR_REPORT_QUEUE_MAX_ITEMS,\n\tERROR_REPORT_QUEUE_TTL_MS,\n\tERROR_REPORT_QUEUE_VERSION,\n\ttype ErrorReportQueue,\n\ttype ErrorReportQueueEnqueueResult,\n\ttype ErrorReportQueueRecord,\n\ttype ErrorReportQueueTransitionResult\n} from \"./queueContract\";\nimport { normalizeErrorReportQueueRecords } from \"./queueRecord\";\nimport { parseErrorReportPayload } from \"./schema\";\nimport { type ErrorReportPayload } from \"./types\";\n\nconst QUEUE_STORAGE_KEY = \"queue.v1\";\nconst QUEUE_STORE_NAME = \"records\";\n\nexport type CreateErrorReportQueueOptions = {\n\treadonly dbName?: string;\n\treadonly indexedDB?: IDBFactory;\n\t/** Тестовая/альтернативная storage boundary; browser-приложения обычно её не задают. */\n\treadonly storage?: Pick<IndexedDbQueryStorage<unknown>, \"getItem\" | \"updateItem\">;\n};\n\nfunction toUtc(value: number) {\n\treturn new Date(value).toISOString();\n}\n\nfunction normalizeOwnerId(value: string) {\n\tconst ownerId = value.trim();\n\tif (ownerId.length === 0 || ownerId.length > 128) {\n\t\tthrow new Error(\"Error report lease owner должен содержать от 1 до 128 символов\");\n\t}\n\treturn ownerId;\n}\n\nfunction compareQueueOrder(left: ErrorReportQueueRecord, right: ErrorReportQueueRecord) {\n\treturn (\n\t\tDate.parse(left.nextAttemptUtc) - Date.parse(right.nextAttemptUtc) || Date.parse(left.enqueuedUtc) - Date.parse(right.enqueuedUtc)\n\t);\n}\n\nfunction resolveTransition(\n\trecords: ErrorReportQueueRecord[],\n\treportId: string,\n\townerId: string\n): { readonly index: number; readonly result: ErrorReportQueueTransitionResult } {\n\tconst index = records.findIndex((record) => record.reportId === reportId);\n\tif (index < 0) return { index, result: \"missing\" };\n\tif (records[index]?.lease?.ownerId !== ownerId) return { index, result: \"lease-mismatch\" };\n\treturn { index, result: \"updated\" };\n}\n\n/**\n * Создаёт IndexedDB-backed очередь. Одна запись-envelope намеренно хранит не\n * более 50 payload: существующий atomic update primitive тогда сериализует\n * выбор lease между вкладками без дополнительного локального storage слоя.\n */\nexport function createErrorReportQueue(options: CreateErrorReportQueueOptions = {}): ErrorReportQueue | undefined {\n\tconst storage =\n\t\toptions.storage ??\n\t\tcreateIndexedDbQueryStorage<unknown>({\n\t\t\tdbName: options.dbName ?? `${__APP_ID__}.error-report.queue.v1`,\n\t\t\tstoreName: QUEUE_STORE_NAME,\n\t\t\tindexedDB: options.indexedDB\n\t\t});\n\tif (!storage) return undefined;\n\tconst queueStorage = storage;\n\n\tfunction update<TResult>(\n\t\tnowMs: number,\n\t\toperation: (records: ErrorReportQueueRecord[]) => { readonly records: ErrorReportQueueRecord[]; readonly result: TResult }\n\t) {\n\t\treturn queueStorage.updateItem(QUEUE_STORAGE_KEY, (storedValue) => {\n\t\t\tconst decision = operation(normalizeErrorReportQueueRecords(storedValue, nowMs));\n\t\t\treturn { action: \"set\" as const, value: decision.records, result: decision.result };\n\t\t});\n\t}\n\n\treturn {\n\t\tenqueue: async (payload: ErrorReportPayload, now = new Date()) => {\n\t\t\tconst parsedPayload = parseErrorReportPayload(payload);\n\t\t\tif (!parsedPayload) return { status: \"invalid-payload\" as const };\n\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return { status: \"invalid-payload\" as const };\n\n\t\t\treturn update<ErrorReportQueueEnqueueResult>(nowMs, (records) => {\n\t\t\t\tif (records.some((record) => record.reportId === parsedPayload.reportId)) {\n\t\t\t\t\treturn { records, result: { status: \"duplicate\" as const } };\n\t\t\t\t}\n\n\t\t\t\tlet evictedReportId: string | undefined;\n\t\t\t\tif (records.length >= ERROR_REPORT_QUEUE_MAX_ITEMS) {\n\t\t\t\t\tconst evictedIndex = records\n\t\t\t\t\t\t.map((record, index) => ({ record, index }))\n\t\t\t\t\t\t.filter(({ record }) => record.lease === undefined)\n\t\t\t\t\t\t.sort((left, right) => Date.parse(left.record.enqueuedUtc) - Date.parse(right.record.enqueuedUtc))[0]?.index;\n\n\t\t\t\t\tif (evictedIndex === undefined) {\n\t\t\t\t\t\treturn { records, result: { status: \"capacity-exceeded\" as const } };\n\t\t\t\t\t}\n\n\t\t\t\t\tevictedReportId = records[evictedIndex]?.reportId;\n\t\t\t\t\trecords.splice(evictedIndex, 1);\n\t\t\t\t}\n\n\t\t\t\tconst nowUtc = toUtc(nowMs);\n\t\t\t\trecords.push({\n\t\t\t\t\tqueueVersion: ERROR_REPORT_QUEUE_VERSION,\n\t\t\t\t\treportId: parsedPayload.reportId,\n\t\t\t\t\tenqueuedUtc: nowUtc,\n\t\t\t\t\texpiresUtc: toUtc(nowMs + ERROR_REPORT_QUEUE_TTL_MS),\n\t\t\t\t\tnextAttemptUtc: nowUtc,\n\t\t\t\t\tattemptCount: 0,\n\t\t\t\t\tpayload: parsedPayload\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\trecords,\n\t\t\t\t\tresult: evictedReportId ? { status: \"enqueued\" as const, evictedReportId } : { status: \"enqueued\" as const }\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tleaseNext: async ({ ownerId: inputOwnerId, now = new Date(), leaseDurationMs = ERROR_REPORT_QUEUE_LEASE_MS }) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs) || !Number.isFinite(leaseDurationMs) || leaseDurationMs <= 0) {\n\t\t\t\tthrow new Error(\"Error report lease требует валидное время и положительную длительность\");\n\t\t\t}\n\n\t\t\treturn update(nowMs, (records) => {\n\t\t\t\tconst record = records\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\t\tDate.parse(candidate.nextAttemptUtc) <= nowMs &&\n\t\t\t\t\t\t\t(candidate.lease === undefined || Date.parse(candidate.lease.expiresUtc) <= nowMs)\n\t\t\t\t\t)\n\t\t\t\t\t.sort(compareQueueOrder)[0];\n\t\t\t\tif (!record) return { records, result: undefined };\n\n\t\t\t\tconst leasedRecord: ErrorReportQueueRecord = {\n\t\t\t\t\t...record,\n\t\t\t\t\tattemptCount: record.attemptCount + 1,\n\t\t\t\t\tlease: { ownerId, expiresUtc: toUtc(nowMs + leaseDurationMs) }\n\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\trecords: records.map((candidate) => (candidate.reportId === record.reportId ? leasedRecord : candidate)),\n\t\t\t\t\tresult: leasedRecord\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tacknowledge: async (reportId, inputOwnerId) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\treturn update(Date.now(), (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\trecords.splice(transition.index, 1);\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\treschedule: async (reportId, inputOwnerId, retry) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\tconst nextAttemptMs = Date.parse(retry.nextAttemptUtc);\n\t\t\tconst failureUtcMs = Date.parse(retry.failure.utc);\n\t\t\tif (!Number.isFinite(nextAttemptMs) || !Number.isFinite(failureUtcMs)) {\n\t\t\t\tthrow new Error(\"Error report retry требует валидные UTC timestamps\");\n\t\t\t}\n\n\t\t\treturn update(failureUtcMs, (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\tconst record = records[transition.index];\n\t\t\t\tif (!record) return { records, result: \"missing\" as const };\n\t\t\t\trecords[transition.index] = {\n\t\t\t\t\t...record,\n\t\t\t\t\tnextAttemptUtc: retry.nextAttemptUtc,\n\t\t\t\t\tlease: undefined,\n\t\t\t\t\tlastFailure: retry.failure\n\t\t\t\t};\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\tdiscard: async (reportId, inputOwnerId) => {\n\t\t\tconst ownerId = normalizeOwnerId(inputOwnerId);\n\t\t\treturn update(Date.now(), (records) => {\n\t\t\t\tconst transition = resolveTransition(records, reportId, ownerId);\n\t\t\t\tif (transition.result !== \"updated\") return { records, result: transition.result };\n\t\t\t\trecords.splice(transition.index, 1);\n\t\t\t\treturn { records, result: \"updated\" as const };\n\t\t\t});\n\t\t},\n\t\tgetRecords: async (now = new Date()) => {\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return [];\n\t\t\tconst storedValue = await queueStorage.getItem(QUEUE_STORAGE_KEY);\n\t\t\treturn normalizeErrorReportQueueRecords(storedValue, nowMs).sort(compareQueueOrder);\n\t\t},\n\t\tgetNextWakeUtc: async (now = new Date()) => {\n\t\t\tconst nowMs = now.getTime();\n\t\t\tif (!Number.isFinite(nowMs)) return undefined;\n\t\t\tconst records = normalizeErrorReportQueueRecords(await queueStorage.getItem(QUEUE_STORAGE_KEY), nowMs);\n\t\t\tconst nextWakeMs = records.reduce<number | undefined>((current, record) => {\n\t\t\t\tconst recordWakeMs = Math.max(Date.parse(record.nextAttemptUtc), record.lease ? Date.parse(record.lease.expiresUtc) : 0);\n\t\t\t\treturn current === undefined || recordWakeMs < current ? recordWakeMs : current;\n\t\t\t}, undefined);\n\t\t\treturn nextWakeMs === undefined ? undefined : toUtc(nextWakeMs);\n\t\t}\n\t};\n}\n","import { clearRuntimeErrorReportDeduplication } from \"./runtimeDeduplication\";\n\nimport type { ErrorReportRuntimeContext } from \"./types\";\n\nexport type ErrorReportRuntimeErrorReporter = (error: unknown, context: ErrorReportRuntimeContext) => void | Promise<void>;\n\nlet runtimeErrorReporter: ErrorReportRuntimeErrorReporter | undefined;\n\n/**\n * Регистрирует app-слой как получателя ручных runtime-ошибок.\n * Shared-код может вызвать reportRuntimeError без знания о QueryClient, UI и режиме доставки.\n */\nexport function setErrorReportRuntimeErrorReporter(reporter: ErrorReportRuntimeErrorReporter | undefined) {\n\truntimeErrorReporter = reporter;\n\tclearRuntimeErrorReportDeduplication();\n}\n\n/**\n * Ручная отправка runtime-ошибки из try/catch или другого кода вне React-компонента.\n * Функция не бросает исключений: диагностический отчет не должен ломать основной сценарий.\n *\n * @example\n *\n * try {\n * // ...\n * } catch (error) {\n * reportRuntimeError(error, {\n * detail: {\n * source: \"s3-download\",\n * action: \"download-from-s3\"\n * }\n * });\n * }\n */\nexport async function reportRuntimeError(error: unknown, context: ErrorReportRuntimeContext = {}) {\n\tif (!runtimeErrorReporter) return;\n\n\ttry {\n\t\tawait runtimeErrorReporter(error, context);\n\t} catch {\n\t\t// Ошибка диагностического hook не должна менять поведение пользовательского кода.\n\t}\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -299,9 +299,9 @@ uninstallBreadcrumbs();
|
|
|
299
299
|
- click в capture phase;
|
|
300
300
|
- `document.visibilitychange`.
|
|
301
301
|
|
|
302
|
-
Для click сохраняются координаты/модификаторы и ограниченное техническое описание meaningful target: tag, role, input type и цепочка родителей. Приложение может явно добавить slug-like `data-error-report-target`, например `student-save`. Глубина DOM-цепочки ограничена 20, атрибут — 120 символами.
|
|
302
|
+
Для click сохраняются координаты/модификаторы и ограниченное техническое описание meaningful target: tag, role, input type и цепочка родителей. Приложение может явно добавить slug-like `data-error-report-target`, например `student-save`. Если этот атрибут отсутствует или не проходит проверку, breadcrumbs используют уже распространённые в host-проектах `data-ui` и `data-action` как fallback. Глубина DOM-цепочки ограничена 20, каждый атрибут — 120 символами.
|
|
303
303
|
|
|
304
|
-
Код не читает `input.value`, DOM text, `id`, `title`, `aria-*`, CSS classes
|
|
304
|
+
Код не читает `input.value`, DOM text, `id`, `title`, `aria-*`, CSS classes и произвольные `data-*`. Значения `data-error-report-target`, fallback `data-ui` и `data-action` принимаются только из латинских букв, цифр и символов `._:/-`; свободный текст в них помещать нельзя.
|
|
305
305
|
|
|
306
306
|
На сервере установщик возвращает пустую cleanup-функцию.
|
|
307
307
|
|