@descryy/runtime-database-observation 0.5.2 → 0.5.4
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/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/mysql-row-collector.d.ts +33 -19
- package/dist/mysql-row-collector.d.ts.map +1 -1
- package/dist/mysql-row-collector.js +480 -26
- package/dist/mysql-row-collector.js.map +1 -1
- package/dist/postgres-log-parser.d.ts +15 -29
- package/dist/postgres-log-parser.d.ts.map +1 -1
- package/dist/postgres-log-parser.js +103 -32
- package/dist/postgres-log-parser.js.map +1 -1
- package/dist/postgres-log-source.d.ts +4 -0
- package/dist/postgres-log-source.d.ts.map +1 -1
- package/dist/postgres-log-source.js +196 -36
- package/dist/postgres-log-source.js.map +1 -1
- package/dist/postgres-query-collector.d.ts.map +1 -1
- package/dist/postgres-query-collector.js +43 -13
- package/dist/postgres-query-collector.js.map +1 -1
- package/dist/postgres-row-collector.d.ts +7 -0
- package/dist/postgres-row-collector.d.ts.map +1 -1
- package/dist/postgres-row-collector.js +112 -17
- package/dist/postgres-row-collector.js.map +1 -1
- package/dist/prisma-instrumentation.d.ts +20 -0
- package/dist/prisma-instrumentation.d.ts.map +1 -0
- package/dist/prisma-instrumentation.js +99 -0
- package/dist/prisma-instrumentation.js.map +1 -0
- package/dist/query-collector.d.ts +2 -0
- package/dist/query-collector.d.ts.map +1 -1
- package/dist/query-collector.js +38 -13
- package/dist/query-collector.js.map +1 -1
- package/dist/query-line-parser.d.ts.map +1 -1
- package/dist/query-line-parser.js +2 -1
- package/dist/query-line-parser.js.map +1 -1
- package/dist/query-marker.d.ts +10 -1
- package/dist/query-marker.d.ts.map +1 -1
- package/dist/query-marker.js +2 -0
- package/dist/query-marker.js.map +1 -1
- package/dist/row-capture-policy.d.ts +31 -0
- package/dist/row-capture-policy.d.ts.map +1 -0
- package/dist/row-capture-policy.js +95 -0
- package/dist/row-capture-policy.js.map +1 -0
- package/dist/smoke.d.ts.map +1 -1
- package/dist/smoke.js +2 -0
- package/dist/smoke.js.map +1 -1
- package/dist/sqlite-instrumentation.js +9 -2
- package/dist/sqlite-instrumentation.js.map +1 -1
- package/dist/sqlite-row-snapshot.d.ts +4 -0
- package/dist/sqlite-row-snapshot.d.ts.map +1 -1
- package/dist/sqlite-row-snapshot.js +153 -25
- package/dist/sqlite-row-snapshot.js.map +1 -1
- package/dist/table-extraction.d.ts.map +1 -1
- package/dist/table-extraction.js +124 -5
- package/dist/table-extraction.js.map +1 -1
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-line-parser.js","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EAAE,YAAY,EAA2C,MAAM,mBAAmB,CAAC;AAE1F,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"query-line-parser.js","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EAAE,YAAY,EAA2C,MAAM,mBAAmB,CAAC;AAE1F,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;QACjD,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/query-marker.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/dist/query-marker.js
CHANGED
|
@@ -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
|
package/dist/query-marker.js.map
CHANGED
|
@@ -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":"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"}
|
package/dist/smoke.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.d.ts","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"
|
|
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
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* `pg` pin, not this workspace's — is the only thing that would have caught
|
|
16
16
|
* it before it reached npm.
|
|
17
17
|
*/
|
|
18
|
+
import { loadMysqlPromiseModule } from "./mysql-row-collector.js";
|
|
18
19
|
import { defaultClientFactory } from "./postgres-row-collector.js";
|
|
19
20
|
export default async function smoke() {
|
|
20
21
|
// The collector's own default factory, not the helper it happens to call
|
|
@@ -22,5 +23,6 @@ export default async function smoke() {
|
|
|
22
23
|
// a Client without connecting -- pg opens the socket in `.connect()`,
|
|
23
24
|
// never in the constructor -- so this needs no database.
|
|
24
25
|
await defaultClientFactory("postgres://descry-release-smoke/db");
|
|
26
|
+
await loadMysqlPromiseModule();
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=smoke.js.map
|
package/dist/smoke.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.js","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,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;
|
|
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
|
-
|
|
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;
|
|
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;
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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:
|
|
137
|
-
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|
|
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 =
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAyB,MAAM,yBAAyB,CAAC;AAElK,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,oBAAoB,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC5C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,oBAAoB,GAAG,+DAA+D,CAAC;AAC7F,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAUxD,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB;IAChD,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5D,OAAO;QACL,UAAU;YACR,MAAM,IAAI,GAAG,EAAE;iBACZ,OAAO,CAAC,gGAAgG,CAAC;iBACzG,GAAG,EAAwB,CAAC;YAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,QAAQ,CAAC,KAAa,EAAE,KAAa;YACnC,OAAO,EAAE,CAAC,OAAO,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA8B,CAAC;QAChJ,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAQD,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnF,IAAI,KAAK,CAAC,MAAM,IAAI,kBAAkB;YAAE,OAAO,MAAM,OAAO,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,OAAO,MAAM,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,MAAM,GAAG,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAuB,EAAE,KAAa,EAAE,MAAc;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC/D,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAqD,CAAC;QACnF,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACnC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAC1B,gBAAgB,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,CAA0B,EAAE,CAA0B;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB;IAC3C,IAAI,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,OAAO;YAAE,OAAO,GAAG,OAAO,CAAC;IACvE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAYD,qJAAqJ;AACrJ,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,MAAqB,EAAE,KAAoB;IAC1F,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;IACtD,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5K,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,oBAAoB;YAAE,SAAS;QACnD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;QACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;QACtD,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,MAAM,UAAU,GAAqB,gBAAgB,CAAC;AAEtD,MAAM,UAAU,8BAA8B,CAAC,OAAwC;IACrF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,oBAAoB,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,oBAAoB,CAAC;IAEpE,IAAI,MAAM,GAA2B,IAAI,CAAC;IAC1C,IAAI,MAAM,GAAsB,EAAE,CAAC;IACnC,IAAI,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;IACvD,IAAI,aAAa,GAAuD,EAAE,CAAC;IAC3E,IAAI,gBAAgB,GAA0D,EAAE,CAAC;IACjF,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,kBAAkB,GAAsB,EAAE,CAAC;IAC/C,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,SAAS,YAAY;QACnB,MAAM,SAAS,GAAG;YAChB,YAAY,EAAE,aAAsB;YACpC,MAAM,EAAE,sFAAsF;SAC/F,CAAC;QACF,MAAM,mBAAmB,GACvB,aAAa,KAAK,IAAI;YACpB,CAAC,CAAC,EAAE,YAAY,EAAE,aAAsB,EAAE,MAAM,EAAE,aAAa,EAAE;YACjE,CAAC,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBAC3B,CAAC,CAAC;oBACE,YAAY,EAAE,UAAmB;oBACjC,MAAM,EACJ,kBAAkB,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,4EAA4E;wBACrJ,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC;iBACjG;gBACH,CAAC,CAAC;oBACA,YAAY,EAAE,WAAoB;oBAClC,MAAM,EACJ,gFAAgF,MAAM,kBAAkB;wBACxG,8DAA8D;wBAC9D,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1H,IAAI,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE;iBACtD,CAAC;QACR,OAAO;YACL,cAAc,EAAE,SAAS;YACzB,kBAAkB,EAAE,SAAS;YAC7B,kBAAkB,EAAE,SAAS;YAC7B,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,SAAS;YAC3B,aAAa,EAAE,SAAS;YACxB,YAAY,EAAE,SAAS;YACvB,gBAAgB,EAAE,SAAS;YAC3B,mBAAmB;YACnB,0BAA0B,EAAE,SAAS;SACtC,CAAC;IACJ,CAAC;IAED,SAAS,QAAQ,CAAC,OAAyB,EAAE,IAAmB;QAC9D,MAAM,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACtG,MAAM,KAAK,GAAG,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACnG,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE;gBACP,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,MAAM,EAAE,MAAM,CAAC,GAAG;gBAClB,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;YACD,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,CAAC;YACb,eAAe,EAAE,mBAAmB;YACpC,gBAAgB,EAAE,iBAAiB;SACpC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,GAA4B,IAAI,CAAC;IAEjD,SAAS,kBAAkB,CAAC,OAAyB,EAAE,MAAc;QACnE,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,iBAAiB;gBACzB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;gBAChC,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,iBAAiB;gBAC5B,OAAO,EAAE;oBACP,GAAG,EAAE,4CAA4C,SAAS,aAAa,MAAM,EAAE;oBAC/E,WAAW,EAAE,wBAAwB,SAAS,EAAE;oBAChD,KAAK,EAAE,MAAM;iBACd;gBACD,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,CAAC;gBACb,eAAe,EAAE,mBAAmB;gBACpC,gBAAgB,EAAE,iBAAiB;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,SAAkB,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,aAAa,MAAM,2CAA2C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrI,CAAC;IACH,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,YAA6B,EAAE,KAAa;QAC3E,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,OAAO,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC5E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,aAAa,CAAC,KAAc;QACnC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,eAAe,OAAO,EAAE,CAAC;IACtH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,wBAAwB,SAAS,EAAE;QAEhD,KAAK,CAAC,KAAK,CAAC,OAAyB;YACnC,YAAY,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBACzB,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBACxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACrD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpE,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtF,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC5B,aAAa,GAAG,EAAE,CAAC;gBACnB,gBAAgB,GAAG,EAAE,CAAC;gBACtB,IAAI,aAAa,GAAG,CAAC,CAAC;gBACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,aAAa,GAAG,kBAAkB,EAAE,CAAC;wBACvC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,kBAAkB,CAAC,qDAAqD,EAAE,CAAC,CAAC;wBAC3H,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;wBACxD,aAAa,IAAI,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC;wBAChD,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACvC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,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;gBAC1F,aAAa,GAAG,mBAAmB,OAAO,CAAC,YAAY,sCAAsC,MAAM,EAAE,CAAC;gBACtG,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI;YACR,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO;YAC5B,MAAM,YAAY,GAAG,MAAM,CAAC;YAC5B,MAAM,OAAO,GAAG,YAAY,CAAC;YAC7B,IAAI,CAAC;gBACH,IAAI,aAAa,GAAG,CAAC,CAAC;gBACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC1C,IAAI,MAAM,KAAK,SAAS;wBAAE,SAAS;oBACnC,IAAI,aAAa,GAAG,kBAAkB,EAAE,CAAC;wBACvC,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,kBAAkB,CAAC,qDAAqD,CAAC;wBACtG,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,KAAK,IAAI;4BAAE,kBAAkB,CAAC,OAAO,EAAE,UAAU,KAAK,uBAAuB,MAAM,EAAE,CAAC,CAAC;wBAClG,SAAS;oBACX,CAAC;oBACD,IAAI,KAAoB,CAAC;oBACzB,IAAI,CAAC;wBACH,KAAK,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;oBACvD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;wBACpC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACzC,IAAI,OAAO,KAAK,IAAI;4BAAE,kBAAkB,CAAC,OAAO,EAAE,UAAU,KAAK,iFAAiF,MAAM,GAAG,CAAC,CAAC;wBAC7J,SAAS;oBACX,CAAC;oBACD,aAAa,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;oBAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACtD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBACrB,KAAK,MAAM,IAAI,IAAI,KAAK;4BAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,YAAY;KACb,CAAC;AACJ,CAAC"}
|