@bgord/bun 1.21.1 → 1.21.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 (259) hide show
  1. package/dist/antivirus-clamav.adapter.d.ts.map +1 -1
  2. package/dist/antivirus-clamav.adapter.js +1 -0
  3. package/dist/antivirus-clamav.adapter.js.map +1 -1
  4. package/dist/better-auth-logger.service.d.ts +2 -3
  5. package/dist/better-auth-logger.service.d.ts.map +1 -1
  6. package/dist/better-auth-logger.service.js +16 -33
  7. package/dist/better-auth-logger.service.js.map +1 -1
  8. package/dist/cache-repository-redis.adapter.d.ts.map +1 -1
  9. package/dist/cache-repository-redis.adapter.js.map +1 -1
  10. package/dist/clock-system.adapter.d.ts.map +1 -1
  11. package/dist/clock-system.adapter.js +2 -1
  12. package/dist/clock-system.adapter.js.map +1 -1
  13. package/dist/cron-expression.vo.d.ts.map +1 -1
  14. package/dist/cron-expression.vo.js +1 -0
  15. package/dist/cron-expression.vo.js.map +1 -1
  16. package/dist/cron-scheduler.adapter.d.ts.map +1 -1
  17. package/dist/cron-scheduler.adapter.js.map +1 -1
  18. package/dist/file-cleaner-forgiving.adapter.d.ts.map +1 -1
  19. package/dist/file-cleaner-forgiving.adapter.js.map +1 -1
  20. package/dist/file-cleaner.adapter.d.ts.map +1 -1
  21. package/dist/file-cleaner.adapter.js.map +1 -1
  22. package/dist/file-copier.adapter.d.ts.map +1 -1
  23. package/dist/file-copier.adapter.js.map +1 -1
  24. package/dist/file-draft-zip.service.d.ts.map +1 -1
  25. package/dist/file-draft-zip.service.js +1 -2
  26. package/dist/file-draft-zip.service.js.map +1 -1
  27. package/dist/file-inspection.adapter.d.ts.map +1 -1
  28. package/dist/file-inspection.adapter.js +1 -0
  29. package/dist/file-inspection.adapter.js.map +1 -1
  30. package/dist/file-reader-json-forgiving.adapter.d.ts.map +1 -1
  31. package/dist/file-reader-json-forgiving.adapter.js.map +1 -1
  32. package/dist/file-reader-json.adapter.d.ts.map +1 -1
  33. package/dist/file-reader-json.adapter.js.map +1 -1
  34. package/dist/file-reader-raw-forgiving.adapter.d.ts.map +1 -1
  35. package/dist/file-reader-raw-forgiving.adapter.js.map +1 -1
  36. package/dist/file-reader-raw.adapter.d.ts.map +1 -1
  37. package/dist/file-reader-raw.adapter.js.map +1 -1
  38. package/dist/file-reader-text-forgiving.adapter.d.ts.map +1 -1
  39. package/dist/file-reader-text-forgiving.adapter.js.map +1 -1
  40. package/dist/file-reader-text.adapter.d.ts.map +1 -1
  41. package/dist/file-reader-text.adapter.js.map +1 -1
  42. package/dist/file-writer-forgiving.adapter.d.ts.map +1 -1
  43. package/dist/file-writer-forgiving.adapter.js.map +1 -1
  44. package/dist/file-writer.adapter.d.ts.map +1 -1
  45. package/dist/file-writer.adapter.js.map +1 -1
  46. package/dist/graceful-shutdown.service.d.ts.map +1 -1
  47. package/dist/graceful-shutdown.service.js +2 -0
  48. package/dist/graceful-shutdown.service.js.map +1 -1
  49. package/dist/gzip.adapter.d.ts.map +1 -1
  50. package/dist/gzip.adapter.js.map +1 -1
  51. package/dist/healthcheck-hono.handler.d.ts +1 -1
  52. package/dist/image-blur.adapter.d.ts.map +1 -1
  53. package/dist/image-blur.adapter.js.map +1 -1
  54. package/dist/image-compressor.adapter.d.ts.map +1 -1
  55. package/dist/image-compressor.adapter.js.map +1 -1
  56. package/dist/image-exif-clear.adapter.d.ts.map +1 -1
  57. package/dist/image-exif-clear.adapter.js.map +1 -1
  58. package/dist/image-formatter.adapter.d.ts.map +1 -1
  59. package/dist/image-formatter.adapter.js.map +1 -1
  60. package/dist/image-generator-web-view.adapter.d.ts.map +1 -1
  61. package/dist/image-generator-web-view.adapter.js.map +1 -1
  62. package/dist/image-grayscale.adapter.d.ts.map +1 -1
  63. package/dist/image-grayscale.adapter.js.map +1 -1
  64. package/dist/image-info.adapter.d.ts.map +1 -1
  65. package/dist/image-info.adapter.js +1 -0
  66. package/dist/image-info.adapter.js.map +1 -1
  67. package/dist/image-processor.adapter.d.ts.map +1 -1
  68. package/dist/image-processor.adapter.js.map +1 -1
  69. package/dist/image-resizer.adapter.d.ts.map +1 -1
  70. package/dist/image-resizer.adapter.js.map +1 -1
  71. package/dist/index.d.ts +7 -10
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +7 -10
  74. package/dist/index.js.map +1 -1
  75. package/dist/job-claimer-sqlite.adapter.d.ts.map +1 -1
  76. package/dist/job-claimer-sqlite.adapter.js.map +1 -1
  77. package/dist/job-completer-sqlite.adapter.d.ts.map +1 -1
  78. package/dist/job-completer-sqlite.adapter.js.map +1 -1
  79. package/dist/job-enqueuer-sqlite.adapter.d.ts.map +1 -1
  80. package/dist/job-enqueuer-sqlite.adapter.js.map +1 -1
  81. package/dist/job-failer-sqlite.adapter.d.ts.map +1 -1
  82. package/dist/job-failer-sqlite.adapter.js.map +1 -1
  83. package/dist/job-pruner-sqlite.adapter.d.ts.map +1 -1
  84. package/dist/job-pruner-sqlite.adapter.js.map +1 -1
  85. package/dist/job-queue-sqlite-store.service.d.ts.map +1 -1
  86. package/dist/job-queue-sqlite-store.service.js +1 -0
  87. package/dist/job-queue-sqlite-store.service.js.map +1 -1
  88. package/dist/job-queue-stats-provider-sqlite.adapter.d.ts.map +1 -1
  89. package/dist/job-queue-stats-provider-sqlite.adapter.js.map +1 -1
  90. package/dist/job-requeuer-sqlite.adapter.d.ts.map +1 -1
  91. package/dist/job-requeuer-sqlite.adapter.js.map +1 -1
  92. package/dist/logger-noop.adapter.js +1 -1
  93. package/dist/logger-noop.adapter.js.map +1 -1
  94. package/dist/logger-stats-provider-noop.adapter.js +1 -1
  95. package/dist/logger-stats-provider-noop.adapter.js.map +1 -1
  96. package/dist/logger-stats-provider.port.d.ts +1 -1
  97. package/dist/logger-stats-provider.port.d.ts.map +1 -1
  98. package/dist/markdown-generator.adapter.d.ts.map +1 -1
  99. package/dist/markdown-generator.adapter.js.map +1 -1
  100. package/dist/prerequisite-verifier-binary.adapter.d.ts.map +1 -1
  101. package/dist/prerequisite-verifier-binary.adapter.js.map +1 -1
  102. package/dist/prerequisite-verifier-sqlite.adapter.d.ts.map +1 -1
  103. package/dist/prerequisite-verifier-sqlite.adapter.js.map +1 -1
  104. package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
  105. package/dist/remote-file-storage-disk.adapter.js +1 -0
  106. package/dist/remote-file-storage-disk.adapter.js.map +1 -1
  107. package/dist/request-context-hono.adapter.d.ts.map +1 -1
  108. package/dist/request-context-hono.adapter.js +5 -13
  109. package/dist/request-context-hono.adapter.js.map +1 -1
  110. package/dist/sleeper-system.adapter.d.ts.map +1 -1
  111. package/dist/sleeper-system.adapter.js.map +1 -1
  112. package/dist/static-files-hono.service.d.ts.map +1 -1
  113. package/dist/static-files-hono.service.js.map +1 -1
  114. package/dist/webhook-signature-creator-sha256.strategy.d.ts.map +1 -1
  115. package/dist/webhook-signature-creator-sha256.strategy.js +1 -0
  116. package/dist/webhook-signature-creator-sha256.strategy.js.map +1 -1
  117. package/dist/woodchopper-dispatcher-sync.strategy.d.ts.map +1 -1
  118. package/dist/woodchopper-dispatcher-sync.strategy.js +3 -1
  119. package/dist/woodchopper-dispatcher-sync.strategy.js.map +1 -1
  120. package/dist/woodchopper-formatter-human.strategy.d.ts +6 -0
  121. package/dist/woodchopper-formatter-human.strategy.d.ts.map +1 -0
  122. package/dist/woodchopper-formatter-human.strategy.js +6 -0
  123. package/dist/woodchopper-formatter-human.strategy.js.map +1 -0
  124. package/dist/woodchopper-formatter-json-raw.strategy.d.ts +6 -0
  125. package/dist/woodchopper-formatter-json-raw.strategy.d.ts.map +1 -0
  126. package/dist/woodchopper-formatter-json-raw.strategy.js +6 -0
  127. package/dist/woodchopper-formatter-json-raw.strategy.js.map +1 -0
  128. package/dist/woodchopper-formatter-json.strategy.d.ts +6 -0
  129. package/dist/woodchopper-formatter-json.strategy.d.ts.map +1 -0
  130. package/dist/woodchopper-formatter-json.strategy.js +6 -0
  131. package/dist/woodchopper-formatter-json.strategy.js.map +1 -0
  132. package/dist/woodchopper-formatter.strategy.d.ts +5 -0
  133. package/dist/woodchopper-formatter.strategy.d.ts.map +1 -0
  134. package/dist/woodchopper-formatter.strategy.js +2 -0
  135. package/dist/woodchopper-formatter.strategy.js.map +1 -0
  136. package/dist/woodchopper-sink-buffered-stderr.strategy.d.ts +5 -0
  137. package/dist/woodchopper-sink-buffered-stderr.strategy.d.ts.map +1 -0
  138. package/dist/woodchopper-sink-buffered-stderr.strategy.js +7 -0
  139. package/dist/woodchopper-sink-buffered-stderr.strategy.js.map +1 -0
  140. package/dist/woodchopper-sink-buffered-stdout.strategy.d.ts +5 -0
  141. package/dist/woodchopper-sink-buffered-stdout.strategy.d.ts.map +1 -0
  142. package/dist/woodchopper-sink-buffered-stdout.strategy.js +7 -0
  143. package/dist/woodchopper-sink-buffered-stdout.strategy.js.map +1 -0
  144. package/dist/woodchopper-sink-buffered.strategy.d.ts +26 -0
  145. package/dist/woodchopper-sink-buffered.strategy.d.ts.map +1 -0
  146. package/dist/woodchopper-sink-buffered.strategy.js +48 -0
  147. package/dist/woodchopper-sink-buffered.strategy.js.map +1 -0
  148. package/dist/woodchopper-sink-collecting.strategy.d.ts +1 -0
  149. package/dist/woodchopper-sink-collecting.strategy.d.ts.map +1 -1
  150. package/dist/woodchopper-sink-collecting.strategy.js +1 -0
  151. package/dist/woodchopper-sink-collecting.strategy.js.map +1 -1
  152. package/dist/woodchopper-sink-noop.strategy.d.ts +1 -0
  153. package/dist/woodchopper-sink-noop.strategy.d.ts.map +1 -1
  154. package/dist/woodchopper-sink-noop.strategy.js +1 -0
  155. package/dist/woodchopper-sink-noop.strategy.js.map +1 -1
  156. package/dist/woodchopper-sink-stderr.strategy.d.ts +4 -0
  157. package/dist/woodchopper-sink-stderr.strategy.d.ts.map +1 -1
  158. package/dist/woodchopper-sink-stderr.strategy.js +6 -1
  159. package/dist/woodchopper-sink-stderr.strategy.js.map +1 -1
  160. package/dist/woodchopper-sink-stdout.strategy.d.ts +4 -0
  161. package/dist/woodchopper-sink-stdout.strategy.d.ts.map +1 -1
  162. package/dist/woodchopper-sink-stdout.strategy.js +6 -1
  163. package/dist/woodchopper-sink-stdout.strategy.js.map +1 -1
  164. package/dist/woodchopper-sink.strategy.d.ts +1 -0
  165. package/dist/woodchopper-sink.strategy.d.ts.map +1 -1
  166. package/dist/woodchopper-stats.service.d.ts +3 -3
  167. package/dist/woodchopper-stats.service.d.ts.map +1 -1
  168. package/dist/woodchopper-stats.service.js +4 -4
  169. package/dist/woodchopper-stats.service.js.map +1 -1
  170. package/dist/woodchopper.d.ts.map +1 -1
  171. package/dist/woodchopper.js +3 -3
  172. package/dist/woodchopper.js.map +1 -1
  173. package/package.json +1 -1
  174. package/readme.md +7 -4
  175. package/src/antivirus-clamav.adapter.ts +1 -0
  176. package/src/better-auth-logger.service.ts +14 -31
  177. package/src/cache-repository-redis.adapter.ts +1 -0
  178. package/src/clock-system.adapter.ts +2 -1
  179. package/src/cron-expression.vo.ts +1 -0
  180. package/src/cron-scheduler.adapter.ts +1 -0
  181. package/src/file-cleaner-forgiving.adapter.ts +1 -0
  182. package/src/file-cleaner.adapter.ts +1 -0
  183. package/src/file-copier.adapter.ts +1 -0
  184. package/src/file-draft-zip.service.ts +1 -2
  185. package/src/file-inspection.adapter.ts +1 -0
  186. package/src/file-reader-json-forgiving.adapter.ts +1 -0
  187. package/src/file-reader-json.adapter.ts +1 -0
  188. package/src/file-reader-raw-forgiving.adapter.ts +1 -0
  189. package/src/file-reader-raw.adapter.ts +1 -0
  190. package/src/file-reader-text-forgiving.adapter.ts +1 -0
  191. package/src/file-reader-text.adapter.ts +1 -0
  192. package/src/file-writer-forgiving.adapter.ts +1 -0
  193. package/src/file-writer.adapter.ts +1 -0
  194. package/src/graceful-shutdown.service.ts +3 -0
  195. package/src/gzip.adapter.ts +1 -0
  196. package/src/image-blur.adapter.ts +1 -0
  197. package/src/image-compressor.adapter.ts +1 -0
  198. package/src/image-exif-clear.adapter.ts +1 -0
  199. package/src/image-formatter.adapter.ts +1 -0
  200. package/src/image-generator-web-view.adapter.ts +1 -0
  201. package/src/image-grayscale.adapter.ts +1 -0
  202. package/src/image-info.adapter.ts +1 -0
  203. package/src/image-processor.adapter.ts +1 -0
  204. package/src/image-resizer.adapter.ts +1 -0
  205. package/src/index.ts +7 -10
  206. package/src/job-claimer-sqlite.adapter.ts +1 -0
  207. package/src/job-completer-sqlite.adapter.ts +1 -0
  208. package/src/job-enqueuer-sqlite.adapter.ts +1 -0
  209. package/src/job-failer-sqlite.adapter.ts +1 -0
  210. package/src/job-pruner-sqlite.adapter.ts +1 -0
  211. package/src/job-queue-sqlite-store.service.ts +1 -0
  212. package/src/job-queue-stats-provider-sqlite.adapter.ts +1 -0
  213. package/src/job-requeuer-sqlite.adapter.ts +1 -0
  214. package/src/logger-noop.adapter.ts +1 -1
  215. package/src/logger-stats-provider-noop.adapter.ts +1 -1
  216. package/src/logger-stats-provider.port.ts +1 -1
  217. package/src/markdown-generator.adapter.ts +1 -0
  218. package/src/prerequisite-verifier-binary.adapter.ts +1 -0
  219. package/src/prerequisite-verifier-sqlite.adapter.ts +1 -0
  220. package/src/remote-file-storage-disk.adapter.ts +1 -0
  221. package/src/request-context-hono.adapter.ts +5 -18
  222. package/src/sleeper-system.adapter.ts +1 -0
  223. package/src/static-files-hono.service.ts +1 -0
  224. package/src/webhook-signature-creator-sha256.strategy.ts +1 -0
  225. package/src/woodchopper-dispatcher-sync.strategy.ts +3 -1
  226. package/src/woodchopper-formatter-human.strategy.ts +8 -0
  227. package/src/woodchopper-formatter-json-raw.strategy.ts +8 -0
  228. package/src/woodchopper-formatter-json.strategy.ts +8 -0
  229. package/src/woodchopper-formatter.strategy.ts +5 -0
  230. package/src/woodchopper-sink-buffered-stderr.strategy.ts +7 -0
  231. package/src/woodchopper-sink-buffered-stdout.strategy.ts +7 -0
  232. package/src/woodchopper-sink-buffered.strategy.ts +57 -0
  233. package/src/woodchopper-sink-collecting.strategy.ts +2 -0
  234. package/src/woodchopper-sink-noop.strategy.ts +2 -0
  235. package/src/woodchopper-sink-stderr.strategy.ts +6 -1
  236. package/src/woodchopper-sink-stdout.strategy.ts +6 -1
  237. package/src/woodchopper-sink.strategy.ts +2 -0
  238. package/src/woodchopper-stats.service.ts +4 -4
  239. package/src/woodchopper.ts +3 -4
  240. package/dist/woodchopper-dispatcher-async.strategy.d.ts +0 -19
  241. package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +0 -1
  242. package/dist/woodchopper-dispatcher-async.strategy.js +0 -71
  243. package/dist/woodchopper-dispatcher-async.strategy.js.map +0 -1
  244. package/dist/woodchopper-sink-stderr-raw.strategy.d.ts +0 -6
  245. package/dist/woodchopper-sink-stderr-raw.strategy.d.ts.map +0 -1
  246. package/dist/woodchopper-sink-stderr-raw.strategy.js +0 -6
  247. package/dist/woodchopper-sink-stderr-raw.strategy.js.map +0 -1
  248. package/dist/woodchopper-sink-stdout-human.strategy.d.ts +0 -6
  249. package/dist/woodchopper-sink-stdout-human.strategy.d.ts.map +0 -1
  250. package/dist/woodchopper-sink-stdout-human.strategy.js +0 -6
  251. package/dist/woodchopper-sink-stdout-human.strategy.js.map +0 -1
  252. package/dist/woodchopper-sink-stdout-raw.strategy.d.ts +0 -6
  253. package/dist/woodchopper-sink-stdout-raw.strategy.d.ts.map +0 -1
  254. package/dist/woodchopper-sink-stdout-raw.strategy.js +0 -6
  255. package/dist/woodchopper-sink-stdout-raw.strategy.js.map +0 -1
  256. package/src/woodchopper-dispatcher-async.strategy.ts +0 -86
  257. package/src/woodchopper-sink-stderr-raw.strategy.ts +0 -8
  258. package/src/woodchopper-sink-stdout-human.strategy.ts +0 -8
  259. package/src/woodchopper-sink-stdout-raw.strategy.ts +0 -8
