@bgord/bun 1.16.0 → 1.16.2

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 (292) hide show
  1. package/dist/antivirus-clamav.adapter.js +1 -1
  2. package/dist/antivirus-clamav.adapter.js.map +1 -1
  3. package/dist/antivirus-with-logger.adapter.d.ts +17 -0
  4. package/dist/antivirus-with-logger.adapter.d.ts.map +1 -0
  5. package/dist/antivirus-with-logger.adapter.js +35 -0
  6. package/dist/antivirus-with-logger.adapter.js.map +1 -0
  7. package/dist/antivirus-with-semaphore.adapter.d.ts +14 -0
  8. package/dist/antivirus-with-semaphore.adapter.d.ts.map +1 -0
  9. package/dist/antivirus-with-semaphore.adapter.js +10 -0
  10. package/dist/antivirus-with-semaphore.adapter.js.map +1 -0
  11. package/dist/csv-stringifier-noop.adapter.d.ts +5 -0
  12. package/dist/csv-stringifier-noop.adapter.d.ts.map +1 -0
  13. package/dist/csv-stringifier-noop.adapter.js +6 -0
  14. package/dist/csv-stringifier-noop.adapter.js.map +1 -0
  15. package/dist/environment-loader-encrypted.adapter.d.ts.map +1 -1
  16. package/dist/environment-loader-encrypted.adapter.js +0 -1
  17. package/dist/environment-loader-encrypted.adapter.js.map +1 -1
  18. package/dist/environment-loader-noop.adapter.d.ts.map +1 -1
  19. package/dist/environment-loader-noop.adapter.js +0 -1
  20. package/dist/environment-loader-noop.adapter.js.map +1 -1
  21. package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
  22. package/dist/environment-loader-process-safe.adapter.js +0 -1
  23. package/dist/environment-loader-process-safe.adapter.js.map +1 -1
  24. package/dist/environment-loader-process.adapter.d.ts.map +1 -1
  25. package/dist/environment-loader-process.adapter.js +0 -1
  26. package/dist/environment-loader-process.adapter.js.map +1 -1
  27. package/dist/event-envelope.d.ts +0 -7
  28. package/dist/event-envelope.d.ts.map +1 -1
  29. package/dist/event-envelope.js +2 -2
  30. package/dist/event-envelope.js.map +1 -1
  31. package/dist/event-loop-lag.service.js +1 -1
  32. package/dist/event-loop-lag.service.js.map +1 -1
  33. package/dist/event-loop-utilization.service.d.ts.map +1 -1
  34. package/dist/event-loop-utilization.service.js +0 -2
  35. package/dist/event-loop-utilization.service.js.map +1 -1
  36. package/dist/event-serializer-collecting.adapter.d.ts +5 -4
  37. package/dist/event-serializer-collecting.adapter.d.ts.map +1 -1
  38. package/dist/event-serializer-collecting.adapter.js.map +1 -1
  39. package/dist/event-serializer-json.adapter.d.ts +3 -2
  40. package/dist/event-serializer-json.adapter.d.ts.map +1 -1
  41. package/dist/event-serializer-json.adapter.js.map +1 -1
  42. package/dist/event-serializer.port.d.ts +3 -2
  43. package/dist/event-serializer.port.d.ts.map +1 -1
  44. package/dist/event-store-with-logger.adapter.d.ts.map +1 -1
  45. package/dist/event-store-with-logger.adapter.js +0 -1
  46. package/dist/event-store-with-logger.adapter.js.map +1 -1
  47. package/dist/event-store.adapter.d.ts +2 -0
  48. package/dist/event-store.adapter.d.ts.map +1 -1
  49. package/dist/event-store.adapter.js +1 -0
  50. package/dist/event-store.adapter.js.map +1 -1
  51. package/dist/event-upcaster-chain.adapter.d.ts +11 -0
  52. package/dist/event-upcaster-chain.adapter.d.ts.map +1 -0
  53. package/dist/event-upcaster-chain.adapter.js +31 -0
  54. package/dist/event-upcaster-chain.adapter.js.map +1 -0
  55. package/dist/event-upcaster-noop.adapter.d.ts +6 -0
  56. package/dist/event-upcaster-noop.adapter.d.ts.map +1 -0
  57. package/dist/event-upcaster-noop.adapter.js +6 -0
  58. package/dist/event-upcaster-noop.adapter.js.map +1 -0
  59. package/dist/event-upcaster-step.vo.d.ts +11 -0
  60. package/dist/event-upcaster-step.vo.d.ts.map +1 -0
  61. package/dist/event-upcaster-step.vo.js +10 -0
  62. package/dist/event-upcaster-step.vo.js.map +1 -0
  63. package/dist/event-upcaster.port.d.ts +5 -0
  64. package/dist/event-upcaster.port.d.ts.map +1 -0
  65. package/dist/event-upcaster.port.js +2 -0
  66. package/dist/event-upcaster.port.js.map +1 -0
  67. package/dist/event-validator-registry.adapter.d.ts.map +1 -1
  68. package/dist/event-validator-registry.adapter.js +0 -1
  69. package/dist/event-validator-registry.adapter.js.map +1 -1
  70. package/dist/event.types.d.ts +1 -1
  71. package/dist/event.types.d.ts.map +1 -1
  72. package/dist/file-copier.adapter.d.ts.map +1 -1
  73. package/dist/file-copier.adapter.js +0 -2
  74. package/dist/file-copier.adapter.js.map +1 -1
  75. package/dist/file-writer-forgiving.adapter.d.ts +6 -0
  76. package/dist/file-writer-forgiving.adapter.d.ts.map +1 -0
  77. package/dist/file-writer-forgiving.adapter.js +10 -0
  78. package/dist/file-writer-forgiving.adapter.js.map +1 -0
  79. package/dist/graceful-shutdown.service.d.ts.map +1 -1
  80. package/dist/graceful-shutdown.service.js +1 -3
  81. package/dist/graceful-shutdown.service.js.map +1 -1
  82. package/dist/image-alpha-with-semaphore.adapter.d.ts +14 -0
  83. package/dist/image-alpha-with-semaphore.adapter.d.ts.map +1 -0
  84. package/dist/image-alpha-with-semaphore.adapter.js +10 -0
  85. package/dist/image-alpha-with-semaphore.adapter.js.map +1 -0
  86. package/dist/image-blur-with-semaphore.adapter.d.ts +14 -0
  87. package/dist/image-blur-with-semaphore.adapter.d.ts.map +1 -0
  88. package/dist/image-blur-with-semaphore.adapter.js +10 -0
  89. package/dist/image-blur-with-semaphore.adapter.js.map +1 -0
  90. package/dist/image-compressor-with-semaphore.adapter.d.ts +14 -0
  91. package/dist/image-compressor-with-semaphore.adapter.d.ts.map +1 -0
  92. package/dist/image-compressor-with-semaphore.adapter.js +10 -0
  93. package/dist/image-compressor-with-semaphore.adapter.js.map +1 -0
  94. package/dist/image-exif-clear-with-semaphore.adapter.d.ts +14 -0
  95. package/dist/image-exif-clear-with-semaphore.adapter.d.ts.map +1 -0
  96. package/dist/image-exif-clear-with-semaphore.adapter.js +10 -0
  97. package/dist/image-exif-clear-with-semaphore.adapter.js.map +1 -0
  98. package/dist/image-formatter-with-semaphore.adapter.d.ts +14 -0
  99. package/dist/image-formatter-with-semaphore.adapter.d.ts.map +1 -0
  100. package/dist/image-formatter-with-semaphore.adapter.js +10 -0
  101. package/dist/image-formatter-with-semaphore.adapter.js.map +1 -0
  102. package/dist/image-grayscale-with-semaphore.adapter.d.ts +14 -0
  103. package/dist/image-grayscale-with-semaphore.adapter.d.ts.map +1 -0
  104. package/dist/image-grayscale-with-semaphore.adapter.js +10 -0
  105. package/dist/image-grayscale-with-semaphore.adapter.js.map +1 -0
  106. package/dist/image-info-with-semaphore.adapter.d.ts +14 -0
  107. package/dist/image-info-with-semaphore.adapter.d.ts.map +1 -0
  108. package/dist/image-info-with-semaphore.adapter.js +10 -0
  109. package/dist/image-info-with-semaphore.adapter.js.map +1 -0
  110. package/dist/image-processor-with-semaphore.adapter.d.ts +14 -0
  111. package/dist/image-processor-with-semaphore.adapter.d.ts.map +1 -0
  112. package/dist/image-processor-with-semaphore.adapter.js +10 -0
  113. package/dist/image-processor-with-semaphore.adapter.js.map +1 -0
  114. package/dist/image-resizer-with-semaphore.adapter.d.ts +14 -0
  115. package/dist/image-resizer-with-semaphore.adapter.d.ts.map +1 -0
  116. package/dist/image-resizer-with-semaphore.adapter.js +10 -0
  117. package/dist/image-resizer-with-semaphore.adapter.js.map +1 -0
  118. package/dist/index.d.ts +19 -1
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +19 -1
  121. package/dist/index.js.map +1 -1
  122. package/dist/language-detector-header.strategy.d.ts.map +1 -1
  123. package/dist/language-detector-header.strategy.js +0 -2
  124. package/dist/language-detector-header.strategy.js.map +1 -1
  125. package/dist/logger.port.d.ts +1 -2
  126. package/dist/logger.port.d.ts.map +1 -1
  127. package/dist/logger.port.js.map +1 -1
  128. package/dist/modules/preferences/command-handlers/handleSetUserLanguageCommand.d.ts.map +1 -1
  129. package/dist/modules/preferences/command-handlers/handleSetUserLanguageCommand.js +4 -8
  130. package/dist/modules/preferences/command-handlers/handleSetUserLanguageCommand.js.map +1 -1
  131. package/dist/modules/system/services/passage-of-time-hourly.service.d.ts.map +1 -1
  132. package/dist/modules/system/services/passage-of-time-hourly.service.js +5 -9
  133. package/dist/modules/system/services/passage-of-time-hourly.service.js.map +1 -1
  134. package/dist/modules/system/services/passage-of-time-minute.service.d.ts.map +1 -1
  135. package/dist/modules/system/services/passage-of-time-minute.service.js +5 -9
  136. package/dist/modules/system/services/passage-of-time-minute.service.js.map +1 -1
  137. package/dist/prerequisite-verifier-dns.adapter.js +1 -1
  138. package/dist/prerequisite-verifier-dns.adapter.js.map +1 -1
  139. package/dist/prerequisite-verifier-with-retry.adapter.d.ts.map +1 -1
  140. package/dist/prerequisite-verifier-with-retry.adapter.js +0 -2
  141. package/dist/prerequisite-verifier-with-retry.adapter.js.map +1 -1
  142. package/dist/prerequisite-verifier.port.d.ts +2 -2
  143. package/dist/prerequisite-verifier.port.d.ts.map +1 -1
  144. package/dist/prerequisite-verifier.port.js +2 -2
  145. package/dist/prerequisite-verifier.port.js.map +1 -1
  146. package/dist/randomness-crypto.strategy.js +1 -1
  147. package/dist/randomness-crypto.strategy.js.map +1 -1
  148. package/dist/redactor-error-cause-depth-limit.strategy.d.ts.map +1 -1
  149. package/dist/redactor-error-cause-depth-limit.strategy.js +2 -6
  150. package/dist/redactor-error-cause-depth-limit.strategy.js.map +1 -1
  151. package/dist/redactor-error-stack-hide.strategy.d.ts.map +1 -1
  152. package/dist/redactor-error-stack-hide.strategy.js +3 -6
  153. package/dist/redactor-error-stack-hide.strategy.js.map +1 -1
  154. package/dist/redactor-mask.strategy.js +2 -2
  155. package/dist/redactor-mask.strategy.js.map +1 -1
  156. package/dist/redactor-metadata-compact-array.strategy.d.ts.map +1 -1
  157. package/dist/redactor-metadata-compact-array.strategy.js +2 -4
  158. package/dist/redactor-metadata-compact-array.strategy.js.map +1 -1
  159. package/dist/redactor-metadata-compact-object.strategy.d.ts.map +1 -1
  160. package/dist/redactor-metadata-compact-object.strategy.js +3 -5
  161. package/dist/redactor-metadata-compact-object.strategy.js.map +1 -1
  162. package/dist/remote-file-storage-noop.adapter.d.ts +4 -7
  163. package/dist/remote-file-storage-noop.adapter.d.ts.map +1 -1
  164. package/dist/remote-file-storage-noop.adapter.js +4 -26
  165. package/dist/remote-file-storage-noop.adapter.js.map +1 -1
  166. package/dist/remote-file-storage-with-logger.adapter.d.ts +21 -0
  167. package/dist/remote-file-storage-with-logger.adapter.d.ts.map +1 -0
  168. package/dist/remote-file-storage-with-logger.adapter.js +111 -0
  169. package/dist/remote-file-storage-with-logger.adapter.js.map +1 -0
  170. package/dist/retry.service.d.ts +0 -3
  171. package/dist/retry.service.d.ts.map +1 -1
  172. package/dist/retry.service.js +0 -3
  173. package/dist/retry.service.js.map +1 -1
  174. package/dist/security-countermeasure-ban.strategy.d.ts.map +1 -1
  175. package/dist/security-countermeasure-ban.strategy.js +5 -8
  176. package/dist/security-countermeasure-ban.strategy.js.map +1 -1
  177. package/dist/semaphore.service.d.ts +10 -0
  178. package/dist/semaphore.service.d.ts.map +1 -0
  179. package/dist/semaphore.service.js +19 -0
  180. package/dist/semaphore.service.js.map +1 -0
  181. package/dist/setup-hono.service.d.ts.map +1 -1
  182. package/dist/setup-hono.service.js +1 -12
  183. package/dist/setup-hono.service.js.map +1 -1
  184. package/dist/sse-registry.adapter.js +1 -1
  185. package/dist/sse-registry.adapter.js.map +1 -1
  186. package/dist/static-files-hono.service.d.ts.map +1 -1
  187. package/dist/static-files-hono.service.js +0 -2
  188. package/dist/static-files-hono.service.js.map +1 -1
  189. package/dist/translations-hono.handler.d.ts +1 -1
  190. package/dist/translations-hono.handler.d.ts.map +1 -1
  191. package/dist/translations-hono.handler.js.map +1 -1
  192. package/dist/woodchopper-diagnostics-collecting.strategy.js +2 -2
  193. package/dist/woodchopper-diagnostics-collecting.strategy.js.map +1 -1
  194. package/dist/woodchopper-diagnostics-console-error.strategy.js +2 -2
  195. package/dist/woodchopper-diagnostics-console-error.strategy.js.map +1 -1
  196. package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +1 -1
  197. package/dist/woodchopper-dispatcher-async.strategy.js +0 -2
  198. package/dist/woodchopper-dispatcher-async.strategy.js.map +1 -1
  199. package/dist/woodchopper-sampling-correlation-id.strategy.js +1 -1
  200. package/dist/woodchopper-sampling-correlation-id.strategy.js.map +1 -1
  201. package/dist/woodchopper-sink-stderr.strategy.js +1 -1
  202. package/dist/woodchopper-sink-stderr.strategy.js.map +1 -1
  203. package/dist/woodchopper-sink-stdout-human.strategy.js +1 -1
  204. package/dist/woodchopper-sink-stdout-human.strategy.js.map +1 -1
  205. package/dist/woodchopper-sink-stdout.strategy.js +1 -1
  206. package/dist/woodchopper-sink-stdout.strategy.js.map +1 -1
  207. package/dist/woodchopper.d.ts.map +1 -1
  208. package/dist/woodchopper.js +1 -2
  209. package/dist/woodchopper.js.map +1 -1
  210. package/package.json +7 -6
  211. package/readme.md +19 -3
  212. package/src/antivirus-clamav.adapter.ts +1 -1
  213. package/src/antivirus-with-logger.adapter.ts +44 -0
  214. package/src/antivirus-with-semaphore.adapter.ts +13 -0
  215. package/src/csv-stringifier-noop.adapter.ts +7 -0
  216. package/src/environment-loader-encrypted.adapter.ts +0 -1
  217. package/src/environment-loader-noop.adapter.ts +0 -1
  218. package/src/environment-loader-process-safe.adapter.ts +0 -1
  219. package/src/environment-loader-process.adapter.ts +0 -1
  220. package/src/event-envelope.ts +2 -2
  221. package/src/event-loop-lag.service.ts +1 -1
  222. package/src/event-loop-utilization.service.ts +0 -2
  223. package/src/event-serializer-collecting.adapter.ts +5 -4
  224. package/src/event-serializer-json.adapter.ts +3 -2
  225. package/src/event-serializer.port.ts +4 -2
  226. package/src/event-store-with-logger.adapter.ts +0 -1
  227. package/src/event-store.adapter.ts +3 -0
  228. package/src/event-upcaster-chain.adapter.ts +49 -0
  229. package/src/event-upcaster-noop.adapter.ts +8 -0
  230. package/src/event-upcaster-step.vo.ts +21 -0
  231. package/src/event-upcaster.port.ts +5 -0
  232. package/src/event-validator-registry.adapter.ts +0 -1
  233. package/src/event.types.ts +1 -1
  234. package/src/file-copier.adapter.ts +0 -2
  235. package/src/file-writer-forgiving.adapter.ts +14 -0
  236. package/src/graceful-shutdown.service.ts +0 -2
  237. package/src/image-alpha-with-semaphore.adapter.ts +13 -0
  238. package/src/image-blur-with-semaphore.adapter.ts +13 -0
  239. package/src/image-compressor-with-semaphore.adapter.ts +13 -0
  240. package/src/image-exif-clear-with-semaphore.adapter.ts +13 -0
  241. package/src/image-formatter-with-semaphore.adapter.ts +13 -0
  242. package/src/image-grayscale-with-semaphore.adapter.ts +13 -0
  243. package/src/image-info-with-semaphore.adapter.ts +13 -0
  244. package/src/image-processor-with-semaphore.adapter.ts +13 -0
  245. package/src/image-resizer-with-semaphore.adapter.ts +13 -0
  246. package/src/index.ts +19 -1
  247. package/src/language-detector-header.strategy.ts +0 -2
  248. package/src/logger.port.ts +1 -2
  249. package/src/modules/preferences/command-handlers/handleSetUserLanguageCommand.ts +9 -9
  250. package/src/modules/system/services/passage-of-time-hourly.service.ts +5 -14
  251. package/src/modules/system/services/passage-of-time-minute.service.ts +5 -14
  252. package/src/prerequisite-verifier-dns.adapter.ts +1 -1
  253. package/src/prerequisite-verifier-with-retry.adapter.ts +0 -2
  254. package/src/prerequisite-verifier.port.ts +3 -3
  255. package/src/randomness-crypto.strategy.ts +1 -1
  256. package/src/redactor-error-cause-depth-limit.strategy.ts +3 -7
  257. package/src/redactor-error-stack-hide.strategy.ts +4 -7
  258. package/src/redactor-mask.strategy.ts +2 -2
  259. package/src/redactor-metadata-compact-array.strategy.ts +2 -4
  260. package/src/redactor-metadata-compact-object.strategy.ts +3 -5
  261. package/src/remote-file-storage-noop.adapter.ts +5 -32
  262. package/src/remote-file-storage-with-logger.adapter.ts +140 -0
  263. package/src/retry.service.ts +0 -4
  264. package/src/security-countermeasure-ban.strategy.ts +4 -9
  265. package/src/semaphore.service.ts +26 -0
  266. package/src/setup-hono.service.ts +1 -12
  267. package/src/sse-registry.adapter.ts +1 -1
  268. package/src/static-files-hono.service.ts +0 -2
  269. package/src/translations-hono.handler.ts +1 -1
  270. package/src/woodchopper-diagnostics-collecting.strategy.ts +2 -2
  271. package/src/woodchopper-diagnostics-console-error.strategy.ts +2 -2
  272. package/src/woodchopper-dispatcher-async.strategy.ts +0 -2
  273. package/src/woodchopper-sampling-correlation-id.strategy.ts +1 -1
  274. package/src/woodchopper-sink-stderr.strategy.ts +1 -1
  275. package/src/woodchopper-sink-stdout-human.strategy.ts +1 -1
  276. package/src/woodchopper-sink-stdout.strategy.ts +1 -1
  277. package/src/woodchopper.ts +1 -2
  278. package/dist/deep-clone-with.d.ts +0 -4
  279. package/dist/deep-clone-with.d.ts.map +0 -1
  280. package/dist/deep-clone-with.js +0 -22
  281. package/dist/deep-clone-with.js.map +0 -1
  282. package/dist/error-normalizer.service.d.ts +0 -12
  283. package/dist/error-normalizer.service.d.ts.map +0 -1
  284. package/dist/error-normalizer.service.js +0 -24
  285. package/dist/error-normalizer.service.js.map +0 -1
  286. package/dist/is-plain-object.d.ts +0 -2
  287. package/dist/is-plain-object.d.ts.map +0 -1
  288. package/dist/is-plain-object.js +0 -7
  289. package/dist/is-plain-object.js.map +0 -1
  290. package/src/deep-clone-with.ts +0 -31
  291. package/src/error-normalizer.service.ts +0 -32
  292. package/src/is-plain-object.ts +0 -7
