nugi-ts-logs-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +218 -0
  2. package/dist/adapters/common.d.ts +43 -0
  3. package/dist/adapters/common.d.ts.map +1 -0
  4. package/dist/adapters/common.js +153 -0
  5. package/dist/adapters/common.js.map +1 -0
  6. package/dist/adapters/express.d.ts +29 -0
  7. package/dist/adapters/express.d.ts.map +1 -0
  8. package/dist/adapters/express.js +62 -0
  9. package/dist/adapters/express.js.map +1 -0
  10. package/dist/adapters/fastify.d.ts +18 -0
  11. package/dist/adapters/fastify.d.ts.map +1 -0
  12. package/dist/adapters/fastify.js +78 -0
  13. package/dist/adapters/fastify.js.map +1 -0
  14. package/dist/adapters/nestjs.d.ts +93 -0
  15. package/dist/adapters/nestjs.d.ts.map +1 -0
  16. package/dist/adapters/nestjs.js +310 -0
  17. package/dist/adapters/nestjs.js.map +1 -0
  18. package/dist/client.d.ts +66 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +299 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/config.d.ts +116 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +51 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/index.d.ts +32 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +96 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/instrumentation/db-error.d.ts +27 -0
  31. package/dist/instrumentation/db-error.d.ts.map +1 -0
  32. package/dist/instrumentation/db-error.js +153 -0
  33. package/dist/instrumentation/db-error.js.map +1 -0
  34. package/dist/instrumentation/query-capture.d.ts +39 -0
  35. package/dist/instrumentation/query-capture.d.ts.map +1 -0
  36. package/dist/instrumentation/query-capture.js +359 -0
  37. package/dist/instrumentation/query-capture.js.map +1 -0
  38. package/dist/internal/breadcrumbs.d.ts +32 -0
  39. package/dist/internal/breadcrumbs.d.ts.map +1 -0
  40. package/dist/internal/breadcrumbs.js +31 -0
  41. package/dist/internal/breadcrumbs.js.map +1 -0
  42. package/dist/internal/console-capture.d.ts +31 -0
  43. package/dist/internal/console-capture.d.ts.map +1 -0
  44. package/dist/internal/console-capture.js +113 -0
  45. package/dist/internal/console-capture.js.map +1 -0
  46. package/dist/internal/context.d.ts +21 -0
  47. package/dist/internal/context.d.ts.map +1 -0
  48. package/dist/internal/context.js +42 -0
  49. package/dist/internal/context.js.map +1 -0
  50. package/dist/internal/diagnostics.d.ts +9 -0
  51. package/dist/internal/diagnostics.d.ts.map +1 -0
  52. package/dist/internal/diagnostics.js +43 -0
  53. package/dist/internal/diagnostics.js.map +1 -0
  54. package/dist/internal/http-utils.d.ts +16 -0
  55. package/dist/internal/http-utils.d.ts.map +1 -0
  56. package/dist/internal/http-utils.js +81 -0
  57. package/dist/internal/http-utils.js.map +1 -0
  58. package/dist/internal/ids.d.ts +9 -0
  59. package/dist/internal/ids.d.ts.map +1 -0
  60. package/dist/internal/ids.js +34 -0
  61. package/dist/internal/ids.js.map +1 -0
  62. package/dist/internal/metadata.d.ts +4 -0
  63. package/dist/internal/metadata.d.ts.map +1 -0
  64. package/dist/internal/metadata.js +151 -0
  65. package/dist/internal/metadata.js.map +1 -0
  66. package/dist/internal/propagation.d.ts +30 -0
  67. package/dist/internal/propagation.d.ts.map +1 -0
  68. package/dist/internal/propagation.js +99 -0
  69. package/dist/internal/propagation.js.map +1 -0
  70. package/dist/internal/sanitize.d.ts +11 -0
  71. package/dist/internal/sanitize.d.ts.map +1 -0
  72. package/dist/internal/sanitize.js +77 -0
  73. package/dist/internal/sanitize.js.map +1 -0
  74. package/dist/internal/stacktrace.d.ts +29 -0
  75. package/dist/internal/stacktrace.d.ts.map +1 -0
  76. package/dist/internal/stacktrace.js +182 -0
  77. package/dist/internal/stacktrace.js.map +1 -0
  78. package/dist/signals/checkins.d.ts +28 -0
  79. package/dist/signals/checkins.d.ts.map +1 -0
  80. package/dist/signals/checkins.js +76 -0
  81. package/dist/signals/checkins.js.map +1 -0
  82. package/dist/signals/logger.d.ts +26 -0
  83. package/dist/signals/logger.d.ts.map +1 -0
  84. package/dist/signals/logger.js +63 -0
  85. package/dist/signals/logger.js.map +1 -0
  86. package/dist/signals/metrics.d.ts +58 -0
  87. package/dist/signals/metrics.d.ts.map +1 -0
  88. package/dist/signals/metrics.js +166 -0
  89. package/dist/signals/metrics.js.map +1 -0
  90. package/dist/signals/tracer.d.ts +77 -0
  91. package/dist/signals/tracer.d.ts.map +1 -0
  92. package/dist/signals/tracer.js +210 -0
  93. package/dist/signals/tracer.js.map +1 -0
  94. package/dist/transport/batcher.d.ts +31 -0
  95. package/dist/transport/batcher.d.ts.map +1 -0
  96. package/dist/transport/batcher.js +129 -0
  97. package/dist/transport/batcher.js.map +1 -0
  98. package/dist/transport/legacy-logs.d.ts +21 -0
  99. package/dist/transport/legacy-logs.d.ts.map +1 -0
  100. package/dist/transport/legacy-logs.js +61 -0
  101. package/dist/transport/legacy-logs.js.map +1 -0
  102. package/dist/transport/retry.d.ts +16 -0
  103. package/dist/transport/retry.d.ts.map +1 -0
  104. package/dist/transport/retry.js +43 -0
  105. package/dist/transport/retry.js.map +1 -0
  106. package/dist/transport/transport.d.ts +14 -0
  107. package/dist/transport/transport.d.ts.map +1 -0
  108. package/dist/transport/transport.js +70 -0
  109. package/dist/transport/transport.js.map +1 -0
  110. package/dist/types.d.ts +136 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +8 -0
  113. package/dist/types.js.map +1 -0
  114. package/package.json +56 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Detect and normalize database / ORM errors so we can report them with
