{"version":3,"file":"instrumentation.js","sources":["../../../../../src/integrations/tracing/hono/instrumentation.ts"],"sourcesContent":["import type { Span } from '@opentelemetry/api';\nimport { context, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport { isThenable } from '@sentry/core';\nimport { AttributeNames, HonoTypes } from './constants';\nimport type {\n  Context,\n  Handler,\n  HandlerInterface,\n  Hono,\n  HonoInstance,\n  MiddlewareHandler,\n  MiddlewareHandlerInterface,\n  Next,\n  OnHandlerInterface,\n} from './types';\n\nconst PACKAGE_NAME = '@sentry/instrumentation-hono';\nconst PACKAGE_VERSION = '0.0.1';\n\nexport interface HonoResponseHookFunction {\n  (span: Span): void;\n}\n\nexport interface HonoInstrumentationConfig extends InstrumentationConfig {\n  /** Function for adding custom span attributes from the response */\n  responseHook?: HonoResponseHookFunction;\n}\n\n/**\n * Hono instrumentation for OpenTelemetry\n */\nexport class HonoInstrumentation extends InstrumentationBase<HonoInstrumentationConfig> {\n  public constructor(config: HonoInstrumentationConfig = {}) {\n    super(PACKAGE_NAME, PACKAGE_VERSION, config);\n  }\n\n  /**\n   * Initialize the instrumentation.\n   */\n  public init(): InstrumentationNodeModuleDefinition[] {\n    return [\n      new InstrumentationNodeModuleDefinition('hono', ['>=4.0.0 <5'], moduleExports => this._patch(moduleExports)),\n    ];\n  }\n\n  /**\n   * Patches the module exports to instrument Hono.\n   */\n  private _patch(moduleExports: { Hono: Hono }): { Hono: Hono } {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const instrumentation = this;\n\n    class WrappedHono extends moduleExports.Hono {\n      public constructor(...args: unknown[]) {\n        super(...args);\n\n        instrumentation._wrap(this, 'get', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'post', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'put', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'delete', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'options', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'patch', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'all', instrumentation._patchHandler());\n        instrumentation._wrap(this, 'on', instrumentation._patchOnHandler());\n        instrumentation._wrap(this, 'use', instrumentation._patchMiddlewareHandler());\n      }\n    }\n\n    try {\n      moduleExports.Hono = WrappedHono;\n    } catch {\n      // This is a workaround for environments where direct assignment is not allowed.\n      return { ...moduleExports, Hono: WrappedHono };\n    }\n\n    return moduleExports;\n  }\n\n  /**\n   * Patches the route handler to instrument it.\n   */\n  private _patchHandler(): (original: HandlerInterface) => HandlerInterface {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const instrumentation = this;\n\n    return function (original: HandlerInterface) {\n      return function wrappedHandler(this: HonoInstance, ...args: unknown[]) {\n        if (typeof args[0] === 'string') {\n          const path = args[0];\n          if (args.length === 1) {\n            return original.apply(this, [path]);\n          }\n\n          const handlers = args.slice(1);\n          return original.apply(this, [\n            path,\n            ...handlers.map(handler => instrumentation._wrapHandler(handler as Handler | MiddlewareHandler)),\n          ]);\n        }\n\n        return original.apply(\n          this,\n          args.map(handler => instrumentation._wrapHandler(handler as Handler | MiddlewareHandler)),\n        );\n      };\n    };\n  }\n\n  /**\n   * Patches the 'on' handler to instrument it.\n   */\n  private _patchOnHandler(): (original: OnHandlerInterface) => OnHandlerInterface {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const instrumentation = this;\n\n    return function (original: OnHandlerInterface) {\n      return function wrappedHandler(this: HonoInstance, ...args: unknown[]) {\n        const handlers = args.slice(2);\n        return original.apply(this, [\n          ...args.slice(0, 2),\n          ...handlers.map(handler => instrumentation._wrapHandler(handler as Handler | MiddlewareHandler)),\n        ]);\n      };\n    };\n  }\n\n  /**\n   * Patches the middleware handler to instrument it.\n   */\n  private _patchMiddlewareHandler(): (original: MiddlewareHandlerInterface) => MiddlewareHandlerInterface {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const instrumentation = this;\n\n    return function (original: MiddlewareHandlerInterface) {\n      return function wrappedHandler(this: HonoInstance, ...args: unknown[]) {\n        if (typeof args[0] === 'string') {\n          const path = args[0];\n          if (args.length === 1) {\n            return original.apply(this, [path]);\n          }\n\n          const handlers = args.slice(1);\n          return original.apply(this, [\n            path,\n            ...handlers.map(handler => instrumentation._wrapHandler(handler as MiddlewareHandler)),\n          ]);\n        }\n\n        return original.apply(\n          this,\n          args.map(handler => instrumentation._wrapHandler(handler as MiddlewareHandler)),\n        );\n      };\n    };\n  }\n\n  /**\n   * Wraps a handler or middleware handler to apply instrumentation.\n   */\n  private _wrapHandler(handler: Handler | MiddlewareHandler): Handler | MiddlewareHandler {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const instrumentation = this;\n\n    return function (this: unknown, c: Context, next: Next) {\n      if (!instrumentation.isEnabled()) {\n        return handler.apply(this, [c, next]);\n      }\n\n      const path = c.req.path;\n      const span = instrumentation.tracer.startSpan(path);\n\n      return context.with(trace.setSpan(context.active(), span), () => {\n        return instrumentation._safeExecute(\n          () => {\n            const result = handler.apply(this, [c, next]);\n            if (isThenable(result)) {\n              return result.then(result => {\n                const type = instrumentation._determineHandlerType(result);\n                span.setAttributes({\n                  [AttributeNames.HONO_TYPE]: type,\n                  [AttributeNames.HONO_NAME]: type === HonoTypes.REQUEST_HANDLER ? path : handler.name || 'anonymous',\n                });\n                instrumentation.getConfig().responseHook?.(span);\n                return result;\n              });\n            } else {\n              const type = instrumentation._determineHandlerType(result);\n              span.setAttributes({\n                [AttributeNames.HONO_TYPE]: type,\n                [AttributeNames.HONO_NAME]: type === HonoTypes.REQUEST_HANDLER ? path : handler.name || 'anonymous',\n              });\n              instrumentation.getConfig().responseHook?.(span);\n              return result;\n            }\n          },\n          () => span.end(),\n          error => {\n            instrumentation._handleError(span, error);\n            span.end();\n          },\n        );\n      });\n    };\n  }\n\n  /**\n   * Safely executes a function and handles errors.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _safeExecute(execute: () => any, onSuccess: () => void, onFailure: (error: unknown) => void): () => any {\n    try {\n      const result = execute();\n\n      if (isThenable(result)) {\n        result.then(\n          () => onSuccess(),\n          (error: unknown) => onFailure(error),\n        );\n      } else {\n        onSuccess();\n      }\n\n      return result;\n    } catch (error: unknown) {\n      onFailure(error);\n      throw error;\n    }\n  }\n\n  /**\n   * Determines the handler type based on the result.\n   * @param result\n   * @private\n   */\n  private _determineHandlerType(result: unknown): HonoTypes {\n    return result === undefined ? HonoTypes.MIDDLEWARE : HonoTypes.REQUEST_HANDLER;\n  }\n\n  /**\n   * Handles errors by setting the span status and recording the exception.\n   */\n  private _handleError(span: Span, error: unknown): void {\n    if (error instanceof Error) {\n      span.setStatus({\n        code: SpanStatusCode.ERROR,\n        message: error.message,\n      });\n      span.recordException(error);\n    }\n  }\n}\n"],"names":[],"mappings":"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"}