@bgord/bun 1.21.11 → 1.22.0

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 (303) hide show
  1. package/dist/alert-channel-composite.adapter.d.ts.map +1 -1
  2. package/dist/alert-channel-composite.adapter.js +1 -0
  3. package/dist/alert-channel-composite.adapter.js.map +1 -1
  4. package/dist/api-version.middleware.d.ts +1 -0
  5. package/dist/api-version.middleware.d.ts.map +1 -1
  6. package/dist/api-version.middleware.js +3 -1
  7. package/dist/api-version.middleware.js.map +1 -1
  8. package/dist/cache-codec-identity.strategy.d.ts +7 -0
  9. package/dist/cache-codec-identity.strategy.d.ts.map +1 -0
  10. package/dist/cache-codec-identity.strategy.js +9 -0
  11. package/dist/cache-codec-identity.strategy.js.map +1 -0
  12. package/dist/cache-codec-sitemap-entries.strategy.d.ts +11 -0
  13. package/dist/cache-codec-sitemap-entries.strategy.d.ts.map +1 -0
  14. package/dist/cache-codec-sitemap-entries.strategy.js +13 -0
  15. package/dist/cache-codec-sitemap-entries.strategy.js.map +1 -0
  16. package/dist/cache-codec.strategy.d.ts +6 -0
  17. package/dist/cache-codec.strategy.d.ts.map +1 -0
  18. package/dist/cache-codec.strategy.js +2 -0
  19. package/dist/cache-codec.strategy.js.map +1 -0
  20. package/dist/cache-repository-node-cache.adapter.d.ts +3 -2
  21. package/dist/cache-repository-node-cache.adapter.d.ts.map +1 -1
  22. package/dist/cache-repository-node-cache.adapter.js +6 -4
  23. package/dist/cache-repository-node-cache.adapter.js.map +1 -1
  24. package/dist/cache-repository-noop.adapter.d.ts +3 -2
  25. package/dist/cache-repository-noop.adapter.d.ts.map +1 -1
  26. package/dist/cache-repository-noop.adapter.js.map +1 -1
  27. package/dist/cache-repository-redis.adapter.d.ts +3 -2
  28. package/dist/cache-repository-redis.adapter.d.ts.map +1 -1
  29. package/dist/cache-repository-redis.adapter.js +8 -5
  30. package/dist/cache-repository-redis.adapter.js.map +1 -1
  31. package/dist/cache-repository.port.d.ts +3 -2
  32. package/dist/cache-repository.port.d.ts.map +1 -1
  33. package/dist/cache-resolver-noop.strategy.d.ts +8 -0
  34. package/dist/cache-resolver-noop.strategy.d.ts.map +1 -0
  35. package/dist/cache-resolver-noop.strategy.js +7 -0
  36. package/dist/cache-resolver-noop.strategy.js.map +1 -0
  37. package/dist/cache-resolver-read-through.strategy.d.ts +15 -0
  38. package/dist/cache-resolver-read-through.strategy.d.ts.map +1 -0
  39. package/dist/cache-resolver-read-through.strategy.js +21 -0
  40. package/dist/cache-resolver-read-through.strategy.js.map +1 -0
  41. package/dist/cache-resolver.strategy.d.ts +2 -9
  42. package/dist/cache-resolver.strategy.d.ts.map +1 -1
  43. package/dist/cache-resolver.strategy.js +1 -5
  44. package/dist/cache-resolver.strategy.js.map +1 -1
  45. package/dist/cache-value.vo.d.ts +6 -0
  46. package/dist/cache-value.vo.d.ts.map +1 -0
  47. package/dist/cache-value.vo.js +2 -0
  48. package/dist/cache-value.vo.js.map +1 -0
  49. package/dist/correlation-id.vo.d.ts.map +1 -1
  50. package/dist/correlation-id.vo.js +1 -0
  51. package/dist/correlation-id.vo.js.map +1 -1
  52. package/dist/cron-scheduler-with-logger.adapter.d.ts +3 -0
  53. package/dist/cron-scheduler-with-logger.adapter.d.ts.map +1 -1
  54. package/dist/cron-scheduler-with-logger.adapter.js +29 -7
  55. package/dist/cron-scheduler-with-logger.adapter.js.map +1 -1
  56. package/dist/cron-task-handler-with-logger.strategy.js +1 -1
  57. package/dist/cron-task-handler-with-logger.strategy.js.map +1 -1
  58. package/dist/crypto-key-provider-with-memo.adapter.d.ts +12 -0
  59. package/dist/crypto-key-provider-with-memo.adapter.d.ts.map +1 -0
  60. package/dist/crypto-key-provider-with-memo.adapter.js +17 -0
  61. package/dist/crypto-key-provider-with-memo.adapter.js.map +1 -0
  62. package/dist/environment-loader-process-safe.adapter.d.ts +3 -1
  63. package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
  64. package/dist/environment-loader-process-safe.adapter.js +4 -2
  65. package/dist/environment-loader-process-safe.adapter.js.map +1 -1
  66. package/dist/event-store-with-logger.adapter.d.ts +3 -0
  67. package/dist/event-store-with-logger.adapter.d.ts.map +1 -1
  68. package/dist/event-store-with-logger.adapter.js +88 -27
  69. package/dist/event-store-with-logger.adapter.js.map +1 -1
  70. package/dist/event-stream.vo.d.ts.map +1 -1
  71. package/dist/event-stream.vo.js +3 -1
  72. package/dist/event-stream.vo.js.map +1 -1
  73. package/dist/file-draft-tar-gz.service.d.ts +8 -0
  74. package/dist/file-draft-tar-gz.service.d.ts.map +1 -0
  75. package/dist/file-draft-tar-gz.service.js +19 -0
  76. package/dist/file-draft-tar-gz.service.js.map +1 -0
  77. package/dist/file-reader-json-with-cache.adapter.d.ts +1 -0
  78. package/dist/file-reader-json-with-cache.adapter.d.ts.map +1 -1
  79. package/dist/file-reader-json-with-cache.adapter.js +3 -1
  80. package/dist/file-reader-json-with-cache.adapter.js.map +1 -1
  81. package/dist/file-reader-text-with-cache.adapter.d.ts +1 -0
  82. package/dist/file-reader-text-with-cache.adapter.d.ts.map +1 -1
  83. package/dist/file-reader-text-with-cache.adapter.js +3 -1
  84. package/dist/file-reader-text-with-cache.adapter.js.map +1 -1
  85. package/dist/healthcheck-hono.handler.js +2 -2
  86. package/dist/healthcheck-hono.handler.js.map +1 -1
  87. package/dist/healthcheck.handler.d.ts +1 -0
  88. package/dist/healthcheck.handler.d.ts.map +1 -1
  89. package/dist/healthcheck.handler.js +1 -0
  90. package/dist/healthcheck.handler.js.map +1 -1
  91. package/dist/http-logger-hono.middleware.d.ts.map +1 -1
  92. package/dist/http-logger-hono.middleware.js +0 -3
  93. package/dist/http-logger-hono.middleware.js.map +1 -1
  94. package/dist/http-logger.middleware.d.ts +0 -1
  95. package/dist/http-logger.middleware.d.ts.map +1 -1
  96. package/dist/http-logger.middleware.js +0 -1
  97. package/dist/http-logger.middleware.js.map +1 -1
  98. package/dist/idempotency-store-cache.adapter.d.ts +13 -0
  99. package/dist/idempotency-store-cache.adapter.d.ts.map +1 -0
  100. package/dist/idempotency-store-cache.adapter.js +14 -0
  101. package/dist/idempotency-store-cache.adapter.js.map +1 -0
  102. package/dist/idempotency-store-noop.adapter.d.ts +6 -0
  103. package/dist/idempotency-store-noop.adapter.d.ts.map +1 -0
  104. package/dist/idempotency-store-noop.adapter.js +6 -0
  105. package/dist/idempotency-store-noop.adapter.js.map +1 -0
  106. package/dist/idempotency-store-with-logger.adapter.d.ts +17 -0
  107. package/dist/idempotency-store-with-logger.adapter.d.ts.map +1 -0
  108. package/dist/idempotency-store-with-logger.adapter.js +48 -0
  109. package/dist/idempotency-store-with-logger.adapter.js.map +1 -0
  110. package/dist/idempotency-store.port.d.ts +5 -0
  111. package/dist/idempotency-store.port.d.ts.map +1 -0
  112. package/dist/idempotency-store.port.js +2 -0
  113. package/dist/idempotency-store.port.js.map +1 -0
  114. package/dist/image-generator-web-view.adapter.js +8 -72
  115. package/dist/image-generator-web-view.adapter.js.map +1 -1
  116. package/dist/index.d.ts +19 -6
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +19 -6
  119. package/dist/index.js.map +1 -1
  120. package/dist/job-queue-with-logger.adapter.d.ts +2 -0
  121. package/dist/job-queue-with-logger.adapter.d.ts.map +1 -1
  122. package/dist/job-queue-with-logger.adapter.js +133 -36
  123. package/dist/job-queue-with-logger.adapter.js.map +1 -1
  124. package/dist/logger.port.d.ts +0 -1
  125. package/dist/logger.port.d.ts.map +1 -1
  126. package/dist/mailer-content-html.vo.js +1 -1
  127. package/dist/mailer-content-html.vo.js.map +1 -1
  128. package/dist/message-bus-with-logger.adapter.d.ts +2 -0
  129. package/dist/message-bus-with-logger.adapter.d.ts.map +1 -1
  130. package/dist/message-bus-with-logger.adapter.js +28 -8
  131. package/dist/message-bus-with-logger.adapter.js.map +1 -1
  132. package/dist/modules/preferences/invariants/user-language-has-changed.d.ts +0 -1
  133. package/dist/modules/preferences/invariants/user-language-has-changed.d.ts.map +1 -1
  134. package/dist/modules/preferences/invariants/user-language-has-changed.js +0 -4
  135. package/dist/modules/preferences/invariants/user-language-has-changed.js.map +1 -1
  136. package/dist/modules/system/invariants/feature-flag-enabled.d.ts +0 -1
  137. package/dist/modules/system/invariants/feature-flag-enabled.d.ts.map +1 -1
  138. package/dist/modules/system/invariants/feature-flag-enabled.js +0 -4
  139. package/dist/modules/system/invariants/feature-flag-enabled.js.map +1 -1
  140. package/dist/prerequisite-verifier-sqlite.adapter.js +1 -1
  141. package/dist/prerequisite-verifier-sqlite.adapter.js.map +1 -1
  142. package/dist/prerequisite-verifier-with-cache.adapter.d.ts +2 -0
  143. package/dist/prerequisite-verifier-with-cache.adapter.d.ts.map +1 -1
  144. package/dist/prerequisite-verifier-with-cache.adapter.js +8 -5
  145. package/dist/prerequisite-verifier-with-cache.adapter.js.map +1 -1
  146. package/dist/rate-limiter.service.d.ts +22 -0
  147. package/dist/rate-limiter.service.d.ts.map +1 -0
  148. package/dist/rate-limiter.service.js +31 -0
  149. package/dist/rate-limiter.service.js.map +1 -0
  150. package/dist/reactive-config-with-cache.adapter.d.ts +3 -1
  151. package/dist/reactive-config-with-cache.adapter.d.ts.map +1 -1
  152. package/dist/reactive-config-with-cache.adapter.js +3 -1
  153. package/dist/reactive-config-with-cache.adapter.js.map +1 -1
  154. package/dist/request-context-hono.adapter.d.ts.map +1 -1
  155. package/dist/request-context-hono.adapter.js +4 -1
  156. package/dist/request-context-hono.adapter.js.map +1 -1
  157. package/dist/secure-key-generator-crypto.adapter.js +1 -1
  158. package/dist/secure-key-generator-crypto.adapter.js.map +1 -1
  159. package/dist/security-rule-violation-threshold.strategy.d.ts.map +1 -1
  160. package/dist/security-rule-violation-threshold.strategy.js +5 -3
  161. package/dist/security-rule-violation-threshold.strategy.js.map +1 -1
  162. package/dist/shield-rate-limit-hono.strategy.d.ts +2 -2
  163. package/dist/shield-rate-limit-hono.strategy.d.ts.map +1 -1
  164. package/dist/shield-rate-limit.strategy.d.ts +2 -2
  165. package/dist/shield-rate-limit.strategy.d.ts.map +1 -1
  166. package/dist/shield-rate-limit.strategy.js +8 -2
  167. package/dist/shield-rate-limit.strategy.js.map +1 -1
  168. package/dist/shield-webhook-hono.strategy.d.ts +2 -2
  169. package/dist/shield-webhook-hono.strategy.d.ts.map +1 -1
  170. package/dist/shield-webhook-hono.strategy.js +7 -3
  171. package/dist/shield-webhook-hono.strategy.js.map +1 -1
  172. package/dist/shield-webhook.strategy.d.ts +23 -3
  173. package/dist/shield-webhook.strategy.d.ts.map +1 -1
  174. package/dist/shield-webhook.strategy.js +18 -4
  175. package/dist/shield-webhook.strategy.js.map +1 -1
  176. package/dist/sitemap-entries-provider-with-cache.adapter.d.ts +2 -0
  177. package/dist/sitemap-entries-provider-with-cache.adapter.d.ts.map +1 -1
  178. package/dist/sitemap-entries-provider-with-cache.adapter.js +8 -5
  179. package/dist/sitemap-entries-provider-with-cache.adapter.js.map +1 -1
  180. package/dist/sitemap-entry.vo.d.ts +11 -10
  181. package/dist/sitemap-entry.vo.d.ts.map +1 -1
  182. package/dist/sitemap-entry.vo.js +19 -0
  183. package/dist/sitemap-entry.vo.js.map +1 -1
  184. package/dist/smtp-port.vo.d.ts.map +1 -1
  185. package/dist/smtp-port.vo.js +1 -0
  186. package/dist/smtp-port.vo.js.map +1 -1
  187. package/dist/sse-registry-with-logger.adapter.d.ts +2 -0
  188. package/dist/sse-registry-with-logger.adapter.d.ts.map +1 -1
  189. package/dist/sse-registry-with-logger.adapter.js +80 -22
  190. package/dist/sse-registry-with-logger.adapter.js.map +1 -1
  191. package/dist/translations-provider-with-cache.adapter.d.ts +21 -0
  192. package/dist/translations-provider-with-cache.adapter.d.ts.map +1 -0
  193. package/dist/translations-provider-with-cache.adapter.js +22 -0
  194. package/dist/translations-provider-with-cache.adapter.js.map +1 -0
  195. package/dist/uuid.vo.js +1 -0
  196. package/dist/uuid.vo.js.map +1 -1
  197. package/dist/webhook-id-extractor-header.strategy.d.ts +9 -0
  198. package/dist/webhook-id-extractor-header.strategy.d.ts.map +1 -0
  199. package/dist/webhook-id-extractor-header.strategy.js +13 -0
  200. package/dist/webhook-id-extractor-header.strategy.js.map +1 -0
  201. package/dist/webhook-id-extractor-json-field.strategy.d.ts +9 -0
  202. package/dist/webhook-id-extractor-json-field.strategy.d.ts.map +1 -0
  203. package/dist/webhook-id-extractor-json-field.strategy.js +14 -0
  204. package/dist/webhook-id-extractor-json-field.strategy.js.map +1 -0
  205. package/dist/webhook-id-extractor.strategy.d.ts +6 -0
  206. package/dist/webhook-id-extractor.strategy.d.ts.map +1 -0
  207. package/dist/webhook-id-extractor.strategy.js +2 -0
  208. package/dist/webhook-id-extractor.strategy.js.map +1 -0
  209. package/dist/webhook-id.vo.d.ts +9 -0
  210. package/dist/webhook-id.vo.d.ts.map +1 -0
  211. package/dist/webhook-id.vo.js +10 -0
  212. package/dist/webhook-id.vo.js.map +1 -0
  213. package/dist/{webhook-signature-extractor-header-exact.strategy.d.ts → webhook-signature-extractor-header.strategy.d.ts} +2 -2
  214. package/dist/webhook-signature-extractor-header.strategy.d.ts.map +1 -0
  215. package/dist/{webhook-signature-extractor-header-exact.strategy.js → webhook-signature-extractor-header.strategy.js} +2 -2
  216. package/dist/webhook-signature-extractor-header.strategy.js.map +1 -0
  217. package/package.json +12 -18
  218. package/readme.md +19 -6
  219. package/src/alert-channel-composite.adapter.ts +1 -0
  220. package/src/api-version.middleware.ts +6 -2
  221. package/src/cache-codec-identity.strategy.ts +12 -0
  222. package/src/cache-codec-sitemap-entries.strategy.ts +17 -0
  223. package/src/cache-codec.strategy.ts +6 -0
  224. package/src/cache-repository-node-cache.adapter.ts +9 -5
  225. package/src/cache-repository-noop.adapter.ts +3 -2
  226. package/src/cache-repository-redis.adapter.ts +10 -7
  227. package/src/cache-repository.port.ts +3 -2
  228. package/src/cache-resolver-noop.strategy.ts +11 -0
  229. package/src/cache-resolver-read-through.strategy.ts +27 -0
  230. package/src/cache-resolver.strategy.ts +2 -11
  231. package/src/cache-value.vo.ts +9 -0
  232. package/src/correlation-id.vo.ts +1 -0
  233. package/src/cron-scheduler-with-logger.adapter.ts +35 -9
  234. package/src/cron-task-handler-with-logger.strategy.ts +1 -1
  235. package/src/crypto-key-provider-with-memo.adapter.ts +21 -0
  236. package/src/environment-loader-process-safe.adapter.ts +12 -4
  237. package/src/event-store-with-logger.adapter.ts +97 -27
  238. package/src/event-stream.vo.ts +1 -0
  239. package/src/file-draft-tar-gz.service.ts +23 -0
  240. package/src/file-reader-json-with-cache.adapter.ts +7 -2
  241. package/src/file-reader-text-with-cache.adapter.ts +8 -1
  242. package/src/healthcheck-hono.handler.ts +2 -2
  243. package/src/healthcheck.handler.ts +2 -0
  244. package/src/http-logger-hono.middleware.ts +0 -3
  245. package/src/http-logger.middleware.ts +0 -2
  246. package/src/idempotency-store-cache.adapter.ts +19 -0
  247. package/src/idempotency-store-noop.adapter.ts +8 -0
  248. package/src/idempotency-store-with-logger.adapter.ts +59 -0
  249. package/src/idempotency-store.port.ts +5 -0
  250. package/src/index.ts +19 -6
  251. package/src/job-queue-with-logger.adapter.ts +156 -43
  252. package/src/logger.port.ts +0 -1
  253. package/src/message-bus-with-logger.adapter.ts +37 -10
  254. package/src/modules/preferences/invariants/user-language-has-changed.ts +1 -6
  255. package/src/modules/system/invariants/feature-flag-enabled.ts +1 -6
  256. package/src/prerequisite-verifier-sqlite.adapter.ts +1 -1
  257. package/src/prerequisite-verifier-with-cache.adapter.ts +13 -7
  258. package/src/rate-limiter.service.ts +45 -0
  259. package/src/reactive-config-with-cache.adapter.ts +8 -2
  260. package/src/request-context-hono.adapter.ts +5 -1
  261. package/src/security-rule-violation-threshold.strategy.ts +5 -6
  262. package/src/shield-rate-limit-hono.strategy.ts +2 -2
  263. package/src/shield-rate-limit.strategy.ts +14 -7
  264. package/src/shield-webhook-hono.strategy.ts +11 -3
  265. package/src/shield-webhook.strategy.ts +41 -6
  266. package/src/sitemap-entries-provider-with-cache.adapter.ts +13 -7
  267. package/src/sitemap-entry.vo.ts +23 -11
  268. package/src/smtp-port.vo.ts +1 -0
  269. package/src/sse-registry-with-logger.adapter.ts +94 -25
  270. package/src/translations-provider-with-cache.adapter.ts +38 -0
  271. package/src/uuid.vo.ts +1 -1
  272. package/src/webhook-id-extractor-header.strategy.ts +14 -0
  273. package/src/webhook-id-extractor-json-field.strategy.ts +16 -0
  274. package/src/webhook-id-extractor.strategy.ts +6 -0
  275. package/src/webhook-id.vo.ts +17 -0
  276. package/src/{webhook-signature-extractor-header-exact.strategy.ts → webhook-signature-extractor-header.strategy.ts} +1 -1
  277. package/dist/cache-resolver-simple.strategy.d.ts +0 -18
  278. package/dist/cache-resolver-simple.strategy.d.ts.map +0 -1
  279. package/dist/cache-resolver-simple.strategy.js +0 -23
  280. package/dist/cache-resolver-simple.strategy.js.map +0 -1
  281. package/dist/cache-response-hono.middleware.d.ts +0 -9
  282. package/dist/cache-response-hono.middleware.d.ts.map +0 -1
  283. package/dist/cache-response-hono.middleware.js +0 -34
  284. package/dist/cache-response-hono.middleware.js.map +0 -1
  285. package/dist/cache-response.middleware.d.ts +0 -28
  286. package/dist/cache-response.middleware.d.ts.map +0 -1
  287. package/dist/cache-response.middleware.js +0 -20
  288. package/dist/cache-response.middleware.js.map +0 -1
  289. package/dist/crypto-key-provider-with-cache.adapter.d.ts +0 -19
  290. package/dist/crypto-key-provider-with-cache.adapter.d.ts.map +0 -1
  291. package/dist/crypto-key-provider-with-cache.adapter.js +0 -19
  292. package/dist/crypto-key-provider-with-cache.adapter.js.map +0 -1
  293. package/dist/file-draft-zip.service.d.ts +0 -14
  294. package/dist/file-draft-zip.service.d.ts.map +0 -1
  295. package/dist/file-draft-zip.service.js +0 -41
  296. package/dist/file-draft-zip.service.js.map +0 -1
  297. package/dist/webhook-signature-extractor-header-exact.strategy.d.ts.map +0 -1
  298. package/dist/webhook-signature-extractor-header-exact.strategy.js.map +0 -1
  299. package/src/cache-resolver-simple.strategy.ts +0 -33
  300. package/src/cache-response-hono.middleware.ts +0 -53
  301. package/src/cache-response.middleware.ts +0 -47
  302. package/src/crypto-key-provider-with-cache.adapter.ts +0 -30
  303. package/src/file-draft-zip.service.ts +0 -56
