@geekmidas/telescope 10.0.0-alpha.2 → 10.0.0-alpha.21
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/{MetricsAggregator-4SqelGcG.d.cts → MetricsAggregator-BxBLQUPj.d.cts} +3 -6
- package/dist/MetricsAggregator-BxBLQUPj.d.cts.map +1 -0
- package/dist/{MetricsAggregator-DZrW8ls6.d.mts → MetricsAggregator-j9wmZ0K_.d.mts} +3 -6
- package/dist/MetricsAggregator-j9wmZ0K_.d.mts.map +1 -0
- package/dist/{Telescope-D4nmwDRA.d.cts → Telescope-BcrWTaar.d.mts} +4 -7
- package/dist/Telescope-BcrWTaar.d.mts.map +1 -0
- package/dist/{Telescope-Dl6VSfxd.d.mts → Telescope-DnCMZT7V.d.cts} +4 -7
- package/dist/Telescope-DnCMZT7V.d.cts.map +1 -0
- package/dist/Telescope.cjs +385 -4
- package/dist/Telescope.cjs.map +1 -0
- package/dist/Telescope.d.cts +1 -3
- package/dist/Telescope.d.mts +1 -3
- package/dist/Telescope.mjs +384 -4
- package/dist/Telescope.mjs.map +1 -0
- package/dist/adapters/index.d.cts +2 -2
- package/dist/adapters/index.d.mts +2 -2
- package/dist/adapters/index.mjs +1 -0
- package/dist/adapters/lambda.cjs +9 -10
- package/dist/adapters/lambda.cjs.map +1 -1
- package/dist/adapters/lambda.d.cts +9 -13
- package/dist/adapters/lambda.d.cts.map +1 -1
- package/dist/adapters/lambda.d.mts +9 -13
- package/dist/adapters/lambda.d.mts.map +1 -1
- package/dist/adapters/lambda.mjs +3 -4
- package/dist/adapters/lambda.mjs.map +1 -1
- package/dist/adapters/middy.cjs +236 -4
- package/dist/adapters/middy.cjs.map +1 -0
- package/dist/adapters/middy.d.cts +60 -5
- package/dist/adapters/middy.d.cts.map +1 -0
- package/dist/adapters/middy.d.mts +60 -5
- package/dist/adapters/middy.d.mts.map +1 -0
- package/dist/adapters/middy.mjs +234 -3
- package/dist/adapters/middy.mjs.map +1 -0
- package/dist/adapters/types.d.cts +162 -2
- package/dist/adapters/types.d.cts.map +1 -0
- package/dist/adapters/types.d.mts +162 -2
- package/dist/adapters/types.d.mts.map +1 -0
- package/dist/adapters/types.mjs +1 -0
- package/dist/core.cjs +22 -22
- package/dist/core.d.cts +4 -4
- package/dist/core.d.mts +4 -4
- package/dist/core.mjs +3 -4
- package/dist/index.cjs +8 -9
- package/dist/index.d.cts +5 -6
- package/dist/index.d.mts +5 -6
- package/dist/index.mjs +5 -7
- package/dist/instrumentation/core.cjs +147 -11
- package/dist/instrumentation/core.cjs.map +1 -0
- package/dist/instrumentation/core.d.cts +74 -3
- package/dist/instrumentation/core.d.cts.map +1 -0
- package/dist/instrumentation/core.d.mts +74 -3
- package/dist/instrumentation/core.d.mts.map +1 -0
- package/dist/instrumentation/core.mjs +137 -2
- package/dist/instrumentation/core.mjs.map +1 -0
- package/dist/instrumentation/hono.cjs +134 -6
- package/dist/instrumentation/hono.cjs.map +1 -0
- package/dist/instrumentation/hono.d.cts +67 -2
- package/dist/instrumentation/hono.d.cts.map +1 -0
- package/dist/instrumentation/hono.d.mts +67 -2
- package/dist/instrumentation/hono.d.mts.map +1 -0
- package/dist/instrumentation/hono.mjs +130 -3
- package/dist/instrumentation/hono.mjs.map +1 -0
- package/dist/instrumentation/http.cjs +164 -11
- package/dist/instrumentation/http.cjs.map +1 -0
- package/dist/instrumentation/http.d.cts +103 -2
- package/dist/instrumentation/http.d.cts.map +1 -0
- package/dist/instrumentation/http.d.mts +103 -2
- package/dist/instrumentation/http.d.mts.map +1 -0
- package/dist/instrumentation/http.mjs +154 -2
- package/dist/instrumentation/http.mjs.map +1 -0
- package/dist/instrumentation/index.cjs +47 -47
- package/dist/instrumentation/index.d.cts +9 -9
- package/dist/instrumentation/index.d.mts +9 -9
- package/dist/instrumentation/index.mjs +8 -9
- package/dist/instrumentation/middleware.cjs +162 -6
- package/dist/instrumentation/middleware.cjs.map +1 -0
- package/dist/instrumentation/middleware.d.cts +70 -2
- package/dist/instrumentation/middleware.d.cts.map +1 -0
- package/dist/instrumentation/middleware.d.mts +70 -2
- package/dist/instrumentation/middleware.d.mts.map +1 -0
- package/dist/instrumentation/middleware.mjs +158 -3
- package/dist/instrumentation/middleware.mjs.map +1 -0
- package/dist/instrumentation/otel.cjs +137 -3
- package/dist/instrumentation/otel.cjs.map +1 -0
- package/dist/instrumentation/otel.d.cts +97 -2
- package/dist/instrumentation/otel.d.cts.map +1 -0
- package/dist/instrumentation/otel.d.mts +97 -2
- package/dist/instrumentation/otel.d.mts.map +1 -0
- package/dist/instrumentation/otel.mjs +136 -3
- package/dist/instrumentation/otel.mjs.map +1 -0
- package/dist/instrumentation/setup.cjs +100 -4
- package/dist/instrumentation/setup.cjs.map +1 -0
- package/dist/instrumentation/setup.d.cts +83 -3
- package/dist/instrumentation/setup.d.cts.map +1 -0
- package/dist/instrumentation/setup.d.mts +83 -3
- package/dist/instrumentation/setup.d.mts.map +1 -0
- package/dist/instrumentation/setup.mjs +98 -3
- package/dist/instrumentation/setup.mjs.map +1 -0
- package/dist/instrumentation/tracing.cjs +114 -10
- package/dist/instrumentation/tracing.cjs.map +1 -0
- package/dist/instrumentation/tracing.d.cts +49 -2
- package/dist/instrumentation/tracing.d.cts.map +1 -0
- package/dist/instrumentation/tracing.d.mts +49 -2
- package/dist/instrumentation/tracing.d.mts.map +1 -0
- package/dist/instrumentation/tracing.mjs +105 -2
- package/dist/instrumentation/tracing.mjs.map +1 -0
- package/dist/logger/console.cjs +18 -12
- package/dist/logger/console.cjs.map +1 -1
- package/dist/logger/console.d.cts +7 -10
- package/dist/logger/console.d.cts.map +1 -1
- package/dist/logger/console.d.mts +7 -10
- package/dist/logger/console.d.mts.map +1 -1
- package/dist/logger/console.mjs +17 -11
- package/dist/logger/console.mjs.map +1 -1
- package/dist/logger/pino.cjs +6 -5
- package/dist/logger/pino.cjs.map +1 -1
- package/dist/logger/pino.d.cts +6 -10
- package/dist/logger/pino.d.cts.map +1 -1
- package/dist/logger/pino.d.mts +6 -10
- package/dist/logger/pino.d.mts.map +1 -1
- package/dist/logger/pino.mjs +2 -3
- package/dist/logger/pino.mjs.map +1 -1
- package/dist/metrics/MetricsAggregator.cjs +354 -2
- package/dist/metrics/MetricsAggregator.cjs.map +1 -0
- package/dist/metrics/MetricsAggregator.d.cts +1 -2
- package/dist/metrics/MetricsAggregator.d.mts +1 -2
- package/dist/metrics/MetricsAggregator.mjs +353 -2
- package/dist/metrics/MetricsAggregator.mjs.map +1 -0
- package/dist/metrics/index.cjs +3 -4
- package/dist/metrics/index.d.cts +2 -4
- package/dist/metrics/index.d.mts +2 -4
- package/dist/metrics/index.mjs +2 -4
- package/dist/metrics/storage/InMemoryMetricsStorage.cjs +240 -3
- package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +1 -0
- package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +43 -4
- package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +1 -0
- package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +43 -4
- package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +1 -0
- package/dist/metrics/storage/InMemoryMetricsStorage.mjs +239 -3
- package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +1 -0
- package/dist/metrics/storage/MetricsStorage.cjs +0 -1
- package/dist/metrics/storage/MetricsStorage.d.cts +56 -3
- package/dist/metrics/storage/MetricsStorage.d.cts.map +1 -0
- package/dist/metrics/storage/MetricsStorage.d.mts +56 -3
- package/dist/metrics/storage/MetricsStorage.d.mts.map +1 -0
- package/dist/metrics/storage/MetricsStorage.mjs +1 -1
- package/dist/metrics/storage/index.cjs +6 -6
- package/dist/metrics/storage/index.d.cts +3 -3
- package/dist/metrics/storage/index.d.mts +3 -3
- package/dist/metrics/storage/index.mjs +4 -5
- package/dist/metrics/storage/types.cjs +34 -2
- package/dist/metrics/storage/types.cjs.map +1 -0
- package/dist/metrics/storage/types.d.cts +207 -2
- package/dist/metrics/storage/types.d.cts.map +1 -0
- package/dist/metrics/storage/types.d.mts +207 -2
- package/dist/metrics/storage/types.d.mts.map +1 -0
- package/dist/metrics/storage/types.mjs +33 -2
- package/dist/metrics/storage/types.mjs.map +1 -0
- package/dist/otlp/hono.cjs +9 -15
- package/dist/otlp/hono.cjs.map +1 -1
- package/dist/otlp/hono.d.cts +3 -13
- package/dist/otlp/hono.d.cts.map +1 -1
- package/dist/otlp/hono.d.mts +3 -13
- package/dist/otlp/hono.d.mts.map +1 -1
- package/dist/otlp/hono.mjs +5 -11
- package/dist/otlp/hono.mjs.map +1 -1
- package/dist/otlp/index.cjs +11 -11
- package/dist/otlp/index.d.cts +4 -7
- package/dist/otlp/index.d.mts +4 -7
- package/dist/otlp/index.mjs +4 -5
- package/dist/otlp/receiver.cjs +88 -4
- package/dist/otlp/receiver.cjs.map +1 -0
- package/dist/otlp/receiver.d.cts +59 -7
- package/dist/otlp/receiver.d.cts.map +1 -0
- package/dist/otlp/receiver.d.mts +59 -7
- package/dist/otlp/receiver.d.mts.map +1 -0
- package/dist/otlp/receiver.mjs +87 -4
- package/dist/otlp/receiver.mjs.map +1 -0
- package/dist/otlp/transformer.cjs +214 -5
- package/dist/otlp/transformer.cjs.map +1 -0
- package/dist/otlp/transformer.d.cts +1 -3
- package/dist/otlp/transformer.d.mts +1 -3
- package/dist/otlp/transformer.mjs +211 -3
- package/dist/otlp/transformer.mjs.map +1 -0
- package/dist/otlp/types.cjs +57 -5
- package/dist/otlp/types.cjs.map +1 -0
- package/dist/otlp/types.d.cts +1 -1
- package/dist/otlp/types.d.mts +1 -1
- package/dist/otlp/types.mjs +53 -2
- package/dist/otlp/types.mjs.map +1 -0
- package/dist/redact.cjs +84 -3
- package/dist/redact.cjs.map +1 -0
- package/dist/redact.d.cts +4 -8
- package/dist/redact.d.cts.map +1 -1
- package/dist/redact.d.mts +4 -8
- package/dist/redact.d.mts.map +1 -1
- package/dist/redact.mjs +80 -2
- package/dist/redact.mjs.map +1 -0
- package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
- package/dist/server/hono.cjs +24 -33
- package/dist/server/hono.cjs.map +1 -1
- package/dist/server/hono.d.cts +10 -13
- package/dist/server/hono.d.cts.map +1 -1
- package/dist/server/hono.d.mts +10 -13
- package/dist/server/hono.d.mts.map +1 -1
- package/dist/server/hono.mjs +22 -31
- package/dist/server/hono.mjs.map +1 -1
- package/dist/storage/kysely.cjs +34 -32
- package/dist/storage/kysely.cjs.map +1 -1
- package/dist/storage/kysely.d.cts +8 -12
- package/dist/storage/kysely.d.cts.map +1 -1
- package/dist/storage/kysely.d.mts +8 -12
- package/dist/storage/kysely.d.mts.map +1 -1
- package/dist/storage/kysely.mjs +33 -31
- package/dist/storage/kysely.mjs.map +1 -1
- package/dist/storage/memory.cjs +122 -2
- package/dist/storage/memory.cjs.map +1 -0
- package/dist/storage/memory.d.cts +36 -3
- package/dist/storage/memory.d.cts.map +1 -0
- package/dist/storage/memory.d.mts +36 -3
- package/dist/storage/memory.d.mts.map +1 -0
- package/dist/storage/memory.mjs +121 -2
- package/dist/storage/memory.mjs.map +1 -0
- package/dist/{transformer-CTGsaVfV.d.mts → transformer-BBBXCjHP.d.mts} +4 -8
- package/dist/transformer-BBBXCjHP.d.mts.map +1 -0
- package/dist/{transformer-ICEbxpFf.d.cts → transformer-DlESim6Q.d.cts} +4 -8
- package/dist/transformer-DlESim6Q.d.cts.map +1 -0
- package/dist/{types-CmOB7CLO.d.cts → types-DVETVdpa.d.cts} +6 -7
- package/dist/types-DVETVdpa.d.cts.map +1 -0
- package/dist/{types-DBc0q5KD.d.mts → types-DVETVdpa.d.mts} +6 -7
- package/dist/types-DVETVdpa.d.mts.map +1 -0
- package/dist/{types-B1EIa_cQ.d.mts → types-a9Vistj1.d.cts} +2 -3
- package/dist/types-a9Vistj1.d.cts.map +1 -0
- package/dist/{types-l7Rlb5Mg.d.cts → types-a9Vistj1.d.mts} +2 -3
- package/dist/types-a9Vistj1.d.mts.map +1 -0
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.mjs +1 -0
- package/dist/ui-assets.cjs +31 -4
- package/dist/ui-assets.cjs.map +1 -0
- package/dist/ui-assets.d.cts +4 -6
- package/dist/ui-assets.d.cts.map +1 -1
- package/dist/ui-assets.d.mts +4 -6
- package/dist/ui-assets.d.mts.map +1 -1
- package/dist/ui-assets.mjs +28 -2
- package/dist/ui-assets.mjs.map +1 -0
- package/package.json +39 -37
- package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +0 -47
- package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +0 -1
- package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +0 -247
- package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +0 -1
- package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +0 -252
- package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +0 -1
- package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +0 -47
- package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +0 -1
- package/dist/MetricsAggregator-4SqelGcG.d.cts.map +0 -1
- package/dist/MetricsAggregator-B7lUICdH.cjs +0 -363
- package/dist/MetricsAggregator-B7lUICdH.cjs.map +0 -1
- package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +0 -1
- package/dist/MetricsAggregator-S3DQWNas.mjs +0 -357
- package/dist/MetricsAggregator-S3DQWNas.mjs.map +0 -1
- package/dist/MetricsStorage-B86e4131.d.cts +0 -60
- package/dist/MetricsStorage-B86e4131.d.cts.map +0 -1
- package/dist/MetricsStorage-BWyP2_12.d.mts +0 -60
- package/dist/MetricsStorage-BWyP2_12.d.mts.map +0 -1
- package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
- package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
- package/dist/Telescope-Cs3fv8jt.cjs +0 -395
- package/dist/Telescope-Cs3fv8jt.cjs.map +0 -1
- package/dist/Telescope-D4nmwDRA.d.cts.map +0 -1
- package/dist/Telescope-Dh5av3FC.mjs +0 -389
- package/dist/Telescope-Dh5av3FC.mjs.map +0 -1
- package/dist/Telescope-Dl6VSfxd.d.mts.map +0 -1
- package/dist/core--quSp5Qr.d.mts +0 -78
- package/dist/core--quSp5Qr.d.mts.map +0 -1
- package/dist/core-B4Jpia5H.d.cts +0 -78
- package/dist/core-B4Jpia5H.d.cts.map +0 -1
- package/dist/core-CtVHRJGv.cjs +0 -199
- package/dist/core-CtVHRJGv.cjs.map +0 -1
- package/dist/core-D6hJ6exL.mjs +0 -139
- package/dist/core-D6hJ6exL.mjs.map +0 -1
- package/dist/hono--uKQ7Jgi.d.mts +0 -71
- package/dist/hono--uKQ7Jgi.d.mts.map +0 -1
- package/dist/hono-Bw-ey6CT.mjs +0 -136
- package/dist/hono-Bw-ey6CT.mjs.map +0 -1
- package/dist/hono-CPHX7FAm.cjs +0 -160
- package/dist/hono-CPHX7FAm.cjs.map +0 -1
- package/dist/hono-CemCKU87.d.cts +0 -71
- package/dist/hono-CemCKU87.d.cts.map +0 -1
- package/dist/http-BIvr0YdI.mjs +0 -159
- package/dist/http-BIvr0YdI.mjs.map +0 -1
- package/dist/http-BiNtg85L.d.mts +0 -107
- package/dist/http-BiNtg85L.d.mts.map +0 -1
- package/dist/http-BsqmhurZ.cjs +0 -219
- package/dist/http-BsqmhurZ.cjs.map +0 -1
- package/dist/http-D1oTbfap.d.cts +0 -107
- package/dist/http-D1oTbfap.d.cts.map +0 -1
- package/dist/index-BL32-cvv.d.cts +0 -1
- package/dist/index-CsuikFeJ.d.mts +0 -1
- package/dist/memory--BK4iWiv.d.cts +0 -40
- package/dist/memory--BK4iWiv.d.cts.map +0 -1
- package/dist/memory-6S9H-IF5.mjs +0 -123
- package/dist/memory-6S9H-IF5.mjs.map +0 -1
- package/dist/memory-B0d_n1g5.cjs +0 -129
- package/dist/memory-B0d_n1g5.cjs.map +0 -1
- package/dist/memory-DCirEVFW.d.mts +0 -40
- package/dist/memory-DCirEVFW.d.mts.map +0 -1
- package/dist/metrics-D5YT-Rnq.mjs +0 -0
- package/dist/metrics-fhD3l3C3.cjs +0 -0
- package/dist/middleware-Bcq6XXGG.cjs +0 -184
- package/dist/middleware-Bcq6XXGG.cjs.map +0 -1
- package/dist/middleware-D1XEHvyy.mjs +0 -160
- package/dist/middleware-D1XEHvyy.mjs.map +0 -1
- package/dist/middleware-PeyS-9Ny.d.cts +0 -74
- package/dist/middleware-PeyS-9Ny.d.cts.map +0 -1
- package/dist/middleware-oHvo_ZgU.d.mts +0 -74
- package/dist/middleware-oHvo_ZgU.d.mts.map +0 -1
- package/dist/middy-B6Btl8XE.d.mts +0 -64
- package/dist/middy-B6Btl8XE.d.mts.map +0 -1
- package/dist/middy-Bq0defVg.d.cts +0 -64
- package/dist/middy-Bq0defVg.d.cts.map +0 -1
- package/dist/middy-DHWLmUAD.mjs +0 -236
- package/dist/middy-DHWLmUAD.mjs.map +0 -1
- package/dist/middy-DlWnZilH.cjs +0 -247
- package/dist/middy-DlWnZilH.cjs.map +0 -1
- package/dist/otel-B9bNoeZ2.mjs +0 -130
- package/dist/otel-B9bNoeZ2.mjs.map +0 -1
- package/dist/otel-Bk89b1lX.d.cts +0 -101
- package/dist/otel-Bk89b1lX.d.cts.map +0 -1
- package/dist/otel-BzjOtVxZ.cjs +0 -136
- package/dist/otel-BzjOtVxZ.cjs.map +0 -1
- package/dist/otel-lPMsM26e.d.mts +0 -101
- package/dist/otel-lPMsM26e.d.mts.map +0 -1
- package/dist/receiver-D46dfkYI.mjs +0 -89
- package/dist/receiver-D46dfkYI.mjs.map +0 -1
- package/dist/receiver-DLICx5uU.d.cts +0 -63
- package/dist/receiver-DLICx5uU.d.cts.map +0 -1
- package/dist/receiver-UeZT-H8u.d.mts +0 -63
- package/dist/receiver-UeZT-H8u.d.mts.map +0 -1
- package/dist/receiver-slCoAFat.cjs +0 -94
- package/dist/receiver-slCoAFat.cjs.map +0 -1
- package/dist/redact-BzkITCNW.mjs +0 -83
- package/dist/redact-BzkITCNW.mjs.map +0 -1
- package/dist/redact-DVaSSPZT.cjs +0 -95
- package/dist/redact-DVaSSPZT.cjs.map +0 -1
- package/dist/setup-Bkxm4g6b.d.mts +0 -87
- package/dist/setup-Bkxm4g6b.d.mts.map +0 -1
- package/dist/setup-D58N1f9O.d.cts +0 -87
- package/dist/setup-D58N1f9O.d.cts.map +0 -1
- package/dist/setup-DC9JMEYZ.mjs +0 -98
- package/dist/setup-DC9JMEYZ.mjs.map +0 -1
- package/dist/setup-DufxQpi9.cjs +0 -110
- package/dist/setup-DufxQpi9.cjs.map +0 -1
- package/dist/tracing-BX8uY2nR.d.cts +0 -53
- package/dist/tracing-BX8uY2nR.d.cts.map +0 -1
- package/dist/tracing-Bt1zWRlb.cjs +0 -167
- package/dist/tracing-Bt1zWRlb.cjs.map +0 -1
- package/dist/tracing-Cijm_5NI.mjs +0 -113
- package/dist/tracing-Cijm_5NI.mjs.map +0 -1
- package/dist/tracing-PnECEbEu.d.mts +0 -53
- package/dist/tracing-PnECEbEu.d.mts.map +0 -1
- package/dist/transformer-CFQ4WFk6.mjs +0 -215
- package/dist/transformer-CFQ4WFk6.mjs.map +0 -1
- package/dist/transformer-CTGsaVfV.d.mts.map +0 -1
- package/dist/transformer-Csl6fbgv.cjs +0 -232
- package/dist/transformer-Csl6fbgv.cjs.map +0 -1
- package/dist/transformer-ICEbxpFf.d.cts.map +0 -1
- package/dist/types-B1EIa_cQ.d.mts.map +0 -1
- package/dist/types-BMiHgsi4.cjs +0 -78
- package/dist/types-BMiHgsi4.cjs.map +0 -1
- package/dist/types-BRzW1NM8.d.cts +0 -166
- package/dist/types-BRzW1NM8.d.cts.map +0 -1
- package/dist/types-BS3Rx8Sk.d.cts +0 -209
- package/dist/types-BS3Rx8Sk.d.cts.map +0 -1
- package/dist/types-BzQ78Efw.d.mts +0 -166
- package/dist/types-BzQ78Efw.d.mts.map +0 -1
- package/dist/types-CbNGXnJE.d.mts +0 -209
- package/dist/types-CbNGXnJE.d.mts.map +0 -1
- package/dist/types-Cj59nqy7.mjs +0 -54
- package/dist/types-Cj59nqy7.mjs.map +0 -1
- package/dist/types-CmOB7CLO.d.cts.map +0 -1
- package/dist/types-DBc0q5KD.d.mts.map +0 -1
- package/dist/types-ZW-nfWf6.cjs +0 -40
- package/dist/types-ZW-nfWf6.cjs.map +0 -1
- package/dist/types-l7Rlb5Mg.d.cts.map +0 -1
- package/dist/types-ojhnLdwz.mjs +0 -34
- package/dist/types-ojhnLdwz.mjs.map +0 -1
- package/dist/ui-assets-BEXqOQLe.cjs +0 -48
- package/dist/ui-assets-BEXqOQLe.cjs.map +0 -1
- package/dist/ui-assets-BhTDUsrM.mjs +0 -30
- package/dist/ui-assets-BhTDUsrM.mjs.map +0 -1
package/dist/server/hono.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.cjs","names":["_flushTelemetry: (() => Promise<void>) | null","telescope: Telescope","options: TelescopeMiddlewareOptions","c: Context","next: Next","headers: Record<string, string>","query: Record<string, string>","body: unknown","requestSize: number | undefined","responseHeaders: Record<string, string>","responseBody: unknown","responseSize: number | undefined","ctx: TelescopeHonoContext","Hono","app: Hono","upgradeWebSocket: (handler: any) => any","options: WebSocketOptions","_event: Event","ws: WebSocket","event: MessageEvent"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hono.cjs","names":["Hono","getAsset","getIndexHtml"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
|
package/dist/server/hono.d.cts
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "../
|
|
3
|
-
import { Telescope } from "../Telescope-D4nmwDRA.cjs";
|
|
4
|
-
import { HonoAdapterConfig, TelescopeHonoContext } from "../types-BRzW1NM8.cjs";
|
|
1
|
+
import { t as Telescope } from "../Telescope-DnCMZT7V.cjs";
|
|
2
|
+
import { HonoAdapterConfig, TelescopeHonoContext } from "../adapters/types.cjs";
|
|
5
3
|
import { Context, Hono, MiddlewareHandler } from "hono";
|
|
6
|
-
|
|
7
4
|
//#region src/server/hono.d.ts
|
|
8
5
|
declare function getFlushTelemetry(): Promise<() => Promise<void>>;
|
|
9
6
|
/**
|
|
10
7
|
* Options for the Telescope Hono middleware
|
|
11
8
|
*/
|
|
12
|
-
interface TelescopeMiddlewareOptions {
|
|
9
|
+
export interface TelescopeMiddlewareOptions {
|
|
13
10
|
/**
|
|
14
11
|
* Whether to flush telemetry after each request.
|
|
15
12
|
* Enable this for serverless environments (Lambda, Edge).
|
|
@@ -20,15 +17,15 @@ interface TelescopeMiddlewareOptions {
|
|
|
20
17
|
/**
|
|
21
18
|
* Create Hono middleware that captures requests and responses
|
|
22
19
|
*/
|
|
23
|
-
declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
|
|
20
|
+
export declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
|
|
24
21
|
/**
|
|
25
22
|
* Create Hono app with dashboard UI and API routes
|
|
26
23
|
*/
|
|
27
|
-
declare function createUI(telescope: Telescope): Hono;
|
|
24
|
+
export declare function createUI(telescope: Telescope): Hono;
|
|
28
25
|
/**
|
|
29
26
|
* Options for setupWebSocket
|
|
30
27
|
*/
|
|
31
|
-
interface WebSocketOptions {
|
|
28
|
+
export interface WebSocketOptions {
|
|
32
29
|
/**
|
|
33
30
|
* Enable real-time metrics broadcasting (default: true)
|
|
34
31
|
*/
|
|
@@ -42,15 +39,15 @@ interface WebSocketOptions {
|
|
|
42
39
|
* Set up WebSocket routes for real-time updates.
|
|
43
40
|
* Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.
|
|
44
41
|
*/
|
|
45
|
-
declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
|
|
42
|
+
export declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
|
|
46
43
|
/**
|
|
47
44
|
* Get the Telescope context from Hono context (set by middleware)
|
|
48
45
|
*/
|
|
49
|
-
declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
|
|
46
|
+
export declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
|
|
50
47
|
/**
|
|
51
48
|
* Get the request ID from Hono context (set by middleware)
|
|
52
49
|
*/
|
|
53
|
-
declare function getRequestId(c: Context): string | undefined;
|
|
50
|
+
export declare function getRequestId(c: Context): string | undefined;
|
|
54
51
|
//#endregion
|
|
55
|
-
export { HonoAdapterConfig, Telescope, TelescopeHonoContext,
|
|
52
|
+
export { type HonoAdapterConfig, type Telescope, type TelescopeHonoContext, getFlushTelemetry as getFlushTelemetryFn };
|
|
56
53
|
//# sourceMappingURL=hono.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.d.cts","names":[],"sources":["../../src/server/hono.ts"],"
|
|
1
|
+
{"version":3,"file":"hono.d.cts","names":[],"sources":["../../src/server/hono.ts"],"mappings":";;;;iBAYe,qBAAqB,cAAc;;;;iBAkBjC;;;;;;EAMhB;;;;;wBAMe,iBACf,WAAW,WACX,UAAS,6BACP;;;;wBAsLa,SAAS,WAAW,YAAY;;;;iBAkI/B;;;;EAIhB;;;;EAIA;;;;;;wBAOe,eACf,KAAK,MACL,WAAW,WACX,mBAAmB,sBACnB,UAAS;;;;wBAmCM,oBACf,GAAG,UACD;;;;wBAOa,aAAa,GAAG"}
|
package/dist/server/hono.d.mts
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "../
|
|
3
|
-
import { Telescope } from "../Telescope-Dl6VSfxd.mjs";
|
|
4
|
-
import { HonoAdapterConfig, TelescopeHonoContext } from "../types-BzQ78Efw.mjs";
|
|
1
|
+
import { t as Telescope } from "../Telescope-BcrWTaar.mjs";
|
|
2
|
+
import { HonoAdapterConfig, TelescopeHonoContext } from "../adapters/types.mjs";
|
|
5
3
|
import { Context, Hono, MiddlewareHandler } from "hono";
|
|
6
|
-
|
|
7
4
|
//#region src/server/hono.d.ts
|
|
8
5
|
declare function getFlushTelemetry(): Promise<() => Promise<void>>;
|
|
9
6
|
/**
|
|
10
7
|
* Options for the Telescope Hono middleware
|
|
11
8
|
*/
|
|
12
|
-
interface TelescopeMiddlewareOptions {
|
|
9
|
+
export interface TelescopeMiddlewareOptions {
|
|
13
10
|
/**
|
|
14
11
|
* Whether to flush telemetry after each request.
|
|
15
12
|
* Enable this for serverless environments (Lambda, Edge).
|
|
@@ -20,15 +17,15 @@ interface TelescopeMiddlewareOptions {
|
|
|
20
17
|
/**
|
|
21
18
|
* Create Hono middleware that captures requests and responses
|
|
22
19
|
*/
|
|
23
|
-
declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
|
|
20
|
+
export declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
|
|
24
21
|
/**
|
|
25
22
|
* Create Hono app with dashboard UI and API routes
|
|
26
23
|
*/
|
|
27
|
-
declare function createUI(telescope: Telescope): Hono;
|
|
24
|
+
export declare function createUI(telescope: Telescope): Hono;
|
|
28
25
|
/**
|
|
29
26
|
* Options for setupWebSocket
|
|
30
27
|
*/
|
|
31
|
-
interface WebSocketOptions {
|
|
28
|
+
export interface WebSocketOptions {
|
|
32
29
|
/**
|
|
33
30
|
* Enable real-time metrics broadcasting (default: true)
|
|
34
31
|
*/
|
|
@@ -42,15 +39,15 @@ interface WebSocketOptions {
|
|
|
42
39
|
* Set up WebSocket routes for real-time updates.
|
|
43
40
|
* Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.
|
|
44
41
|
*/
|
|
45
|
-
declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
|
|
42
|
+
export declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
|
|
46
43
|
/**
|
|
47
44
|
* Get the Telescope context from Hono context (set by middleware)
|
|
48
45
|
*/
|
|
49
|
-
declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
|
|
46
|
+
export declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
|
|
50
47
|
/**
|
|
51
48
|
* Get the request ID from Hono context (set by middleware)
|
|
52
49
|
*/
|
|
53
|
-
declare function getRequestId(c: Context): string | undefined;
|
|
50
|
+
export declare function getRequestId(c: Context): string | undefined;
|
|
54
51
|
//#endregion
|
|
55
|
-
export { HonoAdapterConfig, Telescope, TelescopeHonoContext,
|
|
52
|
+
export { type HonoAdapterConfig, type Telescope, type TelescopeHonoContext, getFlushTelemetry as getFlushTelemetryFn };
|
|
56
53
|
//# sourceMappingURL=hono.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.d.mts","names":[],"sources":["../../src/server/hono.ts"],"
|
|
1
|
+
{"version":3,"file":"hono.d.mts","names":[],"sources":["../../src/server/hono.ts"],"mappings":";;;;iBAYe,qBAAqB,cAAc;;;;iBAkBjC;;;;;;EAMhB;;;;;wBAMe,iBACf,WAAW,WACX,UAAS,6BACP;;;;wBAsLa,SAAS,WAAW,YAAY;;;;iBAkI/B;;;;EAIhB;;;;EAIA;;;;;;wBAOe,eACf,KAAK,MACL,WAAW,WACX,mBAAmB,sBACnB,UAAS;;;;wBAmCM,oBACf,GAAG,UACD;;;;wBAOa,aAAa,GAAG"}
|
package/dist/server/hono.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { getAsset, getIndexHtml } from "../ui-assets
|
|
1
|
+
import { getAsset, getIndexHtml } from "../ui-assets.mjs";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
|
|
4
3
|
//#region src/server/hono.ts
|
|
5
4
|
let _flushTelemetry = null;
|
|
6
5
|
async function getFlushTelemetry() {
|
|
@@ -57,10 +56,8 @@ function createMiddleware(telescope, options = {}) {
|
|
|
57
56
|
const responseContentLength = c.res.headers.get("content-length");
|
|
58
57
|
if (responseContentLength) responseSize = parseInt(responseContentLength, 10);
|
|
59
58
|
if (telescope.recordBody) try {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const cloned = c.res.clone();
|
|
63
|
-
const text = await cloned.text();
|
|
59
|
+
if ((c.res.headers.get("content-type") || "").includes("application/json")) {
|
|
60
|
+
const text = await c.res.clone().text();
|
|
64
61
|
responseSize ??= Buffer.byteLength(text, "utf8");
|
|
65
62
|
try {
|
|
66
63
|
responseBody = JSON.parse(text);
|
|
@@ -69,30 +66,26 @@ function createMiddleware(telescope, options = {}) {
|
|
|
69
66
|
}
|
|
70
67
|
}
|
|
71
68
|
} catch {}
|
|
72
|
-
const requestId = await telescope.recordRequest({
|
|
73
|
-
method: c.req.method,
|
|
74
|
-
path: c.req.path,
|
|
75
|
-
url: c.req.url,
|
|
76
|
-
headers,
|
|
77
|
-
body,
|
|
78
|
-
query,
|
|
79
|
-
status: c.res.status,
|
|
80
|
-
responseHeaders,
|
|
81
|
-
responseBody,
|
|
82
|
-
duration,
|
|
83
|
-
ip,
|
|
84
|
-
requestSize,
|
|
85
|
-
responseSize
|
|
86
|
-
});
|
|
87
69
|
const ctx = {
|
|
88
|
-
requestId
|
|
70
|
+
requestId: await telescope.recordRequest({
|
|
71
|
+
method: c.req.method,
|
|
72
|
+
path: c.req.path,
|
|
73
|
+
url: c.req.url,
|
|
74
|
+
headers,
|
|
75
|
+
body,
|
|
76
|
+
query,
|
|
77
|
+
status: c.res.status,
|
|
78
|
+
responseHeaders,
|
|
79
|
+
responseBody,
|
|
80
|
+
duration,
|
|
81
|
+
ip,
|
|
82
|
+
requestSize,
|
|
83
|
+
responseSize
|
|
84
|
+
}),
|
|
89
85
|
startTime
|
|
90
86
|
};
|
|
91
87
|
c.set(CONTEXT_KEY, ctx);
|
|
92
|
-
if (flushOnResponse)
|
|
93
|
-
const flushTelemetry = await getFlushTelemetry();
|
|
94
|
-
await flushTelemetry();
|
|
95
|
-
}
|
|
88
|
+
if (flushOnResponse) await (await getFlushTelemetry())();
|
|
96
89
|
} catch (error) {
|
|
97
90
|
await telescope.exception(error);
|
|
98
91
|
throw error;
|
|
@@ -204,8 +197,7 @@ function createUI(telescope) {
|
|
|
204
197
|
return c.json({ success: true });
|
|
205
198
|
});
|
|
206
199
|
app.get("/assets/:filename", (c) => {
|
|
207
|
-
const
|
|
208
|
-
const assetPath = `assets/${filename}`;
|
|
200
|
+
const assetPath = `assets/${c.req.param("filename")}`;
|
|
209
201
|
const asset = getAsset(assetPath);
|
|
210
202
|
if (asset) return c.body(asset.content, 200, {
|
|
211
203
|
"Content-Type": asset.contentType,
|
|
@@ -241,8 +233,7 @@ function setupWebSocket(app, telescope, upgradeWebSocket, options = {}) {
|
|
|
241
233
|
},
|
|
242
234
|
onMessage: (event, ws) => {
|
|
243
235
|
try {
|
|
244
|
-
|
|
245
|
-
if (data.type === "ping") ws.send(JSON.stringify({ type: "pong" }));
|
|
236
|
+
if (JSON.parse(event.data).type === "ping") ws.send(JSON.stringify({ type: "pong" }));
|
|
246
237
|
} catch {}
|
|
247
238
|
}
|
|
248
239
|
})));
|
|
@@ -259,7 +250,7 @@ function getTelescopeContext(c) {
|
|
|
259
250
|
function getRequestId(c) {
|
|
260
251
|
return getTelescopeContext(c)?.requestId;
|
|
261
252
|
}
|
|
262
|
-
|
|
263
253
|
//#endregion
|
|
264
254
|
export { createMiddleware, createUI, getFlushTelemetry as getFlushTelemetryFn, getRequestId, getTelescopeContext, setupWebSocket };
|
|
255
|
+
|
|
265
256
|
//# sourceMappingURL=hono.mjs.map
|
package/dist/server/hono.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.mjs","names":["_flushTelemetry: (() => Promise<void>) | null","telescope: Telescope","options: TelescopeMiddlewareOptions","c: Context","next: Next","headers: Record<string, string>","query: Record<string, string>","body: unknown","requestSize: number | undefined","responseHeaders: Record<string, string>","responseBody: unknown","responseSize: number | undefined","ctx: TelescopeHonoContext","app: Hono","upgradeWebSocket: (handler: any) => any","options: WebSocketOptions","_event: Event","ws: WebSocket","event: MessageEvent"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hono.mjs","names":[],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
|
package/dist/storage/kysely.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
//#region src/storage/kysely.ts
|
|
3
3
|
/**
|
|
4
4
|
* Kysely-based storage implementation for Telescope.
|
|
@@ -55,16 +55,14 @@ var KyselyStorage = class {
|
|
|
55
55
|
if (statusFilter.endsWith("xx")) {
|
|
56
56
|
const firstChar = statusFilter[0];
|
|
57
57
|
if (firstChar) {
|
|
58
|
-
const
|
|
59
|
-
const minStatus = category * 100;
|
|
58
|
+
const minStatus = parseInt(firstChar, 10) * 100;
|
|
60
59
|
const maxStatus = minStatus + 99;
|
|
61
60
|
query = query.where("status", ">=", minStatus).where("status", "<=", maxStatus);
|
|
62
61
|
}
|
|
63
62
|
} else query = query.where("status", "=", parseInt(statusFilter, 10));
|
|
64
63
|
}
|
|
65
|
-
query = this.applyQueryOptions(query, options);
|
|
66
|
-
|
|
67
|
-
return rows.map((row) => this.rowToRequest(row));
|
|
64
|
+
query = this.applyQueryOptions(query, options, ["path", "url"]);
|
|
65
|
+
return (await query.execute()).map((row) => this.rowToRequest(row));
|
|
68
66
|
}
|
|
69
67
|
async getRequest(id) {
|
|
70
68
|
const row = await this.db.selectFrom(this.requestsTable).selectAll().where("id", "=", id).executeTakeFirst();
|
|
@@ -81,9 +79,8 @@ var KyselyStorage = class {
|
|
|
81
79
|
}
|
|
82
80
|
async getExceptions(options) {
|
|
83
81
|
let query = this.db.selectFrom(this.exceptionsTable).selectAll().orderBy("timestamp", "desc");
|
|
84
|
-
query = this.applyQueryOptions(query, options);
|
|
85
|
-
|
|
86
|
-
return rows.map((row) => this.rowToException(row));
|
|
82
|
+
query = this.applyQueryOptions(query, options, ["name", "message"]);
|
|
83
|
+
return (await query.execute()).map((row) => this.rowToException(row));
|
|
87
84
|
}
|
|
88
85
|
async getException(id) {
|
|
89
86
|
const row = await this.db.selectFrom(this.exceptionsTable).selectAll().where("id", "=", id).executeTakeFirst();
|
|
@@ -101,17 +98,15 @@ var KyselyStorage = class {
|
|
|
101
98
|
async getLogs(options) {
|
|
102
99
|
let query = this.db.selectFrom(this.logsTable).selectAll().orderBy("timestamp", "desc");
|
|
103
100
|
if (options?.level) query = query.where("level", "=", options.level);
|
|
104
|
-
query = this.applyQueryOptions(query, options);
|
|
105
|
-
|
|
106
|
-
return rows.map((row) => this.rowToLog(row));
|
|
101
|
+
query = this.applyQueryOptions(query, options, ["message"]);
|
|
102
|
+
return (await query.execute()).map((row) => this.rowToLog(row));
|
|
107
103
|
}
|
|
108
104
|
async prune(olderThan) {
|
|
109
|
-
|
|
105
|
+
return (await Promise.all([
|
|
110
106
|
this.db.deleteFrom(this.requestsTable).where("timestamp", "<", olderThan).executeTakeFirst(),
|
|
111
107
|
this.db.deleteFrom(this.exceptionsTable).where("timestamp", "<", olderThan).executeTakeFirst(),
|
|
112
108
|
this.db.deleteFrom(this.logsTable).where("timestamp", "<", olderThan).executeTakeFirst()
|
|
113
|
-
]);
|
|
114
|
-
return results.reduce((sum, result) => sum + Number(result.numDeletedRows ?? 0), 0);
|
|
109
|
+
])).reduce((sum, result) => sum + Number(result.numDeletedRows ?? 0), 0);
|
|
115
110
|
}
|
|
116
111
|
async getStats() {
|
|
117
112
|
const [requestsResult, exceptionsResult, logsResult] = await Promise.all([
|
|
@@ -148,15 +143,11 @@ var KyselyStorage = class {
|
|
|
148
143
|
newestEntry: newestDate ? new Date(newestDate) : void 0
|
|
149
144
|
};
|
|
150
145
|
}
|
|
151
|
-
applyQueryOptions(query, options) {
|
|
146
|
+
applyQueryOptions(query, options, searchColumns) {
|
|
152
147
|
if (!options) return query.limit(50);
|
|
153
148
|
if (options.after) query = query.where("timestamp", ">=", options.after);
|
|
154
149
|
if (options.before) query = query.where("timestamp", "<=", options.before);
|
|
155
|
-
if (options.search) query = query.where((eb) => eb.or(
|
|
156
|
-
eb("message", "ilike", `%${options.search}%`),
|
|
157
|
-
eb("path", "ilike", `%${options.search}%`),
|
|
158
|
-
eb("url", "ilike", `%${options.search}%`)
|
|
159
|
-
]));
|
|
150
|
+
if (options.search) query = query.where((eb) => eb.or(searchColumns.map((column) => eb(column, "ilike", `%${options.search}%`))));
|
|
160
151
|
const limit = options.limit ?? 50;
|
|
161
152
|
const offset = options.offset ?? 0;
|
|
162
153
|
return query.limit(limit).offset(offset);
|
|
@@ -167,17 +158,17 @@ var KyselyStorage = class {
|
|
|
167
158
|
method: entry.method,
|
|
168
159
|
path: entry.path,
|
|
169
160
|
url: entry.url,
|
|
170
|
-
headers: entry.headers,
|
|
171
|
-
body: entry.body
|
|
172
|
-
query: entry.query
|
|
161
|
+
headers: toJson(entry.headers),
|
|
162
|
+
body: toJson(entry.body),
|
|
163
|
+
query: toJson(entry.query),
|
|
173
164
|
status: entry.status,
|
|
174
|
-
response_headers: entry.responseHeaders,
|
|
175
|
-
response_body: entry.responseBody
|
|
165
|
+
response_headers: toJson(entry.responseHeaders),
|
|
166
|
+
response_body: toJson(entry.responseBody),
|
|
176
167
|
duration: entry.duration,
|
|
177
168
|
timestamp: entry.timestamp,
|
|
178
169
|
ip: entry.ip ?? null,
|
|
179
170
|
user_id: entry.userId ?? null,
|
|
180
|
-
tags: entry.tags
|
|
171
|
+
tags: toJson(entry.tags)
|
|
181
172
|
};
|
|
182
173
|
}
|
|
183
174
|
rowToRequest(row) {
|
|
@@ -204,12 +195,12 @@ var KyselyStorage = class {
|
|
|
204
195
|
id: entry.id,
|
|
205
196
|
name: entry.name,
|
|
206
197
|
message: entry.message,
|
|
207
|
-
stack: entry.stack,
|
|
208
|
-
source: entry.source
|
|
198
|
+
stack: toJson(entry.stack),
|
|
199
|
+
source: toJson(entry.source),
|
|
209
200
|
request_id: entry.requestId ?? null,
|
|
210
201
|
timestamp: entry.timestamp,
|
|
211
202
|
handled: entry.handled,
|
|
212
|
-
tags: entry.tags
|
|
203
|
+
tags: toJson(entry.tags)
|
|
213
204
|
};
|
|
214
205
|
}
|
|
215
206
|
rowToException(row) {
|
|
@@ -230,7 +221,7 @@ var KyselyStorage = class {
|
|
|
230
221
|
id: entry.id,
|
|
231
222
|
level: entry.level,
|
|
232
223
|
message: entry.message,
|
|
233
|
-
context: entry.context
|
|
224
|
+
context: toJson(entry.context),
|
|
234
225
|
request_id: entry.requestId ?? null,
|
|
235
226
|
timestamp: entry.timestamp
|
|
236
227
|
};
|
|
@@ -259,6 +250,17 @@ var KyselyStorage = class {
|
|
|
259
250
|
}
|
|
260
251
|
};
|
|
261
252
|
/**
|
|
253
|
+
* A value for a JSON column, as JSON text.
|
|
254
|
+
*
|
|
255
|
+
* Handed an object, node-postgres writes JSON; handed an array it writes a
|
|
256
|
+
* Postgres array literal (`{1,2}`), which a `jsonb` column rejects — so every
|
|
257
|
+
* exception (its stack is an array) failed to save. Serialising here makes
|
|
258
|
+
* the column's type the only thing that decides.
|
|
259
|
+
*/
|
|
260
|
+
function toJson(value) {
|
|
261
|
+
return value === void 0 || value === null ? null : JSON.stringify(value);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
262
264
|
* SQL migration to create telescope's tables.
|
|
263
265
|
*
|
|
264
266
|
* Pass a schema to have them created in one, and to have `down` drop the whole
|
|
@@ -354,8 +356,8 @@ DROP TABLE IF EXISTS requests;
|
|
|
354
356
|
`
|
|
355
357
|
};
|
|
356
358
|
}
|
|
357
|
-
|
|
358
359
|
//#endregion
|
|
359
360
|
exports.KyselyStorage = KyselyStorage;
|
|
360
361
|
exports.getTelescopeMigration = getTelescopeMigration;
|
|
362
|
+
|
|
361
363
|
//# sourceMappingURL=kysely.cjs.map
|