@bgord/bun 1.1.3 → 1.1.5

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 (42) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/logger-winston-production.adapter.d.ts +1 -1
  6. package/dist/logger-winston-production.adapter.d.ts.map +1 -1
  7. package/dist/logger-winston-production.adapter.js +6 -2
  8. package/dist/logger-winston-production.adapter.js.map +1 -1
  9. package/dist/prerequisites/clock-drift.d.ts +19 -0
  10. package/dist/prerequisites/clock-drift.d.ts.map +1 -0
  11. package/dist/prerequisites/clock-drift.js +29 -0
  12. package/dist/prerequisites/clock-drift.js.map +1 -0
  13. package/dist/prerequisites/index.d.ts +1 -0
  14. package/dist/prerequisites/index.d.ts.map +1 -1
  15. package/dist/prerequisites/index.js +1 -0
  16. package/dist/prerequisites/index.js.map +1 -1
  17. package/dist/prerequisites.service.d.ts +0 -3
  18. package/dist/prerequisites.service.d.ts.map +1 -1
  19. package/dist/prerequisites.service.js.map +1 -1
  20. package/dist/timekeeper-google.adapter.d.ts +6 -0
  21. package/dist/timekeeper-google.adapter.d.ts.map +1 -0
  22. package/dist/timekeeper-google.adapter.js +18 -0
  23. package/dist/timekeeper-google.adapter.js.map +1 -0
  24. package/dist/timekeeper-noop.adapter.d.ts +8 -0
  25. package/dist/timekeeper-noop.adapter.d.ts.map +1 -0
  26. package/dist/timekeeper-noop.adapter.js +10 -0
  27. package/dist/timekeeper-noop.adapter.js.map +1 -0
  28. package/dist/timekeeper.port.d.ts +5 -0
  29. package/dist/timekeeper.port.d.ts.map +1 -0
  30. package/dist/timekeeper.port.js +2 -0
  31. package/dist/timekeeper.port.js.map +1 -0
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +4 -4
  34. package/readme.md +4 -0
  35. package/src/index.ts +3 -0
  36. package/src/logger-winston-production.adapter.ts +7 -4
  37. package/src/prerequisites/clock-drift.ts +43 -0
  38. package/src/prerequisites/index.ts +1 -0
  39. package/src/prerequisites.service.ts +0 -3
  40. package/src/timekeeper-google.adapter.ts +18 -0
  41. package/src/timekeeper-noop.adapter.ts +10 -0
  42. package/src/timekeeper.port.ts +5 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": "Bartosz Gordon",
@@ -20,7 +20,7 @@
20
20
  "preinstall": "bunx only-allow bun"
21
21
  },
22
22
  "devDependencies": {
23
- "@biomejs/biome": "2.3.2",
23
+ "@biomejs/biome": "2.3.3",
24
24
  "@commitlint/cli": "20.1.0",
25
25
  "@commitlint/config-conventional": "20.0.0",
26
26
  "@types/bun": "1.3.1",
@@ -29,7 +29,7 @@
29
29
  "@types/nodemailer": "7.0.3",
30
30
  "@types/yazl": "3.3.0",
31
31
  "cspell": "9.2.2",
32
- "knip": "5.67.0",
32
+ "knip": "5.67.1",
33
33
  "lefthook": "2.0.2",
34
34
  "only-allow": "1.2.1",
35
35
  "shellcheck": "4.1.0",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@axiomhq/winston": "1.3.1",
41
- "@bgord/tools": "1.1.3",
41
+ "@bgord/tools": "1.1.4",
42
42
  "@hono/ua-blocker": "0.1.15",
43
43
  "better-auth": "1.3.34",
44
44
  "croner": "9.1.0",
package/readme.md CHANGED
@@ -178,6 +178,7 @@ src/
178
178
  ├── prerequisites
179
179
  │   ├── binary.ts
180
180
  │   ├── bun.ts
181
+ │   ├── clock-drift.ts
181
182
  │   ├── dependency-vulnerabilities.ts
182
183
  │   ├── directory.ts
183
184
  │   ├── external-api.ts
@@ -228,6 +229,9 @@ src/
228
229
  ├── temporary-file-noop.adapter.ts
229
230
  ├── temporary-file.port.ts
230
231
  ├── time-zone-offset.middleware.ts
232
+ ├── timekeeper-google.adapter.ts
233
+ ├── timekeeper-noop.adapter.ts
234
+ ├── timekeeper.port.ts
231
235
  ├── to-event-map.types.ts
232
236
  ├── translations.service.ts
233
237
  ├── uptime.service.ts
package/src/index.ts CHANGED
@@ -152,6 +152,9 @@ export * from "./temporary-file.port";
152
152
  export * from "./temporary-file-absolute.adapter";
153
153
  export * from "./temporary-file-noop.adapter";
154
154
  export * from "./time-zone-offset.middleware";
155
+ export * from "./timekeeper.port";
156
+ export * from "./timekeeper-google.adapter";
157
+ export * from "./timekeeper-noop.adapter";
155
158
  export * from "./to-event-map.types";
156
159
  export * from "./translations.service";
157
160
  export * from "./uptime.service";
@@ -8,7 +8,7 @@ import type { RedactorPort } from "./redactor.port";
8
8
 
9
9
  type LoggerWinstonProductionAdapterConfigType = {
10
10
  app: LogAppType;
11
- AXIOM_API_TOKEN: string;
11
+ AXIOM_API_TOKEN?: string;
12
12
  redactor: RedactorPort;
13
13
  };
14
14
 
@@ -27,13 +27,16 @@ export class LoggerWinstonProductionAdapter {
27
27
  tailable: true,
28
28
  });
