@panda-replay/shared 0.1.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.
@@ -0,0 +1,29 @@
1
+ import type { ChunkUpload, Compression, UnifiedEventEnvelope } from "./types.js";
2
+ export interface EncodedReplayChunk {
3
+ sequence: number;
4
+ compression: Compression;
5
+ eventCount: number;
6
+ firstEventAtMs: number;
7
+ lastEventAtMs: number;
8
+ payload: Uint8Array;
9
+ }
10
+ export interface ReplayChunkMetadata {
11
+ eventCount: number;
12
+ firstEventAtMs: number;
13
+ lastEventAtMs: number;
14
+ }
15
+ export interface ReplayChunkValidationResult {
16
+ ok: true;
17
+ events: UnifiedEventEnvelope[];
18
+ }
19
+ export interface ReplayChunkValidationFailure {
20
+ ok: false;
21
+ reason: "invalid-compression" | "invalid-json" | "invalid-event-array" | "event-count-mismatch" | "invalid-event" | "non-monotonic-timestamps" | "first-time-mismatch" | "last-time-mismatch" | "empty-time-bounds";
22
+ message: string;
23
+ }
24
+ export type ReplayChunkValidation = ReplayChunkValidationResult | ReplayChunkValidationFailure;
25
+ export declare function encodeReplayChunk(events: UnifiedEventEnvelope[], sequence: number): EncodedReplayChunk;
26
+ export declare function encodeReplayChunkUpload(events: UnifiedEventEnvelope[], sequence: number): ChunkUpload;
27
+ export declare function decodeReplayChunk(payload: Uint8Array, compression: string): ReplayChunkValidation;
28
+ export declare function validateReplayChunk(payload: Uint8Array, compression: string, expected: ReplayChunkMetadata): ReplayChunkValidation;
29
+ //# sourceMappingURL=chunk-codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-codec.d.ts","sourceRoot":"","sources":["../src/chunk-codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EACF,qBAAqB,GACrB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,eAAe,GACf,0BAA0B,GAC1B,qBAAqB,GACrB,oBAAoB,GACpB,mBAAmB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,4BAA4B,CAAC;AAEjC,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,oBAAoB,EAAE,EAC9B,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAWpB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,QAAQ,EAAE,MAAM,GACf,WAAW,CAUb;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,GAClB,qBAAqB,CAyBvB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,mBAAmB,GAC5B,qBAAqB,CAyCvB"}
@@ -0,0 +1,108 @@
1
+ import { gunzipSync, gzipSync, strFromU8, strToU8 } from "fflate";
2
+ export function encodeReplayChunk(events, sequence) {
3
+ const payload = gzipSync(strToU8(JSON.stringify(events)));
4
+ return {
5
+ sequence,
6
+ compression: "gzip",
7
+ eventCount: events.length,
8
+ firstEventAtMs: events[0]?.sessionTimeMs ?? 0,
9
+ lastEventAtMs: events.at(-1)?.sessionTimeMs ?? 0,
10
+ payload
11
+ };
12
+ }
13
+ export function encodeReplayChunkUpload(events, sequence) {
14
+ const chunk = encodeReplayChunk(events, sequence);
15
+ return {
16
+ sequence: chunk.sequence,
17
+ compression: chunk.compression,
18
+ eventCount: chunk.eventCount,
19
+ firstEventAtMs: chunk.firstEventAtMs,
20
+ lastEventAtMs: chunk.lastEventAtMs,
21
+ payloadBase64: bytesToBase64(chunk.payload)
22
+ };
23
+ }
24
+ export function decodeReplayChunk(payload, compression) {
25
+ if (compression !== "gzip" && compression !== "none") {
26
+ return failure("invalid-compression", "chunk compression is not supported");
27
+ }
28
+ let json;
29
+ try {
30
+ const bytes = compression === "gzip" ? gunzipSync(payload) : payload;
31
+ json = strFromU8(bytes);
32
+ }
33
+ catch {
34
+ return failure("invalid-json", "chunk payload is not valid compressed JSON");
35
+ }
36
+ let parsed;
37
+ try {
38
+ parsed = JSON.parse(json);
39
+ }
40
+ catch {
41
+ return failure("invalid-json", "chunk payload is not valid compressed JSON");
42
+ }
43
+ if (!Array.isArray(parsed)) {
44
+ return failure("invalid-event-array", "chunk payload must be a JSON event array");
45
+ }
46
+ return { ok: true, events: parsed };
47
+ }
48
+ export function validateReplayChunk(payload, compression, expected) {
49
+ const decoded = decodeReplayChunk(payload, compression);
50
+ if (!decoded.ok) {
51
+ return decoded;
52
+ }
53
+ const { events } = decoded;
54
+ if (events.length !== expected.eventCount) {
55
+ return failure("event-count-mismatch", "eventCount does not match payload");
56
+ }
57
+ if (events.length === 0) {
58
+ if (expected.firstEventAtMs !== 0 || expected.lastEventAtMs !== 0) {
59
+ return failure("empty-time-bounds", "empty chunks must use zero time bounds");
60
+ }
61
+ return decoded;
62
+ }
63
+ let previous = -1;
64
+ for (const event of events) {
65
+ if (!isUnifiedEventLike(event)) {
66
+ return failure("invalid-event", "chunk payload contains invalid events");
67
+ }
68
+ if (event.sessionTimeMs < previous) {
69
+ return failure("non-monotonic-timestamps", "chunk event timestamps must be monotonic");
70
+ }
71
+ previous = event.sessionTimeMs;
72
+ }
73
+ if (events[0]?.sessionTimeMs !== expected.firstEventAtMs) {
74
+ return failure("first-time-mismatch", "firstEventAtMs does not match payload");
75
+ }
76
+ if (events.at(-1)?.sessionTimeMs !== expected.lastEventAtMs) {
77
+ return failure("last-time-mismatch", "lastEventAtMs does not match payload");
78
+ }
79
+ return decoded;
80
+ }
81
+ function isUnifiedEventLike(event) {
82
+ if (typeof event !== "object" || event === null) {
83
+ return false;
84
+ }
85
+ const candidate = event;
86
+ return (typeof candidate.kind === "string" &&
87
+ typeof candidate.timestamp === "number" &&
88
+ Number.isFinite(candidate.timestamp) &&
89
+ typeof candidate.sessionTimeMs === "number" &&
90
+ Number.isFinite(candidate.sessionTimeMs) &&
91
+ candidate.sessionTimeMs >= 0 &&
92
+ typeof candidate.payload === "object" &&
93
+ candidate.payload !== null);
94
+ }
95
+ function bytesToBase64(bytes) {
96
+ if (typeof Buffer !== "undefined") {
97
+ return Buffer.from(bytes).toString("base64");
98
+ }
99
+ let binary = "";
100
+ for (const byte of bytes) {
101
+ binary += String.fromCharCode(byte);
102
+ }
103
+ return btoa(binary);
104
+ }
105
+ function failure(reason, message) {
106
+ return { ok: false, reason, message };
107
+ }
108
+ //# sourceMappingURL=chunk-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-codec.js","sourceRoot":"","sources":["../src/chunk-codec.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,188 @@
1
+ import type { ColumnType, Generated, Insertable, Selectable, Updateable } from "kysely";
2
+ import type { ApiScope, Compression, ConsoleCaptureMode, DerivedMarker, MarkerType, NetworkCaptureMode } from "./types.js";
3
+ export type ReplaySessionStatus = "recording" | "finalized";
4
+ export type MaintenanceJobType = "generate_session_packet" | "subject_erasure";
5
+ export type MaintenanceJobStatus = "queued" | "running" | "finished" | "failed";
6
+ export type SubjectIdentifierType = "subject" | "account";
7
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
8
+ [key: string]: JsonValue | undefined;
9
+ };
10
+ export type JsonObject = {
11
+ [key: string]: JsonValue | undefined;
12
+ };
13
+ export type Timestamp = ColumnType<Date, Date | string | undefined, Date | string>;
14
+ export interface OrgsTable {
15
+ id: Generated<string>;
16
+ name: string;
17
+ created_at: Timestamp;
18
+ }
19
+ export interface AppsTable {
20
+ id: Generated<string>;
21
+ org_id: string;
22
+ name: string;
23
+ public_key: string;
24
+ allow_raw_identity: boolean;
25
+ sampling_rate: string | number;
26
+ retention_days: number;
27
+ privacy_config: JsonObject;
28
+ console_capture: ConsoleCaptureMode;
29
+ network_capture: NetworkCaptureMode;
30
+ created_at: Timestamp;
31
+ }
32
+ export interface AppOriginsTable {
33
+ id: Generated<string>;
34
+ app_id: string;
35
+ origin: string;
36
+ created_at: Timestamp;
37
+ }
38
+ export interface ApiKeysTable {
39
+ id: Generated<string>;
40
+ org_id: string | null;
41
+ app_id: string | null;
42
+ name: string;
43
+ prefix: string;
44
+ key_hash: string;
45
+ scopes: ApiScope[];
46
+ created_at: Timestamp;
47
+ revoked_at: Timestamp | null;
48
+ }
49
+ export interface AppSubjectOptOutsTable {
50
+ id: Generated<string>;
51
+ org_id: string;
52
+ app_id: string;
53
+ identifier_type: SubjectIdentifierType;
54
+ identifier_value: string;
55
+ reason: string | null;
56
+ created_at: Timestamp;
57
+ }
58
+ export interface ReleasesTable {
59
+ id: Generated<string>;
60
+ app_id: string;
61
+ version: string;
62
+ git_sha: string | null;
63
+ metadata: JsonObject;
64
+ created_at: Timestamp;
65
+ }
66
+ export interface ReplaySessionsTable {
67
+ id: Generated<string>;
68
+ org_id: string;
69
+ app_id: string;
70
+ release_id: string | null;
71
+ ingest_token_hash: string;
72
+ ingest_token_expires_at: Timestamp;
73
+ external_session_id: string | null;
74
+ subject_id: string | null;
75
+ account_id: string | null;
76
+ route: string | null;
77
+ user_agent: string | null;
78
+ ip_hash: string | null;
79
+ viewport: JsonObject | null;
80
+ feature_flags: JsonObject;
81
+ metadata: JsonObject;
82
+ status: ReplaySessionStatus;
83
+ started_at: Timestamp;
84
+ last_seen_at: Timestamp;
85
+ ended_at: Timestamp | null;
86
+ finalized_at: Timestamp | null;
87
+ }
88
+ export interface ReplayChunksTable {
89
+ id: Generated<string>;
90
+ org_id: string;
91
+ app_id: string;
92
+ session_id: string;
93
+ sequence: number;
94
+ compression: Compression;
95
+ event_count: number;
96
+ first_event_at_ms: number;
97
+ last_event_at_ms: number;
98
+ payload: Buffer;
99
+ payload_sha256: string | null;
100
+ created_at: Timestamp;
101
+ }
102
+ export interface SessionPacketsTable {
103
+ session_id: string;
104
+ org_id: string;
105
+ app_id: string;
106
+ summary: JsonObject;
107
+ packet: JsonObject;
108
+ generated_at: Timestamp;
109
+ }
110
+ export interface DerivedMarkersTable {
111
+ id: Generated<string>;
112
+ org_id: string;
113
+ app_id: string;
114
+ session_id: string;
115
+ type: MarkerType;
116
+ timestamp_ms: number;
117
+ severity: DerivedMarker["severity"];
118
+ label: string;
119
+ data: JsonObject;
120
+ created_at: Timestamp;
121
+ }
122
+ export interface AnnotationsTable {
123
+ id: Generated<string>;
124
+ org_id: string;
125
+ app_id: string;
126
+ session_id: string;
127
+ author_key_id: string | null;
128
+ kind: string;
129
+ body: string;
130
+ tags: string[];
131
+ created_at: Timestamp;
132
+ }
133
+ export interface AuditEventsTable {
134
+ id: Generated<string>;
135
+ org_id: string | null;
136
+ app_id: string | null;
137
+ actor_key_id: string | null;
138
+ action: string;
139
+ target_type: string;
140
+ target_id: string | null;
141
+ metadata: JsonObject;
142
+ created_at: Timestamp;
143
+ }
144
+ export interface MaintenanceJobsTable {
145
+ id: Generated<string>;
146
+ type: MaintenanceJobType;
147
+ status: ColumnType<MaintenanceJobStatus, MaintenanceJobStatus | undefined, MaintenanceJobStatus>;
148
+ org_id: string | null;
149
+ app_id: string | null;
150
+ session_id: string | null;
151
+ payload: JsonObject;
152
+ run_after: Timestamp;
153
+ attempts: ColumnType<number, number | undefined, number>;
154
+ last_error: string | null;
155
+ locked_at: Timestamp | null;
156
+ locked_by: string | null;
157
+ finished_at: Timestamp | null;
158
+ created_at: Timestamp;
159
+ }
160
+ export interface SchemaMigrationsTable {
161
+ version: string;
162
+ applied_at: Timestamp;
163
+ }
164
+ export interface Database {
165
+ orgs: OrgsTable;
166
+ apps: AppsTable;
167
+ app_origins: AppOriginsTable;
168
+ api_keys: ApiKeysTable;
169
+ app_subject_opt_outs: AppSubjectOptOutsTable;
170
+ releases: ReleasesTable;
171
+ replay_sessions: ReplaySessionsTable;
172
+ replay_chunks: ReplayChunksTable;
173
+ session_packets: SessionPacketsTable;
174
+ derived_markers: DerivedMarkersTable;
175
+ annotations: AnnotationsTable;
176
+ audit_events: AuditEventsTable;
177
+ maintenance_jobs: MaintenanceJobsTable;
178
+ schema_migrations: SchemaMigrationsTable;
179
+ }
180
+ export type Org = Selectable<OrgsTable>;
181
+ export type App = Selectable<AppsTable>;
182
+ export type ApiKey = Selectable<ApiKeysTable>;
183
+ export type ReplaySession = Selectable<ReplaySessionsTable>;
184
+ export type ReplayChunk = Selectable<ReplayChunksTable>;
185
+ export type NewAuditEvent = Insertable<AuditEventsTable>;
186
+ export type NewReplaySession = Insertable<ReplaySessionsTable>;
187
+ export type SessionUpdate = Updateable<ReplaySessionsTable>;
188
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxF,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,WAAW,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,GAAG,iBAAiB,CAAC;AAC/E,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1D,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAEnF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,UAAU,CAAC;IAC3B,eAAe,EAAE,kBAAkB,CAAC;IACpC,eAAe,EAAE,kBAAkB,CAAC;IACpC,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,EAAE,SAAS,CAAC;IACtB,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,SAAS,CAAC;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,UAAU,CAAC;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC;IACtB,YAAY,EAAE,SAAS,CAAC;IACxB,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACjG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC;IACzD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,oBAAoB,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,EAAE,aAAa,CAAC;IACxB,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,iBAAiB,CAAC;IACjC,eAAe,EAAE,mBAAmB,CAAC;IACrC,eAAe,EAAE,mBAAmB,CAAC;IACrC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,iBAAiB,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;AACxC,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;AACxC,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACzD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC"}
package/dist/db.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export * from "./types.js";
2
+ export * from "./redaction.js";
3
+ export * from "./schemas.js";
4
+ export * from "./json.js";
5
+ export * from "./chunk-codec.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./types.js";
2
+ export * from "./redaction.js";
3
+ export * from "./schemas.js";
4
+ export * from "./json.js";
5
+ export * from "./chunk-codec.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export type SafeJson = string | number | boolean | null | SafeJson[] | {
2
+ [key: string]: SafeJson;
3
+ };
4
+ export interface JsonSanitizeOptions {
5
+ maxDepth?: number;
6
+ maxKeys?: number;
7
+ maxArrayLength?: number;
8
+ maxStringLength?: number;
9
+ }
10
+ export declare function sanitizeJsonValue(value: unknown, options?: JsonSanitizeOptions, depth?: number): SafeJson;
11
+ export declare function sanitizeJsonObject(value: unknown, options?: JsonSanitizeOptions): {
12
+ [key: string]: SafeJson;
13
+ };
14
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,QAAQ,EAAE,GACV;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,mBAAwB,EACjC,KAAK,SAAI,GACR,QAAQ,CAuCV;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,mBAAwB,GAChC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAK7B"}
package/dist/json.js ADDED
@@ -0,0 +1,46 @@
1
+ const DEFAULT_JSON_OPTIONS = {
2
+ maxDepth: 6,
3
+ maxKeys: 100,
4
+ maxArrayLength: 100,
5
+ maxStringLength: 4_000
6
+ };
7
+ export function sanitizeJsonValue(value, options = {}, depth = 0) {
8
+ const config = { ...DEFAULT_JSON_OPTIONS, ...options };
9
+ if (depth > config.maxDepth) {
10
+ return "[max-depth]";
11
+ }
12
+ if (value === null || typeof value === "boolean") {
13
+ return value;
14
+ }
15
+ if (typeof value === "number") {
16
+ return Number.isFinite(value) ? value : null;
17
+ }
18
+ if (typeof value === "string") {
19
+ return value.length > config.maxStringLength
20
+ ? `${value.slice(0, config.maxStringLength)}...[truncated]`
21
+ : value;
22
+ }
23
+ if (Array.isArray(value)) {
24
+ return value
25
+ .slice(0, config.maxArrayLength)
26
+ .map((item) => sanitizeJsonValue(item, config, depth + 1));
27
+ }
28
+ if (typeof value === "object" && value !== null) {
29
+ const output = {};
30
+ for (const [key, nested] of Object.entries(value).slice(0, config.maxKeys)) {
31
+ if (nested === undefined || typeof nested === "function" || typeof nested === "symbol") {
32
+ continue;
33
+ }
34
+ output[key] = sanitizeJsonValue(nested, config, depth + 1);
35
+ }
36
+ return output;
37
+ }
38
+ return null;
39
+ }
40
+ export function sanitizeJsonObject(value, options = {}) {
41
+ const sanitized = sanitizeJsonValue(value, options);
42
+ return sanitized && typeof sanitized === "object" && !Array.isArray(sanitized)
43
+ ? sanitized
44
+ : {};
45
+ }
46
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAeA,MAAM,oBAAoB,GAAkC;IAC1D,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,GAAG;IACZ,cAAc,EAAE,GAAG;IACnB,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,UAA+B,EAAE,EACjC,KAAK,GAAG,CAAC;IAET,MAAM,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,EAAE,CAAC;IAEvD,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe;YAC1C,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,gBAAgB;YAC3D,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;aAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAgC,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3E,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvF,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAC5E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PrivacyConfig } from "./types.js";
2
+ export declare const DEFAULT_MASK_SELECTORS: string[];
3
+ export declare const DEFAULT_BLOCK_SELECTORS: string[];
4
+ export declare const defaultPrivacyConfig: (overrides?: Partial<PrivacyConfig>) => PrivacyConfig;
5
+ export declare function redactString(input: string, maxLength?: number): string;
6
+ export declare function sanitizeValue(value: unknown, options: {
7
+ maxDepth: number;
8
+ maxStringLength: number;
9
+ }, depth?: number): unknown;
10
+ export declare function sanitizeConsoleArgs(args: unknown[], config: PrivacyConfig): {
11
+ args: unknown[];
12
+ message: string;
13
+ redacted: boolean;
14
+ };
15
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,sBAAsB,UAUlC,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAInC,CAAC;AAUF,eAAO,MAAM,oBAAoB,GAC/B,YAAW,OAAO,CAAC,aAAa,CAAM,KACrC,aASD,CAAC;AAEH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,MAAM,CAWrE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACtD,KAAK,SAAI,GACR,OAAO,CAuCT;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EAAE,EACf,MAAM,EAAE,aAAa,GACpB;IAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAkBzD"}
@@ -0,0 +1,87 @@
1
+ export const DEFAULT_MASK_SELECTORS = [
2
+ "[data-replay-mask]",
3
+ "input[type='password']",
4
+ "input[name*='password' i]",
5
+ "input[name*='token' i]",
6
+ "input[name*='secret' i]",
7
+ "input[name*='card' i]",
8
+ "input[name*='cvv' i]",
9
+ "input[autocomplete='cc-number']",
10
+ "input[autocomplete='cc-csc']"
11
+ ];
12
+ export const DEFAULT_BLOCK_SELECTORS = [
13
+ "[data-replay-block]",
14
+ "iframe",
15
+ "input[type='file']"
16
+ ];
17
+ const SECRET_PATTERNS = [
18
+ [/\b(sk|pk|rk|ghp|github_pat)_[A-Za-z0-9_-]{12,}\b/g, "[redacted-token]"],
19
+ [/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, "[redacted-email]"],
20
+ [/\b(?:\d[ -]*?){13,19}\b/g, "[redacted-card]"],
21
+ [/Bearer\s+[A-Za-z0-9._~+/=-]+/gi, "Bearer [redacted]"],
22
+ [/(password|passwd|secret|token|api[_-]?key|authorization)["'\s:=]+[^,"'\s}]+/gi, "$1=[redacted]"]
23
+ ];
24
+ export const defaultPrivacyConfig = (overrides = {}) => ({
25
+ maskSelectors: DEFAULT_MASK_SELECTORS,
26
+ blockSelectors: DEFAULT_BLOCK_SELECTORS,
27
+ consoleCapture: "all",
28
+ networkCapture: "metadata",
29
+ redactConsole: true,
30
+ maxConsoleMessageLength: 2_000,
31
+ maxConsoleArgsDepth: 3,
32
+ ...overrides
33
+ });
34
+ export function redactString(input, maxLength = 2_000) {
35
+ let output = input;
36
+ for (const [pattern, replacement] of SECRET_PATTERNS) {
37
+ output = output.replace(pattern, replacement);
38
+ }
39
+ if (output.length > maxLength) {
40
+ return `${output.slice(0, maxLength)}...[truncated]`;
41
+ }
42
+ return output;
43
+ }
44
+ export function sanitizeValue(value, options, depth = 0) {
45
+ if (depth > options.maxDepth) {
46
+ return "[max-depth]";
47
+ }
48
+ if (typeof value === "string") {
49
+ return redactString(value, options.maxStringLength);
50
+ }
51
+ if (typeof value === "number" ||
52
+ typeof value === "boolean" ||
53
+ value === null ||
54
+ value === undefined) {
55
+ return value;
56
+ }
57
+ if (Array.isArray(value)) {
58
+ return value
59
+ .slice(0, 25)
60
+ .map((item) => sanitizeValue(item, options, depth + 1));
61
+ }
62
+ if (typeof value === "object") {
63
+ const output = {};
64
+ for (const [key, nested] of Object.entries(value).slice(0, 50)) {
65
+ if (/password|passwd|secret|token|api[_-]?key|authorization/i.test(key)) {
66
+ output[key] = "[redacted]";
67
+ continue;
68
+ }
69
+ output[key] = sanitizeValue(nested, options, depth + 1);
70
+ }
71
+ return output;
72
+ }
73
+ return String(value);
74
+ }
75
+ export function sanitizeConsoleArgs(args, config) {
76
+ const sanitized = args.map((arg) => sanitizeValue(arg, {
77
+ maxDepth: config.maxConsoleArgsDepth,
78
+ maxStringLength: config.maxConsoleMessageLength
79
+ }));
80
+ const message = redactString(sanitized.map((arg) => (typeof arg === "string" ? arg : JSON.stringify(arg))).join(" "), config.maxConsoleMessageLength);
81
+ return {
82
+ args: sanitized,
83
+ message,
84
+ redacted: config.redactConsole
85
+ };
86
+ }
87
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { z } from "zod";
2
+ export declare const idParamSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ }, z.core.$strip>;
5
+ export declare const sessionIdParamSchema: z.ZodObject<{
6
+ sessionId: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export declare const appSubjectParamSchema: z.ZodObject<{
9
+ appId: z.ZodString;
10
+ subjectId: z.ZodString;
11
+ }, z.core.$strip>;
12
+ export declare const appAccountParamSchema: z.ZodObject<{
13
+ appId: z.ZodString;
14
+ accountId: z.ZodString;
15
+ }, z.core.$strip>;
16
+ export declare const sdkConfigQuerySchema: z.ZodObject<{
17
+ publicKey: z.ZodString;
18
+ }, z.core.$strip>;
19
+ export declare const scopeSchema: z.ZodEnum<{
20
+ admin: "admin";
21
+ read: "read";
22
+ "read:raw": "read:raw";
23
+ annotate: "annotate";
24
+ erase: "erase";
25
+ }>;
26
+ export declare const bootstrapSchema: z.ZodObject<{
27
+ orgName: z.ZodString;
28
+ adminKeyName: z.ZodDefault<z.ZodString>;
29
+ }, z.core.$strip>;
30
+ export declare const createOrgSchema: z.ZodObject<{
31
+ name: z.ZodString;
32
+ }, z.core.$strip>;
33
+ export declare const createAppSchema: z.ZodObject<{
34
+ orgId: z.ZodOptional<z.ZodString>;
35
+ name: z.ZodString;
36
+ allowRawIdentity: z.ZodDefault<z.ZodBoolean>;
37
+ samplingRate: z.ZodDefault<z.ZodNumber>;
38
+ retentionDays: z.ZodDefault<z.ZodNumber>;
39
+ privacyConfig: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
40
+ consoleCapture: z.ZodDefault<z.ZodEnum<{
41
+ all: "all";
42
+ errors: "errors";
43
+ warnings: "warnings";
44
+ off: "off";
45
+ }>>;
46
+ networkCapture: z.ZodDefault<z.ZodEnum<{
47
+ off: "off";
48
+ metadata: "metadata";
49
+ }>>;
50
+ }, z.core.$strip>;
51
+ export declare const addOriginSchema: z.ZodObject<{
52
+ origin: z.ZodString;
53
+ }, z.core.$strip>;
54
+ export declare const createApiKeySchema: z.ZodObject<{
55
+ orgId: z.ZodOptional<z.ZodString>;
56
+ appId: z.ZodOptional<z.ZodString>;
57
+ name: z.ZodString;
58
+ scopes: z.ZodArray<z.ZodEnum<{
59
+ admin: "admin";
60
+ read: "read";
61
+ "read:raw": "read:raw";
62
+ annotate: "annotate";
63
+ erase: "erase";
64
+ }>>;
65
+ }, z.core.$strip>;
66
+ export declare const createReleaseSchema: z.ZodObject<{
67
+ appId: z.ZodString;
68
+ version: z.ZodString;
69
+ gitSha: z.ZodOptional<z.ZodString>;
70
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
71
+ }, z.core.$strip>;
72
+ export declare const createSessionSchema: z.ZodObject<{
73
+ publicKey: z.ZodString;
74
+ releaseId: z.ZodOptional<z.ZodString>;
75
+ releaseVersion: z.ZodOptional<z.ZodString>;
76
+ gitSha: z.ZodOptional<z.ZodString>;
77
+ externalSessionId: z.ZodOptional<z.ZodString>;
78
+ subjectId: z.ZodOptional<z.ZodString>;
79
+ accountId: z.ZodOptional<z.ZodString>;
80
+ route: z.ZodOptional<z.ZodString>;
81
+ viewport: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
82
+ featureFlags: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
83
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
84
+ }, z.core.$strip>;
85
+ export declare const uploadChunkSchema: z.ZodObject<{
86
+ sequence: z.ZodNumber;
87
+ compression: z.ZodEnum<{
88
+ none: "none";
89
+ gzip: "gzip";
90
+ }>;
91
+ eventCount: z.ZodNumber;
92
+ firstEventAtMs: z.ZodNumber;
93
+ lastEventAtMs: z.ZodNumber;
94
+ payloadBase64: z.ZodString;
95
+ payloadSha256: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strip>;
97
+ export declare const listSessionsQuerySchema: z.ZodObject<{
98
+ appId: z.ZodOptional<z.ZodString>;
99
+ from: z.ZodOptional<z.ZodString>;
100
+ to: z.ZodOptional<z.ZodString>;
101
+ route: z.ZodOptional<z.ZodString>;
102
+ subjectId: z.ZodOptional<z.ZodString>;
103
+ externalSessionId: z.ZodOptional<z.ZodString>;
104
+ markerType: z.ZodOptional<z.ZodEnum<{
105
+ first_error: "first_error";
106
+ rage_click: "rage_click";
107
+ dead_click: "dead_click";
108
+ abandonment: "abandonment";
109
+ slow_network: "slow_network";
110
+ failed_network: "failed_network";
111
+ console_error: "console_error";
112
+ missing_release: "missing_release";
113
+ }>>;
114
+ limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
115
+ }, z.core.$strip>;
116
+ export declare const eventWindowQuerySchema: z.ZodObject<{
117
+ fromMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
118
+ toMs: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
119
+ }, z.core.$strip>;
120
+ export declare const createAnnotationSchema: z.ZodObject<{
121
+ kind: z.ZodDefault<z.ZodString>;
122
+ body: z.ZodString;
123
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
124
+ }, z.core.$strip>;
125
+ export declare const optOutSubjectSchema: z.ZodObject<{
126
+ reason: z.ZodOptional<z.ZodString>;
127
+ }, z.core.$strip>;
128
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,aAAa;;iBAExB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAE/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAE/B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;EAAqB,CAAC;AAE9C,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAE1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;iBAS1B,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAE1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;iBAK9B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAY9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;iBAQ5B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;iBASlC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { z } from "zod";
2
+ import { API_SCOPES, MARKER_TYPES } from "./types.js";
3
+ const uuid = z.string().uuid();
4
+ export const idParamSchema = z.object({
5
+ id: uuid
6
+ });
7
+ export const sessionIdParamSchema = z.object({
8
+ sessionId: uuid
9
+ });
10
+ export const appSubjectParamSchema = z.object({
11
+ appId: uuid,
12
+ subjectId: z.string().min(1).max(500)
13
+ });
14
+ export const appAccountParamSchema = z.object({
15
+ appId: uuid,
16
+ accountId: z.string().min(1).max(500)
17
+ });
18
+ export const sdkConfigQuerySchema = z.object({
19
+ publicKey: z.string().min(12)
20
+ });
21
+ export const scopeSchema = z.enum(API_SCOPES);
22
+ export const bootstrapSchema = z.object({
23
+ orgName: z.string().min(1).max(200),
24
+ adminKeyName: z.string().min(1).max(200).default("bootstrap-admin")
25
+ });
26
+ export const createOrgSchema = z.object({
27
+ name: z.string().min(1).max(200)
28
+ });
29
+ export const createAppSchema = z.object({
30
+ orgId: uuid.optional(),
31
+ name: z.string().min(1).max(200),
32
+ allowRawIdentity: z.boolean().default(true),
33
+ samplingRate: z.number().min(0).max(1).default(1),
34
+ retentionDays: z.number().int().min(1).max(365).default(90),
35
+ privacyConfig: z.record(z.string(), z.unknown()).default({}),
36
+ consoleCapture: z.enum(["all", "errors", "warnings", "off"]).default("all"),
37
+ networkCapture: z.enum(["metadata", "off"]).default("metadata")
38
+ });
39
+ export const addOriginSchema = z.object({
40
+ origin: z.string().url()
41
+ });
42
+ export const createApiKeySchema = z.object({
43
+ orgId: uuid.optional(),
44
+ appId: uuid.optional(),
45
+ name: z.string().min(1).max(200),
46
+ scopes: z.array(scopeSchema).min(1)
47
+ });
48
+ export const createReleaseSchema = z.object({
49
+ appId: uuid,
50
+ version: z.string().min(1).max(200),
51
+ gitSha: z.string().min(6).max(80).optional(),
52
+ metadata: z.record(z.string(), z.unknown()).default({})
53
+ });
54
+ export const createSessionSchema = z.object({
55
+ publicKey: z.string().min(12),
56
+ releaseId: uuid.optional(),
57
+ releaseVersion: z.string().max(200).optional(),
58
+ gitSha: z.string().max(80).optional(),
59
+ externalSessionId: z.string().max(500).optional(),
60
+ subjectId: z.string().max(500).optional(),
61
+ accountId: z.string().max(500).optional(),
62
+ route: z.string().max(2_000).optional(),
63
+ viewport: z.record(z.string(), z.unknown()).optional(),
64
+ featureFlags: z.record(z.string(), z.unknown()).default({}),
65
+ metadata: z.record(z.string(), z.unknown()).default({})
66
+ });
67
+ export const uploadChunkSchema = z.object({
68
+ sequence: z.number().int().min(0),
69
+ compression: z.enum(["none", "gzip"]),
70
+ eventCount: z.number().int().min(0).max(10_000),
71
+ firstEventAtMs: z.number().int().min(0),
72
+ lastEventAtMs: z.number().int().min(0),
73
+ payloadBase64: z.string().min(1),
74
+ payloadSha256: z.string().min(32).max(128).optional()
75
+ });
76
+ export const listSessionsQuerySchema = z.object({
77
+ appId: uuid.optional(),
78
+ from: z.string().datetime().optional(),
79
+ to: z.string().datetime().optional(),
80
+ route: z.string().optional(),
81
+ subjectId: z.string().optional(),
82
+ externalSessionId: z.string().optional(),
83
+ markerType: z.enum(MARKER_TYPES).optional(),
84
+ limit: z.coerce.number().int().min(1).max(200).default(50)
85
+ });
86
+ export const eventWindowQuerySchema = z.object({
87
+ fromMs: z.coerce.number().int().min(0).optional(),
88
+ toMs: z.coerce.number().int().min(0).optional()
89
+ });
90
+ export const createAnnotationSchema = z.object({
91
+ kind: z.string().min(1).max(100).default("note"),
92
+ body: z.string().min(1).max(10_000),
93
+ tags: z.array(z.string().min(1).max(100)).max(25).default([])
94
+ });
95
+ export const optOutSubjectSchema = z.object({
96
+ reason: z.string().max(1_000).optional()
97
+ });
98
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Kysely, Transaction } from "kysely";
2
+ import type { Database, JsonObject } from "./db.js";
3
+ type DbExecutor = Kysely<Database> | Transaction<Database>;
4
+ export interface AuditEventInput {
5
+ orgId?: string | null;
6
+ appId?: string | null;
7
+ actorKeyId?: string | null;
8
+ action: string;
9
+ targetType: string;
10
+ targetId?: string | null;
11
+ metadata?: JsonObject;
12
+ }
13
+ export interface SessionPacketJobInput {
14
+ orgId: string;
15
+ appId: string;
16
+ sessionId: string;
17
+ reason?: string;
18
+ }
19
+ export declare function writeAuditEvent(db: DbExecutor, input: AuditEventInput): Promise<void>;
20
+ export declare function writeAuditEvents(db: DbExecutor, inputs: AuditEventInput[]): Promise<void>;
21
+ export declare function enqueueSessionPacketJob(db: DbExecutor, input: SessionPacketJobInput): Promise<void>;
22
+ export declare function enqueueSessionPacketJobs(db: DbExecutor, inputs: SessionPacketJobInput[]): Promise<void>;
23
+ export declare function recordFinishedSubjectErasureJob(db: DbExecutor, input: {
24
+ orgId: string;
25
+ appId: string;
26
+ subjectId: string;
27
+ deletedSessions: number;
28
+ }): Promise<void>;
29
+ export {};
30
+ //# sourceMappingURL=server-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-db.d.ts","sourceRoot":"","sources":["../src/server-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,KAAK,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,qBAAqB,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,UAAU,EACd,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,57 @@
1
+ export async function writeAuditEvent(db, input) {
2
+ await writeAuditEvents(db, [input]);
3
+ }
4
+ export async function writeAuditEvents(db, inputs) {
5
+ if (inputs.length === 0) {
6
+ return;
7
+ }
8
+ await db
9
+ .insertInto("audit_events")
10
+ .values(inputs.map((input) => ({
11
+ org_id: input.orgId ?? null,
12
+ app_id: input.appId ?? null,
13
+ actor_key_id: input.actorKeyId ?? null,
14
+ action: input.action,
15
+ target_type: input.targetType,
16
+ target_id: input.targetId ?? null,
17
+ metadata: input.metadata ?? {}
18
+ })))
19
+ .execute();
20
+ }
21
+ export async function enqueueSessionPacketJob(db, input) {
22
+ await enqueueSessionPacketJobs(db, [input]);
23
+ }
24
+ export async function enqueueSessionPacketJobs(db, inputs) {
25
+ if (inputs.length === 0) {
26
+ return;
27
+ }
28
+ await db
29
+ .insertInto("maintenance_jobs")
30
+ .values(inputs.map((input) => ({
31
+ type: "generate_session_packet",
32
+ status: "queued",
33
+ org_id: input.orgId,
34
+ app_id: input.appId,
35
+ session_id: input.sessionId,
36
+ payload: input.reason ? { reason: input.reason } : {}
37
+ })))
38
+ .execute();
39
+ }
40
+ export async function recordFinishedSubjectErasureJob(db, input) {
41
+ await db
42
+ .insertInto("maintenance_jobs")
43
+ .values({
44
+ type: "subject_erasure",
45
+ status: "finished",
46
+ org_id: input.orgId,
47
+ app_id: input.appId,
48
+ session_id: null,
49
+ payload: {
50
+ subjectId: input.subjectId,
51
+ deletedSessions: input.deletedSessions
52
+ },
53
+ finished_at: new Date()
54
+ })
55
+ .execute();
56
+ }
57
+ //# sourceMappingURL=server-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-db.js","sourceRoot":"","sources":["../src/server-db.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,KAAsB;IAEtB,MAAM,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAc,EACd,MAAyB;IAEzB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,EAAE;SACL,UAAU,CAAC,cAAc,CAAC;SAC1B,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC3B,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC3B,YAAY,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;KAC/B,CAAC,CAAC,CACJ;SACA,OAAO,EAAE,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAc,EACd,KAA4B;IAE5B,MAAM,wBAAwB,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAc,EACd,MAA+B;IAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,EAAE;SACL,UAAU,CAAC,kBAAkB,CAAC;SAC9B,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;KACtD,CAAC,CAAC,CACJ;SACA,OAAO,EAAE,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,EAAc,EACd,KAKC;IAED,MAAM,EAAE;SACL,UAAU,CAAC,kBAAkB,CAAC;SAC9B,MAAM,CAAC;QACN,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,eAAe,EAAE,KAAK,CAAC,eAAe;SACvC;QACD,WAAW,EAAE,IAAI,IAAI,EAAE;KACxB,CAAC;SACD,OAAO,EAAE,CAAC;AACf,CAAC"}
@@ -0,0 +1,119 @@
1
+ export declare const API_SCOPES: readonly ["admin", "read", "read:raw", "annotate", "erase"];
2
+ export type ApiScope = (typeof API_SCOPES)[number];
3
+ export type Compression = "none" | "gzip";
4
+ export type ConsoleCaptureMode = "all" | "errors" | "warnings" | "off";
5
+ export type NetworkCaptureMode = "metadata" | "off";
6
+ export interface PrivacyConfig {
7
+ maskSelectors: string[];
8
+ blockSelectors: string[];
9
+ consoleCapture: ConsoleCaptureMode;
10
+ networkCapture: NetworkCaptureMode;
11
+ redactConsole: boolean;
12
+ maxConsoleMessageLength: number;
13
+ maxConsoleArgsDepth: number;
14
+ }
15
+ export interface SdkConfigResponse {
16
+ appId: string;
17
+ publicKey: string;
18
+ samplingRate: number;
19
+ retentionDays: number;
20
+ privacy: PrivacyConfig;
21
+ allowRawIdentity: boolean;
22
+ sessionTokenTtlSeconds: number;
23
+ }
24
+ export type UnifiedEventKind = "rrweb" | "console" | "network" | "route" | "viewport" | "lifecycle";
25
+ export interface BaseEnvelope<TKind extends UnifiedEventKind, TPayload> {
26
+ kind: TKind;
27
+ timestamp: number;
28
+ sessionTimeMs: number;
29
+ url?: string;
30
+ payload: TPayload;
31
+ }
32
+ export type RrwebEnvelope = BaseEnvelope<"rrweb", Record<string, unknown>>;
33
+ export type ConsoleEnvelope = BaseEnvelope<"console", {
34
+ level: "log" | "info" | "warn" | "error" | "debug";
35
+ message: string;
36
+ args?: unknown[];
37
+ stack?: string;
38
+ redacted: boolean;
39
+ }>;
40
+ export type NetworkEnvelope = BaseEnvelope<"network", {
41
+ method: string;
42
+ url: string;
43
+ path: string;
44
+ status?: number;
45
+ durationMs: number;
46
+ ok?: boolean;
47
+ failed: boolean;
48
+ requestId?: string;
49
+ error?: string;
50
+ }>;
51
+ export type RouteEnvelope = BaseEnvelope<"route", {
52
+ from?: string;
53
+ to: string;
54
+ navigationType: "initial" | "push" | "replace" | "pop";
55
+ }>;
56
+ export type ViewportEnvelope = BaseEnvelope<"viewport", {
57
+ width: number;
58
+ height: number;
59
+ devicePixelRatio: number;
60
+ }>;
61
+ export type LifecycleEnvelope = BaseEnvelope<"lifecycle", {
62
+ name: "sdk_started" | "sdk_stopped" | "visibility" | "click" | "input" | "form_submit" | "session_finalized";
63
+ data?: Record<string, unknown>;
64
+ }>;
65
+ export type UnifiedEventEnvelope = RrwebEnvelope | ConsoleEnvelope | NetworkEnvelope | RouteEnvelope | ViewportEnvelope | LifecycleEnvelope;
66
+ export declare const MARKER_TYPES: readonly ["first_error", "rage_click", "dead_click", "abandonment", "slow_network", "failed_network", "console_error", "missing_release"];
67
+ export type MarkerType = (typeof MARKER_TYPES)[number];
68
+ export interface DerivedMarker {
69
+ type: MarkerType;
70
+ timestampMs: number;
71
+ severity: "info" | "warning" | "error";
72
+ label: string;
73
+ data: Record<string, unknown>;
74
+ }
75
+ export interface SessionPacket {
76
+ sessionId: string;
77
+ appId: string;
78
+ generatedAt: string;
79
+ summary: {
80
+ whatUserTried: string;
81
+ stuckAt?: string;
82
+ firstError?: string;
83
+ abandonedAt?: string;
84
+ releaseMissing: boolean;
85
+ eventCount: number;
86
+ };
87
+ bookmarks: DerivedMarker[];
88
+ routes: Array<{
89
+ to: string;
90
+ timestampMs: number;
91
+ }>;
92
+ consoleErrors: Array<{
93
+ message: string;
94
+ timestampMs: number;
95
+ }>;
96
+ network: {
97
+ failed: Array<{
98
+ path: string;
99
+ status?: number;
100
+ timestampMs: number;
101
+ }>;
102
+ slow: Array<{
103
+ path: string;
104
+ durationMs: number;
105
+ timestampMs: number;
106
+ }>;
107
+ requestIds: string[];
108
+ };
109
+ }
110
+ export interface ChunkUpload {
111
+ sequence: number;
112
+ compression: Compression;
113
+ eventCount: number;
114
+ firstEventAtMs: number;
115
+ lastEventAtMs: number;
116
+ payloadBase64: string;
117
+ payloadSha256?: string;
118
+ }
119
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,18 @@
1
+ export const API_SCOPES = [
2
+ "admin",
3
+ "read",
4
+ "read:raw",
5
+ "annotate",
6
+ "erase"
7
+ ];
8
+ export const MARKER_TYPES = [
9
+ "first_error",
10
+ "rage_click",
11
+ "dead_click",
12
+ "abandonment",
13
+ "slow_network",
14
+ "failed_network",
15
+ "console_error",
16
+ "missing_release"
17
+ ];
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO;IACP,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;CACC,CAAC;AAkHX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,iBAAiB;CACT,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@panda-replay/shared",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist/**/*.d.ts",
9
+ "dist/**/*.d.ts.map",
10
+ "dist/**/*.js",
11
+ "dist/**/*.js.map"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ },
18
+ "./db": {
19
+ "types": "./dist/db.d.ts",
20
+ "import": "./dist/db.js"
21
+ },
22
+ "./server-db": {
23
+ "types": "./dist/server-db.d.ts",
24
+ "import": "./dist/server-db.js"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "fflate": "^0.8.2",
29
+ "zod": "^4.1.13"
30
+ },
31
+ "peerDependencies": {
32
+ "kysely": "^0.28.8"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "kysely": {
36
+ "optional": true
37
+ }
38
+ },
39
+ "devDependencies": {
40
+ "kysely": "^0.28.8",
41
+ "typescript": "^5.9.3"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc -p tsconfig.json",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit"
46
+ }
47
+ }