@@ -6,9 +6,7 @@ export class FileCopierAdapter implements FileCopierPort {
6
6
  source: tools.FilePathRelative | tools.FilePathAbsolute | string,
7
7
  destination: tools.FilePathRelative | tools.FilePathAbsolute | string,
8
8
  ): Promise<void> {
9
- // Stryker disable all
10
9
  const file = Bun.file(typeof source === "string" ? source : source.get());
11
- // Stryker restore all
12
10
 
13
11
  await Bun.write(typeof destination === "string" ? destination : destination.get(), file);
14
12
  }
@@ -0,0 +1,14 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { FileWriterContent, FileWriterPort } from "./file-writer.port";
3
+
4
+ export class FileWriterForgivingAdapter implements FileWriterPort {
5
+ async write(
6
+ path: tools.FilePathRelative | tools.FilePathAbsolute | string,
7
+ content: FileWriterContent,
8
+ ): Promise<void> {
9
+ try {
10
+ // Types are different than the runtime behavior
11
+ await Bun.write(typeof path === "string" ? path : path.get(), content as any);
12
+ } catch {}
13
+ }
14
+ }
@@ -11,9 +11,7 @@ export class GracefulShutdown {
11
11
 
12
12
  constructor(
13
13
  private readonly deps: Dependencies,
14
- // Stryker disable all
15
14
  private readonly exitFn: (code: number) => never = (code: number) => process.exit(code),
16
- // Stryker restore all
17
15
  ) {}
18
16
 
19
17
  private shutdown(server: ServerType, cleanup: () => any, exitCode: number) {
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageAlphaPort, ImageAlphaStrategy } from "./image-alpha.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageAlphaPort; semaphore: Semaphore };
6
+
7
+ export class ImageAlphaWithSemaphoreAdapter implements ImageAlphaPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async flatten(recipe: ImageAlphaStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.flatten(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageBlurPort, ImageBlurStrategy } from "./image-blur.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageBlurPort; semaphore: Semaphore };
6
+
7
+ export class ImageBlurWithSemaphoreAdapter implements ImageBlurPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async blur(recipe: ImageBlurStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.blur(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageCompressorPort, ImageCompressorStrategy } from "./image-compressor.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageCompressorPort; semaphore: Semaphore };
6
+
7
+ export class ImageCompressorWithSemaphoreAdapter implements ImageCompressorPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async compress(recipe: ImageCompressorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.compress(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageExifClearPort, ImageExifClearStrategy } from "./image-exif-clear.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageExifClearPort; semaphore: Semaphore };
6
+
7
+ export class ImageExifClearWithSemaphoreAdapter implements ImageExifClearPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async clear(recipe: ImageExifClearStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.clear(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageFormatterPort, ImageFormatterStrategy } from "./image-formatter.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageFormatterPort; semaphore: Semaphore };
6
+
7
+ export class ImageFormatterWithSemaphoreAdapter implements ImageFormatterPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async format(recipe: ImageFormatterStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.format(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageGrayscalePort, ImageGrayscaleStrategy } from "./image-grayscale.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageGrayscalePort; semaphore: Semaphore };
6
+
7
+ export class ImageGrayscaleWithSemaphoreAdapter implements ImageGrayscalePort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async grayscale(recipe: ImageGrayscaleStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.grayscale(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageInfoPort, ImageInfoType } from "./image-info.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageInfoPort; semaphore: Semaphore };
6
+
7
+ export class ImageInfoWithSemaphoreAdapter implements ImageInfoPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async inspect(input: tools.FilePathRelative | tools.FilePathAbsolute): Promise<ImageInfoType> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.inspect(input));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageProcessorPort, ImageProcessorStrategy } from "./image-processor.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageProcessorPort; semaphore: Semaphore };
6
+
7
+ export class ImageProcessorWithSemaphoreAdapter implements ImageProcessorPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async process(recipe: ImageProcessorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.process(recipe));
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageResizerPort, ImageResizerStrategy } from "./image-resizer.port";
3
+ import type { Semaphore } from "./semaphore.service";
4
+
5
+ type Dependencies = { inner: ImageResizerPort; semaphore: Semaphore };
6
+
7
+ export class ImageResizerWithSemaphoreAdapter implements ImageResizerPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
10
+ async resize(recipe: ImageResizerStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
11
+ return this.deps.semaphore.run(() => this.deps.inner.resize(recipe));
12
+ }
13
+ }
package/src/index.ts CHANGED
@@ -24,6 +24,8 @@ export * from "./alert-message.vo";
24
24
  export * from "./antivirus.port";
25
25
  export * from "./antivirus-clamav.adapter";
26
26
  export * from "./antivirus-noop.adapter";
27
+ export * from "./antivirus-with-logger.adapter";
28
+ export * from "./antivirus-with-semaphore.adapter";
27
29
  export * from "./api-version.middleware";
28
30
  export * from "./api-version-hono.middleware";
29
31
  export * from "./auth-session-reader.port";
@@ -70,6 +72,7 @@ export * from "./crypto-key-provider-noop.adapter";
70
72
  export * from "./crypto-key-provider-with-cache.adapter";
71
73
  export * from "./csv-stringifier.adapter";
72
74
  export * from "./csv-stringifier.port";
75
+ export * from "./csv-stringifier-noop.adapter";
73
76
  export * from "./directory-ensurer.adapter";
74
77
  export * from "./directory-ensurer.port";
75
78
  export * from "./directory-ensurer-noop.adapter";
@@ -87,7 +90,6 @@ export * from "./environment-loader-encrypted.adapter";
87
90
  export * from "./environment-loader-noop.adapter";
88
91
  export * from "./environment-loader-process.adapter";
89
92
  export * from "./environment-loader-process-safe.adapter";
90
- export * from "./error-normalizer.service";
91
93
  export * from "./etag-extractor.middleware";
92
94
  export * from "./etag-extractor-hono.middleware";
93
95
  export * from "./event.types";
@@ -111,6 +113,10 @@ export * from "./event-store-dispatching.adapter";
111
113
  export * from "./event-store-noop.adapter";
112
114
  export * from "./event-store-with-logger.adapter";
113
115
  export * from "./event-stream.vo";
116
+ export * from "./event-upcaster.port";
117
+ export * from "./event-upcaster-chain.adapter";
118
+ export * from "./event-upcaster-noop.adapter";
119
+ export * from "./event-upcaster-step.vo";
114
120
  export * from "./event-validator-registry.adapter";
115
121
  export * from "./event-validator-registry.port";
116
122
  export * from "./file-cleaner.adapter";
@@ -149,6 +155,7 @@ export * from "./file-uploader.middleware";
149
155
  export * from "./file-uploader-hono.middleware";
150
156
  export * from "./file-writer.adapter";
151
157
  export * from "./file-writer.port";
158
+ export * from "./file-writer-forgiving.adapter";
152
159
  export * from "./file-writer-noop.adapter";
153
160
  export * from "./fnv1a32.service";
154
161
  export * from "./graceful-shutdown.service";
@@ -179,30 +186,39 @@ export * from "./id-provider-deterministic.adapter";
179
186
  export * from "./image-alpha.port";
180
187
  export * from "./image-alpha-noop.adapter";
181
188
  export * from "./image-alpha-sharp.adapter";
189
+ export * from "./image-alpha-with-semaphore.adapter";
182
190
  export * from "./image-blur.port";
183
191
  export * from "./image-blur-noop.adapter";
184
192
  export * from "./image-blur-sharp.adapter";
193
+ export * from "./image-blur-with-semaphore.adapter";
185
194
  export * from "./image-compressor.port";
186
195
  export * from "./image-compressor-noop.adapter";
187
196
  export * from "./image-compressor-sharp.adapter";
197
+ export * from "./image-compressor-with-semaphore.adapter";
188
198
  export * from "./image-exif-clear.port";
189
199
  export * from "./image-exif-clear-noop.adapter";
190
200
  export * from "./image-exif-clear-sharp.adapter";
201
+ export * from "./image-exif-clear-with-semaphore.adapter";
191
202
  export * from "./image-formatter.port";
192
203
  export * from "./image-formatter-noop.adapter";
193
204
  export * from "./image-formatter-sharp.adapter";
205
+ export * from "./image-formatter-with-semaphore.adapter";
194
206
  export * from "./image-grayscale.port";
195
207
  export * from "./image-grayscale-noop.adapter";
196
208
  export * from "./image-grayscale-sharp.adapter";
209
+ export * from "./image-grayscale-with-semaphore.adapter";
197
210
  export * from "./image-info.port";
198
211
  export * from "./image-info-noop.adapter";
199
212
  export * from "./image-info-sharp.adapter";
213
+ export * from "./image-info-with-semaphore.adapter";
200
214
  export * from "./image-processor.port";
201
215
  export * from "./image-processor-noop.adapter";
202
216
  export * from "./image-processor-sharp.adapter";
217
+ export * from "./image-processor-with-semaphore.adapter";
203
218
  export * from "./image-resizer.port";
204
219
  export * from "./image-resizer-noop.adapter";
205
220
  export * from "./image-resizer-sharp.adapter";
221
+ export * from "./image-resizer-with-semaphore.adapter";
206
222
  export * from "./in-flight-requests-hono.middleware";
207
223
  export * from "./in-flight-requests-tracker.service";
208
224
  export * from "./instrumentation.service";
@@ -320,6 +336,7 @@ export * from "./redactor-noop.strategy";
320
336
  export * from "./remote-file-storage.port";
321
337
  export * from "./remote-file-storage-disk.adapter";
322
338
  export * from "./remote-file-storage-noop.adapter";
339
+ export * from "./remote-file-storage-with-logger.adapter";
323
340
  export * from "./request-context.port";
324
341
  export * from "./request-context-hono.adapter";
325
342
  export * from "./retry.service";
@@ -353,6 +370,7 @@ export * from "./security-rule-or.strategy";
353
370
  export * from "./security-rule-pass.strategy";
354
371
  export * from "./security-rule-user-agent.strategy";
355
372
  export * from "./security-rule-violation-threshold.strategy";
373
+ export * from "./semaphore.service";
356
374
  export * from "./setup-hono.service";
357
375
  export * from "./shield-api-key.strategy";
358
376
  export * from "./shield-api-key-hono.strategy";
@@ -12,11 +12,9 @@ export class LanguageDetectorHeaderStrategy<T extends tools.LanguageType>
12
12
  if (!header) return null;
13
13
 
14
14
  // Example Accept-Language header: en-US,en;q=0.9,pl;q=0.8
15
- // Stryker disable all
16
15
  const incoming = header
17
16
  .split(",")
18
17
  .map((language) => language.split(";")[0]?.trim().toLowerCase().split("-")[0]);
19
- // Stryker restore all
20
18
 
21
19
  return incoming.find((language) => languages.isSupported(language)) ?? null;
22
20
  }
@@ -1,6 +1,5 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { CorrelationIdType } from "./correlation-id.vo";
3
- import type { NormalizedError } from "./error-normalizer.service";
4
3
  import type { NodeEnvironmentEnum } from "./node-env.vo";
5
4
 
6
5
  export type LoggerAppType = string;
@@ -50,7 +49,7 @@ export type LoggerEntryBare = Omit<
50
49
  AdapterInjectedFields
51
50
  >;
52
51
 
53
- export type LoggerEntryBareWithError = Omit<LoggerEntryBare, "error"> & { error: NormalizedError };
52
+ export type LoggerEntryBareWithError = Omit<LoggerEntryBare, "error"> & { error: tools.NormalizedError };
54
53
 
55
54
  export type LoggerEntry = LogCoreType | LogHttpType | LogWarnType | LogErrorType;
56
55
 
@@ -1,7 +1,6 @@
1
1
  import type * as tools from "@bgord/tools";
2
- import * as v from "valibot";
3
2
  import type { ClockPort } from "../../../clock.port";
4
- import { createEventEnvelope } from "../../../event-envelope";
3
+ import { event } from "../../../event-envelope";
5
4
  import type { EventStorePort } from "../../../event-store.port";
6
5
  import type { IdProviderPort } from "../../../id-provider.port";
7
6
  import type { Languages } from "../../../languages.vo";
@@ -34,11 +33,12 @@ export const handleSetUserLanguageCommand =
34
33
 
35
34
  if (!Invariants.UserLanguageHasChanged.passes({ current, candidate })) return;
36
35
 
37
- const event = v.parse(Events.UserLanguageSetEvent, {
38
- ...createEventEnvelope(`preferences_${command.payload.userId}`, deps),
39
- name: Events.USER_LANGUAGE_SET_EVENT,
40
- payload: { userId: command.payload.userId, language: candidate },
41
- } satisfies Events.UserLanguageSetEventType);
42
-
43
- await deps.EventStore.save([event]);
36
+ await deps.EventStore.save([
37
+ event(
38
+ Events.UserLanguageSetEvent,
39
+ `preferences_${command.payload.userId}`,
40
+ { userId: command.payload.userId, language: candidate },
41
+ deps,
42
+ ),
43
+ ]);
44
44
  };
@@ -1,15 +1,10 @@
1
- import * as v from "valibot";
2
1
  import type { ClockPort } from "../../../clock.port";
3
- import { createEventEnvelope } from "../../../event-envelope";
2
+ import { event } from "../../../event-envelope";
4
3
  import type { EventStorePort } from "../../../event-store.port";
5
4
  import type { IdProviderPort } from "../../../id-provider.port";
6
5
  import type { UnitOfWork } from "../../../job-handler.strategy";
7
6
  import { Jobs } from "../../../jobs.service";
8
- import {
9
- HOUR_HAS_PASSED_EVENT,
10
- HourHasPassedEvent,
11
- type HourHasPassedEventType,
12
- } from "../events/HOUR_HAS_PASSED_EVENT";
7
+ import { HourHasPassedEvent, type HourHasPassedEventType } from "../events/HOUR_HAS_PASSED_EVENT";
13
8
 
14
9
  type Dependencies = {
15
10
  EventStore: EventStorePort<HourHasPassedEventType>;
@@ -25,12 +20,8 @@ export class PassageOfTimeHourly implements UnitOfWork {
25
20
  label = "PassageOfTime";
26
21
 
27
22
  async process() {
28
- const event = v.parse(HourHasPassedEvent, {
29
- ...createEventEnvelope("passage_of_time", this.deps),
30
- name: HOUR_HAS_PASSED_EVENT,
31
- payload: { timestamp: this.deps.Clock.now().ms },
32
- } satisfies HourHasPassedEventType);
33
-
34
- await this.deps.EventStore.save([event]);
23
+ await this.deps.EventStore.save([
24
+ event(HourHasPassedEvent, "passage_of_time", { timestamp: this.deps.Clock.now().ms }, this.deps),
25
+ ]);
35
26
  }
36
27
  }
@@ -1,15 +1,10 @@
1
- import * as v from "valibot";
2
1
  import type { ClockPort } from "../../../clock.port";
3
- import { createEventEnvelope } from "../../../event-envelope";
2
+ import { event } from "../../../event-envelope";
4
3
  import type { EventStorePort } from "../../../event-store.port";
5
4
  import type { IdProviderPort } from "../../../id-provider.port";
6
5
  import type { UnitOfWork } from "../../../job-handler.strategy";
7
6
  import { Jobs } from "../../../jobs.service";
8
- import {
9
- MINUTE_HAS_PASSED_EVENT,
10
- MinuteHasPassedEvent,
11
- type MinuteHasPassedEventType,
12
- } from "../events/MINUTE_HAS_PASSED_EVENT";
7
+ import { MinuteHasPassedEvent, type MinuteHasPassedEventType } from "../events/MINUTE_HAS_PASSED_EVENT";
13
8
 
14
9
  type Dependencies = {
15
10
  EventStore: EventStorePort<MinuteHasPassedEventType>;
@@ -25,12 +20,8 @@ export class PassageOfTimeMinute implements UnitOfWork {
25
20
  label = "PassageOfTime";
26
21
 
27
22
  async process() {
28
- const event = v.parse(MinuteHasPassedEvent, {
29
- ...createEventEnvelope("passage_of_time", this.deps),
30
- name: MINUTE_HAS_PASSED_EVENT,
31
- payload: { timestamp: this.deps.Clock.now().ms },
32
- } satisfies MinuteHasPassedEventType);
33
-
34
- await this.deps.EventStore.save([event]);
23
+ await this.deps.EventStore.save([
24
+ event(MinuteHasPassedEvent, "passage_of_time", { timestamp: this.deps.Clock.now().ms }, this.deps),
25
+ ]);
35
26
  }
36
27
  }
@@ -1,4 +1,4 @@
1
- import dns from "dns/promises";
1
+ import dns from "node:dns/promises";
2
2
  import {
3
3
  PrerequisiteVerification,
4
4
  type PrerequisiteVerificationResult,
@@ -21,9 +21,7 @@ export class PrerequisiteVerifierWithRetryAdapter implements PrerequisiteVerifie
21
21
  return await new Retry(this.deps).run<PrerequisiteVerificationResult>(async () => {
22
22
  const result = await this.config.inner.verify();
23
23
 
24
- // Stryker disable all
25
24
  if (result.outcome === PrerequisiteVerificationOutcome.failure) throw result.error?.message;
26
- // Stryker restore all
27
25
  return result;
28
26
  }, this.config.retry);
29
27
  } catch (error) {
@@ -1,4 +1,4 @@
1
- import { ErrorNormalizer, type NormalizedError } from "./error-normalizer.service";
1
+ import * as tools from "@bgord/tools";
2
2
 
3
3
  export enum PrerequisiteVerificationOutcome {
4
4
  success = "success",
@@ -9,7 +9,7 @@ export enum PrerequisiteVerificationOutcome {
9
9
  export type PrerequisiteVerificationSuccess = { outcome: PrerequisiteVerificationOutcome.success };
10
10
  export type PrerequisiteVerificationFailure = {
11
11
  outcome: PrerequisiteVerificationOutcome.failure;
12
- error?: NormalizedError;
12
+ error?: tools.NormalizedError;
13
13
  };
14
14
  export type PrerequisiteVerificationUndetermined = { outcome: PrerequisiteVerificationOutcome.undetermined };
15
15
  export type PrerequisiteVerificationResult =
@@ -23,7 +23,7 @@ export class PrerequisiteVerification {
23
23
  static failure(meta?: unknown): PrerequisiteVerificationFailure {
24
24
  return {
25
25
  outcome: PrerequisiteVerificationOutcome.failure,
26
- error: meta ? ErrorNormalizer.normalize(meta) : undefined,
26
+ error: meta ? tools.ErrorNormalizer.normalize(meta) : undefined,
27
27
  };
28
28
  }
29
29
 
@@ -4,6 +4,6 @@ export class RandomnessCryptoStrategy implements RandomnessStrategy {
4
4
  next(): number {
5
5
  const array = new Uint32Array(1);
6
6
  crypto.getRandomValues(array);
7
- return array[0]! / 0xffffffff;
7
+ return (array[0] ?? 0) / 0xffffffff;
8
8
  }
9
9
  }
@@ -1,20 +1,16 @@
1
1
  import * as tools from "@bgord/tools";
2
- import { ErrorNormalizer, type NormalizedError } from "./error-normalizer.service";
3
- import { isPlainObject } from "./is-plain-object";
4
2
  import type { RedactorStrategy } from "./redactor.strategy";
5
3
 
6
4
  export class RedactorErrorCauseDepthLimit implements RedactorStrategy {
7
5
  constructor(private readonly max: tools.IntegerNonNegativeType) {}
8
6
 
9
7
  redact<T>(input: T): T {
10
- // Stryker disable all
11
- if (!isPlainObject(input)) return input;
12
- // Stryker restore all
13
- if (!ErrorNormalizer.isNormalizedError(input["error"])) return input;
8
+ if (!tools.isPlainObject(input)) return input;
9
+ if (!tools.ErrorNormalizer.isNormalizedError(input["error"])) return input;
14
10
  return { ...input, error: this.limit(input["error"], tools.Int.nonNegative(0)) };
15
11
  }
16
12
 
17
- private limit(error: NormalizedError, depth: tools.IntegerNonNegativeType): NormalizedError {
13
+ private limit(error: tools.NormalizedError, depth: tools.IntegerNonNegativeType): tools.NormalizedError {
18
14
  if (!error.cause || depth >= this.max) return { ...error, cause: undefined };
19
15
  return { ...error, cause: this.limit(error.cause, tools.Int.nonNegative(depth + 1)) };
20
16
  }
@@ -1,17 +1,14 @@
1
- import { ErrorNormalizer, type NormalizedError } from "./error-normalizer.service";
2
- import { isPlainObject } from "./is-plain-object";
1
+ import * as tools from "@bgord/tools";
3
2
  import type { RedactorStrategy } from "./redactor.strategy";
4
3
 
5
4
  export class RedactorErrorStackHide implements RedactorStrategy {
6
5
  redact<T>(input: T): T {
7
- // Stryker disable all
8
- if (!isPlainObject(input)) return input;
9
- // Stryker restore all
10
- if (!ErrorNormalizer.isNormalizedError(input["error"])) return input;
6
+ if (!tools.isPlainObject(input)) return input;
7
+ if (!tools.ErrorNormalizer.isNormalizedError(input["error"])) return input;
11
8
  return { ...input, error: this.hide(input["error"]) };
12
9
  }
13
10
 
14
- private hide(error: NormalizedError): NormalizedError {
11
+ private hide(error: tools.NormalizedError): tools.NormalizedError {
15
12
  return {
16
13
  ...error,
17
14
  stack: undefined,
@@ -1,4 +1,4 @@
1
- import { deepCloneWith } from "./deep-clone-with";
1
+ import * as tools from "@bgord/tools";
2
2
  import type { RedactorStrategy } from "./redactor.strategy";
3
3
 
4
4
  export class RedactorMask implements RedactorStrategy {
@@ -28,7 +28,7 @@ export class RedactorMask implements RedactorStrategy {
28
28
  }
29
29
 
30
30
  redact<T>(input: T): T {
31
- return deepCloneWith(input, (_value, key) =>
31
+ return tools.deepCloneWith(input, (_value, key) =>
32
32
  typeof key === "string" && this.keys.has(key.toLowerCase()) ? "***" : undefined,
33
33
  );
34
34
  }
@@ -1,6 +1,4 @@
1
1
  import * as tools from "@bgord/tools";
2
- import { deepCloneWith } from "./deep-clone-with";
3
- import { isPlainObject } from "./is-plain-object";
4
2
  import type { RedactorStrategy } from "./redactor.strategy";
5
3
 
6
4
  type RedactorMetadataCompactArrayOptions = { maxItems?: tools.IntegerPositiveType };
@@ -15,11 +13,11 @@ export class RedactorMetadataCompactArray implements RedactorStrategy {
15
13
  }
16
14
 
17
15
  redact<T>(input: T): T {
18
- if (!isPlainObject(input)) return input;
16
+ if (!tools.isPlainObject(input)) return input;
19
17
 
20
18
  return {
21
19
  ...input,
22
- metadata: deepCloneWith(
20
+ metadata: tools.deepCloneWith(
23
21
  input["metadata"],
24
22
  (value) => {
25
23
  if (!Array.isArray(value)) return undefined;
@@ -1,6 +1,4 @@
1
1
  import * as tools from "@bgord/tools";
2
- import { deepCloneWith } from "./deep-clone-with";
3
- import { isPlainObject } from "./is-plain-object";
4
2
  import type { RedactorStrategy } from "./redactor.strategy";
5
3
 
6
4
  type RedactorMetadataCompactObjectOptions = { maxKeys?: tools.IntegerPositiveType };
@@ -15,14 +13,14 @@ export class RedactorMetadataCompactObject implements RedactorStrategy {
15
13
  }
16
14
 
17
15
  redact<T>(input: T): T {
18
- if (!isPlainObject(input)) return input;
16
+ if (!tools.isPlainObject(input)) return input;
19
17
 
20
18
  return {
21
19
  ...input,
22
- metadata: deepCloneWith(
20
+ metadata: tools.deepCloneWith(
23
21
  input["metadata"],
24
22
  (value) => {
25
- if (!isPlainObject(value) || Array.isArray(value)) return undefined;
23
+ if (!tools.isPlainObject(value) || Array.isArray(value)) return undefined;
26
24
 
27
25
  const keys = Object.keys(value).length;
28
26
 
@@ -1,7 +1,6 @@
1
1
  import * as tools from "@bgord/tools";
2
2
  import type { ClockPort } from "./clock.port";
3
3
  import { Hash } from "./hash.vo";
4
- import type { LoggerPort } from "./logger.port";
5
4
  import type {
6
5
  RemoteFileStoragePort,
7
6
  RemoteHeadResult,
@@ -9,25 +8,17 @@ import type {
9
8
  RemotePutFromPathResult,
10
9
  } from "./remote-file-storage.port";
11
10
 
12
- type Dependencies = { Logger: LoggerPort; Clock: ClockPort };
11
+ type Dependencies = { Clock: ClockPort };
13
12
 
14
13
  type RemoteFileStorageNoopConfig = { root: tools.DirectoryPathAbsoluteType };
15
14
 
16
15
  export class RemoteFileStorageNoopAdapter implements RemoteFileStoragePort {
17
- private readonly base = { component: "infra", operation: "RemoteFileStorageNoopAdapter" };
18
-
19
16
  constructor(
20
17
  private readonly config: RemoteFileStorageNoopConfig,
21
18
  private readonly deps: Dependencies,
22
19
  ) {}
23
20
 
24
- async putFromPath(input: RemotePutFromPathInput): Promise<RemotePutFromPathResult> {
25
- this.deps.Logger.info({
26
- message: "[NOOP] RemoteFileStorageNoopAdapter putFromPath",
27
- metadata: { input },
28
- ...this.base,
29
- });
30
-
21
+ async putFromPath(_input: RemotePutFromPathInput): Promise<RemotePutFromPathResult> {
31
22
  return {
32
23
  etag: Hash.fromString("0".repeat(64)),
33
24
  size: tools.Size.fromBytes(10),
@@ -36,33 +27,15 @@ export class RemoteFileStorageNoopAdapter implements RemoteFileStoragePort {
36
27
  };
37
28
  }
38
29
 
39
- async head(key: tools.ObjectKeyType): Promise<RemoteHeadResult> {
40
- this.deps.Logger.info({
41
- message: "[NOOP] RemoteFileStorageNoopAdapter head",
42
- metadata: { key },
43
- ...this.base,
44
- });
45
-
30
+ async head(_key: tools.ObjectKeyType): Promise<RemoteHeadResult> {
46
31
  return { exists: false };
47
32
  }
48
33
 
49
- async getStream(key: tools.ObjectKeyType): Promise<ReadableStream | null> {
50
- this.deps.Logger.info({
51
- message: "[NOOP] RemoteFileStorageNoopAdapter getStream",
52
- metadata: { key },
53
- ...this.base,
54
- });
55
-
34
+ async getStream(_key: tools.ObjectKeyType): Promise<ReadableStream | null> {
56
35
  return null;
57
36
  }
58
37
 
59
- async delete(key: tools.ObjectKeyType): Promise<void> {
60
- this.deps.Logger.info({
61
- message: "[NOOP] RemoteFileStorageNoopAdapter delete",
62
- metadata: { key },
63
- ...this.base,
64
- });
65
- }
38
+ async delete(_key: tools.ObjectKeyType): Promise<void> {}
66
39
 
67
40
  get root(): tools.DirectoryPathAbsoluteType {
68
41
  return this.config.root;