@bgord/bun 1.21.1 → 1.21.3
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.
- package/dist/antivirus-clamav.adapter.d.ts.map +1 -1
- package/dist/antivirus-clamav.adapter.js +1 -0
- package/dist/antivirus-clamav.adapter.js.map +1 -1
- package/dist/better-auth-logger.service.d.ts +2 -3
- package/dist/better-auth-logger.service.d.ts.map +1 -1
- package/dist/better-auth-logger.service.js +16 -33
- package/dist/better-auth-logger.service.js.map +1 -1
- package/dist/build-info.vo.d.ts +2 -2
- package/dist/cache-repository-redis.adapter.d.ts.map +1 -1
- package/dist/cache-repository-redis.adapter.js.map +1 -1
- package/dist/clock-system.adapter.d.ts.map +1 -1
- package/dist/clock-system.adapter.js +2 -1
- package/dist/clock-system.adapter.js.map +1 -1
- package/dist/command-envelope.d.ts +1 -1
- package/dist/cron-expression.vo.d.ts.map +1 -1
- package/dist/cron-expression.vo.js +1 -0
- package/dist/cron-expression.vo.js.map +1 -1
- package/dist/cron-scheduler.adapter.d.ts.map +1 -1
- package/dist/cron-scheduler.adapter.js.map +1 -1
- package/dist/event-envelope.d.ts +1 -1
- package/dist/file-cleaner-forgiving.adapter.d.ts.map +1 -1
- package/dist/file-cleaner-forgiving.adapter.js.map +1 -1
- package/dist/file-cleaner.adapter.d.ts.map +1 -1
- package/dist/file-cleaner.adapter.js.map +1 -1
- package/dist/file-copier.adapter.d.ts.map +1 -1
- package/dist/file-copier.adapter.js.map +1 -1
- package/dist/file-draft-zip.service.d.ts.map +1 -1
- package/dist/file-draft-zip.service.js +1 -2
- package/dist/file-draft-zip.service.js.map +1 -1
- package/dist/file-inspection.adapter.d.ts.map +1 -1
- package/dist/file-inspection.adapter.js +1 -0
- package/dist/file-inspection.adapter.js.map +1 -1
- package/dist/file-reader-json-forgiving.adapter.d.ts.map +1 -1
- package/dist/file-reader-json-forgiving.adapter.js.map +1 -1
- package/dist/file-reader-json.adapter.d.ts.map +1 -1
- package/dist/file-reader-json.adapter.js.map +1 -1
- package/dist/file-reader-raw-forgiving.adapter.d.ts.map +1 -1
- package/dist/file-reader-raw-forgiving.adapter.js.map +1 -1
- package/dist/file-reader-raw.adapter.d.ts.map +1 -1
- package/dist/file-reader-raw.adapter.js.map +1 -1
- package/dist/file-reader-text-forgiving.adapter.d.ts.map +1 -1
- package/dist/file-reader-text-forgiving.adapter.js.map +1 -1
- package/dist/file-reader-text.adapter.d.ts.map +1 -1
- package/dist/file-reader-text.adapter.js.map +1 -1
- package/dist/file-writer-forgiving.adapter.d.ts.map +1 -1
- package/dist/file-writer-forgiving.adapter.js.map +1 -1
- package/dist/file-writer.adapter.d.ts.map +1 -1
- package/dist/file-writer.adapter.js.map +1 -1
- package/dist/graceful-shutdown.service.d.ts.map +1 -1
- package/dist/graceful-shutdown.service.js +2 -0
- package/dist/graceful-shutdown.service.js.map +1 -1
- package/dist/gzip.adapter.d.ts.map +1 -1
- package/dist/gzip.adapter.js.map +1 -1
- package/dist/healthcheck-hono.handler.d.ts +1 -1
- package/dist/healthcheck.handler.js +1 -1
- package/dist/healthcheck.handler.js.map +1 -1
- package/dist/image-blur.adapter.d.ts.map +1 -1
- package/dist/image-blur.adapter.js.map +1 -1
- package/dist/image-compressor.adapter.d.ts.map +1 -1
- package/dist/image-compressor.adapter.js.map +1 -1
- package/dist/image-exif-clear.adapter.d.ts.map +1 -1
- package/dist/image-exif-clear.adapter.js.map +1 -1
- package/dist/image-formatter.adapter.d.ts.map +1 -1
- package/dist/image-formatter.adapter.js.map +1 -1
- package/dist/image-generator-web-view.adapter.d.ts.map +1 -1
- package/dist/image-generator-web-view.adapter.js.map +1 -1
- package/dist/image-grayscale.adapter.d.ts.map +1 -1
- package/dist/image-grayscale.adapter.js.map +1 -1
- package/dist/image-info.adapter.d.ts.map +1 -1
- package/dist/image-info.adapter.js +1 -0
- package/dist/image-info.adapter.js.map +1 -1
- package/dist/image-processor.adapter.d.ts.map +1 -1
- package/dist/image-processor.adapter.js.map +1 -1
- package/dist/image-resizer.adapter.d.ts.map +1 -1
- package/dist/image-resizer.adapter.js.map +1 -1
- package/dist/index.d.ts +7 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -10
- package/dist/index.js.map +1 -1
- package/dist/job-claimer-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-claimer-sqlite.adapter.js.map +1 -1
- package/dist/job-completer-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-completer-sqlite.adapter.js.map +1 -1
- package/dist/job-enqueuer-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-enqueuer-sqlite.adapter.js.map +1 -1
- package/dist/job-envelope.d.ts +1 -1
- package/dist/job-failer-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-failer-sqlite.adapter.js.map +1 -1
- package/dist/job-pruner-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-pruner-sqlite.adapter.js.map +1 -1
- package/dist/job-queue-sqlite-store.service.d.ts.map +1 -1
- package/dist/job-queue-sqlite-store.service.js +1 -0
- package/dist/job-queue-sqlite-store.service.js.map +1 -1
- package/dist/job-queue-stats-provider-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-queue-stats-provider-sqlite.adapter.js.map +1 -1
- package/dist/job-requeuer-sqlite.adapter.d.ts.map +1 -1
- package/dist/job-requeuer-sqlite.adapter.js.map +1 -1
- package/dist/logger-noop.adapter.js +1 -1
- package/dist/logger-noop.adapter.js.map +1 -1
- package/dist/logger-stats-provider-noop.adapter.js +1 -1
- package/dist/logger-stats-provider-noop.adapter.js.map +1 -1
- package/dist/logger-stats-provider.port.d.ts +1 -1
- package/dist/logger-stats-provider.port.d.ts.map +1 -1
- package/dist/markdown-generator.adapter.d.ts.map +1 -1
- package/dist/markdown-generator.adapter.js.map +1 -1
- package/dist/modules/history/events/HISTORY_CLEARED_EVENT.d.ts +1 -1
- package/dist/modules/history/events/HISTORY_POPULATED_EVENT.d.ts +1 -1
- package/dist/modules/history/value-objects/history-created-at.d.ts +1 -1
- package/dist/modules/history/value-objects/history-created-at.d.ts.map +1 -1
- package/dist/modules/history/value-objects/history.d.ts +2 -2
- package/dist/modules/preferences/commands/SET_USER_LANGUAGE_COMMAND.d.ts +1 -1
- package/dist/modules/preferences/events/USER_LANGUAGE_SET_EVENT.d.ts +1 -1
- package/dist/modules/system/events/HOUR_HAS_PASSED_EVENT.d.ts +2 -2
- package/dist/modules/system/events/MINUTE_HAS_PASSED_EVENT.d.ts +2 -2
- package/dist/modules/system/events/SECURITY_VIOLATION_DETECTED_EVENT.d.ts +1 -1
- package/dist/modules/system/jobs/SEND_EMAIL_JOB.d.ts +3 -3
- package/dist/prerequisite-verifier-binary.adapter.d.ts.map +1 -1
- package/dist/prerequisite-verifier-binary.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-sqlite.adapter.d.ts.map +1 -1
- package/dist/prerequisite-verifier-sqlite.adapter.js.map +1 -1
- package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
- package/dist/remote-file-storage-disk.adapter.js +1 -0
- package/dist/remote-file-storage-disk.adapter.js.map +1 -1
- package/dist/request-context-hono.adapter.d.ts.map +1 -1
- package/dist/request-context-hono.adapter.js +5 -13
- package/dist/request-context-hono.adapter.js.map +1 -1
- package/dist/sleeper-system.adapter.d.ts.map +1 -1
- package/dist/sleeper-system.adapter.js.map +1 -1
- package/dist/static-files-hono.service.d.ts.map +1 -1
- package/dist/static-files-hono.service.js.map +1 -1
- package/dist/webhook-signature-creator-sha256.strategy.d.ts.map +1 -1
- package/dist/webhook-signature-creator-sha256.strategy.js +1 -0
- package/dist/webhook-signature-creator-sha256.strategy.js.map +1 -1
- package/dist/woodchopper-dispatcher-sync.strategy.d.ts.map +1 -1
- package/dist/woodchopper-dispatcher-sync.strategy.js +3 -1
- package/dist/woodchopper-dispatcher-sync.strategy.js.map +1 -1
- package/dist/woodchopper-formatter-human.strategy.d.ts +6 -0
- package/dist/woodchopper-formatter-human.strategy.d.ts.map +1 -0
- package/dist/woodchopper-formatter-human.strategy.js +6 -0
- package/dist/woodchopper-formatter-human.strategy.js.map +1 -0
- package/dist/woodchopper-formatter-json-raw.strategy.d.ts +6 -0
- package/dist/woodchopper-formatter-json-raw.strategy.d.ts.map +1 -0
- package/dist/woodchopper-formatter-json-raw.strategy.js +6 -0
- package/dist/woodchopper-formatter-json-raw.strategy.js.map +1 -0
- package/dist/woodchopper-formatter-json.strategy.d.ts +6 -0
- package/dist/woodchopper-formatter-json.strategy.d.ts.map +1 -0
- package/dist/woodchopper-formatter-json.strategy.js +6 -0
- package/dist/woodchopper-formatter-json.strategy.js.map +1 -0
- package/dist/woodchopper-formatter.strategy.d.ts +5 -0
- package/dist/woodchopper-formatter.strategy.d.ts.map +1 -0
- package/dist/woodchopper-formatter.strategy.js +2 -0
- package/dist/woodchopper-formatter.strategy.js.map +1 -0
- package/dist/woodchopper-sink-buffered-stderr.strategy.d.ts +5 -0
- package/dist/woodchopper-sink-buffered-stderr.strategy.d.ts.map +1 -0
- package/dist/woodchopper-sink-buffered-stderr.strategy.js +7 -0
- package/dist/woodchopper-sink-buffered-stderr.strategy.js.map +1 -0
- package/dist/woodchopper-sink-buffered-stdout.strategy.d.ts +5 -0
- package/dist/woodchopper-sink-buffered-stdout.strategy.d.ts.map +1 -0
- package/dist/woodchopper-sink-buffered-stdout.strategy.js +7 -0
- package/dist/woodchopper-sink-buffered-stdout.strategy.js.map +1 -0
- package/dist/woodchopper-sink-buffered.strategy.d.ts +26 -0
- package/dist/woodchopper-sink-buffered.strategy.d.ts.map +1 -0
- package/dist/woodchopper-sink-buffered.strategy.js +48 -0
- package/dist/woodchopper-sink-buffered.strategy.js.map +1 -0
- package/dist/woodchopper-sink-collecting.strategy.d.ts +1 -0
- package/dist/woodchopper-sink-collecting.strategy.d.ts.map +1 -1
- package/dist/woodchopper-sink-collecting.strategy.js +1 -0
- package/dist/woodchopper-sink-collecting.strategy.js.map +1 -1
- package/dist/woodchopper-sink-noop.strategy.d.ts +1 -0
- package/dist/woodchopper-sink-noop.strategy.d.ts.map +1 -1
- package/dist/woodchopper-sink-noop.strategy.js +1 -0
- package/dist/woodchopper-sink-noop.strategy.js.map +1 -1
- package/dist/woodchopper-sink-stderr.strategy.d.ts +4 -0
- package/dist/woodchopper-sink-stderr.strategy.d.ts.map +1 -1
- package/dist/woodchopper-sink-stderr.strategy.js +6 -1
- package/dist/woodchopper-sink-stderr.strategy.js.map +1 -1
- package/dist/woodchopper-sink-stdout.strategy.d.ts +4 -0
- package/dist/woodchopper-sink-stdout.strategy.d.ts.map +1 -1
- package/dist/woodchopper-sink-stdout.strategy.js +6 -1
- package/dist/woodchopper-sink-stdout.strategy.js.map +1 -1
- package/dist/woodchopper-sink.strategy.d.ts +1 -0
- package/dist/woodchopper-sink.strategy.d.ts.map +1 -1
- package/dist/woodchopper-stats.service.d.ts +3 -3
- package/dist/woodchopper-stats.service.d.ts.map +1 -1
- package/dist/woodchopper-stats.service.js +4 -4
- package/dist/woodchopper-stats.service.js.map +1 -1
- package/dist/woodchopper.d.ts.map +1 -1
- package/dist/woodchopper.js +3 -3
- package/dist/woodchopper.js.map +1 -1
- package/package.json +2 -2
- package/readme.md +7 -4
- package/src/antivirus-clamav.adapter.ts +1 -0
- package/src/better-auth-logger.service.ts +14 -31
- package/src/cache-repository-redis.adapter.ts +1 -0
- package/src/clock-system.adapter.ts +2 -1
- package/src/cron-expression.vo.ts +1 -0
- package/src/cron-scheduler.adapter.ts +1 -0
- package/src/file-cleaner-forgiving.adapter.ts +1 -0
- package/src/file-cleaner.adapter.ts +1 -0
- package/src/file-copier.adapter.ts +1 -0
- package/src/file-draft-zip.service.ts +1 -2
- package/src/file-inspection.adapter.ts +1 -0
- package/src/file-reader-json-forgiving.adapter.ts +1 -0
- package/src/file-reader-json.adapter.ts +1 -0
- package/src/file-reader-raw-forgiving.adapter.ts +1 -0
- package/src/file-reader-raw.adapter.ts +1 -0
- package/src/file-reader-text-forgiving.adapter.ts +1 -0
- package/src/file-reader-text.adapter.ts +1 -0
- package/src/file-writer-forgiving.adapter.ts +1 -0
- package/src/file-writer.adapter.ts +1 -0
- package/src/graceful-shutdown.service.ts +3 -0
- package/src/gzip.adapter.ts +1 -0
- package/src/healthcheck.handler.ts +1 -1
- package/src/image-blur.adapter.ts +1 -0
- package/src/image-compressor.adapter.ts +1 -0
- package/src/image-exif-clear.adapter.ts +1 -0
- package/src/image-formatter.adapter.ts +1 -0
- package/src/image-generator-web-view.adapter.ts +1 -0
- package/src/image-grayscale.adapter.ts +1 -0
- package/src/image-info.adapter.ts +1 -0
- package/src/image-processor.adapter.ts +1 -0
- package/src/image-resizer.adapter.ts +1 -0
- package/src/index.ts +7 -10
- package/src/job-claimer-sqlite.adapter.ts +1 -0
- package/src/job-completer-sqlite.adapter.ts +1 -0
- package/src/job-enqueuer-sqlite.adapter.ts +1 -0
- package/src/job-failer-sqlite.adapter.ts +1 -0
- package/src/job-pruner-sqlite.adapter.ts +1 -0
- package/src/job-queue-sqlite-store.service.ts +1 -0
- package/src/job-queue-stats-provider-sqlite.adapter.ts +1 -0
- package/src/job-requeuer-sqlite.adapter.ts +1 -0
- package/src/logger-noop.adapter.ts +1 -1
- package/src/logger-stats-provider-noop.adapter.ts +1 -1
- package/src/logger-stats-provider.port.ts +1 -1
- package/src/markdown-generator.adapter.ts +1 -0
- package/src/prerequisite-verifier-binary.adapter.ts +1 -0
- package/src/prerequisite-verifier-sqlite.adapter.ts +1 -0
- package/src/remote-file-storage-disk.adapter.ts +1 -0
- package/src/request-context-hono.adapter.ts +5 -18
- package/src/sleeper-system.adapter.ts +1 -0
- package/src/static-files-hono.service.ts +1 -0
- package/src/webhook-signature-creator-sha256.strategy.ts +1 -0
- package/src/woodchopper-dispatcher-sync.strategy.ts +3 -1
- package/src/woodchopper-formatter-human.strategy.ts +8 -0
- package/src/woodchopper-formatter-json-raw.strategy.ts +8 -0
- package/src/woodchopper-formatter-json.strategy.ts +8 -0
- package/src/woodchopper-formatter.strategy.ts +5 -0
- package/src/woodchopper-sink-buffered-stderr.strategy.ts +7 -0
- package/src/woodchopper-sink-buffered-stdout.strategy.ts +7 -0
- package/src/woodchopper-sink-buffered.strategy.ts +57 -0
- package/src/woodchopper-sink-collecting.strategy.ts +2 -0
- package/src/woodchopper-sink-noop.strategy.ts +2 -0
- package/src/woodchopper-sink-stderr.strategy.ts +6 -1
- package/src/woodchopper-sink-stdout.strategy.ts +6 -1
- package/src/woodchopper-sink.strategy.ts +2 -0
- package/src/woodchopper-stats.service.ts +4 -4
- package/src/woodchopper.ts +3 -4
- package/dist/woodchopper-dispatcher-async.strategy.d.ts +0 -19
- package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +0 -1
- package/dist/woodchopper-dispatcher-async.strategy.js +0 -71
- package/dist/woodchopper-dispatcher-async.strategy.js.map +0 -1
- package/dist/woodchopper-sink-stderr-raw.strategy.d.ts +0 -6
- package/dist/woodchopper-sink-stderr-raw.strategy.d.ts.map +0 -1
- package/dist/woodchopper-sink-stderr-raw.strategy.js +0 -6
- package/dist/woodchopper-sink-stderr-raw.strategy.js.map +0 -1
- package/dist/woodchopper-sink-stdout-human.strategy.d.ts +0 -6
- package/dist/woodchopper-sink-stdout-human.strategy.d.ts.map +0 -1
- package/dist/woodchopper-sink-stdout-human.strategy.js +0 -6
- package/dist/woodchopper-sink-stdout-human.strategy.js.map +0 -1
- package/dist/woodchopper-sink-stdout-raw.strategy.d.ts +0 -6
- package/dist/woodchopper-sink-stdout-raw.strategy.d.ts.map +0 -1
- package/dist/woodchopper-sink-stdout-raw.strategy.js +0 -6
- package/dist/woodchopper-sink-stdout-raw.strategy.js.map +0 -1
- package/src/woodchopper-dispatcher-async.strategy.ts +0 -86
- package/src/woodchopper-sink-stderr-raw.strategy.ts +0 -8
- package/src/woodchopper-sink-stdout-human.strategy.ts +0 -8
- package/src/woodchopper-sink-stdout-raw.strategy.ts +0 -8
|
@@ -17,6 +17,6 @@ export class LoggerNoopAdapter implements LoggerPort, LoggerStatsProviderPort {
|
|
|
17
17
|
close() {}
|
|
18
18
|
|
|
19
19
|
getStats(): LoggerStatsSnapshot {
|
|
20
|
-
return {
|
|
20
|
+
return { accepted: 0, dropped: 0, deliveryFailures: 0, state: LoggerState.open };
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -6,6 +6,6 @@ import {
|
|
|
6
6
|
|
|
7
7
|
export class LoggerStatsProviderNoopAdapter implements LoggerStatsProviderPort {
|
|
8
8
|
getStats(): LoggerStatsSnapshot {
|
|
9
|
-
return { state: LoggerState.open, dropped: 0, deliveryFailures: 0,
|
|
9
|
+
return { state: LoggerState.open, dropped: 0, deliveryFailures: 0, accepted: 0 };
|
|
10
10
|
}
|
|
11
11
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// [BUN DEPENDENCY]
|
|
1
2
|
import * as tools from "@bgord/tools";
|
|
2
3
|
import type { Context } from "hono";
|
|
3
4
|
import { getConnInfo } from "hono/bun";
|
|
@@ -16,15 +17,7 @@ export class RequestContextHonoAdapter implements RequestContext {
|
|
|
16
17
|
url: () => context.req.url,
|
|
17
18
|
header: (name) => context.req.header(name),
|
|
18
19
|
headers: () => context.req.raw.headers,
|
|
19
|
-
headersObject: () =>
|
|
20
|
-
const headers: Record<string, string> = {};
|
|
21
|
-
|
|
22
|
-
context.req.raw.headers.forEach((value, key) => {
|
|
23
|
-
headers[key] = value;
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
return headers;
|
|
27
|
-
},
|
|
20
|
+
headersObject: () => Object.fromEntries(context.req.raw.headers),
|
|
28
21
|
query: () => context.req.query(),
|
|
29
22
|
queries: () => context.req.queries(),
|
|
30
23
|
params: () => context.req.param(),
|
|
@@ -32,18 +25,14 @@ export class RequestContextHonoAdapter implements RequestContext {
|
|
|
32
25
|
cookie: (name) => getCookie(context)[name],
|
|
33
26
|
json: async () => {
|
|
34
27
|
try {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return await request.json();
|
|
28
|
+
return await context.req.raw.clone().json();
|
|
38
29
|
} catch {
|
|
39
30
|
return {};
|
|
40
31
|
}
|
|
41
32
|
},
|
|
42
33
|
text: async () => {
|
|
43
34
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return await request.text();
|
|
35
|
+
return await context.req.raw.clone().text();
|
|
47
36
|
} catch {
|
|
48
37
|
// Stryker disable next-line StringLiteral
|
|
49
38
|
return "";
|
|
@@ -51,9 +40,7 @@ export class RequestContextHonoAdapter implements RequestContext {
|
|
|
51
40
|
},
|
|
52
41
|
form: async () => {
|
|
53
42
|
try {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return await request.formData();
|
|
43
|
+
return await context.req.raw.clone().formData();
|
|
57
44
|
} catch {
|
|
58
45
|
return new FormData();
|
|
59
46
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LoggerEntry } from "./logger.port";
|
|
2
|
+
import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
|
|
3
|
+
|
|
4
|
+
export class WoodchopperFormatterHuman implements WoodchopperFormatterStrategy {
|
|
5
|
+
format(entry: LoggerEntry): string {
|
|
6
|
+
return `${JSON.stringify(entry, null, 2)}\n`;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LoggerEntry } from "./logger.port";
|
|
2
|
+
import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
|
|
3
|
+
|
|
4
|
+
export class WoodchopperFormatterJsonRaw implements WoodchopperFormatterStrategy {
|
|
5
|
+
format(entry: LoggerEntry): string {
|
|
6
|
+
return JSON.stringify(entry);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LoggerEntry } from "./logger.port";
|
|
2
|
+
import type { WoodchopperFormatterStrategy } from "./woodchopper-formatter.strategy";
|
|
3
|
+
|
|
4
|
+
export class WoodchopperFormatterJson implements WoodchopperFormatterStrategy {
|
|
5
|
+
format(entry: LoggerEntry): string {
|
|
6
|
+
return `${JSON.stringify(entry)}\n`;
|
|
7
|
+
}
|
|
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
|
+
}
|
|
@@ -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(
|
|
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(
|
|
9
|
+
process.stdout.write(this.formatter.format(entry));
|
|
7
10
|
}
|
|
11
|
+
|
|
12
|
+
close(): void {}
|
|
8
13
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export class WoodchopperStats {
|
|
2
|
-
private
|
|
2
|
+
private accepted = 0;
|
|
3
3
|
private dropped = 0;
|
|
4
4
|
private deliveryFailures = 0;
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
this.
|
|
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 {
|
|
19
|
+
return { accepted: this.accepted, dropped: this.dropped, deliveryFailures: this.deliveryFailures };
|
|
20
20
|
}
|
|
21
21
|
}
|
package/src/woodchopper.ts
CHANGED
|
@@ -73,7 +73,8 @@ export class Woodchopper implements LoggerPort, LoggerStatsProviderPort {
|
|
|
73
73
|
let withInjectedFields: LoggerEntry;
|
|
74
74
|
try {
|
|
75
75
|
withInjectedFields = {
|
|
76
|
-
|
|
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
|
-
|
|
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 +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 +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 +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
|
-
}
|