@descryy/runtime-database-observation 0.5.2 → 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 +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
|
@@ -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
|
/**
|
|
@@ -64,6 +70,7 @@ type PgClientConstructor = new (config: unknown) => PgRowClient;
|
|
|
64
70
|
export declare function pgClientConstructor(loaded: unknown): PgClientConstructor;
|
|
65
71
|
/** Exported for this package's release smoke hook (`smoke.ts`), which must exercise the real default path, not a helper it calls. */
|
|
66
72
|
export declare function defaultClientFactory(connectionString: string): Promise<PgRowClient>;
|
|
73
|
+
export declare function makeSlotName(processId: string): string;
|
|
67
74
|
export declare function createPostgresRowChangeCollector(options: PostgresRowChangeCollectorOptions): Collector;
|
|
68
75
|
export {};
|
|
69
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,
|
|
@@ -69,11 +91,30 @@ export async function defaultClientFactory(connectionString) {
|
|
|
69
91
|
// an ordinary dynamic import at runtime either way.
|
|
70
92
|
const moduleName = "pg";
|
|
71
93
|
const Client = pgClientConstructor(await import(__rewriteRelativeImportExtension(moduleName)));
|
|
72
|
-
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;
|
|
73
112
|
}
|
|
74
|
-
function
|
|
75
|
-
|
|
76
|
-
|
|
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));
|
|
77
118
|
}
|
|
78
119
|
function replidentToCompleteness(code) {
|
|
79
120
|
if (code === "f")
|
|
@@ -90,6 +131,12 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
90
131
|
let savedContext = null;
|
|
91
132
|
let refusalReason = null;
|
|
92
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;
|
|
93
140
|
function computeCapabilities() {
|
|
94
141
|
const unrelated = {
|
|
95
142
|
availability: "unavailable",
|
|
@@ -99,9 +146,10 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
99
146
|
? { availability: "unavailable", reason: refusalReason }
|
|
100
147
|
: {
|
|
101
148
|
availability: "available",
|
|
102
|
-
reason:
|
|
149
|
+
reason: `row-level INSERT/UPDATE/DELETE via a temporary logical replication slot${slot === null ? "" : ` "${slot}"`} (test_decoding); ` +
|
|
103
150
|
"before-values are full only for tables with REPLICA IDENTITY FULL -- key-only or absent " +
|
|
104
|
-
"otherwise, disclosed per row as beforeCompleteness."
|
|
151
|
+
"otherwise, disclosed per row as beforeCompleteness. " +
|
|
152
|
+
(rowPolicy?.describe() ?? ""),
|
|
105
153
|
};
|
|
106
154
|
return {
|
|
107
155
|
domObservation: unrelated,
|
|
@@ -117,7 +165,13 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
117
165
|
};
|
|
118
166
|
}
|
|
119
167
|
function emitRowChange(context, parsed, xid) {
|
|
168
|
+
if (rowPolicy !== null && !rowPolicy.allows(parsed.table, parsed.schema))
|
|
169
|
+
return;
|
|
120
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);
|
|
121
175
|
context.emit({
|
|
122
176
|
timestamp: new Date().toISOString(),
|
|
123
177
|
source: "backend-process",
|
|
@@ -129,8 +183,10 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
129
183
|
schema: parsed.schema,
|
|
130
184
|
table: parsed.table,
|
|
131
185
|
op: parsed.op,
|
|
132
|
-
before:
|
|
133
|
-
after:
|
|
186
|
+
before: before.row,
|
|
187
|
+
after: after.row,
|
|
188
|
+
...(withheldColumns.length > 0 ? { withheldColumns } : {}),
|
|
189
|
+
...(truncatedColumns.length > 0 ? { truncatedColumns } : {}),
|
|
134
190
|
xid: xid === undefined || xid === null ? null : String(xid),
|
|
135
191
|
beforeCompleteness: completeness,
|
|
136
192
|
},
|
|
@@ -173,14 +229,33 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
173
229
|
console.error(`[postgres-row-collector:${processId}] failed (${detail}) AND the failure could not be emitted: ${String(emitError)}`);
|
|
174
230
|
}
|
|
175
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
|
+
}
|
|
176
244
|
async function closeClient() {
|
|
177
245
|
if (client === null)
|
|
178
246
|
return;
|
|
247
|
+
const closingClient = client;
|
|
248
|
+
const closingSlot = slot;
|
|
249
|
+
if (closingSlot !== null && connectionLost === null) {
|
|
250
|
+
await dropSlotExplicitly(closingClient, closingSlot);
|
|
251
|
+
}
|
|
179
252
|
try {
|
|
180
|
-
await
|
|
253
|
+
await closingClient.end();
|
|
181
254
|
}
|
|
182
|
-
catch {
|
|
183
|
-
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (savedContext !== null) {
|
|
257
|
+
emitCollectorError(savedContext, `closing the database connection failed (${describeError(error)})`);
|
|
258
|
+
}
|
|
184
259
|
}
|
|
185
260
|
client = null;
|
|
186
261
|
slot = null;
|
|
@@ -189,14 +264,28 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
189
264
|
collectorId: `postgres-row-collector:${processId}`,
|
|
190
265
|
async start(context) {
|
|
191
266
|
savedContext = context;
|
|
192
|
-
|
|
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;
|
|
193
274
|
try {
|
|
194
275
|
candidate = await clientFactory(options.connectionString);
|
|
195
|
-
|
|
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`);
|
|
196
283
|
}
|
|
197
284
|
catch (error) {
|
|
198
|
-
const detail = error instanceof
|
|
285
|
+
const detail = error instanceof OperationTimeoutError ? error.message : describeError(error);
|
|
199
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);
|
|
200
289
|
return { available: false, reason: refusalReason };
|
|
201
290
|
}
|
|
202
291
|
client = candidate;
|
|
@@ -228,7 +317,7 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
228
317
|
identityByTable.set(`${String(r.schema)}.${String(r.table)}`, replidentToCompleteness(r.identity));
|
|
229
318
|
}
|
|
230
319
|
slot = makeSlotName(processId);
|
|
231
|
-
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]);
|
|
232
321
|
return { available: true };
|
|
233
322
|
}
|
|
234
323
|
catch (error) {
|
|
@@ -245,7 +334,13 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
245
334
|
const activeSlot = slot;
|
|
246
335
|
const context = savedContext;
|
|
247
336
|
try {
|
|
248
|
-
|
|
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
|
+
}
|
|
249
344
|
for (const row of changes.rows) {
|
|
250
345
|
const data = String(row.data ?? "");
|
|
251
346
|
const xid = row.xid;
|
|
@@ -257,7 +352,7 @@ export function createPostgresRowChangeCollector(options) {
|
|
|
257
352
|
}
|
|
258
353
|
}
|
|
259
354
|
catch (error) {
|
|
260
|
-
const detail = error instanceof
|
|
355
|
+
const detail = error instanceof OperationTimeoutError || connectionLost !== null ? error.message : describeError(error);
|
|
261
356
|
refusalReason = `could not read the replication slot: ${detail}`;
|
|
262
357
|
if (context !== null)
|
|
263
358
|
emitCollectorError(context, detail);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-row-collector.js","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;;;;;;;;;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAkB3D,MAAM,UAAU,GAAqB,gBAAgB,CAAC;AAMtD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,MAAM,MAAM,GAAG,MAAgG,CAAC;IAChH,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IAC5D,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,SAAgC,CAAC;AAC1C,CAAC;AAED,qIAAqI;AACrI,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,gBAAwB;IACjE,uEAAuE;IACvE,0EAA0E;IAC1E,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,MAAM,kCAAC,UAAU,EAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,iBAAiB,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAa;IAC5C,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IAChD,OAAO,UAAU,CAAC,CAAC,qGAAqG;AAC1H,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAA0C;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,sBAAsB,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,oBAAoB,CAAC;IAEpE,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,YAAY,GAA4B,IAAI,CAAC;IACjD,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE5D,SAAS,mBAAmB;QAC1B,MAAM,SAAS,GAAG;YAChB,YAAY,EAAE,aAAsB;YACpC,MAAM,EAAE,wFAAwF;SACjG,CAAC;QACF,MAAM,mBAAmB,GACvB,aAAa,KAAK,IAAI;YACpB,CAAC,CAAC,EAAE,YAAY,EAAE,aAAsB,EAAE,MAAM,EAAE,aAAa,EAAE;YACjE,CAAC,CAAC;gBACE,YAAY,EAAE,WAAoB;gBAClC,MAAM,EACJ,2FAA2F;oBAC3F,0FAA0F;oBAC1F,qDAAqD;aACxD,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,aAAa,CACpB,OAAyB,EACzB,MAA6D,EAC7D,GAAY;QAEZ,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,UAAU,CAAC;QAC3F,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,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC3D,kBAAkB,EAAE,YAAY;aACjC;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,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,8CAA8C,SAAS,aAAa,MAAM,EAAE;oBACjF,WAAW,EAAE,0BAA0B,SAAS,EAAE;oBAClD,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,2BAA2B,SAAS,aAAa,MAAM,2CAA2C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvI,CAAC;IACH,CAAC;IAED,KAAK,UAAU,WAAW;QACxB,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,WAAW,EAAE,0BAA0B,SAAS,EAAE;QAElD,KAAK,CAAC,KAAK,CAAC,OAAyB;YACnC,YAAY,GAAG,OAAO,CAAC;YACvB,IAAI,SAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAC1D,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAC5B,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,4CAA4C,MAAM,0CAA0C,CAAC;gBAC7G,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,SAAS,CAAC;YAEnB,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,MAAM,CAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAyC,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACxH,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,aAAa;wBACX,iBAAiB,QAAQ,IAAI,SAAS,kEAAkE;4BACxG,yFAAyF,CAAC;oBAC5F,MAAM,WAAW,EAAE,CAAC;oBACpB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;gBACrD,CAAC;gBAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;gBACpH,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAiE,CAAC;gBAChG,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;oBACnF,aAAa;wBACX,uGAAuG;4BACvG,qFAAqF,CAAC;oBACxF,MAAM,WAAW,EAAE,CAAC;oBACpB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;gBACrD,CAAC;gBAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,KAAK,CACvC,6EAA6E;oBAC3E,gEAAgE;oBAChE,iFAAiF,CACpF,CAAC;gBACF,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;oBACtC,MAAM,CAAC,GAAG,GAA6D,CAAC;oBACxE,eAAe,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrG,CAAC;gBAED,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,oFAAoF,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjH,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,sCAAsC,MAAM,EAAE,CAAC;gBAC/D,MAAM,WAAW,EAAE,CAAC;gBACpB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI;YACR,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC;YACxB,MAAM,OAAO,GAAG,YAAY,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,mEAAmE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5H,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAG,MAAM,CAAE,GAA0B,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;oBAC5D,MAAM,GAAG,GAAI,GAAyB,CAAC,GAAG,CAAC;oBAC3C,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;oBAC3C,IAAI,MAAM,KAAK,IAAI;wBAAE,SAAS,CAAC,uDAAuD;oBACtF,IAAI,OAAO,KAAK,IAAI;wBAAE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACH,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,wCAAwC,MAAM,EAAE,CAAC;gBACjE,IAAI,OAAO,KAAK,IAAI;oBAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5D,CAAC;oBAAS,CAAC;gBACT,MAAM,WAAW,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAED,YAAY;YACV,OAAO,mBAAmB,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AAarE,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,iGAAiG;AACjG,SAAS,MAAM,CAAC,IAAa;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC7H,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,+FAA+F;AAC/F,SAAS,WAAW,CAAC,IAAa;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,wBAAwB;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IACvI,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC;IACtE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AAC/J,CAAC;AAED,SAAS,YAAY,CAAC,KAAqC;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,QAAyC;IAC3D,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;QACrB,cAAc,CAAC,OAAiB;YAC9B,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,oFAAoF;YACpF,8CAA8C;YAC9C,IAAI,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACxE,OAAO,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QACtF,CAAC;QACD,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE;QACtD,cAAc,CAAI,aAAsB,EAAE,QAAqB;YAC7D,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC5F,CAAC;QACD,mBAAmB,CAAC,KAAyB;YAC3C,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,EAAE,EAAE,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,gBAAgB,CAAC,KAA8C;YAC7D,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,QAAQ,EAAE,EAAE,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AACxE,MAAM,MAAM,GAAG,UAAqD,CAAC;AACrE,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACvB,sFAAsF;IACtF,MAAM,IAAI,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAC,CAAC;IAC5G,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,QAAQ,GAA2C,MAAM,CAAC,GAAG,CAA2C,CAAC;QAC7G,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE;YACrC,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,KAAK;YACjB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;YACf,kFAAkF;YAClF,GAAG,CAAC,KAAc;gBAChB,QAAQ,GAAG,KAA+C,CAAC;YAC7D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|