@descryy/runtime-database-observation 0.5.1 → 0.5.3

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.
Files changed (56) hide show
  1. package/dist/index.d.ts +7 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/mysql-row-collector.d.ts +33 -19
  6. package/dist/mysql-row-collector.d.ts.map +1 -1
  7. package/dist/mysql-row-collector.js +480 -26
  8. package/dist/mysql-row-collector.js.map +1 -1
  9. package/dist/postgres-log-parser.d.ts +15 -29
  10. package/dist/postgres-log-parser.d.ts.map +1 -1
  11. package/dist/postgres-log-parser.js +103 -32
  12. package/dist/postgres-log-parser.js.map +1 -1
  13. package/dist/postgres-log-source.d.ts +2 -0
  14. package/dist/postgres-log-source.d.ts.map +1 -1
  15. package/dist/postgres-log-source.js +171 -35
  16. package/dist/postgres-log-source.js.map +1 -1
  17. package/dist/postgres-query-collector.d.ts.map +1 -1
  18. package/dist/postgres-query-collector.js +43 -13
  19. package/dist/postgres-query-collector.js.map +1 -1
  20. package/dist/postgres-row-collector.d.ts +9 -0
  21. package/dist/postgres-row-collector.d.ts.map +1 -1
  22. package/dist/postgres-row-collector.js +114 -18
  23. package/dist/postgres-row-collector.js.map +1 -1
  24. package/dist/prisma-instrumentation.d.ts +20 -0
  25. package/dist/prisma-instrumentation.d.ts.map +1 -0
  26. package/dist/prisma-instrumentation.js +99 -0
  27. package/dist/prisma-instrumentation.js.map +1 -0
  28. package/dist/query-collector.d.ts +2 -0
  29. package/dist/query-collector.d.ts.map +1 -1
  30. package/dist/query-collector.js +38 -13
  31. package/dist/query-collector.js.map +1 -1
  32. package/dist/query-line-parser.d.ts.map +1 -1
  33. package/dist/query-line-parser.js +2 -1
  34. package/dist/query-line-parser.js.map +1 -1
  35. package/dist/query-marker.d.ts +10 -1
  36. package/dist/query-marker.d.ts.map +1 -1
  37. package/dist/query-marker.js +2 -0
  38. package/dist/query-marker.js.map +1 -1
  39. package/dist/row-capture-policy.d.ts +31 -0
  40. package/dist/row-capture-policy.d.ts.map +1 -0
  41. package/dist/row-capture-policy.js +95 -0
  42. package/dist/row-capture-policy.js.map +1 -0
  43. package/dist/smoke.d.ts +2 -0
  44. package/dist/smoke.d.ts.map +1 -0
  45. package/dist/smoke.js +28 -0
  46. package/dist/smoke.js.map +1 -0
  47. package/dist/sqlite-instrumentation.js +9 -2
  48. package/dist/sqlite-instrumentation.js.map +1 -1
  49. package/dist/sqlite-row-snapshot.d.ts +4 -0
  50. package/dist/sqlite-row-snapshot.d.ts.map +1 -1
  51. package/dist/sqlite-row-snapshot.js +153 -25
  52. package/dist/sqlite-row-snapshot.js.map +1 -1
  53. package/dist/table-extraction.d.ts.map +1 -1
  54. package/dist/table-extraction.js +124 -5
  55. package/dist/table-extraction.js.map +1 -1
  56. package/package.json +10 -8
@@ -19,12 +19,21 @@
19
19
  * -- one line of structured JSON, never prose.
20
20
  */
21
21
  export declare const QUERY_MARKER = "DESCRY_DB_QUERY";
22
- export type CapturedMethod = "exec" | "prepare" | "run" | "get" | "all";
22
+ export declare const MAX_CAPTURED_STATEMENT_CHARS: number;
23
+ export declare const MAX_CAPTURED_ERROR_CHARS: number;
24
+ /** `prisma`: a statement Prisma's query engine reported running, read off its tracing spans. */
25
+ export type CapturedMethod = "exec" | "prepare" | "run" | "get" | "all" | "prisma";
23
26
  export interface CapturedQuery {
24
27
  readonly sql: string;
25
28
  readonly method: CapturedMethod;
26
29
  readonly durationMs: number;
27
30
  readonly success: boolean;
28
31
  readonly error: string | null;
32
+ /**
33
+ * `false` when the source reports that a statement ran but not whether it succeeded (a Prisma
34
+ * engine span carries no outcome). `success` is then not a claim. Absent means known.
35
+ */
36
+ readonly outcomeKnown?: false;
37
+ readonly sqlTruncated?: true;
29
38
  }
30
39
  //# sourceMappingURL=query-marker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-marker.d.ts","sourceRoot":"","sources":["../src/query-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,eAAO,MAAM,YAAY,oBAAsC,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B"}
