apitally 0.25.8 → 1.0.0-beta.1

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 (555) hide show
  1. package/README.md +228 -178
  2. package/dist/activation.cjs +393 -0
  3. package/dist/activation.cjs.map +1 -0
  4. package/dist/activation.d.cts +42 -0
  5. package/dist/activation.d.ts +42 -0
  6. package/dist/activation.js +383 -0
  7. package/dist/activation.js.map +1 -0
  8. package/dist/adonisjs/configure.cjs +86 -30
  9. package/dist/adonisjs/configure.cjs.map +1 -1
  10. package/dist/adonisjs/configure.d.cts +0 -4
  11. package/dist/adonisjs/configure.d.ts +0 -4
  12. package/dist/adonisjs/configure.js +83 -29
  13. package/dist/adonisjs/configure.js.map +1 -1
  14. package/dist/adonisjs/index.cjs +38 -21
  15. package/dist/adonisjs/index.cjs.map +1 -1
  16. package/dist/adonisjs/index.d.cts +5 -14
  17. package/dist/adonisjs/index.d.ts +5 -14
  18. package/dist/adonisjs/index.js +39 -18
  19. package/dist/adonisjs/index.js.map +1 -1
  20. package/dist/adonisjs/middleware.cjs +43 -109
  21. package/dist/adonisjs/middleware.cjs.map +1 -1
  22. package/dist/adonisjs/middleware.d.cts +1 -16
  23. package/dist/adonisjs/middleware.d.ts +1 -16
  24. package/dist/adonisjs/middleware.js +43 -110
  25. package/dist/adonisjs/middleware.js.map +1 -1
  26. package/dist/adonisjs/provider.cjs +19 -87
  27. package/dist/adonisjs/provider.cjs.map +1 -1
  28. package/dist/adonisjs/provider.d.cts +0 -22
  29. package/dist/adonisjs/provider.d.ts +0 -22
  30. package/dist/adonisjs/provider.js +19 -88
  31. package/dist/adonisjs/provider.js.map +1 -1
  32. package/dist/adonisjs/stubs/config/apitally.stub +11 -15
  33. package/dist/bodyCapture.cjs +128 -0
  34. package/dist/bodyCapture.cjs.map +1 -0
  35. package/dist/bodyCapture.d.cts +31 -0
  36. package/dist/bodyCapture.d.ts +31 -0
  37. package/dist/bodyCapture.js +101 -0
  38. package/dist/bodyCapture.js.map +1 -0
  39. package/dist/config.cjs +227 -0
  40. package/dist/config.cjs.map +1 -0
  41. package/dist/config.d.cts +45 -0
  42. package/dist/config.d.ts +45 -0
  43. package/dist/config.js +192 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/consumer.cjs +98 -0
  46. package/dist/consumer.cjs.map +1 -0
  47. package/dist/consumer.d.cts +15 -0
  48. package/dist/consumer.d.ts +15 -0
  49. package/dist/consumer.js +78 -0
  50. package/dist/consumer.js.map +1 -0
  51. package/dist/context.cjs +68 -0
  52. package/dist/context.cjs.map +1 -0
  53. package/dist/context.d.cts +33 -0
  54. package/dist/context.d.ts +33 -0
  55. package/dist/context.js +40 -0
  56. package/dist/context.js.map +1 -0
  57. package/dist/elysia/index.cjs +12 -3
  58. package/dist/elysia/index.cjs.map +1 -1
  59. package/dist/elysia/index.d.cts +8 -16
  60. package/dist/elysia/index.d.ts +8 -16
  61. package/dist/elysia/index.js +10 -2
  62. package/dist/elysia/index.js.map +1 -1
  63. package/dist/elysia/middleware.cjs +261 -0
  64. package/dist/elysia/middleware.cjs.map +1 -0
  65. package/dist/elysia/middleware.d.cts +14 -0
  66. package/dist/elysia/middleware.d.ts +14 -0
  67. package/dist/elysia/middleware.js +250 -0
  68. package/dist/elysia/middleware.js.map +1 -0
  69. package/dist/{otel/index.cjs → elysia/routes.cjs} +16 -7
  70. package/dist/elysia/routes.cjs.map +1 -0
  71. package/dist/elysia/routes.d.cts +7 -0
  72. package/dist/elysia/routes.d.ts +7 -0
  73. package/dist/elysia/routes.js +14 -0
  74. package/dist/elysia/routes.js.map +1 -0
  75. package/dist/exceptions.cjs +81 -0
  76. package/dist/exceptions.cjs.map +1 -0
  77. package/dist/exceptions.d.cts +7 -0
  78. package/dist/exceptions.d.ts +7 -0
  79. package/dist/exceptions.js +55 -0
  80. package/dist/exceptions.js.map +1 -0
  81. package/dist/exportSerialization.cjs +56 -0
  82. package/dist/exportSerialization.cjs.map +1 -0
  83. package/dist/exportSerialization.d.cts +7 -0
  84. package/dist/exportSerialization.d.ts +7 -0
  85. package/dist/exportSerialization.js +32 -0
  86. package/dist/exportSerialization.js.map +1 -0
  87. package/dist/exportWorker.cjs +305 -0
  88. package/dist/exportWorker.cjs.map +1 -0
  89. package/dist/exportWorker.d.cts +46 -0
  90. package/dist/exportWorker.d.ts +46 -0
  91. package/dist/exportWorker.js +279 -0
  92. package/dist/exportWorker.js.map +1 -0
  93. package/dist/express/index.cjs +9 -4
  94. package/dist/express/index.cjs.map +1 -1
  95. package/dist/express/index.d.cts +7 -10
  96. package/dist/express/index.d.ts +7 -10
  97. package/dist/express/index.js +8 -2
  98. package/dist/express/index.js.map +1 -1
  99. package/dist/express/install.cjs +45 -0
  100. package/dist/express/install.cjs.map +1 -0
  101. package/dist/express/install.d.cts +10 -0
  102. package/dist/express/install.d.ts +10 -0
  103. package/dist/express/install.js +21 -0
  104. package/dist/express/install.js.map +1 -0
  105. package/dist/express/middleware.cjs +87 -331
  106. package/dist/express/middleware.cjs.map +1 -1
  107. package/dist/express/middleware.d.cts +3 -21
  108. package/dist/express/middleware.d.ts +3 -21
  109. package/dist/express/middleware.js +91 -327
  110. package/dist/express/middleware.js.map +1 -1
  111. package/dist/express/register.cjs +20 -0
  112. package/dist/express/register.cjs.map +1 -0
  113. package/dist/express/register.d.cts +2 -0
  114. package/dist/express/register.d.ts +2 -0
  115. package/dist/express/register.js +19 -0
  116. package/dist/express/register.js.map +1 -0
  117. package/dist/express/routes.cjs +429 -0
  118. package/dist/express/routes.cjs.map +1 -0
  119. package/dist/express/routes.d.cts +14 -0
  120. package/dist/express/routes.d.ts +14 -0
  121. package/dist/express/routes.js +401 -0
  122. package/dist/express/routes.js.map +1 -0
  123. package/dist/fastify/index.cjs +10 -5
  124. package/dist/fastify/index.cjs.map +1 -1
  125. package/dist/fastify/index.d.cts +7 -11
  126. package/dist/fastify/index.d.ts +7 -11
  127. package/dist/fastify/index.js +9 -3
  128. package/dist/fastify/index.js.map +1 -1
  129. package/dist/{loggers/index.cjs → fastify/install.cjs} +17 -19
  130. package/dist/fastify/install.cjs.map +1 -0
  131. package/dist/fastify/install.d.cts +10 -0
  132. package/dist/fastify/install.d.ts +10 -0
  133. package/dist/fastify/install.js +15 -0
  134. package/dist/fastify/install.js.map +1 -0
  135. package/dist/fastify/middleware.cjs +135 -0
  136. package/dist/fastify/middleware.cjs.map +1 -0
  137. package/dist/fastify/middleware.d.cts +7 -0
  138. package/dist/fastify/middleware.d.ts +7 -0
  139. package/dist/fastify/middleware.js +114 -0
  140. package/dist/fastify/middleware.js.map +1 -0
  141. package/dist/{common/paramValidation.cjs → fastify/routes.cjs} +15 -17
  142. package/dist/fastify/routes.cjs.map +1 -0
  143. package/dist/fastify/routes.d.cts +8 -0
  144. package/dist/fastify/routes.d.ts +8 -0
  145. package/dist/fastify/routes.js +14 -0
  146. package/dist/fastify/routes.js.map +1 -0
  147. package/dist/h3/index.cjs +28 -4
  148. package/dist/h3/index.cjs.map +1 -1
  149. package/dist/h3/index.d.cts +8 -10
  150. package/dist/h3/index.d.ts +8 -10
  151. package/dist/h3/index.js +26 -2
  152. package/dist/h3/index.js.map +1 -1
  153. package/dist/h3/middleware.cjs +210 -0
  154. package/dist/h3/middleware.cjs.map +1 -0
  155. package/dist/h3/middleware.d.cts +5 -0
  156. package/dist/h3/middleware.d.ts +5 -0
  157. package/dist/h3/middleware.js +194 -0
  158. package/dist/h3/middleware.js.map +1 -0
  159. package/dist/h3/routes.cjs +66 -0
  160. package/dist/h3/routes.cjs.map +1 -0
  161. package/dist/h3/routes.d.cts +8 -0
  162. package/dist/h3/routes.d.ts +8 -0
  163. package/dist/h3/routes.js +41 -0
  164. package/dist/h3/routes.js.map +1 -0
  165. package/dist/hapi/index.cjs +15 -4
  166. package/dist/hapi/index.cjs.map +1 -1
  167. package/dist/hapi/index.d.cts +8 -10
  168. package/dist/hapi/index.d.ts +8 -10
  169. package/dist/hapi/index.js +13 -2
  170. package/dist/hapi/index.js.map +1 -1
  171. package/dist/{loggers/hapi.cjs → hapi/install.cjs} +20 -26
  172. package/dist/hapi/install.cjs.map +1 -0
  173. package/dist/hapi/install.d.cts +8 -0
  174. package/dist/hapi/install.d.ts +8 -0
  175. package/dist/hapi/install.js +22 -0
  176. package/dist/hapi/install.js.map +1 -0
  177. package/dist/hapi/middleware.cjs +158 -0
  178. package/dist/hapi/middleware.cjs.map +1 -0
  179. package/dist/hapi/middleware.d.cts +5 -0
  180. package/dist/hapi/middleware.d.ts +5 -0
  181. package/dist/hapi/middleware.js +137 -0
  182. package/dist/hapi/middleware.js.map +1 -0
  183. package/dist/{common/logging.cjs → hapi/routes.cjs} +14 -17
  184. package/dist/hapi/routes.cjs.map +1 -0
  185. package/dist/hapi/routes.d.cts +8 -0
  186. package/dist/hapi/routes.d.ts +8 -0
  187. package/dist/hapi/routes.js +12 -0
  188. package/dist/hapi/routes.js.map +1 -0
  189. package/dist/hono/index.cjs +13 -3
  190. package/dist/hono/index.cjs.map +1 -1
  191. package/dist/hono/index.d.cts +7 -10
  192. package/dist/hono/index.d.ts +7 -10
  193. package/dist/hono/index.js +13 -2
  194. package/dist/hono/index.js.map +1 -1
  195. package/dist/hono/middleware.cjs +219 -127
  196. package/dist/hono/middleware.cjs.map +1 -1
  197. package/dist/hono/middleware.d.cts +3 -18
  198. package/dist/hono/middleware.d.ts +3 -18
  199. package/dist/hono/middleware.js +229 -126
  200. package/dist/hono/middleware.js.map +1 -1
  201. package/dist/hono/routes.cjs +74 -0
  202. package/dist/hono/routes.cjs.map +1 -0
  203. package/dist/hono/routes.d.cts +8 -0
  204. package/dist/hono/routes.d.ts +8 -0
  205. package/dist/hono/routes.js +49 -0
  206. package/dist/hono/routes.js.map +1 -0
  207. package/dist/index.cjs +108 -0
  208. package/dist/index.cjs.map +1 -1
  209. package/dist/index.d.cts +29 -1
  210. package/dist/index.d.ts +29 -1
  211. package/dist/index.js +77 -0
  212. package/dist/index.js.map +1 -1
  213. package/dist/koa/index.cjs +13 -3
  214. package/dist/koa/index.cjs.map +1 -1
  215. package/dist/koa/index.d.cts +7 -10
  216. package/dist/koa/index.d.ts +7 -10
  217. package/dist/koa/index.js +13 -2
  218. package/dist/koa/index.js.map +1 -1
  219. package/dist/koa/middleware.cjs +85 -184
  220. package/dist/koa/middleware.cjs.map +1 -1
  221. package/dist/koa/middleware.d.cts +3 -13
  222. package/dist/koa/middleware.d.ts +3 -13
  223. package/dist/koa/middleware.js +88 -183
  224. package/dist/koa/middleware.js.map +1 -1
  225. package/dist/koa/routes.cjs +71 -0
  226. package/dist/koa/routes.cjs.map +1 -0
  227. package/dist/koa/routes.d.cts +8 -0
  228. package/dist/koa/routes.d.ts +8 -0
  229. package/dist/koa/routes.js +46 -0
  230. package/dist/koa/routes.js.map +1 -0
  231. package/dist/logCapture.cjs +417 -0
  232. package/dist/logCapture.cjs.map +1 -0
  233. package/dist/logCapture.d.cts +18 -0
  234. package/dist/logCapture.d.ts +18 -0
  235. package/dist/logCapture.js +390 -0
  236. package/dist/logCapture.js.map +1 -0
  237. package/dist/logRecordExporter.cjs +51 -0
  238. package/dist/logRecordExporter.cjs.map +1 -0
  239. package/dist/logRecordExporter.d.cts +14 -0
  240. package/dist/logRecordExporter.d.ts +14 -0
  241. package/dist/logRecordExporter.js +27 -0
  242. package/dist/logRecordExporter.js.map +1 -0
  243. package/dist/logRecordProcessor.cjs +137 -0
  244. package/dist/logRecordProcessor.cjs.map +1 -0
  245. package/dist/logRecordProcessor.d.cts +27 -0
  246. package/dist/logRecordProcessor.d.ts +27 -0
  247. package/dist/logRecordProcessor.js +113 -0
  248. package/dist/logRecordProcessor.js.map +1 -0
  249. package/dist/logger.cjs +62 -0
  250. package/dist/logger.cjs.map +1 -0
  251. package/dist/logger.d.cts +7 -0
  252. package/dist/logger.d.ts +7 -0
  253. package/dist/logger.js +34 -0
  254. package/dist/logger.js.map +1 -0
  255. package/dist/metrics.cjs +171 -0
  256. package/dist/metrics.cjs.map +1 -0
  257. package/dist/metrics.d.cts +26 -0
  258. package/dist/metrics.d.ts +26 -0
  259. package/dist/metrics.js +153 -0
  260. package/dist/metrics.js.map +1 -0
  261. package/dist/nestjs/index.cjs +81 -71
  262. package/dist/nestjs/index.cjs.map +1 -1
  263. package/dist/nestjs/index.d.cts +4 -11
  264. package/dist/nestjs/index.d.ts +4 -11
  265. package/dist/nestjs/index.js +81 -61
  266. package/dist/nestjs/index.js.map +1 -1
  267. package/dist/packageVersion.cjs +67 -0
  268. package/dist/packageVersion.cjs.map +1 -0
  269. package/dist/packageVersion.d.cts +5 -0
  270. package/dist/packageVersion.d.ts +5 -0
  271. package/dist/packageVersion.js +39 -0
  272. package/dist/packageVersion.js.map +1 -0
  273. package/dist/providers.cjs +149 -0
  274. package/dist/providers.cjs.map +1 -0
  275. package/dist/providers.d.cts +15 -0
  276. package/dist/providers.d.ts +15 -0
  277. package/dist/providers.js +136 -0
  278. package/dist/providers.js.map +1 -0
  279. package/dist/redaction.cjs +116 -0
  280. package/dist/redaction.cjs.map +1 -0
  281. package/dist/redaction.d.cts +17 -0
  282. package/dist/redaction.d.ts +17 -0
  283. package/dist/redaction.js +98 -0
  284. package/dist/redaction.js.map +1 -0
  285. package/dist/{common/packageVersions.cjs → requestAttributes.cjs} +21 -19
  286. package/dist/requestAttributes.cjs.map +1 -0
  287. package/dist/requestAttributes.d.cts +10 -0
  288. package/dist/requestAttributes.d.ts +10 -0
  289. package/dist/requestAttributes.js +22 -0
  290. package/dist/requestAttributes.js.map +1 -0
  291. package/dist/requestObservation.cjs +246 -0
  292. package/dist/requestObservation.cjs.map +1 -0
  293. package/dist/requestObservation.d.cts +62 -0
  294. package/dist/requestObservation.d.ts +62 -0
  295. package/dist/requestObservation.js +226 -0
  296. package/dist/requestObservation.js.map +1 -0
  297. package/dist/requestObservationNode.cjs +193 -0
  298. package/dist/requestObservationNode.cjs.map +1 -0
  299. package/dist/requestObservationNode.d.cts +31 -0
  300. package/dist/requestObservationNode.d.ts +31 -0
  301. package/dist/requestObservationNode.js +170 -0
  302. package/dist/requestObservationNode.js.map +1 -0
  303. package/dist/requestObservationWeb.cjs +202 -0
  304. package/dist/requestObservationWeb.cjs.map +1 -0
  305. package/dist/requestObservationWeb.d.cts +34 -0
  306. package/dist/requestObservationWeb.d.ts +34 -0
  307. package/dist/requestObservationWeb.js +182 -0
  308. package/dist/requestObservationWeb.js.map +1 -0
  309. package/dist/sentry.cjs +103 -0
  310. package/dist/sentry.cjs.map +1 -0
  311. package/dist/sentry.d.cts +3 -0
  312. package/dist/sentry.d.ts +3 -0
  313. package/dist/sentry.js +79 -0
  314. package/dist/sentry.js.map +1 -0
  315. package/dist/serverErrors.cjs +118 -0
  316. package/dist/serverErrors.cjs.map +1 -0
  317. package/dist/serverErrors.d.cts +8 -0
  318. package/dist/serverErrors.d.ts +8 -0
  319. package/dist/serverErrors.js +91 -0
  320. package/dist/serverErrors.js.map +1 -0
  321. package/dist/spanExporter.cjs +217 -0
  322. package/dist/spanExporter.cjs.map +1 -0
  323. package/dist/spanExporter.d.cts +34 -0
  324. package/dist/spanExporter.d.ts +34 -0
  325. package/dist/spanExporter.js +193 -0
  326. package/dist/spanExporter.js.map +1 -0
  327. package/dist/spanProcessor.cjs +535 -0
  328. package/dist/spanProcessor.cjs.map +1 -0
  329. package/dist/spanProcessor.d.cts +70 -0
  330. package/dist/spanProcessor.d.ts +70 -0
  331. package/dist/spanProcessor.js +513 -0
  332. package/dist/spanProcessor.js.map +1 -0
  333. package/dist/spool.cjs +314 -0
  334. package/dist/spool.cjs.map +1 -0
  335. package/dist/spool.d.cts +49 -0
  336. package/dist/spool.d.ts +49 -0
  337. package/dist/spool.js +297 -0
  338. package/dist/spool.js.map +1 -0
  339. package/dist/startup.cjs +98 -0
  340. package/dist/startup.cjs.map +1 -0
  341. package/dist/startup.d.cts +15 -0
  342. package/dist/startup.d.ts +15 -0
  343. package/dist/startup.js +73 -0
  344. package/dist/startup.js.map +1 -0
  345. package/dist/tracing.cjs +116 -0
  346. package/dist/tracing.cjs.map +1 -0
  347. package/dist/tracing.d.cts +5 -0
  348. package/dist/tracing.d.ts +5 -0
  349. package/dist/tracing.js +96 -0
  350. package/dist/tracing.js.map +1 -0
  351. package/dist/validationErrors.cjs +229 -0
  352. package/dist/validationErrors.cjs.map +1 -0
  353. package/dist/validationErrors.d.cts +21 -0
  354. package/dist/validationErrors.d.ts +21 -0
  355. package/dist/validationErrors.js +195 -0
  356. package/dist/validationErrors.js.map +1 -0
  357. package/package.json +113 -154
  358. package/dist/common/client.cjs +0 -335
  359. package/dist/common/client.cjs.map +0 -1
  360. package/dist/common/client.d.cts +0 -50
  361. package/dist/common/client.d.ts +0 -50
  362. package/dist/common/client.js +0 -302
  363. package/dist/common/client.js.map +0 -1
  364. package/dist/common/consumerRegistry.cjs +0 -86
  365. package/dist/common/consumerRegistry.cjs.map +0 -1
  366. package/dist/common/consumerRegistry.d.cts +0 -20
  367. package/dist/common/consumerRegistry.d.ts +0 -20
  368. package/dist/common/consumerRegistry.js +0 -62
  369. package/dist/common/consumerRegistry.js.map +0 -1
  370. package/dist/common/headers.cjs +0 -55
  371. package/dist/common/headers.cjs.map +0 -1
  372. package/dist/common/headers.d.cts +0 -6
  373. package/dist/common/headers.d.ts +0 -6
  374. package/dist/common/headers.js +0 -31
  375. package/dist/common/headers.js.map +0 -1
  376. package/dist/common/instance.cjs +0 -158
  377. package/dist/common/instance.cjs.map +0 -1
  378. package/dist/common/instance.d.cts +0 -4
  379. package/dist/common/instance.d.ts +0 -4
  380. package/dist/common/instance.js +0 -134
  381. package/dist/common/instance.js.map +0 -1
  382. package/dist/common/logging.cjs.map +0 -1
  383. package/dist/common/logging.d.cts +0 -11
  384. package/dist/common/logging.d.ts +0 -11
  385. package/dist/common/logging.js +0 -17
  386. package/dist/common/logging.js.map +0 -1
  387. package/dist/common/packageVersions.cjs.map +0 -1
  388. package/dist/common/packageVersions.d.cts +0 -3
  389. package/dist/common/packageVersions.d.ts +0 -3
  390. package/dist/common/packageVersions.js +0 -21
  391. package/dist/common/packageVersions.js.map +0 -1
  392. package/dist/common/paramValidation.cjs.map +0 -1
  393. package/dist/common/paramValidation.d.cts +0 -4
  394. package/dist/common/paramValidation.d.ts +0 -4
  395. package/dist/common/paramValidation.js +0 -17
  396. package/dist/common/paramValidation.js.map +0 -1
  397. package/dist/common/requestCounter.cjs +0 -114
  398. package/dist/common/requestCounter.cjs.map +0 -1
  399. package/dist/common/requestCounter.d.cts +0 -24
  400. package/dist/common/requestCounter.d.ts +0 -24
  401. package/dist/common/requestCounter.js +0 -91
  402. package/dist/common/requestCounter.js.map +0 -1
  403. package/dist/common/requestLogger.cjs +0 -543
  404. package/dist/common/requestLogger.cjs.map +0 -1
  405. package/dist/common/requestLogger.d.cts +0 -85
  406. package/dist/common/requestLogger.d.ts +0 -85
  407. package/dist/common/requestLogger.js +0 -508
  408. package/dist/common/requestLogger.js.map +0 -1
  409. package/dist/common/resources.cjs +0 -49
  410. package/dist/common/resources.cjs.map +0 -1
  411. package/dist/common/resources.d.cts +0 -6
  412. package/dist/common/resources.d.ts +0 -6
  413. package/dist/common/resources.js +0 -26
  414. package/dist/common/resources.js.map +0 -1
  415. package/dist/common/response.cjs +0 -104
  416. package/dist/common/response.cjs.map +0 -1
  417. package/dist/common/response.d.cts +0 -15
  418. package/dist/common/response.d.ts +0 -15
  419. package/dist/common/response.js +0 -80
  420. package/dist/common/response.js.map +0 -1
  421. package/dist/common/sentry.cjs +0 -56
  422. package/dist/common/sentry.cjs.map +0 -1
  423. package/dist/common/sentry.d.cts +0 -6
  424. package/dist/common/sentry.d.ts +0 -6
  425. package/dist/common/sentry.js +0 -23
  426. package/dist/common/sentry.js.map +0 -1
  427. package/dist/common/serverErrorCounter.cjs +0 -123
  428. package/dist/common/serverErrorCounter.cjs.map +0 -1
  429. package/dist/common/serverErrorCounter.d.cts +0 -23
  430. package/dist/common/serverErrorCounter.d.ts +0 -23
  431. package/dist/common/serverErrorCounter.js +0 -98
  432. package/dist/common/serverErrorCounter.js.map +0 -1
  433. package/dist/common/spanCollector.cjs +0 -201
  434. package/dist/common/spanCollector.cjs.map +0 -1
  435. package/dist/common/spanCollector.d.cts +0 -45
  436. package/dist/common/spanCollector.d.ts +0 -45
  437. package/dist/common/spanCollector.js +0 -177
  438. package/dist/common/spanCollector.js.map +0 -1
  439. package/dist/common/tempGzipFile.cjs +0 -127
  440. package/dist/common/tempGzipFile.cjs.map +0 -1
  441. package/dist/common/tempGzipFile.d.cts +0 -19
  442. package/dist/common/tempGzipFile.d.ts +0 -19
  443. package/dist/common/tempGzipFile.js +0 -103
  444. package/dist/common/tempGzipFile.js.map +0 -1
  445. package/dist/common/types.cjs +0 -17
  446. package/dist/common/types.cjs.map +0 -1
  447. package/dist/common/types.d.cts +0 -95
  448. package/dist/common/types.d.ts +0 -95
  449. package/dist/common/types.js +0 -1
  450. package/dist/common/types.js.map +0 -1
  451. package/dist/common/validationErrorCounter.cjs +0 -79
  452. package/dist/common/validationErrorCounter.cjs.map +0 -1
  453. package/dist/common/validationErrorCounter.d.cts +0 -20
  454. package/dist/common/validationErrorCounter.d.ts +0 -20
  455. package/dist/common/validationErrorCounter.js +0 -56
  456. package/dist/common/validationErrorCounter.js.map +0 -1
  457. package/dist/elysia/plugin.cjs +0 -242
  458. package/dist/elysia/plugin.cjs.map +0 -1
  459. package/dist/elysia/plugin.d.cts +0 -70
  460. package/dist/elysia/plugin.d.ts +0 -70
  461. package/dist/elysia/plugin.js +0 -219
  462. package/dist/elysia/plugin.js.map +0 -1
  463. package/dist/elysia/utils.cjs +0 -77
  464. package/dist/elysia/utils.cjs.map +0 -1
  465. package/dist/elysia/utils.d.cts +0 -14
  466. package/dist/elysia/utils.d.ts +0 -14
  467. package/dist/elysia/utils.js +0 -54
  468. package/dist/elysia/utils.js.map +0 -1
  469. package/dist/express/utils.cjs +0 -217
  470. package/dist/express/utils.cjs.map +0 -1
  471. package/dist/express/utils.d.cts +0 -37
  472. package/dist/express/utils.d.ts +0 -37
  473. package/dist/express/utils.js +0 -189
  474. package/dist/express/utils.js.map +0 -1
  475. package/dist/fastify/plugin.cjs +0 -319
  476. package/dist/fastify/plugin.cjs.map +0 -1
  477. package/dist/fastify/plugin.d.cts +0 -34
  478. package/dist/fastify/plugin.d.ts +0 -34
  479. package/dist/fastify/plugin.js +0 -284
  480. package/dist/fastify/plugin.js.map +0 -1
  481. package/dist/h3/plugin.cjs +0 -183
  482. package/dist/h3/plugin.cjs.map +0 -1
  483. package/dist/h3/plugin.d.cts +0 -27
  484. package/dist/h3/plugin.d.ts +0 -27
  485. package/dist/h3/plugin.js +0 -159
  486. package/dist/h3/plugin.js.map +0 -1
  487. package/dist/h3/utils.cjs +0 -77
  488. package/dist/h3/utils.cjs.map +0 -1
  489. package/dist/h3/utils.d.cts +0 -14
  490. package/dist/h3/utils.d.ts +0 -14
  491. package/dist/h3/utils.js +0 -54
  492. package/dist/h3/utils.js.map +0 -1
  493. package/dist/hapi/plugin.cjs +0 -212
  494. package/dist/hapi/plugin.cjs.map +0 -1
  495. package/dist/hapi/plugin.d.cts +0 -40
  496. package/dist/hapi/plugin.d.ts +0 -40
  497. package/dist/hapi/plugin.js +0 -188
  498. package/dist/hapi/plugin.js.map +0 -1
  499. package/dist/hapi/utils.cjs +0 -77
  500. package/dist/hapi/utils.cjs.map +0 -1
  501. package/dist/hapi/utils.d.cts +0 -16
  502. package/dist/hapi/utils.d.ts +0 -16
  503. package/dist/hapi/utils.js +0 -53
  504. package/dist/hapi/utils.js.map +0 -1
  505. package/dist/hono/utils.cjs +0 -113
  506. package/dist/hono/utils.cjs.map +0 -1
  507. package/dist/hono/utils.d.cts +0 -16
  508. package/dist/hono/utils.d.ts +0 -16
  509. package/dist/hono/utils.js +0 -88
  510. package/dist/hono/utils.js.map +0 -1
  511. package/dist/loggers/console.cjs +0 -67
  512. package/dist/loggers/console.cjs.map +0 -1
  513. package/dist/loggers/console.d.cts +0 -11
  514. package/dist/loggers/console.d.ts +0 -11
  515. package/dist/loggers/console.js +0 -44
  516. package/dist/loggers/console.js.map +0 -1
  517. package/dist/loggers/hapi.cjs.map +0 -1
  518. package/dist/loggers/hapi.d.cts +0 -12
  519. package/dist/loggers/hapi.d.ts +0 -12
  520. package/dist/loggers/hapi.js +0 -29
  521. package/dist/loggers/hapi.js.map +0 -1
  522. package/dist/loggers/index.cjs.map +0 -1
  523. package/dist/loggers/index.d.cts +0 -13
  524. package/dist/loggers/index.d.ts +0 -13
  525. package/dist/loggers/index.js +0 -13
  526. package/dist/loggers/index.js.map +0 -1
  527. package/dist/loggers/nestjs.cjs +0 -104
  528. package/dist/loggers/nestjs.cjs.map +0 -1
  529. package/dist/loggers/nestjs.d.cts +0 -11
  530. package/dist/loggers/nestjs.d.ts +0 -11
  531. package/dist/loggers/nestjs.js +0 -71
  532. package/dist/loggers/nestjs.js.map +0 -1
  533. package/dist/loggers/pino.cjs +0 -152
  534. package/dist/loggers/pino.cjs.map +0 -1
  535. package/dist/loggers/pino.d.cts +0 -11
  536. package/dist/loggers/pino.d.ts +0 -11
  537. package/dist/loggers/pino.js +0 -119
  538. package/dist/loggers/pino.js.map +0 -1
  539. package/dist/loggers/utils.cjs +0 -64
  540. package/dist/loggers/utils.cjs.map +0 -1
  541. package/dist/loggers/utils.d.cts +0 -6
  542. package/dist/loggers/utils.d.ts +0 -6
  543. package/dist/loggers/utils.js +0 -40
  544. package/dist/loggers/utils.js.map +0 -1
  545. package/dist/loggers/winston.cjs +0 -101
  546. package/dist/loggers/winston.cjs.map +0 -1
  547. package/dist/loggers/winston.d.cts +0 -11
  548. package/dist/loggers/winston.d.ts +0 -11
  549. package/dist/loggers/winston.js +0 -68
  550. package/dist/loggers/winston.js.map +0 -1
  551. package/dist/otel/index.cjs.map +0 -1
  552. package/dist/otel/index.d.cts +0 -2
  553. package/dist/otel/index.d.ts +0 -2
  554. package/dist/otel/index.js +0 -5
  555. package/dist/otel/index.js.map +0 -1