3
+ * name, message, stack, SQL, and driver codes.
4
+ */
5
+ export interface NormalizedDbError {
6
+ name: string;
7
+ message: string;
8
+ stack?: string;
9
+ code?: string | number;
10
+ orm?: string;
11
+ sql?: string;
12
+ /** Extra ORM-specific fields (safe scalars / short strings only). */
13
+ details?: Record<string, unknown>;
14
+ }
15
+ /** True when `err` looks like a database / ORM failure. */
16
+ export declare function isDatabaseError(err: unknown): boolean;
17
+ /** Pull a stable reportable shape from any ORM / driver error. */
18
+ export declare function normalizeDbError(err: unknown, hint?: {
19
+ orm?: string;
20
+ sql?: string;
21
+ }): NormalizedDbError;
22
+ /**
23
+ * Build a synthetic Error that preserves the original name/stack for ReportError,
24
+ * while keeping a reference to the original via `cause` when available.
25
+ */
26
+ export declare function toReportableError(normalized: NormalizedDbError, original?: unknown): Error;
27
+ //# sourceMappingURL=db-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-error.d.ts","sourceRoot":"","sources":["../../src/instrumentation/db-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AA0BD,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA2BrD;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,iBAAiB,CA4DnB;AAuBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAY1F"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Detect and normalize database / ORM errors so we can report them with
4
+ * name, message, stack, SQL, and driver codes.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isDatabaseError = isDatabaseError;
8
+ exports.normalizeDbError = normalizeDbError;
9
+ exports.toReportableError = toReportableError;
10
+ const ORM_NAME_HINTS = [
11
+ { match: /^Sequelize/i, orm: 'sequelize' },
12
+ { match: /^Prisma/i, orm: 'prisma' },
13
+ { match: /^QueryFailedError$/i, orm: 'typeorm' },
14
+ { match: /^TypeORM/i, orm: 'typeorm' },
15
+ { match: /^Mongo(Server|Network|Error)/i, orm: 'mongodb' },
16
+ { match: /^MongooseError/i, orm: 'mongoose' },
17
+ { match: /^Knex/i, orm: 'knex' },
18
+ { match: /^Drizzle/i, orm: 'drizzle' },
19
+ ];
20
+ const DRIVER_CODE_KEYS = [
21
+ 'code',
22
+ 'errno',
23
+ 'sqlState',
24
+ 'sqlMessage',
25
+ 'constraint',
26
+ 'table',
27
+ 'schema',
28
+ 'detail',
29
+ 'severity',
30
+ 'routine',
31
+ ];
32
+ /** True when `err` looks like a database / ORM failure. */
33
+ function isDatabaseError(err) {
34
+ if (!err || typeof err !== 'object')
35
+ return false;
36
+ const e = err;
37
+ const name = typeof e.name === 'string' ? e.name : '';
38
+ if (ORM_NAME_HINTS.some(({ match }) => match.test(name)))
39
+ return true;
40
+ // Sequelize / TypeORM often nest the driver error.
41
+ if (e.parent || e.original || e.driverError)
42
+ return true;
43
+ // Prisma client errors expose `clientVersion` + `code` (P2xxx).
44
+ if (typeof e.clientVersion === 'string' && (e.code != null || name.startsWith('Prisma'))) {
45
+ return true;
46
+ }
47
+ // pg / mysql2 style
48
+ if (typeof e.code === 'string' && (e.severity != null || e.sqlState != null || e.errno != null)) {
49
+ return true;
50
+ }
51
+ // Message heuristics as last resort
52
+ const msg = typeof e.message === 'string' ? e.message : '';
53
+ if (/SQLSTATE|ER_DUP_ENTRY|ECONNREFUSED.*:(3306|5432|27017)|deadlock|duplicate key/i.test(msg)) {
54
+ return true;
55
+ }
56
+ return false;
57
+ }
58
+ /** Pull a stable reportable shape from any ORM / driver error. */
59
+ function normalizeDbError(err, hint) {
60
+ if (!(err instanceof Error) && (!err || typeof err !== 'object')) {
61
+ return {
62
+ name: 'DatabaseError',
63
+ message: String(err),
64
+ orm: hint?.orm,
65
+ sql: hint?.sql,
66
+ };
67
+ }
68
+ const e = err;
69
+ const name = e.name || 'DatabaseError';
70
+ const orm = hint?.orm ||
71
+ ORM_NAME_HINTS.find(({ match }) => match.test(name))?.orm ||
72
+ (typeof e.clientVersion === 'string' ? 'prisma' : undefined);
73
+ const nested = (e.parent || e.original || e.driverError || e.cause);
74
+ const code = pickCode(e) ??
75
+ (nested ? pickCode(nested) : undefined) ??
76
+ (typeof e.meta?.code === 'string' || typeof e.meta?.code === 'number'
77
+ ? e.meta.code
78
+ : undefined);
79
+ const sql = hint?.sql ||
80
+ (typeof e.sql === 'string' ? e.sql : undefined) ||
81
+ (typeof e.query === 'string' ? e.query : undefined) ||
82
+ (typeof nested?.sql === 'string' ? nested.sql : undefined);
83
+ const stack = typeof e.stack === 'string' && e.stack.trim() ? e.stack : nested?.stack;
84
+ const details = {};
85
+ collectDriverFields(e, details);
86
+ if (nested)
87
+ collectDriverFields(nested, details);
88
+ if (e.meta && typeof e.meta === 'object') {
89
+ for (const [k, v] of Object.entries(e.meta)) {
90
+ if (isShortScalar(v) && details[k] == null)
91
+ details[k] = v;
92
+ }
93
+ }
94
+ if (Array.isArray(e.parameters) && e.parameters.length <= 20) {
95
+ details.parameters = e.parameters.map((p) => isShortScalar(p) ? p : typeof p);
96
+ }
97
+ if (typeof e.clientVersion === 'string')
98
+ details.clientVersion = e.clientVersion;
99
+ return {
100
+ name,
101
+ message: e.message || String(err),
102
+ stack,
103
+ code,
104
+ orm,
105
+ sql: sql && sql.length > 4000 ? `${sql.slice(0, 4000)}…` : sql,
106
+ details: Object.keys(details).length ? details : undefined,
107
+ };
108
+ }
109
+ function pickCode(e) {
110
+ if (typeof e.code === 'string' || typeof e.code === 'number')
111
+ return e.code;
112
+ if (typeof e.errno === 'number')
113
+ return e.errno;
114
+ if (typeof e.sqlState === 'string')
115
+ return e.sqlState;
116
+ return undefined;
117
+ }
118
+ function collectDriverFields(e, out) {
119
+ for (const key of DRIVER_CODE_KEYS) {
120
+ const v = e[key];
121
+ if (isShortScalar(v) && out[key] == null)
122
+ out[key] = v;
123
+ }
124
+ }
125
+ function isShortScalar(v) {
126
+ if (v == null)
127
+ return false;
128
+ if (typeof v === 'boolean' || typeof v === 'number')
129
+ return true;
130
+ if (typeof v === 'string')
131
+ return v.length <= 500;
132
+ return false;
133
+ }
134
+ /**
135
+ * Build a synthetic Error that preserves the original name/stack for ReportError,
136
+ * while keeping a reference to the original via `cause` when available.
137
+ */
138
+ function toReportableError(normalized, original) {
139
+ const err = new Error(normalized.message);
140
+ err.name = normalized.name;
141
+ if (normalized.stack)
142
+ err.stack = normalized.stack;
143
+ if (original instanceof Error && 'cause' in Error.prototype) {
144
+ try {
145
+ err.cause = original;
146
+ }
147
+ catch {
148
+ /* ignore */
149
+ }
150
+ }
151
+ return err;
152
+ }
153
+ //# sourceMappingURL=db-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-error.js","sourceRoot":"","sources":["../../src/instrumentation/db-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type NormalizedDbError } from './db-error';
2
+ export interface QueryCaptureInfo {
3
+ query: string;
4
+ durationMs: number;
5
+ /** Driver / ORM that produced the query. */
6
+ orm?: string;
7
+ success?: boolean;
8
+ error?: string;
9
+ /** Structured ORM / driver failure (name, stack, code, …). */
10
+ dbError?: NormalizedDbError;
11
+ /** Original thrown value — used to dedupe ReportError with Nest interceptors. */
12
+ cause?: unknown;
13
+ /** Optional HTTP request correlation id. */
14
+ requestId?: string;
15
+ }
16
+ export type QueryCaptureHandler = (info: QueryCaptureInfo) => void;
17
+ type StopFn = () => void;
18
+ /**
19
+ * Auto-instrument common Node DB drivers/ORMs so SQL is captured without
20
+ * manual logQuery() calls. Safe no-ops when a package isn't installed.
21
+ *
22
+ * Patches (best-effort):
23
+ * - `pg` Client + Pool
24
+ * - `mysql2` / `mysql2/promise`
25
+ * - `sequelize` Sequelize.prototype.query
26
+ * - `typeorm` DataSource / EntityManager query (when installed)
27
+ *
28
+ * Prisma needs an explicit client wrap — use `instrumentPrisma(prisma)`.
29
+ *
30
+ * Failed queries include `dbError` (name, message, stack, code) so the host
31
+ * can ReportError with a full stack trace.
32
+ */
33
+ export declare function startQueryCapture(onQuery: QueryCaptureHandler): StopFn;
34
+ /** Wrap a PrismaClient so every query is reported. Returns the same client. */
35
+ export declare function instrumentPrisma<T extends {
36
+ $extends: Function;
37
+ }>(prisma: T, onQuery: QueryCaptureHandler): T;
38
+ export {};
39
+ //# sourceMappingURL=query-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-capture.d.ts","sourceRoot":"","sources":["../../src/instrumentation/query-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AActE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEnE,KAAK,MAAM,GAAG,MAAM,IAAI,CAAC;AAEzB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAoCtE;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,EAC/D,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,mBAAmB,GAC3B,CAAC,CAgDH"}
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startQueryCapture = startQueryCapture;
4
+ exports.instrumentPrisma = instrumentPrisma;
5
+ const db_error_1 = require("./db-error");
6
+ /** Debug helper — never throws into the host app. */
7
+ function debug(message) {
8
+ try {
9
+ if (process.env.NUGI_DEBUG === '1' || process.env.DEBUG?.includes('nugi')) {
10
+ // eslint-disable-next-line no-console
11
+ console.debug(`[nugi-ts-logs-sdk:QueryCapture] ${message}`);
12
+ }
13
+ }
14
+ catch {
15
+ /* ignore */
16
+ }
17
+ }
18
+ /**
19
+ * Auto-instrument common Node DB drivers/ORMs so SQL is captured without
20
+ * manual logQuery() calls. Safe no-ops when a package isn't installed.
21
+ *
22
+ * Patches (best-effort):
23
+ * - `pg` Client + Pool
24
+ * - `mysql2` / `mysql2/promise`
25
+ * - `sequelize` Sequelize.prototype.query
26
+ * - `typeorm` DataSource / EntityManager query (when installed)
27
+ *
28
+ * Prisma needs an explicit client wrap — use `instrumentPrisma(prisma)`.
29
+ *
30
+ * Failed queries include `dbError` (name, message, stack, code) so the host
31
+ * can ReportError with a full stack trace.
32
+ */
33
+ function startQueryCapture(onQuery) {
34
+ const stops = [];
35
+ try {
36
+ stops.push(patchPg(onQuery));
37
+ }
38
+ catch (err) {
39
+ debug(`pg patch skipped: ${String(err)}`);
40
+ }
41
+ try {
42
+ stops.push(patchMysql2(onQuery));
43
+ }
44
+ catch (err) {
45
+ debug(`mysql2 patch skipped: ${String(err)}`);
46
+ }
47
+ try {
48
+ stops.push(patchSequelize(onQuery));
49
+ }
50
+ catch (err) {
51
+ debug(`sequelize patch skipped: ${String(err)}`);
52
+ }
53
+ try {
54
+ stops.push(patchTypeOrm(onQuery));
55
+ }
56
+ catch (err) {
57
+ debug(`typeorm patch skipped: ${String(err)}`);
58
+ }
59
+ return () => {
60
+ for (const stop of stops) {
61
+ try {
62
+ stop();
63
+ }
64
+ catch {
65
+ /* ignore */
66
+ }
67
+ }
68
+ };
69
+ }
70
+ /** Wrap a PrismaClient so every query is reported. Returns the same client. */
71
+ function instrumentPrisma(prisma, onQuery) {
72
+ try {
73
+ return prisma.$extends({
74
+ name: 'nugi-logs-query-capture',
75
+ query: {
76
+ async $allOperations({ operation, model, args, query, }) {
77
+ const start = Date.now();
78
+ let success = true;
79
+ let error;
80
+ let dbError;
81
+ let cause;
82
+ try {
83
+ return await query(args);
84
+ }
85
+ catch (err) {
86
+ success = false;
87
+ cause = err;
88
+ dbError = (0, db_error_1.normalizeDbError)(err, { orm: 'prisma' });
89
+ error = dbError.message;
90
+ throw err;
91
+ }
92
+ finally {
93
+ const label = model ? `${model}.${operation}` : operation;
94
+ safeEmit(onQuery, {
95
+ query: `prisma:${label}`,
96
+ durationMs: Date.now() - start,
97
+ orm: 'prisma',
98
+ success,
99
+ error,
100
+ dbError,
101
+ cause,
102
+ });
103
+ }
104
+ },
105
+ },
106
+ });
107
+ }
108
+ catch (err) {
109
+ debug(`instrumentPrisma failed: ${String(err)}`);
110
+ return prisma;
111
+ }
112
+ }
113
+ function safeEmit(onQuery, info) {
114
+ try {
115
+ const query = info.query && info.query.length > 4000
116
+ ? `${info.query.slice(0, 4000)}…`
117
+ : info.query;
118
+ onQuery({ ...info, query });
119
+ }
120
+ catch {
121
+ /* never break the host query */
122
+ }
123
+ }
124
+ function tryRequire(id) {
125
+ try {
126
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
127
+ return require(id);
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ function finishFromErr(err, orm, sql) {
134
+ if (!err)
135
+ return { success: true };
136
+ const dbError = (0, db_error_1.normalizeDbError)(err, { orm, sql });
137
+ return { success: false, error: dbError.message, dbError };
138
+ }
139
+ function patchPg(onQuery) {
140
+ const pg = tryRequire('pg');
141
+ if (!pg?.Client?.prototype?.query)
142
+ return () => undefined;
143
+ const Client = pg.Client;
144
+ const Pool = pg.Pool;
145
+ const origClient = Client.prototype.query;
146
+ const origPool = Pool?.prototype?.query;
147
+ Client.prototype.query = function patchedClientQuery(...args) {
148
+ return wrapDriverQuery(origClient, this, args, onQuery, 'pg');
149
+ };
150
+ if (Pool && origPool) {
151
+ Pool.prototype.query = function patchedPoolQuery(...args) {
152
+ return wrapDriverQuery(origPool, this, args, onQuery, 'pg');
153
+ };
154
+ }
155
+ return () => {
156
+ Client.prototype.query = origClient;
157
+ if (Pool && origPool)
158
+ Pool.prototype.query = origPool;
159
+ };
160
+ }
161
+ /**
162
+ * mysql2's Query object defines a trap `.then()` that *throws* this exact
163
+ * error when awaited. Never treat "has .then" as Promise-like for drivers.
164
+ */
165
+ function isRealPromise(value) {
166
+ return value instanceof Promise;
167
+ }
168
+ function wrapDriverQuery(orig, ctx, args, onQuery, orm) {
169
+ const sql = extractSql(args[0]);
170
+ const start = Date.now();
171
+ let finished = false;
172
+ const finish = (success, err) => {
173
+ if (finished || !sql)
174
+ return;
175
+ finished = true;
176
+ const fail = success ? undefined : finishFromErr(err, orm, sql);
177
+ safeEmit(onQuery, {
178
+ query: sql,
179
+ durationMs: Date.now() - start,
180
+ orm,
181
+ success,
182
+ error: fail?.error,
183
+ dbError: fail?.dbError,
184
+ cause: success ? undefined : err,
185
+ });
186
+ };
187
+ const last = args[args.length - 1];
188
+ if (typeof last === 'function') {
189
+ const wrapped = args.slice();
190
+ wrapped[wrapped.length - 1] = function (err, res) {
191
+ finish(!err, err);
192
+ return last(err, res);
193
+ };
194
+ return orig.apply(ctx, wrapped);
195
+ }
196
+ const result = orig.apply(ctx, args);
197
+ if (isRealPromise(result)) {
198
+ return result.then((v) => {
199
+ finish(true);
200
+ return v;
201
+ }, (err) => {
202
+ finish(false, err);
203
+ throw err;
204
+ });
205
+ }
206
+ if (result && typeof result.on === 'function') {
207
+ result.on('end', () => finish(true));
208
+ result.on('error', (err) => {
209
+ finish(false, err);
210
+ });
211
+ return result;
212
+ }
213
+ finish(true);
214
+ return result;
215
+ }
216
+ function extractSql(input) {
217
+ if (typeof input === 'string')
218
+ return input;
219
+ if (input && typeof input === 'object') {
220
+ const o = input;
221
+ if (typeof o.text === 'string')
222
+ return o.text;
223
+ if (typeof o.sql === 'string')
224
+ return o.sql;
225
+ }
226
+ return undefined;
227
+ }
228
+ function patchMysql2(onQuery) {
229
+ const mysql = tryRequire('mysql2');
230
+ if (!mysql)
231
+ return () => undefined;
232
+ const stops = [];
233
+ const patchProto = (proto) => {
234
+ if (!proto?.query || proto.query.__nugiPatched)
235
+ return;
236
+ const orig = proto.query;
237
+ function patched(...args) {
238
+ return wrapDriverQuery(orig, this, args, onQuery, 'mysql2');
239
+ }
240
+ patched.__nugiPatched = true;
241
+ proto.query = patched;
242
+ stops.push(() => {
243
+ proto.query = orig;
244
+ });
245
+ };
246
+ patchProto(mysql.Connection?.prototype);
247
+ patchProto(mysql.Pool?.prototype);
248
+ patchProto(mysql.PoolConnection?.prototype);
249
+ return () => stops.forEach((s) => s());
250
+ }
251
+ function patchSequelize(onQuery) {
252
+ const sequelize = tryRequire('sequelize');
253
+ const Sequelize = sequelize?.Sequelize || sequelize?.default || sequelize;
254
+ if (!Sequelize?.prototype?.query)
255
+ return () => undefined;
256
+ if (Sequelize.prototype.query.__nugiPatched)
257
+ return () => undefined;
258
+ const orig = Sequelize.prototype.query;
259
+ async function patchedSequelizeQuery(sql, options) {
260
+ const text = typeof sql === 'string'
261
+ ? sql
262
+ : sql?.query || sql?.sql || extractSql(sql) || String(sql);
263
+ const start = Date.now();
264
+ let success = true;
265
+ let error;
266
+ let dbError;
267
+ let cause;
268
+ try {
269
+ return await orig.call(this, sql, options);
270
+ }
271
+ catch (err) {
272
+ success = false;
273
+ cause = err;
274
+ dbError = (0, db_error_1.normalizeDbError)(err, { orm: 'sequelize', sql: text });
275
+ error = dbError.message;
276
+ throw err;
277
+ }
278
+ finally {
279
+ safeEmit(onQuery, {
280
+ query: text,
281
+ durationMs: Date.now() - start,
282
+ orm: 'sequelize',
283
+ success,
284
+ error,
285
+ dbError,
286
+ cause,
287
+ });
288
+ }
289
+ }
290
+ patchedSequelizeQuery.__nugiPatched = true;
291
+ Sequelize.prototype.query = patchedSequelizeQuery;
292
+ return () => {
293
+ Sequelize.prototype.query = orig;
294
+ };
295
+ }
296
+ /**
297
+ * Best-effort TypeORM patch: EntityManager.query / DataSource.query.
298
+ * QueryFailedError carries .query + .stack.
299
+ */
300
+ function patchTypeOrm(onQuery) {
301
+ const typeorm = tryRequire('typeorm');
302
+ if (!typeorm)
303
+ return () => undefined;
304
+ const stops = [];
305
+ const patchQueryMethod = (proto, ormLabel) => {
306
+ if (!proto?.query || proto.query.__nugiPatched)
307
+ return;
308
+ const orig = proto.query;
309
+ async function patched(query, parameters) {
310
+ const start = Date.now();
311
+ let success = true;
312
+ let error;
313
+ let dbError;
314
+ let cause;
315
+ try {
316
+ return await orig.call(this, query, parameters);
317
+ }
318
+ catch (err) {
319
+ success = false;
320
+ cause = err;
321
+ dbError = (0, db_error_1.normalizeDbError)(err, { orm: 'typeorm', sql: query });
322
+ error = dbError.message;
323
+ throw err;
324
+ }
325
+ finally {
326
+ safeEmit(onQuery, {
327
+ query: typeof query === 'string' ? query : String(query),
328
+ durationMs: Date.now() - start,
329
+ orm: ormLabel,
330
+ success,
331
+ error,
332
+ dbError,
333
+ cause,
334
+ });
335
+ }
336
+ }
337
+ patched.__nugiPatched = true;
338
+ proto.query = patched;
339
+ stops.push(() => {
340
+ proto.query = orig;
341
+ });
342
+ };
343
+ try {
344
+ if (typeorm.DataSource?.prototype)
345
+ patchQueryMethod(typeorm.DataSource.prototype, 'typeorm');
346
+ }
347
+ catch {
348
+ /* ignore */
349
+ }
350
+ try {
351
+ if (typeorm.EntityManager?.prototype)
352
+ patchQueryMethod(typeorm.EntityManager.prototype, 'typeorm');
353
+ }
354
+ catch {
355
+ /* ignore */
356
+ }
357
+ return () => stops.forEach((s) => s());
358
+ }
359
+ //# sourceMappingURL=query-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-capture.js","sourceRoot":"","sources":["../../src/instrumentation/query-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Attributes, Severity } from '../types';
2
+ /**
3
+ * A single breadcrumb — a lightweight trail entry (console output, log, HTTP
4
+ * call, etc.) captured leading up to an error, mirroring Sentry's model.
5
+ */
6
+ export interface Breadcrumb {
7
+ /** ISO-8601 timestamp. */
8
+ timestamp: string;
9
+ /** Coarse category: 'console' | 'log' | 'http' | 'navigation' | custom. */
10
+ type: string;
11
+ /** Severity of the breadcrumb. */
12
+ level: Severity;
13
+ /** Human-readable message. */
14
+ message: string;
15
+ /** Optional structured data. */
16
+ data?: Attributes;
17
+ }
18
+ /**
19
+ * Fixed-capacity ring buffer of breadcrumbs. Oldest entries are dropped once
20
+ * capacity is reached. A snapshot is attached to error events so the trail that
21
+ * led to a failure travels with it.
22
+ */
23
+ export declare class BreadcrumbBuffer {
24
+ private readonly capacity;
25
+ private readonly items;
26
+ constructor(capacity: number);
27
+ add(crumb: Breadcrumb): void;
28
+ /** Oldest-first snapshot suitable for attaching to an event. */
29
+ snapshot(): Breadcrumb[];
30
+ clear(): void;
31
+ }
32
+ //# sourceMappingURL=breadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/internal/breadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAEb,QAAQ,EAAE,MAAM;IAE7C,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ5B,gEAAgE;IAChE,QAAQ,IAAI,UAAU,EAAE;IAIxB,KAAK,IAAI,IAAI;CAGd"}