@@ -0,0 +1,57 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { LoggerEntry } from "./logger.port";
3
+ import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
4
+ import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
5
+
6
+ /**
7
+ * Batches formatted entries into a single write, which amortizes the syscall - the dominant
8
+ * cost of writing logs out.
9
+ *
10
+ * Nothing is ever held past the current event loop turn, so a burst of logs costs one write
11
+ * while a lone log still reaches its destination immediately. The cap bounds memory when a
12
+ * synchronous loop never yields.
13
+ *
14
+ * Subclasses supply the destination and nothing else.
15
+ */
16
+ export abstract class WoodchopperSinkBuffered implements WoodchopperSinkStrategy {
17
+ private readonly buffer: Array<string> = [];
18
+ private scheduled?: ReturnType<typeof setImmediate>;
19
+
20
+ constructor(
21
+ private readonly formatter: WoodchopperFormatterStrategy,
22
+ private readonly cap: tools.IntegerPositiveType = tools.Int.positive(256),
23
+ ) {}
24
+
25
+ protected abstract emit(payload: string): void;
26
+
27
+ write(entry: LoggerEntry): void {
28
+ this.buffer.push(this.formatter.format(entry));
29
+
30
+ if (this.buffer.length >= this.cap) {
31
+ this.flush();
32
+ return;
33
+ }
34
+ if (this.scheduled) return;
35
+
36
+ this.scheduled = setImmediate(() => {
37
+ this.scheduled = undefined;
38
+ this.flush();
39
+ });
40
+ }
41
+
42
+ close(): void {
43
+ if (this.scheduled) clearImmediate(this.scheduled);
44
+ this.scheduled = undefined;
45
+
46
+ this.flush();
47
+ }
48
+
49
+ private flush(): void {
50
+ if (this.buffer.length === 0) return;
51
+
52
+ const payload = this.buffer.join("");
53
+ this.buffer.length = 0;
54
+
55
+ this.emit(payload);
56
+ }
57
+ }
@@ -7,4 +7,6 @@ export class WoodchopperSinkCollecting implements WoodchopperSinkStrategy {
7
7
  write(entry: LoggerEntry): void {
8
8
  this.entries.push(entry);
9
9
  }
10
+
11
+ close(): void {}
10
12
  }
