@bgord/bun 0.7.0 → 0.8.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 (459) hide show
  1. package/README.md +1 -3
  2. package/dist/api-key-shield.middleware.d.ts +14 -0
  3. package/dist/api-key-shield.middleware.d.ts.map +1 -0
  4. package/dist/api-key-shield.middleware.js +19 -0
  5. package/dist/api-key-shield.middleware.js.map +1 -0
  6. package/dist/api-version.middleware.d.ts +6 -0
  7. package/dist/api-version.middleware.d.ts.map +1 -0
  8. package/dist/api-version.middleware.js +12 -0
  9. package/dist/api-version.middleware.js.map +1 -0
  10. package/dist/auth-shield.middleware.d.ts +31 -0
  11. package/dist/auth-shield.middleware.d.ts.map +1 -0
  12. package/dist/auth-shield.middleware.js +83 -0
  13. package/dist/auth-shield.middleware.js.map +1 -0
  14. package/dist/basic-auth.d.ts +8 -0
  15. package/dist/basic-auth.d.ts.map +1 -1
  16. package/dist/basic-auth.js +9 -0
  17. package/dist/basic-auth.js.map +1 -1
  18. package/dist/basic-auth.service.d.ts +14 -0
  19. package/dist/basic-auth.service.d.ts.map +1 -0
  20. package/dist/basic-auth.service.js +13 -0
  21. package/dist/basic-auth.service.js.map +1 -0
  22. package/dist/build-info-repository.service.d.ts +10 -0
  23. package/dist/build-info-repository.service.d.ts.map +1 -0
  24. package/dist/build-info-repository.service.js +18 -0
  25. package/dist/build-info-repository.service.js.map +1 -0
  26. package/dist/cache-resolver.service.d.ts +46 -0
  27. package/dist/cache-resolver.service.d.ts.map +1 -0
  28. package/dist/cache-resolver.service.js +44 -0
  29. package/dist/cache-resolver.service.js.map +1 -0
  30. package/dist/cache-response.middleware.d.ts +9 -0
  31. package/dist/cache-response.middleware.d.ts.map +1 -0
  32. package/dist/cache-response.middleware.js +25 -0
  33. package/dist/cache-response.middleware.js.map +1 -0
  34. package/dist/cache-static-files.middleware.d.ts +9 -0
  35. package/dist/cache-static-files.middleware.d.ts.map +1 -0
  36. package/dist/cache-static-files.middleware.js +25 -0
  37. package/dist/cache-static-files.middleware.js.map +1 -0
  38. package/dist/context.middleware.d.ts +14 -0
  39. package/dist/context.middleware.d.ts.map +1 -0
  40. package/dist/context.middleware.js +11 -0
  41. package/dist/context.middleware.js.map +1 -0
  42. package/dist/correlation-id.d.ts.map +1 -1
  43. package/dist/correlation-id.vo.d.ts +4 -0
  44. package/dist/correlation-id.vo.d.ts.map +1 -0
  45. package/dist/correlation-id.vo.js +3 -0
  46. package/dist/correlation-id.vo.js.map +1 -0
  47. package/dist/decorators.d.ts +4 -0
  48. package/dist/decorators.d.ts.map +1 -0
  49. package/dist/decorators.js +62 -0
  50. package/dist/decorators.js.map +1 -0
  51. package/dist/decorators.service.d.ts +12 -0
  52. package/dist/decorators.service.d.ts.map +1 -0
  53. package/dist/decorators.service.js +62 -0
  54. package/dist/decorators.service.js.map +1 -0
  55. package/dist/download-file.service.d.ts +13 -0
  56. package/dist/download-file.service.d.ts.map +1 -0
  57. package/dist/download-file.service.js +11 -0
  58. package/dist/download-file.service.js.map +1 -0
  59. package/dist/encryption.d.ts +8 -3
  60. package/dist/encryption.d.ts.map +1 -0
  61. package/dist/encryption.js +37 -0
  62. package/dist/encryption.js.map +1 -0
  63. package/dist/encryption.service.d.ts +25 -0
  64. package/dist/encryption.service.d.ts.map +1 -0
  65. package/dist/encryption.service.js +37 -0
  66. package/dist/encryption.service.js.map +1 -0
  67. package/dist/env-validator.service.d.ts +21 -0
  68. package/dist/env-validator.service.d.ts.map +1 -0
  69. package/dist/env-validator.service.js +28 -0
  70. package/dist/env-validator.service.js.map +1 -0
  71. package/dist/etag-extractor.middleware.d.ts +11 -0
  72. package/dist/etag-extractor.middleware.d.ts.map +1 -0
  73. package/dist/etag-extractor.middleware.js +18 -0
  74. package/dist/etag-extractor.middleware.js.map +1 -0
  75. package/dist/event-handler.d.ts +8 -0
  76. package/dist/event-handler.d.ts.map +1 -0
  77. package/dist/event-handler.js +21 -0
  78. package/dist/event-handler.js.map +1 -0
  79. package/dist/event-handler.service.d.ts +8 -0
  80. package/dist/event-handler.service.d.ts.map +1 -0
  81. package/dist/event-handler.service.js +21 -0
  82. package/dist/event-handler.service.js.map +1 -0
  83. package/dist/event-logger.d.ts +8 -0
  84. package/dist/event-logger.d.ts.map +1 -0
  85. package/dist/event-logger.js +19 -0
  86. package/dist/event-logger.js.map +1 -0
  87. package/dist/event-logger.service.d.ts +8 -0
  88. package/dist/event-logger.service.d.ts.map +1 -0
  89. package/dist/event-logger.service.js +19 -0
  90. package/dist/event-logger.service.js.map +1 -0
  91. package/dist/event.d.ts +7 -46
  92. package/dist/event.d.ts.map +1 -0
  93. package/dist/event.js +23 -0
  94. package/dist/event.js.map +1 -0
  95. package/dist/event.vo.d.ts +20 -0
  96. package/dist/event.vo.d.ts.map +1 -0
  97. package/dist/event.vo.js +23 -0
  98. package/dist/event.vo.js.map +1 -0
  99. package/dist/file-location.d.ts +10 -9
  100. package/dist/file-location.d.ts.map +1 -0
  101. package/dist/file-location.js +46 -0
  102. package/dist/file-location.js.map +1 -0
  103. package/dist/file-location.service.d.ts +32 -0
  104. package/dist/file-location.service.d.ts.map +1 -0
  105. package/dist/file-location.service.js +46 -0
  106. package/dist/file-location.service.js.map +1 -0
  107. package/dist/file-uploader.middleware.d.ts +13 -0
  108. package/dist/file-uploader.middleware.d.ts.map +1 -0
  109. package/dist/file-uploader.middleware.js +35 -0
  110. package/dist/file-uploader.middleware.js.map +1 -0
  111. package/dist/graceful-shutdown.service.d.ts +7 -0
  112. package/dist/graceful-shutdown.service.d.ts.map +1 -0
  113. package/dist/graceful-shutdown.service.js +32 -0
  114. package/dist/graceful-shutdown.service.js.map +1 -0
  115. package/dist/gzip.d.ts +1 -0
  116. package/dist/gzip.d.ts.map +1 -0
  117. package/dist/gzip.js +18 -0
  118. package/dist/gzip.js.map +1 -0
  119. package/dist/gzip.service.d.ts +13 -0
  120. package/dist/gzip.service.d.ts.map +1 -0
  121. package/dist/gzip.service.js +18 -0
  122. package/dist/gzip.service.js.map +1 -0
  123. package/dist/hcaptcha-shield.d.ts +12 -13
  124. package/dist/hcaptcha-shield.d.ts.map +1 -0
  125. package/dist/hcaptcha-shield.js +34 -0
  126. package/dist/hcaptcha-shield.js.map +1 -0
  127. package/dist/hcaptcha-shield.middleware.d.ts +23 -0
  128. package/dist/hcaptcha-shield.middleware.d.ts.map +1 -0
  129. package/dist/hcaptcha-shield.middleware.js +34 -0
  130. package/dist/hcaptcha-shield.middleware.js.map +1 -0
  131. package/dist/healthcheck.d.ts +5 -5
  132. package/dist/healthcheck.d.ts.map +1 -1
  133. package/dist/healthcheck.js +5 -5
  134. package/dist/healthcheck.js.map +1 -1
  135. package/dist/healthcheck.service.d.ts +22 -0
  136. package/dist/healthcheck.service.d.ts.map +1 -0
  137. package/dist/healthcheck.service.js +35 -0
  138. package/dist/healthcheck.service.js.map +1 -0
  139. package/dist/http-logger.middleware.d.ts +7 -0
  140. package/dist/http-logger.middleware.d.ts.map +1 -0
  141. package/dist/http-logger.middleware.js +89 -0
  142. package/dist/http-logger.middleware.js.map +1 -0
  143. package/dist/i18n.d.ts.map +1 -1
  144. package/dist/i18n.js.map +1 -1
  145. package/dist/i18n.service.d.ts +22 -0
  146. package/dist/i18n.service.d.ts.map +1 -0
  147. package/dist/i18n.service.js +35 -0
  148. package/dist/i18n.service.js.map +1 -0
  149. package/dist/image-compressor.d.ts +9 -4
  150. package/dist/image-compressor.d.ts.map +1 -0
  151. package/dist/image-compressor.js +13 -0
  152. package/dist/image-compressor.js.map +1 -0
  153. package/dist/image-compressor.service.d.ts +15 -0
  154. package/dist/image-compressor.service.d.ts.map +1 -0
  155. package/dist/image-compressor.service.js +13 -0
  156. package/dist/image-compressor.service.js.map +1 -0
  157. package/dist/image-exif.d.ts +10 -9
  158. package/dist/image-exif.d.ts.map +1 -0
  159. package/dist/image-exif.js +21 -0
  160. package/dist/image-exif.js.map +1 -0
  161. package/dist/image-exif.service.d.ts +19 -0
  162. package/dist/image-exif.service.d.ts.map +1 -0
  163. package/dist/image-exif.service.js +21 -0
  164. package/dist/image-exif.service.js.map +1 -0
  165. package/dist/index.d.ts +51 -34
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +51 -34
  168. package/dist/index.js.map +1 -1
  169. package/dist/jobs.d.ts.map +1 -1
  170. package/dist/jobs.js.map +1 -1
  171. package/dist/jobs.service.d.ts +33 -0
  172. package/dist/jobs.service.d.ts.map +1 -0
  173. package/dist/jobs.service.js +72 -0
  174. package/dist/jobs.service.js.map +1 -0
  175. package/dist/logger.d.ts.map +1 -1
  176. package/dist/logger.js.map +1 -1
  177. package/dist/logger.service.d.ts +69 -0
  178. package/dist/logger.service.d.ts.map +1 -0
  179. package/dist/logger.service.js +87 -0
  180. package/dist/logger.service.js.map +1 -0
  181. package/dist/mailer.d.ts.map +1 -1
  182. package/dist/mailer.js.map +1 -1
  183. package/dist/mailer.service.d.ts +38 -0
  184. package/dist/mailer.service.d.ts.map +1 -0
  185. package/dist/mailer.service.js +33 -0
  186. package/dist/mailer.service.js.map +1 -0
  187. package/dist/memory-consumption.service.d.ts +5 -0
  188. package/dist/memory-consumption.service.d.ts.map +1 -0
  189. package/dist/memory-consumption.service.js +8 -0
  190. package/dist/memory-consumption.service.js.map +1 -0
  191. package/dist/new-uuid.service.d.ts +4 -0
  192. package/dist/new-uuid.service.d.ts.map +1 -0
  193. package/dist/new-uuid.service.js +6 -0
  194. package/dist/new-uuid.service.js.map +1 -0
  195. package/dist/node-env.vo.d.ts.map +1 -1
  196. package/dist/node-env.vo.js.map +1 -1
  197. package/dist/open-graph.d.ts +31 -12
  198. package/dist/open-graph.d.ts.map +1 -0
  199. package/dist/open-graph.js +172 -0
  200. package/dist/open-graph.js.map +1 -0
  201. package/dist/open-graph.service.d.ts +110 -0
  202. package/dist/open-graph.service.d.ts.map +1 -0
  203. package/dist/open-graph.service.js +172 -0
  204. package/dist/open-graph.service.js.map +1 -0
  205. package/dist/passwords.d.ts.map +1 -1
  206. package/dist/passwords.js.map +1 -1
  207. package/dist/passwords.vo.d.ts +21 -0
  208. package/dist/passwords.vo.d.ts.map +1 -0
  209. package/dist/passwords.vo.js +42 -0
  210. package/dist/passwords.vo.js.map +1 -0
  211. package/dist/path.d.ts.map +1 -1
  212. package/dist/path.vo.d.ts +4 -0
  213. package/dist/path.vo.d.ts.map +1 -0
  214. package/dist/path.vo.js +3 -0
  215. package/dist/path.vo.js.map +1 -0
  216. package/dist/policy.service.d.ts +12 -0
  217. package/dist/policy.service.d.ts.map +1 -0
  218. package/dist/policy.service.js +14 -0
  219. package/dist/policy.service.js.map +1 -0
  220. package/dist/port.d.ts.map +1 -1
  221. package/dist/port.vo.d.ts +4 -0
  222. package/dist/port.vo.d.ts.map +1 -0
  223. package/dist/port.vo.js +3 -0
  224. package/dist/port.vo.js.map +1 -0
  225. package/dist/prerequisites/binary.d.ts +5 -5
  226. package/dist/prerequisites/binary.d.ts.map +1 -1
  227. package/dist/prerequisites/binary.js +4 -4
  228. package/dist/prerequisites/binary.js.map +1 -1
  229. package/dist/prerequisites/bun.d.ts +5 -5
  230. package/dist/prerequisites/bun.d.ts.map +1 -1
  231. package/dist/prerequisites/bun.js +5 -3
  232. package/dist/prerequisites/bun.js.map +1 -1
  233. package/dist/prerequisites/dependency-vulnerabilities.d.ts +13 -0
  234. package/dist/prerequisites/dependency-vulnerabilities.d.ts.map +1 -0
  235. package/dist/prerequisites/dependency-vulnerabilities.js +30 -0
  236. package/dist/prerequisites/dependency-vulnerabilities.js.map +1 -0
  237. package/dist/prerequisites/external-api.d.ts +14 -0
  238. package/dist/prerequisites/external-api.d.ts.map +1 -0
  239. package/dist/prerequisites/external-api.js +21 -0
  240. package/dist/prerequisites/external-api.js.map +1 -0
  241. package/dist/prerequisites/index.d.ts +2 -0
  242. package/dist/prerequisites/index.d.ts.map +1 -1
  243. package/dist/prerequisites/index.js +2 -0
  244. package/dist/prerequisites/index.js.map +1 -1
  245. package/dist/prerequisites/jobs.d.ts +6 -6
  246. package/dist/prerequisites/jobs.d.ts.map +1 -1
  247. package/dist/prerequisites/jobs.js +5 -5
  248. package/dist/prerequisites/jobs.js.map +1 -1
  249. package/dist/prerequisites/log-file.d.ts +6 -6
  250. package/dist/prerequisites/log-file.d.ts.map +1 -1
  251. package/dist/prerequisites/log-file.js +4 -4
  252. package/dist/prerequisites/log-file.js.map +1 -1
  253. package/dist/prerequisites/mailer.d.ts +6 -6
  254. package/dist/prerequisites/mailer.d.ts.map +1 -1
  255. package/dist/prerequisites/mailer.js +4 -4
  256. package/dist/prerequisites/mailer.js.map +1 -1
  257. package/dist/prerequisites/memory.d.ts +5 -5
  258. package/dist/prerequisites/memory.d.ts.map +1 -1
  259. package/dist/prerequisites/memory.js +5 -5
  260. package/dist/prerequisites/memory.js.map +1 -1
  261. package/dist/prerequisites/node.d.ts +5 -5
  262. package/dist/prerequisites/node.d.ts.map +1 -1
  263. package/dist/prerequisites/node.js +4 -4
  264. package/dist/prerequisites/node.js.map +1 -1
  265. package/dist/prerequisites/outside-connectivity.d.ts +5 -5
  266. package/dist/prerequisites/outside-connectivity.d.ts.map +1 -1
  267. package/dist/prerequisites/outside-connectivity.js +4 -4
  268. package/dist/prerequisites/outside-connectivity.js.map +1 -1
  269. package/dist/prerequisites/path.d.ts +5 -5
  270. package/dist/prerequisites/path.d.ts.map +1 -1
  271. package/dist/prerequisites/path.js +4 -4
  272. package/dist/prerequisites/path.js.map +1 -1
  273. package/dist/prerequisites/port.d.ts +6 -6
  274. package/dist/prerequisites/port.d.ts.map +1 -1
  275. package/dist/prerequisites/port.js +6 -6
  276. package/dist/prerequisites/port.js.map +1 -1
  277. package/dist/prerequisites/ram.d.ts +5 -5
  278. package/dist/prerequisites/ram.d.ts.map +1 -1
  279. package/dist/prerequisites/ram.js +4 -4
  280. package/dist/prerequisites/ram.js.map +1 -1
  281. package/dist/prerequisites/self.d.ts +5 -5
  282. package/dist/prerequisites/self.d.ts.map +1 -1
  283. package/dist/prerequisites/self.js +4 -4
  284. package/dist/prerequisites/self.js.map +1 -1
  285. package/dist/prerequisites/space.d.ts +5 -5
  286. package/dist/prerequisites/space.d.ts.map +1 -1
  287. package/dist/prerequisites/space.js +4 -4
  288. package/dist/prerequisites/space.js.map +1 -1
  289. package/dist/prerequisites/ssl-certificate-expiry.d.ts +5 -5
  290. package/dist/prerequisites/ssl-certificate-expiry.d.ts.map +1 -1
  291. package/dist/prerequisites/ssl-certificate-expiry.js +5 -5
  292. package/dist/prerequisites/ssl-certificate-expiry.js.map +1 -1
  293. package/dist/prerequisites/timezone-utc.d.ts +5 -5
  294. package/dist/prerequisites/timezone-utc.d.ts.map +1 -1
  295. package/dist/prerequisites/timezone-utc.js +4 -4
  296. package/dist/prerequisites/timezone-utc.js.map +1 -1
  297. package/dist/prerequisites/translations.d.ts +8 -8
  298. package/dist/prerequisites/translations.d.ts.map +1 -1
  299. package/dist/prerequisites/translations.js +8 -8
  300. package/dist/prerequisites/translations.js.map +1 -1
  301. package/dist/prerequisites.d.ts +2 -0
  302. package/dist/prerequisites.d.ts.map +1 -1
  303. package/dist/prerequisites.js +2 -0
  304. package/dist/prerequisites.js.map +1 -1
  305. package/dist/prerequisites.service.d.ts +49 -0
  306. package/dist/prerequisites.service.d.ts.map +1 -0
  307. package/dist/prerequisites.service.js +86 -0
  308. package/dist/prerequisites.service.js.map +1 -0
  309. package/dist/rate-limit-shield.middleware.d.ts +10 -0
  310. package/dist/rate-limit-shield.middleware.d.ts.map +1 -0
  311. package/dist/rate-limit-shield.middleware.js +21 -0
  312. package/dist/rate-limit-shield.middleware.js.map +1 -0
  313. package/dist/recaptcha-shield.d.ts +13 -5
  314. package/dist/recaptcha-shield.d.ts.map +1 -0
  315. package/dist/recaptcha-shield.js +50 -0
  316. package/dist/recaptcha-shield.js.map +1 -0
  317. package/dist/recaptcha-shield.middleware.d.ts +20 -0
  318. package/dist/recaptcha-shield.middleware.d.ts.map +1 -0
  319. package/dist/recaptcha-shield.middleware.js +50 -0
  320. package/dist/recaptcha-shield.middleware.js.map +1 -0
  321. package/dist/session-id.vo.d.ts +7 -0
  322. package/dist/session-id.vo.d.ts.map +1 -0
  323. package/dist/session-id.vo.js +10 -0
  324. package/dist/session-id.vo.js.map +1 -0
  325. package/dist/setup.js +1 -1
  326. package/dist/setup.js.map +1 -1
  327. package/dist/setup.service.d.ts +9 -0
  328. package/dist/setup.service.d.ts.map +1 -0
  329. package/dist/setup.service.js +39 -0
  330. package/dist/setup.service.js.map +1 -0
  331. package/dist/simulated-error.d.ts +2 -2
  332. package/dist/simulated-error.d.ts.map +1 -0
  333. package/dist/simulated-error.js +7 -0
  334. package/dist/simulated-error.js.map +1 -0
  335. package/dist/simulated-error.middleware.d.ts +4 -0
  336. package/dist/simulated-error.middleware.d.ts.map +1 -0
  337. package/dist/simulated-error.middleware.js +7 -0
  338. package/dist/simulated-error.middleware.js.map +1 -0
  339. package/dist/sitemap.d.ts +19 -27
  340. package/dist/sitemap.d.ts.map +1 -0
  341. package/dist/sitemap.js +57 -0
  342. package/dist/sitemap.js.map +1 -0
  343. package/dist/sitemap.service.d.ts +29 -0
  344. package/dist/sitemap.service.d.ts.map +1 -0
  345. package/dist/sitemap.service.js +57 -0
  346. package/dist/sitemap.service.js.map +1 -0
  347. package/dist/slower.d.ts +3 -6
  348. package/dist/slower.d.ts.map +1 -0
  349. package/dist/slower.js +8 -0
  350. package/dist/slower.js.map +1 -0
  351. package/dist/slower.middleware.d.ts +5 -0
  352. package/dist/slower.middleware.d.ts.map +1 -0
  353. package/dist/slower.middleware.js +8 -0
  354. package/dist/slower.middleware.js.map +1 -0
  355. package/dist/time-zone-offset.middleware.d.ts +15 -0
  356. package/dist/time-zone-offset.middleware.d.ts.map +1 -0
  357. package/dist/time-zone-offset.middleware.js +22 -0
  358. package/dist/time-zone-offset.middleware.js.map +1 -0
  359. package/dist/tsconfig.tsbuildinfo +1 -1
  360. package/dist/uptime.service.d.ts +9 -0
  361. package/dist/uptime.service.d.ts.map +1 -0
  362. package/dist/uptime.service.js +10 -0
  363. package/dist/uptime.service.js.map +1 -0
  364. package/dist/url-wo-trailing-slash.d.ts +4 -0
  365. package/dist/url-wo-trailing-slash.d.ts.map +1 -0
  366. package/dist/url-wo-trailing-slash.js +9 -0
  367. package/dist/url-wo-trailing-slash.js.map +1 -0
  368. package/dist/url-wo-trailing-slash.vo.d.ts +4 -0
  369. package/dist/url-wo-trailing-slash.vo.d.ts.map +1 -0
  370. package/dist/url-wo-trailing-slash.vo.js +9 -0
  371. package/dist/url-wo-trailing-slash.vo.js.map +1 -0
  372. package/dist/username.vo.d.ts +11 -0
  373. package/dist/username.vo.d.ts.map +1 -0
  374. package/dist/username.vo.js +13 -0
  375. package/dist/username.vo.js.map +1 -0
  376. package/dist/uuid.d.ts.map +1 -1
  377. package/dist/uuid.vo.d.ts +4 -0
  378. package/dist/uuid.vo.d.ts.map +1 -0
  379. package/dist/uuid.vo.js +4 -0
  380. package/dist/uuid.vo.js.map +1 -0
  381. package/dist/weak-etag-extractor.middleware.d.ts +7 -0
  382. package/dist/weak-etag-extractor.middleware.d.ts.map +1 -0
  383. package/dist/weak-etag-extractor.middleware.js +18 -0
  384. package/dist/weak-etag-extractor.middleware.js.map +1 -0
  385. package/package.json +5 -2
  386. package/src/{api-version.ts → api-version.middleware.ts} +1 -1
  387. package/src/{auth-shield.ts → auth-shield.middleware.ts} +3 -3
  388. package/src/basic-auth.service.ts +26 -0
  389. package/src/{cache-response.ts → cache-response.middleware.ts} +1 -1
  390. package/src/{context.ts → context.middleware.ts} +2 -2
  391. package/src/{correlation-id.ts → correlation-id.vo.ts} +2 -1
  392. package/src/decorators.service.ts +78 -0
  393. package/src/encryption.service.ts +60 -0
  394. package/src/event-handler.service.ts +20 -0
  395. package/src/event-logger.service.ts +24 -0
  396. package/src/event.vo.ts +29 -0
  397. package/src/file-location.service.ts +70 -0
  398. package/src/gzip.service.ts +23 -0
  399. package/src/hcaptcha-shield.middleware.ts +57 -0
  400. package/src/{healthcheck.ts → healthcheck.service.ts} +12 -17
  401. package/src/{http-logger.ts → http-logger.middleware.ts} +4 -4
  402. package/src/{i18n.ts → i18n.service.ts} +6 -2
  403. package/src/image-compressor.service.ts +26 -0
  404. package/src/image-exif.service.ts +38 -0
  405. package/src/index.ts +51 -34
  406. package/src/{jobs.ts → jobs.service.ts} +4 -3
  407. package/src/{logger.ts → logger.service.ts} +8 -2
  408. package/src/{mailer.ts → mailer.service.ts} +11 -2
  409. package/src/node-env.vo.ts +1 -0
  410. package/src/open-graph.service.ts +259 -0
  411. package/src/{passwords.ts → passwords.vo.ts} +1 -0
  412. package/src/{path.ts → path.vo.ts} +1 -0
  413. package/src/policy.service.ts +25 -0
  414. package/src/{port.ts → port.vo.ts} +1 -0
  415. package/src/prerequisites/binary.ts +6 -10
  416. package/src/prerequisites/bun.ts +7 -10
  417. package/src/prerequisites/dependency-vulnerabilities.ts +54 -0
  418. package/src/prerequisites/external-api.ts +27 -0
  419. package/src/prerequisites/index.ts +2 -0
  420. package/src/prerequisites/jobs.ts +7 -13
  421. package/src/prerequisites/log-file.ts +7 -12
  422. package/src/prerequisites/mailer.ts +7 -12
  423. package/src/prerequisites/memory.ts +7 -12
  424. package/src/prerequisites/node.ts +6 -11
  425. package/src/prerequisites/outside-connectivity.ts +6 -11
  426. package/src/prerequisites/path.ts +6 -11
  427. package/src/prerequisites/port.ts +9 -15
  428. package/src/prerequisites/ram.ts +6 -11
  429. package/src/prerequisites/self.ts +6 -11
  430. package/src/prerequisites/space.ts +6 -11
  431. package/src/prerequisites/ssl-certificate-expiry.ts +7 -12
  432. package/src/prerequisites/timezone-utc.ts +6 -11
  433. package/src/prerequisites/translations.ts +14 -19
  434. package/src/{prerequisites.ts → prerequisites.service.ts} +3 -0
  435. package/src/{rate-limit-shield.ts → rate-limit-shield.middleware.ts} +8 -2
  436. package/src/recaptcha-shield.middleware.ts +76 -0
  437. package/src/{setup.ts → setup.service.ts} +9 -9
  438. package/src/simulated-error.middleware.ts +8 -0
  439. package/src/sitemap.service.ts +98 -0
  440. package/src/slower.middleware.ts +10 -0
  441. package/src/url-wo-trailing-slash.vo.ts +11 -0
  442. package/src/{uuid.ts → uuid.vo.ts} +2 -1
  443. package/src/{weak-etag-extractor.ts → weak-etag-extractor.middleware.ts} +1 -1
  444. package/src/basic-auth.ts +0 -7
  445. /package/src/{api-key-shield.ts → api-key-shield.middleware.ts} +0 -0
  446. /package/src/{build-info-repository.ts → build-info-repository.service.ts} +0 -0
  447. /package/src/{cache-resolver.ts → cache-resolver.service.ts} +0 -0
  448. /package/src/{cache-static-files.ts → cache-static-files.middleware.ts} +0 -0
  449. /package/src/{download-file.ts → download-file.service.ts} +0 -0
  450. /package/src/{env-validator.ts → env-validator.service.ts} +0 -0
  451. /package/src/{etag-extractor.ts → etag-extractor.middleware.ts} +0 -0
  452. /package/src/{file-uploader.ts → file-uploader.middleware.ts} +0 -0
  453. /package/src/{graceful-shutdown.ts → graceful-shutdown.service.ts} +0 -0
  454. /package/src/{memory-consumption.ts → memory-consumption.service.ts} +0 -0
  455. /package/src/{new-uuid.ts → new-uuid.service.ts} +0 -0
  456. /package/src/{session-id.ts → session-id.vo.ts} +0 -0
  457. /package/src/{time-zone-offset.ts → time-zone-offset.middleware.ts} +0 -0
  458. /package/src/{uptime.ts → uptime.service.ts} +0 -0
  459. /package/src/{username.ts → username.vo.ts} +0 -0