29
29
 
30
- const axiom = new AxiomTransport({ token: this.config.AXIOM_API_TOKEN, dataset: this.config.app });
31
-
32
30
  return new LoggerWinstonAdapter({
33
31
  app: this.config.app,
34
32
  environment: NodeEnvironmentEnum.production,
35
33
  level,
36
- transports: [file, axiom],
34
+ transports: [
35
+ file,
36
+ this.config.AXIOM_API_TOKEN
37
+ ? new AxiomTransport({ token: this.config.AXIOM_API_TOKEN, dataset: this.config.app })
38
+ : undefined,
39
+ ].filter((adapter) => adapter !== undefined),
37
40
  redactor: this.config.redactor,
38
41
  });
39
42
  }
@@ -0,0 +1,43 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ClockPort } from "../clock.port";
3
+ import * as prereqs from "../prerequisites.service";
4
+ import type { TimekeeperPort } from "../timekeeper.port";
5
+
6
+ export class PrerequisiteClockDrift implements prereqs.Prerequisite {
7
+ readonly kind = "clock-drift";
8
+ readonly label: prereqs.PrerequisiteLabelType;
9
+ readonly enabled?: boolean = true;
10
+
11
+ readonly skew: tools.Duration;
12
+ readonly timekeeper: TimekeeperPort;
13
+ readonly clock: ClockPort;
14
+
15
+ constructor(
16
+ config: prereqs.PrerequisiteConfigType & {
17
+ skew: tools.Duration;
18
+ timekeeper: TimekeeperPort;
19
+ clock: ClockPort;
20
+ },
21
+ ) {
22
+ this.label = config.label;
23
+ this.enabled = config.enabled === undefined ? true : config.enabled;
24
+
25
+ this.skew = config.skew;
26
+ this.timekeeper = config.timekeeper;
27
+ this.clock = config.clock;
28
+ }
29
+
30
+ async verify(): Promise<prereqs.VerifyOutcome> {
31
+ if (!this.enabled) return prereqs.Verification.undetermined();
32
+
33
+ const now = this.clock.now();
34
+
35
+ const timestamp = await this.timekeeper.get();
36
+ if (!timestamp) return prereqs.Verification.undetermined();
37
+
38
+ const duration = now.difference(timestamp).toAbolute();
39
+
40
+ if (duration.isShorterThan(this.skew)) return prereqs.Verification.success();
41
+ return prereqs.Verification.failure({ message: `Difference: ${duration.seconds}s` });
42
+ }
43
+ }
@@ -1,5 +1,6 @@
1
1
  export * from "./binary";
2
2
  export * from "./bun";
3
+ export * from "./clock-drift";
3
4
  export * from "./dependency-vulnerabilities";
4
5
  export * from "./directory";
5
6
  export * from "./external-api";
@@ -1,4 +1,3 @@
1
- import type * as tools from "@bgord/tools";
2
1
  import type { ErrorInfo, LoggerPort } from "../src/logger.port";
3
2
  import { formatError } from "../src/logger-format-error.service";
4
3
 
@@ -25,8 +24,6 @@ export interface Prerequisite {
25
24
  export type PrerequisiteResult = Readonly<{
26
25
  label: PrerequisiteLabelType;
27
26
  status: PrerequisiteStatusEnum;
28
- checkedAt: tools.Timestamp;
29
- durationMs: tools.DurationMsType;
30
27
  kind: string;
31
28
  error?: ErrorInfo;
32
29
  }>;
@@ -0,0 +1,18 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { TimekeeperPort } from "./timekeeper.port";
3
+
4
+ export class TimekeeperGoogleAdapter implements TimekeeperPort {
5
+ async get() {
6
+ try {
7
+ const response = await fetch("https://www.google.com/generate_204");
8
+ if (!response.ok) return null;
9
+
10
+ const date = response.headers.get("Date");
11
+ if (!date) return null;
12
+
13
+ return tools.Timestamp.fromNumber(new Date(date).getTime());
14
+ } catch (error) {
15
+ return null;
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,10 @@
1
+ import type { ClockPort } from "./clock.port";
2
+ import type { TimekeeperPort } from "./timekeeper.port";
3
+
4
+ export class TimekeeperNoopAdapter implements TimekeeperPort {
5
+ constructor(private readonly clock: ClockPort) {}
6
+
7
+ async get() {
8
+ return this.clock.now();
9
+ }
10
+ }
@@ -0,0 +1,5 @@
1
+ import type * as tools from "@bgord/tools";
2
+
3
+ export interface TimekeeperPort {
4
+ get(): Promise<tools.Timestamp | null>;
5
+ }