@@ -3,4 +3,6 @@ import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
3
 
4
4
  export class WoodchopperSinkNoop implements WoodchopperSinkStrategy {
5
5
  write(_entry: LoggerEntry): void {}
6
+
7
+ close(): void {}
6
8
  }
@@ -1,8 +1,13 @@
1
1
  import type { LoggerEntry } from "./logger.port";
2
+ import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
2
3
  import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
4
 
4
5
  export class WoodchopperSinkStderr implements WoodchopperSinkStrategy {
6
+ constructor(private readonly formatter: WoodchopperFormatterStrategy) {}
7
+
5
8
  write(entry: LoggerEntry): void {
6
- process.stderr.write(`${JSON.stringify(entry)}\n`);
9
+ process.stderr.write(this.formatter.format(entry));
7
10
  }
11
+
12
+ close(): void {}
8
13
  }
@@ -1,8 +1,13 @@
1
1
  import type { LoggerEntry } from "./logger.port";
2
+ import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
2
3
  import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
4
 
4
5
  export class WoodchopperSinkStdout implements WoodchopperSinkStrategy {
6
+ constructor(private readonly formatter: WoodchopperFormatterStrategy) {}
7
+
5
8
  write(entry: LoggerEntry): void {
6
- process.stdout.write(`${JSON.stringify(entry)}\n`);
9
+ process.stdout.write(this.formatter.format(entry));
7
10
  }
11
+
12
+ close(): void {}
8
13
  }
