autotel-mongoose 0.0.1 → 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Jag Reehal 2025
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/binding.gyp ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "targets": [
3
+ {
4
+ "target_name": "Setup",
5
+ "type": "none",
6
+ "sources": ["<!(node index.js > /dev/null 2>&1 && echo stub.c)"]
7
+ }
8
+ ]
9
+ }
package/dist/index.cjs CHANGED
@@ -373,7 +373,10 @@ function isMongooseInternalHook(handler) {
373
373
  "mongooseInternalHook",
374
374
  "noop",
375
375
  "wrapped",
376
- "bound "
376
+ "bound ",
377
+ "timestampsPreSave",
378
+ "timestampsPreUpdate",
379
+ "handleTimestampOption"
377
380
  ];
378
381
  if (mongooseInternalNamePatterns.some((pattern) => funcName.includes(pattern))) {
379
382
  return true;
@@ -408,6 +411,7 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
408
411
  if (handler[WRAPPED_HOOK_FLAG]) {
409
412
  return handler;
410
413
  }
414
+ const expectsCallback = handler.length > 0;
411
415
  const wrappedHook = function wrappedHook2(...args) {
412
416
  let modelName;
413
417
  let collectionName;
@@ -435,6 +439,21 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
435
439
  if (config.dbName) {
436
440
  span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);
437
441
  }
442
+ if (expectsCallback && args.length > 0 && typeof args[0] === "function") {
443
+ const originalNext = args[0];
444
+ args[0] = function wrappedNext(...nextArgs) {
445
+ const err = nextArgs[0];
446
+ if (err) {
447
+ traceHelpers.finalizeSpan(
448
+ span,
449
+ err instanceof Error ? err : new Error(String(err))
450
+ );
451
+ } else {
452
+ traceHelpers.finalizeSpan(span);
453
+ }
454
+ return originalNext.apply(this, nextArgs);
455
+ };
456
+ }
438
457
  return traceHelpers.runWithSpan(span, () => {
439
458
  try {
440
459
  const result = handler.apply(this, args);
@@ -450,7 +469,9 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
450
469
  throw error;
451
470
  });
452
471
  }
453
- traceHelpers.finalizeSpan(span);
472
+ if (!expectsCallback) {
473
+ traceHelpers.finalizeSpan(span);
474
+ }
454
475
  return result;
455
476
  } catch (error) {
456
477
  traceHelpers.finalizeSpan(
@@ -461,6 +482,7 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
461
482
  }
462
483
  });
463
484
  };
485
+ Object.defineProperty(wrappedHook, "length", { value: handler.length });
464
486
  wrappedHook[WRAPPED_HOOK_FLAG] = true;
465
487
  return wrappedHook;
