{"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 {\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":["InstrumentationBase","InstrumentationNodeModuleDefinition","context","trace","isThenable","result","AttributeNames","HonoTypes","SpanStatusCode"],"mappings":"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"}