@@ -2,4 +2,6 @@ import type { LoggerEntry } from "./logger.port";
2
2
 
3
3
  export interface WoodchopperSinkStrategy {
4
4
  write(entry: LoggerEntry): void;
5
+
6
+ close(): void;
5
7
  }
@@ -1,10 +1,10 @@
1
1
  export class WoodchopperStats {
2
- private written = 0;
2
+ private accepted = 0;
3
3
  private dropped = 0;
4
4
  private deliveryFailures = 0;
5
5
 
6
- recordWritten(): void {
7
- this.written++;
6
+ recordAccepted(): void {
7
+ this.accepted++;
8
8
  }
9
9
 
10
10
  recordDropped(): void {
@@ -16,6 +16,6 @@ export class WoodchopperStats {
16
16
  }
17
17
 
18
18
  get snapshot() {
19
- return { written: this.written, dropped: this.dropped, deliveryFailures: this.deliveryFailures };
19
+ return { accepted: this.accepted, dropped: this.dropped, deliveryFailures: this.deliveryFailures };
20
20
  }
21
21
  }
@@ -73,7 +73,8 @@ export class Woodchopper implements LoggerPort, LoggerStatsProviderPort {
73
73
  let withInjectedFields: LoggerEntry;
74
74
  try {
75
75
  withInjectedFields = {
76
- timestamp: this.deps.Clock.now().toInstant().toString(),
76
+ // biome-ignore lint: lint/style/noRestrictedGlobals
77
+ timestamp: new Date(this.deps.Clock.now().ms).toISOString(),
77
78
  level,
78
79
  app: this.config.app,
79
80
  environment: this.config.environment,
@@ -96,9 +97,7 @@ export class Woodchopper implements LoggerPort, LoggerStatsProviderPort {
96
97
  return;
97
98
  }
98
99
 
99
- const final = Object.freeze(withRedaction);
100
-
101
- this.config.dispatcher.dispatch(final) ? this.stats.recordWritten() : this.stats.recordDropped();
100
+ this.config.dispatcher.dispatch(withRedaction) ? this.stats.recordAccepted() : this.stats.recordDropped();
102
101
  }
103
102
 
104
103
  error: LoggerPort["error"] = (entry) => this.log(LogLevelEnum.error, entry);
@@ -1,19 +0,0 @@
1
- import * as tools from "@bgord/tools";
2
- import type { LoggerEntry } from "./logger.port";
3
- import type { WoodchopperDispatcher } from "./woodchopper-dispatcher.strategy";
4
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
5
- export declare class WoodchopperDispatcherAsync implements WoodchopperDispatcher {
6
- private readonly sink;
7
- private readonly capacity;
8
- onError?: (error: unknown) => void;
9
- private readonly buffer;
10
- private state;
11
- private wake?;
12
- constructor(sink: WoodchopperSinkStrategy, capacity?: tools.IntegerPositiveType);
13
- dispatch(entry: LoggerEntry): boolean;
14
- close(): void;
15
- private run;
16
- private wakeConsumer;
17
- private waitForEntry;
18
- }
19
- //# sourceMappingURL=woodchopper-dispatcher-async.strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-dispatcher-async.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-dispatcher-async.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAO3E,qBAAa,0BAA2B,YAAW,qBAAqB;IASpE,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,KAAK,CAA2C;IAExD,OAAO,CAAC,IAAI,CAAC,CAAa;IAE1B,YACmB,IAAI,EAAE,uBAAuB,EAC7B,QAAQ,GAAE,KAAK,CAAC,mBAA6C,EAG/E;IAED,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CASpC;IAED,KAAK,IAAI,IAAI,CAmBZ;YAEa,GAAG;IAkBjB,OAAO,CAAC,YAAY;YAKN,YAAY;CAK3B"}
@@ -1,71 +0,0 @@
1
- import * as tools from "@bgord/tools";
2
- var WoodchopperDispatcherAsyncState;
3
- (function (WoodchopperDispatcherAsyncState) {
4
- WoodchopperDispatcherAsyncState["running"] = "running";
5
- WoodchopperDispatcherAsyncState["closed"] = "closed";
6
- })(WoodchopperDispatcherAsyncState || (WoodchopperDispatcherAsyncState = {}));
7
- export class WoodchopperDispatcherAsync {
8
- sink;
9
- capacity;
10
- onError;
11
- buffer = [];
12
- state = WoodchopperDispatcherAsyncState.running;
13
- wake;
14
- constructor(sink, capacity = tools.Int.positive(256)) {
15
- this.sink = sink;
16
- this.capacity = capacity;
17
- this.run();
18
- }
19
- dispatch(entry) {
20
- if (this.state === WoodchopperDispatcherAsyncState.closed)
21
- return false;
22
- if (this.buffer.length >= this.capacity)
23
- return false;
24
- this.buffer.push(entry);
25
- this.wakeConsumer();
26
- return true;
27
- }
28
- close() {
29
- // Stryker disable all
30
- if (this.state === WoodchopperDispatcherAsyncState.closed)
31
- return;
32
- // Stryker restore all
33
- this.state = WoodchopperDispatcherAsyncState.closed;
34
- for (const entry of this.buffer) {
35
- try {
36
- this.sink.write(entry);
37
- }
38
- catch (error) {
39
- this.onError?.(error);
40
- }
41
- }
42
- this.buffer.length = 0;
43
- // wake so the loop can exit immediately
44
- this.wakeConsumer();
45
- }
46
- async run() {
47
- while (this.state === WoodchopperDispatcherAsyncState.running) {
48
- if (this.buffer.length === 0) {
49
- await this.waitForEntry();
50
- continue;
51
- }
52
- const entry = this.buffer.shift();
53
- try {
54
- this.sink.write(entry);
55
- }
56
- catch (error) {
57
- this.onError?.(error);
58
- }
59
- }
60
- }
61
- wakeConsumer() {
62
- this.wake?.();
63
- this.wake = undefined;
64
- }
65
- async waitForEntry() {
66
- await new Promise((resolve) => {
67
- this.wake = resolve;
68
- });
69
- }
70
- }
71
- //# sourceMappingURL=woodchopper-dispatcher-async.strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-dispatcher-async.strategy.js","sourceRoot":"","sources":["../src/woodchopper-dispatcher-async.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,IAAK,+BAGJ;AAHD,WAAK,+BAA+B;IAClC,sDAAmB,CAAA;IACnB,oDAAiB,CAAA;AACnB,CAAC,EAHI,+BAA+B,KAA/B,+BAA+B,QAGnC;AAED,MAAM,OAAO,0BAA0B;IASlB,IAAI;IACJ,QAAQ;IAT3B,OAAO,CAA4B;IAElB,MAAM,GAAuB,EAAE,CAAC;IACzC,KAAK,GAAG,+BAA+B,CAAC,OAAO,CAAC;IAEhD,IAAI,CAAc;IAE1B,YACmB,IAA6B,EAC7B,QAAQ,GAA8B,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAD7D,IAAI;wBACJ,QAAQ;QAEzB,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,KAAkB;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,+BAA+B,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEtD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,sBAAsB;QACtB,IAAI,IAAI,CAAC,KAAK,KAAK,+BAA+B,CAAC,MAAM;YAAE,OAAO;QAClE,sBAAsB;QAEtB,IAAI,CAAC,KAAK,GAAG,+BAA+B,CAAC,MAAM,CAAC;QAEpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAEvB,wCAAwC;QACxC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,GAAG;QACf,OAAO,IAAI,CAAC,KAAK,KAAK,+BAA+B,CAAC,OAAO,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAE1B,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAoB,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,6 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
- export declare class WoodchopperSinkStderrRaw implements WoodchopperSinkStrategy {
4
- write(entry: LoggerEntry): void;
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stderr-raw.strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stderr-raw.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-sink-stderr-raw.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,qBAAa,wBAAyB,YAAW,uBAAuB;IACtE,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAE9B;CACF"}
@@ -1,6 +0,0 @@
1
- export class WoodchopperSinkStderrRaw {
2
- write(entry) {
3
- process.stderr.write(JSON.stringify(entry));
4
- }
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stderr-raw.strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stderr-raw.strategy.js","sourceRoot":"","sources":["../src/woodchopper-sink-stderr-raw.strategy.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,KAAkB;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,6 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
- export declare class WoodchopperSinkStdoutHuman implements WoodchopperSinkStrategy {
4
- write(entry: LoggerEntry): void;
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stdout-human.strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stdout-human.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-sink-stdout-human.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,qBAAa,0BAA2B,YAAW,uBAAuB;IACxE,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAE9B;CACF"}
@@ -1,6 +0,0 @@
1
- export class WoodchopperSinkStdoutHuman {
2
- write(entry) {
3
- process.stdout.write(`${JSON.stringify(entry, null, 2)}\n`);
4
- }
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stdout-human.strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stdout-human.strategy.js","sourceRoot":"","sources":["../src/woodchopper-sink-stdout-human.strategy.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,0BAA0B;IACrC,KAAK,CAAC,KAAkB;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;CACF"}
@@ -1,6 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
- export declare class WoodchopperSinkStdoutRaw implements WoodchopperSinkStrategy {
4
- write(entry: LoggerEntry): void;
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stdout-raw.strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stdout-raw.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-sink-stdout-raw.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,qBAAa,wBAAyB,YAAW,uBAAuB;IACtE,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAE9B;CACF"}
@@ -1,6 +0,0 @@
1
- export class WoodchopperSinkStdoutRaw {
2
- write(entry) {
3
- process.stdout.write(JSON.stringify(entry));
4
- }
5
- }
6
- //# sourceMappingURL=woodchopper-sink-stdout-raw.strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"woodchopper-sink-stdout-raw.strategy.js","sourceRoot":"","sources":["../src/woodchopper-sink-stdout-raw.strategy.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,KAAkB;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,86 +0,0 @@
1
- import * as tools from "@bgord/tools";
2
- import type { LoggerEntry } from "./logger.port";
3
- import type { WoodchopperDispatcher } from "./woodchopper-dispatcher.strategy";
4
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
5
-
6
- enum WoodchopperDispatcherAsyncState {
7
- running = "running",
8
- closed = "closed",
9
- }
10
-
11
- export class WoodchopperDispatcherAsync implements WoodchopperDispatcher {
12
- onError?: (error: unknown) => void;
13
-
14
- private readonly buffer: Array<LoggerEntry> = [];
15
- private state = WoodchopperDispatcherAsyncState.running;
16
-
17
- private wake?: () => void;
18
-
19
- constructor(
20
- private readonly sink: WoodchopperSinkStrategy,
21
- private readonly capacity: tools.IntegerPositiveType = tools.Int.positive(256),
22
- ) {
23
- this.run();
24
- }
25
-
26
- dispatch(entry: LoggerEntry): boolean {
27
- if (this.state === WoodchopperDispatcherAsyncState.closed) return false;
28
- if (this.buffer.length >= this.capacity) return false;
29
-
30
- this.buffer.push(entry);
31
-
32
- this.wakeConsumer();
33
-
34
- return true;
35
- }
36
-
37
- close(): void {
38
- // Stryker disable all
39
- if (this.state === WoodchopperDispatcherAsyncState.closed) return;
40
- // Stryker restore all
41
-
42
- this.state = WoodchopperDispatcherAsyncState.closed;
43
-
44
- for (const entry of this.buffer) {
45
- try {
46
- this.sink.write(entry);
47
- } catch (error) {
48
- this.onError?.(error);
49
- }
50
- }
51
-
52
- this.buffer.length = 0;
53
-
54
- // wake so the loop can exit immediately
55
- this.wakeConsumer();
56
- }
57
-
58
- private async run(): Promise<void> {
59
- while (this.state === WoodchopperDispatcherAsyncState.running) {
60
- if (this.buffer.length === 0) {
61
- await this.waitForEntry();
62
-
63
- continue;
64
- }
65
-
66
- const entry = this.buffer.shift();
67
-
68
- try {
69
- this.sink.write(entry as LoggerEntry);
70
- } catch (error) {
71
- this.onError?.(error);
72
- }
73
- }
74
- }
75
-
76
- private wakeConsumer() {
77
- this.wake?.();
78
- this.wake = undefined;
79
- }
80
-
81
- private async waitForEntry() {
82
- await new Promise<void>((resolve) => {
83
- this.wake = resolve;
84
- });
85
- }
86
- }
@@ -1,8 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
-
4
- export class WoodchopperSinkStderrRaw implements WoodchopperSinkStrategy {
5
- write(entry: LoggerEntry): void {
6
- process.stderr.write(JSON.stringify(entry));
7
- }
8
- }
@@ -1,8 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
-
4
- export class WoodchopperSinkStdoutHuman implements WoodchopperSinkStrategy {
5
- write(entry: LoggerEntry): void {
6
- process.stdout.write(`${JSON.stringify(entry, null, 2)}\n`);
7
- }
8
- }
@@ -1,8 +0,0 @@
1
- import type { LoggerEntry } from "./logger.port";
2
- import type { WoodchopperSinkStrategy } from "./woodchopper-sink.strategy";
3
-
4
- export class WoodchopperSinkStdoutRaw implements WoodchopperSinkStrategy {
5
- write(entry: LoggerEntry): void {
6
- process.stdout.write(JSON.stringify(entry));
7
- }
8
- }