466
488
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/statement.ts","../src/instrumentation.ts"],"names":["createStringRedactor","SpanKind","runWithSpan","finalizeSpan","getActiveSpan","wrappedHook","trace"],"mappings":";;;;;;;;AAEO,IAAM,kBAAA,GAAqB,eAAA;AAC3B,IAAM,sBAAA,GAAyB,mBAAA;AAC/B,IAAM,mBAAA,GAAsB,gBAAA;AAC5B,IAAM,uBAAA,GAA0B,oBAAA;AAChC,IAAM,iBAAA,GAAoB,cAAA;AAC1B,IAAM,mBAAA,GAAsB,gBAAA;AAC5B,IAAM,gBAAA,GAAmB,aAAA;AAEzB,IAAM,4BAAA,GAA+B,SAAA;;;AC+DrC,IAAM,mBAAA,GAAsB,kBAAA;ACnE5B,SAAS,iBAAA,CACd,YACA,OAAA,EACQ;AACR,EAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAC/B;AAWO,SAAS,uBAAuB,MAAA,EAGhB;AAErB,EAAA,IAAI,MAAA,CAAO,0BAA0B,KAAA,EAAO;AAC1C,IAAA,OAAO,MAAiB;AACtB,MAAA;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,aACJ,OAAO,MAAA,CAAO,qBAAA,KAA0B,UAAA,GACpC,OAAO,qBAAA,GACP,iBAAA;AAGN,EAAA,IAAI,MAAA;AACJ,EAAA,IACE,MAAA,CAAO,iBAAA,KAAsB,KAAA,IAC7B,MAAA,CAAO,sBAAsB,MAAA,EAC7B;AACA,IAAA,MAAA,GAASA,4BAAA,CAAqB,OAAO,iBAAiB,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,CACL,WACA,OAAA,KACuB;AACvB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,SAAA,EAAW,OAAO,CAAA;AACzC,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,EAChC,CAAA;AACF;;;ACtBA,IAAM,iBAAA,GAAoB,+BAAA;AAC1B,IAAM,iBAAA,GAAoB,sBAAA;AAMnB,IAAM,mBAAA,0BAA4C,oBAAoB,CAAA;AAU7E,SAAS,UAAA,CACP,MAAA,EACA,SAAA,EACA,SAAA,EACA,gBACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,EAAG,SAAS,IAAI,cAAc,CAAA,CAAA,GAC9B,SAAA,GACE,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GACzB,YAAY,SAAS,CAAA,CAAA;AAE3B,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,CAAC,mBAAmB,GAAG,4BAAA;AAAA,IACvB,CAAC,sBAAsB,GAAG;AAAA,GAC5B;AAEA,EAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,IAAA,UAAA,CAAW,uBAAuB,CAAA,GAAI,cAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,UAAA,CAAW,iBAAiB,IAAI,MAAA,CAAO,MAAA;AAAA,EACzC;AACA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,mBAAmB,IAAI,MAAA,CAAO,QAAA;AAAA,EAC3C;AACA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,UAAA,CAAW,gBAAgB,IAAI,MAAA,CAAO,QAAA;AAAA,EACxC;AAEA,EAAA,OAAO,MAAA,CAAO,UAAU,QAAA,EAAU,EAAE,MAAMC,gBAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AACzE;AAcA,SAAS,wBAAA,CACP,QACA,UAAA,EACA,SAAA,EACA,mBACA,YAAA,EACA,MAAA,EACA,QACA,gBAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,YAAA,CAAA,GAA2B,IAAA,EAAkB;AACzE,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,IAAI;AACF,YAAA,MAAM,UAA6B,EAAC;AACpC,YAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,UAAA,EAAY;AAC1C,cAAA,OAAA,CAAQ,SAAA,GAAY,OAAO,SAAA,EAAU;AAAA,YACvC;AACA,YAAA,IAAI,MAAA,CAAO,YAAY,KAAA,CAAA,EAAW;AAChC,cAAA,OAAA,CAAQ,UAAU,MAAA,CAAO,OAAA;AAAA,YAC3B;AACA,YAAA,IAAI,OAAO,MAAA,CAAO,UAAA,KAAe,UAAA,EAAY;AAC3C,cAAA,OAAA,CAAQ,OAAA,GAAU,OAAO,UAAA,EAAW;AAAA,YACtC;AACA,YAAA,IAAI,MAAA,CAAO,YAAY,KAAA,CAAA,EAAW;AAChC,cAAA,OAAA,CAAQ,SAAS,MAAA,CAAO,OAAA;AAAA,YAC1B;AACA,YAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA;AACzD,YAAA,IAAI,aAAA,EAAe;AACjB,cAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,aAAa,CAAA;AAAA,YACrD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAGA,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5C,UAAA,MAAA,CAAO,IAAA,GAAO,SAAS,WAAA,GAA4B;AACjD,YAAA,IAAI;AACF,cAAA,MAAM,cAAc,YAAA,EAAa;AACjC,cAAA,OAAO,QAAQ,OAAA,CAAQ,WAAW,CAAA,CAC/B,IAAA,CAAK,CAAC,KAAA,KAAe;AACpB,gBAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,gBAAA,OAAO,KAAA;AAAA,cACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,gBAAAA,yBAAA;AAAA,kBACE,IAAA;AAAA,kBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,iBAC1D;AACA,gBAAA,MAAM,KAAA;AAAA,cACR,CAAC,CAAA;AAAA,YACL,SAAS,KAAA,EAAO;AACd,cAAAA,yBAAA;AAAA,gBACE,IAAA;AAAA,gBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,eAC1D;AACA,cAAA,MAAM,KAAA;AAAA,YACR;AAAA,UACF,CAAA;AAEA,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AASA,SAAS,gBAAA,CACP,QACA,UAAA,EACA,SAAA,EACA,mBACA,YAAA,EACA,MAAA,EACA,QACA,gBAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,YAAA,CAAA,GAA2B,IAAA,EAAkB;AACzE,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AAGnC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI;AACF,MAAA,QAAQ,SAAA;AAAW,QACjB,KAAK,QAAA,EAAU;AACb,UAAA,OAAA,CAAQ,QAAA,GAAW,KAAK,CAAC,CAAA;AACzB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,YAAA,EAAc;AACjB,UAAA,OAAA,CAAQ,SAAA,GAAY,KAAK,CAAC,CAAA;AAC1B,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,OAAA,CAAQ,iBAAA,GAAoB,KAAK,CAAC,CAAA;AAClC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,OAAA,CAAQ,UAAA,GAAa,KAAK,CAAC,CAAA;AAC3B,UAAA;AAAA,QACF;AAAA,QACA,SAAS;AACP,UAAA;AAAA,QACF;AAAA;AACF,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA;AACzD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,aAAa,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAOD,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5C,UAAA,MAAA,CAAO,IAAA,GAAO,SAAS,WAAA,GAA4B;AACjD,YAAA,IAAI;AACF,cAAA,MAAM,cAAc,YAAA,EAAa;AACjC,cAAA,OAAO,QAAQ,OAAA,CAAQ,WAAW,CAAA,CAC/B,IAAA,CAAK,CAAC,KAAA,KAAe;AACpB,gBAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,gBAAA,OAAO,KAAA;AAAA,cACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,gBAAAA,yBAAA;AAAA,kBACE,IAAA;AAAA,kBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,iBAC1D;AACA,gBAAA,MAAM,KAAA;AAAA,cACR,CAAC,CAAA;AAAA,YACL,SAAS,KAAA,EAAO;AACd,cAAAA,yBAAA;AAAA,gBACE,IAAA;AAAA,gBACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,eAC1D;AACA,cAAA,MAAM,KAAA;AAAA,YACR;AAAA,UACF,CAAA;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AASA,SAAS,kBAAA,CACP,QACA,UAAA,EACA,SAAA,EACA,mBACA,YAAA,EACA,MAAA,EACA,QACA,gBAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,YAAA,CAAA,GAA2B,IAAA,EAAkB;AACzE,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AAGnC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AACvC,QAAA,OAAA,CAAQ,QAAA,GAAW,KAAK,QAAA,EAAS;AAAA,MACnC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,IAAA,GAAO,UAAA;AAAA,MACX,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA;AACzD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAA,CAAK,YAAA,CAAa,oBAAoB,aAAa,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAOD,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AASA,SAAS,mBAAA,CAAoB,QAAa,UAAA,EAA0B;AAClE,EAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,EAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,CAAA,GAAI,SAAS,cAAA,CAAA,GAA6B,IAAA,EAAkB;AAC3E,IAAA,MAAM,cAAcC,0BAAA,EAAc;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAGxC,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,MAAC,MAAA,CAAe,mBAAmB,CAAA,GAAI,WAAA;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAUA,SAAS,gBAAA,CACP,MAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,2BAAA;AAClB,EAAA,IAAK,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,EAAG;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,SAAA,CAAU,GAAA;AACrC,EAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,GAAM,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACtE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,WAAA,EAAa,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU,IAAA;AACtC,EAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AACtC,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,GAAO,SAAU,QAAA,EAAA,GAAqB,IAAA,EAAkB;AACvE,MAAA,MAAM,UACJ,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aACf,IAAA,CAAK,CAAC,CAAA,GACN,OAAO,KAAK,CAAC,CAAA,KAAM,UAAA,GACjB,IAAA,CAAK,CAAC,CAAA,GACN,IAAA;AAGR,MAAA,IAAI,OAAA,IAAW,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAC/C,QAAA,MAAM,OAAA,GAAU,eAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,EAAY;AACjC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,CAAC,MAAM,UAAA,EAAY;AACxC,UAAA,IAAA,CAAK,CAAC,CAAA,GAAI,OAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,OAAO,OAAA,CAAQ,MAAM,YAAA,EAAc,IAAA,EAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAEA,EAAC,MAAA,CAAO,SAAA,CAAkB,SAAS,CAAA,GAAI,IAAA;AACzC;AAUA,SAAS,uBAAuB,OAAA,EAAuB;AACrD,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,IAAQ,EAAA;AAGjC,EAAA,IAAI,SAAS,UAAA,CAAW,GAAG,KAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,4BAAA,GAA+B;AAAA,IACnC,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IACE,4BAAA,CAA6B,KAAK,CAAC,OAAA,KAAY,SAAS,QAAA,CAAS,OAAO,CAAC,CAAA,EACzE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,EAAS;AAChC,IAAA,MAAM,8BAAA,GAAiC;AAAA,MACrC,UAAA;AAAA;AAAA,MACA,eAAA;AAAA;AAAA,MACA,cAAA;AAAA;AAAA,MACA,WAAA;AAAA;AAAA,MACA,gBAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AAEA,IAAA,IACE,8BAAA,CAA+B,KAAK,CAAC,OAAA,KAAY,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,EACzE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,eAAA,CACP,OAAA,EACA,QAAA,EACA,QAAA,EACA,QACA,MAAA,EACK;AACL,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAK,OAAA,CAAgB,iBAAiB,CAAA,EAAG;AACvC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,SAASC,YAAAA,CAAAA,GAA0B,IAAA,EAAkB;AACvE,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,aAAa,SAAA,EAAW;AAC/B,QAAA,SAAA,GAAY,KAAK,WAAA,CAAY,SAAA;AAC7B,QAAA,cAAA,GACE,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MACnD,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,EAAO,SAAA,EAAW;AAChC,QAAA,SAAA,GAAY,KAAK,KAAA,CAAM,SAAA;AACvB,QAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,SAAA;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,QAAA,GAAW,cAAA,GACb,CAAA,SAAA,EAAY,cAAc,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAClD,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,CAAU,QAAA,EAAU,EAAE,IAAA,EAAMJ,gBAAA,CAAS,UAAU,CAAA;AACnE,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,QAAQ,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,YAAA,CAAa,cAAc,SAAS,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,cAAA,IAAkB,OAAO,qBAAA,EAAuB;AAClD,MAAA,IAAA,CAAK,YAAA,CAAa,yBAAyB,cAAc,CAAA;AAAA,IAC3D;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,4BAA4B,CAAA;AACnE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,YAAA,CAAa,iBAAA,EAAmB,MAAA,CAAO,MAAM,CAAA;AAAA,IACpD;AAEA,IAAA,OAAOC,wBAAA,CAAY,MAAM,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAEvC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,UAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,YAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,YAAAA,yBAAA;AAAA,cACE,IAAA;AAAA,cACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,aAC1D;AACA,YAAA,MAAM,KAAA;AAAA,UACR,CAAC,CAAA;AAAA,QACL;AAEA,QAAAA,yBAAA,CAAa,IAAI,CAAA;AACjB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,SAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAGA,EAAC,WAAA,CAAoB,iBAAiB,CAAA,GAAI,IAAA;AAC1C,EAAA,OAAO,WAAA;AACT;AAiCO,SAAS,kBAAA,CACd,UACA,MAAA,EACU;AACV,EAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,QAAA;AACV,EAAA,IAAI,CAAA,CAAE,iBAAiB,CAAA,EAAG;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,MAAM,qBAAqB,MAAA,EAAQ,qBAAA;AACnC,EAAA,MAAM,gBAAA,GAAmB,QAAQ,iBAAA,IAAqB,SAAA;AAEtD,EAAA,MAAM,WAAA,GAA8B;AAAA,IAClC,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,IAC9B,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,IAC9B,UAAA,EAAY,QAAQ,UAAA,IAAc,mBAAA;AAAA,IAClC,qBAAA,EAAuB,QAAQ,qBAAA,IAAyB,IAAA;AAAA,IACxD,eAAA,EAAiB,QAAQ,eAAA,IAAmB,KAM9C,CAAA;AAEA,EAAA,MAAM,MAAA,GAASG,iBAAA,CAAM,SAAA,CAAU,WAAA,CAAY,UAAU,CAAA;AAGrD,EAAA,MAAM,mBAAmB,sBAAA,CAAuB;AAAA,IAC9C,qBAAA,EAAuB,kBAAA;AAAA,IACvB,iBAAA,EAAmB;AAAA,GACpB,CAAA;AAGD,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,WAAA,CAAY,eAAA,EAAiB;AAC3C,IAAA,gBAAA,CAAiB,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAe;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,KAAA,CAAM,UAAA,EAAY,cAAA,IAAkB,KAAA,CAAM,SAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAA6D;AAAA,IACjE,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO;AAAA,IACpC,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAU;AAAA,IAC1C,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,UAAA,EAAW;AAAA,IAC5C,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,kBAAA,EAAmB;AAAA,IAC5D,EAAE,MAAA,EAAQ,mBAAA,EAAqB,SAAA,EAAW,mBAAA,EAAoB;AAAA,IAC9D,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,WAAA,EAAY;AAAA,IAC9C,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,YAAA,EAAa;AAAA,IAChD,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,gBAAA,EAAiB;AAAA,IACxD,EAAE,MAAA,EAAQ,wBAAA,EAA0B,SAAA,EAAW,wBAAA;AAAyB,GAC1E;AAEA,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,SAAA,EAAU,IAAK,YAAA,EAAc;AAChD,IAAA,wBAAA;AAAA,MACE,CAAA,CAAE,KAAA;AAAA,MACF,MAAA;AAAA,MACA,SAAA;AAAA,MACA,sBAAA;AAAA,MACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,MACtB,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,CAAA,CAAE,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AAChC,MAAA,mBAAA,CAAoB,CAAA,CAAE,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,EAAQ,WAAW,CAAA;AAC5C,EAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,IAAA,IAAI,CAAA,CAAE,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,MAAA,kBAAA;AAAA,QACE,EAAE,KAAA,CAAM,SAAA;AAAA,QACR,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OACE,GAAA,CAAI,WAAA,EAAa,UAAA,EAAY,cAAA,IAC7B,IAAI,WAAA,EAAa,SAAA;AAAA,UAErB,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,GAAA,KAAa;AACZ,UAAA,IAAI;AACF,YAAA,OAAO,IAAI,WAAA,EAAa,SAAA;AAAA,UAC1B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,YAAA,EAAc,aAAa,WAAW,CAAA;AACvE,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA,EAAG;AACnB,MAAA,gBAAA;AAAA,QACE,CAAA,CAAE,KAAA;AAAA,QACF,MAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAC,KAAA,KAAe;AACd,UAAA,IAAI;AACF,YAAA,OAAO,MAAM,UAAA,EAAY,cAAA;AAAA,UAC3B,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,UAAe,KAAA,CAAM,SAAA;AAAA,QACtB,MAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,IAAA,IAAI,CAAA,CAAE,KAAA,EAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AAChC,MAAA,mBAAA,CAAoB,CAAA,CAAE,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,CAAA,CAAE,iBAAiB,CAAA,GAAI,IAAA;AACvB,EAAA,OAAO,QAAA;AACT","file":"index.cjs","sourcesContent":["// Stable OTel semantic conventions only — no deprecated attributes.\n\nexport const ATTR_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const ATTR_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const ATTR_DB_SYSTEM_NAME = 'db.system.name' as const;\nexport const ATTR_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const ATTR_DB_NAMESPACE = 'db.namespace' as const;\nexport const ATTR_SERVER_ADDRESS = 'server.address' as const;\nexport const ATTR_SERVER_PORT = 'server.port' as const;\n\nexport const DB_SYSTEM_NAME_VALUE_MONGODB = 'mongodb' as const;\n","import type { AttributeRedactorPreset, AttributeRedactorConfig } from 'autotel';\n\n/**\n * Payload passed to the dbStatementSerializer.\n * Shape matches @opentelemetry/instrumentation-mongodb for migration compatibility.\n */\nexport interface SerializerPayload {\n condition?: Record<string, unknown>;\n updates?: Record<string, unknown>;\n options?: Record<string, unknown>;\n fields?: Record<string, unknown>;\n aggregatePipeline?: unknown[];\n document?: unknown;\n documents?: unknown[];\n operations?: unknown[];\n}\n\n/**\n * Configuration for Mongoose instrumentation.\n */\nexport interface InstrumentMongooseConfig {\n /** Database name for spans (sets db.namespace). */\n dbName?: string;\n\n /** MongoDB server hostname (sets server.address). */\n peerName?: string;\n\n /** MongoDB server port (sets server.port, default: 27017). */\n peerPort?: number;\n\n /** Custom tracer name (default: \"autotel-mongoose\"). */\n tracerName?: string;\n\n /** Capture collection names in spans (default: true). */\n captureCollectionName?: boolean;\n\n /** Instrument Schema hooks — pre/post save, validate, etc. (default: false). */\n instrumentHooks?: boolean;\n\n /**\n * Serializer for db.query.text attribute.\n * Default: JSON.stringify of the payload.\n * Pass false to disable statement capture entirely.\n */\n dbStatementSerializer?:\n | ((operation: string, payload: SerializerPayload) => string | undefined)\n | false;\n\n /**\n * Redactor applied to serialized statements before setting db.query.text.\n * Default: 'default' preset (emails, phones, SSNs, credit cards).\n * Pass a preset name, custom config, or false to disable redaction.\n */\n statementRedactor?: AttributeRedactorPreset | AttributeRedactorConfig | false;\n}\n\n/**\n * Resolved config with all defaults applied.\n * @internal\n */\nexport interface ResolvedConfig {\n dbName: string;\n peerName: string;\n peerPort: number;\n tracerName: string;\n captureCollectionName: boolean;\n instrumentHooks: boolean;\n dbStatementSerializer:\n | ((operation: string, payload: SerializerPayload) => string | undefined)\n | false;\n statementRedactor: AttributeRedactorPreset | AttributeRedactorConfig | false;\n}\n\nexport const DEFAULT_TRACER_NAME = 'autotel-mongoose';\n","import { createStringRedactor, type StringRedactor } from 'autotel';\nimport type { SerializerPayload, InstrumentMongooseConfig } from './types';\n\n/**\n * Default serializer — JSON.stringify of the payload.\n */\nexport function defaultSerializer(\n _operation: string,\n payload: SerializerPayload,\n): string {\n return JSON.stringify(payload);\n}\n\nexport type StatementCaptureFn = (\n operation: string,\n payload: SerializerPayload,\n) => string | undefined;\n\n/**\n * Composes the serializer and redactor into a single capture function.\n * Returns undefined if statement capture is disabled.\n */\nexport function createStatementCapture(config: {\n dbStatementSerializer: InstrumentMongooseConfig['dbStatementSerializer'];\n statementRedactor: InstrumentMongooseConfig['statementRedactor'];\n}): StatementCaptureFn {\n // Statement capture disabled\n if (config.dbStatementSerializer === false) {\n return (): undefined => {\n return;\n };\n }\n\n const serializer =\n typeof config.dbStatementSerializer === 'function'\n ? config.dbStatementSerializer\n : defaultSerializer;\n\n // Build redactor (or no-op)\n let redact: StringRedactor | undefined;\n if (\n config.statementRedactor !== false &&\n config.statementRedactor !== undefined\n ) {\n redact = createStringRedactor(config.statementRedactor);\n }\n\n return (\n operation: string,\n payload: SerializerPayload,\n ): string | undefined => {\n const raw = serializer(operation, payload);\n if (raw === undefined) {\n return undefined;\n }\n return redact ? redact(raw) : raw;\n };\n}\n","// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n// Mongoose is a devDependency so we type-check against the real API; consumers use the peer.\n\nimport type { Mongoose } from 'mongoose';\nimport { otelTrace as trace, SpanKind } from 'autotel';\nimport type { Span, Tracer } from 'autotel';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nimport {\n ATTR_DB_SYSTEM_NAME,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_QUERY_TEXT,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n DB_SYSTEM_NAME_VALUE_MONGODB,\n} from './constants';\nimport type {\n InstrumentMongooseConfig,\n ResolvedConfig,\n SerializerPayload,\n} from './types';\nimport { DEFAULT_TRACER_NAME } from './types';\nimport {\n createStatementCapture,\n defaultSerializer,\n type StatementCaptureFn,\n} from './statement';\n\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\nconst WRAPPED_HOOK_FLAG = '__autotelWrappedHook' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n// ---------------------------------------------------------------------------\n// Span creation\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a span for a Mongoose operation.\n * Note: db.query.text is NOT set here — callers set it after payload extraction.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: ResolvedConfig,\n): Span {\n const spanName = collectionName\n ? `${operation} ${collectionName}`\n : modelName\n ? `${operation} ${modelName}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_MONGODB,\n [ATTR_DB_OPERATION_NAME]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[ATTR_DB_COLLECTION_NAME] = collectionName;\n }\n if (config.dbName) {\n attributes[ATTR_DB_NAMESPACE] = config.dbName;\n }\n if (config.peerName) {\n attributes[ATTR_SERVER_ADDRESS] = config.peerName;\n }\n if (config.peerPort) {\n attributes[ATTR_SERVER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n// ---------------------------------------------------------------------------\n// Wrapper helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps Model methods that return Query objects (find, findOne, findById,\n * findOneAndUpdate, findOneAndDelete, findOneAndReplace, deleteOne, deleteMany,\n * updateOne, updateMany, countDocuments, estimatedDocumentCount).\n *\n * Creates span FIRST, calls original, extracts payload from the returned Query,\n * sets db.query.text AFTER extraction, then wraps exec() to finalize span.\n */\nfunction wrapQueryReturningMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // Extract payload from the returned Query object\n if (result && typeof result.exec === 'function') {\n try {\n const payload: SerializerPayload = {};\n if (typeof result.getFilter === 'function') {\n payload.condition = result.getFilter();\n }\n if (result._update !== undefined) {\n payload.updates = result._update;\n }\n if (typeof result.getOptions === 'function') {\n payload.options = result.getOptions();\n }\n if (result._fields !== undefined) {\n payload.fields = result._fields;\n }\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore errors in payload extraction\n }\n\n // Wrap exec() to finalize span\n const originalExec = result.exec.bind(result);\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n return Promise.resolve(execPromise)\n .then((value: any) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query, not Promise\n }\n\n // Fallback for unexpected non-query results\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps Model static methods (create, insertMany, aggregate, bulkWrite).\n *\n * Builds payload from args BEFORE calling original (args are available\n * immediately), creates span, sets db.query.text, calls original, then wraps\n * exec() or promise for span finalization.\n */\nfunction wrapStaticMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n\n // Build payload from args before calling original\n const payload: SerializerPayload = {};\n try {\n switch (operation) {\n case 'create': {\n payload.document = args[0];\n break;\n }\n case 'insertMany': {\n payload.documents = args[0];\n break;\n }\n case 'aggregate': {\n payload.aggregatePipeline = args[0];\n break;\n }\n case 'bulkWrite': {\n payload.operations = args[0];\n break;\n }\n default: {\n break;\n }\n }\n } catch {\n // Ignore errors in payload extraction\n }\n\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n try {\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore serialization errors\n }\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result has exec() (e.g., aggregate), wrap it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n return Promise.resolve(execPromise)\n .then((value: any) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n return result;\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps Model instance methods (save, deleteOne on prototype).\n *\n * Extracts document via `this.toObject()` BEFORE calling original,\n * creates span, sets db.query.text, calls original, wraps promise\n * for span finalization.\n */\nfunction wrapInstanceMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n\n // Extract document before calling original\n const payload: SerializerPayload = {};\n try {\n if (typeof this.toObject === 'function') {\n payload.document = this.toObject();\n }\n } catch {\n // Ignore errors in document extraction\n }\n\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n try {\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore serialization errors\n }\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // Instance methods return promises\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chainable method wrapping (copied from original)\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps chainable Query methods (populate, select, lean, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Schema hook instrumentation (copied from original, updated semconv)\n// ---------------------------------------------------------------------------\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: ResolvedConfig,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods, known internal patterns, and functions with\n * Mongoose-internal source code signatures.\n *\n * Note: We intentionally allow anonymous functions because user-defined\n * hooks are often anonymous (e.g., `schema.pre('save', async function() {...})`).\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or $)\n if (funcName.startsWith('_') || funcName.startsWith('$')) {\n return true;\n }\n\n // Skip known Mongoose internal hook patterns by name\n const mongooseInternalNamePatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n 'wrapped',\n 'bound ',\n ];\n\n if (\n mongooseInternalNamePatterns.some((pattern) => funcName.includes(pattern))\n ) {\n return true;\n }\n\n // Check function source for Mongoose-internal patterns\n // These patterns appear in Mongoose's auto-generated validation/transform hooks\n try {\n const source = handler.toString();\n const mongooseInternalSourcePatterns = [\n 'this.$__', // Mongoose internal document methods\n 'this.$isValid', // Mongoose validation\n 'this.$locals', // Mongoose local properties\n '_this.$__', // Mongoose internal with closure\n 'schema.s.hooks', // Mongoose hooks system\n 'kareem', // Mongoose's hooks library\n ];\n\n if (\n mongooseInternalSourcePatterns.some((pattern) => source.includes(pattern))\n ) {\n return true;\n }\n } catch {\n // If we can't get source, allow the hook through\n }\n\n return false;\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: ResolvedConfig,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n // Skip if already wrapped to prevent duplicate spans\n if ((handler as any)[WRAPPED_HOOK_FLAG]) {\n return handler;\n }\n\n const wrappedHook = function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(ATTR_DB_COLLECTION_NAME, collectionName);\n }\n span.setAttribute(ATTR_DB_SYSTEM_NAME, DB_SYSTEM_NAME_VALUE_MONGODB);\n if (config.dbName) {\n span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n\n // Mark as wrapped to prevent double-wrapping\n (wrappedHook as any)[WRAPPED_HOOK_FLAG] = true;\n return wrappedHook;\n}\n\n// ---------------------------------------------------------------------------\n// Main instrumentation function\n// ---------------------------------------------------------------------------\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: Mongoose,\n config?: InstrumentMongooseConfig,\n): Mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n const m = mongoose as any;\n if (m[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n // Resolve statement-related config separately (they accept undefined)\n const resolvedSerializer = config?.dbStatementSerializer;\n const resolvedRedactor = config?.statementRedactor ?? 'default';\n\n const finalConfig: ResolvedConfig = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n dbStatementSerializer:\n resolvedSerializer === false\n ? false\n : (resolvedSerializer ?? defaultSerializer),\n statementRedactor: resolvedRedactor,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Create statement capture function\n const captureStatement = createStatementCapture({\n dbStatementSerializer: resolvedSerializer,\n statementRedactor: resolvedRedactor,\n });\n\n // Patch Schema hooks only if enabled\n if (m.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(m.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query-returning methods on Model\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryReturningMethod(\n m.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n captureStatement,\n );\n\n // Also patch chainable Query methods to capture context\n if (m.Query?.prototype?.[method]) {\n wrapChainableMethod(m.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (m.Model.prototype[method]) {\n wrapInstanceMethod(\n m.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n captureStatement,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (m.Model[method]) {\n wrapStaticMethod(\n m.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n captureStatement,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (m.Query?.prototype?.[method]) {\n wrapChainableMethod(m.Query.prototype, method);\n }\n }\n\n m[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: InstrumentMongooseConfig) {}\n\n enable(mongoose: Mongoose): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/statement.ts","../src/instrumentation.ts"],"names":["createStringRedactor","SpanKind","runWithSpan","finalizeSpan","getActiveSpan","wrappedHook","trace"],"mappings":"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","file":"index.cjs","sourcesContent":["// Stable OTel semantic conventions only — no deprecated attributes.\n\nexport const ATTR_DB_QUERY_TEXT = 'db.query.text' as const;\nexport const ATTR_DB_OPERATION_NAME = 'db.operation.name' as const;\nexport const ATTR_DB_SYSTEM_NAME = 'db.system.name' as const;\nexport const ATTR_DB_COLLECTION_NAME = 'db.collection.name' as const;\nexport const ATTR_DB_NAMESPACE = 'db.namespace' as const;\nexport const ATTR_SERVER_ADDRESS = 'server.address' as const;\nexport const ATTR_SERVER_PORT = 'server.port' as const;\n\nexport const DB_SYSTEM_NAME_VALUE_MONGODB = 'mongodb' as const;\n","import type { AttributeRedactorPreset, AttributeRedactorConfig } from 'autotel';\n\n/**\n * Payload passed to the dbStatementSerializer.\n * Shape matches @opentelemetry/instrumentation-mongodb for migration compatibility.\n */\nexport interface SerializerPayload {\n condition?: Record<string, unknown>;\n updates?: Record<string, unknown>;\n options?: Record<string, unknown>;\n fields?: Record<string, unknown>;\n aggregatePipeline?: unknown[];\n document?: unknown;\n documents?: unknown[];\n operations?: unknown[];\n}\n\n/**\n * Configuration for Mongoose instrumentation.\n */\nexport interface InstrumentMongooseConfig {\n /** Database name for spans (sets db.namespace). */\n dbName?: string;\n\n /** MongoDB server hostname (sets server.address). */\n peerName?: string;\n\n /** MongoDB server port (sets server.port, default: 27017). */\n peerPort?: number;\n\n /** Custom tracer name (default: \"autotel-mongoose\"). */\n tracerName?: string;\n\n /** Capture collection names in spans (default: true). */\n captureCollectionName?: boolean;\n\n /** Instrument Schema hooks — pre/post save, validate, etc. (default: false). */\n instrumentHooks?: boolean;\n\n /**\n * Serializer for db.query.text attribute.\n * Default: JSON.stringify of the payload.\n * Pass false to disable statement capture entirely.\n */\n dbStatementSerializer?:\n | ((operation: string, payload: SerializerPayload) => string | undefined)\n | false;\n\n /**\n * Redactor applied to serialized statements before setting db.query.text.\n * Default: 'default' preset (emails, phones, SSNs, credit cards).\n * Pass a preset name, custom config, or false to disable redaction.\n */\n statementRedactor?: AttributeRedactorPreset | AttributeRedactorConfig | false;\n}\n\n/**\n * Resolved config with all defaults applied.\n * @internal\n */\nexport interface ResolvedConfig {\n dbName: string;\n peerName: string;\n peerPort: number;\n tracerName: string;\n captureCollectionName: boolean;\n instrumentHooks: boolean;\n dbStatementSerializer:\n | ((operation: string, payload: SerializerPayload) => string | undefined)\n | false;\n statementRedactor: AttributeRedactorPreset | AttributeRedactorConfig | false;\n}\n\nexport const DEFAULT_TRACER_NAME = 'autotel-mongoose';\n","import { createStringRedactor, type StringRedactor } from 'autotel';\nimport type { SerializerPayload, InstrumentMongooseConfig } from './types';\n\n/**\n * Default serializer — JSON.stringify of the payload.\n */\nexport function defaultSerializer(\n _operation: string,\n payload: SerializerPayload,\n): string {\n return JSON.stringify(payload);\n}\n\nexport type StatementCaptureFn = (\n operation: string,\n payload: SerializerPayload,\n) => string | undefined;\n\n/**\n * Composes the serializer and redactor into a single capture function.\n * Returns undefined if statement capture is disabled.\n */\nexport function createStatementCapture(config: {\n dbStatementSerializer: InstrumentMongooseConfig['dbStatementSerializer'];\n statementRedactor: InstrumentMongooseConfig['statementRedactor'];\n}): StatementCaptureFn {\n // Statement capture disabled\n if (config.dbStatementSerializer === false) {\n return (): undefined => {\n return;\n };\n }\n\n const serializer =\n typeof config.dbStatementSerializer === 'function'\n ? config.dbStatementSerializer\n : defaultSerializer;\n\n // Build redactor (or no-op)\n let redact: StringRedactor | undefined;\n if (\n config.statementRedactor !== false &&\n config.statementRedactor !== undefined\n ) {\n redact = createStringRedactor(config.statementRedactor);\n }\n\n return (\n operation: string,\n payload: SerializerPayload,\n ): string | undefined => {\n const raw = serializer(operation, payload);\n if (raw === undefined) {\n return undefined;\n }\n return redact ? redact(raw) : raw;\n };\n}\n","// Note: `any` is only used for dynamic method wrapping on runtime objects.\n// Type-safe interfaces are used for all public APIs.\n// Mongoose is a devDependency so we type-check against the real API; consumers use the peer.\n\nimport type { Mongoose } from 'mongoose';\nimport { otelTrace as trace, SpanKind } from 'autotel';\nimport type { Span, Tracer } from 'autotel';\nimport {\n runWithSpan,\n finalizeSpan,\n getActiveSpan,\n} from 'autotel/trace-helpers';\n\nimport {\n ATTR_DB_SYSTEM_NAME,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_QUERY_TEXT,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n DB_SYSTEM_NAME_VALUE_MONGODB,\n} from './constants';\nimport type {\n InstrumentMongooseConfig,\n ResolvedConfig,\n SerializerPayload,\n} from './types';\nimport { DEFAULT_TRACER_NAME } from './types';\nimport {\n createStatementCapture,\n defaultSerializer,\n type StatementCaptureFn,\n} from './statement';\n\nconst INSTRUMENTED_FLAG = '__autotelMongooseInstrumented' as const;\nconst WRAPPED_HOOK_FLAG = '__autotelWrappedHook' as const;\n\n/**\n * Symbol used to store the parent span on Query/Aggregate objects.\n * This preserves context across chainable query methods.\n */\nexport const _STORED_PARENT_SPAN: unique symbol = Symbol('stored-parent-span');\n\n// ---------------------------------------------------------------------------\n// Span creation\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a span for a Mongoose operation.\n * Note: db.query.text is NOT set here — callers set it after payload extraction.\n */\nfunction createSpan(\n tracer: Tracer,\n operation: string,\n modelName: string | undefined,\n collectionName: string | undefined,\n config: ResolvedConfig,\n): Span {\n const spanName = collectionName\n ? `${operation} ${collectionName}`\n : modelName\n ? `${operation} ${modelName}`\n : `mongoose.${operation}`;\n\n const attributes: Record<string, any> = {\n [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_MONGODB,\n [ATTR_DB_OPERATION_NAME]: operation,\n };\n\n if (collectionName && config.captureCollectionName) {\n attributes[ATTR_DB_COLLECTION_NAME] = collectionName;\n }\n if (config.dbName) {\n attributes[ATTR_DB_NAMESPACE] = config.dbName;\n }\n if (config.peerName) {\n attributes[ATTR_SERVER_ADDRESS] = config.peerName;\n }\n if (config.peerPort) {\n attributes[ATTR_SERVER_PORT] = config.peerPort;\n }\n\n return tracer.startSpan(spanName, { kind: SpanKind.CLIENT, attributes });\n}\n\n// ---------------------------------------------------------------------------\n// Wrapper helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps Model methods that return Query objects (find, findOne, findById,\n * findOneAndUpdate, findOneAndDelete, findOneAndReplace, deleteOne, deleteMany,\n * updateOne, updateMany, countDocuments, estimatedDocumentCount).\n *\n * Creates span FIRST, calls original, extracts payload from the returned Query,\n * sets db.query.text AFTER extraction, then wraps exec() to finalize span.\n */\nfunction wrapQueryReturningMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // Extract payload from the returned Query object\n if (result && typeof result.exec === 'function') {\n try {\n const payload: SerializerPayload = {};\n if (typeof result.getFilter === 'function') {\n payload.condition = result.getFilter();\n }\n if (result._update !== undefined) {\n payload.updates = result._update;\n }\n if (typeof result.getOptions === 'function') {\n payload.options = result.getOptions();\n }\n if (result._fields !== undefined) {\n payload.fields = result._fields;\n }\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore errors in payload extraction\n }\n\n // Wrap exec() to finalize span\n const originalExec = result.exec.bind(result);\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n return Promise.resolve(execPromise)\n .then((value: any) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n\n return result; // Return Query, not Promise\n }\n\n // Fallback for unexpected non-query results\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps Model static methods (create, insertMany, aggregate, bulkWrite).\n *\n * Builds payload from args BEFORE calling original (args are available\n * immediately), creates span, sets db.query.text, calls original, then wraps\n * exec() or promise for span finalization.\n */\nfunction wrapStaticMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n\n // Build payload from args before calling original\n const payload: SerializerPayload = {};\n try {\n switch (operation) {\n case 'create': {\n payload.document = args[0];\n break;\n }\n case 'insertMany': {\n payload.documents = args[0];\n break;\n }\n case 'aggregate': {\n payload.aggregatePipeline = args[0];\n break;\n }\n case 'bulkWrite': {\n payload.operations = args[0];\n break;\n }\n default: {\n break;\n }\n }\n } catch {\n // Ignore errors in payload extraction\n }\n\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n try {\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore serialization errors\n }\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // If result has exec() (e.g., aggregate), wrap it\n if (result && typeof result.exec === 'function') {\n const originalExec = result.exec.bind(result);\n result.exec = function wrappedExec(): Promise<any> {\n try {\n const execPromise = originalExec();\n return Promise.resolve(execPromise)\n .then((value: any) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n };\n return result;\n }\n\n // For direct promise results (e.g., create, insertMany)\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n/**\n * Wraps Model instance methods (save, deleteOne on prototype).\n *\n * Extracts document via `this.toObject()` BEFORE calling original,\n * creates span, sets db.query.text, calls original, wraps promise\n * for span finalization.\n */\nfunction wrapInstanceMethod(\n target: any,\n methodName: string,\n operation: string,\n getCollectionName: (obj: any) => string | undefined,\n getModelName: (obj: any) => string | undefined,\n tracer: Tracer,\n config: ResolvedConfig,\n captureStatement: StatementCaptureFn,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function instrumented(this: any, ...args: any[]): any {\n const collectionName = getCollectionName(this);\n const modelName = getModelName(this);\n\n // Extract document before calling original\n const payload: SerializerPayload = {};\n try {\n if (typeof this.toObject === 'function') {\n payload.document = this.toObject();\n }\n } catch {\n // Ignore errors in document extraction\n }\n\n const span = createSpan(\n tracer,\n operation,\n modelName,\n collectionName,\n config,\n );\n\n try {\n const statementText = captureStatement(operation, payload);\n if (statementText) {\n span.setAttribute(ATTR_DB_QUERY_TEXT, statementText);\n }\n } catch {\n // Ignore serialization errors\n }\n\n return runWithSpan(span, () => {\n try {\n const result = original.apply(this, args);\n\n // Instance methods return promises\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n finalizeSpan(span);\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chainable method wrapping (copied from original)\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps chainable Query methods (populate, select, lean, etc.) to capture span context.\n */\nfunction wrapChainableMethod(target: any, methodName: string): void {\n const original = target[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n target[methodName] = function captureContext(this: any, ...args: any[]): any {\n const currentSpan = getActiveSpan();\n const result = original.apply(this, args);\n\n // Store parent span on returned Query for exec() calls\n if (result && typeof result.exec === 'function') {\n (result as any)[_STORED_PARENT_SPAN] = currentSpan;\n }\n\n return result;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Schema hook instrumentation (copied from original, updated semconv)\n// ---------------------------------------------------------------------------\n\n/**\n * Patches Mongoose Schema hooks (pre/post) to automatically trace them.\n * Only wraps user-defined hooks, skipping Mongoose's internal hooks.\n */\nfunction patchSchemaHooks(\n Schema: any,\n tracer: Tracer,\n config: ResolvedConfig,\n): void {\n if (!Schema?.prototype) {\n return;\n }\n\n const HOOK_FLAG = '__autotelHookInstrumented' as const;\n if ((Schema.prototype as any)[HOOK_FLAG]) {\n return;\n }\n\n const originalPre = Schema.prototype.pre;\n if (typeof originalPre === 'function') {\n Schema.prototype.pre = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'pre',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPre, this, [hookName, ...args]);\n };\n }\n\n const originalPost = Schema.prototype.post;\n if (typeof originalPost === 'function') {\n Schema.prototype.post = function (hookName: string, ...args: any[]): any {\n const handler =\n typeof args[0] === 'function'\n ? args[0]\n : typeof args[1] === 'function'\n ? args[1]\n : null;\n\n // Only wrap user-defined hooks, skip Mongoose internals\n if (handler && !isMongooseInternalHook(handler)) {\n const wrapped = wrapHookHandler(\n handler,\n hookName,\n 'post',\n tracer,\n config,\n );\n if (typeof args[0] === 'function') {\n args[0] = wrapped;\n } else if (typeof args[1] === 'function') {\n args[1] = wrapped;\n }\n }\n\n return Reflect.apply(originalPost, this, [hookName, ...args]);\n };\n }\n\n (Schema.prototype as any)[HOOK_FLAG] = true;\n}\n\n/**\n * Detects if a hook handler is from Mongoose's internal code.\n * Skips private methods, known internal patterns, and functions with\n * Mongoose-internal source code signatures.\n *\n * Note: We intentionally allow anonymous functions because user-defined\n * hooks are often anonymous (e.g., `schema.pre('save', async function() {...})`).\n */\nfunction isMongooseInternalHook(handler: any): boolean {\n if (typeof handler !== 'function') {\n return false;\n }\n\n const funcName = handler.name || '';\n\n // Skip private/internal methods (starting with _ or $)\n if (funcName.startsWith('_') || funcName.startsWith('$')) {\n return true;\n }\n\n // Skip known Mongoose internal hook patterns by name\n const mongooseInternalNamePatterns = [\n 'shardingPlugin',\n 'mongooseInternalHook',\n 'noop',\n 'wrapped',\n 'bound ',\n 'timestampsPreSave',\n 'timestampsPreUpdate',\n 'handleTimestampOption',\n ];\n\n if (\n mongooseInternalNamePatterns.some((pattern) => funcName.includes(pattern))\n ) {\n return true;\n }\n\n // Check function source for Mongoose-internal patterns\n // These patterns appear in Mongoose's auto-generated validation/transform hooks\n try {\n const source = handler.toString();\n const mongooseInternalSourcePatterns = [\n 'this.$__', // Mongoose internal document methods\n 'this.$isValid', // Mongoose validation\n 'this.$locals', // Mongoose local properties\n '_this.$__', // Mongoose internal with closure\n 'schema.s.hooks', // Mongoose hooks system\n 'kareem', // Mongoose's hooks library\n ];\n\n if (\n mongooseInternalSourcePatterns.some((pattern) => source.includes(pattern))\n ) {\n return true;\n }\n } catch {\n // If we can't get source, allow the hook through\n }\n\n return false;\n}\n\n/**\n * Wraps a hook handler to trace its execution.\n * Handles both callback-style (with next) and promise-style hooks.\n */\nfunction wrapHookHandler(\n handler: any,\n hookName: string,\n hookType: 'pre' | 'post',\n tracer: Tracer,\n config: ResolvedConfig,\n): any {\n if (typeof handler !== 'function') {\n return handler;\n }\n\n // Skip if already wrapped to prevent duplicate spans\n if ((handler as any)[WRAPPED_HOOK_FLAG]) {\n return handler;\n }\n\n // Check if the original handler uses callback-style (expects `next` param).\n // Kareem (Mongoose's hook library) checks fn.length to decide whether to\n // pass a `next` callback. Rest params (...args) give length=0, so we must\n // preserve the original arity.\n const expectsCallback = handler.length > 0;\n\n const wrappedHook = function wrappedHook(this: any, ...args: any[]): any {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (this.constructor?.modelName) {\n modelName = this.constructor.modelName;\n collectionName =\n this.constructor.collection?.collectionName || modelName;\n } else if (this.model?.modelName) {\n modelName = this.model.modelName;\n collectionName = this.model.collection?.collectionName || modelName;\n }\n } catch {\n // Ignore errors in extracting context\n }\n\n const spanName = collectionName\n ? `mongoose.${collectionName}.${hookType}.${hookName}`\n : `mongoose.hook.${hookType}.${hookName}`;\n\n const span = tracer.startSpan(spanName, { kind: SpanKind.INTERNAL });\n span.setAttribute('hook.type', hookType);\n span.setAttribute('hook.operation', hookName);\n if (modelName) {\n span.setAttribute('hook.model', modelName);\n }\n if (collectionName && config.captureCollectionName) {\n span.setAttribute(ATTR_DB_COLLECTION_NAME, collectionName);\n }\n span.setAttribute(ATTR_DB_SYSTEM_NAME, DB_SYSTEM_NAME_VALUE_MONGODB);\n if (config.dbName) {\n span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);\n }\n\n // For callback-style hooks, wrap the `next` callback to finalize the span\n // when the hook signals completion (instead of on synchronous return).\n // Kareem passes `next` as the first argument for callback-style hooks.\n if (expectsCallback && args.length > 0 && typeof args[0] === 'function') {\n const originalNext = args[0];\n args[0] = function wrappedNext(this: any, ...nextArgs: any[]) {\n const err = nextArgs[0];\n if (err) {\n finalizeSpan(\n span,\n err instanceof Error ? err : new Error(String(err)),\n );\n } else {\n finalizeSpan(span);\n }\n return originalNext.apply(this, nextArgs);\n };\n }\n\n return runWithSpan(span, () => {\n try {\n const result = handler.apply(this, args);\n\n if (result && typeof result.then === 'function') {\n return Promise.resolve(result as Promise<any>)\n .then((value) => {\n finalizeSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n });\n }\n\n // Only finalize synchronously for non-callback hooks.\n // Callback-style hooks finalize in the wrappedNext above.\n if (!expectsCallback) {\n finalizeSpan(span);\n }\n return result;\n } catch (error) {\n finalizeSpan(\n span,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n });\n };\n\n // Preserve function arity so kareem passes `next` for callback-style hooks.\n // Rest params (...args) give length=0; we must match the original handler.\n Object.defineProperty(wrappedHook, 'length', { value: handler.length });\n\n // Mark as wrapped to prevent double-wrapping\n (wrappedHook as any)[WRAPPED_HOOK_FLAG] = true;\n return wrappedHook;\n}\n\n// ---------------------------------------------------------------------------\n// Main instrumentation function\n// ---------------------------------------------------------------------------\n\n/**\n * Instruments Mongoose with OpenTelemetry tracing.\n *\n * Supports Mongoose 8+ with promise-based API only.\n * Patches Model methods, Query methods, and user-defined Schema hooks to create spans.\n *\n * **IMPORTANT:** Call `instrumentMongoose()` BEFORE defining schemas/models\n * to ensure hooks are automatically instrumented.\n *\n * @example\n * ```typescript\n * import mongoose from 'mongoose';\n * import { init } from 'autotel';\n * import { instrumentMongoose } from 'autotel-mongoose';\n *\n * init({ service: 'my-app' });\n *\n * // Call BEFORE defining schemas\n * instrumentMongoose(mongoose, { dbName: 'myapp' });\n *\n * const userSchema = new mongoose.Schema({ name: String });\n * const User = mongoose.model('User', userSchema);\n *\n * // All operations are automatically traced\n * await User.findOne({}).populate('posts').exec();\n * ```\n */\nexport function instrumentMongoose(\n mongoose: Mongoose,\n config?: InstrumentMongooseConfig,\n): Mongoose {\n if (!mongoose?.Model) {\n return mongoose;\n }\n\n const m = mongoose as any;\n if (m[INSTRUMENTED_FLAG]) {\n return mongoose;\n }\n\n // Resolve statement-related config separately (they accept undefined)\n const resolvedSerializer = config?.dbStatementSerializer;\n const resolvedRedactor = config?.statementRedactor ?? 'default';\n\n const finalConfig: ResolvedConfig = {\n dbName: config?.dbName || '',\n peerName: config?.peerName || '',\n peerPort: config?.peerPort || 27_017,\n tracerName: config?.tracerName || DEFAULT_TRACER_NAME,\n captureCollectionName: config?.captureCollectionName ?? true,\n instrumentHooks: config?.instrumentHooks ?? false,\n dbStatementSerializer:\n resolvedSerializer === false\n ? false\n : (resolvedSerializer ?? defaultSerializer),\n statementRedactor: resolvedRedactor,\n };\n\n const tracer = trace.getTracer(finalConfig.tracerName);\n\n // Create statement capture function\n const captureStatement = createStatementCapture({\n dbStatementSerializer: resolvedSerializer,\n statementRedactor: resolvedRedactor,\n });\n\n // Patch Schema hooks only if enabled\n if (m.Schema && finalConfig.instrumentHooks) {\n patchSchemaHooks(m.Schema, tracer, finalConfig);\n }\n\n // Helper functions\n const getModelCollectionName = (model: any) => {\n try {\n return model.collection?.collectionName || model.modelName;\n } catch {\n return;\n }\n };\n\n // Patch Query-returning methods on Model\n const queryMethods: Array<{ method: string; operation: string }> = [\n { method: 'find', operation: 'find' },\n { method: 'findOne', operation: 'findOne' },\n { method: 'findById', operation: 'findById' },\n { method: 'findOneAndUpdate', operation: 'findOneAndUpdate' },\n { method: 'findOneAndDelete', operation: 'findOneAndDelete' },\n { method: 'findOneAndReplace', operation: 'findOneAndReplace' },\n { method: 'deleteOne', operation: 'deleteOne' },\n { method: 'deleteMany', operation: 'deleteMany' },\n { method: 'updateOne', operation: 'updateOne' },\n { method: 'updateMany', operation: 'updateMany' },\n { method: 'countDocuments', operation: 'countDocuments' },\n { method: 'estimatedDocumentCount', operation: 'estimatedDocumentCount' },\n ];\n\n for (const { method, operation } of queryMethods) {\n wrapQueryReturningMethod(\n m.Model,\n method,\n operation,\n getModelCollectionName,\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n captureStatement,\n );\n\n // Also patch chainable Query methods to capture context\n if (m.Query?.prototype?.[method]) {\n wrapChainableMethod(m.Query.prototype, method);\n }\n }\n\n // Patch Model instance methods\n const instanceMethods = ['save', 'deleteOne'];\n for (const method of instanceMethods) {\n if (m.Model.prototype[method]) {\n wrapInstanceMethod(\n m.Model.prototype,\n method,\n method,\n (doc: any) => {\n try {\n return (\n doc.constructor?.collection?.collectionName ||\n doc.constructor?.modelName\n );\n } catch {\n return;\n }\n },\n (doc: any) => {\n try {\n return doc.constructor?.modelName;\n } catch {\n return;\n }\n },\n tracer,\n finalConfig,\n captureStatement,\n );\n }\n }\n\n // Patch Model static methods\n const staticMethods = ['create', 'insertMany', 'aggregate', 'bulkWrite'];\n for (const method of staticMethods) {\n if (m.Model[method]) {\n wrapStaticMethod(\n m.Model,\n method,\n method,\n (model: any) => {\n try {\n return model.collection?.collectionName;\n } catch {\n return;\n }\n },\n (model: any) => model.modelName,\n tracer,\n finalConfig,\n captureStatement,\n );\n }\n }\n\n // Patch Query chainable methods\n const chainableMethods = [\n 'populate',\n 'select',\n 'lean',\n 'where',\n 'sort',\n 'limit',\n 'skip',\n ];\n for (const method of chainableMethods) {\n if (m.Query?.prototype?.[method]) {\n wrapChainableMethod(m.Query.prototype, method);\n }\n }\n\n m[INSTRUMENTED_FLAG] = true;\n return mongoose;\n}\n\n/**\n * Legacy export for backwards compatibility.\n * @deprecated Use `instrumentMongoose` instead.\n */\nexport class MongooseInstrumentation {\n constructor(private config?: InstrumentMongooseConfig) {}\n\n enable(mongoose: Mongoose): void {\n instrumentMongoose(mongoose, this.config);\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -371,7 +371,10 @@ function isMongooseInternalHook(handler) {
371
371
  "mongooseInternalHook",