@@ -0,0 +1,9 @@
1
+ import * as tools from "@bgord/tools";
2
+ export type UptimeResultType = {
3
+ seconds: tools.TimestampType;
4
+ formatted: ReturnType<(typeof tools.DateFormatters)["relative"]>;
5
+ };
6
+ export declare class Uptime {
7
+ static get(): UptimeResultType;
8
+ }
9
+ //# sourceMappingURL=uptime.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uptime.service.d.ts","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC;IAC7B,SAAS,EAAE,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF,qBAAa,MAAM;IACjB,MAAM,CAAC,GAAG,IAAI,gBAAgB;CAO/B"}
@@ -0,0 +1,10 @@
1
+ import * as tools from "@bgord/tools";
2
+ export class Uptime {
3
+ static get() {
4
+ const rounding = new tools.RoundToNearest();
5
+ const uptime = tools.Time.Seconds(rounding.round(process.uptime()));
6
+ const uptimeFormatted = tools.DateFormatters.relative(Date.now() - uptime.ms);
7
+ return { seconds: uptime.seconds, formatted: uptimeFormatted };
8
+ }
9
+ }
10
+ //# sourceMappingURL=uptime.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uptime.service.js","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAOtC,MAAM,OAAO,MAAM;IACjB,MAAM,CAAC,GAAG;QACR,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod/v4";
2
+ export declare const UrlWithoutTrailingSlash: z.ZodURL;
3
+ export type UrlWithoutTrailingSlashType = z.infer<typeof UrlWithoutTrailingSlash>;
4
+ //# sourceMappingURL=url-wo-trailing-slash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-wo-trailing-slash.d.ts","sourceRoot":"","sources":["../src/url-wo-trailing-slash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,eAAO,MAAM,uBAAuB,UAMhC,CAAC;AAEL,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod/v4";
2
+ export const UrlWithoutTrailingSlash = z
3
+ .url()
4
+ .trim()
5
+ .min(1)
6
+ .refine((value) => !value.endsWith("/"), {
7
+ message: "url_cannot_end_with_trailing_slash",
8
+ });
9
+ //# sourceMappingURL=url-wo-trailing-slash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-wo-trailing-slash.js","sourceRoot":"","sources":["../src/url-wo-trailing-slash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,GAAG,EAAE;KACL,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,CAAC;KACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;IACvC,OAAO,EAAE,oCAAoC;CAC9C,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod/v4";
2
+ export declare const UrlWithoutTrailingSlash: z.ZodURL;
3
+ export type UrlWithoutTrailingSlashType = z.infer<typeof UrlWithoutTrailingSlash>;
4
+ //# sourceMappingURL=url-wo-trailing-slash.vo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-wo-trailing-slash.vo.d.ts","sourceRoot":"","sources":["../src/url-wo-trailing-slash.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,eAAO,MAAM,uBAAuB,UAMhC,CAAC;AAEL,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod/v4";
2
+ export const UrlWithoutTrailingSlash = z
3
+ .url()
4
+ .trim()
5
+ .min(1)
6
+ .refine((value) => !value.endsWith("/"), {
7
+ message: "url_cannot_end_with_trailing_slash",
8
+ });
9
+ //# sourceMappingURL=url-wo-trailing-slash.vo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-wo-trailing-slash.vo.js","sourceRoot":"","sources":["../src/url-wo-trailing-slash.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,GAAG,EAAE;KACL,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,CAAC;KACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;IACvC,OAAO,EAAE,oCAAoC;CAC9C,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod/v4";
2
+ export type IdType = string;
3
+ type UsernameType = string;
4
+ export declare class Username {
5
+ private readonly schema;
6
+ private readonly value;
7
+ constructor(value: UsernameType, schema?: z.ZodSchema);
8
+ read(): UsernameType;
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=username.vo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"username.vo.d.ts","sourceRoot":"","sources":["../src/username.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,KAAK,YAAY,GAAG,MAAM,CAAC;AAE3B,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS;IAKrD,IAAI,IAAI,YAAY;CAGrB"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod/v4";
2
+ export class Username {
3
+ schema = z.string().max(256);
4
+ value;
5
+ constructor(value, schema) {
6
+ this.schema = schema ?? this.schema;
7
+ this.value = this.schema.parse(value);
8
+ }
9
+ read() {
10
+ return this.value;
11
+ }
12
+ }
13
+ //# sourceMappingURL=username.vo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"username.vo.js","sourceRoot":"","sources":["../src/username.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAM3B,MAAM,OAAO,QAAQ;IACF,MAAM,GAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE1C,KAAK,CAAe;IAErC,YAAY,KAAmB,EAAE,MAAoB;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAiB,CAAC;IACxD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAI3B,eAAO,MAAM,IAAI,yBAA6C,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAI3B,eAAO,MAAM,IAAI,yBAA6C,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod/v4";
2
+ export declare const UUID: z.ZodDefault<z.ZodUUID>;
3
+ export type UUIDType = z.infer<typeof UUID>;
4
+ //# sourceMappingURL=uuid.vo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.vo.d.ts","sourceRoot":"","sources":["../src/uuid.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAI3B,eAAO,MAAM,IAAI,yBAA6C,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod/v4";
2
+ import { NewUUID } from "./new-uuid.service";
3
+ export const UUID = z.uuid().default(() => NewUUID.generate());
4
+ //# sourceMappingURL=uuid.vo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.vo.js","sourceRoot":"","sources":["../src/uuid.vo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { EtagVariables } from "./etag-extractor.middleware";
2
+ export declare class WeakETagExtractor {
3
+ static attach: import("hono").MiddlewareHandler<{
4
+ Variables: EtagVariables;
5
+ }, string, {}>;
6
+ }
7
+ //# sourceMappingURL=weak-etag-extractor.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weak-etag-extractor.middleware.d.ts","sourceRoot":"","sources":["../src/weak-etag-extractor.middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,MAAM;mBAAiC,aAAa;mBAWxD;CACJ"}
@@ -0,0 +1,18 @@
1
+ import * as tools from "@bgord/tools";
2
+ import { createMiddleware } from "hono/factory";
3
+ export class WeakETagExtractor {
4
+ static attach = createMiddleware(async (c, next) => {
5
+ try {
6
+ const header = String(c.req.header(tools.WeakETag.IF_MATCH_HEADER_NAME));
7
+ if (!header || header === "undefined")
8
+ c.set("WeakETag", null);
9
+ else
10
+ c.set("WeakETag", tools.WeakETag.fromHeader(header));
11
+ }
12
+ catch (error) {
13
+ c.set("WeakETag", null);
14
+ }
15
+ await next();
16
+ });
17
+ }
18
+ //# sourceMappingURL=weak-etag-extractor.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weak-etag-extractor.middleware.js","sourceRoot":"","sources":["../src/weak-etag-extractor.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAA+B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAEzE,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW;gBAAE,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;;gBAC1D,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": "Bartosz Gordon",
@@ -22,6 +22,7 @@
22
22
  "@commitlint/config-conventional": "19.8.1",
23
23
  "@types/bun": "1.2.15",
24
24
  "@types/lodash": "4.17.17",
25
+ "@types/mime-types": "3.0.1",
25
26
  "@types/nodemailer": "6.4.17",
26
27
  "cspell": "9.0.2",
27
28
  "knip": "5.60.2",
@@ -31,12 +32,14 @@
31
32
  "typescript": "5.8.3"
32
33
  },
33
34
  "dependencies": {
34
- "@bgord/tools": "0.6.0",
35
+ "@bgord/tools": "0.8.0",
35
36
  "check-disk-space": "3.4.0",
36
37
  "croner": "9.0.0",
38
+ "hcaptcha": "0.2.0",
37
39
  "hono": "4.7.11",
38
40
  "lodash": "4.17.21",
39
41
  "lucia": "3.2.2",
42
+ "mime-types": "3.0.1",
40
43
  "node-cache": "5.1.2",
41
44
  "nodemailer": "7.0.3",
42
45
  "sharp": "0.34.2",
@@ -1,6 +1,6 @@
1
1
  import { createMiddleware } from "hono/factory";
2
2
 
3
- import { BuildInfoRepository } from "./build-info-repository";
3
+ import { BuildInfoRepository } from "./build-info-repository.service";
4
4
 
5
5
  export class ApiVersion {
6
6
  static HEADER_NAME = "api-version";
@@ -3,9 +3,9 @@ import { createMiddleware } from "hono/factory";
3
3
  import { HTTPException } from "hono/http-exception";
4
4
  import { Lucia } from "lucia";
5
5
 
6
- import { HashedPassword, Password, PasswordType } from "./passwords";
7
- import { SessionId } from "./session-id";
8
- import { IdType, Username } from "./username";
6
+ import { HashedPassword, Password, PasswordType } from "./passwords.vo";
7
+ import { SessionId } from "./session-id.vo";
8
+ import { IdType, Username } from "./username.vo";
9
9
 
10
10
  type AuthShieldConfigType<T> = {
11
11
  Username: typeof Username;
@@ -0,0 +1,26 @@
1
+ import { z } from "zod/v4";
2
+
3
+ export const BasicAuthUsername = z.string().min(1).max(128);
4
+
5
+ export type BasicAuthUsernameType = z.infer<typeof BasicAuthUsername>;
6
+
7
+ export const BasicAuthPassword = z.string().min(1).max(128);
8
+
9
+ export type BasicAuthPasswordType = z.infer<typeof BasicAuthPassword>;
10
+
11
+ type BasicAuthHeaderValueType = { authorization: string };
12
+
13
+ export class BasicAuth {
14
+ static toHeaderValue(
15
+ username: BasicAuthUsernameType,
16
+ password: BasicAuthPasswordType,
17
+ ): BasicAuthHeaderValueType {
18
+ const credentials = btoa(`${username}:${password}`);
19
+
20
+ return { authorization: `Basic ${credentials}` };
21
+ }
22
+
23
+ static toHeader(username: BasicAuthUsernameType, password: BasicAuthPasswordType): Headers {
24
+ return new Headers(BasicAuth.toHeaderValue(username, password));
25
+ }
26
+ }
@@ -2,7 +2,7 @@ import { createMiddleware } from "hono/factory";
2
2
  import _ from "lodash";
3
3
  import NodeCache from "node-cache";
4
4
 
5
- import { CacheHitEnum } from "./cache-resolver";
5
+ import { CacheHitEnum } from "./cache-resolver.service";
6
6
 
7
7
  export class CacheResponse {
8
8
  static readonly CACHE_HIT_HEADER = "Cache-Hit";
@@ -1,7 +1,7 @@
1
1
  import { createMiddleware } from "hono/factory";
2
2
 
3
- import { CorrelationIdType } from "./correlation-id";
4
- import { TimeZoneOffsetVariables } from "./time-zone-offset";
3
+ import type { CorrelationIdType } from "./correlation-id.vo";
4
+ import { TimeZoneOffsetVariables } from "./time-zone-offset.middleware";
5
5
 
6
6
  export type ContextType = {
7
7
  requestId: CorrelationIdType;
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod/v4";
2
2
 
3
- import { UUID } from "./uuid";
3
+ import { UUID } from "./uuid.vo";
4
4
 
5
5
  export const CorrelationId = UUID;
6
+
6
7
  export type CorrelationIdType = z.infer<typeof CorrelationId>;
@@ -0,0 +1,78 @@
1
+ import * as tools from "@bgord/tools";
2
+
3
+ import { Logger } from "./logger.service";
4
+
5
+ export class DecoratorTimeoutError extends Error {}
6
+
7
+ export class Decorators {
8
+ private readonly rounding = new tools.RoundToDecimal(2);
9
+
10
+ constructor(private readonly logger: Logger) {}
11
+
12
+ duration() {
13
+ const that = this;
14
+
15
+ return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
16
+ const className =
17
+ // @ts-expect-error
18
+ this?.constructor?.name || target?.name || target?.constructor?.name || "UnknownClass";
19
+
20
+ const original: (...args: unknown[]) => unknown = descriptor.value;
21
+
22
+ const label = `${className}.${propertyKey}`;
23
+
24
+ descriptor.value = function (...args: unknown[]) {
25
+ const before = performance.now();
26
+ const value = original.apply(this, args);
27
+ const after = performance.now();
28
+
29
+ that.logger.info({
30
+ message: `${label} duration`,
31
+ operation: "decorators_duration_ms",
32
+ metadata: { durationMs: that.rounding.round(after - before) },
33
+ });
34
+
35
+ return value;
36
+ };
37
+ };
38
+ }
39
+
40
+ inspector() {
41
+ const that = this;
42
+
43
+ return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
44
+ const className =
45
+ // @ts-expect-error
46
+ this?.constructor?.name || target?.name || target?.constructor?.name || "UnknownClass";
47
+
48
+ const original: (...args: unknown[]) => unknown = descriptor.value;
49
+
50
+ const label = `${className}.${propertyKey}`;
51
+
52
+ descriptor.value = async function (...args: unknown[]) {
53
+ const value = await original.apply(this, args);
54
+
55
+ that.logger.info({
56
+ message: `${label} inspector`,
57
+ operation: "decorators_inspector",
58
+ metadata: { arguments: args, output: value },
59
+ });
60
+
61
+ return value;
62
+ };
63
+ };
64
+ }
65
+
66
+ timeout(ms: number) {
67
+ return (_target: any, _key: string, descriptor: PropertyDescriptor) => {
68
+ const original: (...args: unknown[]) => unknown = descriptor.value;
69
+
70
+ descriptor.value = async function (...args: any[]) {
71
+ return await Promise.race([
72
+ original.apply(this, args),
73
+ new Promise((_, reject) => setTimeout(() => reject(new DecoratorTimeoutError()), ms)),
74
+ ]);
75
+ };
76
+ };
77
+ }
78
+ }
@@ -0,0 +1,60 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import { pipeline } from "node:stream/promises";
4
+ import * as util from "node:util";
5
+ import { z } from "zod/v4";
6
+
7
+ export const EncryptionIV = z
8
+ .string()
9
+ .min(1)
10
+ .transform((value) => Buffer.from(value.split(",").map(Number)));
11
+
12
+ export type EncryptionIVType = z.infer<typeof EncryptionIV>;
13
+
14
+ export const EncryptionSecret = z.string().length(64);
15
+
16
+ export type EncryptionSecretType = z.infer<typeof EncryptionSecret>;
17
+
18
+ export type EncryptionConfig = {
19
+ secret: EncryptionSecretType;
20
+ iv: EncryptionIVType;
21
+ };
22
+
23
+ export type EncryptionOperationConfig = {
24
+ input: fs.PathLike;
25
+ output: fs.PathLike;
26
+ };
27
+
28
+ const scrypt = util.promisify(crypto.scrypt);
29
+
30
+ export class Encryption {
31
+ private readonly algorithm = "aes-192-cbc";
32
+
33
+ constructor(private readonly config: EncryptionConfig) {}
34
+
35
+ async createEncrypt() {
36
+ const key = (await scrypt(this.config.secret, "salt", 24)) as Buffer;
37
+
38
+ // @ts-ignore
39
+ return crypto.createCipheriv(this.algorithm, key, this.config.iv);
40
+ }
41
+
42
+ async createDecrypt() {
43
+ const key = (await scrypt(this.config.secret, "salt", 24)) as Buffer;
44
+
45
+ // @ts-ignore
46
+ return crypto.createDecipheriv(this.algorithm, key, this.config.iv);
47
+ }
48
+
49
+ async encrypt(config: EncryptionOperationConfig) {
50
+ const encrypt = await this.createEncrypt();
51
+
52
+ return pipeline(fs.createReadStream(config.input), encrypt, fs.createWriteStream(config.output));
53
+ }
54
+
55
+ async decrypt(config: EncryptionOperationConfig) {
56
+ const decrypt = await this.createDecrypt();
57
+
58
+ return pipeline(fs.createReadStream(config.input), decrypt, fs.createWriteStream(config.output));
59
+ }
60
+ }
@@ -0,0 +1,20 @@
1
+ import type { EventType } from "./event.vo";
2
+ import { Logger } from "./logger.service";
3
+
4
+ export class EventHandler {
5
+ constructor(private readonly logger: Logger) {}
6
+
7
+ handle<T extends Pick<EventType, "name">>(fn: (event: T) => Promise<void>) {
8
+ return async (event: T) => {
9
+ try {
10
+ await fn(event);
11
+ } catch (error) {
12
+ this.logger.error({
13
+ message: `Unknown ${event.name} event handler error`,
14
+ operation: "unknown_event_handler_error",
15
+ metadata: this.logger.formatError(error),
16
+ });
17
+ }
18
+ };
19
+ }
20
+ }
@@ -0,0 +1,24 @@
1
+ import { Logger } from "./logger.service";
2
+
3
+ export class EventLogger {
4
+ constructor(private readonly logger: Logger) {}
5
+
6
+ private _handle(
7
+ type: string,
8
+ _debugName: string,
9
+ eventName: string | undefined,
10
+ eventData: Record<string, any> | undefined,
11
+ ) {
12
+ if (type === "subscribe") return;
13
+
14
+ if (typeof eventName === "symbol") return;
15
+
16
+ this.logger.info({
17
+ message: `${eventName} emitted`,
18
+ operation: "event_emitted",
19
+ metadata: eventData,
20
+ });
21
+ }
22
+
23
+ handle = this._handle.bind(this);
24
+ }
@@ -0,0 +1,29 @@
1
+ import { z } from "zod/v4";
2
+
3
+ import { UUID } from "./uuid.vo";
4
+
5
+ export const Event = z.object({
6
+ id: UUID,
7
+ createdAt: z.date(),
8
+
9
+ stream: z.string().min(1),
10
+
11
+ name: z.string().min(1),
12
+ version: z.number().int().positive(),
13
+ payload: z
14
+ .record(z.string(), z.any())
15
+ .refine((value) => {
16
+ try {
17
+ JSON.parse(JSON.stringify(value));
18
+ return true;
19
+ } catch (error) {
20
+ return false;
21
+ }
22
+ })
23
+ .transform((value) => JSON.stringify(value)),
24
+ });
25
+
26
+ export const ParsedEvent = Event.merge(z.object({ payload: z.record(z.string(), z.any()) }));
27
+
28
+ export type EventType = z.infer<typeof Event>;
29
+ export type ParsedEventType = z.infer<typeof ParsedEvent>;
@@ -0,0 +1,70 @@
1
+ import * as path from "node:path";
2
+
3
+ import { Path, PathType } from "./path.vo";
4
+
5
+ type FileLocationBasenameType = string;
6
+
7
+ type FileLocationExtensionType = string;
8
+
9
+ type FileLocationParentType = string;
10
+
11
+ export type FileLocationConfigType = {
12
+ parent: FileLocationParentType;
13
+ basename: FileLocationBasenameType;
14
+ extension: FileLocationExtensionType;
15
+ };
16
+
17
+ export class FileLocation {
18
+ readonly parent: PathType; // /parent/dir
19
+
20
+ private basename: FileLocationBasenameType; // index
21
+
22
+ private extension: FileLocationExtensionType; // .html
23
+
24
+ constructor(config: FileLocationConfigType) {
25
+ this.parent = Path.parse(config.parent);
26
+ this.basename = config.basename;
27
+ this.extension = config.extension;
28
+ }
29
+
30
+ getBasename(): FileLocationBasenameType {
31
+ return this.basename; // index
32
+ }
33
+
34
+ getExtension(): FileLocationExtensionType {
35
+ return this.extension; // .html
36
+ }
37
+
38
+ getFilename(extension?: FileLocationExtensionType): PathType {
39
+ return Path.parse(`${this.basename}${extension ?? this.extension}`); // index.html
40
+ }
41
+
42
+ getPath(extension?: FileLocationExtensionType): PathType {
43
+ const filename = this.getFilename(extension);
44
+ return Path.parse(path.join(this.parent, filename)); // parent/index.html
45
+ }
46
+
47
+ getGzippedPath(): PathType {
48
+ return Path.parse(`${this.getPath()}.gz`); // parent/index.html.gz
49
+ }
50
+
51
+ summary() {
52
+ return {
53
+ parent: this.parent,
54
+ basename: this.getBasename(),
55
+ extension: this.getExtension(),
56
+ filename: this.getFilename(),
57
+ path: this.getPath(),
58
+ gzipped: this.getGzippedPath(),
59
+ };
60
+ }
61
+
62
+ setBasename(basename: FileLocationBasenameType): FileLocation {
63
+ this.basename = basename;
64
+ return this;
65
+ }
66
+
67
+ async delete(): Promise<void> {
68
+ return Bun.file(this.getPath()).unlink();
69
+ }
70
+ }
@@ -0,0 +1,23 @@
1
+ import { PathLike, createReadStream, createWriteStream } from "node:fs";
2
+ import { pipeline } from "node:stream/promises";
3
+ import { createGunzip, createGzip } from "node:zlib";
4
+
5
+ type GzipCompressConfigType = { input: PathLike; output: PathLike };
6
+
7
+ export class Gzip {
8
+ static createCompress() {
9
+ return createGzip();
10
+ }
11
+
12
+ static createDecompress() {
13
+ return createGunzip();
14
+ }
15
+
16
+ static async compress(config: GzipCompressConfigType) {
17
+ return pipeline(createReadStream(config.input), createGzip(), createWriteStream(config.output));
18
+ }
19
+
20
+ static async uncompress(config: GzipCompressConfigType) {
21
+ return pipeline(createReadStream(config.input), createGunzip(), createWriteStream(config.output));
22
+ }
23
+ }
@@ -0,0 +1,57 @@
1
+ import hcaptcha from "hcaptcha";
2
+ import { createMiddleware } from "hono/factory";
3
+ import { HTTPException } from "hono/http-exception";
4
+ import { z } from "zod/v4";
5
+
6
+ export const HCaptchaSecretKey = z.string().trim().length(42);
7
+
8
+ export type HCaptchaSecretKeyType = z.infer<typeof HCaptchaSecretKey>;
9
+
10
+ export const HCaptchaSiteKey = z.string().trim().length(36);
11
+ export type HCaptchaSiteKeyType = z.infer<typeof HCaptchaSiteKey>;
12
+
13
+ export const HCaptchaResponseToken = z.string().trim();
14
+ export type HCaptchaResponseTokenType = z.infer<typeof HCaptchaResponseToken>;
15
+
16
+ type HCaptchaVerifierModeType = "local" | "production";
17
+
18
+ export const AccessDeniedHcaptchaError = new HTTPException(403, {
19
+ message: "access_denied_recaptcha",
20
+ });
21
+
22
+ export type HCaptchaVerifierConfigType = {
23
+ secretKey: HCaptchaSecretKeyType;
24
+ mode: HCaptchaVerifierModeType;
25
+ };
26
+
27
+ export class HcaptchaShield {
28
+ private readonly secretKey: HCaptchaSecretKeyType;
29
+ private readonly mode: HCaptchaVerifierModeType;
30
+
31
+ private readonly LOCAL_HCAPTCHA_RESPONSE_PLACEHOLDER = "10000000-aaaa-bbbb-cccc-000000000001";
32
+
33
+ constructor(config: HCaptchaVerifierConfigType) {
34
+ this.mode = config.mode;
35
+ this.secretKey = config.secretKey;
36
+ }
37
+
38
+ build = createMiddleware(async (c, next) => {
39
+ try {
40
+ const form = await c.req.formData();
41
+
42
+ const hcaptchaTokenFormData = form.get("h-captcha-response")?.toString() as HCaptchaResponseTokenType;
43
+
44
+ const result = await hcaptcha.verify(
45
+ this.secretKey,
46
+ this.mode === "production" ? hcaptchaTokenFormData : this.LOCAL_HCAPTCHA_RESPONSE_PLACEHOLDER,
47
+ );
48
+
49
+ if (!result?.success) {
50
+ throw AccessDeniedHcaptchaError;
51
+ }
52
+ return next();
53
+ } catch (error) {
54
+ throw AccessDeniedHcaptchaError;
55
+ }
56
+ });
57
+ }