@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
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "
|
|
3
|
-
import {
|
|
4
|
-
import { AdapterRequestContext, AdapterResponseContext, LambdaAdapterConfig, TelescopeAdapter } from "../types-BzQ78Efw.mjs";
|
|
5
|
-
import { TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware } from "../middy-B6Btl8XE.mjs";
|
|
1
|
+
import { t as Telescope } from "../Telescope-BcrWTaar.mjs";
|
|
2
|
+
import { AdapterRequestContext, AdapterResponseContext, LambdaAdapterConfig, TelescopeAdapter } from "./types.mjs";
|
|
3
|
+
import { TelescopeMiddlewareOptions, createTelescopeHandler, telescopeMiddleware } from "./middy.mjs";
|
|
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.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.d.mts","names":[],"sources":["../../src/adapters/lambda.ts"],"
|
|
1
|
+
{"version":3,"file":"lambda.d.mts","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"}
|
package/dist/adapters/lambda.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { flushTelemetry } from "../core
|
|
2
|
-
import { createTelescopeHandler, telescopeMiddleware } from "
|
|
1
|
+
import { flushTelemetry } from "../instrumentation/core.mjs";
|
|
2
|
+
import { createTelescopeHandler, telescopeMiddleware } from "./middy.mjs";
|
|
3
3
|
import { nanoid } from "nanoid";
|
|
4
|
-
|
|
5
4
|
//#region src/adapters/lambda.ts
|
|
6
5
|
/**
|
|
7
6
|
* Detect Lambda resource attributes from environment
|
|
@@ -235,7 +234,7 @@ function parseBody(body, isBase64Encoded) {
|
|
|
235
234
|
return body;
|
|
236
235
|
}
|
|
237
236
|
}
|
|
238
|
-
|
|
239
237
|
//#endregion
|
|
240
238
|
export { LambdaAdapter, createTelescopeHandler, detectLambdaResources, extractLambdaInvocationContext, telescopeMiddleware, wrapLambdaHandler };
|
|
239
|
+
|
|
241
240
|
//# sourceMappingURL=lambda.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.mjs","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.mjs","names":[],"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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"}
|
package/dist/adapters/middy.cjs
CHANGED
|
@@ -1,5 +1,237 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_instrumentation_core = require("../instrumentation/core.cjs");
|
|
3
|
+
//#region src/adapters/middy.ts
|
|
4
|
+
let processHooksRegistered = false;
|
|
5
|
+
/**
|
|
6
|
+
* Register process-level hooks for telemetry flush.
|
|
7
|
+
* Called once per Lambda cold start.
|
|
8
|
+
*/
|
|
9
|
+
function registerProcessHooks() {
|
|
10
|
+
if (processHooksRegistered) return;
|
|
11
|
+
processHooksRegistered = true;
|
|
12
|
+
process.on("SIGTERM", async () => {
|
|
13
|
+
await require_instrumentation_core.flushTelemetry(5e3).catch(() => {});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract request data from API Gateway event (v1 or v2)
|
|
18
|
+
*/
|
|
19
|
+
function extractRequestData(event) {
|
|
20
|
+
const headers = {};
|
|
21
|
+
if (event.headers) {
|
|
22
|
+
for (const [key, value] of Object.entries(event.headers)) if (value) headers[key.toLowerCase()] = value;
|
|
23
|
+
}
|
|
24
|
+
const contentLength = headers["content-length"];
|
|
25
|
+
const requestSize = contentLength ? parseInt(contentLength, 10) : void 0;
|
|
26
|
+
if ("rawPath" in event && event.requestContext?.http) {
|
|
27
|
+
const v2Event = event;
|
|
28
|
+
const query = {};
|
|
29
|
+
if (v2Event.queryStringParameters) {
|
|
30
|
+
for (const [key, value] of Object.entries(v2Event.queryStringParameters)) if (value !== void 0) query[key] = value;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
method: v2Event.requestContext.http.method,
|
|
34
|
+
path: v2Event.rawPath,
|
|
35
|
+
url: v2Event.rawPath + (v2Event.rawQueryString ? `?${v2Event.rawQueryString}` : ""),
|
|
36
|
+
headers,
|
|
37
|
+
query,
|
|
38
|
+
body: parseBody(v2Event.body, v2Event.isBase64Encoded),
|
|
39
|
+
ip: v2Event.requestContext.http.sourceIp,
|
|
40
|
+
requestId: v2Event.requestContext.requestId,
|
|
41
|
+
requestSize
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const v1Event = event;
|
|
45
|
+
const queryString = v1Event.queryStringParameters ? new URLSearchParams(v1Event.queryStringParameters).toString() : "";
|
|
46
|
+
return {
|
|
47
|
+
method: v1Event.httpMethod,
|
|
48
|
+
path: v1Event.path,
|
|
49
|
+
url: v1Event.path + (queryString ? `?${queryString}` : ""),
|
|
50
|
+
headers,
|
|
51
|
+
query: v1Event.queryStringParameters || {},
|
|
52
|
+
body: parseBody(v1Event.body, v1Event.isBase64Encoded),
|
|
53
|
+
ip: v1Event.requestContext?.identity?.sourceIp,
|
|
54
|
+
requestId: v1Event.requestContext?.requestId,
|
|
55
|
+
requestSize
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse request body
|
|
60
|
+
*/
|
|
61
|
+
function parseBody(body, isBase64Encoded) {
|
|
62
|
+
if (!body) return void 0;
|
|
63
|
+
try {
|
|
64
|
+
const decoded = isBase64Encoded ? Buffer.from(body, "base64").toString("utf-8") : body;
|
|
65
|
+
return JSON.parse(decoded);
|
|
66
|
+
} catch {
|
|
67
|
+
return body;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract response data from Lambda response
|
|
72
|
+
*/
|
|
73
|
+
function extractResponseData(response) {
|
|
74
|
+
if (response && typeof response === "object" && "statusCode" in response) {
|
|
75
|
+
const res = response;
|
|
76
|
+
const headers = res.headers || {};
|
|
77
|
+
const contentLengthKey = Object.keys(headers).find((k) => k.toLowerCase() === "content-length");
|
|
78
|
+
const contentLengthValue = contentLengthKey ? headers[contentLengthKey] : void 0;
|
|
79
|
+
const responseSize = contentLengthValue ? parseInt(contentLengthValue, 10) : res.body ? Buffer.byteLength(res.body, "utf8") : void 0;
|
|
80
|
+
return {
|
|
81
|
+
status: res.statusCode || 200,
|
|
82
|
+
headers,
|
|
83
|
+
body: res.body ? tryParseJson(res.body) : void 0,
|
|
84
|
+
responseSize
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
status: 200,
|
|
89
|
+
headers: {},
|
|
90
|
+
body: response
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function tryParseJson(str) {
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(str);
|
|
96
|
+
} catch {
|
|
97
|
+
return str;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Middy middleware that integrates Telescope with Lambda handlers.
|
|
102
|
+
*
|
|
103
|
+
* Features:
|
|
104
|
+
* - Records all requests and responses to Telescope
|
|
105
|
+
* - Captures exceptions automatically
|
|
106
|
+
* - Flushes telemetry before Lambda freezes
|
|
107
|
+
* - Uses Lambda context for smart flush timing
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* import middy from '@middy/core';
|
|
112
|
+
* import { telescopeMiddleware } from '@geekmidas/telescope/lambda';
|
|
113
|
+
*
|
|
114
|
+
* const handler = middy(baseHandler)
|
|
115
|
+
* .use(telescopeMiddleware(telescope));
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
function telescopeMiddleware(telescope, options = {}) {
|
|
119
|
+
const { flushThresholdMs = 1e3, recordBody = true, flushTimeoutMs = 5e3 } = options;
|
|
120
|
+
registerProcessHooks();
|
|
121
|
+
return {
|
|
122
|
+
before: async (request) => {
|
|
123
|
+
request.__telescopeStartTime = Date.now();
|
|
124
|
+
request.context.callbackWaitsForEmptyEventLoop = false;
|
|
125
|
+
},
|
|
126
|
+
after: async (request) => {
|
|
127
|
+
const startTime = request.__telescopeStartTime || Date.now();
|
|
128
|
+
const duration = Date.now() - startTime;
|
|
129
|
+
try {
|
|
130
|
+
const reqData = extractRequestData(request.event);
|
|
131
|
+
const resData = extractResponseData(request.response);
|
|
132
|
+
await telescope.recordRequest({
|
|
133
|
+
method: reqData.method,
|
|
134
|
+
path: reqData.path,
|
|
135
|
+
url: reqData.url,
|
|
136
|
+
headers: reqData.headers,
|
|
137
|
+
query: reqData.query,
|
|
138
|
+
body: recordBody ? reqData.body : void 0,
|
|
139
|
+
ip: reqData.ip,
|
|
140
|
+
status: resData.status,
|
|
141
|
+
responseHeaders: resData.headers,
|
|
142
|
+
responseBody: recordBody ? resData.body : void 0,
|
|
143
|
+
duration,
|
|
144
|
+
requestSize: reqData.requestSize,
|
|
145
|
+
responseSize: resData.responseSize
|
|
146
|
+
});
|
|
147
|
+
} catch {}
|
|
148
|
+
await smartFlush(request.context, flushThresholdMs, flushTimeoutMs);
|
|
149
|
+
},
|
|
150
|
+
onError: async (request) => {
|
|
151
|
+
const startTime = request.__telescopeStartTime || Date.now();
|
|
152
|
+
const duration = Date.now() - startTime;
|
|
153
|
+
try {
|
|
154
|
+
if (request.error) await telescope.exception(request.error);
|
|
155
|
+
const reqData = extractRequestData(request.event);
|
|
156
|
+
await telescope.recordRequest({
|
|
157
|
+
method: reqData.method,
|
|
158
|
+
path: reqData.path,
|
|
159
|
+
url: reqData.url,
|
|
160
|
+
headers: reqData.headers,
|
|
161
|
+
query: reqData.query,
|
|
162
|
+
body: recordBody ? reqData.body : void 0,
|
|
163
|
+
ip: reqData.ip,
|
|
164
|
+
status: 500,
|
|
165
|
+
responseHeaders: {},
|
|
166
|
+
responseBody: { error: request.error?.message },
|
|
167
|
+
duration,
|
|
168
|
+
requestSize: reqData.requestSize
|
|
169
|
+
});
|
|
170
|
+
} catch {}
|
|
171
|
+
await smartFlush(request.context, flushThresholdMs, flushTimeoutMs);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Smart flush that respects Lambda's remaining execution time
|
|
177
|
+
*/
|
|
178
|
+
async function smartFlush(context, thresholdMs, timeoutMs) {
|
|
179
|
+
const remaining = context.getRemainingTimeInMillis();
|
|
180
|
+
const effectiveTimeout = Math.min(timeoutMs, Math.max(remaining - thresholdMs, 100));
|
|
181
|
+
if (effectiveTimeout > 0) await require_instrumentation_core.flushTelemetry(effectiveTimeout).catch(() => {});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Create a wrapped Lambda handler with Telescope integration.
|
|
185
|
+
* Alternative to using Middy middleware directly.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* import { createTelescopeHandler } from '@geekmidas/telescope/lambda';
|
|
190
|
+
*
|
|
191
|
+
* export const handler = createTelescopeHandler(telescope, async (event, context) => {
|
|
192
|
+
* return { statusCode: 200, body: 'OK' };
|
|
193
|
+
* });
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
function createTelescopeHandler(telescope, handler, options = {}) {
|
|
197
|
+
const { flushThresholdMs = 1e3, recordBody = true, flushTimeoutMs = 5e3 } = options;
|
|
198
|
+
registerProcessHooks();
|
|
199
|
+
return async (event, context) => {
|
|
200
|
+
const startTime = Date.now();
|
|
201
|
+
context.callbackWaitsForEmptyEventLoop = false;
|
|
202
|
+
try {
|
|
203
|
+
const result = await handler(event, context);
|
|
204
|
+
const duration = Date.now() - startTime;
|
|
205
|
+
try {
|
|
206
|
+
const reqData = extractRequestData(event);
|
|
207
|
+
const resData = extractResponseData(result);
|
|
208
|
+
await telescope.recordRequest({
|
|
209
|
+
method: reqData.method,
|
|
210
|
+
path: reqData.path,
|
|
211
|
+
url: reqData.url,
|
|
212
|
+
headers: reqData.headers,
|
|
213
|
+
query: reqData.query,
|
|
214
|
+
body: recordBody ? reqData.body : void 0,
|
|
215
|
+
ip: reqData.ip,
|
|
216
|
+
status: resData.status,
|
|
217
|
+
responseHeaders: resData.headers,
|
|
218
|
+
responseBody: recordBody ? resData.body : void 0,
|
|
219
|
+
duration,
|
|
220
|
+
requestSize: reqData.requestSize,
|
|
221
|
+
responseSize: resData.responseSize
|
|
222
|
+
});
|
|
223
|
+
} catch {}
|
|
224
|
+
await smartFlush(context, flushThresholdMs, flushTimeoutMs);
|
|
225
|
+
return result;
|
|
226
|
+
} catch (error) {
|
|
227
|
+
if (error instanceof Error) await telescope.exception(error).catch(() => {});
|
|
228
|
+
await smartFlush(context, flushThresholdMs, flushTimeoutMs);
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
exports.createTelescopeHandler = createTelescopeHandler;
|
|
235
|
+
exports.telescopeMiddleware = telescopeMiddleware;
|
|
3
236
|
|
|
4
|
-
|
|
5
|
-
exports.telescopeMiddleware = require_middy.telescopeMiddleware;
|
|
237
|
+
//# sourceMappingURL=middy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middy.cjs","names":["flushTelemetry"],"sources":["../../src/adapters/middy.ts"],"sourcesContent":["import type { MiddlewareObj } from '@middy/core';\nimport type {\n\tAPIGatewayProxyEvent,\n\tAPIGatewayProxyEventV2,\n\tContext,\n} from 'aws-lambda';\nimport { flushTelemetry } from '../instrumentation/core';\nimport type { Telescope } from '../Telescope';\n\n/**\n * Options for the Telescope Middy middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Minimum remaining time (ms) before forcing a flush.\n\t * If remaining time drops below this, flush immediately.\n\t * @default 1000 (1 second)\n\t */\n\tflushThresholdMs?: number;\n\n\t/**\n\t * Whether to record request/response bodies\n\t * @default true\n\t */\n\trecordBody?: boolean;\n\n\t/**\n\t * Timeout for flush operation in ms\n\t * @default 5000\n\t */\n\tflushTimeoutMs?: number;\n}\n\n// Track if we've registered the process hooks\nlet processHooksRegistered = false;\n\n/**\n * Register process-level hooks for telemetry flush.\n * Called once per Lambda cold start.\n */\nfunction registerProcessHooks(): void {\n\tif (processHooksRegistered) return;\n\tprocessHooksRegistered = true;\n\n\t// Flush on SIGTERM (Lambda shutdown)\n\tprocess.on('SIGTERM', async () => {\n\t\tawait flushTelemetry(5000).catch(() => {});\n\t});\n\n\t// Note: beforeExit doesn't work reliably in Lambda\n\t// because Lambda freezes rather than exits\n}\n\n/**\n * Extract request data from API Gateway event (v1 or v2)\n */\nfunction extractRequestData(\n\tevent: APIGatewayProxyEvent | APIGatewayProxyEventV2,\n): {\n\tmethod: string;\n\tpath: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tquery: Record<string, string>;\n\tbody: unknown;\n\tip?: string;\n\trequestId?: string;\n\trequestSize?: number;\n} {\n\tconst headers: Record<string, string> = {};\n\tif (event.headers) {\n\t\tfor (const [key, value] of Object.entries(event.headers)) {\n\t\t\tif (value) headers[key.toLowerCase()] = value;\n\t\t}\n\t}\n\n\t// Get request size from Content-Length header\n\tconst contentLength = headers['content-length'];\n\tconst requestSize = contentLength ? parseInt(contentLength, 10) : undefined;\n\n\t// API Gateway v2 (HTTP API)\n\tif ('rawPath' in event && event.requestContext?.http) {\n\t\tconst v2Event = event as APIGatewayProxyEventV2;\n\t\t// Filter out undefined values from query parameters\n\t\tconst query: Record<string, string> = {};\n\t\tif (v2Event.queryStringParameters) {\n\t\t\tfor (const [key, value] of Object.entries(\n\t\t\t\tv2Event.queryStringParameters,\n\t\t\t)) {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tquery[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tmethod: v2Event.requestContext.http.method,\n\t\t\tpath: v2Event.rawPath,\n\t\t\turl:\n\t\t\t\tv2Event.rawPath +\n\t\t\t\t(v2Event.rawQueryString ? `?${v2Event.rawQueryString}` : ''),\n\t\t\theaders,\n\t\t\tquery,\n\t\t\tbody: parseBody(v2Event.body, v2Event.isBase64Encoded),\n\t\t\tip: v2Event.requestContext.http.sourceIp,\n\t\t\trequestId: v2Event.requestContext.requestId,\n\t\t\trequestSize,\n\t\t};\n\t}\n\n\t// API Gateway v1 (REST API)\n\tconst v1Event = event as APIGatewayProxyEvent;\n\tconst queryString = v1Event.queryStringParameters\n\t\t? new URLSearchParams(\n\t\t\t\tv1Event.queryStringParameters as Record<string, string>,\n\t\t\t).toString()\n\t\t: '';\n\n\treturn {\n\t\tmethod: v1Event.httpMethod,\n\t\tpath: v1Event.path,\n\t\turl: v1Event.path + (queryString ? `?${queryString}` : ''),\n\t\theaders,\n\t\tquery: (v1Event.queryStringParameters as Record<string, string>) || {},\n\t\tbody: parseBody(v1Event.body, v1Event.isBase64Encoded),\n\t\tip: v1Event.requestContext?.identity?.sourceIp,\n\t\trequestId: v1Event.requestContext?.requestId,\n\t\trequestSize,\n\t};\n}\n\n/**\n * Parse request body\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\t\treturn JSON.parse(decoded);\n\t} catch {\n\t\treturn body;\n\t}\n}\n\n/**\n * Extract response data from Lambda response\n */\nfunction extractResponseData(response: unknown): {\n\tstatus: number;\n\theaders: Record<string, string>;\n\tbody: unknown;\n\tresponseSize?: number;\n} {\n\tif (response && typeof response === 'object' && 'statusCode' in response) {\n\t\tconst res = response as {\n\t\t\tstatusCode?: number;\n\t\t\theaders?: Record<string, string>;\n\t\t\tbody?: string;\n\t\t};\n\t\tconst headers = res.headers || {};\n\t\t// Get response size from Content-Length header (case-insensitive)\n\t\tconst contentLengthKey = Object.keys(headers).find(\n\t\t\t(k) => k.toLowerCase() === 'content-length',\n\t\t);\n\t\tconst contentLengthValue = contentLengthKey\n\t\t\t? headers[contentLengthKey]\n\t\t\t: undefined;\n\t\t// Prefer Content-Length header, fallback to body size\n\t\tconst responseSize = contentLengthValue\n\t\t\t? parseInt(contentLengthValue, 10)\n\t\t\t: res.body\n\t\t\t\t? Buffer.byteLength(res.body, 'utf8')\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tstatus: res.statusCode || 200,\n\t\t\theaders,\n\t\t\tbody: res.body ? tryParseJson(res.body) : undefined,\n\t\t\tresponseSize,\n\t\t};\n\t}\n\n\treturn { status: 200, headers: {}, body: response };\n}\n\nfunction tryParseJson(str: string): unknown {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch {\n\t\treturn str;\n\t}\n}\n\n/**\n * Middy middleware that integrates Telescope with Lambda handlers.\n *\n * Features:\n * - Records all requests and responses to Telescope\n * - Captures exceptions automatically\n * - Flushes telemetry before Lambda freezes\n * - Uses Lambda context for smart flush timing\n *\n * @example\n * ```typescript\n * import middy from '@middy/core';\n * import { telescopeMiddleware } from '@geekmidas/telescope/lambda';\n *\n * const handler = middy(baseHandler)\n * .use(telescopeMiddleware(telescope));\n * ```\n */\nexport function telescopeMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareObj<\n\tAPIGatewayProxyEvent | APIGatewayProxyEventV2,\n\tany,\n\tError,\n\tContext\n> {\n\tconst {\n\t\tflushThresholdMs = 1000,\n\t\trecordBody = true,\n\t\tflushTimeoutMs = 5000,\n\t} = options;\n\n\t// Register process hooks on first use\n\tregisterProcessHooks();\n\n\treturn {\n\t\tbefore: async (request) => {\n\t\t\t// Store start time for duration calculation\n\t\t\t(request as any).__telescopeStartTime = Date.now();\n\n\t\t\t// Don't wait for empty event loop - we'll flush manually\n\t\t\trequest.context.callbackWaitsForEmptyEventLoop = false;\n\t\t},\n\n\t\tafter: async (request) => {\n\t\t\tconst startTime = (request as any).__telescopeStartTime || Date.now();\n\t\t\tconst duration = Date.now() - startTime;\n\n\t\t\ttry {\n\t\t\t\tconst reqData = extractRequestData(request.event);\n\t\t\t\tconst resData = extractResponseData(request.response);\n\n\t\t\t\tawait telescope.recordRequest({\n\t\t\t\t\tmethod: reqData.method,\n\t\t\t\t\tpath: reqData.path,\n\t\t\t\t\turl: reqData.url,\n\t\t\t\t\theaders: reqData.headers,\n\t\t\t\t\tquery: reqData.query,\n\t\t\t\t\tbody: recordBody ? reqData.body : undefined,\n\t\t\t\t\tip: reqData.ip,\n\t\t\t\t\tstatus: resData.status,\n\t\t\t\t\tresponseHeaders: resData.headers,\n\t\t\t\t\tresponseBody: recordBody ? resData.body : undefined,\n\t\t\t\t\tduration,\n\t\t\t\t\trequestSize: reqData.requestSize,\n\t\t\t\t\tresponseSize: resData.responseSize,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Don't let telescope errors break the response\n\t\t\t}\n\n\t\t\t// Smart flush: check remaining time\n\t\t\tawait smartFlush(request.context, flushThresholdMs, flushTimeoutMs);\n\t\t},\n\n\t\tonError: async (request) => {\n\t\t\tconst startTime = (request as any).__telescopeStartTime || Date.now();\n\t\t\tconst duration = Date.now() - startTime;\n\n\t\t\ttry {\n\t\t\t\t// Record the exception\n\t\t\t\tif (request.error) {\n\t\t\t\t\tawait telescope.exception(request.error);\n\t\t\t\t}\n\n\t\t\t\t// Also record the failed request\n\t\t\t\tconst reqData = extractRequestData(request.event);\n\t\t\t\tawait telescope.recordRequest({\n\t\t\t\t\tmethod: reqData.method,\n\t\t\t\t\tpath: reqData.path,\n\t\t\t\t\turl: reqData.url,\n\t\t\t\t\theaders: reqData.headers,\n\t\t\t\t\tquery: reqData.query,\n\t\t\t\t\tbody: recordBody ? reqData.body : undefined,\n\t\t\t\t\tip: reqData.ip,\n\t\t\t\t\tstatus: 500,\n\t\t\t\t\tresponseHeaders: {},\n\t\t\t\t\tresponseBody: { error: request.error?.message },\n\t\t\t\t\tduration,\n\t\t\t\t\trequestSize: reqData.requestSize,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Don't let telescope errors mask the original error\n\t\t\t}\n\n\t\t\t// Always flush on error\n\t\t\tawait smartFlush(request.context, flushThresholdMs, flushTimeoutMs);\n\t\t},\n\t};\n}\n\n/**\n * Smart flush that respects Lambda's remaining execution time\n */\nasync function smartFlush(\n\tcontext: Context,\n\tthresholdMs: number,\n\ttimeoutMs: number,\n): Promise<void> {\n\tconst remaining = context.getRemainingTimeInMillis();\n\n\t// If we have plenty of time, use normal timeout\n\t// If time is running low, use a shorter timeout\n\tconst effectiveTimeout = Math.min(\n\t\ttimeoutMs,\n\t\tMath.max(remaining - thresholdMs, 100), // Leave at least threshold ms for response\n\t);\n\n\tif (effectiveTimeout > 0) {\n\t\tawait flushTelemetry(effectiveTimeout).catch(() => {});\n\t}\n}\n\n/**\n * Create a wrapped Lambda handler with Telescope integration.\n * Alternative to using Middy middleware directly.\n *\n * @example\n * ```typescript\n * import { createTelescopeHandler } from '@geekmidas/telescope/lambda';\n *\n * export const handler = createTelescopeHandler(telescope, async (event, context) => {\n * return { statusCode: 200, body: 'OK' };\n * });\n * ```\n */\nexport function createTelescopeHandler<TEvent, TResult>(\n\ttelescope: Telescope,\n\thandler: (event: TEvent, context: Context) => Promise<TResult>,\n\toptions: TelescopeMiddlewareOptions = {},\n): (event: TEvent, context: Context) => Promise<TResult> {\n\tconst {\n\t\tflushThresholdMs = 1000,\n\t\trecordBody = true,\n\t\tflushTimeoutMs = 5000,\n\t} = options;\n\n\tregisterProcessHooks();\n\n\treturn async (event: TEvent, context: Context): Promise<TResult> => {\n\t\tconst startTime = Date.now();\n\t\tcontext.callbackWaitsForEmptyEventLoop = false;\n\n\t\ttry {\n\t\t\tconst result = await handler(event, context);\n\t\t\tconst duration = Date.now() - startTime;\n\n\t\t\t// Record successful request\n\t\t\ttry {\n\t\t\t\tconst reqData = extractRequestData(event as any);\n\t\t\t\tconst resData = extractResponseData(result);\n\n\t\t\t\tawait telescope.recordRequest({\n\t\t\t\t\tmethod: reqData.method,\n\t\t\t\t\tpath: reqData.path,\n\t\t\t\t\turl: reqData.url,\n\t\t\t\t\theaders: reqData.headers,\n\t\t\t\t\tquery: reqData.query,\n\t\t\t\t\tbody: recordBody ? reqData.body : undefined,\n\t\t\t\t\tip: reqData.ip,\n\t\t\t\t\tstatus: resData.status,\n\t\t\t\t\tresponseHeaders: resData.headers,\n\t\t\t\t\tresponseBody: recordBody ? resData.body : undefined,\n\t\t\t\t\tduration,\n\t\t\t\t\trequestSize: reqData.requestSize,\n\t\t\t\t\tresponseSize: resData.responseSize,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// Ignore telescope errors\n\t\t\t}\n\n\t\t\tawait smartFlush(context, flushThresholdMs, flushTimeoutMs);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Record exception\n\t\t\tif (error instanceof Error) {\n\t\t\t\tawait telescope.exception(error).catch(() => {});\n\t\t\t}\n\n\t\t\tawait smartFlush(context, flushThresholdMs, flushTimeoutMs);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,60 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "
|
|
3
|
-
import "
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { t as Telescope } from "../Telescope-DnCMZT7V.cjs";
|
|
2
|
+
import { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context } from "aws-lambda";
|
|
3
|
+
import { MiddlewareObj } from "@middy/core";
|
|
4
|
+
//#region src/adapters/middy.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Options for the Telescope Middy middleware
|
|
7
|
+
*/
|
|
8
|
+
export interface TelescopeMiddlewareOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Minimum remaining time (ms) before forcing a flush.
|
|
11
|
+
* If remaining time drops below this, flush immediately.
|
|
12
|
+
* @default 1000 (1 second)
|
|
13
|
+
*/
|
|
14
|
+
flushThresholdMs?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to record request/response bodies
|
|
17
|
+
* @default true
|
|
18
|
+
*/
|
|
19
|
+
recordBody?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Timeout for flush operation in ms
|
|
22
|
+
* @default 5000
|
|
23
|
+
*/
|
|
24
|
+
flushTimeoutMs?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Middy middleware that integrates Telescope with Lambda handlers.
|
|
28
|
+
*
|
|
29
|
+
* Features:
|
|
30
|
+
* - Records all requests and responses to Telescope
|
|
31
|
+
* - Captures exceptions automatically
|
|
32
|
+
* - Flushes telemetry before Lambda freezes
|
|
33
|
+
* - Uses Lambda context for smart flush timing
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* import middy from '@middy/core';
|
|
38
|
+
* import { telescopeMiddleware } from '@geekmidas/telescope/lambda';
|
|
39
|
+
*
|
|
40
|
+
* const handler = middy(baseHandler)
|
|
41
|
+
* .use(telescopeMiddleware(telescope));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function telescopeMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareObj<APIGatewayProxyEvent | APIGatewayProxyEventV2, any, Error, Context>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a wrapped Lambda handler with Telescope integration.
|
|
47
|
+
* Alternative to using Middy middleware directly.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* import { createTelescopeHandler } from '@geekmidas/telescope/lambda';
|
|
52
|
+
*
|
|
53
|
+
* export const handler = createTelescopeHandler(telescope, async (event, context) => {
|
|
54
|
+
* return { statusCode: 200, body: 'OK' };
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function createTelescopeHandler<TEvent, TResult>(telescope: Telescope, handler: (event: TEvent, context: Context) => Promise<TResult>, options?: TelescopeMiddlewareOptions): (event: TEvent, context: Context) => Promise<TResult>;
|
|
59
|
+
//#endregion
|
|
60
|
+
//# sourceMappingURL=middy.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middy.d.cts","names":[],"sources":["../../src/adapters/middy.ts"],"mappings":";;;;;;;iBAYiB;;;;;;EAMhB;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;;;;;;;;;wBAyLe,oBACf,WAAW,WACX,UAAS,6BACP,cACF,uBAAuB,6BAEvB,OACA;;;;;;;;;;;;;;wBA0He,uBAAuB,QAAQ,SAC9C,WAAW,WACX,UAAU,OAAO,QAAQ,SAAS,YAAY,QAAQ,UACtD,UAAS,8BACN,OAAO,QAAQ,SAAS,YAAY,QAAQ"}
|
|
@@ -1,5 +1,60 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "
|
|
3
|
-
import "
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { t as Telescope } from "../Telescope-BcrWTaar.mjs";
|
|
2
|
+
import { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context } from "aws-lambda";
|
|
3
|
+
import { MiddlewareObj } from "@middy/core";
|
|
4
|
+
//#region src/adapters/middy.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Options for the Telescope Middy middleware
|
|
7
|
+
*/
|
|
8
|
+
export interface TelescopeMiddlewareOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Minimum remaining time (ms) before forcing a flush.
|
|
11
|
+
* If remaining time drops below this, flush immediately.
|
|
12
|
+
* @default 1000 (1 second)
|
|
13
|
+
*/
|
|
14
|
+
flushThresholdMs?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to record request/response bodies
|
|
17
|
+
* @default true
|
|
18
|
+
*/
|
|
19
|
+
recordBody?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Timeout for flush operation in ms
|
|
22
|
+
* @default 5000
|
|
23
|
+
*/
|
|
24
|
+
flushTimeoutMs?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Middy middleware that integrates Telescope with Lambda handlers.
|
|
28
|
+
*
|
|
29
|
+
* Features:
|
|
30
|
+
* - Records all requests and responses to Telescope
|
|
31
|
+
* - Captures exceptions automatically
|
|
32
|
+
* - Flushes telemetry before Lambda freezes
|
|
33
|
+
* - Uses Lambda context for smart flush timing
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* import middy from '@middy/core';
|
|
38
|
+
* import { telescopeMiddleware } from '@geekmidas/telescope/lambda';
|
|
39
|
+
*
|
|
40
|
+
* const handler = middy(baseHandler)
|
|
41
|
+
* .use(telescopeMiddleware(telescope));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function telescopeMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareObj<APIGatewayProxyEvent | APIGatewayProxyEventV2, any, Error, Context>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a wrapped Lambda handler with Telescope integration.
|
|
47
|
+
* Alternative to using Middy middleware directly.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* import { createTelescopeHandler } from '@geekmidas/telescope/lambda';
|
|
52
|
+
*
|
|
53
|
+
* export const handler = createTelescopeHandler(telescope, async (event, context) => {
|
|
54
|
+
* return { statusCode: 200, body: 'OK' };
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function createTelescopeHandler<TEvent, TResult>(telescope: Telescope, handler: (event: TEvent, context: Context) => Promise<TResult>, options?: TelescopeMiddlewareOptions): (event: TEvent, context: Context) => Promise<TResult>;
|
|
59
|
+
//#endregion
|
|
60
|
+
//# sourceMappingURL=middy.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middy.d.mts","names":[],"sources":["../../src/adapters/middy.ts"],"mappings":";;;;;;;iBAYiB;;;;;;EAMhB;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;;;;;;;;;wBAyLe,oBACf,WAAW,WACX,UAAS,6BACP,cACF,uBAAuB,6BAEvB,OACA;;;;;;;;;;;;;;wBA0He,uBAAuB,QAAQ,SAC9C,WAAW,WACX,UAAU,OAAO,QAAQ,SAAS,YAAY,QAAQ,UACtD,UAAS,8BACN,OAAO,QAAQ,SAAS,YAAY,QAAQ"}
|