autotel-mongoose 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -412,16 +412,16 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
412
412
  return handler;
413
413
  }
414
414
  const expectsCallback = handler.length > 0;
415
- const wrappedHook = function wrappedHook2(...args) {
415
+ const startHookSpan = (self) => {
416
416
  let modelName;
417
417
  let collectionName;
418
418
  try {
419
- if (this.constructor?.modelName) {
420
- modelName = this.constructor.modelName;
421
- collectionName = this.constructor.collection?.collectionName || modelName;
422
- } else if (this.model?.modelName) {
423
- modelName = this.model.modelName;
424
- collectionName = this.model.collection?.collectionName || modelName;
419
+ if (self.constructor?.modelName) {
420
+ modelName = self.constructor.modelName;
421
+ collectionName = self.constructor.collection?.collectionName || modelName;
422
+ } else if (self.model?.modelName) {
423
+ modelName = self.model.modelName;
424
+ collectionName = self.model.collection?.collectionName || modelName;
425
425
  }
426
426
  } catch {
427
427
  }
@@ -439,50 +439,63 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
439
439
  if (config.dbName) {
440
440
  span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);
441
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) {
442
+ return span;
443
+ };
444
+ const invokeHook = (self, span, args, callbackStyle) => traceHelpers.runWithSpan(span, () => {
445
+ try {
446
+ const result = handler.apply(self, args);
447
+ if (result && typeof result.then === "function") {
448
+ return Promise.resolve(result).then((value) => {
449
+ traceHelpers.finalizeSpan(span);
450
+ return value;
451
+ }).catch((error) => {
447
452
  traceHelpers.finalizeSpan(
448
453
  span,
449
- err instanceof Error ? err : new Error(String(err))
454
+ error instanceof Error ? error : new Error(String(error))
450
455
  );
451
- } else {
452
- traceHelpers.finalizeSpan(span);
453
- }
454
- return originalNext.apply(this, nextArgs);
455
- };
456
+ throw error;
457
+ });
458
+ }
459
+ if (!callbackStyle) {
460
+ traceHelpers.finalizeSpan(span);
461
+ }
462
+ return result;
463
+ } catch (error) {
464
+ traceHelpers.finalizeSpan(
465
+ span,
466
+ error instanceof Error ? error : new Error(String(error))
467
+ );
468
+ throw error;
456
469
  }
457
- return traceHelpers.runWithSpan(span, () => {
458
- try {
459
- const result = handler.apply(this, args);
460
- if (result && typeof result.then === "function") {
461
- return Promise.resolve(result).then((value) => {
462
- traceHelpers.finalizeSpan(span);
463
- return value;
464
- }).catch((error) => {
465
- traceHelpers.finalizeSpan(
466
- span,
467
- error instanceof Error ? error : new Error(String(error))
468
- );
469
- throw error;
470
- });
471
- }
472
- if (!expectsCallback) {
473
- traceHelpers.finalizeSpan(span);
474
- }
475
- return result;
476
- } catch (error) {
470
+ });
471
+ const wrappedHook = expectsCallback ? function wrappedHookCallback(arg0, ...args) {
472
+ const span = startHookSpan(this);
473
+ const runtimeArgs = [arg0, ...args];
474
+ const callbackIndex = runtimeArgs.findIndex(
475
+ (arg) => typeof arg === "function"
476
+ );
477
+ const originalNext = callbackIndex === -1 ? void 0 : runtimeArgs[callbackIndex];
478
+ const callArgs = callbackIndex === -1 ? runtimeArgs : runtimeArgs.filter((_, index) => index !== callbackIndex);
479
+ const wrappedNext = function wrappedNext2(...nextArgs) {
480
+ const err = nextArgs[0];
481
+ if (err) {
477
482
  traceHelpers.finalizeSpan(
478
483
  span,
479
- error instanceof Error ? error : new Error(String(error))
484
+ err instanceof Error ? err : new Error(String(err))
480
485
  );
481
- throw error;
486
+ } else {
487
+ traceHelpers.finalizeSpan(span);
482
488
  }
483
- });
489
+ if (typeof originalNext === "function") {
490
+ return originalNext.apply(this, nextArgs);
491
+ }
492
+ return;
493
+ };
494
+ return invokeHook(this, span, [wrappedNext, ...callArgs], true);
495
+ } : function wrappedHookPromise(...args) {
496
+ const span = startHookSpan(this);
497
+ return invokeHook(this, span, args, false);
484
498
  };
485
- Object.defineProperty(wrappedHook, "length", { value: handler.length });
486
499
  wrappedHook[WRAPPED_HOOK_FLAG] = true;
487
500
  return wrappedHook;
488
501
  }
