@backtrack-js/browser 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +291 -0
- package/bin/cli.cjs +51 -0
- package/bin/cli.js +2 -0
- package/bin/symbolize.cjs +654 -0
- package/bin/viewer.cjs +143 -0
- package/dist/capturers/console.d.ts +18 -0
- package/dist/capturers/console.d.ts.map +1 -0
- package/dist/capturers/errors.d.ts +22 -0
- package/dist/capturers/errors.d.ts.map +1 -0
- package/dist/capturers/index.d.ts +8 -0
- package/dist/capturers/index.d.ts.map +1 -0
- package/dist/capturers/navigation.d.ts +20 -0
- package/dist/capturers/navigation.d.ts.map +1 -0
- package/dist/capturers/network.d.ts +30 -0
- package/dist/capturers/network.d.ts.map +1 -0
- package/dist/capturers/performance.d.ts +15 -0
- package/dist/capturers/performance.d.ts.map +1 -0
- package/dist/capturers/route-matcher.d.ts +10 -0
- package/dist/capturers/route-matcher.d.ts.map +1 -0
- package/dist/capturers/rrweb.d.ts +18 -0
- package/dist/capturers/rrweb.d.ts.map +1 -0
- package/dist/capturers/sanitizer.d.ts +37 -0
- package/dist/capturers/sanitizer.d.ts.map +1 -0
- package/dist/core/flight-recorder.d.ts +75 -0
- package/dist/core/flight-recorder.d.ts.map +1 -0
- package/dist/core/state-machine.d.ts +55 -0
- package/dist/core/state-machine.d.ts.map +1 -0
- package/dist/index.cjs +1803 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5763 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/batch-writer.d.ts +57 -0
- package/dist/storage/batch-writer.d.ts.map +1 -0
- package/dist/storage/db.d.ts +39 -0
- package/dist/storage/db.d.ts.map +1 -0
- package/dist/storage/incident-manager.d.ts +107 -0
- package/dist/storage/incident-manager.d.ts.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/retention.d.ts +41 -0
- package/dist/storage/retention.d.ts.map +1 -0
- package/dist/storage/session.d.ts +32 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/types/artifact.d.ts +72 -0
- package/dist/types/artifact.d.ts.map +1 -0
- package/dist/types/chunk.d.ts +32 -0
- package/dist/types/chunk.d.ts.map +1 -0
- package/dist/types/health.d.ts +16 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/incident.d.ts +35 -0
- package/dist/types/incident.d.ts.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/options.d.ts +84 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/timeline.d.ts +74 -0
- package/dist/types/timeline.d.ts.map +1 -0
- package/dist/types/transport.d.ts +6 -0
- package/dist/types/transport.d.ts.map +1 -0
- package/dist/utils/compression.d.ts +28 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/gist-uploader.d.ts +12 -0
- package/dist/utils/gist-uploader.d.ts.map +1 -0
- package/dist/utils/markdown.d.ts +12 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/validation/validate.d.ts +27 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/viewer/assets/backtrack-favico-Ds-TMW85.png +0 -0
- package/dist/viewer/assets/index-D6J82Kcf.js +191 -0
- package/dist/viewer/assets/index-cVrM07fr.css +1 -0
- package/dist/viewer/index.html +19 -0
- package/dist/widget/annotator.d.ts +85 -0
- package/dist/widget/annotator.d.ts.map +1 -0
- package/dist/widget/styles.d.ts +2 -0
- package/dist/widget/styles.d.ts.map +1 -0
- package/dist/widget/widget.d.ts +78 -0
- package/dist/widget/widget.d.ts.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { FlightRecorderDB } from './db';
|
|
2
|
+
import type { StoredChunk, RrwebEvent } from '../types/chunk';
|
|
3
|
+
import type { TimelineEvent } from '../types/timeline';
|
|
4
|
+
export interface FlushMetrics {
|
|
5
|
+
flushIndex: number;
|
|
6
|
+
durationMs: number;
|
|
7
|
+
serializationMs: number;
|
|
8
|
+
compressionMs: number;
|
|
9
|
+
writeMs: number;
|
|
10
|
+
chunkSizeBytes: number;
|
|
11
|
+
replayEventsInBatch: number;
|
|
12
|
+
timelineEventsInBatch: number;
|
|
13
|
+
totalReplayInChunk: number;
|
|
14
|
+
totalTimelineInChunk: number;
|
|
15
|
+
totalEventsInChunk: number;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
export interface BatchWriterConfig {
|
|
19
|
+
flushIntervalMs: number;
|
|
20
|
+
maxBatchEvents: number;
|
|
21
|
+
chunkDurationMs: number;
|
|
22
|
+
initialChunkSequence?: number;
|
|
23
|
+
onFlushMetrics?: (metrics: FlushMetrics) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare class BatchWriter {
|
|
26
|
+
private db;
|
|
27
|
+
private config;
|
|
28
|
+
private sessionId;
|
|
29
|
+
private tabId;
|
|
30
|
+
private chunkSequence;
|
|
31
|
+
private pendingTimelineEvents;
|
|
32
|
+
private pendingReplayEvents;
|
|
33
|
+
private timer;
|
|
34
|
+
private writeChain;
|
|
35
|
+
private pendingWritesCount;
|
|
36
|
+
private onErrorCallback?;
|
|
37
|
+
private onChunkPersistedCallback?;
|
|
38
|
+
private pageHideHandler?;
|
|
39
|
+
private visibilityChangeHandler?;
|
|
40
|
+
private flushCount;
|
|
41
|
+
private onFlushMetricsCallback?;
|
|
42
|
+
constructor(db: FlightRecorderDB, sessionId: string, tabId: string, config?: Partial<BatchWriterConfig>, onError?: (error: unknown) => void);
|
|
43
|
+
getChunkSequence(): number;
|
|
44
|
+
setOnFlushMetrics(callback: (metrics: FlushMetrics) => void): void;
|
|
45
|
+
setOnChunkPersisted(callback: (chunk: StoredChunk) => void): void;
|
|
46
|
+
getPendingWrites(): number;
|
|
47
|
+
addTimelineEvent(event: TimelineEvent): void;
|
|
48
|
+
addReplayEvent(event: RrwebEvent): void;
|
|
49
|
+
private checkThresholds;
|
|
50
|
+
/**
|
|
51
|
+
* Força a gravação de todos os eventos pendentes no IndexedDB.
|
|
52
|
+
*/
|
|
53
|
+
flush(): Promise<void>;
|
|
54
|
+
private initLifecycleListeners;
|
|
55
|
+
destroy(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=batch-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-writer.d.ts","sourceRoot":"","sources":["../../src/storage/batch-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAClD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAoB;IAE/C,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,eAAe,CAAC,CAA2B;IACnD,OAAO,CAAC,wBAAwB,CAAC,CAA+B;IAChE,OAAO,CAAC,eAAe,CAAC,CAAa;IACrC,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAC7C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,sBAAsB,CAAC,CAAkC;gBAG/D,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI;IAmB7B,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAIlE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIjE,gBAAgB,IAAI,MAAM;IAI1B,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAK5C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAK9C,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6H7B,OAAO,CAAC,sBAAsB;IAkBvB,OAAO,IAAI,IAAI;CAsBvB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { StoredChunk } from '../types/chunk';
|
|
2
|
+
import type { StoredIncident, IncidentSummary } from '../types/incident';
|
|
3
|
+
export interface StoredSession {
|
|
4
|
+
id: string;
|
|
5
|
+
tabId: string;
|
|
6
|
+
startedAt: number;
|
|
7
|
+
lastActiveAt: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const DB_NAME = "backtrack_db";
|
|
10
|
+
export declare const DB_VERSION = 1;
|
|
11
|
+
export declare const STORE_SESSIONS = "sessions";
|
|
12
|
+
export declare const STORE_CHUNKS = "chunks";
|
|
13
|
+
export declare const STORE_INCIDENTS = "incidents";
|
|
14
|
+
export declare class FlightRecorderDB {
|
|
15
|
+
private db;
|
|
16
|
+
private idbFactory;
|
|
17
|
+
private dbName;
|
|
18
|
+
constructor(customFactory?: IDBFactory, customDbName?: string);
|
|
19
|
+
open(): Promise<IDBDatabase>;
|
|
20
|
+
close(): void;
|
|
21
|
+
putSession(session: StoredSession): Promise<void>;
|
|
22
|
+
getSession(id: string): Promise<StoredSession | null>;
|
|
23
|
+
putChunk(chunk: StoredChunk): Promise<void>;
|
|
24
|
+
putChunks(chunks: StoredChunk[]): Promise<void>;
|
|
25
|
+
getChunk(id: string): Promise<StoredChunk | null>;
|
|
26
|
+
getChunksByIds(ids: string[]): Promise<StoredChunk[]>;
|
|
27
|
+
getChunksBySession(sessionId: string): Promise<StoredChunk[]>;
|
|
28
|
+
getAllChunks(): Promise<StoredChunk[]>;
|
|
29
|
+
deleteChunks(ids: string[]): Promise<void>;
|
|
30
|
+
putIncident(incident: StoredIncident): Promise<void>;
|
|
31
|
+
getIncident(id: string): Promise<StoredIncident | null>;
|
|
32
|
+
getPendingIncidentForSession(sessionId: string): Promise<StoredIncident | null>;
|
|
33
|
+
listIncidents(): Promise<IncidentSummary[]>;
|
|
34
|
+
deleteIncident(id: string): Promise<void>;
|
|
35
|
+
getAllIncidents(): Promise<StoredIncident[]>;
|
|
36
|
+
estimateStorageBytes(): Promise<number>;
|
|
37
|
+
clearAll(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAS;gBAEX,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM;IAOhD,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAmDlC,KAAK,IAAI,IAAI;IASP,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAYrD,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAUjD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqBrD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAe7D,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAUtC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1C,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUvD,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAe/E,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAuB3C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAY5C,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWvC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { FlightRecorderDB } from './db';
|
|
2
|
+
import type { StoredIncident, IncidentReason, IncidentTrigger, IncidentSummary } from '../types/incident';
|
|
3
|
+
import type { RrwebEvent } from '../types/chunk';
|
|
4
|
+
import type { FlightRecorderArtifact, EnvironmentMetadata, ReplayWindowMetadata } from '../types/artifact';
|
|
5
|
+
import type { ObservabilityContext } from '../types/options';
|
|
6
|
+
export interface IncidentManagerConfig {
|
|
7
|
+
afterErrorSeconds: number;
|
|
8
|
+
recorderVersion: string;
|
|
9
|
+
getRecordingIssues?: () => string[];
|
|
10
|
+
getDroppedEventsCount?: () => number;
|
|
11
|
+
context?: ObservabilityContext;
|
|
12
|
+
getContext?: () => ObservabilityContext | Promise<ObservabilityContext>;
|
|
13
|
+
}
|
|
14
|
+
export declare function generateIncidentId(prefix: 'inc' | 'inc_manual', sessionId: string, timestamp: number): string;
|
|
15
|
+
export interface SlicedReplayResult {
|
|
16
|
+
events: RrwebEvent[];
|
|
17
|
+
replayWindow: ReplayWindowMetadata;
|
|
18
|
+
degradedReasons: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Fatia e ajusta os eventos de replay para que caibam estritamente na janela [startedAt, finalizedAt],
|
|
22
|
+
* garantindo que o FullSnapshot inicial (type: 2) mais recente seja reposicionado no início
|
|
23
|
+
* da janela (com seu Meta type: 4 correspondente).
|
|
24
|
+
*
|
|
25
|
+
* Também gera metadados explícitos da janela de replay (replayWindow) para diferenciar eventos
|
|
26
|
+
* preparatórios de eventos reais da janela solicitada.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sliceReplayEventsWithMetadata(events: RrwebEvent[], startedAt: number, finalizedAt: number): SlicedReplayResult;
|
|
29
|
+
export declare function sliceReplayEventsForWindow(events: RrwebEvent[], startedAt: number, finalizedAt: number): RrwebEvent[];
|
|
30
|
+
export declare class IncidentManager {
|
|
31
|
+
private db;
|
|
32
|
+
private sessionId;
|
|
33
|
+
private tabId;
|
|
34
|
+
private environmentProvider;
|
|
35
|
+
private fallbackEnvironment;
|
|
36
|
+
private config;
|
|
37
|
+
private pendingIncident;
|
|
38
|
+
private hasExtendedOnce;
|
|
39
|
+
private finalizeTimer;
|
|
40
|
+
private onIncidentPendingCallback?;
|
|
41
|
+
private onIncidentFinalizedCallback?;
|
|
42
|
+
private beforeFinalizeCallback?;
|
|
43
|
+
private onErrorCallback?;
|
|
44
|
+
private activeOperation;
|
|
45
|
+
private recoveredBaseIncidentId?;
|
|
46
|
+
private baseRecoveredDroppedEvents;
|
|
47
|
+
constructor(db: FlightRecorderDB, sessionId: string, tabId: string, environment: EnvironmentMetadata | (() => EnvironmentMetadata), config?: Partial<IncidentManagerConfig>);
|
|
48
|
+
private getEnvironment;
|
|
49
|
+
private resolveFallbackEnvironment;
|
|
50
|
+
private isDestroyed;
|
|
51
|
+
private serializeOperation;
|
|
52
|
+
runExclusive<T>(op: () => Promise<T>): Promise<T>;
|
|
53
|
+
private computeCurrentDroppedEvents;
|
|
54
|
+
/**
|
|
55
|
+
* Sincroniza a contagem atual de eventos descartados no incidente pendente (se houver)
|
|
56
|
+
* antes de parar, descarregar a página ou executar retenção.
|
|
57
|
+
*/
|
|
58
|
+
syncPendingIncidentDroppedEvents(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Associa todos os chunks persistidos da sessão atual ao incidente pendente (se houver),
|
|
61
|
+
* garantindo que eles estejam protegidos no IndexedDB antes da execução de qualquer prune.
|
|
62
|
+
*/
|
|
63
|
+
protectSessionChunks(): Promise<void>;
|
|
64
|
+
setOnError(callback: (error: unknown) => void): void;
|
|
65
|
+
setOnIncidentPending(callback: (incident: StoredIncident) => void): void;
|
|
66
|
+
setOnIncidentFinalized(callback: (incident: StoredIncident) => void): void;
|
|
67
|
+
setBeforeFinalize(callback: () => Promise<void>): void;
|
|
68
|
+
getPendingIncident(): StoredIncident | null;
|
|
69
|
+
/**
|
|
70
|
+
* Inicialização e recuperação pós-reload:
|
|
71
|
+
* Verifica se há incidente pendente para esta sessão no IndexedDB.
|
|
72
|
+
*/
|
|
73
|
+
init(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Registra um gatilho de incidente (automático ou manual).
|
|
76
|
+
* As chamadas são serializadas para evitar race conditions entre múltiplos erros concorrentes.
|
|
77
|
+
*/
|
|
78
|
+
trigger(reason: IncidentReason, triggerData: IncidentTrigger, windowSeconds?: number): Promise<string>;
|
|
79
|
+
private executeTrigger;
|
|
80
|
+
/**
|
|
81
|
+
* Obtém os timestamps reais de todos os FullSnapshots (rrweb type: 2) de um chunk.
|
|
82
|
+
* Não fabrica timestamps usando chunk.startedAt quando apenas a flag hasFullSnapshot está presente.
|
|
83
|
+
*/
|
|
84
|
+
private getChunkSnapshotTimestamps;
|
|
85
|
+
private createAndFinalizeManualIncident;
|
|
86
|
+
executeManualTrigger(triggerData: IncidentTrigger, windowSeconds?: number): Promise<string>;
|
|
87
|
+
/**
|
|
88
|
+
* Finaliza um incidente pendente.
|
|
89
|
+
*/
|
|
90
|
+
finalize(incidentId: string): Promise<void>;
|
|
91
|
+
private executeFinalize;
|
|
92
|
+
/**
|
|
93
|
+
* Exporta um incidente em um artefato canônico v1 (.ffr.json).
|
|
94
|
+
*/
|
|
95
|
+
exportArtifact(incidentId: string): Promise<FlightRecorderArtifact>;
|
|
96
|
+
listIncidents(): Promise<IncidentSummary[]>;
|
|
97
|
+
deleteIncident(incidentId: string): Promise<void>;
|
|
98
|
+
private executeDeleteIncident;
|
|
99
|
+
/**
|
|
100
|
+
* Reseta o estado em memória do gerenciador de incidentes:
|
|
101
|
+
* cancela timer de finalização e descarta incidente pendente.
|
|
102
|
+
* Serializado para aguardar operações em andamento.
|
|
103
|
+
*/
|
|
104
|
+
reset(): Promise<void>;
|
|
105
|
+
destroy(): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=incident-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incident-manager.d.ts","sourceRoot":"","sources":["../../src/storage/incident-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,MAAM,CAAC;AACrB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { FlightRecorderDB } from './db';
|
|
2
|
+
export interface RetentionConfig {
|
|
3
|
+
bufferMinutes: number;
|
|
4
|
+
maxStorageMb: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PruneResult {
|
|
7
|
+
deletedChunkIds: string[];
|
|
8
|
+
reclaimedBytes: number;
|
|
9
|
+
remainingBytes: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class RetentionEngine {
|
|
12
|
+
private db;
|
|
13
|
+
private config;
|
|
14
|
+
constructor(db: FlightRecorderDB, config?: Partial<RetentionConfig>);
|
|
15
|
+
/**
|
|
16
|
+
* Executa limpeza de retenção:
|
|
17
|
+
* 1. Protege todos os chunks vinculados a incidentes (pendentes ou finalizados).
|
|
18
|
+
* 2. Exclui chunks não protegidos expirados pelo tempo (bufferMinutes).
|
|
19
|
+
* 3. Se exceder maxStorageMb, exclui os chunks não protegidos mais antigos.
|
|
20
|
+
*/
|
|
21
|
+
prune(now?: number): Promise<PruneResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Executa uma limpeza de emergência descartando todos os chunks não protegidos.
|
|
24
|
+
* Utilizado quando ocorre QuotaExceededError para liberar o máximo de espaço sem remover incidentes protegidos.
|
|
25
|
+
*/
|
|
26
|
+
emergencyPrune(): Promise<PruneResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Retorna o detalhamento do armazenamento entre buffer temporário e chunks protegidos por incidentes.
|
|
29
|
+
*/
|
|
30
|
+
getStorageBreakdown(): Promise<StorageBreakdown>;
|
|
31
|
+
}
|
|
32
|
+
export interface StorageBreakdown {
|
|
33
|
+
totalBytes: number;
|
|
34
|
+
protectedBytes: number;
|
|
35
|
+
bufferBytes: number;
|
|
36
|
+
maxStorageBytes: number;
|
|
37
|
+
isOverLimit: boolean;
|
|
38
|
+
protectedExceedsLimit: boolean;
|
|
39
|
+
incidentCount: number;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/storage/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAG7C,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQnE;;;;;OAKG;IACU,KAAK,CAAC,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IA6DlE;;;OAGG;IACU,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IA2CnD;;OAEG;IACU,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAmC9D;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SessionContext {
|
|
2
|
+
tabId: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ClaimSessionOptions {
|
|
6
|
+
storage?: Storage;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
channelName?: string;
|
|
9
|
+
channel?: BroadcastChannel | null;
|
|
10
|
+
disableBroadcastChannel?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fecha os canais de BroadcastChannel abertos pela sessão.
|
|
14
|
+
*/
|
|
15
|
+
export declare function closeSessionChannel(channel?: BroadcastChannel): void;
|
|
16
|
+
/**
|
|
17
|
+
* Obtém ou inicializa o tabId e sessionId da aba atual utilizando sessionStorage.
|
|
18
|
+
* Sobrevive a F5/reload na mesma aba sem vazar para outras abas.
|
|
19
|
+
* Mantida versão síncrona para compatibilidade da API pública.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getOrCreateSessionContext(storage?: Storage): SessionContext;
|
|
22
|
+
/**
|
|
23
|
+
* Confirma e reivindica a identidade da sessão da aba de forma assíncrona.
|
|
24
|
+
* Se o storage tiver sido herdado por duplicação de aba e a aba original
|
|
25
|
+
* ainda estiver ativa no BroadcastChannel, gera novos IDs para tabId e sessionId.
|
|
26
|
+
*/
|
|
27
|
+
export declare function claimSessionContext(options?: ClaimSessionOptions): Promise<SessionContext>;
|
|
28
|
+
/**
|
|
29
|
+
* Força a renovação da sessão (útil para testes ou reinicialização explícita).
|
|
30
|
+
*/
|
|
31
|
+
export declare function resetSessionContext(storage?: Storage): SessionContext;
|
|
32
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAoCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAkBpE;AAQD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,CAmC3E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiIhG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,CAerE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { IncidentReason, IncidentTrigger } from './incident';
|
|
2
|
+
import type { TimelineEvent } from './timeline';
|
|
3
|
+
import type { RrwebEvent } from './chunk';
|
|
4
|
+
export interface IncidentMetadata {
|
|
5
|
+
id: string;
|
|
6
|
+
reason: IncidentReason;
|
|
7
|
+
triggers: IncidentTrigger[];
|
|
8
|
+
startedAt: number;
|
|
9
|
+
triggeredAt: number;
|
|
10
|
+
finalizedAt: number;
|
|
11
|
+
annotationImage?: string;
|
|
12
|
+
annotations?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface EnvironmentMetadata {
|
|
15
|
+
url: string;
|
|
16
|
+
userAgent: string;
|
|
17
|
+
viewport: {
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
};
|
|
21
|
+
appVersion?: string;
|
|
22
|
+
gitBranch?: string;
|
|
23
|
+
gitCommit?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DiagnosticsMetadata {
|
|
26
|
+
/** Known losses only; see droppedEventsUnknown for unquantifiable gaps. */
|
|
27
|
+
droppedEvents: number;
|
|
28
|
+
droppedEventsUnknown?: boolean;
|
|
29
|
+
storageBytes: number;
|
|
30
|
+
degraded: boolean;
|
|
31
|
+
degradedReasons: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ReplayWindowMetadata {
|
|
34
|
+
requestedStartedAt: number;
|
|
35
|
+
requestedEndedAt: number;
|
|
36
|
+
preparationEventCount: number;
|
|
37
|
+
baseSnapshotOriginalTimestamp?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface CorrelationMetadata {
|
|
40
|
+
traceId?: string;
|
|
41
|
+
spanId?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ArtifactContextV2 {
|
|
44
|
+
sessionId: string;
|
|
45
|
+
tabId: string;
|
|
46
|
+
release?: string;
|
|
47
|
+
environment?: string;
|
|
48
|
+
correlation?: CorrelationMetadata;
|
|
49
|
+
}
|
|
50
|
+
export interface FlightRecorderArtifactV1 {
|
|
51
|
+
formatVersion: 1;
|
|
52
|
+
recorderVersion: string;
|
|
53
|
+
incident: IncidentMetadata;
|
|
54
|
+
environment: EnvironmentMetadata;
|
|
55
|
+
replayWindow?: ReplayWindowMetadata;
|
|
56
|
+
timeline: TimelineEvent[];
|
|
57
|
+
replay: RrwebEvent[];
|
|
58
|
+
diagnostics: DiagnosticsMetadata;
|
|
59
|
+
}
|
|
60
|
+
export interface FlightRecorderArtifactV2 {
|
|
61
|
+
formatVersion: 2;
|
|
62
|
+
recorderVersion: string;
|
|
63
|
+
context: ArtifactContextV2;
|
|
64
|
+
incident: IncidentMetadata;
|
|
65
|
+
environment: EnvironmentMetadata;
|
|
66
|
+
replayWindow?: ReplayWindowMetadata;
|
|
67
|
+
timeline: TimelineEvent[];
|
|
68
|
+
replay: RrwebEvent[];
|
|
69
|
+
diagnostics: DiagnosticsMetadata;
|
|
70
|
+
}
|
|
71
|
+
export type FlightRecorderArtifact = FlightRecorderArtifactV1 | FlightRecorderArtifactV2;
|
|
72
|
+
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../src/types/artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,CAAC,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,CAAC,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,MAAM,sBAAsB,GAC9B,wBAAwB,GACxB,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TimelineEvent } from './timeline';
|
|
2
|
+
/**
|
|
3
|
+
* Evento genérico do rrweb com timestamp e dados do snapshot/mutação.
|
|
4
|
+
*/
|
|
5
|
+
export interface RrwebEvent {
|
|
6
|
+
type: number;
|
|
7
|
+
data: unknown;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Chunk de gravação persistido no IndexedDB.
|
|
13
|
+
*/
|
|
14
|
+
export interface StoredChunk {
|
|
15
|
+
id: string;
|
|
16
|
+
sessionId: string;
|
|
17
|
+
tabId: string;
|
|
18
|
+
sequence: number;
|
|
19
|
+
startedAt: number;
|
|
20
|
+
endedAt: number;
|
|
21
|
+
/**
|
|
22
|
+
* Estimativa de tamanho do chunk em bytes (payload comprimido do replay + bytes UTF-8 da timeline).
|
|
23
|
+
* É uma estimativa pois o overhead interno do IndexedDB não é mensurável dessa forma.
|
|
24
|
+
*/
|
|
25
|
+
sizeBytes: number;
|
|
26
|
+
replay: RrwebEvent[];
|
|
27
|
+
replayCompressed?: Uint8Array;
|
|
28
|
+
hasFullSnapshot?: boolean;
|
|
29
|
+
snapshotTimestamps?: number[];
|
|
30
|
+
timeline: TimelineEvent[];
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=chunk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.d.ts","sourceRoot":"","sources":["../../src/types/chunk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type RecorderState = 'stopped' | 'recording' | 'incident_pending' | 'degraded';
|
|
2
|
+
export interface RecorderHealth {
|
|
3
|
+
state: RecorderState;
|
|
4
|
+
droppedEvents: number;
|
|
5
|
+
storageBytes: number;
|
|
6
|
+
protectedStorageBytes?: number;
|
|
7
|
+
storageLimitBytes?: number;
|
|
8
|
+
storageLimitExceeded?: boolean;
|
|
9
|
+
protectedStorageExceeded?: boolean;
|
|
10
|
+
browserStorageEstimateBytes?: number;
|
|
11
|
+
browserStorageQuotaBytes?: number;
|
|
12
|
+
pendingWrites: number;
|
|
13
|
+
incidentCount: number;
|
|
14
|
+
reasons: string[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/types/health.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,WAAW,GACX,kBAAkB,GAClB,UAAU,CAAC;AAEf,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EnvironmentMetadata } from './artifact';
|
|
2
|
+
export type IncidentReason = 'manual' | 'error' | 'unhandledrejection' | 'react' | 'http';
|
|
3
|
+
export interface IncidentTrigger {
|
|
4
|
+
id: string;
|
|
5
|
+
timestamp: number;
|
|
6
|
+
type: IncidentReason;
|
|
7
|
+
signature: string;
|
|
8
|
+
detail?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface StoredIncident {
|
|
11
|
+
id: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
tabId: string;
|
|
14
|
+
reason: IncidentReason;
|
|
15
|
+
triggers: IncidentTrigger[];
|
|
16
|
+
startedAt: number;
|
|
17
|
+
triggeredAt: number;
|
|
18
|
+
finalizeAt: number;
|
|
19
|
+
finalizedAt?: number;
|
|
20
|
+
state: 'pending' | 'finalized';
|
|
21
|
+
chunkIds: string[];
|
|
22
|
+
recordingIssues?: string[];
|
|
23
|
+
environment?: EnvironmentMetadata;
|
|
24
|
+
droppedEvents?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface IncidentSummary {
|
|
27
|
+
id: string;
|
|
28
|
+
reason: IncidentReason;
|
|
29
|
+
startedAt: number;
|
|
30
|
+
triggeredAt: number;
|
|
31
|
+
finalizedAt?: number;
|
|
32
|
+
eventCount: number;
|
|
33
|
+
triggerCount: number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=incident.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incident.d.ts","sourceRoot":"","sources":["../../src/types/incident.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,OAAO,GACP,oBAAoB,GACpB,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { IncidentSummary } from './incident';
|
|
2
|
+
import type { RecorderHealth } from './health';
|
|
3
|
+
import type { FlightRecorderArtifact, EnvironmentMetadata } from './artifact';
|
|
4
|
+
import type { BatchWriterConfig } from '../storage/batch-writer';
|
|
5
|
+
import type { ClaimSessionOptions } from '../storage/session';
|
|
6
|
+
import type { BacktrackTransport, BeforeSend } from './transport';
|
|
7
|
+
export interface ErrorContext {
|
|
8
|
+
source?: 'react' | 'manual' | 'window' | 'unhandledrejection';
|
|
9
|
+
componentStack?: string;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
export type RouteMatcher = string | RegExp | ((pathname: string) => boolean);
|
|
13
|
+
export interface PrivacyOptions {
|
|
14
|
+
maskAllInputs?: boolean;
|
|
15
|
+
maskAllText?: boolean;
|
|
16
|
+
blockMedia?: boolean;
|
|
17
|
+
blockSelector?: string;
|
|
18
|
+
maskTextSelector?: string;
|
|
19
|
+
sanitizeUrl?: (url: URL) => string;
|
|
20
|
+
sensitiveRoutes?: RouteMatcher[];
|
|
21
|
+
autoMaskPII?: boolean;
|
|
22
|
+
recordCanvas?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface NetworkOptions {
|
|
25
|
+
capturePayloads?: boolean;
|
|
26
|
+
maxPayloadSize?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface WidgetOptions {
|
|
29
|
+
position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
|
|
30
|
+
defaultViewerUrl?: string;
|
|
31
|
+
zIndex?: number;
|
|
32
|
+
defaultDurationSeconds?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface ObservabilityContext {
|
|
35
|
+
release?: string;
|
|
36
|
+
environment?: string;
|
|
37
|
+
traceId?: string;
|
|
38
|
+
spanId?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface FlightRecorderOptions {
|
|
41
|
+
bufferMinutes?: number;
|
|
42
|
+
afterErrorSeconds?: number;
|
|
43
|
+
/** Retention target; saved incidents are protected and may exceed it. */
|
|
44
|
+
maxStorageMb?: number;
|
|
45
|
+
captureHttpStatus?: number[];
|
|
46
|
+
ignoredUrls?: (string | RegExp)[];
|
|
47
|
+
network?: NetworkOptions;
|
|
48
|
+
privacy?: PrivacyOptions;
|
|
49
|
+
metadata?: Partial<EnvironmentMetadata>;
|
|
50
|
+
recorderVersion?: string;
|
|
51
|
+
showWidget?: boolean;
|
|
52
|
+
widgetOptions?: WidgetOptions;
|
|
53
|
+
storage?: Storage;
|
|
54
|
+
sessionOptions?: ClaimSessionOptions;
|
|
55
|
+
batchWriterConfig?: Partial<BatchWriterConfig>;
|
|
56
|
+
transport?: BacktrackTransport;
|
|
57
|
+
beforeSend?: BeforeSend;
|
|
58
|
+
context?: ObservabilityContext;
|
|
59
|
+
getContext?: () => ObservabilityContext | Promise<ObservabilityContext>;
|
|
60
|
+
}
|
|
61
|
+
export interface CaptureOptions {
|
|
62
|
+
annotationImage?: string;
|
|
63
|
+
notes?: string;
|
|
64
|
+
annotations?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
export interface FlightRecorder {
|
|
67
|
+
start(): Promise<void>;
|
|
68
|
+
stop(): Promise<void>;
|
|
69
|
+
capture(reason?: string, windowSeconds?: number, options?: CaptureOptions): Promise<string>;
|
|
70
|
+
captureException(error: unknown, context?: ErrorContext): Promise<string | undefined> | void;
|
|
71
|
+
listIncidents(): Promise<IncidentSummary[]>;
|
|
72
|
+
getArtifact(incidentId: string): Promise<FlightRecorderArtifact>;
|
|
73
|
+
exportIncident(incidentId: string, options?: {
|
|
74
|
+
compress?: boolean;
|
|
75
|
+
aiOptimized?: boolean;
|
|
76
|
+
}): Promise<FlightRecorderArtifact>;
|
|
77
|
+
deleteIncident(incidentId: string): Promise<void>;
|
|
78
|
+
clear(): Promise<void>;
|
|
79
|
+
getHealth(): RecorderHealth;
|
|
80
|
+
hideWidget?(): void;
|
|
81
|
+
showWidget?(): void;
|
|
82
|
+
toggleWidget?(): boolean;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"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"}
|