@reprova/sdk 0.2.0 → 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/dist/kysely.js ADDED
@@ -0,0 +1,172 @@
1
+ import { contextStorage } from './context.js';
2
+ const OP_BY_KIND = {
3
+ SelectQueryNode: 'select',
4
+ InsertQueryNode: 'insert',
5
+ UpdateQueryNode: 'update',
6
+ DeleteQueryNode: 'delete',
7
+ MergeQueryNode: 'merge',
8
+ };
9
+ // TableNode → its identifier name; unwraps an AliasNode (`from('t as x')`).
10
+ function tableName(node) {
11
+ const n = node;
12
+ if (!n || typeof n !== 'object')
13
+ return undefined;
14
+ if (n.kind === 'AliasNode')
15
+ return tableName(n.node);
16
+ if (n.kind === 'TableNode') {
17
+ const table = n.table;
18
+ return table?.identifier?.name;
19
+ }
20
+ return undefined;
21
+ }
22
+ // The operation's principal table, read from the op-specific field.
23
+ function primaryTable(node) {
24
+ switch (node.kind) {
25
+ case 'SelectQueryNode':
26
+ case 'DeleteQueryNode': {
27
+ const from = node.from;
28
+ return tableName(from?.froms?.[0]);
29
+ }
30
+ case 'InsertQueryNode':
31
+ return tableName(node.into);
32
+ case 'UpdateQueryNode':
33
+ return tableName(node.table);
34
+ default:
35
+ return undefined;
36
+ }
37
+ }
38
+ // Every table referenced anywhere in the query (joins, subqueries, CTEs, …),
39
+ // in first-seen order. A bounded deep-walk — instrumentation must not blow the
40
+ // stack or hang on a pathological tree.
41
+ function collectTables(root) {
42
+ const found = [];
43
+ const seen = new Set();
44
+ const stack = [root];
45
+ let budget = 5000;
46
+ while (stack.length && budget-- > 0) {
47
+ const cur = stack.pop();
48
+ if (!cur || typeof cur !== 'object')
49
+ continue;
50
+ const name = tableName(cur);
51
+ if (name && !seen.has(name)) {
52
+ seen.add(name);
53
+ found.push(name);
54
+ }
55
+ for (const v of Object.values(cur)) {
56
+ if (v && typeof v === 'object')
57
+ stack.push(v);
58
+ }
59
+ }
60
+ return found;
61
+ }
62
+ // Column NAMES referenced inside a WhereNode subtree — never values.
63
+ function whereColumns(whereNode) {
64
+ const cols = new Set();
65
+ const stack = [whereNode];
66
+ let budget = 5000;
67
+ while (stack.length && budget-- > 0) {
68
+ const cur = stack.pop();
69
+ if (!cur || typeof cur !== 'object')
70
+ continue;
71
+ const n = cur;
72
+ if (n.kind === 'ColumnNode') {
73
+ const col = n.column;
74
+ if (col?.name)
75
+ cols.add(col.name);
76
+ }
77
+ for (const v of Object.values(n)) {
78
+ if (v && typeof v === 'object')
79
+ stack.push(v);
80
+ }
81
+ }
82
+ return [...cols].sort();
83
+ }
84
+ function extractPks(rows, pkCols) {
85
+ if (pkCols.length === 0)
86
+ return [];
87
+ // A set: a join can return the same primary-table row many times, but the
88
+ // footprint records which DISTINCT rows were touched.
89
+ const seen = new Set();
90
+ const pks = [];
91
+ for (const row of rows) {
92
+ const vals = pkCols.map((c) => row[c]);
93
+ if (vals.some((v) => v === undefined))
94
+ continue; // column not selected — can't form a PK
95
+ const pk = vals.map((v) => String(v)).join(':');
96
+ if (!seen.has(pk)) {
97
+ seen.add(pk);
98
+ pks.push(pk);
99
+ }
100
+ }
101
+ return pks;
102
+ }
103
+ // Creates the Reprova Kysely footprint plugin.
104
+ // Usage: new Kysely({ dialect, plugins: [createKyselyPlugin()] })
105
+ export function createKyselyPlugin(opts = {}) {
106
+ const primaryKey = opts.primaryKey ?? (() => ['id']);
107
+ const captureWhereShape = opts.captureWhereShape !== false;
108
+ // Keyed by the queryId OBJECT shared across both hooks; a compiled-but-never-
109
+ // executed query is GC'd without leaking.
110
+ const pending = new WeakMap();
111
+ return {
112
+ transformQuery(args) {
113
+ try {
114
+ const node = args.node;
115
+ const op = OP_BY_KIND[node.kind];
116
+ if (op) {
117
+ const whereShape = captureWhereShape && node.where
118
+ ? whereColumns(node.where).join(',') || undefined
119
+ : undefined;
120
+ pending.set(args.queryId, {
121
+ op,
122
+ primary: primaryTable(node),
123
+ tables: collectTables(node),
124
+ whereShape,
125
+ });
126
+ }
127
+ }
128
+ catch {
129
+ // A footprint failure must never alter the query — fall through.
130
+ }
131
+ return args.node;
132
+ },
133
+ async transformResult(args) {
134
+ try {
135
+ const meta = pending.get(args.queryId);
136
+ if (meta) {
137
+ pending.delete(args.queryId);
138
+ const ctx = contextStorage.getStore();
139
+ if (ctx) {
140
+ const result = args.result;
141
+ const rows = result.rows ?? [];
142
+ const affected = result.numAffectedRows != null ? Number(result.numAffectedRows) : undefined;
143
+ const count = rows.length || affected || 0;
144
+ const primary = meta.primary ?? '$unknown';
145
+ const entry = {
146
+ model: primary,
147
+ op: meta.op,
148
+ pks: extractPks(rows, primaryKey(primary)),
149
+ where_shape: meta.whereShape,
150
+ count,
151
+ note: count === 0 ? 'returned 0 rows' : undefined,
152
+ };
153
+ ctx.footprint.push(entry);
154
+ // Joined / subquery tables: recorded so the extractor knows they
155
+ // were touched, but without PKs (result columns can't be reliably
156
+ // attributed across a join).
157
+ for (const t of meta.tables) {
158
+ if (t === primary)
159
+ continue;
160
+ ctx.footprint.push({ model: t, op: meta.op, pks: [], count: 0, note: 'referenced (join/subquery)' });
161
+ }
162
+ }
163
+ }
164
+ }
165
+ catch {
166
+ // Never break the result pipeline over a footprint error.
167
+ }
168
+ return args.result;
169
+ },
170
+ };
171
+ }
172
+ //# sourceMappingURL=kysely.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kysely.js","sourceRoot":"","sources":["../src/kysely.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export interface CapturePayload {
2
- trigger: 'unhandled_exception' | 'http_5xx' | 'manual_capture' | 'orm_error' | 'job_failure';
2
+ trigger: 'unhandled_exception' | 'http_5xx' | 'manual_capture' | 'orm_error' | 'job_failure' | 'frontend_error';
3
3
  trace_id: string;