@@ -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":"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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"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/statement.ts","../src/instrumentation.ts"],"names":["createStringRedactor","SpanKind","runWithSpan","finalizeSpan","getActiveSpan","wrappedNext","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,QAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;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;AAMA,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,GAAS,CAAA;AAEzC,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAc;AACnC,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,EAAMH,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,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CACjB,IAAA,EACA,IAAA,EACA,MACA,aAAA,KAEAC,wBAAA,CAAY,MAAM,MAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAEvC,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC/C,QAAA,OAAO,QAAQ,OAAA,CAAQ,MAAsB,CAAA,CAC1C,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,UAAAC,yBAAA,CAAa,IAAI,CAAA;AACjB,UAAA,OAAO,KAAA;AAAA,QACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,UAAAA,yBAAA;AAAA,YACE,IAAA;AAAA,YACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,WAC1D;AACA,UAAA,MAAM,KAAA;AAAA,QACR,CAAC,CAAA;AAAA,MACL;AAIA,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAAA,yBAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAAA,yBAAA;AAAA,QACE,IAAA;AAAA,QACA,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC;AAAA,OAC1D;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,WAAA,GAAc,eAAA,GAChB,SAAS,mBAAA,CAA+B,SAAc,IAAA,EAAkB;AACtE,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAM,GAAG,IAAI,CAAA;AAClC,IAAA,MAAM,gBAAgB,WAAA,CAAY,SAAA;AAAA,MAChC,CAAC,GAAA,KAAQ,OAAO,GAAA,KAAQ;AAAA,KAC1B;AACA,IAAA,MAAM,YAAA,GACJ,aAAA,KAAkB,EAAA,GACd,MAAA,GACC,YAAY,aAAa,CAAA;AAEhC,IAAA,MAAM,QAAA,GACJ,aAAA,KAAkB,EAAA,GACd,WAAA,GACA,WAAA,CAAY,OAAO,CAAC,CAAA,EAAG,KAAA,KAAU,KAAA,KAAU,aAAa,CAAA;AAE9D,IAAA,MAAM,WAAA,GAAc,SAASE,YAAAA,CAAAA,GAExB,QAAA,EACH;AACA,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,GAAA,EAAK;AACP,QAAAF,yBAAA;AAAA,UACE,IAAA;AAAA,UACA,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC;AAAA,SACpD;AAAA,MACF,CAAA,MAAO;AACL,QAAAA,yBAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AACtC,QAAA,OAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC1C;AACA,MAAA;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA,CAAW,MAAM,IAAA,EAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,IAAI,CAAA;AAAA,EAChE,CAAA,GACA,SAAS,kBAAA,CAAA,GAAiC,IAAA,EAAkB;AAC1D,IAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,IAAA,OAAO,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EAC3C,CAAA;AAGJ,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 '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 startHookSpan = (self: any) => {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (self.constructor?.modelName) {\n modelName = self.constructor.modelName;\n collectionName =\n self.constructor.collection?.collectionName || modelName;\n } else if (self.model?.modelName) {\n modelName = self.model.modelName;\n collectionName = self.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 span;\n };\n\n const invokeHook = (\n self: any,\n span: Span,\n args: any[],\n callbackStyle: boolean,\n ) =>\n runWithSpan(span, () => {\n try {\n const result = handler.apply(self, 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 (!callbackStyle) {\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 const wrappedHook = expectsCallback\n ? function wrappedHookCallback(this: any, arg0: any, ...args: any[]): any {\n const span = startHookSpan(this);\n const runtimeArgs = [arg0, ...args];\n const callbackIndex = runtimeArgs.findIndex(\n (arg) => typeof arg === 'function',\n );\n const originalNext =\n callbackIndex === -1\n ? undefined\n : (runtimeArgs[callbackIndex] as (...args: any[]) => void);\n\n const callArgs =\n callbackIndex === -1\n ? runtimeArgs\n : runtimeArgs.filter((_, index) => index !== callbackIndex);\n\n const wrappedNext = function wrappedNext(\n this: any,\n ...nextArgs: any[]\n ) {\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 if (typeof originalNext === 'function') {\n return originalNext.apply(this, nextArgs);\n }\n return;\n };\n\n return invokeHook(this, span, [wrappedNext, ...callArgs], true);\n }\n : function wrappedHookPromise(this: any, ...args: any[]): any {\n const span = startHookSpan(this);\n return invokeHook(this, span, args, false);\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"]}
package/dist/index.js CHANGED
@@ -410,16 +410,16 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
410
410
  return handler;