1
+ {"version":3,"file":"query-marker.d.ts","sourceRoot":"","sources":["../src/query-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,eAAO,MAAM,YAAY,oBAAsC,CAAC;AAEhE,eAAO,MAAM,4BAA4B,QAAa,CAAC;AACvD,eAAO,MAAM,wBAAwB,QAAW,CAAC;AAEjD,gGAAgG;AAChG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B"}
@@ -22,4 +22,6 @@ import { RESERVED_MARKER_PREFIX } from "@descryy/runtime-contracts";
22
22
  // Derived, not spelled again -- RESERVED_MARKER_PREFIX is what the backend
23
23
  // log collector skips on; a marker without it reads as application output.
24
24
  export const QUERY_MARKER = `${RESERVED_MARKER_PREFIX}DB_QUERY`;
25
+ export const MAX_CAPTURED_STATEMENT_CHARS = 256 * 1024;
26
+ export const MAX_CAPTURED_ERROR_CHARS = 8 * 1024;
25
27
  //# sourceMappingURL=query-marker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-marker.js","sourceRoot":"","sources":["../src/query-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,sBAAsB,UAAU,CAAC"}
1
+ {"version":3,"file":"query-marker.js","sourceRoot":"","sources":["../src/query-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,sBAAsB,UAAU,CAAC;AAEhE,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,IAAI,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface RowCapturePolicy {
2
+ readonly tables?: readonly string[];
3
+ readonly excludedColumns?: readonly string[];
4
+ }
5
+ export declare const WITHHELD_MARKER = "[WITHHELD]";
6
+ export declare const MAX_CELL_CHARACTERS = 4096;
7
+ export declare const MAX_SNAPSHOT_BYTES: number;
8
+ export declare function isCredentialLikeColumn(column: string): boolean;
9
+ export declare function approximateCellBytes(value: unknown): number;
10
+ export interface FilteredRow {
11
+ readonly row: Record<string, unknown> | null;
12
+ readonly withheld: readonly string[];
13
+ readonly truncated: readonly string[];
14
+ }
15
+ export interface ResolvedRowCapturePolicy {
16
+ readonly tables: readonly string[] | null;
17
+ allows(table: string, schema?: string): boolean;
18
+ filterRow(row: Record<string, unknown> | null): FilteredRow;
19
+ describe(missingTables?: readonly string[]): string;
20
+ }
21
+ export type RowCapturePolicyResolution = {
22
+ readonly ok: true;
23
+ readonly policy: ResolvedRowCapturePolicy;
24
+ } | {
25
+ readonly ok: false;
26
+ readonly reason: string;
27
+ };
28
+ export declare function resolveRowCapturePolicy(policy: RowCapturePolicy | undefined): RowCapturePolicyResolution;
29
+ export declare function mergeTruncated(...lists: readonly (readonly string[])[]): readonly string[];
30
+ export declare function mergeWithheld(...lists: readonly (readonly string[])[]): readonly string[];
31
+ //# sourceMappingURL=row-capture-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-capture-policy.d.ts","sourceRoot":"","sources":["../src/row-capture-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,kBAAkB,QAAmB,CAAC;AAKnD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI3D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC;CACrD;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAsBpD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,0BAA0B,CAmDxG;AAED,wBAAgB,cAAc,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,MAAM,EAAE,CAE1F;AAED,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,MAAM,EAAE,CAEzF"}
@@ -0,0 +1,95 @@
1
+ export const WITHHELD_MARKER = "[WITHHELD]";
2
+ export const MAX_CELL_CHARACTERS = 4_096;
3
+ export const MAX_SNAPSHOT_BYTES = 64 * 1024 * 1024;
4
+ const CREDENTIAL_LIKE_COLUMN = /(?:^|_)(?:password|passwd|pwd|passphrase|secret|token|apikey|api_key|private_key|privatekey|credentials?|salt|otp|ssn)(?:_|$)|_hash$|^hash$/i;
5
+ export function isCredentialLikeColumn(column) {
6
+ return CREDENTIAL_LIKE_COLUMN.test(column);
7
+ }
8
+ export function approximateCellBytes(value) {
9
+ if (typeof value === "string")
10
+ return value.length;
11
+ if (value === null || value === undefined)
12
+ return 1;
13
+ return 16;
14
+ }
15
+ function normalisedList(values, field) {
16
+ if (values === undefined)
17
+ return null;
18
+ if (!Array.isArray(values) || values.length === 0) {
19
+ return `rowCapture.${field} must be a non-empty list when given; omit it instead of passing an empty one.`;
20
+ }
21
+ const normalised = [];
22
+ for (const value of values) {
23
+ if (typeof value !== "string" || value.trim() === "") {
24
+ return `rowCapture.${field} contains a blank or non-string entry (${JSON.stringify(value)}); every entry must name something.`;
25
+ }
26
+ normalised.push(value.trim().toLowerCase());
27
+ }
28
+ return [...new Set(normalised)];
29
+ }
30
+ function boundCell(value) {
31
+ if (typeof value !== "string" || value.length <= MAX_CELL_CHARACTERS)
32
+ return { value, truncated: false };
33
+ return { value: `${value.slice(0, MAX_CELL_CHARACTERS)}...[truncated, ${String(value.length)} characters]`, truncated: true };
34
+ }
35
+ export function resolveRowCapturePolicy(policy) {
36
+ const tables = normalisedList(policy?.tables, "tables");
37
+ if (typeof tables === "string")
38
+ return { ok: false, reason: tables };
39
+ const excluded = normalisedList(policy?.excludedColumns, "excludedColumns");
40
+ if (typeof excluded === "string")
41
+ return { ok: false, reason: excluded };
42
+ const excludedSet = new Set(excluded ?? []);
43
+ const withholdsByDefault = excluded === null;
44
+ return {
45
+ ok: true,
46
+ policy: {
47
+ tables,
48
+ allows(table, schema) {
49
+ if (tables === null)
50
+ return true;
51
+ const bare = table.toLowerCase();
52
+ const qualified = schema === undefined ? null : `${schema.toLowerCase()}.${bare}`;
53
+ return tables.includes(bare) || (qualified !== null && tables.includes(qualified));
54
+ },
55
+ filterRow(row) {
56
+ if (row === null)
57
+ return { row, withheld: [], truncated: [] };
58
+ const withheld = [];
59
+ const truncated = [];
60
+ const filtered = {};
61
+ for (const [column, value] of Object.entries(row)) {
62
+ const isWithheld = excludedSet.has(column.toLowerCase()) || (withholdsByDefault && isCredentialLikeColumn(column));
63
+ if (isWithheld) {
64
+ filtered[column] = WITHHELD_MARKER;
65
+ withheld.push(column);
66
+ continue;
67
+ }
68
+ const bounded = boundCell(value);
69
+ filtered[column] = bounded.value;
70
+ if (bounded.truncated)
71
+ truncated.push(column);
72
+ }
73
+ return { row: filtered, withheld, truncated };
74
+ },
75
+ describe(missingTables = []) {
76
+ const scope = tables === null
77
+ ? "every table is captured: no rowCapture.tables allowlist was declared."
78
+ : `only these tables are captured (rowCapture.tables): ${tables.join(", ")}.`;
79
+ const missing = missingTables.length > 0 ? ` Allowlisted but not present in the database: ${missingTables.join(", ")}.` : "";
80
+ const columns = excludedSet.size > 0
81
+ ? ` Columns withheld by name: ${[...excludedSet].join(", ")}.`
82
+ : " No rowCapture.excludedColumns were declared, so columns whose names look like credentials (password, secret, token, api key, salt, hash and similar) are withheld by default.";
83
+ const cells = ` Text values longer than ${String(MAX_CELL_CHARACTERS)} characters are truncated and listed as truncatedColumns.`;
84
+ return `${scope}${missing}${columns}${cells}`;
85
+ },
86
+ },
87
+ };
88
+ }
89
+ export function mergeTruncated(...lists) {
90
+ return [...new Set(lists.flat())].sort();
91
+ }
92
+ export function mergeWithheld(...lists) {
93
+ return [...new Set(lists.flat())].sort();
94
+ }
95
+ //# sourceMappingURL=row-capture-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-capture-policy.js","sourceRoot":"","sources":["../src/row-capture-policy.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,MAAM,sBAAsB,GAC1B,8IAA8I,CAAC;AAEjJ,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACnD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,CAAC;AACZ,CAAC;AAmBD,SAAS,cAAc,CAAC,MAAqC,EAAE,KAAa;IAC1E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,cAAc,KAAK,gFAAgF,CAAC;IAC7G,CAAC;IACD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,OAAO,cAAc,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC;QACjI,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzG,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAChI,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAoC;IAC1E,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAC5E,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,QAAQ,KAAK,IAAI,CAAC;IAE7C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,MAAM;YACN,MAAM,CAAC,KAAa,EAAE,MAAe;gBACnC,IAAI,MAAM,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACjC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;gBAClF,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,SAAS,CAAC,GAAmC;gBAC3C,IAAI,GAAG,KAAK,IAAI;oBAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;gBAC9D,MAAM,QAAQ,GAAa,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAA4B,EAAE,CAAC;gBAC7C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,kBAAkB,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnH,IAAI,UAAU,EAAE,CAAC;wBACf,QAAQ,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;wBACnC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACtB,SAAS;oBACX,CAAC;oBACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;oBACjC,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;oBACjC,IAAI,OAAO,CAAC,SAAS;wBAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,QAAQ,CAAC,gBAAmC,EAAE;gBAC5C,MAAM,KAAK,GACT,MAAM,KAAK,IAAI;oBACb,CAAC,CAAC,uEAAuE;oBACzE,CAAC,CAAC,uDAAuD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAClF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iDAAiD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7H,MAAM,OAAO,GACX,WAAW,CAAC,IAAI,GAAG,CAAC;oBAClB,CAAC,CAAC,8BAA8B,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAC9D,CAAC,CAAC,gLAAgL,CAAC;gBACvL,MAAM,KAAK,GAAG,4BAA4B,MAAM,CAAC,mBAAmB,CAAC,2DAA2D,CAAC;gBACjI,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;YAChD,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG,KAAqC;IACrE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAG,KAAqC;IACpE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function smoke(): Promise<void>;
2
+ //# sourceMappingURL=smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.d.ts","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"AAoBA,wBAA8B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD"}
package/dist/smoke.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Consumer smoke hook — see the `descrySmoke` convention documented in
3
+ * `descry-core`'s `scripts/release.mjs`. This package declares it via
4
+ * `"descrySmoke": "dist/smoke.js"` in its own `package.json`.
5
+ *
6
+ * Resolves this package's own pg client factory against whatever `pg` the
7
+ * *installed consumer* resolves — not this repo's own dependency tree — and
8
+ * constructs a `Client` without connecting. `pg` is CommonJS: under
9
+ * `import()` its exports sit on `.default`, and a build that read only the
10
+ * top level (fixed in commit `0518199`) shipped a collector where every real
11
+ * Postgres connection failed with "pgModule.Client is not a constructor"
12
+ * while every test in this repository stayed green, because the
13
+ * injected-client unit tests never load the real `pg` package. A packed
14
+ * tarball installed the way a consumer installs it — with the consumer's own
15
+ * `pg` pin, not this workspace's — is the only thing that would have caught
16
+ * it before it reached npm.
17
+ */
18
+ import { loadMysqlPromiseModule } from "./mysql-row-collector.js";
19
+ import { defaultClientFactory } from "./postgres-row-collector.js";
20
+ export default async function smoke() {
21
+ // The collector's own default factory, not the helper it happens to call
22
+ // today: a regression anywhere on that path must fail here. It constructs
23
+ // a Client without connecting -- pg opens the socket in `.connect()`,
24
+ // never in the constructor -- so this needs no database.
25
+ await defaultClientFactory("postgres://descry-release-smoke/db");
26
+ await loadMysqlPromiseModule();
27
+ }
28
+ //# sourceMappingURL=smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,KAAK;IACjC,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,yDAAyD;IACzD,MAAM,oBAAoB,CAAC,oCAAoC,CAAC,CAAC;IACjE,MAAM,sBAAsB,EAAE,CAAC;AACjC,CAAC"}
@@ -19,9 +19,16 @@ import { DatabaseSync } from "node:sqlite";
19
19
  // imports it, nothing imports this file. Importing QUERY_MARKER alone from
20
20
  // here once dragged the prototype patch and stdout writer into a JSON-RPC
21
21
  // transport. See query-marker.ts for the measurement.
22
- import { QUERY_MARKER } from "./query-marker.js";
22
+ import { MAX_CAPTURED_ERROR_CHARS, MAX_CAPTURED_STATEMENT_CHARS, QUERY_MARKER } from "./query-marker.js";
23
23
  function emit(query) {
24
- process.stdout.write(`${QUERY_MARKER} ${JSON.stringify(query)}\n`);
24
+ const sqlTruncated = query.sql.length > MAX_CAPTURED_STATEMENT_CHARS;
25
+ const bounded = {
26
+ ...query,
27
+ sql: sqlTruncated ? query.sql.slice(0, MAX_CAPTURED_STATEMENT_CHARS) : query.sql,
28
+ error: query.error !== null && query.error.length > MAX_CAPTURED_ERROR_CHARS ? query.error.slice(0, MAX_CAPTURED_ERROR_CHARS) : query.error,
29
+ ...(sqlTruncated ? { sqlTruncated: true } : {}),
30
+ };
31
+ process.stdout.write(`${QUERY_MARKER} ${JSON.stringify(bounded)}\n`);
25
32
  }
26
33
  function timed(sql, method, run) {
27
34
  const start = performance.now();
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-instrumentation.js","sourceRoot":"","sources":["../src/sqlite-instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sEAAsE;AACtE,2EAA2E;AAC3E,0EAA0E;AAC1E,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAA2C,MAAM,mBAAmB,CAAC;AAE1F,SAAS,IAAI,CAAC,KAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,KAAK,CAAI,GAAW,EAAE,MAAsB,EAAE,GAAY;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1F,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,uEAAuE;AACvE,kEAAkE;AAClE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AACzE,MAAM,MAAM,GAAG,YAAY,CAAC,SAAoD,CAAC;AACjF,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC;IACjD,YAAY,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,WAAW,CAAqB,GAAW,EAAE,GAAG,IAAe;QACpG,OAAO,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAE,YAA6C,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3G,CAAuC,CAAC;IAExC,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC;IACvD,YAAY,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,cAAc,CAAqB,GAAW;QACtF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAA+C,CAAC;QAEnE,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAiC,CAAC;YACpE,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,sBAAsB,CAAC,GAAG,IAAe;gBACrE,OAAO,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC;QACJ,CAAC;QACD,oEAAoE;QACpE,sEAAsE;QACtE,wCAAwC;QACxC,OAAO,IAAI,CAAC;IACd,CAA0C,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"sqlite-instrumentation.js","sourceRoot":"","sources":["../src/sqlite-instrumentation.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@
24
24
  * buried in a capability string alone.
25
25
  */
26
26
  import type { Collector } from "@descryy/runtime-contracts";
27
+ import { type RowCapturePolicy } from "./row-capture-policy.ts";
27
28
  /** The narrow slice of `node:sqlite` this module needs — swappable in tests for a fake with no real file on disk. */
28
29
  export interface SqliteRowSource {
29
30
  listTables(): readonly string[];
@@ -34,7 +35,9 @@ export interface SqliteRowSource {
34
35
  export interface TableSnapshot {
35
36
  readonly rowsByRowid: Map<string, Record<string, unknown>>;
36
37
  readonly truncated: boolean;
38
+ readonly approximateBytes?: number;
37
39
  }
40
+ export declare function snapshotTable(source: SqliteRowSource, table: string, rowCap: number): TableSnapshot;
38
41
  export type SqliteRowOp = "INSERT" | "UPDATE" | "DELETE";
39
42
  export interface SqliteRowDiff {
40
43
  readonly table: string;
@@ -52,6 +55,7 @@ export interface SqliteRowChangeCollectorOptions {
52
55
  readonly processId?: string;
53
56
  /** Test/advanced seam — defaults to a real read-only `node:sqlite` handle. */
54
57
  readonly sourceFactory?: (databasePath: string) => SqliteRowSource;
58
+ readonly rowCapture?: RowCapturePolicy;
55
59
  }
56
60
  export declare function createSqliteRowChangeCollector(options: SqliteRowChangeCollectorOptions): Collector;
57
61
  //# sourceMappingURL=sqlite-row-snapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-row-snapshot.d.ts","sourceRoot":"","sources":["../src/sqlite-row-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAM7I,qHAAqH;AACrH,MAAM,WAAW,eAAe;IAC9B,UAAU,IAAI,SAAS,MAAM,EAAE,CAAC;IAChC,2MAA2M;IAC3M,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3E,KAAK,IAAI,IAAI,CAAC;CACf;AAwBD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAqBD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,qJAAqJ;AACrJ,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,EAAE,CAgB7G;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,eAAe,CAAC;CACpE;AAID,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,+BAA+B,GAAG,SAAS,CA4HlG"}
1
+ {"version":3,"file":"sqlite-row-snapshot.d.ts","sourceRoot":"","sources":["../src/sqlite-row-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAG7I,OAAO,EAAoG,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AASlK,qHAAqH;AACrH,MAAM,WAAW,eAAe;IAC9B,UAAU,IAAI,SAAS,MAAM,EAAE,CAAC;IAChC,2MAA2M;IAC3M,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3E,KAAK,IAAI,IAAI,CAAC;CACf;AAyBD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAaD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAiBnG;AAkBD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,qJAAqJ;AACrJ,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,EAAE,CAkB7G;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,eAAe,CAAC;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAID,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,+BAA+B,GAAG,SAAS,CAoNlG"}
@@ -23,14 +23,22 @@
23
23
  * sampled window could exist and go unreported. Disclosed per row, not
24
24
  * buried in a capability string alone.
25
25
  */
26
+ import { createHash } from "node:crypto";
26
27
  import { DatabaseSync } from "node:sqlite";
27
28
  import { COLLECTOR_VERSION } from "./collector-version.js";
29
+ import { approximateCellBytes, MAX_SNAPSHOT_BYTES, mergeTruncated, mergeWithheld, resolveRowCapturePolicy } from "./row-capture-policy.js";
28
30
  const DEFAULT_ROW_CAP = 10_000;
31
+ const BUSY_TIMEOUT_MS = 2_000;
32
+ const BUSY_RETRY_DELAYS_MS = [50, 150, 400];
33
+ const BLOB_PREVIEW_BYTES = 32;
34
+ const LOCKED_ERROR_PATTERN = /database (?:table )?is locked|SQLITE_BUSY|SQLITE_LOCKED|busy/i;
35
+ const NO_ROWID_ERROR_PATTERN = /no such column: rowid/i;
29
36
  function quoteIdentifier(name) {
30
37
  return `"${name.replace(/"/g, '""')}"`;
31
38
  }
32
39
  function defaultSourceFactory(databasePath) {
33
40
  const db = new DatabaseSync(databasePath, { readOnly: true });
41
+ db.exec(`PRAGMA busy_timeout = ${String(BUSY_TIMEOUT_MS)}`);
34
42
  return {
35
43
  listTables() {
36
44
  const rows = db
@@ -39,37 +47,68 @@ function defaultSourceFactory(databasePath) {
39
47
  return rows.map((row) => row.name);
40
48
  },
41
49
  readRows(table, limit) {
42
- return db.prepare(`SELECT rowid AS __rowid, * FROM ${quoteIdentifier(table)} LIMIT ?`).all(limit);
50
+ return db.prepare(`SELECT rowid AS __rowid, * FROM ${quoteIdentifier(table)} ORDER BY rowid LIMIT ?`).all(limit);
43
51
  },
44
52
  close() {
45
53
  db.close();
46
54
  },
47
55
  };
48
56
  }
49
- function snapshotTable(source, table, rowCap) {
57
+ function normaliseValue(value) {
58
+ if (value instanceof Uint8Array) {
59
+ const preview = Buffer.from(value.subarray(0, BLOB_PREVIEW_BYTES)).toString("hex");
60
+ if (value.length <= BLOB_PREVIEW_BYTES)
61
+ return `\\x${preview}`;
62
+ const digest = createHash("sha256").update(value).digest("hex").slice(0, 16);
63
+ return `\\x${preview}...(${String(value.length)} bytes, sha256 ${digest})`;
64
+ }
65
+ if (typeof value === "bigint")
66
+ return value.toString();
67
+ return value;
68
+ }
69
+ export function snapshotTable(source, table, rowCap) {
50
70
  const rows = source.readRows(table, rowCap + 1);
51
71
  const truncated = rows.length > rowCap;
52
72
  const bounded = truncated ? rows.slice(0, rowCap) : rows;
53
73
  const rowsByRowid = new Map();
74
+ let approximateBytes = 0;
54
75
  for (const row of bounded) {
55
76
  const { __rowid, ...rest } = row;
56
- rowsByRowid.set(String(__rowid), rest);
77
+ const normalised = {};
78
+ for (const [column, value] of Object.entries(rest)) {
79
+ const cell = normaliseValue(value);
80
+ normalised[column] = cell;
81
+ approximateBytes += approximateCellBytes(cell);
82
+ }
83
+ rowsByRowid.set(String(__rowid), normalised);
57
84
  }
58
- return { rowsByRowid, truncated };
85
+ return { rowsByRowid, truncated, approximateBytes };
59
86
  }
60
87
  function rowsEqual(a, b) {
61
88
  const aKeys = Object.keys(a);
62
89
  const bKeys = Object.keys(b);
63
90
  if (aKeys.length !== bKeys.length)
64
91
  return false;
65
- return aKeys.every((key) => Object.is(a[key], b[key]) || String(a[key]) === String(b[key]));
92
+ return aKeys.every((key) => Object.hasOwn(b, key) && Object.is(a[key], b[key]));
93
+ }
94
+ function highestRowid(snapshot) {
95
+ let highest = Number.NEGATIVE_INFINITY;
96
+ for (const key of snapshot.rowsByRowid.keys()) {
97
+ const numeric = Number(key);
98
+ if (Number.isFinite(numeric) && numeric > highest)
99
+ highest = numeric;
100
+ }
101
+ return highest;
66
102
  }
67
103
  /** Pure, independently testable: diffs one table's before/after snapshot by rowid. Exported for direct unit testing without a real database file. */
68
104
  export function diffTableSnapshot(table, before, after) {
69
105
  const diffs = [];
70
106
  const truncated = before.truncated || after.truncated;
107
+ const comparedThroughRowid = Math.min(before.truncated ? highestRowid(before) : Number.POSITIVE_INFINITY, after.truncated ? highestRowid(after) : Number.POSITIVE_INFINITY);
71
108
  const allRowids = new Set([...before.rowsByRowid.keys(), ...after.rowsByRowid.keys()]);
72
109
  for (const rowid of allRowids) {
110
+ if (Number(rowid) > comparedThroughRowid)
111
+ continue;
73
112
  const beforeRow = before.rowsByRowid.get(rowid) ?? null;
74
113
  const afterRow = after.rowsByRowid.get(rowid) ?? null;
75
114
  if (beforeRow === null && afterRow !== null) {
@@ -93,7 +132,11 @@ export function createSqliteRowChangeCollector(options) {
93
132
  let tables = [];
94
133
  let beforeSnapshots = new Map();
95
134
  let skippedTables = [];
135
+ let unreadableAtStop = [];
96
136
  let refusalReason = null;
137
+ let missingAllowlisted = [];
138
+ const policyResolution = resolveRowCapturePolicy(options.rowCapture);
139
+ const rowPolicy = policyResolution.ok ? policyResolution.policy : null;
97
140
  function capabilities() {
98
141
  const unrelated = {
99
142
  availability: "unavailable",
@@ -101,14 +144,19 @@ export function createSqliteRowChangeCollector(options) {
101
144
  };
102
145
  const databaseObservation = refusalReason !== null
103
146
  ? { availability: "unavailable", reason: refusalReason }
104
- : {
105
- availability: "available",
106
- reason: `row-level INSERT/UPDATE/DELETE via before/after snapshot-and-diff, capped at ${rowCap} rows per table ` +
107
- "(truncated tables are disclosed per row as truncated: true)." +
108
- (skippedTables.length > 0
109
- ? ` Skipped (no rowid to key by, likely WITHOUT ROWID): ${skippedTables.join(", ")}.`
110
- : ""),
111
- };
147
+ : unreadableAtStop.length > 0
148
+ ? {
149
+ availability: "degraded",
150
+ reason: `row changes in ${unreadableAtStop.map((entry) => entry.table).join(", ")} were not captured because the table could not be read when the run ended ` +
151
+ `(${unreadableAtStop.map((entry) => entry.detail).join("; ")}); every other table was diffed.`,
152
+ }
153
+ : {
154
+ availability: "available",
155
+ reason: `row-level INSERT/UPDATE/DELETE via before/after snapshot-and-diff, capped at ${rowCap} rows per table ` +
156
+ "(truncated tables are disclosed per row as truncated: true)." +
157
+ (skippedTables.length > 0 ? ` Skipped: ${skippedTables.map((entry) => `${entry.table} (${entry.why})`).join("; ")}.` : "") +
158
+ ` ${rowPolicy?.describe(missingAllowlisted) ?? ""}`,
159
+ };
112
160
  return {
113
161
  domObservation: unrelated,
114
162
  consoleObservation: unrelated,
@@ -123,6 +171,10 @@ export function createSqliteRowChangeCollector(options) {
123
171
  };
124
172
  }
125
173
  function emitDiff(context, diff) {
174
+ const before = rowPolicy?.filterRow(diff.before) ?? { row: diff.before, withheld: [], truncated: [] };
175
+ const after = rowPolicy?.filterRow(diff.after) ?? { row: diff.after, withheld: [], truncated: [] };
176
+ const withheldColumns = mergeWithheld(before.withheld, after.withheld);
177
+ const truncatedColumns = mergeTruncated(before.truncated, after.truncated);
126
178
  context.emit({
127
179
  timestamp: new Date().toISOString(),
128
180
  source: "backend-process",
@@ -133,8 +185,10 @@ export function createSqliteRowChangeCollector(options) {
133
185
  kind: "row-change",
134
186
  table: diff.table,
135
187
  op: diff.op,
136
- before: diff.before,
137
- after: diff.after,
188
+ before: before.row,
189
+ after: after.row,
190
+ ...(withheldColumns.length > 0 ? { withheldColumns } : {}),
191
+ ...(truncatedColumns.length > 0 ? { truncatedColumns } : {}),
138
192
  truncated: diff.truncated,
139
193
  },
140
194
  traceId: null,
@@ -149,30 +203,91 @@ export function createSqliteRowChangeCollector(options) {
149
203
  });
150
204
  }
151
205
  let savedContext = null;
206
+ function emitCollectorError(context, detail) {
207
+ try {
208
+ context.emit({
209
+ timestamp: new Date().toISOString(),
210
+ source: "backend-process",
211
+ service: options.service ?? null,
212
+ process: processId,
213
+ eventType: "COLLECTOR_ERROR",
214
+ payload: {
215
+ raw: `sqlite row-change collector for process "${processId}" failed: ${detail}`,
216
+ collectorId: `sqlite-row-collector:${processId}`,
217
+ error: detail,
218
+ },
219
+ traceId: null,
220
+ requestId: null,
221
+ correlationId: null,
222
+ graphNodeId: null,
223
+ sourceLocation: null,
224
+ stackTrace: null,
225
+ confidence: 1,
226
+ redactionStatus: "pending-redaction",
227
+ collectorVersion: COLLECTOR_VERSION,
228
+ });
229
+ }
230
+ catch (emitError) {
231
+ console.error(`[sqlite-row-collector:${processId}] failed (${detail}) AND the failure could not be emitted: ${String(emitError)}`);
232
+ }
233
+ }
234
+ async function snapshotWithRetry(activeSource, table) {
235
+ for (let attempt = 0;; attempt += 1) {
236
+ try {
237
+ return snapshotTable(activeSource, table, rowCap);
238
+ }
239
+ catch (error) {
240
+ const message = error instanceof Error ? error.message : String(error);
241
+ const delay = BUSY_RETRY_DELAYS_MS[attempt];
242
+ if (delay === undefined || !LOCKED_ERROR_PATTERN.test(message))
243
+ throw error;
244
+ await new Promise((resolve) => setTimeout(resolve, delay));
245
+ }
246
+ }
247
+ }
248
+ function whyUnreadable(error) {
249
+ const message = error instanceof Error ? error.message : String(error);
250
+ return NO_ROWID_ERROR_PATTERN.test(message) ? "no rowid to key by, likely WITHOUT ROWID" : `unreadable: ${message}`;
251
+ }
152
252
  return {
153
253
  collectorId: `sqlite-row-collector:${processId}`,
154
- start(context) {
254
+ async start(context) {
155
255
  savedContext = context;
256
+ if (!policyResolution.ok) {
257
+ refusalReason = policyResolution.reason;
258
+ return { available: false, reason: refusalReason };
259
+ }
156
260
  try {
157
261
  source = sourceFactory(options.databasePath);
158
- tables = source.listTables();
262
+ const listed = source.listTables();
263
+ tables = listed.filter((table) => rowPolicy?.allows(table) ?? true);
264
+ const present = new Set(listed.map((table) => table.toLowerCase()));
265
+ missingAllowlisted = (rowPolicy?.tables ?? []).filter((table) => !present.has(table));
159
266
  beforeSnapshots = new Map();
160
267
  skippedTables = [];
268
+ unreadableAtStop = [];
269
+ let snapshotBytes = 0;
161
270
  for (const table of tables) {
271
+ if (snapshotBytes > MAX_SNAPSHOT_BYTES) {
272
+ skippedTables.push({ table, why: `the ${String(MAX_SNAPSHOT_BYTES)} byte snapshot budget was used up before this table` });
273
+ continue;
274
+ }
162
275
  try {
163
- beforeSnapshots.set(table, snapshotTable(source, table, rowCap));
276
+ const snapshot = await snapshotWithRetry(source, table);
277
+ snapshotBytes += snapshot.approximateBytes ?? 0;
278
+ beforeSnapshots.set(table, snapshot);
164
279
  }
165
- catch {
166
- skippedTables.push(table);
280
+ catch (error) {
281
+ skippedTables.push({ table, why: whyUnreadable(error) });
167
282
  }
168
283
  }
169
- return Promise.resolve({ available: true });
284
+ return { available: true };
170
285
  }
171
286
  catch (error) {
172
287
  const detail = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
173
288
  refusalReason = `could not open "${options.databasePath}" read-only for row-level capture: ${detail}`;
174
289
  source = null;
175
- return Promise.resolve({ available: false, reason: refusalReason });
290
+ return { available: false, reason: refusalReason };
176
291
  }
177
292
  },
178
293
  async stop() {
@@ -181,17 +296,30 @@ export function createSqliteRowChangeCollector(options) {
181
296
  const activeSource = source;
182
297
  const context = savedContext;
183
298
  try {
299
+ let snapshotBytes = 0;
184
300
  for (const table of tables) {
185
301
  const before = beforeSnapshots.get(table);
186
302
  if (before === undefined)
187
- continue; // skipped at start() -- stays skipped, disclosed via capabilities
303
+ continue;
304
+ if (snapshotBytes > MAX_SNAPSHOT_BYTES) {
305
+ const detail = `the ${String(MAX_SNAPSHOT_BYTES)} byte snapshot budget was used up before this table`;
306
+ unreadableAtStop.push({ table, detail });
307
+ if (context !== null)
308
+ emitCollectorError(context, `table "${table}" was not compared: ${detail}`);
309
+ continue;
310
+ }
188
311
  let after;
189
312
  try {
190
- after = snapshotTable(activeSource, table, rowCap);
313
+ after = await snapshotWithRetry(activeSource, table);
191
314
  }
192
- catch {
315
+ catch (error) {
316
+ const detail = whyUnreadable(error);
317
+ unreadableAtStop.push({ table, detail });
318
+ if (context !== null)
319
+ emitCollectorError(context, `table "${table}" could not be read when the run ended, so its row changes were not captured (${detail})`);
193
320
  continue;
194
321
  }
322
+ snapshotBytes += after.approximateBytes ?? 0;
195
323
  const diffs = diffTableSnapshot(table, before, after);
196
324
  if (context !== null) {
197
325
  for (const diff of diffs)
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-row-snapshot.js","sourceRoot":"","sources":["../src/sqlite-row-snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-row-snapshot.js","sourceRoot":"","sources":["../src/sqlite-row-snapshot.ts"],"names":[],"mappings":"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"}