372
372
  "noop",
373
373
  "wrapped",
374
- "bound "
374
+ "bound ",
375
+ "timestampsPreSave",
376
+ "timestampsPreUpdate",
377
+ "handleTimestampOption"
375
378
  ];
376
379
  if (mongooseInternalNamePatterns.some((pattern) => funcName.includes(pattern))) {
377
380
  return true;
@@ -406,6 +409,7 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
406
409
  if (handler[WRAPPED_HOOK_FLAG]) {
407
410
  return handler;
408
411
  }
412
+ const expectsCallback = handler.length > 0;
409
413
  const wrappedHook = function wrappedHook2(...args) {
410
414
  let modelName;
411
415
  let collectionName;
@@ -433,6 +437,21 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
433
437
  if (config.dbName) {
434
438
  span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);
435
439
  }
440
+ if (expectsCallback && args.length > 0 && typeof args[0] === "function") {
441
+ const originalNext = args[0];
442
+ args[0] = function wrappedNext(...nextArgs) {
443
+ const err = nextArgs[0];
444
+ if (err) {
445
+ finalizeSpan(
446
+ span,
447
+ err instanceof Error ? err : new Error(String(err))
448
+ );
449
+ } else {
450
+ finalizeSpan(span);
451
+ }
452
+ return originalNext.apply(this, nextArgs);
453
+ };
454
+ }
436
455
  return runWithSpan(span, () => {
437
456
  try {
438
457
  const result = handler.apply(this, args);
@@ -448,7 +467,9 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
448
467
  throw error;
449
468
  });
450
469
  }
451
- finalizeSpan(span);
470
+ if (!expectsCallback) {
471
+ finalizeSpan(span);
472
+ }
452
473
  return result;
453
474
  } catch (error) {
454
475
  finalizeSpan(
@@ -459,6 +480,7 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
459
480
  }
460
481
  });
461
482
  };
483
+ Object.defineProperty(wrappedHook, "length", { value: handler.length });
462
484
  wrappedHook[WRAPPED_HOOK_FLAG] = true;
463
485
  return wrappedHook;
464
486
  }