@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.
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- 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 +2 -0
- package/dist/postgres-log-source.d.ts.map +1 -1
- package/dist/postgres-log-source.js +171 -35
- 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 +9 -0
- package/dist/postgres-row-collector.d.ts.map +1 -1
- package/dist/postgres-row-collector.js +114 -18
- 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 +2 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +28 -0
- package/dist/smoke.js.map +1 -0
- 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 +10 -8
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
* refuses by name, same as a failed precondition check.
|
|
37
37
|
*/
|
|
38
38
|
import type { Collector } from "@descryy/runtime-contracts";
|
|
39
|
+
import { type RowCapturePolicy } from "./row-capture-policy.ts";
|
|
39
40
|
/** The narrow slice of `pg`'s `Client` this module calls — same shape `live-schema.ts` uses, small enough to be satisfied by a test double with no real database involved. */
|
|
40
41
|
export interface PgRowClient {
|
|
41
42
|
connect(): Promise<void>;
|
|
@@ -43,7 +44,9 @@ export interface PgRowClient {
|
|
|
43
44
|
rows: readonly Record<string, unknown>[];
|
|
44
45
|
}>;
|
|
45
46
|
end(): Promise<void>;
|
|
47
|
+
on?(event: "error", listener: (error: Error) => void): unknown;
|
|
46
48
|
}
|
|
49
|
+
export declare const MAX_ROW_CHANGES_PER_STOP = 50000;
|
|
47
50
|
export interface PostgresRowChangeCollectorOptions {
|
|
48
51
|
readonly connectionString: string;
|
|
49
52
|
/** Which owned system this collector's evidence should be attributed to (plan §16.7). */
|
|
@@ -51,6 +54,9 @@ export interface PostgresRowChangeCollectorOptions {
|
|
|
51
54
|
readonly processId?: string;
|
|
52
55
|
/** Test/advanced seam — defaults to a real `pg.Client` loaded dynamically. */
|
|
53
56
|
readonly clientFactory?: (connectionString: string) => Promise<PgRowClient> | PgRowClient;
|
|
57
|
+
readonly rowCapture?: RowCapturePolicy;
|
|
58
|
+
readonly connectTimeoutMs?: number;
|
|
59
|
+
readonly stopQueryTimeoutMs?: number;
|
|
54
60
|
}
|
|
55
61
|
type PgClientConstructor = new (config: unknown) => PgRowClient;
|
|
56
62
|
/**
|
|
@@ -62,6 +68,9 @@ type PgClientConstructor = new (config: unknown) => PgRowClient;
|
|
|
62
68
|
* loud error rather than a silent no-op.
|
|
63
69
|
*/
|
|
64
70
|
export declare function pgClientConstructor(loaded: unknown): PgClientConstructor;
|
|
71
|
+
/** Exported for this package's release smoke hook (`smoke.ts`), which must exercise the real default path, not a helper it calls. */
|
|
72
|
+
export declare function defaultClientFactory(connectionString: string): Promise<PgRowClient>;
|
|
73
|
+
export declare function makeSlotName(processId: string): string;
|
|
65
74
|
export declare function createPostgresRowChangeCollector(options: PostgresRowChangeCollectorOptions): Collector;
|
|
66
75
|
export {};
|
|
67
76
|
//# sourceMappingURL=postgres-row-collector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-row-collector.d.ts","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;
|
|
1
|
+
{"version":3,"file":"postgres-row-collector.d.ts","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAI7I,OAAO,EAA0D,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAExH,8KAA8K;AAC9K,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IACxG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE;AAED,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAuB/C,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAMD,KAAK,mBAAmB,GAAG,KAAK,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,mBAAmB,CAOxE;AAED,qIAAqI;AACrI,wBAAsB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAazF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUtD;AAcD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,iCAAiC,GAAG,SAAS,CAsQtG"}
|
|
@@ -43,8 +43,30 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
43
43
|
}
|
|
44
44
|
return path;
|
|
45
45
|
};
|
|
46
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
46
47
|
import { parseTestDecodingLine } from "./postgres-decoding-parser.js";
|
|
47
48
|
import { COLLECTOR_VERSION } from "./collector-version.js";
|
|
49
|
+
import { mergeTruncated, mergeWithheld, resolveRowCapturePolicy } from "./row-capture-policy.js";
|
|
50
|
+
export const MAX_ROW_CHANGES_PER_STOP = 50_000;
|
|
51
|
+
const DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
|
|
52
|
+
const DEFAULT_STOP_QUERY_TIMEOUT_MS = 30_000;
|
|
53
|
+
const STATEMENT_TIMEOUT_MS = 30_000;
|
|
54
|
+
const DROP_SLOT_TIMEOUT_MS = 5_000;
|
|
55
|
+
const MAX_SLOT_NAME_BYTES = 63;
|
|
56
|
+
const SLOT_NAME_PREFIX = "descry_rowcap_";
|
|
57
|
+
const SLOT_NAME_READABLE_CHARS = 16;
|
|
58
|
+
class OperationTimeoutError extends Error {
|
|
59
|
+
}
|
|
60
|
+
function withinTimeout(work, timeoutMs, message) {
|
|
61
|
+
let timer;
|
|
62
|
+
const expired = new Promise((_, reject) => {
|
|
63
|
+
timer = setTimeout(() => reject(new OperationTimeoutError(message)), timeoutMs);
|
|
64
|
+
});
|
|
65
|
+
return Promise.race([work, expired]).finally(() => clearTimeout(timer));
|
|
66
|
+
}
|
|
67
|
+
function describeError(error) {
|
|
68
|
+
return error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
69
|
+
}
|
|
48
70
|
const EVENT_TYPE = "DATABASE_QUERY";
|
|
49
71
|
/**
|
|
50
72
|
* The `Client` constructor from a dynamically imported `pg`. `pg` is CommonJS,
|
|
@@ -62,17 +84,37 @@ export function pgClientConstructor(loaded) {
|
|
|
62
84
|
}
|
|
63
85
|
return candidate;
|
|
64
86
|
}
|
|
65
|
-
|
|
87
|
+
/** Exported for this package's release smoke hook (`smoke.ts`), which must exercise the real default path, not a helper it calls. */
|
|
88
|
+
export async function defaultClientFactory(connectionString) {
|
|
66
89
|
// Read from a variable, not a string literal -- see the module header:
|
|
67
90
|
// keeps `tsc` from requiring `pg`'s type declarations to check this file,
|
|
68
91
|
// an ordinary dynamic import at runtime either way.
|
|
69
92
|
const moduleName = "pg";
|
|
70
93
|
const Client = pgClientConstructor(await import(__rewriteRelativeImportExtension(moduleName)));
|
|
71
|
-
return new Client({
|
|
94
|
+
return new Client({
|
|
95
|
+
connectionString,
|
|
96
|
+
connectionTimeoutMillis: DEFAULT_CONNECT_TIMEOUT_MS,
|
|
97
|
+
statement_timeout: STATEMENT_TIMEOUT_MS,
|
|
98
|
+
query_timeout: STATEMENT_TIMEOUT_MS + 5_000,
|
|
99
|
+
keepAlive: true,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export function makeSlotName(processId) {
|
|
103
|
+
const readable = processId.toLowerCase().replace(/[^a-z0-9_]/g, "_").slice(0, SLOT_NAME_READABLE_CHARS);
|
|
104
|
+
const digest = createHash("sha256").update(processId).digest("hex").slice(0, 8);
|
|
105
|
+
const issuedAt = Date.now().toString(36);
|
|
106
|
+
const nonce = randomBytes(3).toString("hex");
|
|
107
|
+
const name = `${SLOT_NAME_PREFIX}${readable}_${digest}_${issuedAt}_${nonce}`;
|
|
108
|
+
if (name.length > MAX_SLOT_NAME_BYTES) {
|
|
109
|
+
throw new Error(`replication slot name "${name}" exceeds ${MAX_SLOT_NAME_BYTES} bytes`);
|
|
110
|
+
}
|
|
111
|
+
return name;
|
|
72
112
|
}
|
|
73
|
-
function
|
|
74
|
-
|
|
75
|
-
|
|
113
|
+
function isMissingSlotError(error) {
|
|
114
|
+
if (typeof error !== "object" || error === null)
|
|
115
|
+
return false;
|
|
116
|
+
const { code, message } = error;
|
|
117
|
+
return code === "42704" || (typeof message === "string" && /does not exist/i.test(message));
|
|
76
118
|
}
|
|
77
119
|
function replidentToCompleteness(code) {
|
|
78
120
|
if (code === "f")
|
|
@@ -89,6 +131,12 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
89
131
|
let savedContext = null;
|
|
90
132
|
let refusalReason = null;
|
|
91
133
|
let identityByTable = new Map();
|
|
134
|
+
let connectionLost = null;
|
|
135
|
+
let startGeneration = 0;
|
|
136
|
+
const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;
|
|
137
|
+
const stopQueryTimeoutMs = options.stopQueryTimeoutMs ?? DEFAULT_STOP_QUERY_TIMEOUT_MS;
|
|
138
|
+
const policyResolution = resolveRowCapturePolicy(options.rowCapture);
|
|
139
|
+
const rowPolicy = policyResolution.ok ? policyResolution.policy : null;
|
|
92
140
|
function computeCapabilities() {
|
|
93
141
|
const unrelated = {
|
|
94
142
|
availability: "unavailable",
|
|
@@ -98,9 +146,10 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
98
146
|
? { availability: "unavailable", reason: refusalReason }
|
|
99
147
|
: {
|
|
100
148
|
availability: "available",
|
|
101
|
-
reason:
|
|
149
|
+
reason: `row-level INSERT/UPDATE/DELETE via a temporary logical replication slot${slot === null ? "" : ` "${slot}"`} (test_decoding); ` +
|
|
102
150
|
"before-values are full only for tables with REPLICA IDENTITY FULL -- key-only or absent " +
|
|
103
|
-
"otherwise, disclosed per row as beforeCompleteness."
|
|
151
|
+
"otherwise, disclosed per row as beforeCompleteness. " +
|
|
152
|
+
(rowPolicy?.describe() ?? ""),
|
|
104
153
|
};
|
|
105
154
|
return {
|
|
106
155
|
domObservation: unrelated,
|
|
@@ -116,7 +165,13 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
116
165
|
};
|
|
117
166
|
}
|
|
118
167
|
function emitRowChange(context, parsed, xid) {
|
|
168
|
+
if (rowPolicy !== null && !rowPolicy.allows(parsed.table, parsed.schema))
|
|
169
|
+
return;
|
|
119
170
|
const completeness = identityByTable.get(`${parsed.schema}.${parsed.table}`) ?? "key-only";
|
|
171
|
+
const before = rowPolicy?.filterRow(parsed.before) ?? { row: parsed.before, withheld: [], truncated: [] };
|
|
172
|
+
const after = rowPolicy?.filterRow(parsed.after) ?? { row: parsed.after, withheld: [], truncated: [] };
|
|
173
|
+
const withheldColumns = mergeWithheld(before.withheld, after.withheld);
|
|
174
|
+
const truncatedColumns = mergeTruncated(before.truncated, after.truncated);
|
|
120
175
|
context.emit({
|
|
121
176
|
timestamp: new Date().toISOString(),
|
|
122
177
|
source: "backend-process",
|
|
@@ -128,8 +183,10 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
128
183
|
schema: parsed.schema,
|
|
129
184
|
table: parsed.table,
|
|
130
185
|
op: parsed.op,
|
|
131
|
-
before:
|
|
132
|
-
after:
|
|
186
|
+
before: before.row,
|
|
187
|
+
after: after.row,
|
|
188
|
+
...(withheldColumns.length > 0 ? { withheldColumns } : {}),
|
|
189
|
+
...(truncatedColumns.length > 0 ? { truncatedColumns } : {}),
|
|
133
190
|
xid: xid === undefined || xid === null ? null : String(xid),
|
|
134
191
|
beforeCompleteness: completeness,
|
|
135
192
|
},
|
|
@@ -172,14 +229,33 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
172
229
|
console.error(`[postgres-row-collector:${processId}] failed (${detail}) AND the failure could not be emitted: ${String(emitError)}`);
|
|
173
230
|
}
|
|
174
231
|
}
|
|
232
|
+
async function dropSlotExplicitly(activeClient, activeSlot) {
|
|
233
|
+
try {
|
|
234
|
+
await withinTimeout(activeClient.query("SELECT pg_drop_replication_slot($1)", [activeSlot]), DROP_SLOT_TIMEOUT_MS, `dropping the replication slot did not answer within ${DROP_SLOT_TIMEOUT_MS} ms`);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (isMissingSlotError(error))
|
|
238
|
+
return;
|
|
239
|
+
if (savedContext !== null) {
|
|
240
|
+
emitCollectorError(savedContext, `replication slot "${activeSlot}" could not be dropped explicitly (${describeError(error)}); it was created temporary and the server drops it when this connection closes`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
175
244
|
async function closeClient() {
|
|
176
245
|
if (client === null)
|
|
177
246
|
return;
|
|
247
|
+
const closingClient = client;
|
|
248
|
+
const closingSlot = slot;
|
|
249
|
+
if (closingSlot !== null && connectionLost === null) {
|
|
250
|
+
await dropSlotExplicitly(closingClient, closingSlot);
|
|
251
|
+
}
|
|
178
252
|
try {
|
|
179
|
-
await
|
|
253
|
+
await closingClient.end();
|
|
180
254
|
}
|
|
181
|
-
catch {
|
|
182
|
-
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (savedContext !== null) {
|
|
257
|
+
emitCollectorError(savedContext, `closing the database connection failed (${describeError(error)})`);
|
|
258
|
+
}
|
|
183
259
|
}
|
|
184
260
|
client = null;
|
|
185
261
|
slot = null;
|
|
@@ -188,14 +264,28 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
188
264
|
collectorId: `postgres-row-collector:${processId}`,
|
|
189
265
|
async start(context) {
|
|
190
266
|
savedContext = context;
|
|
191
|
-
|
|
267
|
+
if (!policyResolution.ok) {
|
|
268
|
+
refusalReason = policyResolution.reason;
|
|
269
|
+
return { available: false, reason: refusalReason };
|
|
270
|
+
}
|
|
271
|
+
let candidate = null;
|
|
272
|
+
connectionLost = null;
|
|
273
|
+
const generation = ++startGeneration;
|
|
192
274
|
try {
|
|
193
275
|
candidate = await clientFactory(options.connectionString);
|
|
194
|
-
|
|
276
|
+
const connecting = candidate;
|
|
277
|
+
connecting.on?.("error", (error) => {
|
|
278
|
+
if (generation !== startGeneration)
|
|
279
|
+
return;
|
|
280
|
+
connectionLost ??= describeError(error);
|
|
281
|
+
});
|
|
282
|
+
await withinTimeout(connecting.connect(), connectTimeoutMs, `did not connect within ${connectTimeoutMs} ms`);
|
|
195
283
|
}
|
|
196
284
|
catch (error) {
|
|
197
|
-
const detail = error instanceof
|
|
285
|
+
const detail = error instanceof OperationTimeoutError ? error.message : describeError(error);
|
|
198
286
|
refusalReason = `could not connect for row-level capture (${detail}); the query-text channel is unaffected.`;
|
|
287
|
+
if (candidate !== null)
|
|
288
|
+
await candidate.end().catch(() => undefined);
|
|
199
289
|
return { available: false, reason: refusalReason };
|
|
200
290
|
}
|
|
201
291
|
client = candidate;
|
|
@@ -227,7 +317,7 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
227
317
|
identityByTable.set(`${String(r.schema)}.${String(r.table)}`, replidentToCompleteness(r.identity));
|
|
228
318
|
}
|
|
229
319
|
slot = makeSlotName(processId);
|
|
230
|
-
await client.query("SELECT * FROM pg_create_logical_replication_slot($1, 'test_decoding',
|
|
320
|
+
await client.query("SELECT * FROM pg_create_logical_replication_slot($1, 'test_decoding', true)", [slot]);
|
|
231
321
|
return { available: true };
|
|
232
322
|
}
|
|
233
323
|
catch (error) {
|
|
@@ -244,7 +334,13 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
244
334
|
const activeSlot = slot;
|
|
245
335
|
const context = savedContext;
|
|
246
336
|
try {
|
|
247
|
-
|
|
337
|
+
if (connectionLost !== null) {
|
|
338
|
+
throw new Error(`the database connection was lost during the run (${connectionLost}); row changes in this window were not captured`);
|
|
339
|
+
}
|
|
340
|
+
const changes = await withinTimeout(activeClient.query("SELECT xid, data FROM pg_logical_slot_get_changes($1, NULL, $2)", [activeSlot, MAX_ROW_CHANGES_PER_STOP]), stopQueryTimeoutMs, `the replication slot did not answer within ${stopQueryTimeoutMs} ms`);
|
|
341
|
+
if (changes.rows.length >= MAX_ROW_CHANGES_PER_STOP && context !== null) {
|
|
342
|
+
emitCollectorError(context, `the window held at least ${MAX_ROW_CHANGES_PER_STOP} row changes; only the first ${MAX_ROW_CHANGES_PER_STOP} were read and the rest were not captured`);
|
|
343
|
+
}
|
|
248
344
|
for (const row of changes.rows) {
|
|
249
345
|
const data = String(row.data ?? "");
|
|
250
346
|
const xid = row.xid;
|
|
@@ -256,7 +352,7 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
256
352
|
}
|
|
257
353
|
}
|
|
258
354
|
catch (error) {
|
|
259
|
-
const detail = error instanceof
|
|
355
|
+
const detail = error instanceof OperationTimeoutError || connectionLost !== null ? error.message : describeError(error);
|
|
260
356
|
refusalReason = `could not read the replication slot: ${detail}`;
|
|
261
357
|
if (context !== null)
|
|
262
358
|
emitCollectorError(context, detail);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-row-collector.js","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-row-collector.js","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--import`-loaded preload: observes the SQL Prisma runs. Prisma's query engine is native code
|
|
3
|
+
* of its own, so nothing that watches `node:sqlite` or a Node driver sees its statements.
|
|
4
|
+
*
|
|
5
|
+
* **Mechanism: Prisma's own tracing hook, not a patch.** A Prisma client looks for a tracing
|
|
6
|
+
* helper on `globalThis` (`V<major>_PRISMA_INSTRUMENTATION`, then `PRISMA_INSTRUMENTATION`) --
|
|
7
|
+
* the seam `@prisma/instrumentation` uses to feed OpenTelemetry. This preload puts a minimal
|
|
8
|
+
* helper there: it asks the engine to trace (a sampled `traceparent`), runs every operation's
|
|
9
|
+
* callback unchanged, and turns each `prisma:engine:db_query` span the engine hands back into one
|
|
10
|
+
* `QUERY_MARKER` line. Both hand-back methods are implemented: `dispatchEngineSpans` (Prisma 6+)
|
|
11
|
+
* and `createEngineSpan` (Prisma 5, which also needs `previewFeatures = ["tracing"]` in the
|
|
12
|
+
* schema before its client uses any helper -- not ours to edit, so without it nothing is seen,
|
|
13
|
+
* and the caller discloses that).
|
|
14
|
+
*
|
|
15
|
+
* **It never displaces the application's own tracing.** If the app installs a helper later
|
|
16
|
+
* (its own OpenTelemetry setup), that helper is kept and this one forwards to it, observing
|
|
17
|
+
* alongside. A span's outcome is not carried, so every line is `outcomeKnown: false`.
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=prisma-instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-instrumentation.d.ts","sourceRoot":"","sources":["../src/prisma-instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--import`-loaded preload: observes the SQL Prisma runs. Prisma's query engine is native code
|
|
3
|
+
* of its own, so nothing that watches `node:sqlite` or a Node driver sees its statements.
|
|
4
|
+
*
|
|
5
|
+
* **Mechanism: Prisma's own tracing hook, not a patch.** A Prisma client looks for a tracing
|
|
6
|
+
* helper on `globalThis` (`V<major>_PRISMA_INSTRUMENTATION`, then `PRISMA_INSTRUMENTATION`) --
|
|
7
|
+
* the seam `@prisma/instrumentation` uses to feed OpenTelemetry. This preload puts a minimal
|
|
8
|
+
* helper there: it asks the engine to trace (a sampled `traceparent`), runs every operation's
|
|
9
|
+
* callback unchanged, and turns each `prisma:engine:db_query` span the engine hands back into one
|
|
10
|
+
* `QUERY_MARKER` line. Both hand-back methods are implemented: `dispatchEngineSpans` (Prisma 6+)
|
|
11
|
+
* and `createEngineSpan` (Prisma 5, which also needs `previewFeatures = ["tracing"]` in the
|
|
12
|
+
* schema before its client uses any helper -- not ours to edit, so without it nothing is seen,
|
|
13
|
+
* and the caller discloses that).
|
|
14
|
+
*
|
|
15
|
+
* **It never displaces the application's own tracing.** If the app installs a helper later
|
|
16
|
+
* (its own OpenTelemetry setup), that helper is kept and this one forwards to it, observing
|
|
17
|
+
* alongside. A span's outcome is not carried, so every line is `outcomeKnown: false`.
|
|
18
|
+
*/
|
|
19
|
+
import { randomBytes } from "node:crypto";
|
|
20
|
+
import { QUERY_MARKER } from "./query-marker.js";
|
|
21
|
+
function emit(query) {
|
|
22
|
+
process.stdout.write(`${QUERY_MARKER} ${JSON.stringify(query)}\n`);
|
|
23
|
+
}
|
|
24
|
+
/** An OpenTelemetry HrTime (`[seconds, nanos]`) or a number of milliseconds, as milliseconds. */
|
|
25
|
+
function millis(time) {
|
|
26
|
+
if (Array.isArray(time) && typeof time[0] === "number" && typeof time[1] === "number")
|
|
27
|
+
return time[0] * 1000 + time[1] / 1e6;
|
|
28
|
+
return typeof time === "number" ? time : null;
|
|
29
|
+
}
|
|
30
|
+
/** One engine span onto a captured statement, or null for any span that is not a statement. */
|
|
31
|
+
function statementOf(span) {
|
|
32
|
+
if (typeof span !== "object" || span === null)
|
|
33
|
+
return null;
|
|
34
|
+
const s = span;
|
|
35
|
+
if (s["name"] !== "prisma:engine:db_query")
|
|
36
|
+
return null;
|
|
37
|
+
const attributes = (typeof s["attributes"] === "object" && s["attributes"] !== null ? s["attributes"] : {});
|
|
38
|
+
const sql = attributes["db.query.text"] ?? attributes["db.statement"];
|
|
39
|
+
if (typeof sql !== "string" || sql === "")
|
|
40
|
+
return null;
|
|
41
|
+
const start = millis(s["startTime"] ?? s["start_time"]);
|
|
42
|
+
const end = millis(s["endTime"] ?? s["end_time"]);
|
|
43
|
+
return { sql, method: "prisma", durationMs: start !== null && end !== null ? Math.max(0, end - start) : 0, success: true, error: null, outcomeKnown: false };
|
|
44
|
+
}
|
|
45
|
+
function observeSpans(spans) {
|
|
46
|
+
for (const span of spans ?? []) {
|
|
47
|
+
const statement = statementOf(span);
|
|
48
|
+
if (statement !== null)
|
|
49
|
+
emit(statement);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Ours, forwarding to `delegate` when the application installed its own. */
|
|
53
|
+
function helperOver(delegate) {
|
|
54
|
+
return {
|
|
55
|
+
isEnabled: () => true,
|
|
56
|
+
getTraceParent(context) {
|
|
57
|
+
const theirs = delegate();
|
|
58
|
+
// Theirs when present, so the app's own traces keep their ids; ours must be sampled
|
|
59
|
+
// (flags 01), or the engine records no spans.
|
|
60
|
+
if (theirs?.isEnabled() === true)
|
|
61
|
+
return theirs.getTraceParent(context);
|
|
62
|
+
return `00-${randomBytes(16).toString("hex")}-${randomBytes(8).toString("hex")}-01`;
|
|
63
|
+
},
|
|
64
|
+
getActiveContext: () => delegate()?.getActiveContext(),
|
|
65
|
+
runInChildSpan(nameOrOptions, callback) {
|
|
66
|
+
const theirs = delegate();
|
|
67
|
+
return theirs === undefined ? callback() : theirs.runInChildSpan(nameOrOptions, callback);
|
|
68
|
+
},
|
|
69
|
+
dispatchEngineSpans(spans) {
|
|
70
|
+
observeSpans(spans);
|
|
71
|
+
delegate()?.dispatchEngineSpans?.(spans);
|
|
72
|
+
},
|
|
73
|
+
createEngineSpan(event) {
|
|
74
|
+
observeSpans(event.spans);
|
|
75
|
+
delegate()?.createEngineSpan?.(event);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const PATCHED = Symbol.for("descry.database-observation.prisma-hooked");
|
|
80
|
+
const target = globalThis;
|
|
81
|
+
if (target[PATCHED] !== true) {
|
|
82
|
+
target[PATCHED] = true;
|
|
83
|
+
// Every major a client could look under, plus the unversioned key older clients read.
|
|
84
|
+
const keys = ["PRISMA_INSTRUMENTATION", ...[5, 6, 7, 8].map((major) => `V${major}_PRISMA_INSTRUMENTATION`)];
|
|
85
|
+
for (const key of keys) {
|
|
86
|
+
let appValue = target[key];
|
|
87
|
+
const ours = { helper: helperOver(() => appValue?.helper) };
|
|
88
|
+
Object.defineProperty(globalThis, key, {
|
|
89
|
+
configurable: true,
|
|
90
|
+
enumerable: false,
|
|
91
|
+
get: () => ours,
|
|
92
|
+
// The application's own instrumentation arriving later is kept, and forwarded to.
|
|
93
|
+
set(value) {
|
|
94
|
+
appValue = value;
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=prisma-instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-instrumentation.js","sourceRoot":"","sources":["../src/prisma-instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,8 @@ import type { Collector } from "@descryy/runtime-contracts";
|
|
|
19
19
|
import { type ProcessOutputSource } from "@descryy/runtime-backend-observation";
|
|
20
20
|
/** Absolute path to the compiled preload, for a caller building `node --import <this> <app>`. Never imported directly -- loaded by Node itself, in the observed process, before that process's own code runs. */
|
|
21
21
|
export declare const SQLITE_PRELOAD_MODULE_PATH: string;
|
|
22
|
+
/** The Prisma preload (`prisma-instrumentation.ts`), for a process whose database access goes through Prisma's own engine. Same `QUERY_MARKER` lines, read by the same collector. */
|
|
23
|
+
export declare const PRISMA_PRELOAD_MODULE_PATH: string;
|
|
22
24
|
export interface DatabaseQueryCollectorOptions {
|
|
23
25
|
readonly source: ProcessOutputSource;
|
|
24
26
|
/** Which owned system this collector's evidence should be attributed to (plan §16.7). Null when not applicable. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-collector.d.ts","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,
|
|
1
|
+
{"version":3,"file":"query-collector.d.ts","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,EAA0E,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAOxJ,iNAAiN;AACjN,eAAO,MAAM,0BAA0B,QAAyE,CAAC;AAEjH,qLAAqL;AACrL,eAAO,MAAM,0BAA0B,QAAyE,CAAC;AAEjH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,mHAAmH;IACnH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA8BD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAqH9F"}
|
package/dist/query-collector.js
CHANGED
|
@@ -16,12 +16,15 @@
|
|
|
16
16
|
* is real; this collector just isn't the one that calls it.
|
|
17
17
|
*/
|
|
18
18
|
import { fileURLToPath } from "node:url";
|
|
19
|
-
import { extractCorrelationIds } from "@descryy/runtime-backend-observation";
|
|
19
|
+
import { outputGapReason, outputGapEvidence, isOutputGap, extractCorrelationIds } from "@descryy/runtime-backend-observation";
|
|
20
20
|
import { parseQueryLine } from "./query-line-parser.js";
|
|
21
21
|
import { extractTargetTable } from "./table-extraction.js";
|
|
22
|
+
import { MAX_CAPTURED_STATEMENT_CHARS } from "./query-marker.js";
|
|
22
23
|
import { COLLECTOR_VERSION } from "./collector-version.js";
|
|
23
24
|
/** Absolute path to the compiled preload, for a caller building `node --import <this> <app>`. Never imported directly -- loaded by Node itself, in the observed process, before that process's own code runs. */
|
|
24
25
|
export const SQLITE_PRELOAD_MODULE_PATH = fileURLToPath(new URL("./sqlite-instrumentation.js", import.meta.url));
|
|
26
|
+
/** The Prisma preload (`prisma-instrumentation.ts`), for a process whose database access goes through Prisma's own engine. Same `QUERY_MARKER` lines, read by the same collector. */
|
|
27
|
+
export const PRISMA_PRELOAD_MODULE_PATH = fileURLToPath(new URL("./prisma-instrumentation.js", import.meta.url));
|
|
25
28
|
const EVENT_TYPE = "DATABASE_QUERY";
|
|
26
29
|
function computeCapabilities() {
|
|
27
30
|
const reason = "DatabaseQueryCollector observes DATABASE_QUERY events only.";
|
|
@@ -38,8 +41,12 @@ function computeCapabilities() {
|
|
|
38
41
|
sourceMapping: status,
|
|
39
42
|
stackCapture: status,
|
|
40
43
|
processLifecycle: status,
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
databaseObservation: {
|
|
45
|
+
availability: "degraded",
|
|
46
|
+
reason: "queries are observed only through the node:sqlite and Prisma preloads; a process reaching its database through " +
|
|
47
|
+
"any other driver (pg, mysql2, better-sqlite3, Sequelize, Knex, TypeORM, or a non-Node runtime) produces no query " +
|
|
48
|
+
"evidence here, so an absence of queries is not evidence that none ran.",
|
|
49
|
+
},
|
|
43
50
|
externalServiceObservation: { availability: "unavailable", reason: "DatabaseQueryCollector instruments node:sqlite only; outbound requests are ExternalRequestCollector's to observe (RT-146)." },
|
|
44
51
|
};
|
|
45
52
|
}
|
|
@@ -47,8 +54,11 @@ export function createDatabaseQueryCollector(options) {
|
|
|
47
54
|
const capabilities = computeCapabilities();
|
|
48
55
|
let consumeLoopDone;
|
|
49
56
|
let consumptionFailure = null;
|
|
57
|
+
let droppedCharsTotal = 0;
|
|
50
58
|
function emitCapturedQuery(query, context) {
|
|
51
|
-
const
|
|
59
|
+
const sqlTruncated = query.sql.length > MAX_CAPTURED_STATEMENT_CHARS || query.sqlTruncated === true;
|
|
60
|
+
const sql = query.sql.length > MAX_CAPTURED_STATEMENT_CHARS ? query.sql.slice(0, MAX_CAPTURED_STATEMENT_CHARS) : query.sql;
|
|
61
|
+
const { traceId, requestId } = extractCorrelationIds(sql);
|
|
52
62
|
context.emit({
|
|
53
63
|
timestamp: new Date().toISOString(),
|
|
54
64
|
source: "backend-process",
|
|
@@ -56,12 +66,14 @@ export function createDatabaseQueryCollector(options) {
|
|
|
56
66
|
process: options.source.processId,
|
|
57
67
|
eventType: EVENT_TYPE,
|
|
58
68
|
payload: {
|
|
59
|
-
raw:
|
|
69
|
+
raw: sql,
|
|
70
|
+
...(sqlTruncated ? { rawTruncated: true } : {}),
|
|
60
71
|
method: query.method,
|
|
61
72
|
durationMs: query.durationMs,
|
|
62
73
|
success: query.success,
|
|
63
74
|
error: query.error,
|
|
64
|
-
|
|
75
|
+
...(query.outcomeKnown === false ? { outcomeKnown: false } : {}),
|
|
76
|
+
table: sqlTruncated ? null : extractTargetTable(sql),
|
|
65
77
|
},
|
|
66
78
|
traceId,
|
|
67
79
|
requestId,
|
|
@@ -79,6 +91,17 @@ export function createDatabaseQueryCollector(options) {
|
|
|
79
91
|
}
|
|
80
92
|
async function consume(context) {
|
|
81
93
|
for await (const line of options.source.lines) {
|
|
94
|
+
if (isOutputGap(line)) {
|
|
95
|
+
droppedCharsTotal += line.gap.droppedChars;
|
|
96
|
+
context.emit(outputGapEvidence({
|
|
97
|
+
collectorId: `database-query-collector:${options.source.processId}`,
|
|
98
|
+
collectorVersion: COLLECTOR_VERSION,
|
|
99
|
+
service: options.source.serviceName ?? options.service ?? null,
|
|
100
|
+
processId: options.source.processId,
|
|
101
|
+
droppedChars: line.gap.droppedChars,
|
|
102
|
+
}));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
82
105
|
const query = parseQueryLine(line.text);
|
|
83
106
|
if (query !== null)
|
|
84
107
|
emitCapturedQuery(query, context);
|
|
@@ -123,15 +146,17 @@ export function createDatabaseQueryCollector(options) {
|
|
|
123
146
|
await consumeLoopDone;
|
|
124
147
|
},
|
|
125
148
|
capabilities() {
|
|
126
|
-
if (consumptionFailure
|
|
127
|
-
|
|
128
|
-
return {
|
|
129
|
-
...capabilities,
|
|
130
|
-
distributedTrace: {
|
|
149
|
+
if (consumptionFailure !== null) {
|
|
150
|
+
const stopped = {
|
|
131
151
|
availability: "unavailable",
|
|
132
152
|
reason: `consumption stopped early after an error (${consumptionFailure}); output after that point was never observed.`,
|
|
133
|
-
}
|
|
134
|
-
|
|
153
|
+
};
|
|
154
|
+
return { ...capabilities, distributedTrace: stopped, databaseObservation: stopped };
|
|
155
|
+
}
|
|
156
|
+
if (droppedCharsTotal > 0) {
|
|
157
|
+
return { ...capabilities, databaseObservation: { availability: "degraded", reason: outputGapReason(droppedCharsTotal) } };
|
|
158
|
+
}
|
|
159
|
+
return capabilities;
|
|
135
160
|
},
|
|
136
161
|
};
|
|
137
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-collector.js","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAA4B,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"query-collector.js","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-line-parser.d.ts","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"query-line-parser.d.ts","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAe1F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUjE;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -16,7 +16,8 @@ function isCapturedQuery(value) {
|
|
|
16
16
|
typeof v.method === "string" &&
|
|
17
17
|
typeof v.durationMs === "number" &&
|
|
18
18
|
typeof v.success === "boolean" &&
|
|
19
|
-
(v.error === null || typeof v.error === "string")
|
|
19
|
+
(v.error === null || typeof v.error === "string") &&
|
|
20
|
+
(v.outcomeKnown === undefined || v.outcomeKnown === false));
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* `null` for a non-matching line AND for a line that starts with the
|
|
@@ -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"}
|