@geekmidas/telescope 10.0.0-alpha.9 → 10.0.0-alpha.91
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/README.md +14 -14
- package/dist/{MetricsAggregator-4SqelGcG.d.cts → MetricsAggregator-BJdIvfEv.d.mts} +3 -6
- package/dist/MetricsAggregator-BJdIvfEv.d.mts.map +1 -0
- package/dist/{MetricsAggregator-DZrW8ls6.d.mts → MetricsAggregator-CnC3oT5q.d.cts} +3 -6
- package/dist/MetricsAggregator-CnC3oT5q.d.cts.map +1 -0
- package/dist/{Telescope-D4nmwDRA.d.cts → Telescope-BVfDvVvY.d.mts} +4 -7
- package/dist/Telescope-BVfDvVvY.d.mts.map +1 -0
- package/dist/{Telescope-Dl6VSfxd.d.mts → Telescope-DeqSHfuB.d.cts} +4 -7
- package/dist/Telescope-DeqSHfuB.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 +174 -6
- package/dist/instrumentation/hono.cjs.map +1 -0
- package/dist/instrumentation/hono.d.cts +86 -2
- package/dist/instrumentation/hono.d.cts.map +1 -0
- package/dist/instrumentation/hono.d.mts +86 -2
- package/dist/instrumentation/hono.d.mts.map +1 -0
- package/dist/instrumentation/hono.mjs +170 -3
- package/dist/instrumentation/hono.mjs.map +1 -0
- package/dist/instrumentation/http.cjs +189 -11
- package/dist/instrumentation/http.cjs.map +1 -0
- package/dist/instrumentation/http.d.cts +119 -2
- package/dist/instrumentation/http.d.cts.map +1 -0
- package/dist/instrumentation/http.d.mts +119 -2
- package/dist/instrumentation/http.d.mts.map +1 -0
- package/dist/instrumentation/http.mjs +178 -2
- package/dist/instrumentation/http.mjs.map +1 -0
- package/dist/instrumentation/index.cjs +56 -47
- package/dist/instrumentation/index.d.cts +11 -9
- package/dist/instrumentation/index.d.mts +11 -9
- package/dist/instrumentation/index.mjs +10 -9
- package/dist/instrumentation/middleware.cjs +164 -6
- package/dist/instrumentation/middleware.cjs.map +1 -0
- package/dist/instrumentation/middleware.d.cts +83 -2
- package/dist/instrumentation/middleware.d.cts.map +1 -0
- package/dist/instrumentation/middleware.d.mts +83 -2
- package/dist/instrumentation/middleware.d.mts.map +1 -0
- package/dist/instrumentation/middleware.mjs +160 -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/sampler.cjs +54 -0
- package/dist/instrumentation/sampler.cjs.map +1 -0
- package/dist/instrumentation/sampler.d.cts +38 -0
- package/dist/instrumentation/sampler.d.cts.map +1 -0
- package/dist/instrumentation/sampler.d.mts +38 -0
- package/dist/instrumentation/sampler.d.mts.map +1 -0
- package/dist/instrumentation/sampler.mjs +52 -0
- package/dist/instrumentation/sampler.mjs.map +1 -0
- package/dist/instrumentation/setup.cjs +142 -4
- package/dist/instrumentation/setup.cjs.map +1 -0
- package/dist/instrumentation/setup.d.cts +139 -3
- package/dist/instrumentation/setup.d.cts.map +1 -0
- package/dist/instrumentation/setup.d.mts +139 -3
- package/dist/instrumentation/setup.d.mts.map +1 -0
- package/dist/instrumentation/setup.mjs +139 -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/instrumentation/trust.cjs +107 -0
- package/dist/instrumentation/trust.cjs.map +1 -0
- package/dist/instrumentation/trust.d.cts +57 -0
- package/dist/instrumentation/trust.d.cts.map +1 -0
- package/dist/instrumentation/trust.d.mts +57 -0
- package/dist/instrumentation/trust.d.mts.map +1 -0
- package/dist/instrumentation/trust.mjs +104 -0
- package/dist/instrumentation/trust.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 +33 -54
- package/dist/server/hono.cjs.map +1 -1
- package/dist/server/hono.d.cts +19 -14
- package/dist/server/hono.d.cts.map +1 -1
- package/dist/server/hono.d.mts +19 -14
- package/dist/server/hono.d.mts.map +1 -1
- package/dist/server/hono.mjs +31 -52
- 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-BtqjAs0b.d.cts} +4 -8
- package/dist/transformer-BtqjAs0b.d.cts.map +1 -0
- package/dist/{transformer-ICEbxpFf.d.cts → transformer-DI6t8-YA.d.mts} +4 -8
- package/dist/transformer-DI6t8-YA.d.mts.map +1 -0
- package/dist/{types-B1EIa_cQ.d.mts → types-BVujq4zd.d.cts} +3 -4
- package/dist/types-BVujq4zd.d.cts.map +1 -0
- package/dist/{types-l7Rlb5Mg.d.cts → types-BVujq4zd.d.mts} +3 -4
- package/dist/types-BVujq4zd.d.mts.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.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.mjs +1 -0
- package/package.json +9 -5
- 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-CbqELCtm.cjs +0 -112
- package/dist/setup-CbqELCtm.cjs.map +0 -1
- package/dist/setup-D58N1f9O.d.cts +0 -87
- package/dist/setup-D58N1f9O.d.cts.map +0 -1
- package/dist/setup-P7dAjwih.mjs +0 -100
- package/dist/setup-P7dAjwih.mjs.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/ui-assets.cjs +0 -5
- package/dist/ui-assets.d.cts +0 -13
- package/dist/ui-assets.d.cts.map +0 -1
- package/dist/ui-assets.d.mts +0 -13
- package/dist/ui-assets.d.mts.map +0 -1
- package/dist/ui-assets.mjs +0 -3
package/dist/Telescope.mjs
CHANGED
|
@@ -1,5 +1,385 @@
|
|
|
1
|
-
import "./MetricsAggregator
|
|
2
|
-
import "./redact
|
|
3
|
-
import {
|
|
1
|
+
import { MetricsAggregator } from "./metrics/MetricsAggregator.mjs";
|
|
2
|
+
import { createRedactor } from "./redact.mjs";
|
|
3
|
+
import { nanoid } from "nanoid";
|
|
4
|
+
//#region src/Telescope.ts
|
|
5
|
+
/**
|
|
6
|
+
* Framework-agnostic Telescope class for debugging and monitoring applications.
|
|
7
|
+
* Use framework-specific adapters (e.g., @geekmidas/telescope/hono) for integration.
|
|
8
|
+
*/
|
|
9
|
+
var Telescope = class {
|
|
10
|
+
storage;
|
|
11
|
+
options;
|
|
12
|
+
wsClients = /* @__PURE__ */ new Set();
|
|
13
|
+
pruneInterval;
|
|
14
|
+
metricsBroadcastInterval;
|
|
15
|
+
redactor;
|
|
16
|
+
metricsAggregator;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.storage = options.storage;
|
|
19
|
+
this.options = this.normalizeOptions(options);
|
|
20
|
+
this.redactor = createRedactor(options.redact);
|
|
21
|
+
this.metricsAggregator = new MetricsAggregator(options.metrics);
|
|
22
|
+
if (this.options.pruneAfterHours) {
|
|
23
|
+
const intervalMs = 36e5;
|
|
24
|
+
this.pruneInterval = setInterval(() => {
|
|
25
|
+
this.autoPrune().catch(console.error);
|
|
26
|
+
}, intervalMs);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Record a request entry
|
|
31
|
+
*/
|
|
32
|
+
async recordRequest(entry) {
|
|
33
|
+
if (!this.options.enabled) return "";
|
|
34
|
+
const id = this.options.getRequestId?.() ?? nanoid();
|
|
35
|
+
let fullEntry = {
|
|
36
|
+
...entry,
|
|
37
|
+
id,
|
|
38
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
39
|
+
};
|
|
40
|
+
if (this.redactor) fullEntry = this.redactor(fullEntry);
|
|
41
|
+
this.metricsAggregator.record(fullEntry);
|
|
42
|
+
await this.storage.saveRequest(fullEntry);
|
|
43
|
+
this.broadcast({
|
|
44
|
+
type: "request",
|
|
45
|
+
payload: fullEntry,
|
|
46
|
+
timestamp: Date.now()
|
|
47
|
+
});
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Log entry input for batch operations
|
|
52
|
+
*/
|
|
53
|
+
async saveLogEntries(entries) {
|
|
54
|
+
if (this.storage.saveLogs) await this.storage.saveLogs(entries);
|
|
55
|
+
else await Promise.all(entries.map((entry) => this.storage.saveLog(entry)));
|
|
56
|
+
for (const entry of entries) this.broadcast({
|
|
57
|
+
type: "log",
|
|
58
|
+
payload: entry,
|
|
59
|
+
timestamp: Date.now()
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record log entries in batch.
|
|
64
|
+
* More efficient than individual calls for database storage.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* await telescope.log([
|
|
68
|
+
* { level: 'info', message: 'Request started' },
|
|
69
|
+
* { level: 'debug', message: 'Processing...', context: { step: 1 } },
|
|
70
|
+
* ]);
|
|
71
|
+
*/
|
|
72
|
+
async log(entries) {
|
|
73
|
+
if (!this.options.enabled || entries.length === 0) return;
|
|
74
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
75
|
+
const logEntries = entries.map((e) => {
|
|
76
|
+
const entry = {
|
|
77
|
+
id: nanoid(),
|
|
78
|
+
level: e.level,
|
|
79
|
+
message: e.message,
|
|
80
|
+
context: e.context,
|
|
81
|
+
requestId: e.requestId,
|
|
82
|
+
timestamp
|
|
83
|
+
};
|
|
84
|
+
return this.redactor ? this.redactor(entry) : entry;
|
|
85
|
+
});
|
|
86
|
+
await this.saveLogEntries(logEntries);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Log a debug message
|
|
90
|
+
*/
|
|
91
|
+
async debug(message, context, requestId) {
|
|
92
|
+
return this.logSingle("debug", message, context, requestId);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Log an info message
|
|
96
|
+
*/
|
|
97
|
+
async info(message, context, requestId) {
|
|
98
|
+
return this.logSingle("info", message, context, requestId);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Log a warning message
|
|
102
|
+
*/
|
|
103
|
+
async warn(message, context, requestId) {
|
|
104
|
+
return this.logSingle("warn", message, context, requestId);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Log an error message
|
|
108
|
+
*/
|
|
109
|
+
async error(message, context, requestId) {
|
|
110
|
+
return this.logSingle("error", message, context, requestId);
|
|
111
|
+
}
|
|
112
|
+
async logSingle(level, message, context, requestId) {
|
|
113
|
+
if (!this.options.enabled) return;
|
|
114
|
+
let entry = {
|
|
115
|
+
id: nanoid(),
|
|
116
|
+
level,
|
|
117
|
+
message,
|
|
118
|
+
context,
|
|
119
|
+
requestId,
|
|
120
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
121
|
+
};
|
|
122
|
+
if (this.redactor) entry = this.redactor(entry);
|
|
123
|
+
await this.storage.saveLog(entry);
|
|
124
|
+
this.broadcast({
|
|
125
|
+
type: "log",
|
|
126
|
+
payload: entry,
|
|
127
|
+
timestamp: Date.now()
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Record an exception
|
|
132
|
+
*/
|
|
133
|
+
async exception(error, requestId) {
|
|
134
|
+
if (!this.options.enabled) return;
|
|
135
|
+
const stack = this.parseStack(error.stack || "");
|
|
136
|
+
const entry = {
|
|
137
|
+
id: nanoid(),
|
|
138
|
+
name: error.name,
|
|
139
|
+
message: error.message,
|
|
140
|
+
stack,
|
|
141
|
+
requestId,
|
|
142
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
143
|
+
handled: false
|
|
144
|
+
};
|
|
145
|
+
await this.storage.saveException(entry);
|
|
146
|
+
this.broadcast({
|
|
147
|
+
type: "exception",
|
|
148
|
+
payload: entry,
|
|
149
|
+
timestamp: Date.now()
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get requests from storage
|
|
154
|
+
*/
|
|
155
|
+
async getRequests(options) {
|
|
156
|
+
return this.storage.getRequests(options);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get a single request by ID
|
|
160
|
+
*/
|
|
161
|
+
async getRequest(id) {
|
|
162
|
+
return this.storage.getRequest(id);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get exceptions from storage
|
|
166
|
+
*/
|
|
167
|
+
async getExceptions(options) {
|
|
168
|
+
return this.storage.getExceptions(options);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get a single exception by ID
|
|
172
|
+
*/
|
|
173
|
+
async getException(id) {
|
|
174
|
+
return this.storage.getException(id);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get logs from storage
|
|
178
|
+
*/
|
|
179
|
+
async getLogs(options) {
|
|
180
|
+
return this.storage.getLogs(options);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get storage statistics
|
|
184
|
+
*/
|
|
185
|
+
async getStats() {
|
|
186
|
+
return this.storage.getStats();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get aggregated request metrics
|
|
190
|
+
*/
|
|
191
|
+
getMetrics(options) {
|
|
192
|
+
return this.metricsAggregator.getMetrics(options);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get metrics for individual endpoints
|
|
196
|
+
*/
|
|
197
|
+
getEndpointMetrics(options) {
|
|
198
|
+
return this.metricsAggregator.getEndpointMetrics(options);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get detailed metrics for a specific endpoint
|
|
202
|
+
*/
|
|
203
|
+
getEndpointDetails(method, path, options) {
|
|
204
|
+
return this.metricsAggregator.getEndpointDetails(method, path, options);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get status code distribution
|
|
208
|
+
*/
|
|
209
|
+
getStatusDistribution(options) {
|
|
210
|
+
return this.metricsAggregator.getStatusDistribution(options);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Reset metrics data
|
|
214
|
+
*/
|
|
215
|
+
resetMetrics() {
|
|
216
|
+
this.metricsAggregator.reset();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get a real-time metrics snapshot for broadcasting
|
|
220
|
+
*/
|
|
221
|
+
getMetricsSnapshot() {
|
|
222
|
+
const metrics = this.metricsAggregator.getMetrics();
|
|
223
|
+
const statusDist = this.metricsAggregator.getStatusDistribution();
|
|
224
|
+
return {
|
|
225
|
+
timestamp: Date.now(),
|
|
226
|
+
totalRequests: metrics.totalRequests,
|
|
227
|
+
requestsPerSecond: metrics.requestsPerSecond,
|
|
228
|
+
avgDuration: metrics.avgDuration,
|
|
229
|
+
errorRate: metrics.errorRate,
|
|
230
|
+
p50: metrics.p50Duration,
|
|
231
|
+
p95: metrics.p95Duration,
|
|
232
|
+
p99: metrics.p99Duration,
|
|
233
|
+
statusDistribution: statusDist
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Start broadcasting metrics to WebSocket clients at a given interval.
|
|
238
|
+
* Call this after setting up WebSocket to enable real-time metrics updates.
|
|
239
|
+
*
|
|
240
|
+
* @param intervalMs - Broadcast interval in milliseconds (default: 5000)
|
|
241
|
+
*/
|
|
242
|
+
startMetricsBroadcast(intervalMs = 5e3) {
|
|
243
|
+
if (this.metricsBroadcastInterval) return;
|
|
244
|
+
this.metricsBroadcastInterval = setInterval(() => {
|
|
245
|
+
if (this.wsClients.size > 0) {
|
|
246
|
+
const snapshot = this.getMetricsSnapshot();
|
|
247
|
+
this.broadcast({
|
|
248
|
+
type: "metrics",
|
|
249
|
+
payload: snapshot,
|
|
250
|
+
timestamp: Date.now()
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}, intervalMs);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Stop broadcasting metrics to WebSocket clients
|
|
257
|
+
*/
|
|
258
|
+
stopMetricsBroadcast() {
|
|
259
|
+
if (this.metricsBroadcastInterval) {
|
|
260
|
+
clearInterval(this.metricsBroadcastInterval);
|
|
261
|
+
this.metricsBroadcastInterval = void 0;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Add a WebSocket client for real-time updates
|
|
266
|
+
*/
|
|
267
|
+
addWsClient(ws) {
|
|
268
|
+
this.wsClients.add(ws);
|
|
269
|
+
this.broadcast({
|
|
270
|
+
type: "connected",
|
|
271
|
+
payload: { clientCount: this.wsClients.size },
|
|
272
|
+
timestamp: Date.now()
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Remove a WebSocket client
|
|
277
|
+
*/
|
|
278
|
+
removeWsClient(ws) {
|
|
279
|
+
this.wsClients.delete(ws);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Broadcast an event to all connected WebSocket clients
|
|
283
|
+
*/
|
|
284
|
+
broadcast(event) {
|
|
285
|
+
const data = JSON.stringify(event);
|
|
286
|
+
for (const client of this.wsClients) try {
|
|
287
|
+
client.send(data);
|
|
288
|
+
} catch {
|
|
289
|
+
this.wsClients.delete(client);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Manually prune old entries
|
|
294
|
+
*/
|
|
295
|
+
async prune(olderThan) {
|
|
296
|
+
return this.storage.prune(olderThan);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Clean up resources
|
|
300
|
+
*/
|
|
301
|
+
destroy() {
|
|
302
|
+
if (this.pruneInterval) clearInterval(this.pruneInterval);
|
|
303
|
+
this.stopMetricsBroadcast();
|
|
304
|
+
this.wsClients.clear();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get the telescope path
|
|
308
|
+
*/
|
|
309
|
+
get path() {
|
|
310
|
+
return this.options.path;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Check if telescope is enabled
|
|
314
|
+
*/
|
|
315
|
+
get enabled() {
|
|
316
|
+
return this.options.enabled;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Check if body recording is enabled
|
|
320
|
+
*/
|
|
321
|
+
get recordBody() {
|
|
322
|
+
return this.options.recordBody;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get max body size
|
|
326
|
+
*/
|
|
327
|
+
get maxBodySize() {
|
|
328
|
+
return this.options.maxBodySize;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Check if a path should be ignored
|
|
332
|
+
*/
|
|
333
|
+
shouldIgnore(path) {
|
|
334
|
+
if (path.startsWith(this.options.path)) return true;
|
|
335
|
+
return this.options.ignorePatterns.some((pattern) => {
|
|
336
|
+
if (pattern.includes("*")) return new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/\?/g, ".")}$`).test(path);
|
|
337
|
+
return path.startsWith(pattern);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
normalizeOptions(options) {
|
|
341
|
+
return {
|
|
342
|
+
storage: options.storage,
|
|
343
|
+
enabled: options.enabled ?? true,
|
|
344
|
+
path: options.path ?? "/__telescope",
|
|
345
|
+
recordBody: options.recordBody ?? true,
|
|
346
|
+
maxBodySize: options.maxBodySize ?? 65536,
|
|
347
|
+
ignorePatterns: options.ignorePatterns ?? [],
|
|
348
|
+
pruneAfterHours: options.pruneAfterHours,
|
|
349
|
+
getRequestId: options.getRequestId
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
parseStack(stack) {
|
|
353
|
+
const lines = stack.split("\n").slice(1);
|
|
354
|
+
const frames = [];
|
|
355
|
+
for (const line of lines) {
|
|
356
|
+
const match = line.match(/at\s+(.+?)\s+\((.+):(\d+):(\d+)\)/) || line.match(/at\s+(.+):(\d+):(\d+)/);
|
|
357
|
+
if (match) {
|
|
358
|
+
if (match.length === 5 && match[1] && match[2] && match[3] && match[4]) frames.push({
|
|
359
|
+
function: match[1],
|
|
360
|
+
file: match[2],
|
|
361
|
+
line: parseInt(match[3], 10),
|
|
362
|
+
column: parseInt(match[4], 10),
|
|
363
|
+
isApp: !match[2].includes("node_modules")
|
|
364
|
+
});
|
|
365
|
+
else if (match.length === 4 && match[1] && match[2] && match[3]) frames.push({
|
|
366
|
+
function: "<anonymous>",
|
|
367
|
+
file: match[1],
|
|
368
|
+
line: parseInt(match[2], 10),
|
|
369
|
+
column: parseInt(match[3], 10),
|
|
370
|
+
isApp: !match[1].includes("node_modules")
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return frames;
|
|
375
|
+
}
|
|
376
|
+
async autoPrune() {
|
|
377
|
+
if (!this.options.pruneAfterHours) return;
|
|
378
|
+
const olderThan = /* @__PURE__ */ new Date(Date.now() - this.options.pruneAfterHours * 60 * 60 * 1e3);
|
|
379
|
+
await this.storage.prune(olderThan);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
//#endregion
|
|
383
|
+
export { Telescope };
|
|
4
384
|
|
|
5
|
-
|
|
385
|
+
//# sourceMappingURL=Telescope.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Telescope.mjs","names":[],"sources":["../src/Telescope.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport {\n\tMetricsAggregator,\n\ttype MetricsAggregatorOptions,\n} from './metrics/MetricsAggregator';\nimport { createRedactor, type Redactor } from './redact';\nimport type {\n\tEndpointDetails,\n\tEndpointMetrics,\n\tExceptionEntry,\n\tLogEntry,\n\tMetricsQueryOptions,\n\tMetricsSnapshot,\n\tNormalizedTelescopeOptions,\n\tQueryOptions,\n\tRequestEntry,\n\tRequestMetrics,\n\tStackFrame,\n\tStatusDistribution,\n\tTelescopeEvent,\n\tTelescopeOptions,\n\tTelescopeStorage,\n} from './types';\n\n/**\n * Framework-agnostic Telescope class for debugging and monitoring applications.\n * Use framework-specific adapters (e.g., @geekmidas/telescope/hono) for integration.\n */\nexport class Telescope {\n\tprivate storage: TelescopeStorage;\n\tprivate options: NormalizedTelescopeOptions;\n\tprivate wsClients = new Set<WebSocket>();\n\tprivate pruneInterval?: ReturnType<typeof setInterval>;\n\tprivate metricsBroadcastInterval?: ReturnType<typeof setInterval>;\n\tprivate redactor?: Redactor;\n\tprivate metricsAggregator: MetricsAggregator;\n\n\tconstructor(\n\t\toptions: TelescopeOptions & { metrics?: MetricsAggregatorOptions },\n\t) {\n\t\tthis.storage = options.storage;\n\t\tthis.options = this.normalizeOptions(options);\n\t\tthis.redactor = createRedactor(options.redact);\n\t\tthis.metricsAggregator = new MetricsAggregator(options.metrics);\n\n\t\t// Set up auto-pruning if configured\n\t\tif (this.options.pruneAfterHours) {\n\t\t\tconst intervalMs = 60 * 60 * 1000; // 1 hour\n\t\t\tthis.pruneInterval = setInterval(() => {\n\t\t\t\tthis.autoPrune().catch(console.error);\n\t\t\t}, intervalMs);\n\t\t}\n\t}\n\n\t// ============================================\n\t// Public API - Recording\n\t// ============================================\n\n\t/**\n\t * Record a request entry\n\t */\n\tasync recordRequest(\n\t\tentry: Omit<RequestEntry, 'id' | 'timestamp'>,\n\t): Promise<string> {\n\t\tif (!this.options.enabled) return '';\n\n\t\t// Use injected request ID from context if available, otherwise generate one\n\t\tconst id = this.options.getRequestId?.() ?? nanoid();\n\t\tlet fullEntry: RequestEntry = {\n\t\t\t...entry,\n\t\t\tid,\n\t\t\ttimestamp: new Date(),\n\t\t};\n\n\t\t// Apply redaction if configured\n\t\tif (this.redactor) {\n\t\t\tfullEntry = this.redactor(fullEntry);\n\t\t}\n\n\t\t// Record metrics (before storage for real-time aggregation)\n\t\tthis.metricsAggregator.record(fullEntry);\n\n\t\tawait this.storage.saveRequest(fullEntry);\n\t\tthis.broadcast({\n\t\t\ttype: 'request',\n\t\t\tpayload: fullEntry,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\treturn id;\n\t}\n\n\t/**\n\t * Log entry input for batch operations\n\t */\n\tprivate async saveLogEntries(entries: LogEntry[]): Promise<void> {\n\t\tif (this.storage.saveLogs) {\n\t\t\tawait this.storage.saveLogs(entries);\n\t\t} else {\n\t\t\tawait Promise.all(entries.map((entry) => this.storage.saveLog(entry)));\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tthis.broadcast({ type: 'log', payload: entry, timestamp: Date.now() });\n\t\t}\n\t}\n\n\t/**\n\t * Record log entries in batch.\n\t * More efficient than individual calls for database storage.\n\t *\n\t * @example\n\t * await telescope.log([\n\t * { level: 'info', message: 'Request started' },\n\t * { level: 'debug', message: 'Processing...', context: { step: 1 } },\n\t * ]);\n\t */\n\tasync log(\n\t\tentries: Array<{\n\t\t\tlevel: 'debug' | 'info' | 'warn' | 'error';\n\t\t\tmessage: string;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t\trequestId?: string;\n\t\t}>,\n\t): Promise<void> {\n\t\tif (!this.options.enabled || entries.length === 0) return;\n\n\t\tconst timestamp = new Date();\n\t\tconst logEntries: LogEntry[] = entries.map((e) => {\n\t\t\tconst entry: LogEntry = {\n\t\t\t\tid: nanoid(),\n\t\t\t\tlevel: e.level,\n\t\t\t\tmessage: e.message,\n\t\t\t\tcontext: e.context,\n\t\t\t\trequestId: e.requestId,\n\t\t\t\ttimestamp,\n\t\t\t};\n\t\t\treturn this.redactor ? this.redactor(entry) : entry;\n\t\t});\n\n\t\tawait this.saveLogEntries(logEntries);\n\t}\n\n\t/**\n\t * Log a debug message\n\t */\n\tasync debug(\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t\trequestId?: string,\n\t): Promise<void> {\n\t\treturn this.logSingle('debug', message, context, requestId);\n\t}\n\n\t/**\n\t * Log an info message\n\t */\n\tasync info(\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t\trequestId?: string,\n\t): Promise<void> {\n\t\treturn this.logSingle('info', message, context, requestId);\n\t}\n\n\t/**\n\t * Log a warning message\n\t */\n\tasync warn(\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t\trequestId?: string,\n\t): Promise<void> {\n\t\treturn this.logSingle('warn', message, context, requestId);\n\t}\n\n\t/**\n\t * Log an error message\n\t */\n\tasync error(\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t\trequestId?: string,\n\t): Promise<void> {\n\t\treturn this.logSingle('error', message, context, requestId);\n\t}\n\n\tprivate async logSingle(\n\t\tlevel: LogEntry['level'],\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t\trequestId?: string,\n\t): Promise<void> {\n\t\tif (!this.options.enabled) return;\n\n\t\tlet entry: LogEntry = {\n\t\t\tid: nanoid(),\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t\tcontext,\n\t\t\trequestId,\n\t\t\ttimestamp: new Date(),\n\t\t};\n\n\t\tif (this.redactor) {\n\t\t\tentry = this.redactor(entry);\n\t\t}\n\n\t\tawait this.storage.saveLog(entry);\n\t\tthis.broadcast({ type: 'log', payload: entry, timestamp: Date.now() });\n\t}\n\n\t/**\n\t * Record an exception\n\t */\n\tasync exception(error: Error, requestId?: string): Promise<void> {\n\t\tif (!this.options.enabled) return;\n\n\t\tconst stack = this.parseStack(error.stack || '');\n\n\t\tconst entry: ExceptionEntry = {\n\t\t\tid: nanoid(),\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tstack,\n\t\t\trequestId,\n\t\t\ttimestamp: new Date(),\n\t\t\thandled: false,\n\t\t};\n\n\t\tawait this.storage.saveException(entry);\n\t\tthis.broadcast({\n\t\t\ttype: 'exception',\n\t\t\tpayload: entry,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t// ============================================\n\t// Public API - Data Access\n\t// ============================================\n\n\t/**\n\t * Get requests from storage\n\t */\n\tasync getRequests(options?: QueryOptions): Promise<RequestEntry[]> {\n\t\treturn this.storage.getRequests(options);\n\t}\n\n\t/**\n\t * Get a single request by ID\n\t */\n\tasync getRequest(id: string): Promise<RequestEntry | null> {\n\t\treturn this.storage.getRequest(id);\n\t}\n\n\t/**\n\t * Get exceptions from storage\n\t */\n\tasync getExceptions(options?: QueryOptions): Promise<ExceptionEntry[]> {\n\t\treturn this.storage.getExceptions(options);\n\t}\n\n\t/**\n\t * Get a single exception by ID\n\t */\n\tasync getException(id: string): Promise<ExceptionEntry | null> {\n\t\treturn this.storage.getException(id);\n\t}\n\n\t/**\n\t * Get logs from storage\n\t */\n\tasync getLogs(options?: QueryOptions): Promise<LogEntry[]> {\n\t\treturn this.storage.getLogs(options);\n\t}\n\n\t/**\n\t * Get storage statistics\n\t */\n\tasync getStats() {\n\t\treturn this.storage.getStats();\n\t}\n\n\t// ============================================\n\t// Public API - Metrics\n\t// ============================================\n\n\t/**\n\t * Get aggregated request metrics\n\t */\n\tgetMetrics(options?: MetricsQueryOptions): RequestMetrics {\n\t\treturn this.metricsAggregator.getMetrics(options);\n\t}\n\n\t/**\n\t * Get metrics for individual endpoints\n\t */\n\tgetEndpointMetrics(options?: MetricsQueryOptions): EndpointMetrics[] {\n\t\treturn this.metricsAggregator.getEndpointMetrics(options);\n\t}\n\n\t/**\n\t * Get detailed metrics for a specific endpoint\n\t */\n\tgetEndpointDetails(\n\t\tmethod: string,\n\t\tpath: string,\n\t\toptions?: MetricsQueryOptions,\n\t): EndpointDetails | null {\n\t\treturn this.metricsAggregator.getEndpointDetails(method, path, options);\n\t}\n\n\t/**\n\t * Get status code distribution\n\t */\n\tgetStatusDistribution(options?: MetricsQueryOptions): StatusDistribution {\n\t\treturn this.metricsAggregator.getStatusDistribution(options);\n\t}\n\n\t/**\n\t * Reset metrics data\n\t */\n\tresetMetrics(): void {\n\t\tthis.metricsAggregator.reset();\n\t}\n\n\t/**\n\t * Get a real-time metrics snapshot for broadcasting\n\t */\n\tgetMetricsSnapshot(): MetricsSnapshot {\n\t\tconst metrics = this.metricsAggregator.getMetrics();\n\t\tconst statusDist = this.metricsAggregator.getStatusDistribution();\n\n\t\treturn {\n\t\t\ttimestamp: Date.now(),\n\t\t\ttotalRequests: metrics.totalRequests,\n\t\t\trequestsPerSecond: metrics.requestsPerSecond,\n\t\t\tavgDuration: metrics.avgDuration,\n\t\t\terrorRate: metrics.errorRate,\n\t\t\tp50: metrics.p50Duration,\n\t\t\tp95: metrics.p95Duration,\n\t\t\tp99: metrics.p99Duration,\n\t\t\tstatusDistribution: statusDist,\n\t\t};\n\t}\n\n\t/**\n\t * Start broadcasting metrics to WebSocket clients at a given interval.\n\t * Call this after setting up WebSocket to enable real-time metrics updates.\n\t *\n\t * @param intervalMs - Broadcast interval in milliseconds (default: 5000)\n\t */\n\tstartMetricsBroadcast(intervalMs = 5000): void {\n\t\tif (this.metricsBroadcastInterval) {\n\t\t\treturn; // Already running\n\t\t}\n\n\t\tthis.metricsBroadcastInterval = setInterval(() => {\n\t\t\tif (this.wsClients.size > 0) {\n\t\t\t\tconst snapshot = this.getMetricsSnapshot();\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: 'metrics',\n\t\t\t\t\tpayload: snapshot,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t}, intervalMs);\n\t}\n\n\t/**\n\t * Stop broadcasting metrics to WebSocket clients\n\t */\n\tstopMetricsBroadcast(): void {\n\t\tif (this.metricsBroadcastInterval) {\n\t\t\tclearInterval(this.metricsBroadcastInterval);\n\t\t\tthis.metricsBroadcastInterval = undefined;\n\t\t}\n\t}\n\n\t// ============================================\n\t// Public API - WebSocket\n\t// ============================================\n\n\t/**\n\t * Add a WebSocket client for real-time updates\n\t */\n\taddWsClient(ws: WebSocket): void {\n\t\tthis.wsClients.add(ws);\n\t\tthis.broadcast({\n\t\t\ttype: 'connected',\n\t\t\tpayload: { clientCount: this.wsClients.size },\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Remove a WebSocket client\n\t */\n\tremoveWsClient(ws: WebSocket): void {\n\t\tthis.wsClients.delete(ws);\n\t}\n\n\t/**\n\t * Broadcast an event to all connected WebSocket clients\n\t */\n\tbroadcast(event: TelescopeEvent): void {\n\t\tconst data = JSON.stringify(event);\n\t\tfor (const client of this.wsClients) {\n\t\t\ttry {\n\t\t\t\tclient.send(data);\n\t\t\t} catch {\n\t\t\t\tthis.wsClients.delete(client);\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================\n\t// Public API - Lifecycle\n\t// ============================================\n\n\t/**\n\t * Manually prune old entries\n\t */\n\tasync prune(olderThan: Date): Promise<number> {\n\t\treturn this.storage.prune(olderThan);\n\t}\n\n\t/**\n\t * Clean up resources\n\t */\n\tdestroy(): void {\n\t\tif (this.pruneInterval) {\n\t\t\tclearInterval(this.pruneInterval);\n\t\t}\n\t\tthis.stopMetricsBroadcast();\n\t\tthis.wsClients.clear();\n\t}\n\n\t// ============================================\n\t// Public API - Configuration\n\t// ============================================\n\n\t/**\n\t * Get the telescope path\n\t */\n\tget path(): string {\n\t\treturn this.options.path;\n\t}\n\n\t/**\n\t * Check if telescope is enabled\n\t */\n\tget enabled(): boolean {\n\t\treturn this.options.enabled;\n\t}\n\n\t/**\n\t * Check if body recording is enabled\n\t */\n\tget recordBody(): boolean {\n\t\treturn this.options.recordBody;\n\t}\n\n\t/**\n\t * Get max body size\n\t */\n\tget maxBodySize(): number {\n\t\treturn this.options.maxBodySize;\n\t}\n\n\t/**\n\t * Check if a path should be ignored\n\t */\n\tshouldIgnore(path: string): boolean {\n\t\t// Always ignore telescope's own routes\n\t\tif (path.startsWith(this.options.path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.options.ignorePatterns.some((pattern) => {\n\t\t\tif (pattern.includes('*')) {\n\t\t\t\tconst regex = new RegExp(\n\t\t\t\t\t`^${pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.')}$`,\n\t\t\t\t);\n\t\t\t\treturn regex.test(path);\n\t\t\t}\n\t\t\treturn path.startsWith(pattern);\n\t\t});\n\t}\n\n\t// ============================================\n\t// Private Methods\n\t// ============================================\n\n\tprivate normalizeOptions(\n\t\toptions: TelescopeOptions,\n\t): NormalizedTelescopeOptions {\n\t\treturn {\n\t\t\tstorage: options.storage,\n\t\t\tenabled: options.enabled ?? true,\n\t\t\tpath: options.path ?? '/__telescope',\n\t\t\trecordBody: options.recordBody ?? true,\n\t\t\tmaxBodySize: options.maxBodySize ?? 64 * 1024, // 64KB\n\t\t\tignorePatterns: options.ignorePatterns ?? [],\n\t\t\tpruneAfterHours: options.pruneAfterHours,\n\t\t\tgetRequestId: options.getRequestId,\n\t\t};\n\t}\n\n\tprivate parseStack(stack: string): StackFrame[] {\n\t\tconst lines = stack.split('\\n').slice(1);\n\t\tconst frames: StackFrame[] = [];\n\n\t\tfor (const line of lines) {\n\t\t\t// Match: \" at functionName (file:line:column)\"\n\t\t\t// or: \" at file:line:column\"\n\t\t\tconst match =\n\t\t\t\tline.match(/at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)/) ||\n\t\t\t\tline.match(/at\\s+(.+):(\\d+):(\\d+)/);\n\n\t\t\tif (match) {\n\t\t\t\tif (\n\t\t\t\t\tmatch.length === 5 &&\n\t\t\t\t\tmatch[1] &&\n\t\t\t\t\tmatch[2] &&\n\t\t\t\t\tmatch[3] &&\n\t\t\t\t\tmatch[4]\n\t\t\t\t) {\n\t\t\t\t\t// Has function name\n\t\t\t\t\tframes.push({\n\t\t\t\t\t\tfunction: match[1],\n\t\t\t\t\t\tfile: match[2],\n\t\t\t\t\t\tline: parseInt(match[3], 10),\n\t\t\t\t\t\tcolumn: parseInt(match[4], 10),\n\t\t\t\t\t\tisApp: !match[2].includes('node_modules'),\n\t\t\t\t\t});\n\t\t\t\t} else if (match.length === 4 && match[1] && match[2] && match[3]) {\n\t\t\t\t\t// No function name\n\t\t\t\t\tframes.push({\n\t\t\t\t\t\tfunction: '<anonymous>',\n\t\t\t\t\t\tfile: match[1],\n\t\t\t\t\t\tline: parseInt(match[2], 10),\n\t\t\t\t\t\tcolumn: parseInt(match[3], 10),\n\t\t\t\t\t\tisApp: !match[1].includes('node_modules'),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn frames;\n\t}\n\n\tprivate async autoPrune(): Promise<void> {\n\t\tif (!this.options.pruneAfterHours) return;\n\n\t\tconst olderThan = new Date(\n\t\t\tDate.now() - this.options.pruneAfterHours * 60 * 60 * 1000,\n\t\t);\n\t\tawait this.storage.prune(olderThan);\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables } from "
|
|
2
|
-
export { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables };
|
|
1
|
+
import { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables } from "./types.cjs";
|
|
2
|
+
export type { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables } from "
|
|
2
|
-
export { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables };
|
|
1
|
+
import { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables } from "./types.mjs";
|
|
2
|
+
export type { AdapterConfig, AdapterErrorContext, AdapterLifecycle, AdapterRequestContext, AdapterResponseContext, HonoAdapterConfig, HonoContextWithTelescope, LambdaAdapterConfig, SpanProcessorOptions, SpanProcessorStrategy, TelescopeAdapter, TelescopeEnvironment, TelescopeHonoContext, TelescopeHonoVariables };
|
package/dist/adapters/index.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/adapters/lambda.cjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_instrumentation_core = require("../instrumentation/core.cjs");
|
|
3
|
+
const require_adapters_middy = require("./middy.cjs");
|
|
4
|
+
let nanoid = require("nanoid");
|
|
6
5
|
//#region src/adapters/lambda.ts
|
|
7
6
|
/**
|
|
8
7
|
* Detect Lambda resource attributes from environment
|
|
@@ -63,7 +62,7 @@ var LambdaAdapter = class {
|
|
|
63
62
|
globalLambdaState.initialized = true;
|
|
64
63
|
}
|
|
65
64
|
async onDestroy() {
|
|
66
|
-
await
|
|
65
|
+
await require_instrumentation_core.flushTelemetry();
|
|
67
66
|
}
|
|
68
67
|
/**
|
|
69
68
|
* Extract request context from API Gateway event
|
|
@@ -155,7 +154,7 @@ var LambdaAdapter = class {
|
|
|
155
154
|
* Flush telemetry data before Lambda context freezes
|
|
156
155
|
*/
|
|
157
156
|
async flush() {
|
|
158
|
-
await
|
|
157
|
+
await require_instrumentation_core.flushTelemetry();
|
|
159
158
|
}
|
|
160
159
|
/**
|
|
161
160
|
* Get resource attributes for the Lambda function
|
|
@@ -236,12 +235,12 @@ function parseBody(body, isBase64Encoded) {
|
|
|
236
235
|
return body;
|
|
237
236
|
}
|
|
238
237
|
}
|
|
239
|
-
|
|
240
238
|
//#endregion
|
|
241
239
|
exports.LambdaAdapter = LambdaAdapter;
|
|
242
|
-
exports.createTelescopeHandler =
|
|
240
|
+
exports.createTelescopeHandler = require_adapters_middy.createTelescopeHandler;
|
|
243
241
|
exports.detectLambdaResources = detectLambdaResources;
|
|
244
242
|
exports.extractLambdaInvocationContext = extractLambdaInvocationContext;
|
|
245
|
-
exports.telescopeMiddleware =
|
|
243
|
+
exports.telescopeMiddleware = require_adapters_middy.telescopeMiddleware;
|
|
246
244
|
exports.wrapLambdaHandler = wrapLambdaHandler;
|
|
245
|
+
|
|
247
246
|
//# sourceMappingURL=lambda.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.cjs","names":["_event: unknown","context: LambdaContext","DEFAULT_LAMBDA_CONFIG: LambdaAdapterConfig","telescope: Telescope","config: Partial<LambdaAdapterConfig>","event: unknown","response: unknown","startTime: number","handler: (event: TEvent, context: LambdaContext) => Promise<TResult>","options: Partial<LambdaAdapterConfig>","event: TEvent","headers: Record<string, string | undefined>","normalized: Record<string, string>","body: string | null | undefined","isBase64Encoded?: boolean"],"sources":["../../src/adapters/lambda.ts"],"sourcesContent":["import type { Context as LambdaContext } from 'aws-lambda';\nimport { nanoid } from 'nanoid';\nimport { flushTelemetry } from '../instrumentation/core';\nimport type { Telescope } from '../Telescope';\nimport type {\n\tAdapterRequestContext,\n\tAdapterResponseContext,\n\tLambdaAdapterConfig,\n\tTelescopeAdapter,\n} from './types';\n\n// Re-export Middy middleware for convenience\nexport {\n\tcreateTelescopeHandler,\n\ttype TelescopeMiddlewareOptions,\n\ttelescopeMiddleware,\n} from './middy';\n\n/**\n * Lambda resource attributes detected from environment\n */\nexport interface LambdaResourceAttributes {\n\t'cloud.provider': 'aws';\n\t'cloud.region': string;\n\t'faas.name': string;\n\t'faas.version': string;\n\t'faas.instance': string;\n\t'faas.max_memory': number;\n\t[key: string]: string | number;\n}\n\n/**\n * Detect Lambda resource attributes from environment\n */\nexport function detectLambdaResources(): LambdaResourceAttributes {\n\treturn {\n\t\t'cloud.provider': 'aws',\n\t\t'cloud.region': process.env.AWS_REGION || 'unknown',\n\t\t'faas.name': process.env.AWS_LAMBDA_FUNCTION_NAME || 'unknown',\n\t\t'faas.version': process.env.AWS_LAMBDA_FUNCTION_VERSION || 'unknown',\n\t\t'faas.instance': process.env.AWS_LAMBDA_LOG_STREAM_NAME || 'unknown',\n\t\t'faas.max_memory': parseInt(\n\t\t\tprocess.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || '128',\n\t\t\t10,\n\t\t),\n\t};\n}\n\n/**\n * Extract invocation context from Lambda event\n */\nexport function extractLambdaInvocationContext(\n\t_event: unknown,\n\tcontext: LambdaContext,\n): {\n\trequestId: string;\n\tcoldStart: boolean;\n\tremainingTimeMs: number;\n\tmemoryLimitMB: number;\n\tfunctionName: string;\n\tfunctionVersion: string;\n} {\n\treturn {\n\t\trequestId: context.awsRequestId,\n\t\tcoldStart: !globalLambdaState.initialized,\n\t\tremainingTimeMs: context.getRemainingTimeInMillis(),\n\t\tmemoryLimitMB: parseInt(String(context.memoryLimitInMB), 10),\n\t\tfunctionName: context.functionName,\n\t\tfunctionVersion: context.functionVersion,\n\t};\n}\n\n/**\n * Global state to track Lambda cold starts\n */\nconst globalLambdaState = {\n\tinitialized: false,\n};\n\n/**\n * Default Lambda adapter configuration\n */\nconst DEFAULT_LAMBDA_CONFIG: LambdaAdapterConfig = {\n\tenvironment: 'lambda',\n\tspanProcessor: {\n\t\tstrategy: 'simple', // Always use simple for Lambda\n\t},\n\tautoFlush: true,\n\tdetectResource: true,\n};\n\n/**\n * Lambda adapter for Telescope.\n * Provides Lambda-specific request/response handling with auto-flush.\n */\nexport class LambdaAdapter implements TelescopeAdapter<LambdaAdapterConfig> {\n\treadonly config: LambdaAdapterConfig;\n\treadonly telescope: Telescope;\n\tprivate resourceAttributes: LambdaResourceAttributes | null = null;\n\n\tconstructor(telescope: Telescope, config: Partial<LambdaAdapterConfig> = {}) {\n\t\tthis.telescope = telescope;\n\t\tthis.config = { ...DEFAULT_LAMBDA_CONFIG, ...config };\n\t}\n\n\tasync onSetup(): Promise<void> {\n\t\tif (this.config.detectResource) {\n\t\t\tthis.resourceAttributes = detectLambdaResources();\n\t\t}\n\t\tglobalLambdaState.initialized = true;\n\t}\n\n\tasync onDestroy(): Promise<void> {\n\t\tawait flushTelemetry();\n\t}\n\n\t/**\n\t * Extract request context from API Gateway event\n\t */\n\textractRequestContext(event: unknown): AdapterRequestContext {\n\t\t// Handle API Gateway v1 (REST API)\n\t\tif (isApiGatewayV1Event(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: event.requestContext?.requestId || nanoid(),\n\t\t\t\tmethod: event.httpMethod || 'UNKNOWN',\n\t\t\t\tpath: event.path || '/',\n\t\t\t\turl: event.path || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip:\n\t\t\t\t\tevent.requestContext?.identity?.sourceIp ||\n\t\t\t\t\tevent.headers?.['X-Forwarded-For']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Handle API Gateway v2 (HTTP API)\n\t\tif (isApiGatewayV2Event(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: event.requestContext?.requestId || nanoid(),\n\t\t\t\tmethod: event.requestContext?.http?.method || 'UNKNOWN',\n\t\t\t\tpath: event.rawPath || '/',\n\t\t\t\turl: event.rawPath || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip:\n\t\t\t\t\tevent.requestContext?.http?.sourceIp ||\n\t\t\t\t\tevent.headers?.['x-forwarded-for']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Handle ALB event\n\t\tif (isAlbEvent(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: nanoid(),\n\t\t\t\tmethod: event.httpMethod || 'UNKNOWN',\n\t\t\t\tpath: event.path || '/',\n\t\t\t\turl: event.path || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip: event.headers?.['x-forwarded-for']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Generic Lambda invocation (not HTTP)\n\t\treturn {\n\t\t\tid: nanoid(),\n\t\t\tmethod: 'INVOKE',\n\t\t\tpath: '/',\n\t\t\turl: '/',\n\t\t\theaders: {},\n\t\t\tquery: {},\n\t\t\tbody: event,\n\t\t\tstartTime: Date.now(),\n\t\t};\n\t}\n\n\t/**\n\t * Extract response context from Lambda response\n\t */\n\textractResponseContext(\n\t\tresponse: unknown,\n\t\tstartTime: number,\n\t): AdapterResponseContext {\n\t\tconst duration = Date.now() - startTime;\n\n\t\t// API Gateway response format\n\t\tif (isApiGatewayResponse(response)) {\n\t\t\tconst headers = normalizeHeaders(response.headers || {});\n\t\t\t// Prefer Content-Length header, fallback to body size\n\t\t\tconst responseSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: typeof response.body === 'string'\n\t\t\t\t\t? Buffer.byteLength(response.body, 'utf8')\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tstatus: response.statusCode || 200,\n\t\t\t\theaders,\n\t\t\t\tbody: response.body,\n\t\t\t\tduration,\n\t\t\t\tresponseSize,\n\t\t\t};\n\t\t}\n\n\t\t// Generic response\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\theaders: {},\n\t\t\tbody: response,\n\t\t\tduration,\n\t\t};\n\t}\n\n\t/**\n\t * Flush telemetry data before Lambda context freezes\n\t */\n\tasync flush(): Promise<void> {\n\t\tawait flushTelemetry();\n\t}\n\n\t/**\n\t * Get resource attributes for the Lambda function\n\t */\n\tgetResourceAttributes(): LambdaResourceAttributes | null {\n\t\treturn this.resourceAttributes;\n\t}\n}\n\n/**\n * Wrap a Lambda handler to automatically record requests and flush telemetry.\n *\n * @example\n * ```typescript\n * import { wrapLambdaHandler } from '@geekmidas/telescope/adapters/lambda';\n *\n * const telescope = new Telescope({ storage: new InMemoryStorage() });\n *\n * export const handler = wrapLambdaHandler(telescope, async (event, context) => {\n * // Your Lambda logic here\n * return { statusCode: 200, body: JSON.stringify({ success: true }) };\n * });\n * ```\n */\nexport function wrapLambdaHandler<TEvent, TResult>(\n\ttelescope: Telescope,\n\thandler: (event: TEvent, context: LambdaContext) => Promise<TResult>,\n\toptions: Partial<LambdaAdapterConfig> = {},\n): (event: TEvent, context: LambdaContext) => Promise<TResult> {\n\tconst adapter = new LambdaAdapter(telescope, options);\n\n\treturn async (event: TEvent, context: LambdaContext): Promise<TResult> => {\n\t\tconst requestContext = adapter.extractRequestContext(event);\n\n\t\ttry {\n\t\t\tconst result = await handler(event, context);\n\n\t\t\t// Record the request\n\t\t\tconst responseContext = adapter.extractResponseContext(\n\t\t\t\tresult,\n\t\t\t\trequestContext.startTime,\n\t\t\t);\n\n\t\t\tawait telescope.recordRequest({\n\t\t\t\tmethod: requestContext.method,\n\t\t\t\tpath: requestContext.path,\n\t\t\t\turl: requestContext.url,\n\t\t\t\theaders: requestContext.headers,\n\t\t\t\tquery: requestContext.query,\n\t\t\t\tbody: requestContext.body,\n\t\t\t\tip: requestContext.ip,\n\t\t\t\tstatus: responseContext.status,\n\t\t\t\tresponseHeaders: responseContext.headers,\n\t\t\t\tresponseBody: responseContext.body,\n\t\t\t\tduration: responseContext.duration,\n\t\t\t\trequestSize: requestContext.requestSize,\n\t\t\t\tresponseSize: responseContext.responseSize,\n\t\t\t});\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Record the exception\n\t\t\tif (error instanceof Error) {\n\t\t\t\tawait telescope.exception(error, requestContext.id);\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// Always flush before Lambda freezes\n\t\t\tif (options.autoFlush !== false) {\n\t\t\t\tawait adapter.flush();\n\t\t\t}\n\t\t}\n\t};\n}\n\n// ============================================\n// Type Guards and Helpers\n// ============================================\n\ninterface ApiGatewayV1Event {\n\thttpMethod?: string;\n\tpath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n\trequestContext?: {\n\t\trequestId?: string;\n\t\tidentity?: {\n\t\t\tsourceIp?: string;\n\t\t};\n\t};\n}\n\ninterface ApiGatewayV2Event {\n\trawPath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n\trequestContext?: {\n\t\trequestId?: string;\n\t\thttp?: {\n\t\t\tmethod?: string;\n\t\t\tsourceIp?: string;\n\t\t};\n\t};\n}\n\ninterface AlbEvent {\n\thttpMethod?: string;\n\tpath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n}\n\ninterface ApiGatewayResponse {\n\tstatusCode?: number;\n\theaders?: Record<string, string | undefined>;\n\tbody?: unknown;\n}\n\nfunction isApiGatewayV1Event(event: unknown): event is ApiGatewayV1Event {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'httpMethod' in event &&\n\t\t'path' in event\n\t);\n}\n\nfunction isApiGatewayV2Event(event: unknown): event is ApiGatewayV2Event {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'rawPath' in event &&\n\t\t'requestContext' in event &&\n\t\ttypeof (event as ApiGatewayV2Event).requestContext === 'object' &&\n\t\t'http' in ((event as ApiGatewayV2Event).requestContext || {})\n\t);\n}\n\nfunction isAlbEvent(event: unknown): event is AlbEvent {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'httpMethod' in event &&\n\t\t!('requestContext' in event)\n\t);\n}\n\nfunction isApiGatewayResponse(\n\tresponse: unknown,\n): response is ApiGatewayResponse {\n\treturn (\n\t\ttypeof response === 'object' &&\n\t\tresponse !== null &&\n\t\t'statusCode' in response\n\t);\n}\n\nfunction normalizeHeaders(\n\theaders: Record<string, string | undefined>,\n): Record<string, string> {\n\tconst normalized: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value !== undefined) {\n\t\t\tnormalized[key.toLowerCase()] = value;\n\t\t}\n\t}\n\treturn normalized;\n}\n\nfunction parseBody(\n\tbody: string | null | undefined,\n\tisBase64Encoded?: boolean,\n): unknown {\n\tif (!body) return undefined;\n\n\ttry {\n\t\tconst decoded = isBase64Encoded\n\t\t\t? Buffer.from(body, 'base64').toString('utf-8')\n\t\t\t: body;\n\n\t\t// Try to parse as JSON\n\t\treturn JSON.parse(decoded);\n\t} catch {\n\t\t// Return raw string if not JSON\n\t\treturn body;\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lambda.cjs","names":["flushTelemetry"],"sources":["../../src/adapters/lambda.ts"],"sourcesContent":["import type { Context as LambdaContext } from 'aws-lambda';\nimport { nanoid } from 'nanoid';\nimport { flushTelemetry } from '../instrumentation/core';\nimport type { Telescope } from '../Telescope';\nimport type {\n\tAdapterRequestContext,\n\tAdapterResponseContext,\n\tLambdaAdapterConfig,\n\tTelescopeAdapter,\n} from './types';\n\n// Re-export Middy middleware for convenience\nexport {\n\tcreateTelescopeHandler,\n\ttype TelescopeMiddlewareOptions,\n\ttelescopeMiddleware,\n} from './middy';\n\n/**\n * Lambda resource attributes detected from environment\n */\nexport interface LambdaResourceAttributes {\n\t'cloud.provider': 'aws';\n\t'cloud.region': string;\n\t'faas.name': string;\n\t'faas.version': string;\n\t'faas.instance': string;\n\t'faas.max_memory': number;\n\t[key: string]: string | number;\n}\n\n/**\n * Detect Lambda resource attributes from environment\n */\nexport function detectLambdaResources(): LambdaResourceAttributes {\n\treturn {\n\t\t'cloud.provider': 'aws',\n\t\t'cloud.region': process.env.AWS_REGION || 'unknown',\n\t\t'faas.name': process.env.AWS_LAMBDA_FUNCTION_NAME || 'unknown',\n\t\t'faas.version': process.env.AWS_LAMBDA_FUNCTION_VERSION || 'unknown',\n\t\t'faas.instance': process.env.AWS_LAMBDA_LOG_STREAM_NAME || 'unknown',\n\t\t'faas.max_memory': parseInt(\n\t\t\tprocess.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || '128',\n\t\t\t10,\n\t\t),\n\t};\n}\n\n/**\n * Extract invocation context from Lambda event\n */\nexport function extractLambdaInvocationContext(\n\t_event: unknown,\n\tcontext: LambdaContext,\n): {\n\trequestId: string;\n\tcoldStart: boolean;\n\tremainingTimeMs: number;\n\tmemoryLimitMB: number;\n\tfunctionName: string;\n\tfunctionVersion: string;\n} {\n\treturn {\n\t\trequestId: context.awsRequestId,\n\t\tcoldStart: !globalLambdaState.initialized,\n\t\tremainingTimeMs: context.getRemainingTimeInMillis(),\n\t\tmemoryLimitMB: parseInt(String(context.memoryLimitInMB), 10),\n\t\tfunctionName: context.functionName,\n\t\tfunctionVersion: context.functionVersion,\n\t};\n}\n\n/**\n * Global state to track Lambda cold starts\n */\nconst globalLambdaState = {\n\tinitialized: false,\n};\n\n/**\n * Default Lambda adapter configuration\n */\nconst DEFAULT_LAMBDA_CONFIG: LambdaAdapterConfig = {\n\tenvironment: 'lambda',\n\tspanProcessor: {\n\t\tstrategy: 'simple', // Always use simple for Lambda\n\t},\n\tautoFlush: true,\n\tdetectResource: true,\n};\n\n/**\n * Lambda adapter for Telescope.\n * Provides Lambda-specific request/response handling with auto-flush.\n */\nexport class LambdaAdapter implements TelescopeAdapter<LambdaAdapterConfig> {\n\treadonly config: LambdaAdapterConfig;\n\treadonly telescope: Telescope;\n\tprivate resourceAttributes: LambdaResourceAttributes | null = null;\n\n\tconstructor(telescope: Telescope, config: Partial<LambdaAdapterConfig> = {}) {\n\t\tthis.telescope = telescope;\n\t\tthis.config = { ...DEFAULT_LAMBDA_CONFIG, ...config };\n\t}\n\n\tasync onSetup(): Promise<void> {\n\t\tif (this.config.detectResource) {\n\t\t\tthis.resourceAttributes = detectLambdaResources();\n\t\t}\n\t\tglobalLambdaState.initialized = true;\n\t}\n\n\tasync onDestroy(): Promise<void> {\n\t\tawait flushTelemetry();\n\t}\n\n\t/**\n\t * Extract request context from API Gateway event\n\t */\n\textractRequestContext(event: unknown): AdapterRequestContext {\n\t\t// Handle API Gateway v1 (REST API)\n\t\tif (isApiGatewayV1Event(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: event.requestContext?.requestId || nanoid(),\n\t\t\t\tmethod: event.httpMethod || 'UNKNOWN',\n\t\t\t\tpath: event.path || '/',\n\t\t\t\turl: event.path || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip:\n\t\t\t\t\tevent.requestContext?.identity?.sourceIp ||\n\t\t\t\t\tevent.headers?.['X-Forwarded-For']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Handle API Gateway v2 (HTTP API)\n\t\tif (isApiGatewayV2Event(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: event.requestContext?.requestId || nanoid(),\n\t\t\t\tmethod: event.requestContext?.http?.method || 'UNKNOWN',\n\t\t\t\tpath: event.rawPath || '/',\n\t\t\t\turl: event.rawPath || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip:\n\t\t\t\t\tevent.requestContext?.http?.sourceIp ||\n\t\t\t\t\tevent.headers?.['x-forwarded-for']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Handle ALB event\n\t\tif (isAlbEvent(event)) {\n\t\t\tconst headers = normalizeHeaders(event.headers || {});\n\t\t\tconst requestSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tid: nanoid(),\n\t\t\t\tmethod: event.httpMethod || 'UNKNOWN',\n\t\t\t\tpath: event.path || '/',\n\t\t\t\turl: event.path || '/',\n\t\t\t\theaders,\n\t\t\t\tquery: event.queryStringParameters || {},\n\t\t\t\tbody: parseBody(event.body, event.isBase64Encoded),\n\t\t\t\tip: event.headers?.['x-forwarded-for']?.split(',')[0],\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\trequestSize,\n\t\t\t};\n\t\t}\n\n\t\t// Generic Lambda invocation (not HTTP)\n\t\treturn {\n\t\t\tid: nanoid(),\n\t\t\tmethod: 'INVOKE',\n\t\t\tpath: '/',\n\t\t\turl: '/',\n\t\t\theaders: {},\n\t\t\tquery: {},\n\t\t\tbody: event,\n\t\t\tstartTime: Date.now(),\n\t\t};\n\t}\n\n\t/**\n\t * Extract response context from Lambda response\n\t */\n\textractResponseContext(\n\t\tresponse: unknown,\n\t\tstartTime: number,\n\t): AdapterResponseContext {\n\t\tconst duration = Date.now() - startTime;\n\n\t\t// API Gateway response format\n\t\tif (isApiGatewayResponse(response)) {\n\t\t\tconst headers = normalizeHeaders(response.headers || {});\n\t\t\t// Prefer Content-Length header, fallback to body size\n\t\t\tconst responseSize = headers['content-length']\n\t\t\t\t? parseInt(headers['content-length'], 10)\n\t\t\t\t: typeof response.body === 'string'\n\t\t\t\t\t? Buffer.byteLength(response.body, 'utf8')\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tstatus: response.statusCode || 200,\n\t\t\t\theaders,\n\t\t\t\tbody: response.body,\n\t\t\t\tduration,\n\t\t\t\tresponseSize,\n\t\t\t};\n\t\t}\n\n\t\t// Generic response\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\theaders: {},\n\t\t\tbody: response,\n\t\t\tduration,\n\t\t};\n\t}\n\n\t/**\n\t * Flush telemetry data before Lambda context freezes\n\t */\n\tasync flush(): Promise<void> {\n\t\tawait flushTelemetry();\n\t}\n\n\t/**\n\t * Get resource attributes for the Lambda function\n\t */\n\tgetResourceAttributes(): LambdaResourceAttributes | null {\n\t\treturn this.resourceAttributes;\n\t}\n}\n\n/**\n * Wrap a Lambda handler to automatically record requests and flush telemetry.\n *\n * @example\n * ```typescript\n * import { wrapLambdaHandler } from '@geekmidas/telescope/adapters/lambda';\n *\n * const telescope = new Telescope({ storage: new InMemoryStorage() });\n *\n * export const handler = wrapLambdaHandler(telescope, async (event, context) => {\n * // Your Lambda logic here\n * return { statusCode: 200, body: JSON.stringify({ success: true }) };\n * });\n * ```\n */\nexport function wrapLambdaHandler<TEvent, TResult>(\n\ttelescope: Telescope,\n\thandler: (event: TEvent, context: LambdaContext) => Promise<TResult>,\n\toptions: Partial<LambdaAdapterConfig> = {},\n): (event: TEvent, context: LambdaContext) => Promise<TResult> {\n\tconst adapter = new LambdaAdapter(telescope, options);\n\n\treturn async (event: TEvent, context: LambdaContext): Promise<TResult> => {\n\t\tconst requestContext = adapter.extractRequestContext(event);\n\n\t\ttry {\n\t\t\tconst result = await handler(event, context);\n\n\t\t\t// Record the request\n\t\t\tconst responseContext = adapter.extractResponseContext(\n\t\t\t\tresult,\n\t\t\t\trequestContext.startTime,\n\t\t\t);\n\n\t\t\tawait telescope.recordRequest({\n\t\t\t\tmethod: requestContext.method,\n\t\t\t\tpath: requestContext.path,\n\t\t\t\turl: requestContext.url,\n\t\t\t\theaders: requestContext.headers,\n\t\t\t\tquery: requestContext.query,\n\t\t\t\tbody: requestContext.body,\n\t\t\t\tip: requestContext.ip,\n\t\t\t\tstatus: responseContext.status,\n\t\t\t\tresponseHeaders: responseContext.headers,\n\t\t\t\tresponseBody: responseContext.body,\n\t\t\t\tduration: responseContext.duration,\n\t\t\t\trequestSize: requestContext.requestSize,\n\t\t\t\tresponseSize: responseContext.responseSize,\n\t\t\t});\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Record the exception\n\t\t\tif (error instanceof Error) {\n\t\t\t\tawait telescope.exception(error, requestContext.id);\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// Always flush before Lambda freezes\n\t\t\tif (options.autoFlush !== false) {\n\t\t\t\tawait adapter.flush();\n\t\t\t}\n\t\t}\n\t};\n}\n\n// ============================================\n// Type Guards and Helpers\n// ============================================\n\ninterface ApiGatewayV1Event {\n\thttpMethod?: string;\n\tpath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n\trequestContext?: {\n\t\trequestId?: string;\n\t\tidentity?: {\n\t\t\tsourceIp?: string;\n\t\t};\n\t};\n}\n\ninterface ApiGatewayV2Event {\n\trawPath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n\trequestContext?: {\n\t\trequestId?: string;\n\t\thttp?: {\n\t\t\tmethod?: string;\n\t\t\tsourceIp?: string;\n\t\t};\n\t};\n}\n\ninterface AlbEvent {\n\thttpMethod?: string;\n\tpath?: string;\n\theaders?: Record<string, string | undefined>;\n\tqueryStringParameters?: Record<string, string>;\n\tbody?: string | null;\n\tisBase64Encoded?: boolean;\n}\n\ninterface ApiGatewayResponse {\n\tstatusCode?: number;\n\theaders?: Record<string, string | undefined>;\n\tbody?: unknown;\n}\n\nfunction isApiGatewayV1Event(event: unknown): event is ApiGatewayV1Event {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'httpMethod' in event &&\n\t\t'path' in event\n\t);\n}\n\nfunction isApiGatewayV2Event(event: unknown): event is ApiGatewayV2Event {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'rawPath' in event &&\n\t\t'requestContext' in event &&\n\t\ttypeof (event as ApiGatewayV2Event).requestContext === 'object' &&\n\t\t'http' in ((event as ApiGatewayV2Event).requestContext || {})\n\t);\n}\n\nfunction isAlbEvent(event: unknown): event is AlbEvent {\n\treturn (\n\t\ttypeof event === 'object' &&\n\t\tevent !== null &&\n\t\t'httpMethod' in event &&\n\t\t!('requestContext' in event)\n\t);\n}\n\nfunction isApiGatewayResponse(\n\tresponse: unknown,\n): response is ApiGatewayResponse {\n\treturn (\n\t\ttypeof response === 'object' &&\n\t\tresponse !== null &&\n\t\t'statusCode' in response\n\t);\n}\n\nfunction normalizeHeaders(\n\theaders: Record<string, string | undefined>,\n): Record<string, string> {\n\tconst normalized: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value !== undefined) {\n\t\t\tnormalized[key.toLowerCase()] = value;\n\t\t}\n\t}\n\treturn normalized;\n}\n\nfunction parseBody(\n\tbody: string | null | undefined,\n\tisBase64Encoded?: boolean,\n): unknown {\n\tif (!body) return undefined;\n\n\ttry {\n\t\tconst decoded = isBase64Encoded\n\t\t\t? Buffer.from(body, 'base64').toString('utf-8')\n\t\t\t: body;\n\n\t\t// Try to parse as JSON\n\t\treturn JSON.parse(decoded);\n\t} catch {\n\t\t// Return raw string if not JSON\n\t\treturn body;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "
|
|
3
|
-
import {
|
|
4
|
-
import { AdapterRequestContext, AdapterResponseContext, LambdaAdapterConfig, TelescopeAdapter } from "../types-BRzW1NM8.cjs";
|
|
5
|
-
import { TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware } from "../middy-Bq0defVg.cjs";
|
|
1
|
+
import { t as Telescope } from "../Telescope-DeqSHfuB.cjs";
|
|
2
|
+
import { AdapterRequestContext, AdapterResponseContext, LambdaAdapterConfig, TelescopeAdapter } from "./types.cjs";
|
|
3
|
+
import { TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware } from "./middy.cjs";
|
|
6
4
|
import { Context } from "aws-lambda";
|
|
7
|
-
|
|
8
5
|
//#region src/adapters/lambda.d.ts
|
|
9
6
|
/**
|
|
10
7
|
* Lambda resource attributes detected from environment
|
|
11
8
|
*/
|
|
12
|
-
interface LambdaResourceAttributes {
|
|
9
|
+
export interface LambdaResourceAttributes {
|
|
13
10
|
'cloud.provider': 'aws';
|
|
14
11
|
'cloud.region': string;
|
|
15
12
|
'faas.name': string;
|
|
@@ -21,11 +18,11 @@ interface LambdaResourceAttributes {
|
|
|
21
18
|
/**
|
|
22
19
|
* Detect Lambda resource attributes from environment
|
|
23
20
|
*/
|
|
24
|
-
declare function detectLambdaResources(): LambdaResourceAttributes;
|
|
21
|
+
export declare function detectLambdaResources(): LambdaResourceAttributes;
|
|
25
22
|
/**
|
|
26
23
|
* Extract invocation context from Lambda event
|
|
27
24
|
*/
|
|
28
|
-
declare function extractLambdaInvocationContext(_event: unknown, context: Context): {
|
|
25
|
+
export declare function extractLambdaInvocationContext(_event: unknown, context: Context): {
|
|
29
26
|
requestId: string;
|
|
30
27
|
coldStart: boolean;
|
|
31
28
|
remainingTimeMs: number;
|
|
@@ -37,7 +34,7 @@ declare function extractLambdaInvocationContext(_event: unknown, context: Contex
|
|
|
37
34
|
* Lambda adapter for Telescope.
|
|
38
35
|
* Provides Lambda-specific request/response handling with auto-flush.
|
|
39
36
|
*/
|
|
40
|
-
declare class LambdaAdapter implements TelescopeAdapter<LambdaAdapterConfig> {
|
|
37
|
+
export declare class LambdaAdapter implements TelescopeAdapter<LambdaAdapterConfig> {
|
|
41
38
|
readonly config: LambdaAdapterConfig;
|
|
42
39
|
readonly telescope: Telescope;
|
|
43
40
|
private resourceAttributes;
|
|
@@ -76,8 +73,7 @@ declare class LambdaAdapter implements TelescopeAdapter<LambdaAdapterConfig> {
|
|
|
76
73
|
* });
|
|
77
74
|
* ```
|
|
78
75
|
*/
|
|
79
|
-
declare function wrapLambdaHandler<TEvent, TResult>(telescope: Telescope, handler: (event: TEvent, context: Context) => Promise<TResult>, options?: Partial<LambdaAdapterConfig>): (event: TEvent, context: Context) => Promise<TResult>;
|
|
80
|
-
//# sourceMappingURL=lambda.d.ts.map
|
|
76
|
+
export declare function wrapLambdaHandler<TEvent, TResult>(telescope: Telescope, handler: (event: TEvent, context: Context) => Promise<TResult>, options?: Partial<LambdaAdapterConfig>): (event: TEvent, context: Context) => Promise<TResult>;
|
|
81
77
|
//#endregion
|
|
82
|
-
export {
|
|
78
|
+
export { type TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware };
|
|
83
79
|
//# sourceMappingURL=lambda.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.d.cts","names":[],"sources":["../../src/adapters/lambda.ts"],"
|
|
1
|
+
{"version":3,"file":"lambda.d.cts","names":["LambdaContext"],"sources":["../../src/adapters/lambda.ts"],"mappings":";;;;;;;;iBAqBiB;EAChB;EACA;EACA;EACA;EACA;EACA;GACC;;;;;wBAMc,yBAAyB;;;;wBAiBzB,+BACf,iBACA,SAASA;EAET;EACA;EACA;EACA;EACA;EACA;;;;;;qBAmCY,yBAAyB,iBAAiB;WAC7C,QAAQ;WACR,WAAW;UACZ;EAER,YAAY,WAAW,WAAW,SAAQ,QAAQ;EAK5C,WAAW;EAOX,aAAa;;;;EAOnB,sBAAsB,iBAAiB;;;;EAiFvC,uBACC,mBACA,oBACE;;;;EAiCG,SAAS;;;;EAOf,yBAAyB;;;;;;;;;;;;;;;;;wBAoBV,kBAAkB,QAAQ,SACzC,WAAW,WACX,UAAU,OAAO,QAAQ,SAASA,YAAkB,QAAQ,UAC5D,UAAS,QAAQ,wBACd,OAAO,QAAQ,SAASA,YAAkB,QAAQ"}
|