411
411
  }
412
412
  const expectsCallback = handler.length > 0;
413
- const wrappedHook = function wrappedHook2(...args) {
413
+ const startHookSpan = (self) => {
414
414
  let modelName;
415
415
  let collectionName;
416
416
  try {
417
- if (this.constructor?.modelName) {
418
- modelName = this.constructor.modelName;
419
- collectionName = this.constructor.collection?.collectionName || modelName;
420
- } else if (this.model?.modelName) {
421
- modelName = this.model.modelName;
422
- collectionName = this.model.collection?.collectionName || modelName;
417
+ if (self.constructor?.modelName) {
418
+ modelName = self.constructor.modelName;
419
+ collectionName = self.constructor.collection?.collectionName || modelName;
420
+ } else if (self.model?.modelName) {
421
+ modelName = self.model.modelName;
422
+ collectionName = self.model.collection?.collectionName || modelName;
423
423
  }
424
424
  } catch {
425
425
  }
@@ -437,50 +437,63 @@ function wrapHookHandler(handler, hookName, hookType, tracer, config) {
437
437
  if (config.dbName) {
438
438
  span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);
439
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) {
440
+ return span;
441
+ };
442
+ const invokeHook = (self, span, args, callbackStyle) => runWithSpan(span, () => {
443
+ try {
444
+ const result = handler.apply(self, args);
445
+ if (result && typeof result.then === "function") {
446
+ return Promise.resolve(result).then((value) => {
447
+ finalizeSpan(span);
448
+ return value;
449
+ }).catch((error) => {
445
450
  finalizeSpan(
446
451
  span,
447
- err instanceof Error ? err : new Error(String(err))
452
+ error instanceof Error ? error : new Error(String(error))
448
453
  );
449
- } else {
450
- finalizeSpan(span);
451
- }
452
- return originalNext.apply(this, nextArgs);
453
- };
454
+ throw error;
455
+ });
456
+ }
457
+ if (!callbackStyle) {
458
+ finalizeSpan(span);
459
+ }
460
+ return result;
461
+ } catch (error) {
462
+ finalizeSpan(
463
+ span,
464
+ error instanceof Error ? error : new Error(String(error))
465
+ );
466
+ throw error;
454
467
  }
455
- return runWithSpan(span, () => {
456
- try {
457
- const result = handler.apply(this, args);
458
- if (result && typeof result.then === "function") {
459
- return Promise.resolve(result).then((value) => {
460
- finalizeSpan(span);
461
- return value;
462
- }).catch((error) => {
463
- finalizeSpan(
464
- span,
465
- error instanceof Error ? error : new Error(String(error))
466
- );
467
- throw error;
468
- });
469
- }
470
- if (!expectsCallback) {
471
- finalizeSpan(span);
472
- }
473
- return result;
474
- } catch (error) {
468
+ });
469
+ const wrappedHook = expectsCallback ? function wrappedHookCallback(arg0, ...args) {
470
+ const span = startHookSpan(this);
471
+ const runtimeArgs = [arg0, ...args];
472
+ const callbackIndex = runtimeArgs.findIndex(
473
+ (arg) => typeof arg === "function"
474
+ );
475
+ const originalNext = callbackIndex === -1 ? void 0 : runtimeArgs[callbackIndex];
476
+ const callArgs = callbackIndex === -1 ? runtimeArgs : runtimeArgs.filter((_, index) => index !== callbackIndex);
477
+ const wrappedNext = function wrappedNext2(...nextArgs) {
478
+ const err = nextArgs[0];
479
+ if (err) {
475
480
  finalizeSpan(
476
481
  span,
477
- error instanceof Error ? error : new Error(String(error))
482
+ err instanceof Error ? err : new Error(String(err))
478
483
  );
479
- throw error;
484
+ } else {
485
+ finalizeSpan(span);
480
486
  }
481
- });
487
+ if (typeof originalNext === "function") {
488
+ return originalNext.apply(this, nextArgs);
489
+ }
490
+ return;
491
+ };
492
+ return invokeHook(this, span, [wrappedNext, ...callArgs], true);
493
+ } : function wrappedHookPromise(...args) {
494
+ const span = startHookSpan(this);
495
+ return invokeHook(this, span, args, false);
482
496
  };
483
- Object.defineProperty(wrappedHook, "length", { value: handler.length });
484
497
  wrappedHook[WRAPPED_HOOK_FLAG] = true;
485
498
  return wrappedHook;
486
499
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/statement.ts","../src/instrumentation.ts"],"names":["wrappedHook","trace"],"mappings":"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","file":"index.js","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"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/statement.ts","../src/instrumentation.ts"],"names":["wrappedNext","trace"],"mappings":"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","file":"index.js","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 startHookSpan = (self: any) => {\n let modelName: string | undefined;\n let collectionName: string | undefined;\n\n try {\n if (self.constructor?.modelName) {\n modelName = self.constructor.modelName;\n collectionName =\n self.constructor.collection?.collectionName || modelName;\n } else if (self.model?.modelName) {\n modelName = self.model.modelName;\n collectionName = self.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 span;\n };\n\n const invokeHook = (\n self: any,\n span: Span,\n args: any[],\n callbackStyle: boolean,\n ) =>\n runWithSpan(span, () => {\n try {\n const result = handler.apply(self, 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 (!callbackStyle) {\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 const wrappedHook = expectsCallback\n ? function wrappedHookCallback(this: any, arg0: any, ...args: any[]): any {\n const span = startHookSpan(this);\n const runtimeArgs = [arg0, ...args];\n const callbackIndex = runtimeArgs.findIndex(\n (arg) => typeof arg === 'function',\n );\n const originalNext =\n callbackIndex === -1\n ? undefined\n : (runtimeArgs[callbackIndex] as (...args: any[]) => void);\n\n const callArgs =\n callbackIndex === -1\n ? runtimeArgs\n : runtimeArgs.filter((_, index) => index !== callbackIndex);\n\n const wrappedNext = function wrappedNext(\n this: any,\n ...nextArgs: any[]\n ) {\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 if (typeof originalNext === 'function') {\n return originalNext.apply(this, nextArgs);\n }\n return;\n };\n\n return invokeHook(this, span, [wrappedNext, ...callArgs], true);\n }\n : function wrappedHookPromise(this: any, ...args: any[]): any {\n const span = startHookSpan(this);\n return invokeHook(this, span, args, false);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-mongoose",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "OpenTelemetry instrumentation for Mongoose with db.query.text capture and automatic redaction",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,17 +35,17 @@
35
35
  "autotel": "*"
36
36
  },
