@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.
Files changed (391) hide show
  1. package/dist/{MetricsAggregator-4SqelGcG.d.cts → MetricsAggregator-BxBLQUPj.d.cts} +3 -6
  2. package/dist/MetricsAggregator-BxBLQUPj.d.cts.map +1 -0
  3. package/dist/{MetricsAggregator-DZrW8ls6.d.mts → MetricsAggregator-j9wmZ0K_.d.mts} +3 -6
  4. package/dist/MetricsAggregator-j9wmZ0K_.d.mts.map +1 -0
  5. package/dist/{Telescope-D4nmwDRA.d.cts → Telescope-BcrWTaar.d.mts} +4 -7
  6. package/dist/Telescope-BcrWTaar.d.mts.map +1 -0
  7. package/dist/{Telescope-Dl6VSfxd.d.mts → Telescope-DnCMZT7V.d.cts} +4 -7
  8. package/dist/Telescope-DnCMZT7V.d.cts.map +1 -0
  9. package/dist/Telescope.cjs +385 -4
  10. package/dist/Telescope.cjs.map +1 -0
  11. package/dist/Telescope.d.cts +1 -3
  12. package/dist/Telescope.d.mts +1 -3
  13. package/dist/Telescope.mjs +384 -4
  14. package/dist/Telescope.mjs.map +1 -0
  15. package/dist/adapters/index.d.cts +2 -2
  16. package/dist/adapters/index.d.mts +2 -2
  17. package/dist/adapters/index.mjs +1 -0
  18. package/dist/adapters/lambda.cjs +9 -10
  19. package/dist/adapters/lambda.cjs.map +1 -1
  20. package/dist/adapters/lambda.d.cts +9 -13
  21. package/dist/adapters/lambda.d.cts.map +1 -1
  22. package/dist/adapters/lambda.d.mts +9 -13
  23. package/dist/adapters/lambda.d.mts.map +1 -1
  24. package/dist/adapters/lambda.mjs +3 -4
  25. package/dist/adapters/lambda.mjs.map +1 -1
  26. package/dist/adapters/middy.cjs +236 -4
  27. package/dist/adapters/middy.cjs.map +1 -0
  28. package/dist/adapters/middy.d.cts +60 -5
  29. package/dist/adapters/middy.d.cts.map +1 -0
  30. package/dist/adapters/middy.d.mts +60 -5
  31. package/dist/adapters/middy.d.mts.map +1 -0
  32. package/dist/adapters/middy.mjs +234 -3
  33. package/dist/adapters/middy.mjs.map +1 -0
  34. package/dist/adapters/types.d.cts +162 -2
  35. package/dist/adapters/types.d.cts.map +1 -0
  36. package/dist/adapters/types.d.mts +162 -2
  37. package/dist/adapters/types.d.mts.map +1 -0
  38. package/dist/adapters/types.mjs +1 -0
  39. package/dist/core.cjs +22 -22
  40. package/dist/core.d.cts +4 -4
  41. package/dist/core.d.mts +4 -4
  42. package/dist/core.mjs +3 -4
  43. package/dist/index.cjs +8 -9
  44. package/dist/index.d.cts +5 -6
  45. package/dist/index.d.mts +5 -6
  46. package/dist/index.mjs +5 -7
  47. package/dist/instrumentation/core.cjs +147 -11
  48. package/dist/instrumentation/core.cjs.map +1 -0
  49. package/dist/instrumentation/core.d.cts +74 -3
  50. package/dist/instrumentation/core.d.cts.map +1 -0
  51. package/dist/instrumentation/core.d.mts +74 -3
  52. package/dist/instrumentation/core.d.mts.map +1 -0
  53. package/dist/instrumentation/core.mjs +137 -2
  54. package/dist/instrumentation/core.mjs.map +1 -0
  55. package/dist/instrumentation/hono.cjs +134 -6
  56. package/dist/instrumentation/hono.cjs.map +1 -0
  57. package/dist/instrumentation/hono.d.cts +67 -2
  58. package/dist/instrumentation/hono.d.cts.map +1 -0
  59. package/dist/instrumentation/hono.d.mts +67 -2
  60. package/dist/instrumentation/hono.d.mts.map +1 -0
  61. package/dist/instrumentation/hono.mjs +130 -3
  62. package/dist/instrumentation/hono.mjs.map +1 -0
  63. package/dist/instrumentation/http.cjs +164 -11
  64. package/dist/instrumentation/http.cjs.map +1 -0
  65. package/dist/instrumentation/http.d.cts +103 -2
  66. package/dist/instrumentation/http.d.cts.map +1 -0
  67. package/dist/instrumentation/http.d.mts +103 -2
  68. package/dist/instrumentation/http.d.mts.map +1 -0
  69. package/dist/instrumentation/http.mjs +154 -2
  70. package/dist/instrumentation/http.mjs.map +1 -0
  71. package/dist/instrumentation/index.cjs +47 -47
  72. package/dist/instrumentation/index.d.cts +9 -9
  73. package/dist/instrumentation/index.d.mts +9 -9
  74. package/dist/instrumentation/index.mjs +8 -9
  75. package/dist/instrumentation/middleware.cjs +162 -6
  76. package/dist/instrumentation/middleware.cjs.map +1 -0
  77. package/dist/instrumentation/middleware.d.cts +70 -2
  78. package/dist/instrumentation/middleware.d.cts.map +1 -0
  79. package/dist/instrumentation/middleware.d.mts +70 -2
  80. package/dist/instrumentation/middleware.d.mts.map +1 -0
  81. package/dist/instrumentation/middleware.mjs +158 -3
  82. package/dist/instrumentation/middleware.mjs.map +1 -0
  83. package/dist/instrumentation/otel.cjs +137 -3
  84. package/dist/instrumentation/otel.cjs.map +1 -0
  85. package/dist/instrumentation/otel.d.cts +97 -2
  86. package/dist/instrumentation/otel.d.cts.map +1 -0
  87. package/dist/instrumentation/otel.d.mts +97 -2
  88. package/dist/instrumentation/otel.d.mts.map +1 -0
  89. package/dist/instrumentation/otel.mjs +136 -3
  90. package/dist/instrumentation/otel.mjs.map +1 -0
  91. package/dist/instrumentation/setup.cjs +100 -4
  92. package/dist/instrumentation/setup.cjs.map +1 -0
  93. package/dist/instrumentation/setup.d.cts +83 -3
  94. package/dist/instrumentation/setup.d.cts.map +1 -0
  95. package/dist/instrumentation/setup.d.mts +83 -3
  96. package/dist/instrumentation/setup.d.mts.map +1 -0
  97. package/dist/instrumentation/setup.mjs +98 -3
  98. package/dist/instrumentation/setup.mjs.map +1 -0
  99. package/dist/instrumentation/tracing.cjs +114 -10
  100. package/dist/instrumentation/tracing.cjs.map +1 -0
  101. package/dist/instrumentation/tracing.d.cts +49 -2
  102. package/dist/instrumentation/tracing.d.cts.map +1 -0
  103. package/dist/instrumentation/tracing.d.mts +49 -2
  104. package/dist/instrumentation/tracing.d.mts.map +1 -0
  105. package/dist/instrumentation/tracing.mjs +105 -2
  106. package/dist/instrumentation/tracing.mjs.map +1 -0
  107. package/dist/logger/console.cjs +18 -12
  108. package/dist/logger/console.cjs.map +1 -1
  109. package/dist/logger/console.d.cts +7 -10
  110. package/dist/logger/console.d.cts.map +1 -1
  111. package/dist/logger/console.d.mts +7 -10
  112. package/dist/logger/console.d.mts.map +1 -1
  113. package/dist/logger/console.mjs +17 -11
  114. package/dist/logger/console.mjs.map +1 -1
  115. package/dist/logger/pino.cjs +6 -5
  116. package/dist/logger/pino.cjs.map +1 -1
  117. package/dist/logger/pino.d.cts +6 -10
  118. package/dist/logger/pino.d.cts.map +1 -1
  119. package/dist/logger/pino.d.mts +6 -10
  120. package/dist/logger/pino.d.mts.map +1 -1
  121. package/dist/logger/pino.mjs +2 -3
  122. package/dist/logger/pino.mjs.map +1 -1
  123. package/dist/metrics/MetricsAggregator.cjs +354 -2
  124. package/dist/metrics/MetricsAggregator.cjs.map +1 -0
  125. package/dist/metrics/MetricsAggregator.d.cts +1 -2
  126. package/dist/metrics/MetricsAggregator.d.mts +1 -2
  127. package/dist/metrics/MetricsAggregator.mjs +353 -2
  128. package/dist/metrics/MetricsAggregator.mjs.map +1 -0
  129. package/dist/metrics/index.cjs +3 -4
  130. package/dist/metrics/index.d.cts +2 -4
  131. package/dist/metrics/index.d.mts +2 -4
  132. package/dist/metrics/index.mjs +2 -4
  133. package/dist/metrics/storage/InMemoryMetricsStorage.cjs +240 -3
  134. package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +1 -0
  135. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +43 -4
  136. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +1 -0
  137. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +43 -4
  138. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +1 -0
  139. package/dist/metrics/storage/InMemoryMetricsStorage.mjs +239 -3
  140. package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +1 -0
  141. package/dist/metrics/storage/MetricsStorage.cjs +0 -1
  142. package/dist/metrics/storage/MetricsStorage.d.cts +56 -3
  143. package/dist/metrics/storage/MetricsStorage.d.cts.map +1 -0
  144. package/dist/metrics/storage/MetricsStorage.d.mts +56 -3
  145. package/dist/metrics/storage/MetricsStorage.d.mts.map +1 -0
  146. package/dist/metrics/storage/MetricsStorage.mjs +1 -1
  147. package/dist/metrics/storage/index.cjs +6 -6
  148. package/dist/metrics/storage/index.d.cts +3 -3
  149. package/dist/metrics/storage/index.d.mts +3 -3
  150. package/dist/metrics/storage/index.mjs +4 -5
  151. package/dist/metrics/storage/types.cjs +34 -2
  152. package/dist/metrics/storage/types.cjs.map +1 -0
  153. package/dist/metrics/storage/types.d.cts +207 -2
  154. package/dist/metrics/storage/types.d.cts.map +1 -0
  155. package/dist/metrics/storage/types.d.mts +207 -2
  156. package/dist/metrics/storage/types.d.mts.map +1 -0
  157. package/dist/metrics/storage/types.mjs +33 -2
  158. package/dist/metrics/storage/types.mjs.map +1 -0
  159. package/dist/otlp/hono.cjs +9 -15
  160. package/dist/otlp/hono.cjs.map +1 -1
  161. package/dist/otlp/hono.d.cts +3 -13
  162. package/dist/otlp/hono.d.cts.map +1 -1
  163. package/dist/otlp/hono.d.mts +3 -13
  164. package/dist/otlp/hono.d.mts.map +1 -1
  165. package/dist/otlp/hono.mjs +5 -11
  166. package/dist/otlp/hono.mjs.map +1 -1
  167. package/dist/otlp/index.cjs +11 -11
  168. package/dist/otlp/index.d.cts +4 -7
  169. package/dist/otlp/index.d.mts +4 -7
  170. package/dist/otlp/index.mjs +4 -5
  171. package/dist/otlp/receiver.cjs +88 -4
  172. package/dist/otlp/receiver.cjs.map +1 -0
  173. package/dist/otlp/receiver.d.cts +59 -7
  174. package/dist/otlp/receiver.d.cts.map +1 -0
  175. package/dist/otlp/receiver.d.mts +59 -7
  176. package/dist/otlp/receiver.d.mts.map +1 -0
  177. package/dist/otlp/receiver.mjs +87 -4
  178. package/dist/otlp/receiver.mjs.map +1 -0
  179. package/dist/otlp/transformer.cjs +214 -5
  180. package/dist/otlp/transformer.cjs.map +1 -0
  181. package/dist/otlp/transformer.d.cts +1 -3
  182. package/dist/otlp/transformer.d.mts +1 -3
  183. package/dist/otlp/transformer.mjs +211 -3
  184. package/dist/otlp/transformer.mjs.map +1 -0
  185. package/dist/otlp/types.cjs +57 -5
  186. package/dist/otlp/types.cjs.map +1 -0
  187. package/dist/otlp/types.d.cts +1 -1
  188. package/dist/otlp/types.d.mts +1 -1
  189. package/dist/otlp/types.mjs +53 -2
  190. package/dist/otlp/types.mjs.map +1 -0
  191. package/dist/redact.cjs +84 -3
  192. package/dist/redact.cjs.map +1 -0
  193. package/dist/redact.d.cts +4 -8
  194. package/dist/redact.d.cts.map +1 -1
  195. package/dist/redact.d.mts +4 -8
  196. package/dist/redact.d.mts.map +1 -1
  197. package/dist/redact.mjs +80 -2
  198. package/dist/redact.mjs.map +1 -0
  199. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
  200. package/dist/server/hono.cjs +24 -33
  201. package/dist/server/hono.cjs.map +1 -1
  202. package/dist/server/hono.d.cts +10 -13
  203. package/dist/server/hono.d.cts.map +1 -1
  204. package/dist/server/hono.d.mts +10 -13
  205. package/dist/server/hono.d.mts.map +1 -1
  206. package/dist/server/hono.mjs +22 -31
  207. package/dist/server/hono.mjs.map +1 -1
  208. package/dist/storage/kysely.cjs +34 -32
  209. package/dist/storage/kysely.cjs.map +1 -1
  210. package/dist/storage/kysely.d.cts +8 -12
  211. package/dist/storage/kysely.d.cts.map +1 -1
  212. package/dist/storage/kysely.d.mts +8 -12
  213. package/dist/storage/kysely.d.mts.map +1 -1
  214. package/dist/storage/kysely.mjs +33 -31
  215. package/dist/storage/kysely.mjs.map +1 -1
  216. package/dist/storage/memory.cjs +122 -2
  217. package/dist/storage/memory.cjs.map +1 -0
  218. package/dist/storage/memory.d.cts +36 -3
  219. package/dist/storage/memory.d.cts.map +1 -0
  220. package/dist/storage/memory.d.mts +36 -3
  221. package/dist/storage/memory.d.mts.map +1 -0
  222. package/dist/storage/memory.mjs +121 -2
  223. package/dist/storage/memory.mjs.map +1 -0
  224. package/dist/{transformer-CTGsaVfV.d.mts → transformer-BBBXCjHP.d.mts} +4 -8
  225. package/dist/transformer-BBBXCjHP.d.mts.map +1 -0
  226. package/dist/{transformer-ICEbxpFf.d.cts → transformer-DlESim6Q.d.cts} +4 -8
  227. package/dist/transformer-DlESim6Q.d.cts.map +1 -0
  228. package/dist/{types-CmOB7CLO.d.cts → types-DVETVdpa.d.cts} +6 -7
  229. package/dist/types-DVETVdpa.d.cts.map +1 -0
  230. package/dist/{types-DBc0q5KD.d.mts → types-DVETVdpa.d.mts} +6 -7
  231. package/dist/types-DVETVdpa.d.mts.map +1 -0
  232. package/dist/{types-B1EIa_cQ.d.mts → types-a9Vistj1.d.cts} +2 -3
  233. package/dist/types-a9Vistj1.d.cts.map +1 -0
  234. package/dist/{types-l7Rlb5Mg.d.cts → types-a9Vistj1.d.mts} +2 -3
  235. package/dist/types-a9Vistj1.d.mts.map +1 -0
  236. package/dist/types.d.cts +1 -1
  237. package/dist/types.d.mts +1 -1
  238. package/dist/types.mjs +1 -0
  239. package/dist/ui-assets.cjs +31 -4
  240. package/dist/ui-assets.cjs.map +1 -0
  241. package/dist/ui-assets.d.cts +4 -6
  242. package/dist/ui-assets.d.cts.map +1 -1
  243. package/dist/ui-assets.d.mts +4 -6
  244. package/dist/ui-assets.d.mts.map +1 -1
  245. package/dist/ui-assets.mjs +28 -2
  246. package/dist/ui-assets.mjs.map +1 -0
  247. package/package.json +39 -37
  248. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +0 -47
  249. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +0 -1
  250. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +0 -247
  251. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +0 -1
  252. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +0 -252
  253. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +0 -1
  254. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +0 -47
  255. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +0 -1
  256. package/dist/MetricsAggregator-4SqelGcG.d.cts.map +0 -1
  257. package/dist/MetricsAggregator-B7lUICdH.cjs +0 -363
  258. package/dist/MetricsAggregator-B7lUICdH.cjs.map +0 -1
  259. package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +0 -1
  260. package/dist/MetricsAggregator-S3DQWNas.mjs +0 -357
  261. package/dist/MetricsAggregator-S3DQWNas.mjs.map +0 -1
  262. package/dist/MetricsStorage-B86e4131.d.cts +0 -60
  263. package/dist/MetricsStorage-B86e4131.d.cts.map +0 -1
  264. package/dist/MetricsStorage-BWyP2_12.d.mts +0 -60
  265. package/dist/MetricsStorage-BWyP2_12.d.mts.map +0 -1
  266. package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
  267. package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
  268. package/dist/Telescope-Cs3fv8jt.cjs +0 -395
  269. package/dist/Telescope-Cs3fv8jt.cjs.map +0 -1
  270. package/dist/Telescope-D4nmwDRA.d.cts.map +0 -1
  271. package/dist/Telescope-Dh5av3FC.mjs +0 -389
  272. package/dist/Telescope-Dh5av3FC.mjs.map +0 -1
  273. package/dist/Telescope-Dl6VSfxd.d.mts.map +0 -1
  274. package/dist/core--quSp5Qr.d.mts +0 -78
  275. package/dist/core--quSp5Qr.d.mts.map +0 -1
  276. package/dist/core-B4Jpia5H.d.cts +0 -78
  277. package/dist/core-B4Jpia5H.d.cts.map +0 -1
  278. package/dist/core-CtVHRJGv.cjs +0 -199
  279. package/dist/core-CtVHRJGv.cjs.map +0 -1
  280. package/dist/core-D6hJ6exL.mjs +0 -139
  281. package/dist/core-D6hJ6exL.mjs.map +0 -1
  282. package/dist/hono--uKQ7Jgi.d.mts +0 -71
  283. package/dist/hono--uKQ7Jgi.d.mts.map +0 -1
  284. package/dist/hono-Bw-ey6CT.mjs +0 -136
  285. package/dist/hono-Bw-ey6CT.mjs.map +0 -1
  286. package/dist/hono-CPHX7FAm.cjs +0 -160
  287. package/dist/hono-CPHX7FAm.cjs.map +0 -1
  288. package/dist/hono-CemCKU87.d.cts +0 -71
  289. package/dist/hono-CemCKU87.d.cts.map +0 -1
  290. package/dist/http-BIvr0YdI.mjs +0 -159
  291. package/dist/http-BIvr0YdI.mjs.map +0 -1
  292. package/dist/http-BiNtg85L.d.mts +0 -107
  293. package/dist/http-BiNtg85L.d.mts.map +0 -1
  294. package/dist/http-BsqmhurZ.cjs +0 -219
  295. package/dist/http-BsqmhurZ.cjs.map +0 -1
  296. package/dist/http-D1oTbfap.d.cts +0 -107
  297. package/dist/http-D1oTbfap.d.cts.map +0 -1
  298. package/dist/index-BL32-cvv.d.cts +0 -1
  299. package/dist/index-CsuikFeJ.d.mts +0 -1
  300. package/dist/memory--BK4iWiv.d.cts +0 -40
  301. package/dist/memory--BK4iWiv.d.cts.map +0 -1
  302. package/dist/memory-6S9H-IF5.mjs +0 -123
  303. package/dist/memory-6S9H-IF5.mjs.map +0 -1
  304. package/dist/memory-B0d_n1g5.cjs +0 -129
  305. package/dist/memory-B0d_n1g5.cjs.map +0 -1
  306. package/dist/memory-DCirEVFW.d.mts +0 -40
  307. package/dist/memory-DCirEVFW.d.mts.map +0 -1
  308. package/dist/metrics-D5YT-Rnq.mjs +0 -0
  309. package/dist/metrics-fhD3l3C3.cjs +0 -0
  310. package/dist/middleware-Bcq6XXGG.cjs +0 -184
  311. package/dist/middleware-Bcq6XXGG.cjs.map +0 -1
  312. package/dist/middleware-D1XEHvyy.mjs +0 -160
  313. package/dist/middleware-D1XEHvyy.mjs.map +0 -1
  314. package/dist/middleware-PeyS-9Ny.d.cts +0 -74
  315. package/dist/middleware-PeyS-9Ny.d.cts.map +0 -1
  316. package/dist/middleware-oHvo_ZgU.d.mts +0 -74
  317. package/dist/middleware-oHvo_ZgU.d.mts.map +0 -1
  318. package/dist/middy-B6Btl8XE.d.mts +0 -64
  319. package/dist/middy-B6Btl8XE.d.mts.map +0 -1
  320. package/dist/middy-Bq0defVg.d.cts +0 -64
  321. package/dist/middy-Bq0defVg.d.cts.map +0 -1
  322. package/dist/middy-DHWLmUAD.mjs +0 -236
  323. package/dist/middy-DHWLmUAD.mjs.map +0 -1
  324. package/dist/middy-DlWnZilH.cjs +0 -247
  325. package/dist/middy-DlWnZilH.cjs.map +0 -1
  326. package/dist/otel-B9bNoeZ2.mjs +0 -130
  327. package/dist/otel-B9bNoeZ2.mjs.map +0 -1
  328. package/dist/otel-Bk89b1lX.d.cts +0 -101
  329. package/dist/otel-Bk89b1lX.d.cts.map +0 -1
  330. package/dist/otel-BzjOtVxZ.cjs +0 -136
  331. package/dist/otel-BzjOtVxZ.cjs.map +0 -1
  332. package/dist/otel-lPMsM26e.d.mts +0 -101
  333. package/dist/otel-lPMsM26e.d.mts.map +0 -1
  334. package/dist/receiver-D46dfkYI.mjs +0 -89
  335. package/dist/receiver-D46dfkYI.mjs.map +0 -1
  336. package/dist/receiver-DLICx5uU.d.cts +0 -63
  337. package/dist/receiver-DLICx5uU.d.cts.map +0 -1
  338. package/dist/receiver-UeZT-H8u.d.mts +0 -63
  339. package/dist/receiver-UeZT-H8u.d.mts.map +0 -1
  340. package/dist/receiver-slCoAFat.cjs +0 -94
  341. package/dist/receiver-slCoAFat.cjs.map +0 -1
  342. package/dist/redact-BzkITCNW.mjs +0 -83
  343. package/dist/redact-BzkITCNW.mjs.map +0 -1
  344. package/dist/redact-DVaSSPZT.cjs +0 -95
  345. package/dist/redact-DVaSSPZT.cjs.map +0 -1
  346. package/dist/setup-Bkxm4g6b.d.mts +0 -87
  347. package/dist/setup-Bkxm4g6b.d.mts.map +0 -1
  348. package/dist/setup-D58N1f9O.d.cts +0 -87
  349. package/dist/setup-D58N1f9O.d.cts.map +0 -1
  350. package/dist/setup-DC9JMEYZ.mjs +0 -98
  351. package/dist/setup-DC9JMEYZ.mjs.map +0 -1
  352. package/dist/setup-DufxQpi9.cjs +0 -110
  353. package/dist/setup-DufxQpi9.cjs.map +0 -1
  354. package/dist/tracing-BX8uY2nR.d.cts +0 -53
  355. package/dist/tracing-BX8uY2nR.d.cts.map +0 -1
  356. package/dist/tracing-Bt1zWRlb.cjs +0 -167
  357. package/dist/tracing-Bt1zWRlb.cjs.map +0 -1
  358. package/dist/tracing-Cijm_5NI.mjs +0 -113
  359. package/dist/tracing-Cijm_5NI.mjs.map +0 -1
  360. package/dist/tracing-PnECEbEu.d.mts +0 -53
  361. package/dist/tracing-PnECEbEu.d.mts.map +0 -1
  362. package/dist/transformer-CFQ4WFk6.mjs +0 -215
  363. package/dist/transformer-CFQ4WFk6.mjs.map +0 -1
  364. package/dist/transformer-CTGsaVfV.d.mts.map +0 -1
  365. package/dist/transformer-Csl6fbgv.cjs +0 -232
  366. package/dist/transformer-Csl6fbgv.cjs.map +0 -1
  367. package/dist/transformer-ICEbxpFf.d.cts.map +0 -1
  368. package/dist/types-B1EIa_cQ.d.mts.map +0 -1
  369. package/dist/types-BMiHgsi4.cjs +0 -78
  370. package/dist/types-BMiHgsi4.cjs.map +0 -1
  371. package/dist/types-BRzW1NM8.d.cts +0 -166
  372. package/dist/types-BRzW1NM8.d.cts.map +0 -1
  373. package/dist/types-BS3Rx8Sk.d.cts +0 -209
  374. package/dist/types-BS3Rx8Sk.d.cts.map +0 -1
  375. package/dist/types-BzQ78Efw.d.mts +0 -166
  376. package/dist/types-BzQ78Efw.d.mts.map +0 -1
  377. package/dist/types-CbNGXnJE.d.mts +0 -209
  378. package/dist/types-CbNGXnJE.d.mts.map +0 -1
  379. package/dist/types-Cj59nqy7.mjs +0 -54
  380. package/dist/types-Cj59nqy7.mjs.map +0 -1
  381. package/dist/types-CmOB7CLO.d.cts.map +0 -1
  382. package/dist/types-DBc0q5KD.d.mts.map +0 -1
  383. package/dist/types-ZW-nfWf6.cjs +0 -40
  384. package/dist/types-ZW-nfWf6.cjs.map +0 -1
  385. package/dist/types-l7Rlb5Mg.d.cts.map +0 -1
  386. package/dist/types-ojhnLdwz.mjs +0 -34
  387. package/dist/types-ojhnLdwz.mjs.map +0 -1
  388. package/dist/ui-assets-BEXqOQLe.cjs +0 -48
  389. package/dist/ui-assets-BEXqOQLe.cjs.map +0 -1
  390. package/dist/ui-assets-BhTDUsrM.mjs +0 -30
  391. package/dist/ui-assets-BhTDUsrM.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hono.cjs","names":["_flushTelemetry: (() => Promise<void>) | null","telescope: Telescope","options: TelescopeMiddlewareOptions","c: Context","next: Next","headers: Record<string, string>","query: Record<string, string>","body: unknown","requestSize: number | undefined","responseHeaders: Record<string, string>","responseBody: unknown","responseSize: number | undefined","ctx: TelescopeHonoContext","Hono","app: Hono","upgradeWebSocket: (handler: any) => any","options: WebSocketOptions","_event: Event","ws: WebSocket","event: MessageEvent"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":";;;;;AAWA,IAAIA,kBAAgD;AACpD,eAAe,oBAAkD;AAChE,MAAK,iBAAiB;EACrB,MAAM,EAAE,gBAAgB,GAAG,2CAAM;AACjC,oBAAkB;CAClB;AACD,QAAO;AACP;AAED,MAAM,cAAc;;;;AAsBpB,SAAgB,iBACfC,WACAC,UAAsC,CAAE,GACpB;CACpB,MAAM,EAAE,kBAAkB,OAAO,GAAG;AAEpC,QAAO,OAAOC,GAAYC,SAAe;AACxC,OAAK,UAAU,QACd,QAAO,MAAM;AAGd,MAAI,UAAU,aAAa,EAAE,IAAI,KAAK,CACrC,QAAO,MAAM;EAGd,MAAM,YAAY,YAAY,KAAK;EAGnC,MAAMC,UAAkC,CAAE;AAC1C,IAAE,IAAI,IAAI,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACzC,WAAQ,OAAO;EACf,EAAC;EAEF,MAAM,MAAM,IAAI,IAAI,EAAE,IAAI;EAC1B,MAAMC,QAAgC,CAAE;AACxC,MAAI,aAAa,QAAQ,CAAC,OAAO,QAAQ;AACxC,SAAM,OAAO;EACb,EAAC;EAEF,IAAIC;EACJ,IAAIC;EAGJ,MAAM,gBAAgB,EAAE,IAAI,OAAO,iBAAiB;AACpD,MAAI,cACH,eAAc,SAAS,eAAe,GAAG;AAG1C,MACC,UAAU,cACV;GAAC;GAAQ;GAAO;EAAQ,EAAC,SAAS,EAAE,IAAI,OAAO,CAE/C,KAAI;GACH,MAAM,cAAc,EAAE,IAAI,OAAO,eAAe,IAAI;GAEpD,MAAM,gBAAgB,EAAE,IAAI,IAAI,OAAO;AACvC,OAAI,YAAY,SAAS,mBAAmB,CAC3C,QAAO,MAAM,cAAc,MAAM;YACvB,YAAY,SAAS,oCAAoC,CACnE,QAAO,OAAO,YAAY,CAAC,MAAM,cAAc,UAAU,EAAE,SAAS,CAAC;YAC3D,YAAY,SAAS,QAAQ,CACvC,QAAO,MAAM,cAAc,MAAM;EAElC,QAAO,CAEP;EAGF,MAAM,KAAK,EAAE,IAAI,OAAO,kBAAkB,IAAI,EAAE,IAAI,OAAO,YAAY;AAEvE,MAAI;AACH,SAAM,MAAM;GAGZ,MAAM,WAAW,YAAY,KAAK,GAAG;GAErC,MAAMC,kBAA0C,CAAE;AAClD,KAAE,IAAI,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACrC,oBAAgB,OAAO;GACvB,EAAC;GAEF,IAAIC;GACJ,IAAIC;GAGJ,MAAM,wBAAwB,EAAE,IAAI,QAAQ,IAAI,iBAAiB;AACjE,OAAI,sBACH,gBAAe,SAAS,uBAAuB,GAAG;AAGnD,OAAI,UAAU,WACb,KAAI;IACH,MAAM,cAAc,EAAE,IAAI,QAAQ,IAAI,eAAe,IAAI;AACzD,QAAI,YAAY,SAAS,mBAAmB,EAAE;KAC7C,MAAM,SAAS,EAAE,IAAI,OAAO;KAC5B,MAAM,OAAO,MAAM,OAAO,MAAM;AAChC,sBAAiB,OAAO,WAAW,MAAM,OAAO;AAChD,SAAI;AACH,qBAAe,KAAK,MAAM,KAAK;KAC/B,QAAO;AACP,qBAAe;KACf;IACD;GACD,QAAO,CAEP;GAGF,MAAM,YAAY,MAAM,UAAU,cAAc;IAC/C,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX;IACA;IACA;IACA,QAAQ,EAAE,IAAI;IACd;IACA;IACA;IACA;IACA;IACA;GACA,EAAC;GAGF,MAAMC,MAA4B;IACjC;IACA;GACA;AACD,KAAE,IAAI,aAAa,IAAI;AAGvB,OAAI,iBAAiB;IACpB,MAAM,iBAAiB,MAAM,mBAAmB;AAChD,UAAM,gBAAgB;GACtB;EACD,SAAQ,OAAO;AACf,SAAM,UAAU,UAAU,MAAe;AACzC,SAAM;EACN;CACD;AACD;;;;AAKD,SAAS,kBAAkBT,GAA0B;CACpD,MAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,QAAQ,IAAI,MAAM,GAAG;CACxD,MAAM,SAAS,SAAS,EAAE,IAAI,MAAM,SAAS,IAAI,KAAK,GAAG;CACzD,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS;CACpC,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS;CACpC,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ;CAClC,MAAM,OAAO,EAAE,IAAI,MAAM,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,QAAQ;CAC5D,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS;CACpC,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS;CACpC,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ;AAOlC,QAAO;EACN,OAAO,KAAK,IAAI,OAAO,IAAI;EAC3B;EACA;EACA,QAAQ,SAAS,IAAI,KAAK;EAC1B,OAAO,QAAQ,IAAI,KAAK;EACxB;EACA,QAAQ;EACR,QAAQ;EACR,OAAO;CACP;AACD;;;;AAKD,SAAS,yBAAyBA,GAAiC;CAClE,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ;CAClC,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM;CAC9B,MAAM,aAAa,EAAE,IAAI,MAAM,aAAa;CAC5C,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ;AAElC,QAAO;EACN,OACC,SAAS,MAAM;GAAE,OAAO,IAAI,KAAK;GAAQ,KAAK,IAAI,KAAK;EAAM;EAC9D,YAAY,aAAa,SAAS,YAAY,GAAG;EACjD,OAAO,QAAQ,SAAS,OAAO,GAAG;CAClC;AACD;;;;AAKD,SAAgB,SAASF,WAA4B;CACpD,MAAM,MAAM,IAAIY;AAGhB,KAAI,IAAI,iBAAiB,OAAO,MAAM;EACrC,MAAM,UAAU,kBAAkB,EAAE;EACpC,MAAM,WAAW,MAAM,UAAU,YAAY,QAAQ;AACrD,SAAO,EAAE,KAAK,SAAS;CACvB,EAAC;AAEF,KAAI,IAAI,qBAAqB,OAAO,MAAM;EACzC,MAAM,UAAU,MAAM,UAAU,WAAW,EAAE,IAAI,MAAM,KAAK,CAAC;AAC7D,OAAK,QACJ,QAAO,EAAE,KAAK,EAAE,OAAO,oBAAqB,GAAE,IAAI;AAEnD,SAAO,EAAE,KAAK,QAAQ;CACtB,EAAC;AAEF,KAAI,IAAI,mBAAmB,OAAO,MAAM;EACvC,MAAM,UAAU,kBAAkB,EAAE;EACpC,MAAM,aAAa,MAAM,UAAU,cAAc,QAAQ;AACzD,SAAO,EAAE,KAAK,WAAW;CACzB,EAAC;AAEF,KAAI,IAAI,uBAAuB,OAAO,MAAM;EAC3C,MAAM,YAAY,MAAM,UAAU,aAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AACjE,OAAK,UACJ,QAAO,EAAE,KAAK,EAAE,OAAO,sBAAuB,GAAE,IAAI;AAErD,SAAO,EAAE,KAAK,UAAU;CACxB,EAAC;AAEF,KAAI,IAAI,aAAa,OAAO,MAAM;EACjC,MAAM,UAAU,kBAAkB,EAAE;EACpC,MAAM,OAAO,MAAM,UAAU,QAAQ,QAAQ;AAC7C,SAAO,EAAE,KAAK,KAAK;CACnB,EAAC;AAEF,KAAI,IAAI,cAAc,OAAO,MAAM;EAClC,MAAM,QAAQ,MAAM,UAAU,UAAU;AACxC,SAAO,EAAE,KAAK,MAAM;CACpB,EAAC;AAGF,KAAI,IAAI,gBAAgB,CAAC,MAAM;EAC9B,MAAM,UAAU,yBAAyB,EAAE;EAC3C,MAAM,UAAU,UAAU,WAAW,QAAQ;AAC7C,SAAO,EAAE,KAAK,QAAQ;CACtB,EAAC;AAEF,KAAI,IAAI,0BAA0B,CAAC,MAAM;EACxC,MAAM,UAAU,yBAAyB,EAAE;EAC3C,MAAM,YAAY,UAAU,mBAAmB,QAAQ;AACvD,SAAO,EAAE,KAAK,UAAU;CACxB,EAAC;AAGF,KAAI,IAAI,yBAAyB,CAAC,MAAM;EACvC,MAAM,SAAS,EAAE,IAAI,MAAM,SAAS;EACpC,MAAM,OAAO,EAAE,IAAI,MAAM,OAAO;AAEhC,OAAK,WAAW,KACf,QAAO,EAAE,KAAK,EAAE,OAAO,+BAAgC,GAAE,IAAI;EAG9D,MAAM,UAAU,yBAAyB,EAAE;EAC3C,MAAM,UAAU,UAAU,mBAAmB,QAAQ,MAAM,QAAQ;AAEnE,OAAK,QACJ,QAAO,EAAE,KAAK,EAAE,OAAO,qBAAsB,GAAE,IAAI;AAGpD,SAAO,EAAE,KAAK,QAAQ;CACtB,EAAC;AAEF,KAAI,IAAI,uBAAuB,CAAC,MAAM;EACrC,MAAM,UAAU,yBAAyB,EAAE;EAC3C,MAAM,eAAe,UAAU,sBAAsB,QAAQ;AAC7D,SAAO,EAAE,KAAK,aAAa;CAC3B,EAAC;AAEF,KAAI,OAAO,gBAAgB,CAAC,MAAM;AACjC,YAAU,cAAc;AACxB,SAAO,EAAE,KAAK,EAAE,SAAS,KAAM,EAAC;CAChC,EAAC;AAGF,KAAI,IAAI,qBAAqB,CAAC,MAAM;EACnC,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW;EACxC,MAAM,aAAa,SAAS,SAAS;EACrC,MAAM,QAAQ,2BAAS,UAAU;AACjC,MAAI,MACH,QAAO,EAAE,KAAK,MAAM,SAAS,KAAK;GACjC,gBAAgB,MAAM;GACtB,iBAAiB;EACjB,EAAC;AAEH,SAAO,EAAE,UAAU;CACnB,EAAC;AAGF,KAAI,IAAI,KAAK,CAAC,MAAM;EACnB,MAAM,OAAO,gCAAc;AAC3B,OAAK,KACJ,QAAO,EAAE,KACR,4DACA,IACA;AAEF,SAAO,EAAE,KAAK,KAAK;CACnB,EAAC;AAEF,KAAI,IAAI,MAAM,CAAC,MAAM;EAEpB,MAAM,OAAO,gCAAc;AAC3B,OAAK,KACJ,QAAO,EAAE,KACR,4DACA,IACA;AAEF,SAAO,EAAE,KAAK,KAAK;CACnB,EAAC;AAEF,QAAO;AACP;;;;;AAoBD,SAAgB,eACfC,KACAb,WACAc,kBACAC,UAA4B,CAAE,GACvB;CACP,MAAM,EAAE,mBAAmB,MAAM,2BAA2B,KAAM,GAAG;AAGrE,KAAI,iBACH,WAAU,sBAAsB,yBAAyB;AAG1D,KAAI,IACH,OACA,iBAAiB,OAAO;EACvB,QAAQ,CAACC,QAAeC,OAAkB;AACzC,aAAU,YAAY,GAAG;EACzB;EACD,SAAS,CAACD,QAAeC,OAAkB;AAC1C,aAAU,eAAe,GAAG;EAC5B;EACD,WAAW,CAACC,OAAqBD,OAAkB;AAClD,OAAI;IACH,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK;AACnC,QAAI,KAAK,SAAS,OACjB,IAAG,KAAK,KAAK,UAAU,EAAE,MAAM,OAAQ,EAAC,CAAC;GAE1C,QAAO,CAEP;EACD;CACD,GAAE,CACH;AACD;;;;AAKD,SAAgB,oBACff,GACmC;AACnC,QAAO,EAAE,IAAI,YAAY;AACzB;;;;AAKD,SAAgB,aAAaA,GAAgC;AAC5D,QAAO,oBAAoB,EAAE,EAAE;AAC/B"}