@@ -1,21 +1,47 @@
1
+ import type { ClockPort } from "./clock.port";
2
+ import { CorrelationStorage } from "./correlation-storage.service";
1
3
  import type { CronSchedulerPort } from "./cron-scheduler.port";
2
4
  import type { CronTask } from "./cron-task.vo";
3
5
  import type { LoggerPort } from "./logger.port";
6
+ import { Stopwatch } from "./stopwatch.service";
4
7
 
5
- type Dependencies = { inner: CronSchedulerPort; Logger: LoggerPort };
8
+ type Dependencies = { inner: CronSchedulerPort; Logger: LoggerPort; Clock: ClockPort };
6
9
 
7
10
  export class CronSchedulerWithLoggerAdapter implements CronSchedulerPort {
11
+ private readonly base = { component: "infra", operation: "cron_scheduler" };
12
+
8
13
  constructor(private readonly deps: Dependencies) {}
9
14
 
10
15
  schedule(task: CronTask): void {
11
- this.deps.Logger.info({
12
- message: "Cron scheduler schedule",
13
- component: "infra",
14
- operation: "cron_scheduler_schedule",
15
- metadata: { label: task.label, cron: task.cron },
16
- });
17
-
18
- this.deps.inner.schedule(task);
16
+ const duration = new Stopwatch(this.deps);
17
+
18
+ try {
19
+ this.deps.Logger.info({
20
+ message: "Cron scheduler schedule attempt",
21
+ correlationId: CorrelationStorage.get(),
22
+ metadata: { label: task.label, cron: task.cron },
23
+ ...this.base,
24
+ });
25
+
26
+ this.deps.inner.schedule(task);
27
+
28
+ this.deps.Logger.info({
29
+ message: "Cron scheduler schedule success",
30
+ correlationId: CorrelationStorage.get(),
31
+ metadata: { label: task.label, cron: task.cron, duration: duration.stop() },
32
+ ...this.base,
33
+ });
34
+ } catch (error) {
35
+ this.deps.Logger.error({
36
+ message: "Cron scheduler schedule error",
37
+ correlationId: CorrelationStorage.get(),
38
+ error,
39
+ metadata: { label: task.label, cron: task.cron, duration: duration.stop() },
40
+ ...this.base,
41
+ });
42
+
43
+ throw error;
44
+ }
19
45
  }
20
46
 
21
47
  async verify(): Promise<boolean> {
@@ -35,7 +35,7 @@ export class CronTaskHandlerWithLoggerStrategy implements CronTaskHandlerStrateg
35
35
  ...this.base,
36
36
  });