37
37
  "devDependencies": {
38
- "@opentelemetry/context-async-hooks": "^2.6.1",
39
- "@opentelemetry/core": "^2.6.1",
40
- "@opentelemetry/sdk-trace-node": "^2.6.1",
41
- "@types/node": "^25.5.2",
38
+ "@opentelemetry/context-async-hooks": "^2.7.0",
39
+ "@opentelemetry/core": "^2.7.0",
40
+ "@opentelemetry/sdk-trace-node": "^2.7.0",
41
+ "@types/node": "^25.6.0",
42
42
  "mongodb-memory-server": "^11.0.1",
43
- "mongoose": "^8.0.0",
43
+ "mongoose": "^9.5.0",
44
44
  "rimraf": "^6.1.3",
45
45
  "tsup": "^8.5.1",
46
- "typescript": "^6.0.2",
47
- "vitest": "^4.1.3",
48
- "autotel": "2.26.0"
46
+ "typescript": "^6.0.3",
47
+ "vitest": "^4.1.5",
48
+ "autotel": "2.26.3"
49
49
  },
50
50
  "repository": {
51
51
  "type": "git",
@@ -612,18 +612,18 @@ function wrapHookHandler(
612
612
  // preserve the original arity.
613
613
  const expectsCallback = handler.length > 0;
614
614
 
615
- const wrappedHook = function wrappedHook(this: any, ...args: any[]): any {
615
+ const startHookSpan = (self: any) => {
616
616
  let modelName: string | undefined;
617
617
  let collectionName: string | undefined;
618
618
 
619
619
  try {
620
- if (this.constructor?.modelName) {
621
- modelName = this.constructor.modelName;
620
+ if (self.constructor?.modelName) {
621
+ modelName = self.constructor.modelName;
622
622
  collectionName =
623
- this.constructor.collection?.collectionName || modelName;
624
- } else if (this.model?.modelName) {
625
- modelName = this.model.modelName;
626
- collectionName = this.model.collection?.collectionName || modelName;
623
+ self.constructor.collection?.collectionName || modelName;
624
+ } else if (self.model?.modelName) {
625
+ modelName = self.model.modelName;
626
+ collectionName = self.model.collection?.collectionName || modelName;
627
627
  }
628
628
  } catch {
629
629
  // Ignore errors in extracting context
@@ -647,28 +647,18 @@ function wrapHookHandler(
647
647
  span.setAttribute(ATTR_DB_NAMESPACE, config.dbName);
648
648
  }
649
649
 
650
- // For callback-style hooks, wrap the `next` callback to finalize the span
651
- // when the hook signals completion (instead of on synchronous return).
652
- // Kareem passes `next` as the first argument for callback-style hooks.
653
- if (expectsCallback && args.length > 0 && typeof args[0] === 'function') {
654
- const originalNext = args[0];
655
- args[0] = function wrappedNext(this: any, ...nextArgs: any[]) {
656
- const err = nextArgs[0];
657
- if (err) {
658
- finalizeSpan(
659
- span,
660
- err instanceof Error ? err : new Error(String(err)),
661
- );
662
- } else {
663
- finalizeSpan(span);
664
- }
665
- return originalNext.apply(this, nextArgs);
666
- };
667
- }
650
+ return span;
651
+ };
668
652
 
669
- return runWithSpan(span, () => {
653
+ const invokeHook = (
654
+ self: any,
655
+ span: Span,
656
+ args: any[],
657
+ callbackStyle: boolean,
658
+ ) =>
659
+ runWithSpan(span, () => {
670
660
  try {
671
- const result = handler.apply(this, args);
661
+ const result = handler.apply(self, args);
672
662
 
673
663
  if (result && typeof result.then === 'function') {
674
664
  return Promise.resolve(result as Promise<any>)
@@ -687,7 +677,7 @@ function wrapHookHandler(
687
677
 
688
678
  // Only finalize synchronously for non-callback hooks.
689
679
  // Callback-style hooks finalize in the wrappedNext above.
690
- if (!expectsCallback) {
680
+ if (!callbackStyle) {
691
681
  finalizeSpan(span);
692
682
  }
693
683
  return result;
@@ -699,11 +689,49 @@ function wrapHookHandler(
699
689
  throw error;
700
690
  }
701
691
  });
702
- };
703
692
 
704
- // Preserve function arity so kareem passes `next` for callback-style hooks.
705
- // Rest params (...args) give length=0; we must match the original handler.
706
- Object.defineProperty(wrappedHook, 'length', { value: handler.length });
693
+ const wrappedHook = expectsCallback
694
+ ? function wrappedHookCallback(this: any, arg0: any, ...args: any[]): any {
695
+ const span = startHookSpan(this);
696
+ const runtimeArgs = [arg0, ...args];
697
+ const callbackIndex = runtimeArgs.findIndex(
698
+ (arg) => typeof arg === 'function',
699
+ );
700
+ const originalNext =
701
+ callbackIndex === -1
702
+ ? undefined
703
+ : (runtimeArgs[callbackIndex] as (...args: any[]) => void);
704
+
705
+ const callArgs =
706
+ callbackIndex === -1
707
+ ? runtimeArgs
708
+ : runtimeArgs.filter((_, index) => index !== callbackIndex);
709
+
710
+ const wrappedNext = function wrappedNext(
711
+ this: any,
712
+ ...nextArgs: any[]
713
+ ) {
714
+ const err = nextArgs[0];
715
+ if (err) {
716
+ finalizeSpan(
717
+ span,
718
+ err instanceof Error ? err : new Error(String(err)),
719
+ );
720
+ } else {
721
+ finalizeSpan(span);
722
+ }
723
+ if (typeof originalNext === 'function') {
724
+ return originalNext.apply(this, nextArgs);
725
+ }
726
+ return;
727
+ };
728
+
729
+ return invokeHook(this, span, [wrappedNext, ...callArgs], true);
730
+ }
731
+ : function wrappedHookPromise(this: any, ...args: any[]): any {
732
+ const span = startHookSpan(this);
733
+ return invokeHook(this, span, args, false);
734
+ };
707
735
 
708
736
  // Mark as wrapped to prevent double-wrapping
709
737
  (wrappedHook as any)[WRAPPED_HOOK_FLAG] = true;