4
4
  timestamp: string;
5
5
  release: string;
@@ -38,6 +38,63 @@ export interface CapturePayload {
38
38
  status: number;
39
39
  response_body?: string;
40
40
  recorded_for_replay: boolean;
41
+ duration_ms?: number;
42
+ outcome?: 'success' | 'timeout' | 'network_error';
43
+ }>;
44
+ browser?: {
45
+ page_url: string;
46
+ user_agent: string;
47
+ breadcrumbs?: Array<{
48
+ type: 'click' | 'navigation';
49
+ label: string;
50
+ offset_ms: number;
51
+ }>;
52
+ api_calls?: Array<{
53
+ method: string;
54
+ host: string;
55
+ path: string;
56
+ status: number;
57
+ trace_id: string;
58
+ duration_ms: number;
59
+ offset_ms: number;
60
+ }>;
61
+ };
62
+ concurrent_requests?: Array<{
63
+ trace_id: string;
64
+ offset_ms: number;
65
+ state: 'in_flight' | 'completed';
66
+ duration_ms?: number;
67
+ request: {
68
+ method: string;
69
+ path: string;
70
+ headers: Record<string, string>;
71
+ body: string;
72
+ auth_claims?: {};
73
+ };
74
+ data_footprint?: {
75
+ queries: Array<{
76
+ model: string;
77
+ op: string;
78
+ pks: Array<string>;
79
+ where_shape?: string;
80
+ count: number;
81
+ note?: string;
82
+ }>;
83
+ };
84
+ }>;
85
+ }
86
+ export interface DataAudit {
87
+ agent_id?: string;
88
+ ran_at: string;
89
+ duration_ms: number;
90
+ tables_scanned: number;
91
+ checks_run: number;
92
+ findings: Array<{
93
+ type: 'orphaned_fk' | 'not_valid_constraint_violation' | 'check_skipped';
94
+ table: string;
95
+ detail: string;
96
+ count?: number;
97
+ sample_pks?: Array<string>;
41
98
  }>;
42
99
  }