1
+ {"version":3,"file":"hono.cjs","names":["Hono","getAsset","getIndexHtml"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
@@ -1,15 +1,12 @@
1
- import "../types-l7Rlb5Mg.cjs";
2
- import "../MetricsAggregator-4SqelGcG.cjs";
3
- import { Telescope } from "../Telescope-D4nmwDRA.cjs";
4
- import { HonoAdapterConfig, TelescopeHonoContext } from "../types-BRzW1NM8.cjs";
1
+ import { t as Telescope } from "../Telescope-DnCMZT7V.cjs";
2
+ import { HonoAdapterConfig, TelescopeHonoContext } from "../adapters/types.cjs";
5
3
  import { Context, Hono, MiddlewareHandler } from "hono";
6
-
7
4
  //#region src/server/hono.d.ts
8
5
  declare function getFlushTelemetry(): Promise<() => Promise<void>>;
9
6
  /**
10
7
  * Options for the Telescope Hono middleware
11
8
  */
12
- interface TelescopeMiddlewareOptions {
9
+ export interface TelescopeMiddlewareOptions {
13
10
  /**
14
11
  * Whether to flush telemetry after each request.
15
12
  * Enable this for serverless environments (Lambda, Edge).
@@ -20,15 +17,15 @@ interface TelescopeMiddlewareOptions {
20
17
  /**
21
18
  * Create Hono middleware that captures requests and responses
22
19
  */
23
- declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
20
+ export declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
24
21
  /**
25
22
  * Create Hono app with dashboard UI and API routes
26
23
  */
27
- declare function createUI(telescope: Telescope): Hono;
24
+ export declare function createUI(telescope: Telescope): Hono;
28
25
  /**
29
26
  * Options for setupWebSocket
30
27
  */
31
- interface WebSocketOptions {
28
+ export interface WebSocketOptions {
32
29
  /**
33
30
  * Enable real-time metrics broadcasting (default: true)
34
31
  */
@@ -42,15 +39,15 @@ interface WebSocketOptions {
42
39
  * Set up WebSocket routes for real-time updates.
43
40
  * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.
44
41
  */
45
- declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
42
+ export declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
46
43
  /**
47
44
  * Get the Telescope context from Hono context (set by middleware)
48
45
  */
49
- declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
46
+ export declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
50
47
  /**
51
48
  * Get the request ID from Hono context (set by middleware)
52
49
  */
53
- declare function getRequestId(c: Context): string | undefined;
50
+ export declare function getRequestId(c: Context): string | undefined;
54
51
  //#endregion
55
- export { HonoAdapterConfig, Telescope, TelescopeHonoContext, TelescopeMiddlewareOptions, WebSocketOptions, createMiddleware, createUI, getFlushTelemetry as getFlushTelemetryFn, getRequestId, getTelescopeContext, setupWebSocket };
52
+ export { type HonoAdapterConfig, type Telescope, type TelescopeHonoContext, getFlushTelemetry as getFlushTelemetryFn };
56
53
  //# sourceMappingURL=hono.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.d.cts","names":[],"sources":["../../src/server/hono.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAYe,iBAAA,CAAA,GAAqB,cAAc;;;AANJ;AAMd,UAkBf,0BAAA,CAlBe;EAAA;;AAAW;AAkB3C;AAYA;EAAgC,eAAA,CAAA,EAAA,OAAA;;;;AAGZ;AAsLJ,iBAzLA,gBAAA,CAyLQ,SAAA,EAxLZ,SAwLY,EAAA,OAAA,CAAA,EAvLd,0BAuLc,CAAA,EAtLrB,iBAsLqB;;;;AAA4B,iBAApC,QAAA,CAAoC,SAAA,EAAhB,SAAgB,CAAA,EAAJ,IAAI;AAkIpD;AAeA;;AACM,UAhBW,gBAAA,CAgBX;EAAI;;AAGqB;EAmCf,gBAAA,CAAA,EAAA,OAAmB;EAAA;;;EAEZ,wBAAA,CAAA,EAAA,MAAA;AAOvB;;;;;iBAhDgB,cAAA,MACV,iBACM,8DAEF;;;;iBAmCM,mBAAA,IACZ,UACD;;;;iBAOa,YAAA,IAAgB"}
1
+ {"version":3,"file":"hono.d.cts","names":[],"sources":["../../src/server/hono.ts"],"mappings":";;;;iBAYe,qBAAqB,cAAc;;;;iBAkBjC;;;;;;EAMhB;;;;;wBAMe,iBACf,WAAW,WACX,UAAS,6BACP;;;;wBAsLa,SAAS,WAAW,YAAY;;;;iBAkI/B;;;;EAIhB;;;;EAIA;;;;;;wBAOe,eACf,KAAK,MACL,WAAW,WACX,mBAAmB,sBACnB,UAAS;;;;wBAmCM,oBACf,GAAG,UACD;;;;wBAOa,aAAa,GAAG"}
@@ -1,15 +1,12 @@
1
- import "../types-B1EIa_cQ.mjs";
2
- import "../MetricsAggregator-DZrW8ls6.mjs";
3
- import { Telescope } from "../Telescope-Dl6VSfxd.mjs";
4
- import { HonoAdapterConfig, TelescopeHonoContext } from "../types-BzQ78Efw.mjs";
1
+ import { t as Telescope } from "../Telescope-BcrWTaar.mjs";
2
+ import { HonoAdapterConfig, TelescopeHonoContext } from "../adapters/types.mjs";
5
3
  import { Context, Hono, MiddlewareHandler } from "hono";
6
-
7
4
  //#region src/server/hono.d.ts
8
5
  declare function getFlushTelemetry(): Promise<() => Promise<void>>;
9
6
  /**
10
7
  * Options for the Telescope Hono middleware
11
8
  */
12
- interface TelescopeMiddlewareOptions {
9
+ export interface TelescopeMiddlewareOptions {
13
10
  /**
14
11
  * Whether to flush telemetry after each request.
15
12
  * Enable this for serverless environments (Lambda, Edge).
@@ -20,15 +17,15 @@ interface TelescopeMiddlewareOptions {
20
17
  /**
21
18
  * Create Hono middleware that captures requests and responses
22
19
  */
23
- declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
20
+ export declare function createMiddleware(telescope: Telescope, options?: TelescopeMiddlewareOptions): MiddlewareHandler;
24
21
  /**
25
22
  * Create Hono app with dashboard UI and API routes
26
23
  */
27
- declare function createUI(telescope: Telescope): Hono;
24
+ export declare function createUI(telescope: Telescope): Hono;
28
25
  /**
29
26
  * Options for setupWebSocket
30
27
  */
31
- interface WebSocketOptions {
28
+ export interface WebSocketOptions {
32
29
  /**
33
30
  * Enable real-time metrics broadcasting (default: true)
34
31
  */
@@ -42,15 +39,15 @@ interface WebSocketOptions {
42
39
  * Set up WebSocket routes for real-time updates.
43
40
  * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.
44
41
  */
45
- declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
42
+ export declare function setupWebSocket(app: Hono, telescope: Telescope, upgradeWebSocket: (handler: any) => any, options?: WebSocketOptions): void;
46
43
  /**
47
44
  * Get the Telescope context from Hono context (set by middleware)
48
45
  */
49
- declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
46
+ export declare function getTelescopeContext(c: Context): TelescopeHonoContext | undefined;
50
47
  /**
51
48
  * Get the request ID from Hono context (set by middleware)
52
49
  */
53
- declare function getRequestId(c: Context): string | undefined;
50
+ export declare function getRequestId(c: Context): string | undefined;
54
51
  //#endregion
55
- export { HonoAdapterConfig, Telescope, TelescopeHonoContext, TelescopeMiddlewareOptions, WebSocketOptions, createMiddleware, createUI, getFlushTelemetry as getFlushTelemetryFn, getRequestId, getTelescopeContext, setupWebSocket };
52
+ export { type HonoAdapterConfig, type Telescope, type TelescopeHonoContext, getFlushTelemetry as getFlushTelemetryFn };
56
53
  //# sourceMappingURL=hono.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.d.mts","names":[],"sources":["../../src/server/hono.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAYe,iBAAA,CAAA,GAAqB,cAAc;;;AANJ;AAMd,UAkBf,0BAAA,CAlBe;EAAA;;AAAW;AAkB3C;AAYA;EAAgC,eAAA,CAAA,EAAA,OAAA;;;;AAGZ;AAsLJ,iBAzLA,gBAAA,CAyLQ,SAAA,EAxLZ,SAwLY,EAAA,OAAA,CAAA,EAvLd,0BAuLc,CAAA,EAtLrB,iBAsLqB;;;;AAA4B,iBAApC,QAAA,CAAoC,SAAA,EAAhB,SAAgB,CAAA,EAAJ,IAAI;AAkIpD;AAeA;;AACM,UAhBW,gBAAA,CAgBX;EAAI;;AAGqB;EAmCf,gBAAA,CAAA,EAAA,OAAmB;EAAA;;;EAEZ,wBAAA,CAAA,EAAA,MAAA;AAOvB;;;;;iBAhDgB,cAAA,MACV,iBACM,8DAEF;;;;iBAmCM,mBAAA,IACZ,UACD;;;;iBAOa,YAAA,IAAgB"}
1
+ {"version":3,"file":"hono.d.mts","names":[],"sources":["../../src/server/hono.ts"],"mappings":";;;;iBAYe,qBAAqB,cAAc;;;;iBAkBjC;;;;;;EAMhB;;;;;wBAMe,iBACf,WAAW,WACX,UAAS,6BACP;;;;wBAsLa,SAAS,WAAW,YAAY;;;;iBAkI/B;;;;EAIhB;;;;EAIA;;;;;;wBAOe,eACf,KAAK,MACL,WAAW,WACX,mBAAmB,sBACnB,UAAS;;;;wBAmCM,oBACf,GAAG,UACD;;;;wBAOa,aAAa,GAAG"}
@@ -1,6 +1,5 @@
1
- import { getAsset, getIndexHtml } from "../ui-assets-BhTDUsrM.mjs";
1
+ import { getAsset, getIndexHtml } from "../ui-assets.mjs";
2
2
  import { Hono } from "hono";
3
-
4
3
  //#region src/server/hono.ts
5
4
  let _flushTelemetry = null;
6
5
  async function getFlushTelemetry() {
@@ -57,10 +56,8 @@ function createMiddleware(telescope, options = {}) {
57
56
  const responseContentLength = c.res.headers.get("content-length");
58
57
  if (responseContentLength) responseSize = parseInt(responseContentLength, 10);
59
58
  if (telescope.recordBody) try {
60
- const contentType = c.res.headers.get("content-type") || "";
61
- if (contentType.includes("application/json")) {
62
- const cloned = c.res.clone();
63
- const text = await cloned.text();
59
+ if ((c.res.headers.get("content-type") || "").includes("application/json")) {
60
+ const text = await c.res.clone().text();
64
61
  responseSize ??= Buffer.byteLength(text, "utf8");
65
62
  try {
66
63
  responseBody = JSON.parse(text);
@@ -69,30 +66,26 @@ function createMiddleware(telescope, options = {}) {
69
66
  }
70
67
  }
71
68
  } catch {}
72
- const requestId = await telescope.recordRequest({
73
- method: c.req.method,
74
- path: c.req.path,
75
- url: c.req.url,
76
- headers,
77
- body,
78
- query,
79
- status: c.res.status,
80
- responseHeaders,
81
- responseBody,
82
- duration,
83
- ip,
84
- requestSize,
85
- responseSize
86
- });
87
69
  const ctx = {
88
- requestId,
70
+ requestId: await telescope.recordRequest({
71
+ method: c.req.method,
72
+ path: c.req.path,
73
+ url: c.req.url,
74
+ headers,
75
+ body,
76
+ query,
77
+ status: c.res.status,
78
+ responseHeaders,
79
+ responseBody,
80
+ duration,
81
+ ip,
82
+ requestSize,
83
+ responseSize
84
+ }),
89
85
  startTime
90
86
  };
91
87
  c.set(CONTEXT_KEY, ctx);
92
- if (flushOnResponse) {
93
- const flushTelemetry = await getFlushTelemetry();
94
- await flushTelemetry();
95
- }
88
+ if (flushOnResponse) await (await getFlushTelemetry())();
96
89
  } catch (error) {
97
90
  await telescope.exception(error);
98
91
  throw error;
@@ -204,8 +197,7 @@ function createUI(telescope) {
204
197
  return c.json({ success: true });
205
198
  });
206
199
  app.get("/assets/:filename", (c) => {
207
- const filename = c.req.param("filename");
208
- const assetPath = `assets/${filename}`;
200
+ const assetPath = `assets/${c.req.param("filename")}`;
209
201
  const asset = getAsset(assetPath);
210
202
  if (asset) return c.body(asset.content, 200, {
211
203
  "Content-Type": asset.contentType,
@@ -241,8 +233,7 @@ function setupWebSocket(app, telescope, upgradeWebSocket, options = {}) {
241
233
  },
242
234
  onMessage: (event, ws) => {
243
235
  try {
244
- const data = JSON.parse(event.data);
245
- if (data.type === "ping") ws.send(JSON.stringify({ type: "pong" }));
236
+ if (JSON.parse(event.data).type === "ping") ws.send(JSON.stringify({ type: "pong" }));
246
237
  } catch {}
247
238
  }
248
239
  })));
@@ -259,7 +250,7 @@ function getTelescopeContext(c) {
259
250
  function getRequestId(c) {
260
251
  return getTelescopeContext(c)?.requestId;
261
252
  }
262
-
263
253
  //#endregion
264
254
  export { createMiddleware, createUI, getFlushTelemetry as getFlushTelemetryFn, getRequestId, getTelescopeContext, setupWebSocket };
255
+
265
256
  //# sourceMappingURL=hono.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.mjs","names":["_flushTelemetry: (() => Promise<void>) | null","telescope: Telescope","options: TelescopeMiddlewareOptions","c: Context","next: Next","headers: Record<string, string>","query: Record<string, string>","body: unknown","requestSize: number | undefined","responseHeaders: Record<string, string>","responseBody: unknown","responseSize: number | undefined","ctx: TelescopeHonoContext","app: Hono","upgradeWebSocket: (handler: any) => any","options: WebSocketOptions","_event: Event","ws: WebSocket","event: MessageEvent"],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
1
+ {"version":3,"file":"hono.mjs","names":[],"sources":["../../src/server/hono.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport { Hono } from 'hono';\nimport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\nimport type { Telescope } from '../Telescope';\nimport type { MetricsQueryOptions, QueryOptions } from '../types';\nimport { getAsset, getIndexHtml } from '../ui-assets';\n\n// Lazy-loaded telemetry flush function (only loads @opentelemetry/* when actually used)\nlet _flushTelemetry: (() => Promise<void>) | null = null;\nasync function getFlushTelemetry(): Promise<() => Promise<void>> {\n\tif (!_flushTelemetry) {\n\t\tconst { flushTelemetry } = await import('../instrumentation/core');\n\t\t_flushTelemetry = flushTelemetry;\n\t}\n\treturn _flushTelemetry;\n}\n\nconst CONTEXT_KEY = 'telescope-context';\n\n/** Default Hono adapter configuration */\nconst _DEFAULT_CONFIG: HonoAdapterConfig = {\n\tenvironment: 'server',\n};\n\n/**\n * Options for the Telescope Hono middleware\n */\nexport interface TelescopeMiddlewareOptions {\n\t/**\n\t * Whether to flush telemetry after each request.\n\t * Enable this for serverless environments (Lambda, Edge).\n\t * @default false\n\t */\n\tflushOnResponse?: boolean;\n}\n\n/**\n * Create Hono middleware that captures requests and responses\n */\nexport function createMiddleware(\n\ttelescope: Telescope,\n\toptions: TelescopeMiddlewareOptions = {},\n): MiddlewareHandler {\n\tconst { flushOnResponse = false } = options;\n\n\treturn async (c: Context, next: Next) => {\n\t\tif (!telescope.enabled) {\n\t\t\treturn next();\n\t\t}\n\n\t\tif (telescope.shouldIgnore(c.req.path)) {\n\t\t\treturn next();\n\t\t}\n\n\t\tconst startTime = performance.now();\n\n\t\t// Capture request data\n\t\tconst headers: Record<string, string> = {};\n\t\tc.req.raw.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tconst url = new URL(c.req.url);\n\t\tconst query: Record<string, string> = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tquery[key] = value;\n\t\t});\n\n\t\tlet body: unknown;\n\t\tlet requestSize: number | undefined;\n\n\t\t// Get request size from Content-Length header\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength) {\n\t\t\trequestSize = parseInt(contentLength, 10);\n\t\t}\n\n\t\tif (\n\t\t\ttelescope.recordBody &&\n\t\t\t['POST', 'PUT', 'PATCH'].includes(c.req.method)\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst contentType = c.req.header('content-type') || '';\n\t\t\t\t// Clone the request to avoid consuming the body stream\n\t\t\t\tconst clonedRequest = c.req.raw.clone();\n\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\tbody = await clonedRequest.json();\n\t\t\t\t} else if (contentType.includes('application/x-www-form-urlencoded')) {\n\t\t\t\t\tbody = Object.fromEntries((await clonedRequest.formData()).entries());\n\t\t\t\t} else if (contentType.includes('text/')) {\n\t\t\t\t\tbody = await clonedRequest.text();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore body parsing errors\n\t\t\t}\n\t\t}\n\n\t\tconst ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip');\n\n\t\ttry {\n\t\t\tawait next();\n\n\t\t\t// Capture response data\n\t\t\tconst duration = performance.now() - startTime;\n\n\t\t\tconst responseHeaders: Record<string, string> = {};\n\t\t\tc.res.headers.forEach((value, key) => {\n\t\t\t\tresponseHeaders[key] = value;\n\t\t\t});\n\n\t\t\tlet responseBody: unknown;\n\t\t\tlet responseSize: number | undefined;\n\n\t\t\t// Get response size - prefer Content-Length header, fallback to body size\n\t\t\tconst responseContentLength = c.res.headers.get('content-length');\n\t\t\tif (responseContentLength) {\n\t\t\t\tresponseSize = parseInt(responseContentLength, 10);\n\t\t\t}\n\n\t\t\tif (telescope.recordBody) {\n\t\t\t\ttry {\n\t\t\t\t\tconst contentType = c.res.headers.get('content-type') || '';\n\t\t\t\t\tif (contentType.includes('application/json')) {\n\t\t\t\t\t\tconst cloned = c.res.clone();\n\t\t\t\t\t\tconst text = await cloned.text();\n\t\t\t\t\t\tresponseSize ??= Buffer.byteLength(text, 'utf8');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponseBody = JSON.parse(text);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tresponseBody = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore body parsing errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst requestId = await telescope.recordRequest({\n\t\t\t\tmethod: c.req.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t\turl: c.req.url,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t\tstatus: c.res.status,\n\t\t\t\tresponseHeaders,\n\t\t\t\tresponseBody,\n\t\t\t\tduration,\n\t\t\t\tip,\n\t\t\t\trequestSize,\n\t\t\t\tresponseSize,\n\t\t\t});\n\n\t\t\t// Store context for access by other middleware\n\t\t\tconst ctx: TelescopeHonoContext = {\n\t\t\t\trequestId,\n\t\t\t\tstartTime,\n\t\t\t};\n\t\t\tc.set(CONTEXT_KEY, ctx);\n\n\t\t\t// Flush telemetry for serverless environments\n\t\t\tif (flushOnResponse) {\n\t\t\t\tconst flushTelemetry = await getFlushTelemetry();\n\t\t\t\tawait flushTelemetry();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait telescope.exception(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t};\n}\n\n/**\n * Parse query options from Hono context\n */\nfunction parseQueryOptions(c: Context): QueryOptions {\n\tconst limit = parseInt(c.req.query('limit') || '50', 10);\n\tconst offset = parseInt(c.req.query('offset') || '0', 10);\n\tconst search = c.req.query('search');\n\tconst before = c.req.query('before');\n\tconst after = c.req.query('after');\n\tconst tags = c.req.query('tags')?.split(',').filter(Boolean);\n\tconst method = c.req.query('method');\n\tconst status = c.req.query('status');\n\tconst level = c.req.query('level') as\n\t\t| 'debug'\n\t\t| 'info'\n\t\t| 'warn'\n\t\t| 'error'\n\t\t| undefined;\n\n\treturn {\n\t\tlimit: Math.min(limit, 100),\n\t\toffset,\n\t\tsearch,\n\t\tbefore: before ? new Date(before) : undefined,\n\t\tafter: after ? new Date(after) : undefined,\n\t\ttags,\n\t\tmethod: method || undefined,\n\t\tstatus: status || undefined,\n\t\tlevel: level || undefined,\n\t};\n}\n\n/**\n * Parse metrics query options from Hono context\n */\nfunction parseMetricsQueryOptions(c: Context): MetricsQueryOptions {\n\tconst start = c.req.query('start');\n\tconst end = c.req.query('end');\n\tconst bucketSize = c.req.query('bucketSize');\n\tconst limit = c.req.query('limit');\n\n\treturn {\n\t\trange:\n\t\t\tstart && end ? { start: new Date(start), end: new Date(end) } : undefined,\n\t\tbucketSize: bucketSize ? parseInt(bucketSize, 10) : undefined,\n\t\tlimit: limit ? parseInt(limit, 10) : undefined,\n\t};\n}\n\n/**\n * Create Hono app with dashboard UI and API routes\n */\nexport function createUI(telescope: Telescope): Hono {\n\tconst app = new Hono();\n\n\t// API routes\n\tapp.get('/api/requests', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst requests = await telescope.getRequests(options);\n\t\treturn c.json(requests);\n\t});\n\n\tapp.get('/api/requests/:id', async (c) => {\n\t\tconst request = await telescope.getRequest(c.req.param('id'));\n\t\tif (!request) {\n\t\t\treturn c.json({ error: 'Request not found' }, 404);\n\t\t}\n\t\treturn c.json(request);\n\t});\n\n\tapp.get('/api/exceptions', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst exceptions = await telescope.getExceptions(options);\n\t\treturn c.json(exceptions);\n\t});\n\n\tapp.get('/api/exceptions/:id', async (c) => {\n\t\tconst exception = await telescope.getException(c.req.param('id'));\n\t\tif (!exception) {\n\t\t\treturn c.json({ error: 'Exception not found' }, 404);\n\t\t}\n\t\treturn c.json(exception);\n\t});\n\n\tapp.get('/api/logs', async (c) => {\n\t\tconst options = parseQueryOptions(c);\n\t\tconst logs = await telescope.getLogs(options);\n\t\treturn c.json(logs);\n\t});\n\n\tapp.get('/api/stats', async (c) => {\n\t\tconst stats = await telescope.getStats();\n\t\treturn c.json(stats);\n\t});\n\n\t// Metrics API\n\tapp.get('/api/metrics', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst metrics = telescope.getMetrics(options);\n\t\treturn c.json(metrics);\n\t});\n\n\tapp.get('/api/metrics/endpoints', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst endpoints = telescope.getEndpointMetrics(options);\n\t\treturn c.json(endpoints);\n\t});\n\n\t// Endpoint details - method and path are query params to avoid URL encoding issues\n\tapp.get('/api/metrics/endpoint', (c) => {\n\t\tconst method = c.req.query('method');\n\t\tconst path = c.req.query('path');\n\n\t\tif (!method || !path) {\n\t\t\treturn c.json({ error: 'method and path are required' }, 400);\n\t\t}\n\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst details = telescope.getEndpointDetails(method, path, options);\n\n\t\tif (!details) {\n\t\t\treturn c.json({ error: 'Endpoint not found' }, 404);\n\t\t}\n\n\t\treturn c.json(details);\n\t});\n\n\tapp.get('/api/metrics/status', (c) => {\n\t\tconst options = parseMetricsQueryOptions(c);\n\t\tconst distribution = telescope.getStatusDistribution(options);\n\t\treturn c.json(distribution);\n\t});\n\n\tapp.delete('/api/metrics', (c) => {\n\t\ttelescope.resetMetrics();\n\t\treturn c.json({ success: true });\n\t});\n\n\t// Static assets\n\tapp.get('/assets/:filename', (c) => {\n\t\tconst filename = c.req.param('filename');\n\t\tconst assetPath = `assets/${filename}`;\n\t\tconst asset = getAsset(assetPath);\n\t\tif (asset) {\n\t\t\treturn c.body(asset.content, 200, {\n\t\t\t\t'Content-Type': asset.contentType,\n\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t});\n\t\t}\n\t\treturn c.notFound();\n\t});\n\n\t// Dashboard UI - serve React app\n\tapp.get('/', (c) => {\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\tapp.get('/*', (c) => {\n\t\t// SPA fallback - serve index.html for client-side routing\n\t\tconst html = getIndexHtml();\n\t\tif (!html) {\n\t\t\treturn c.text(\n\t\t\t\t'Telescope UI not available. Run \"pnpm build:ui\" first.',\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t\treturn c.html(html);\n\t});\n\n\treturn app;\n}\n\n/**\n * Options for setupWebSocket\n */\nexport interface WebSocketOptions {\n\t/**\n\t * Enable real-time metrics broadcasting (default: true)\n\t */\n\tbroadcastMetrics?: boolean;\n\t/**\n\t * Metrics broadcast interval in milliseconds (default: 5000)\n\t */\n\tmetricsBroadcastInterval?: number;\n}\n\n/**\n * Set up WebSocket routes for real-time updates.\n * Requires @hono/node-ws for Node.js or Bun's built-in WebSocket.\n */\nexport function setupWebSocket(\n\tapp: Hono,\n\ttelescope: Telescope,\n\tupgradeWebSocket: (handler: any) => any,\n\toptions: WebSocketOptions = {},\n): void {\n\tconst { broadcastMetrics = true, metricsBroadcastInterval = 5000 } = options;\n\n\t// Start metrics broadcast if enabled\n\tif (broadcastMetrics) {\n\t\ttelescope.startMetricsBroadcast(metricsBroadcastInterval);\n\t}\n\n\tapp.get(\n\t\t'/ws',\n\t\tupgradeWebSocket(() => ({\n\t\t\tonOpen: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.addWsClient(ws);\n\t\t\t},\n\t\t\tonClose: (_event: Event, ws: WebSocket) => {\n\t\t\t\ttelescope.removeWsClient(ws);\n\t\t\t},\n\t\t\tonMessage: (event: MessageEvent, ws: WebSocket) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'ping') {\n\t\t\t\t\t\tws.send(JSON.stringify({ type: 'pong' }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore invalid messages\n\t\t\t\t}\n\t\t\t},\n\t\t})),\n\t);\n}\n\n/**\n * Get the Telescope context from Hono context (set by middleware)\n */\nexport function getTelescopeContext(\n\tc: Context,\n): TelescopeHonoContext | undefined {\n\treturn c.get(CONTEXT_KEY);\n}\n\n/**\n * Get the request ID from Hono context (set by middleware)\n */\nexport function getRequestId(c: Context): string | undefined {\n\treturn getTelescopeContext(c)?.requestId;\n}\n\n// Re-export types and utilities\nexport type { Telescope };\nexport type {\n\tHonoAdapterConfig,\n\tTelescopeHonoContext,\n} from '../adapters/types';\n\n/**\n * Get the flushTelemetry function (lazy-loaded to avoid requiring @opentelemetry/* at import time).\n * Use this for serverless environments where you need to flush telemetry before the process freezes.\n *\n * @example\n * ```typescript\n * const flushTelemetry = await getFlushTelemetryFn();\n * await flushTelemetry();\n * ```\n */\nexport { getFlushTelemetry as getFlushTelemetryFn };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/storage/kysely.ts
3
3
  /**
4
4
  * Kysely-based storage implementation for Telescope.
@@ -55,16 +55,14 @@ var KyselyStorage = class {
55
55
  if (statusFilter.endsWith("xx")) {
56
56
  const firstChar = statusFilter[0];
57
57
  if (firstChar) {
58
- const category = parseInt(firstChar, 10);
59
- const minStatus = category * 100;
58
+ const minStatus = parseInt(firstChar, 10) * 100;
60
59
  const maxStatus = minStatus + 99;
61
60
  query = query.where("status", ">=", minStatus).where("status", "<=", maxStatus);
62
61
  }
63
62
  } else query = query.where("status", "=", parseInt(statusFilter, 10));
64
63
  }
65
- query = this.applyQueryOptions(query, options);
66
- const rows = await query.execute();
67
- return rows.map((row) => this.rowToRequest(row));
64
+ query = this.applyQueryOptions(query, options, ["path", "url"]);
65
+ return (await query.execute()).map((row) => this.rowToRequest(row));
68
66
  }
69
67
  async getRequest(id) {
70
68
  const row = await this.db.selectFrom(this.requestsTable).selectAll().where("id", "=", id).executeTakeFirst();
@@ -81,9 +79,8 @@ var KyselyStorage = class {
81
79
  }
82
80
  async getExceptions(options) {
83
81
  let query = this.db.selectFrom(this.exceptionsTable).selectAll().orderBy("timestamp", "desc");
84
- query = this.applyQueryOptions(query, options);
85
- const rows = await query.execute();
86
- return rows.map((row) => this.rowToException(row));
82
+ query = this.applyQueryOptions(query, options, ["name", "message"]);
83
+ return (await query.execute()).map((row) => this.rowToException(row));
87
84
  }
88
85
  async getException(id) {
89
86
  const row = await this.db.selectFrom(this.exceptionsTable).selectAll().where("id", "=", id).executeTakeFirst();
@@ -101,17 +98,15 @@ var KyselyStorage = class {
101
98
  async getLogs(options) {
102
99
  let query = this.db.selectFrom(this.logsTable).selectAll().orderBy("timestamp", "desc");
103
100
  if (options?.level) query = query.where("level", "=", options.level);
104
- query = this.applyQueryOptions(query, options);
105
- const rows = await query.execute();
106
- return rows.map((row) => this.rowToLog(row));
101
+ query = this.applyQueryOptions(query, options, ["message"]);
102
+ return (await query.execute()).map((row) => this.rowToLog(row));
107
103
  }
108
104
  async prune(olderThan) {
109
- const results = await Promise.all([
105
+ return (await Promise.all([
110
106
  this.db.deleteFrom(this.requestsTable).where("timestamp", "<", olderThan).executeTakeFirst(),
111
107
  this.db.deleteFrom(this.exceptionsTable).where("timestamp", "<", olderThan).executeTakeFirst(),
112
108
  this.db.deleteFrom(this.logsTable).where("timestamp", "<", olderThan).executeTakeFirst()
113
- ]);
114
- return results.reduce((sum, result) => sum + Number(result.numDeletedRows ?? 0), 0);
109
+ ])).reduce((sum, result) => sum + Number(result.numDeletedRows ?? 0), 0);
115
110
  }
116
111
  async getStats() {
117
112
  const [requestsResult, exceptionsResult, logsResult] = await Promise.all([
@@ -148,15 +143,11 @@ var KyselyStorage = class {
148
143
  newestEntry: newestDate ? new Date(newestDate) : void 0
149
144
  };
150
145
  }
151
- applyQueryOptions(query, options) {
146
+ applyQueryOptions(query, options, searchColumns) {
152
147
  if (!options) return query.limit(50);
153
148
  if (options.after) query = query.where("timestamp", ">=", options.after);
154
149
  if (options.before) query = query.where("timestamp", "<=", options.before);
155
- if (options.search) query = query.where((eb) => eb.or([
156
- eb("message", "ilike", `%${options.search}%`),
157
- eb("path", "ilike", `%${options.search}%`),
158
- eb("url", "ilike", `%${options.search}%`)
159
- ]));
150
+ if (options.search) query = query.where((eb) => eb.or(searchColumns.map((column) => eb(column, "ilike", `%${options.search}%`))));
160
151
  const limit = options.limit ?? 50;
161
152
  const offset = options.offset ?? 0;
162
153
  return query.limit(limit).offset(offset);
@@ -167,17 +158,17 @@ var KyselyStorage = class {
167
158
  method: entry.method,
168
159
  path: entry.path,
169
160
  url: entry.url,
170
- headers: entry.headers,
171
- body: entry.body ?? null,
172
- query: entry.query ?? null,
161
+ headers: toJson(entry.headers),
162
+ body: toJson(entry.body),
163
+ query: toJson(entry.query),
173
164
  status: entry.status,
174
- response_headers: entry.responseHeaders,
175
- response_body: entry.responseBody ?? null,
165
+ response_headers: toJson(entry.responseHeaders),
166
+ response_body: toJson(entry.responseBody),
176
167
  duration: entry.duration,
177
168
  timestamp: entry.timestamp,
178
169
  ip: entry.ip ?? null,
179
170
  user_id: entry.userId ?? null,
180
- tags: entry.tags ?? null
171
+ tags: toJson(entry.tags)
181
172
  };
182
173
  }
183
174
  rowToRequest(row) {
@@ -204,12 +195,12 @@ var KyselyStorage = class {
204
195
  id: entry.id,
205
196
  name: entry.name,
206
197
  message: entry.message,
207
- stack: entry.stack,
208
- source: entry.source ?? null,
198
+ stack: toJson(entry.stack),
199
+ source: toJson(entry.source),
209
200
  request_id: entry.requestId ?? null,
210
201
  timestamp: entry.timestamp,
211
202
  handled: entry.handled,
212
- tags: entry.tags ?? null
203
+ tags: toJson(entry.tags)
213
204
  };
214
205
  }
215
206
  rowToException(row) {
@@ -230,7 +221,7 @@ var KyselyStorage = class {
230
221
  id: entry.id,
231
222
  level: entry.level,
232
223
  message: entry.message,
233
- context: entry.context ?? null,
224
+ context: toJson(entry.context),
234
225
  request_id: entry.requestId ?? null,
235
226
  timestamp: entry.timestamp
236
227
  };
@@ -259,6 +250,17 @@ var KyselyStorage = class {
259
250
  }
260
251
  };
261
252
  /**
253
+ * A value for a JSON column, as JSON text.
254
+ *
255
+ * Handed an object, node-postgres writes JSON; handed an array it writes a
256
+ * Postgres array literal (`{1,2}`), which a `jsonb` column rejects — so every
257
+ * exception (its stack is an array) failed to save. Serialising here makes
258
+ * the column's type the only thing that decides.
259
+ */
260
+ function toJson(value) {
261
+ return value === void 0 || value === null ? null : JSON.stringify(value);
262
+ }
263
+ /**
262
264
  * SQL migration to create telescope's tables.
263
265
  *
264
266
  * Pass a schema to have them created in one, and to have `down` drop the whole
@@ -354,8 +356,8 @@ DROP TABLE IF EXISTS requests;
354
356
  `
355
357
  };
356
358
  }
357
-
358
359
  //#endregion
359
360
  exports.KyselyStorage = KyselyStorage;
360
361
  exports.getTelescopeMigration = getTelescopeMigration;
362
+
361
363
  //# sourceMappingURL=kysely.cjs.map