package/dist/spool.cjs ADDED
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var spool_exports = {};
20
+ __export(spool_exports, {
21
+ Spool: () => Spool,
22
+ SpoolFile: () => SpoolFile
23
+ });
24
+ module.exports = __toCommonJS(spool_exports);
25
+ var import_node_crypto = require("node:crypto");
26
+ var import_node_fs = require("node:fs");
27
+ var import_promises = require("node:fs/promises");
28
+ var import_node_os = require("node:os");
29
+ var import_node_path = require("node:path");
30
+ var import_node_zlib = require("node:zlib");
31
+ var import_logger = require('./logger.cjs');
32
+ const WRITE_FAILURE_WARNING = "Error writing to disk, dropping buffered telemetry";
33
+ const SIGNALS = ["traces", "logs", "metrics"];
34
+ const MAX_UNCOMPRESSED_FILE_SIZE = 4e6;
35
+ const MAX_RETRY_TIME_AFTER_FIRST_ATTEMPT_MILLIS = 59 * 60 * 1e3;
36
+ const MAX_SPOOL_SIZE_DISK = 5e7;
37
+ const MAX_SPOOL_SIZE_MEMORY = 1e7;
38
+ const MAX_UNTOUCHED_FILE_AGE_MILLIS = 2 * 60 * 60 * 1e3;
39
+ const SPOOL_FILE_NAME_PATTERN = /^apitally-.*\.gz$/;
40
+ class Spool {
41
+ inMemory;
42
+ maxSize;
43
+ current = /* @__PURE__ */ new Map();
44
+ closed = [];
45
+ tempDir;
46
+ queues = {
47
+ traces: Promise.resolve(),
48
+ logs: Promise.resolve(),
49
+ metrics: Promise.resolve()
50
+ };
51
+ constructor(tempDir = (0, import_node_os.tmpdir)()) {
52
+ this.tempDir = tempDir;
53
+ this.inMemory = !isTempDirWritable(tempDir);
54
+ if (this.inMemory) {
55
+ (0, import_logger.logWarning)(
56
+ `Unable to create temporary files, buffering telemetry in memory (max ${MAX_SPOOL_SIZE_MEMORY / 1e6} MB)`
57
+ );
58
+ } else {
59
+ cleanupOrphanedFiles(tempDir);
60
+ }
61
+ this.maxSize = this.inMemory ? MAX_SPOOL_SIZE_MEMORY : MAX_SPOOL_SIZE_DISK;
62
+ }
63
+ append(signal, payload) {
64
+ return this.enqueue(signal, async () => {
65
+ let file = this.current.get(signal);
66
+ if (file && file.uncompressedSize + payload.length > MAX_UNCOMPRESSED_FILE_SIZE) {
67
+ await this.closeCurrentFile(signal);
68
+ file = void 0;
69
+ }
70
+ try {
71
+ if (!file) {
72
+ file = new SpoolFile(signal, this.inMemory ? void 0 : this.tempDir);
73
+ this.current.set(signal, file);
74
+ }
75
+ await file.write(payload);
76
+ (0, import_logger.resetWarning)(WRITE_FAILURE_WARNING);
77
+ } catch {
78
+ (0, import_logger.logWarning)(WRITE_FAILURE_WARNING);
79
+ await this.discardCurrentFile(signal);
80
+ }
81
+ await this.evict();
82
+ });
83
+ }
84
+ // Current files close only when no backlog exists, avoiding one file per cycle.
85
+ // Sequential rotation preserves send order.
86
+ async rotateForExport() {
87
+ for (const signal of SIGNALS) {
88
+ await this.enqueue(signal, async () => {
89
+ if (this.current.has(signal) && !this.closed.some((file) => file.signal === signal)) {
90
+ await this.closeCurrentFile(signal);
91
+ }
92
+ });
93
+ }
94
+ await this.evict();
95
+ }
96
+ async closeCurrentFiles() {
97
+ for (const signal of SIGNALS) {
98
+ await this.enqueue(signal, () => this.closeCurrentFile(signal));
99
+ }
100
+ }
101
+ pendingFiles() {
102
+ return [...this.closed];
103
+ }
104
+ async deleteFile(file) {
105
+ const index = this.closed.indexOf(file);
106
+ if (index >= 0) {
107
+ this.closed.splice(index, 1);
108
+ }
109
+ await file.delete();
110
+ }
111
+ // Apitally ingest deduplicates for one hour; a later retry could ingest the file twice.
112
+ deleteIfExpired(file) {
113
+ if (!file.isExpired()) {
114
+ return void 0;
115
+ }
116
+ (0, import_logger.logWarning)(`Buffered ${file.signal} could not be delivered within an hour and were dropped`);
117
+ return this.deleteFile(file);
118
+ }
119
+ // Refresh mtimes so orphan cleanup in another process preserves live files.
120
+ touchFiles() {
121
+ for (const file of [...this.current.values(), ...this.closed]) {
122
+ file.touch();
123
+ }
124
+ }
125
+ async clear() {
126
+ await Promise.all(
127
+ SIGNALS.map((signal) => this.enqueue(signal, () => this.discardCurrentFile(signal)))
128
+ );
129
+ const files = this.closed.splice(0);
130
+ await Promise.all(files.map((file) => file.delete()));
131
+ }
132
+ enqueue(signal, operation) {
133
+ const result = this.queues[signal].then(operation);
134
+ this.queues[signal] = result.catch(() => void 0);
135
+ return result;
136
+ }
137
+ async closeCurrentFile(signal) {
138
+ const file = this.current.get(signal);
139
+ if (!file) {
140
+ return;
141
+ }
142
+ this.current.delete(signal);
143
+ try {
144
+ await file.close();
145
+ this.closed.push(file);
146
+ } catch {
147
+ (0, import_logger.logWarning)(WRITE_FAILURE_WARNING);
148
+ await file.delete();
149
+ }
150
+ }
151
+ async discardCurrentFile(signal) {
152
+ const file = this.current.get(signal);
153
+ if (file) {
154
+ this.current.delete(signal);
155
+ await file.delete();
156
+ }
157
+ }
158
+ async evict() {
159
+ const deletions = [...this.closed].map((file) => this.deleteIfExpired(file));
160
+ while (this.totalSize() > this.maxSize) {
161
+ const oldest = this.closed.find((file) => file.signal !== "metrics") ?? this.closed[0];
162
+ if (!oldest) {
163
+ break;
164
+ }
165
+ (0, import_logger.logWarning)(`Buffer size limit reached, dropping oldest buffered ${oldest.signal}`);
166
+ deletions.push(this.deleteFile(oldest));
167
+ }
168
+ await Promise.all(deletions);
169
+ }
170
+ totalSize() {
171
+ let total = 0;
172
+ for (const file of [...this.closed, ...this.current.values()]) {
173
+ total += file.storedSize;
174
+ }
175
+ return total;
176
+ }
177
+ }
178
+ class SpoolFile {
179
+ signal;
180
+ path;
181
+ firstAttemptAtMillis;
182
+ uncompressedSize = 0;
183
+ gzip;
184
+ fileStream;
185
+ memoryChunks;
186
+ memorySize = 0;
187
+ streamError;
188
+ closedPromise;
189
+ constructor(signal, tempDir) {
190
+ this.signal = signal;
191
+ this.gzip = (0, import_node_zlib.createGzip)();
192
+ let closeTarget;
193
+ let closeEvent;
194
+ if (tempDir === void 0) {
195
+ const chunks = [];
196
+ this.memoryChunks = chunks;
197
+ this.gzip.on("data", (chunk) => {
198
+ chunks.push(chunk);
199
+ this.memorySize += chunk.length;
200
+ });
201
+ closeTarget = this.gzip;
202
+ closeEvent = "end";
203
+ } else {
204
+ this.path = (0, import_node_path.join)(tempDir, `apitally-${(0, import_node_crypto.randomUUID)()}.gz`);
205
+ const fd = (0, import_node_fs.openSync)(this.path, "wx", 384);
206
+ this.fileStream = (0, import_node_fs.createWriteStream)(this.path, { fd });
207
+ this.gzip.pipe(this.fileStream);
208
+ closeTarget = this.fileStream;
209
+ closeEvent = "close";
210
+ }
211
+ const streams = this.fileStream ? [this.gzip, this.fileStream] : [this.gzip];
212
+ this.closedPromise = new Promise((resolve, reject) => {
213
+ closeTarget.once(closeEvent, resolve);
214
+ for (const stream of streams) {
215
+ stream.once("error", reject);
216
+ }
217
+ });
218
+ this.closedPromise.catch(() => void 0);
219
+ for (const stream of streams) {
220
+ stream.on("error", (error) => {
221
+ this.streamError ??= error;
222
+ });
223
+ }
224
+ }
225
+ write(payload) {
226
+ return new Promise((resolve, reject) => {
227
+ if (this.streamError) {
228
+ reject(this.streamError);
229
+ return;
230
+ }
231
+ this.gzip.write(payload, (error) => {
232
+ const failure = error ?? this.streamError;
233
+ if (failure) {
234
+ reject(failure);
235
+ } else {
236
+ this.uncompressedSize += payload.length;
237
+ resolve();
238
+ }
239
+ });
240
+ });
241
+ }
242
+ async close() {
243
+ if (this.streamError) {
244
+ throw this.streamError;
245
+ }
246
+ this.gzip.end();
247
+ await this.closedPromise;
248
+ }
249
+ get storedSize() {
250
+ return this.fileStream ? this.fileStream.bytesWritten : this.memorySize;
251
+ }
252
+ markAttempt() {
253
+ this.firstAttemptAtMillis ??= performance.now();
254
+ }
255
+ isExpired() {
256
+ return this.firstAttemptAtMillis !== void 0 && performance.now() - this.firstAttemptAtMillis > MAX_RETRY_TIME_AFTER_FIRST_ATTEMPT_MILLIS;
257
+ }
258
+ touch() {
259
+ if (this.path) {
260
+ try {
261
+ const now = /* @__PURE__ */ new Date();
262
+ (0, import_node_fs.utimesSync)(this.path, now, now);
263
+ } catch {
264
+ }
265
+ }
266
+ }
267
+ readStoredBytes() {
268
+ if (this.path) {
269
+ return (0, import_promises.readFile)(this.path);
270
+ }
271
+ return Promise.resolve(Buffer.concat(this.memoryChunks ?? []));
272
+ }
273
+ async delete() {
274
+ this.gzip.destroy();
275
+ this.fileStream?.destroy();
276
+ if (this.path) {
277
+ await (0, import_promises.unlink)(this.path).catch(() => void 0);
278
+ }
279
+ }
280
+ }
281
+ function isTempDirWritable(tempDir) {
282
+ const probePath = (0, import_node_path.join)(tempDir, `apitally-${(0, import_node_crypto.randomUUID)()}.gz`);
283
+ try {
284
+ (0, import_node_fs.writeFileSync)(probePath, "", { flag: "wx", mode: 384 });
285
+ (0, import_node_fs.unlinkSync)(probePath);
286
+ return true;
287
+ } catch {
288
+ return false;
289
+ }
290
+ }
291
+ function cleanupOrphanedFiles(tempDir) {
292
+ const cutoff = Date.now() - MAX_UNTOUCHED_FILE_AGE_MILLIS;
293
+ try {
294
+ for (const name of (0, import_node_fs.readdirSync)(tempDir)) {
295
+ if (!SPOOL_FILE_NAME_PATTERN.test(name)) {
296
+ continue;
297
+ }
298
+ try {
299
+ const filePath = (0, import_node_path.join)(tempDir, name);
300
+ if ((0, import_node_fs.statSync)(filePath).mtimeMs < cutoff) {
301
+ (0, import_node_fs.unlinkSync)(filePath);
302
+ }
303
+ } catch {
304
+ }
305
+ }
306
+ } catch {
307
+ }
308
+ }
309
+ // Annotate the CommonJS export names for ESM import in node:
310
+ 0 && (module.exports = {
311
+ Spool,
312
+ SpoolFile
313
+ });
314
+ //# sourceMappingURL=spool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spool.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createWriteStream,\n openSync,\n readdirSync,\n statSync,\n unlinkSync,\n utimesSync,\n type WriteStream,\n writeFileSync,\n} from \"node:fs\";\nimport { readFile, unlink } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createGzip, type Gzip } from \"node:zlib\";\nimport { logWarning, resetWarning } from \"./logger.js\";\n\nconst WRITE_FAILURE_WARNING = \"Error writing to disk, dropping buffered telemetry\";\n\nconst SIGNALS = [\"traces\", \"logs\", \"metrics\"] as const;\nexport type Signal = (typeof SIGNALS)[number];\n\nconst MAX_UNCOMPRESSED_FILE_SIZE = 4_000_000;\nconst MAX_RETRY_TIME_AFTER_FIRST_ATTEMPT_MILLIS = 59 * 60 * 1000;\nconst MAX_SPOOL_SIZE_DISK = 50_000_000;\nconst MAX_SPOOL_SIZE_MEMORY = 10_000_000;\nconst MAX_UNTOUCHED_FILE_AGE_MILLIS = 2 * 60 * 60 * 1000;\nconst SPOOL_FILE_NAME_PATTERN = /^apitally-.*\\.gz$/;\n\n// Operations for each signal are serialized because gzip and file streams\n// complete asynchronously.\nexport class Spool {\n readonly inMemory: boolean;\n maxSize: number;\n readonly current = new Map<Signal, SpoolFile>();\n private readonly closed: SpoolFile[] = [];\n private readonly tempDir: string;\n private readonly queues: Record<Signal, Promise<void>> = {\n traces: Promise.resolve(),\n logs: Promise.resolve(),\n metrics: Promise.resolve(),\n };\n\n constructor(tempDir: string = tmpdir()) {\n this.tempDir = tempDir;\n this.inMemory = !isTempDirWritable(tempDir);\n if (this.inMemory) {\n logWarning(\n `Unable to create temporary files, buffering telemetry in memory (max ${MAX_SPOOL_SIZE_MEMORY / 1_000_000} MB)`,\n );\n } else {\n cleanupOrphanedFiles(tempDir);\n }\n this.maxSize = this.inMemory ? MAX_SPOOL_SIZE_MEMORY : MAX_SPOOL_SIZE_DISK;\n }\n\n append(signal: Signal, payload: Uint8Array): Promise<void> {\n return this.enqueue(signal, async () => {\n let file = this.current.get(signal);\n if (file && file.uncompressedSize + payload.length > MAX_UNCOMPRESSED_FILE_SIZE) {\n await this.closeCurrentFile(signal);\n file = undefined;\n }\n try {\n if (!file) {\n file = new SpoolFile(signal, this.inMemory ? undefined : this.tempDir);\n this.current.set(signal, file);\n }\n await file.write(payload);\n // Writes recovered; the write-failure warning may fire again later.\n resetWarning(WRITE_FAILURE_WARNING);\n } catch {\n logWarning(WRITE_FAILURE_WARNING);\n await this.discardCurrentFile(signal);\n }\n await this.evict();\n });\n }\n\n // Current files close only when no backlog exists, avoiding one file per cycle.\n // Sequential rotation preserves send order.\n async rotateForExport(): Promise<void> {\n for (const signal of SIGNALS) {\n await this.enqueue(signal, async () => {\n if (this.current.has(signal) && !this.closed.some((file) => file.signal === signal)) {\n await this.closeCurrentFile(signal);\n }\n });\n }\n await this.evict();\n }\n\n async closeCurrentFiles(): Promise<void> {\n for (const signal of SIGNALS) {\n await this.enqueue(signal, () => this.closeCurrentFile(signal));\n }\n }\n\n pendingFiles(): SpoolFile[] {\n return [...this.closed];\n }\n\n async deleteFile(file: SpoolFile): Promise<void> {\n const index = this.closed.indexOf(file);\n if (index >= 0) {\n this.closed.splice(index, 1);\n }\n await file.delete();\n }\n\n // Apitally ingest deduplicates for one hour; a later retry could ingest the file twice.\n deleteIfExpired(file: SpoolFile): Promise<void> | undefined {\n if (!file.isExpired()) {\n return undefined;\n }\n logWarning(`Buffered ${file.signal} could not be delivered within an hour and were dropped`);\n return this.deleteFile(file);\n }\n\n // Refresh mtimes so orphan cleanup in another process preserves live files.\n touchFiles(): void {\n for (const file of [...this.current.values(), ...this.closed]) {\n file.touch();\n }\n }\n\n async clear(): Promise<void> {\n await Promise.all(\n SIGNALS.map((signal) => this.enqueue(signal, () => this.discardCurrentFile(signal))),\n );\n const files = this.closed.splice(0);\n await Promise.all(files.map((file) => file.delete()));\n }\n\n private enqueue(signal: Signal, operation: () => Promise<void>): Promise<void> {\n const result = this.queues[signal].then(operation);\n this.queues[signal] = result.catch(() => undefined);\n return result;\n }\n\n private async closeCurrentFile(signal: Signal): Promise<void> {\n const file = this.current.get(signal);\n if (!file) {\n return;\n }\n this.current.delete(signal);\n try {\n await file.close();\n this.closed.push(file);\n } catch {\n logWarning(WRITE_FAILURE_WARNING);\n await file.delete();\n }\n }\n\n private async discardCurrentFile(signal: Signal): Promise<void> {\n const file = this.current.get(signal);\n if (file) {\n this.current.delete(signal);\n await file.delete();\n }\n }\n\n private async evict(): Promise<void> {\n const deletions = [...this.closed].map((file) => this.deleteIfExpired(file));\n while (this.totalSize() > this.maxSize) {\n // Prefer retaining metrics, but enforce the size limit when only metrics remain.\n const oldest = this.closed.find((file) => file.signal !== \"metrics\") ?? this.closed[0];\n if (!oldest) {\n break;\n }\n logWarning(`Buffer size limit reached, dropping oldest buffered ${oldest.signal}`);\n deletions.push(this.deleteFile(oldest));\n }\n await Promise.all(deletions);\n }\n\n private totalSize(): number {\n let total = 0;\n for (const file of [...this.closed, ...this.current.values()]) {\n total += file.storedSize;\n }\n return total;\n }\n}\n\n// One gzip stream of concatenated OTLP request payloads for a single signal,\n// written through to a temp file or, as fallback, an in-memory buffer.\nexport class SpoolFile {\n readonly signal: Signal;\n readonly path?: string;\n firstAttemptAtMillis?: number;\n uncompressedSize = 0;\n readonly gzip: Gzip;\n private readonly fileStream?: WriteStream;\n private readonly memoryChunks?: Buffer[];\n private memorySize = 0;\n private streamError?: Error;\n private readonly closedPromise: Promise<void>;\n\n constructor(signal: Signal, tempDir?: string) {\n this.signal = signal;\n this.gzip = createGzip();\n let closeTarget: Gzip | WriteStream;\n let closeEvent: string;\n if (tempDir === undefined) {\n const chunks: Buffer[] = [];\n this.memoryChunks = chunks;\n this.gzip.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n this.memorySize += chunk.length;\n });\n closeTarget = this.gzip;\n closeEvent = \"end\";\n } else {\n this.path = join(tempDir, `apitally-${randomUUID()}.gz`);\n // A synchronous exclusive open reports creation errors to the triggering append.\n const fd = openSync(this.path, \"wx\", 0o600);\n this.fileStream = createWriteStream(this.path, { fd });\n this.gzip.pipe(this.fileStream);\n closeTarget = this.fileStream;\n closeEvent = \"close\";\n }\n const streams: (Gzip | WriteStream)[] = this.fileStream\n ? [this.gzip, this.fileStream]\n : [this.gzip];\n this.closedPromise = new Promise((resolve, reject) => {\n closeTarget.once(closeEvent, resolve);\n for (const stream of streams) {\n stream.once(\"error\", reject);\n }\n });\n // Stream errors can occur outside an awaited operation; rejection handling\n // prevents an unhandled rejection.\n this.closedPromise.catch(() => undefined);\n for (const stream of streams) {\n stream.on(\"error\", (error: Error) => {\n this.streamError ??= error;\n });\n }\n }\n\n write(payload: Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.streamError) {\n reject(this.streamError);\n return;\n }\n this.gzip.write(payload, (error) => {\n const failure = error ?? this.streamError;\n if (failure) {\n reject(failure);\n } else {\n this.uncompressedSize += payload.length;\n resolve();\n }\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.streamError) {\n throw this.streamError;\n }\n this.gzip.end();\n await this.closedPromise;\n }\n\n get storedSize(): number {\n return this.fileStream ? this.fileStream.bytesWritten : this.memorySize;\n }\n\n markAttempt(): void {\n this.firstAttemptAtMillis ??= performance.now();\n }\n\n isExpired(): boolean {\n return (\n this.firstAttemptAtMillis !== undefined &&\n performance.now() - this.firstAttemptAtMillis > MAX_RETRY_TIME_AFTER_FIRST_ATTEMPT_MILLIS\n );\n }\n\n touch(): void {\n if (this.path) {\n try {\n const now = new Date();\n utimesSync(this.path, now, now);\n } catch {\n // The file may already be gone; orphan cleanup only targets stale files.\n }\n }\n }\n\n readStoredBytes(): Promise<Buffer> {\n if (this.path) {\n return readFile(this.path);\n }\n return Promise.resolve(Buffer.concat(this.memoryChunks ?? []));\n }\n\n async delete(): Promise<void> {\n this.gzip.destroy();\n this.fileStream?.destroy();\n if (this.path) {\n await unlink(this.path).catch(() => undefined);\n }\n }\n}\n\nfunction isTempDirWritable(tempDir: string): boolean {\n const probePath = join(tempDir, `apitally-${randomUUID()}.gz`);\n try {\n writeFileSync(probePath, \"\", { flag: \"wx\", mode: 0o600 });\n unlinkSync(probePath);\n return true;\n } catch {\n return false;\n }\n}\n\n// Live processes refresh mtimes each cycle, so only stale spool files from dead\n// processes are removed.\nfunction cleanupOrphanedFiles(tempDir: string): void {\n const cutoff = Date.now() - MAX_UNTOUCHED_FILE_AGE_MILLIS;\n try {\n for (const name of readdirSync(tempDir)) {\n if (!SPOOL_FILE_NAME_PATTERN.test(name)) {\n continue;\n }\n try {\n const filePath = join(tempDir, name);\n if (statSync(filePath).mtimeMs < cutoff) {\n unlinkSync(filePath);\n }\n } catch {\n // Another process may have removed the file first.\n }\n }\n } catch {\n // Reading the temporary directory is best-effort.\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,49 @@
1
+ import { Gzip } from 'node:zlib';
2
+
3
+ declare const SIGNALS: readonly ["traces", "logs", "metrics"];
4
+ type Signal = (typeof SIGNALS)[number];
5
+ declare class Spool {
6
+ readonly inMemory: boolean;
7
+ maxSize: number;
8
+ readonly current: Map<"traces" | "logs" | "metrics", SpoolFile>;
9
+ private readonly closed;
10
+ private readonly tempDir;
11
+ private readonly queues;
12
+ constructor(tempDir?: string);
13
+ append(signal: Signal, payload: Uint8Array): Promise<void>;
14
+ rotateForExport(): Promise<void>;
15
+ closeCurrentFiles(): Promise<void>;
16
+ pendingFiles(): SpoolFile[];
17
+ deleteFile(file: SpoolFile): Promise<void>;
18
+ deleteIfExpired(file: SpoolFile): Promise<void> | undefined;
19
+ touchFiles(): void;
20
+ clear(): Promise<void>;
21
+ private enqueue;
22
+ private closeCurrentFile;
23
+ private discardCurrentFile;
24
+ private evict;
25
+ private totalSize;
26
+ }
27
+ declare class SpoolFile {
28
+ readonly signal: Signal;
29
+ readonly path?: string;
30
+ firstAttemptAtMillis?: number;
31
+ uncompressedSize: number;
32
+ readonly gzip: Gzip;
33
+ private readonly fileStream?;
34
+ private readonly memoryChunks?;
35
+ private memorySize;
36
+ private streamError?;
37
+ private readonly closedPromise;
38
+ constructor(signal: Signal, tempDir?: string);
39
+ write(payload: Uint8Array): Promise<void>;
40
+ close(): Promise<void>;
41
+ get storedSize(): number;
42
+ markAttempt(): void;
43
+ isExpired(): boolean;
44
+ touch(): void;
45
+ readStoredBytes(): Promise<Buffer>;
46
+ delete(): Promise<void>;
47
+ }
48
+
49
+ export { type Signal, Spool, SpoolFile };
@@ -0,0 +1,49 @@
1
+ import { Gzip } from 'node:zlib';
2
+
3
+ declare const SIGNALS: readonly ["traces", "logs", "metrics"];
4
+ type Signal = (typeof SIGNALS)[number];
5
+ declare class Spool {
6
+ readonly inMemory: boolean;
7
+ maxSize: number;
8
+ readonly current: Map<"traces" | "logs" | "metrics", SpoolFile>;
9
+ private readonly closed;
10
+ private readonly tempDir;
11
+ private readonly queues;
12
+ constructor(tempDir?: string);
13
+ append(signal: Signal, payload: Uint8Array): Promise<void>;
14
+ rotateForExport(): Promise<void>;
15
+ closeCurrentFiles(): Promise<void>;
16
+ pendingFiles(): SpoolFile[];
17
+ deleteFile(file: SpoolFile): Promise<void>;
18
+ deleteIfExpired(file: SpoolFile): Promise<void> | undefined;
19
+ touchFiles(): void;
20
+ clear(): Promise<void>;
21
+ private enqueue;
22
+ private closeCurrentFile;
23
+ private discardCurrentFile;
24
+ private evict;
25
+ private totalSize;
26
+ }
27
+ declare class SpoolFile {
28
+ readonly signal: Signal;
29
+ readonly path?: string;
30
+ firstAttemptAtMillis?: number;
31
+ uncompressedSize: number;
32
+ readonly gzip: Gzip;
33
+ private readonly fileStream?;
34
+ private readonly memoryChunks?;
35
+ private memorySize;
36
+ private streamError?;
37
+ private readonly closedPromise;
38
+ constructor(signal: Signal, tempDir?: string);
39
+ write(payload: Uint8Array): Promise<void>;
40
+ close(): Promise<void>;
41
+ get storedSize(): number;
42
+ markAttempt(): void;
43
+ isExpired(): boolean;
44
+ touch(): void;
45
+ readStoredBytes(): Promise<Buffer>;
46
+ delete(): Promise<void>;
47
+ }
48
+
49
+ export { type Signal, Spool, SpoolFile };