43
100
  export interface Issue {
@@ -66,6 +123,11 @@ export interface JobPlan {
66
123
  anonymization_ruleset_id: string;
67
124
  migration_id: string;
68
125
  recipient_age_pubkey: string;
126
+ job_type?: 'reproduction' | 'clone';
127
+ clone_rules?: {
128
+ rows_per_table: number;
129
+ include_audit_findings: boolean;
130
+ };
69
131
  }
70
132
  export interface Manifest {
71
133
  package_id: string;
@@ -108,6 +170,8 @@ export interface ReplayVerdict {
108
170
  local_release: string;
109
171
  ran_by: string;
110
172
  ran_at: string;
173
+ iterations?: number;
174
+ reproductions?: number;
111
175
  }
112
176
  export interface SignedJobPlan {
113
177
  plan: string;
@@ -1 +1 @@
1
- {"version":3,"file":"proto.gen.d.ts","sourceRoot":"","sources":["../src/proto.gen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proto.gen.d.ts","sourceRoot":"","sources":["../src/proto.gen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ReprovaContext, FootprintQuery } from './context.js';
2
+ export declare function registerContext(ctx: ReprovaContext): void;
3
+ export declare function completeContext(ctx: ReprovaContext): void;
4
+ export interface ConcurrentRequestSnapshot {
5
+ trace_id: string;
6
+ offset_ms: number;
7
+ state: 'in_flight' | 'completed';
8
+ duration_ms?: number;
9
+ request: {
10
+ method: string;
11
+ path: string;
12
+ headers: Record<string, string>;
13
+ body: string;
14
+ auth_claims?: Record<string, unknown>;
15
+ };
16
+ data_footprint?: {
17
+ queries: FootprintQuery[];
18
+ };
19
+ }
20
+ export declare function snapshotCohort(failing: ReprovaContext): ConcurrentRequestSnapshot[];
21
+ export declare function resetRegistryForTests(): void;
22
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyBnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAEzD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQzD;AAID,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC;IACF,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;CAChD;AAOD,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,yBAAyB,EAAE,CAmBnF;AA2BD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
@@ -0,0 +1,70 @@
1
+ import { stripHeaders } from './stack.js';
2
+ const active = new Set();
3
+ const recent = [];
4
+ const RECENT_CAP = 16;
5
+ const RETENTION_MS = 5000;
6
+ const COHORT_CAP = 8; // must match capture_payload.json's maxItems
7
+ const BODY_CAP = 16 * 1024;
8
+ const FOOTPRINT_QUERY_CAP = 200;
9
+ export function registerContext(ctx) {
10
+ active.add(ctx);
11
+ }
12
+ export function completeContext(ctx) {
13
+ // 'finish' and 'close' can both fire for one response — only move once.
14
+ if (!active.delete(ctx))
15
+ return;
16
+ recent.push({ ctx, endedAt: new Date() });
17
+ const cutoff = Date.now() - RETENTION_MS;
18
+ while (recent.length > RECENT_CAP || (recent.length > 0 && recent[0].endedAt.getTime() < cutoff)) {
19
+ recent.shift();
20
+ }
21
+ }
22
+ // snapshotCohort returns every other request that overlapped the failing one:
23
+ // all currently-active contexts, plus recently-completed ones that ended at or
24
+ // after the failing request started (their writes shaped the state the failing
25
+ // request saw). offset_ms is signed: negative = started before the failing
26
+ // request. Sorted nearest-first, capped at COHORT_CAP.
27
+ export function snapshotCohort(failing) {
28
+ const failingStart = failing.capturedAt.getTime();
29
+ const out = [];
30
+ for (const ctx of active) {
31
+ if (ctx === failing)
32
+ continue;
33
+ out.push(toSnapshot(ctx, failingStart, 'in_flight'));
34
+ }
35
+ const cutoff = Date.now() - RETENTION_MS;
36
+ for (const { ctx, endedAt } of recent) {
37
+ if (ctx === failing)
38
+ continue;
39
+ if (endedAt.getTime() < cutoff)
40
+ continue;
41
+ if (endedAt.getTime() < failingStart)
42
+ continue; // ended before the failing request began — no overlap
43
+ out.push(toSnapshot(ctx, failingStart, 'completed', endedAt));
44
+ }
45
+ out.sort((a, b) => Math.abs(a.offset_ms) - Math.abs(b.offset_ms));
46
+ return out.slice(0, COHORT_CAP);
47
+ }
48
+ function toSnapshot(ctx, failingStart, state, endedAt) {
49
+ const startMs = ctx.capturedAt.getTime();
50
+ return {
51
+ trace_id: ctx.traceId,
52
+ offset_ms: startMs - failingStart,
53
+ state,
54
+ duration_ms: endedAt ? endedAt.getTime() - startMs : undefined,
55
+ request: {
56
+ method: ctx.request.method,
57
+ path: ctx.request.path,
58
+ headers: stripHeaders(ctx.request.headers),
59
+ body: ctx.request.body.slice(0, BODY_CAP),
60
+ auth_claims: ctx.request.authClaims,
61
+ },
62
+ data_footprint: ctx.footprint.length > 0 ? { queries: ctx.footprint.slice(0, FOOTPRINT_QUERY_CAP) } : undefined,
63
+ };
64
+ }
65
+ // Test hook: clears all registry state between tests.
66
+ export function resetRegistryForTests() {
67
+ active.clear();
68
+ recent.length = 0;
69
+ }
70
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/sdk.d.ts CHANGED
@@ -1,25 +1,35 @@
1
- import type { Response, RequestHandler, ErrorRequestHandler } from 'express';
2
- import { type ReprovaContext } from './context.js';
1
+ import type { Express, Response, RequestHandler, ErrorRequestHandler } from 'express';
2
+ import { type ReprovaContext, type FootprintQuery } from './context.js';
3
3
  export interface ReprovaOptions {
4
- dsn: string;
4
+ dsn?: string;
5
5
  release: string;
6
6
  environment?: string;
7
7
  recordOutbound?: {
8
8
  allowHosts?: string[];
9
9
  denyHosts?: string[];
10
10
  };
11
+ instrumentHttp?: boolean;
12
+ processHandlers?: boolean;
11
13
  }
14
+ export declare function forwardAsyncErrors(app: object): void;
15
+ export declare function replayErrorHandler(): ErrorRequestHandler;
12
16
  export declare class Reprova {
13
17
  private readonly opts;
14
18
  private readonly transport;
15
19
  readonly release: string;
16
- readonly sdkVersion = "0.1.0";
20
+ readonly sdkVersion = "0.4.0";
21
+ readonly disabled: boolean;
17
22
  private migrationId;
18
23
  private readonly outboundOpts;
19
24
  constructor(opts: ReprovaOptions);
20
25
  static init(opts: ReprovaOptions): Reprova;
21
26
  static getInstance(): Reprova | null;
22
27
  setMigrationId(id: string): void;
28
+ instrumentPrisma(client: unknown, opts?: {
29
+ dmmf?: unknown;
30
+ readMigrationId?: boolean;
31
+ }): Promise<void>;
32
+ setupExpress(app: Express): void;
23
33
  requestHandler(): RequestHandler;
24
34
  errorHandler(): ErrorRequestHandler;
25
35
  captureError(err: Error, opts?: {
@@ -33,6 +43,16 @@ export declare class Reprova {
33
43
  };
34
44
  }): void;
35
45
  attachProcessHandlers(): void;
46
+ runWithContext<T>(info: {
47
+ name?: string;
48
+ method?: string;
49
+ path?: string;
50
+ headers?: Record<string, string>;
51
+ body?: string;
52
+ }, fn: () => T | Promise<T>): Promise<T>;
53
+ runJob<T>(name: string, fn: () => T | Promise<T>): Promise<T>;
54
+ private runInContext;
55
+ recordFootprint(query: FootprintQuery): void;
36
56
  private patchOutbound;
37
57
  [Symbol.asyncDispose](): Promise<void>;
38
58
  }
package/dist/sdk.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,QAAQ,EAAgB,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAKnE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACH;AAID,qBAAa,OAAO;IAON,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,WAAW;IAC9B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;gBAEnC,IAAI,EAAE,cAAc;IAWjD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAM1C,MAAM,CAAC,WAAW,IAAI,OAAO,GAAG,IAAI;IAEpC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAGhC,cAAc,IAAI,cAAc;IAqBhC,YAAY,IAAI,mBAAmB;IAWnC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAM3D,cAAc,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAajF,OAAO,CACL,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,cAAc,GAAG,SAAS,EAC/B,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GACtD,IAAI;IAgCP,qBAAqB,IAAI,IAAI;IAe7B,OAAO,CAAC,aAAa;IA6Cf,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAS9D"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}