37
37
 
38
- return;
38
+ throw error;
39
39
  }
40
40
 
41
41
  this.deps.Logger.info({
@@ -0,0 +1,21 @@
1
+ import type { CryptoKeyProviderPort } from "./crypto-key-provider.port";
2
+
3
+ type Config = { inner: CryptoKeyProviderPort };
4
+
5
+ export class CryptoKeyProviderWithMemoAdapter implements CryptoKeyProviderPort {
6
+ private memoized: Promise<CryptoKey> | null = null;
7
+
8
+ constructor(private readonly config: Config) {}
9
+
10
+ async get(): Promise<CryptoKey> {
11
+ if (this.memoized === null) {
12
+ this.memoized = this.config.inner.get().catch((error) => {
13
+ this.memoized = null;
14
+
15
+ throw error;
16
+ });
17
+ }
18
+
19
+ return this.memoized;
20
+ }
21
+ }
@@ -1,4 +1,6 @@
1
+ import { CacheCodecIdentityStrategy } from "./cache-codec-identity.strategy";
1
2
  import type { CacheResolverStrategy } from "./cache-resolver.strategy";
3
+ import type { CacheValueType } from "./cache-value.vo";
2
4
  import type {
3
5
  EnvironmentLoaderConfig,
4
6
  EnvironmentLoaderPort,
@@ -11,7 +13,11 @@ import { SubjectSegmentFixedStrategy } from "./subject-segment-fixed.strategy";
11
13
 
12
14
  type Dependencies = { CacheResolver: CacheResolverStrategy; HashContent: HashContentStrategy };
13
15
 
14
- export class EnvironmentLoaderProcessSafeAdapter<T extends object> implements EnvironmentLoaderPort<T> {
16
+ export class EnvironmentLoaderProcessSafeAdapter<T extends object & CacheValueType>
17
+ implements EnvironmentLoaderPort<T>
18
+ {
19
+ private readonly codec = new CacheCodecIdentityStrategy<T>();
20
+
15
21
  constructor(
16
22
  private env: NodeJS.ProcessEnv,
17
23
  private readonly config: EnvironmentLoaderConfig<T>,
@@ -22,8 +28,10 @@ export class EnvironmentLoaderProcessSafeAdapter<T extends object> implements En
22
28
  const resolver = new SubjectApplicationResolver([new SubjectSegmentFixedStrategy("env")], this.deps);
23
29
  const subject = await resolver.resolve();
24
30
 
25
- const parsed = await this.deps.CacheResolver.resolve(subject.hex, async () =>
26
- StandardSchemaValidator.validate(this.config.EnvironmentSchema, this.env),
31
+ const parsed = await this.deps.CacheResolver.resolve<T>(
32
+ subject.hex,
33
+ async () => StandardSchemaValidator.validate(this.config.EnvironmentSchema, this.env),
34
+ this.codec,
27
35
  );
28
36
 
29
37
  for (const key of Object.keys(parsed)) {
@@ -31,6 +39,6 @@ export class EnvironmentLoaderProcessSafeAdapter<T extends object> implements En
31
39
  delete process.env[key];
32
40
  }
33
41
 
34
- return Object.freeze({ ...parsed, type: this.config.type });
42
+ return Object.freeze(Object.assign({}, parsed, { type: this.config.type }));
35
43
  }
36
44
  }
@@ -1,16 +1,21 @@
1
+ import type { ClockPort } from "./clock.port";
1
2
  import { CorrelationStorage } from "./correlation-storage.service";
2
3
  import type { GenericEvent } from "./event.types";
3
4
  import type { EventFinderConfig, EventStorePort } from "./event-store.port";
4
5
  import type { EventStreamType } from "./event-stream.vo";
5
6
  import type { EventValidatorRegistryPort } from "./event-validator-registry.port";
6
7
  import type { LoggerPort } from "./logger.port";
8
+ import { Stopwatch } from "./stopwatch.service";
7
9
 
8
10
  type Dependencies<Event extends GenericEvent> = {
9
11
  inner: EventStorePort<Event>;
10
12
  Logger: LoggerPort;
13
+ Clock: ClockPort;
11
14
  };
12
15
 
13
16
  export class EventStoreWithLoggerAdapter<Event extends GenericEvent> implements EventStorePort<Event> {
17
+ private readonly base = { component: "infra", operation: "event_store" };
18
+
14
19
  constructor(private readonly deps: Dependencies<Event>) {}
15
20
 
16
21
  async find<FoundEvent extends Event>(
@@ -18,49 +23,114 @@ export class EventStoreWithLoggerAdapter<Event extends GenericEvent> implements
18
23
  stream: EventStreamType,
19
24
  config?: EventFinderConfig,
20
25
  ): Promise<ReadonlyArray<FoundEvent>> {
21
- const result = await this.deps.inner.find(registry, stream, config);
26
+ const duration = new Stopwatch(this.deps);
27
+
28
+ try {
29
+ this.deps.Logger.info({
30
+ message: "Event store find attempt",
31
+ correlationId: CorrelationStorage.get(),
32
+ metadata: { stream, names: registry.names, config },
33
+ ...this.base,
34
+ });
35
+
36
+ const result = await this.deps.inner.find(registry, stream, config);
22
37
 
23
- this.deps.Logger.info({
24
- message: "Event store find",
25
- component: "infra",
26
- operation: "event_store_find",
27
- correlationId: CorrelationStorage.get(),
28
- metadata: { stream, names: registry.names, config, count: result.length },
29
- });
38
+ this.deps.Logger.info({
39
+ message: "Event store find success",
40
+ correlationId: CorrelationStorage.get(),
41
+ metadata: { stream, names: registry.names, config, count: result.length, duration: duration.stop() },
42
+ ...this.base,
43
+ });
30
44
 
31
- return result;
45
+ return result;
46
+ } catch (error) {
47
+ this.deps.Logger.error({
48
+ message: "Event store find error",
49
+ correlationId: CorrelationStorage.get(),
50
+ error,
51
+ metadata: { stream, names: registry.names, config, duration: duration.stop() },
52
+ ...this.base,
53
+ });
54
+
55
+ throw error;
56
+ }
32
57
  }
33
58
 
34
59
  async findLast<FoundEvent extends Event>(
35
60
  registry: EventValidatorRegistryPort<FoundEvent>,
36
61
  stream: EventStreamType,
37
62
  ): Promise<FoundEvent | null> {
38
- const result = await this.deps.inner.findLast(registry, stream);
63
+ const duration = new Stopwatch(this.deps);
64
+
65
+ try {
66
+ this.deps.Logger.info({
67
+ message: "Event store find last attempt",
68
+ correlationId: CorrelationStorage.get(),
69
+ metadata: { stream, names: registry.names },
70
+ ...this.base,
71
+ });
39
72
 
40
- this.deps.Logger.info({
41
- message: "Event store find last",
42
- component: "infra",
43
- operation: "event_store_find_last",
44
- correlationId: CorrelationStorage.get(),
45
- metadata: { stream, names: registry.names, found: !!result },
46
- });
73
+ const result = await this.deps.inner.findLast(registry, stream);
47
74
 
48
- return result;
75
+ this.deps.Logger.info({
76
+ message: "Event store find last success",
77
+ correlationId: CorrelationStorage.get(),
78
+ metadata: { stream, names: registry.names, found: !!result, duration: duration.stop() },
79
+ ...this.base,
80
+ });
81
+
82
+ return result;
83
+ } catch (error) {
84
+ this.deps.Logger.error({
85
+ message: "Event store find last error",
86
+ correlationId: CorrelationStorage.get(),
87
+ error,
88
+ metadata: { stream, names: registry.names, duration: duration.stop() },
89
+ ...this.base,
90
+ });
91
+
92
+ throw error;
93
+ }
49
94
  }
50
95
 
51
96
  async save<SavedEvent extends Event>(
52
97
  events: ReadonlyArray<SavedEvent>,
53
98
  ): Promise<ReadonlyArray<SavedEvent>> {
54
- const result = await this.deps.inner.save(events);
99
+ const duration = new Stopwatch(this.deps);
100
+ const metadata = {
101
+ stream: events[0]?.stream,
102
+ names: events.map((event) => event.name),
103
+ count: events.length,
104
+ };
105
+
106
+ try {
107
+ this.deps.Logger.info({
108
+ message: "Event store save attempt",
109
+ correlationId: CorrelationStorage.get(),
110
+ metadata,
111
+ ...this.base,
112
+ });
113
+
114
+ const result = await this.deps.inner.save(events);
115
+
116
+ this.deps.Logger.info({
117
+ message: "Event store save success",
118
+ correlationId: CorrelationStorage.get(),
119
+ metadata: { ...metadata, duration: duration.stop() },
120
+ ...this.base,
121
+ });
55
122
 
56
- this.deps.Logger.info({
57
- message: "Event store save",
58
- component: "infra",
59
- operation: "event_store_save",
60
- correlationId: CorrelationStorage.get(),
61
- metadata: { stream: events[0]?.stream, names: events.map((event) => event.name), count: events.length },
62
- });
123
+ return result;
124
+ } catch (error) {
125
+ this.deps.Logger.error({
126
+ message: "Event store save error",
127
+ correlationId: CorrelationStorage.get(),
128
+ error,
129
+ metadata: { ...metadata, duration: duration.stop() },
130
+ ...this.base,
131
+ });
63
132
 
64
- return result;
133
+ throw error;
134
+ }
65
135
  }
66
136
  }
@@ -10,6 +10,7 @@ export const EventStream = v.pipe(
10
10
  v.string(EventStreamError.Type),
11
11
  v.minLength(1, EventStreamError.Empty),
12
12
  v.maxLength(256, EventStreamError.TooLong),
13
+ // Stryker disable next-line StringLiteral
13
14
  v.brand("EventStream"),
14
15
  );
15
16
 
@@ -0,0 +1,23 @@
1
+ // [BUN DEPENDENCY]
2
+ import * as tools from "@bgord/tools";
3
+ import * as v from "valibot";
4
+ import { FileDraft } from "./file-draft.service";
5
+
6
+ export class FileDraftTarGz extends FileDraft {
7
+ constructor(
8
+ basename: tools.BasenameType,
9
+ private readonly parts: ReadonlyArray<FileDraft>,
10
+ ) {
11
+ super(basename, v.parse(tools.Extension, tools.Mimes.tar.extensions[0]), tools.Mimes.tar.mime);
12
+ }
13
+
14
+ async create(): Promise<BodyInit> {
15
+ const parts: Record<string, Uint8Array> = {};
16
+
17
+ for (const part of this.parts) {
18
+ parts[part.filename.get()] = await new Response(await part.create()).bytes();
19
+ }
20
+
21
+ return new Bun.Archive(parts, { compress: "gzip" }).blob();
22
+ }
23
+ }
@@ -1,4 +1,5 @@
1
1
  import type * as tools from "@bgord/tools";
2
+ import { CacheCodecIdentityStrategy } from "./cache-codec-identity.strategy";
2
3
  import type { CacheResolverStrategy } from "./cache-resolver.strategy";
3
4
  import type { FileReaderJsonOutputType, FileReaderJsonPort } from "./file-reader-json.port";
4
5
  import type { HashContentStrategy } from "./hash-content.strategy";
@@ -9,6 +10,8 @@ type Dependencies = { CacheResolver: CacheResolverStrategy; HashContent: HashCon
9
10
  type Config = { id: string; inner: FileReaderJsonPort };
10
11
 
11
12
  export class FileReaderJsonWithCacheAdapter implements FileReaderJsonPort {
13
+ private readonly codec = new CacheCodecIdentityStrategy<FileReaderJsonOutputType>();
14
+
12
15
  constructor(
13
16
  private readonly config: Config,
14
17
  private readonly deps: Dependencies,
@@ -28,8 +31,10 @@ export class FileReaderJsonWithCacheAdapter implements FileReaderJsonPort {
28
31
 
29
32
  const subject = await resolver.resolve();
30
33
 
31
- return this.deps.CacheResolver.resolve<FileReaderJsonOutputType>(subject.hex, () =>
32
- this.config.inner.read(path),
34
+ return this.deps.CacheResolver.resolve<FileReaderJsonOutputType>(
35
+ subject.hex,
36
+ async () => this.config.inner.read(path),
37
+ this.codec,
33
38
  );
34
39
  }
35
40
  }
@@ -1,4 +1,5 @@
1
1
  import type * as tools from "@bgord/tools";
2
+ import { CacheCodecIdentityStrategy } from "./cache-codec-identity.strategy";
2
3
  import type { CacheResolverStrategy } from "./cache-resolver.strategy";
3
4
  import type { FileReaderTextPort } from "./file-reader-text.port";
4
5
  import type { HashContentStrategy } from "./hash-content.strategy";
@@ -9,6 +10,8 @@ type Dependencies = { CacheResolver: CacheResolverStrategy; HashContent: HashCon
9
10
  type Config = { id: string; inner: FileReaderTextPort };
10
11
 
11
12
  export class FileReaderTextWithCacheAdapter implements FileReaderTextPort {
13
+ private readonly codec = new CacheCodecIdentityStrategy<string>();
14
+
12
15
  constructor(
13
16
  private readonly config: Config,
14
17
  private readonly deps: Dependencies,
@@ -26,6 +29,10 @@ export class FileReaderTextWithCacheAdapter implements FileReaderTextPort {
26
29
 
27
30
  const subject = await resolver.resolve();
28
31
 
29
- return this.deps.CacheResolver.resolve<string>(subject.hex, () => this.config.inner.read(path));
32
+ return this.deps.CacheResolver.resolve<string>(
33
+ subject.hex,
34
+ async () => this.config.inner.read(path),
35
+ this.codec,
36
+ );
30
37
  }
31
38
  }
@@ -17,9 +17,9 @@ export class HealthcheckHonoHandler implements HandlerHonoPort {
17
17
 
18
18
  handle() {
19
19
  return factory.createHandlers(async () => {
20
- const healthcheck = await this.handler.check();
20
+ const { headers, ...healthcheck } = await this.handler.check();
21
21
 
22
- return Response.json(healthcheck, { status: healthcheck.code });
22
+ return Response.json(healthcheck, { status: healthcheck.code, headers });
23
23
  });
24
24
  }
25
25
  }
@@ -87,6 +87,7 @@ export type HealthcheckResult = {
87
87
  queue?: JobQueueStatsSnapshot;
88
88
  ms: tools.Duration["ms"];
89
89
  timestamp: tools.TimestampValueType;
90
+ headers: Record<string, string>;
90
91
  };
91
92
 
92
93
  export class HealthcheckHandler {
@@ -175,6 +176,7 @@ export class HealthcheckHandler {
175
176
  queue: await this.deps.JobQueueStatsProvider?.getStats(),
176
177
  ms: stopwatch.stop().ms,
177
178
  timestamp: this.deps.Clock.now().ms,
179
+ headers: { "Cache-Control": "no-store" },
178
180
  };
179
181
  }
180
182
  }
@@ -1,6 +1,4 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
- import { CacheSourceEnum } from "./cache-resolver.strategy";
3
- import { CacheResponseMiddleware } from "./cache-response.middleware";
4
2
  import {
5
3
  type HttpLoggerConfig,
6
4
  HttpLoggerMiddleware,
@@ -36,7 +34,6 @@ export class HttpLoggerHonoMiddleware implements MiddlewareHonoPort {
36
34
  this.middleware.after(context, correlationId, {
37
35
  stopwatch,
38
36
  status: response.status,
39
- cacheHit: response.headers.get(CacheResponseMiddleware.CACHE_HIT_HEADER) === CacheSourceEnum.hit,
40
37
  responseBody,
41
38
  });
42
39
  };
@@ -34,7 +34,6 @@ export type HttpLoggerBeforeResult = { stopwatch: Stopwatch };
34
34
  export type HttpLoggerAfterInput = {
35
35
  stopwatch: Stopwatch;
36
36
  status: number;
37
- cacheHit: boolean;
38
37
  responseBody: any;
39
38
  };
40
39
 
@@ -98,7 +97,6 @@ export class HttpLoggerMiddleware {
98
97
  status: input.status,
99
98
  ms: duration.ms,
100
99
  client,
101
- cacheHit: input.cacheHit,
102
100
  metadata: { response: input.responseBody },
103
101
  });
104
102
  }
@@ -0,0 +1,19 @@
1
+ import type { CacheRepositoryPort } from "./cache-repository.port";
2
+ import type { Hash } from "./hash.vo";
3
+ import type { IdempotencyStorePort } from "./idempotency-store.port";
4
+
5
+ type Dependencies = { CacheRepository: CacheRepositoryPort };
6
+
7
+ export class IdempotencyStoreCacheAdapter implements IdempotencyStorePort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async claim(subject: Hash): Promise<boolean> {
11
+ const processed = await this.deps.CacheRepository.get(subject);
12
+
13
+ if (processed !== null) return false;
14
+
15
+ await this.deps.CacheRepository.set(subject, true);
16
+
17
+ return true;
18
+ }
19
+ }
@@ -0,0 +1,8 @@
1
+ import type { Hash } from "./hash.vo";
2
+ import type { IdempotencyStorePort } from "./idempotency-store.port";
3
+
4
+ export class IdempotencyStoreNoopAdapter implements IdempotencyStorePort {
5
+ async claim(_subject: Hash): Promise<boolean> {
6
+ return true;
7
+ }
8
+ }
@@ -0,0 +1,59 @@
1
+ import type { ClockPort } from "./clock.port";
2
+ import { CorrelationStorage } from "./correlation-storage.service";
3
+ import type { Hash } from "./hash.vo";
4
+ import type { IdempotencyStorePort } from "./idempotency-store.port";
5
+ import type { LoggerPort } from "./logger.port";
6
+ import { Stopwatch } from "./stopwatch.service";
7
+
8
+ type Dependencies = { inner: IdempotencyStorePort; Logger: LoggerPort; Clock: ClockPort };
9
+
10
+ export class IdempotencyStoreWithLoggerAdapter implements IdempotencyStorePort {
11
+ private readonly base = { component: "infra", operation: "idempotency_store" };
12
+
13
+ constructor(private readonly deps: Dependencies) {}
14
+
15
+ async claim(subject: Hash): Promise<boolean> {
16
+ const duration = new Stopwatch(this.deps);
17
+
18
+ try {
19
+ this.deps.Logger.info({
20
+ message: "Idempotency store claim attempt",
21
+ correlationId: CorrelationStorage.get(),
22
+ metadata: { subject: subject.get() },
23
+ ...this.base,
24
+ });
25
+
26
+ const claimed = await this.deps.inner.claim(subject);
27
+
28
+ if (!claimed) {
29
+ this.deps.Logger.warn({
30
+ message: "Idempotency store claim duplicate",
31
+ correlationId: CorrelationStorage.get(),
32
+ metadata: { subject: subject.get(), duration: duration.stop() },
33
+ ...this.base,
34
+ });
35
+
36
+ return false;
37
+ }
38
+
39
+ this.deps.Logger.info({
40
+ message: "Idempotency store claim success",
41
+ correlationId: CorrelationStorage.get(),
42
+ metadata: { subject: subject.get(), duration: duration.stop() },
43
+ ...this.base,
44
+ });
45
+
46
+ return true;
47
+ } catch (error) {
48
+ this.deps.Logger.error({
49
+ message: "Idempotency store claim error",
50
+ correlationId: CorrelationStorage.get(),
51
+ error,
52
+ metadata: { subject: subject.get(), duration: duration.stop() },
53
+ ...this.base,
54
+ });
55
+
56
+ throw error;
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,5 @@
1
+ import type { Hash } from "./hash.vo";
2
+
3
+ export interface IdempotencyStorePort {
4
+ claim(subject: Hash): Promise<boolean>;
5
+ }
package/src/index.ts CHANGED
@@ -44,15 +44,18 @@ export * from "./better-auth-logger.service";
44
44
  export * from "./binary.vo";
45
45
  export * from "./bots.vo";
46
46
  export * from "./build-info.vo";
47
+ export * from "./cache-codec.strategy";
48
+ export * from "./cache-codec-identity.strategy";
49
+ export * from "./cache-codec-sitemap-entries.strategy";
47
50
  export * from "./cache-file.service";
48
51
  export * from "./cache-repository.port";
49
52
  export * from "./cache-repository-node-cache.adapter";
50
53
  export * from "./cache-repository-noop.adapter";
51
54
  export * from "./cache-repository-redis.adapter";
52
55
  export * from "./cache-resolver.strategy";
53
- export * from "./cache-resolver-simple.strategy";
54
- export * from "./cache-response.middleware";
55
- export * from "./cache-response-hono.middleware";
56
+ export * from "./cache-resolver-noop.strategy";
57
+ export * from "./cache-resolver-read-through.strategy";
58
+ export * from "./cache-value.vo";
56
59
  export * from "./certificate-inspector.port";
57
60
  export * from "./certificate-inspector-noop.adapter";
58
61
  export * from "./certificate-inspector-tls.adapter";
@@ -85,7 +88,7 @@ export * from "./crypto-key-provider.port";
85
88
  export * from "./crypto-key-provider-file.adapter";
86
89
  export * from "./crypto-key-provider-memory.adapter";
87
90
  export * from "./crypto-key-provider-noop.adapter";
88
- export * from "./crypto-key-provider-with-cache.adapter";
91
+ export * from "./crypto-key-provider-with-memo.adapter";
89
92
  export * from "./csv-stringifier.adapter";
90
93
  export * from "./csv-stringifier.port";
91
94
  export * from "./csv-stringifier-noop.adapter";
@@ -147,7 +150,7 @@ export * from "./file-copier.adapter";
147
150
  export * from "./file-copier.port";
148
151
  export * from "./file-copier-noop.adapter";
149
152
  export * from "./file-draft.service";
150
- export * from "./file-draft-zip.service";
153
+ export * from "./file-draft-tar-gz.service";
151
154
  export * from "./file-inspection.adapter";
152
155
  export * from "./file-inspection.port";
153
156
  export * from "./file-inspection-noop.adapter";
@@ -206,6 +209,10 @@ export * from "./http-logger-hono.middleware";
206
209
  export * from "./id-provider.port";
207
210
  export * from "./id-provider-crypto.adapter";
208
211
  export * from "./id-provider-deterministic.adapter";
212
+ export * from "./idempotency-store.port";
213
+ export * from "./idempotency-store-cache.adapter";
214
+ export * from "./idempotency-store-noop.adapter";
215
+ export * from "./idempotency-store-with-logger.adapter";
209
216
  export * from "./image.types";
210
217
  export * from "./image-blur.adapter";
211
218
  export * from "./image-blur.port";
@@ -376,6 +383,7 @@ export * from "./randomness.strategy";
376
383
  export * from "./randomness-crypto.strategy";
377
384
  export * from "./randomness-math.strategy";
378
385
  export * from "./randomness-noop.strategy";
386
+ export * from "./rate-limiter.service";
379
387
  export * from "./reactive-config.port";
380
388
  export * from "./reactive-config-file-json.adapter";
381
389
  export * from "./reactive-config-noop.adapter";
@@ -547,6 +555,7 @@ export * from "./translations-hono.handler";
547
555
  export * from "./translations-provider.port";
548
556
  export * from "./translations-provider-json.adapter";
549
557
  export * from "./translations-provider-noop.adapter";
558
+ export * from "./translations-provider-with-cache.adapter";
550
559
  export * from "./translator.service";
551
560
  export * from "./uptime.service";
552
561
  export * from "./uuid.vo";
@@ -560,13 +569,17 @@ export * from "./weak-etag-extractor-hono.middleware";
560
569
  export * from "./weak-etag-extractor-param.strategy";
561
570
  export * from "./webhook-body-builder.strategy";
562
571
  export * from "./webhook-body-builder-text.strategy";
572
+ export * from "./webhook-id.vo";
573
+ export * from "./webhook-id-extractor.strategy";
574
+ export * from "./webhook-id-extractor-header.strategy";
575
+ export * from "./webhook-id-extractor-json-field.strategy";
563
576
  export * from "./webhook-secret.vo";
564
577
  export * from "./webhook-signature.vo";
565
578
  export * from "./webhook-signature-creator.strategy";
566
579
  export * from "./webhook-signature-creator-noop.strategy";
567
580
  export * from "./webhook-signature-creator-sha256.strategy";
568
581
  export * from "./webhook-signature-extractor.strategy";
569
- export * from "./webhook-signature-extractor-header-exact.strategy";
582
+ export * from "./webhook-signature-extractor-header.strategy";
570
583
  export * from "./webhook-verifier.strategy";
571
584
  export * from "./webhook-verifier-noop.strategy";
572
585
  export * from "./webhook-verifier-sha256.strategy";