@bgord/bun 0.29.13 → 0.29.14
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/basic-auth.service.d.ts +12 -0
- package/dist/basic-auth.service.d.ts.map +1 -1
- package/dist/basic-auth.service.js +14 -2
- package/dist/basic-auth.service.js.map +1 -1
- package/dist/better-auth-logger.service.d.ts.map +1 -1
- package/dist/better-auth-logger.service.js +2 -4
- package/dist/better-auth-logger.service.js.map +1 -1
- package/dist/clock-fixed.adapter.d.ts +1 -1
- package/dist/clock-fixed.adapter.d.ts.map +1 -1
- package/dist/clock-fixed.adapter.js +3 -3
- package/dist/clock-fixed.adapter.js.map +1 -1
- package/dist/command-logger.service.d.ts.map +1 -1
- package/dist/command-logger.service.js.map +1 -1
- package/dist/env-validator.service.d.ts +1 -0
- package/dist/env-validator.service.d.ts.map +1 -1
- package/dist/env-validator.service.js +2 -1
- package/dist/env-validator.service.js.map +1 -1
- package/dist/event-store.d.ts +1 -1
- package/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +2 -2
- package/dist/event-store.js.map +1 -1
- package/dist/event-stream.vo.d.ts +3 -0
- package/dist/event-stream.vo.d.ts.map +1 -1
- package/dist/event-stream.vo.js +5 -1
- package/dist/event-stream.vo.js.map +1 -1
- package/dist/healthcheck.service.d.ts +44 -15
- package/dist/healthcheck.service.d.ts.map +1 -1
- package/dist/healthcheck.service.js +1 -1
- package/dist/healthcheck.service.js.map +1 -1
- package/dist/http-logger.middleware.js +2 -2
- package/dist/http-logger.middleware.js.map +1 -1
- package/dist/rate-limit-store-node-cache.adapter.d.ts +2 -2
- package/dist/rate-limit-store-node-cache.adapter.d.ts.map +1 -1
- package/dist/rate-limit-store-node-cache.adapter.js +5 -5
- package/dist/rate-limit-store-node-cache.adapter.js.map +1 -1
- package/dist/rate-limit-store.port.d.ts +1 -1
- package/dist/rate-limit-store.port.d.ts.map +1 -1
- package/dist/shield-rate-limit.middleware.js +1 -1
- package/dist/shield-rate-limit.middleware.js.map +1 -1
- package/dist/slower.middleware.d.ts +1 -1
- package/dist/slower.middleware.d.ts.map +1 -1
- package/dist/slower.middleware.js +2 -2
- package/dist/slower.middleware.js.map +1 -1
- package/dist/time-zone-offset.middleware.d.ts +3 -7
- package/dist/time-zone-offset.middleware.d.ts.map +1 -1
- package/dist/time-zone-offset.middleware.js +5 -10
- package/dist/time-zone-offset.middleware.js.map +1 -1
- package/dist/translations.service.d.ts +5 -3
- package/dist/translations.service.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/uptime.service.d.ts +2 -1
- package/dist/uptime.service.d.ts.map +1 -1
- package/dist/uptime.service.js +4 -4
- package/dist/uptime.service.js.map +1 -1
- package/package.json +4 -4
- package/src/basic-auth.service.ts +14 -2
- package/src/better-auth-logger.service.ts +3 -4
- package/src/clock-fixed.adapter.ts +3 -3
- package/src/command-logger.service.ts +0 -1
- package/src/env-validator.service.ts +3 -1
- package/src/event-store.ts +2 -6
- package/src/event-stream.vo.ts +6 -1
- package/src/healthcheck.service.ts +3 -2
- package/src/http-logger.middleware.ts +2 -2
- package/src/rate-limit-store-node-cache.adapter.ts +3 -3
- package/src/rate-limit-store.port.ts +1 -1
- package/src/shield-rate-limit.middleware.ts +1 -1
- package/src/slower.middleware.ts +2 -2
- package/src/time-zone-offset.middleware.ts +6 -21
- package/src/uptime.service.ts +6 -7
package/dist/uptime.service.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
import type { ClockPort } from "./clock.port";
|
|
3
3
|
export type UptimeResultType = {
|
|
4
|
-
|
|
4
|
+
duration: tools.Duration;
|
|
5
5
|
formatted: ReturnType<(typeof tools.DateFormatters)["relative"]>;
|
|
6
6
|
};
|
|
7
7
|
export declare class Uptime {
|
|
8
|
+
private static readonly rounding;
|
|
8
9
|
static get(clock: ClockPort): UptimeResultType;
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=uptime.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uptime.service.d.ts","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,
|
|
1
|
+
{"version":3,"file":"uptime.service.d.ts","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,SAAS,EAAE,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAE9D,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB;CAM/C"}
|
package/dist/uptime.service.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
export class Uptime {
|
|
3
|
+
static rounding = new tools.RoundToNearest();
|
|
3
4
|
static get(clock) {
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
return { seconds: tools.Timestamp.parse(uptime.seconds), formatted: uptimeFormatted };
|
|
5
|
+
const uptime = tools.Duration.Seconds(Uptime.rounding.round(process.uptime()));
|
|
6
|
+
const uptimeFormatted = tools.DateFormatters.relative(clock.now().Minus(uptime));
|
|
7
|
+
return { duration: uptime, formatted: uptimeFormatted };
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=uptime.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uptime.service.js","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAQtC,MAAM,OAAO,MAAM;
|
|
1
|
+
{"version":3,"file":"uptime.service.js","sourceRoot":"","sources":["../src/uptime.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAQtC,MAAM,OAAO,MAAM;IACT,MAAM,CAAU,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IAE9D,MAAM,CAAC,GAAG,CAAC,KAAgB;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IAC1D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bgord/bun",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.14",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Bartosz Gordon",
|
|
@@ -38,18 +38,18 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@axiomhq/winston": "1.3.1",
|
|
41
|
-
"@bgord/tools": "0.
|
|
41
|
+
"@bgord/tools": "0.17.1",
|
|
42
42
|
"@hono/ua-blocker": "0.1.12",
|
|
43
43
|
"better-auth": "1.3.26",
|
|
44
44
|
"check-disk-space": "3.4.0",
|
|
45
45
|
"croner": "9.1.0",
|
|
46
46
|
"csv": "6.4.1",
|
|
47
47
|
"hcaptcha": "0.2.0",
|
|
48
|
-
"hono": "4.9.
|
|
48
|
+
"hono": "4.9.10",
|
|
49
49
|
"lodash": "4.17.21",
|
|
50
50
|
"mime-types": "3.0.1",
|
|
51
51
|
"node-cache": "5.1.2",
|
|
52
|
-
"nodemailer": "7.0.
|
|
52
|
+
"nodemailer": "7.0.7",
|
|
53
53
|
"sharp": "0.34.4",
|
|
54
54
|
"ssl-checker": "2.0.10",
|
|
55
55
|
"winston": "3.18.3",
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { z } from "zod/v4";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const BasicAuthUsernameTypeError = { error: "basic.auth.username.invalid_type" } as const;
|
|
4
|
+
export const BasicAuthUsernameLengthError = { error: "basic.auth.username.invalid_length" } as const;
|
|
5
|
+
export const BasicAuthUsername = z
|
|
6
|
+
.string(BasicAuthUsernameTypeError)
|
|
7
|
+
.min(1, BasicAuthUsernameLengthError)
|
|
8
|
+
.max(128, BasicAuthUsernameLengthError)
|
|
9
|
+
.brand("BasicAuthUsername");
|
|
4
10
|
export type BasicAuthUsernameType = z.infer<typeof BasicAuthUsername>;
|
|
5
11
|
|
|
6
|
-
export const
|
|
12
|
+
export const BasicAuthPasswordTypeError = { error: "basic.auth.password.invalid_type" } as const;
|
|
13
|
+
export const BasicAuthPasswordLengthError = { error: "basic.auth.password.invalid_length" } as const;
|
|
14
|
+
export const BasicAuthPassword = z
|
|
15
|
+
.string(BasicAuthPasswordTypeError)
|
|
16
|
+
.min(1, BasicAuthPasswordLengthError)
|
|
17
|
+
.max(128, BasicAuthPasswordLengthError)
|
|
18
|
+
.brand("BasicAuthPassword");
|
|
7
19
|
export type BasicAuthPasswordType = z.infer<typeof BasicAuthPassword>;
|
|
8
20
|
|
|
9
21
|
type BasicAuthHeaderValueType = { authorization: string };
|
|
@@ -15,10 +15,9 @@ export class BetterAuthLogger {
|
|
|
15
15
|
|
|
16
16
|
switch (level) {
|
|
17
17
|
case LogLevelEnum.error: {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
18
|
+
const error = formatError(args.find((a) => a instanceof Error) ?? new Error(message));
|
|
19
|
+
|
|
20
|
+
this.logger.error({ ...base, error });
|
|
22
21
|
break;
|
|
23
22
|
}
|
|
24
23
|
case LogLevelEnum.warn: {
|
|
@@ -9,14 +9,14 @@ export class ClockFixedAdapter implements ClockPort {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
nowMs() {
|
|
12
|
-
return
|
|
12
|
+
return this.value;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
now(): ReturnType<typeof tools.Time.Now> {
|
|
16
16
|
return tools.Time.Now(this.value);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
advanceBy(
|
|
20
|
-
this.value = tools.
|
|
19
|
+
advanceBy(duration: tools.Duration): void {
|
|
20
|
+
this.value = tools.Time.Now(this.value).Add(duration);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -12,7 +12,6 @@ export class CommandLogger {
|
|
|
12
12
|
commandData: Record<string, any> | undefined,
|
|
13
13
|
) {
|
|
14
14
|
if (type === "subscribe") return;
|
|
15
|
-
|
|
16
15
|
if (typeof commandName === "symbol") return;
|
|
17
16
|
|
|
18
17
|
this.logger.info({ message: `${commandName} emitted`, metadata: commandData, ...this.base });
|
|
@@ -5,6 +5,8 @@ type NodeEnvironmentEnumType = z.infer<typeof NodeEnvironment>;
|
|
|
5
5
|
type AnyZodSchema = z.ZodSchema<any, any>;
|
|
6
6
|
type EnvironmentValidatorConfig = { type: unknown; schema: AnyZodSchema };
|
|
7
7
|
|
|
8
|
+
export const InvalidNodeEnvironmentError = "invalid.node.environment" as const;
|
|
9
|
+
|
|
8
10
|
export class EnvironmentValidator<SchemaType> {
|
|
9
11
|
type: NodeEnvironmentEnumType;
|
|
10
12
|
schema: z.Schema<SchemaType>;
|
|
@@ -19,7 +21,7 @@ export class EnvironmentValidator<SchemaType> {
|
|
|
19
21
|
return;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
throw new Error(
|
|
24
|
+
throw new Error(InvalidNodeEnvironmentError);
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
load(): SchemaType & { type: NodeEnvironmentEnumType } {
|
package/src/event-store.ts
CHANGED
|
@@ -54,12 +54,8 @@ export class EventStore<AllEvents extends GenericEventSchema> {
|
|
|
54
54
|
})) as z.infer<AllEvents>[];
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
async saveAfter(
|
|
58
|
-
|
|
59
|
-
time: tools.TimeResultInterface,
|
|
60
|
-
): Promise<z.infer<AllEvents>[]> {
|
|
61
|
-
await Bun.sleep(time.ms);
|
|
62
|
-
|
|
57
|
+
async saveAfter(events: z.infer<AllEvents>[], offset: tools.Duration): Promise<z.infer<AllEvents>[]> {
|
|
58
|
+
await Bun.sleep(offset.ms);
|
|
63
59
|
return this.save(events);
|
|
64
60
|
}
|
|
65
61
|
}
|
package/src/event-stream.vo.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { z } from "zod/v4";
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const EventStreamInvalidError = { error: "event.stream.invalid.error" } as const;
|
|
4
|
+
|
|
5
|
+
export const EventStream = z
|
|
6
|
+
.string(EventStreamInvalidError)
|
|
7
|
+
.min(1, EventStreamInvalidError)
|
|
8
|
+
.max(256, EventStreamInvalidError);
|
|
4
9
|
export type EventStreamType = z.infer<typeof EventStream>;
|
|
@@ -14,7 +14,8 @@ type HealthcheckResultType = {
|
|
|
14
14
|
details: { label: prereqs.PrerequisiteLabelType; outcome: prereqs.VerifyOutcome }[];
|
|
15
15
|
uptime: UptimeResultType;
|
|
16
16
|
memory: { bytes: tools.Size["bytes"]; formatted: ReturnType<tools.Size["format"]> };
|
|
17
|
-
|
|
17
|
+
durationMs: tools.Duration["ms"];
|
|
18
|
+
};
|
|
18
19
|
|
|
19
20
|
type Dependencies = { Clock: ClockPort };
|
|
20
21
|
|
|
@@ -46,7 +47,7 @@ export class Healthcheck {
|
|
|
46
47
|
bytes: MemoryConsumption.get().toBytes(),
|
|
47
48
|
formatted: MemoryConsumption.get().format(tools.SizeUnit.MB),
|
|
48
49
|
},
|
|
49
|
-
|
|
50
|
+
durationMs: stopwatch.stop().ms,
|
|
50
51
|
};
|
|
51
52
|
|
|
52
53
|
return c.json(result, code);
|
|
@@ -70,7 +70,7 @@ export class HttpLogger {
|
|
|
70
70
|
|
|
71
71
|
const stopwatch = new tools.Stopwatch(deps.Clock.nowMs());
|
|
72
72
|
await next();
|
|
73
|
-
const
|
|
73
|
+
const duration = stopwatch.stop();
|
|
74
74
|
|
|
75
75
|
const response = c.res.clone();
|
|
76
76
|
|
|
@@ -82,7 +82,7 @@ export class HttpLogger {
|
|
|
82
82
|
method: request.method,
|
|
83
83
|
url: request.url,
|
|
84
84
|
status: response.status,
|
|
85
|
-
durationMs,
|
|
85
|
+
durationMs: duration.ms,
|
|
86
86
|
client,
|
|
87
87
|
cacheHit: response.headers.get(CacheResponse.CACHE_HIT_HEADER) === CacheHitEnum.hit,
|
|
88
88
|
metadata: { response: await HttpLogger.parseJSON(response) },
|
|
@@ -5,10 +5,10 @@ import type { RateLimitStore, RateLimitStoreSubjectType } from "./rate-limit-sto
|
|
|
5
5
|
export class RateLimitStoreNodeCache implements RateLimitStore {
|
|
6
6
|
private readonly store: NodeCache;
|
|
7
7
|
|
|
8
|
-
constructor(readonly
|
|
8
|
+
constructor(readonly ttl: tools.Duration) {
|
|
9
9
|
this.store = new NodeCache({
|
|
10
|
-
stdTTL: this.
|
|
11
|
-
checkperiod: this.
|
|
10
|
+
stdTTL: this.ttl.seconds,
|
|
11
|
+
checkperiod: this.ttl.seconds,
|
|
12
12
|
deleteOnExpire: true,
|
|
13
13
|
maxKeys: 100_000,
|
|
14
14
|
});
|
|
@@ -3,7 +3,7 @@ import type * as tools from "@bgord/tools";
|
|
|
3
3
|
export type RateLimitStoreSubjectType = string;
|
|
4
4
|
|
|
5
5
|
export interface RateLimitStore {
|
|
6
|
-
readonly
|
|
6
|
+
readonly ttl: tools.Duration;
|
|
7
7
|
get(subject: RateLimitStoreSubjectType): Promise<tools.RateLimiter | undefined>;
|
|
8
8
|
set(subject: RateLimitStoreSubjectType, limiter: tools.RateLimiter): Promise<void>;
|
|
9
9
|
}
|
|
@@ -23,7 +23,7 @@ export const ShieldRateLimit = (options: RateLimitShieldOptionsType, deps: Depen
|
|
|
23
23
|
let limiter = await options.store.get(subject);
|
|
24
24
|
|
|
25
25
|
if (!limiter) {
|
|
26
|
-
limiter = new tools.RateLimiter(options.store.
|
|
26
|
+
limiter = new tools.RateLimiter(options.store.ttl);
|
|
27
27
|
options.store.set(subject, limiter);
|
|
28
28
|
}
|
|
29
29
|
|
package/src/slower.middleware.ts
CHANGED
|
@@ -2,9 +2,9 @@ import type * as tools from "@bgord/tools";
|
|
|
2
2
|
import { createMiddleware } from "hono/factory";
|
|
3
3
|
|
|
4
4
|
export class Slower {
|
|
5
|
-
static handle = (
|
|
5
|
+
static handle = (offset: tools.Duration) =>
|
|
6
6
|
createMiddleware(async (_c, next) => {
|
|
7
|
-
await Bun.sleep(
|
|
7
|
+
await Bun.sleep(offset.ms);
|
|
8
8
|
return next();
|
|
9
9
|
});
|
|
10
10
|
}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import * as tools from "@bgord/tools";
|
|
2
2
|
import { createMiddleware } from "hono/factory";
|
|
3
3
|
|
|
4
|
-
export type TimeZoneOffsetVariables = {
|
|
5
|
-
timeZoneOffset: {
|
|
6
|
-
minutes: tools.TimeResultInterface["minutes"];
|
|
7
|
-
seconds: tools.TimeResultInterface["seconds"];
|
|
8
|
-
miliseconds: tools.TimeResultInterface["ms"];
|
|
9
|
-
};
|
|
10
|
-
};
|
|
4
|
+
export type TimeZoneOffsetVariables = { timeZoneOffset: tools.Duration };
|
|
11
5
|
|
|
12
6
|
export class TimeZoneOffset {
|
|
13
7
|
static TIME_ZONE_OFFSET_HEADER_NAME = "time-zone-offset";
|
|
@@ -17,25 +11,16 @@ export class TimeZoneOffset {
|
|
|
17
11
|
c.req.header(TimeZoneOffset.TIME_ZONE_OFFSET_HEADER_NAME),
|
|
18
12
|
);
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
minutes: timeZoneOffsetMinutes,
|
|
22
|
-
seconds: tools.Time.Minutes(timeZoneOffsetMinutes).seconds,
|
|
23
|
-
miliseconds: tools.Time.Minutes(timeZoneOffsetMinutes).ms,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
c.set("timeZoneOffset", timeZoneOffset);
|
|
14
|
+
c.set("timeZoneOffset", tools.Duration.Minutes(timeZoneOffsetMinutes));
|
|
27
15
|
|
|
28
16
|
await next();
|
|
29
17
|
});
|
|
30
18
|
|
|
31
|
-
static adjustTimestamp(
|
|
32
|
-
|
|
33
|
-
timeZoneOffsetMs: tools.TimeResultInterface["ms"],
|
|
34
|
-
): tools.TimestampType {
|
|
35
|
-
return tools.Timestamp.parse(timestamp - timeZoneOffsetMs);
|
|
19
|
+
static adjustTimestamp(timestamp: tools.TimestampType, offset: tools.Duration): tools.TimestampType {
|
|
20
|
+
return tools.Timestamp.parse(timestamp - offset.ms);
|
|
36
21
|
}
|
|
37
22
|
|
|
38
|
-
static adjustDate(timestamp: tools.TimestampType,
|
|
39
|
-
return new Date(timestamp -
|
|
23
|
+
static adjustDate(timestamp: tools.TimestampType, offset: tools.Duration): Date {
|
|
24
|
+
return new Date(timestamp - offset.ms);
|
|
40
25
|
}
|
|
41
26
|
}
|
package/src/uptime.service.ts
CHANGED
|
@@ -2,18 +2,17 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { ClockPort } from "./clock.port";
|
|
3
3
|
|
|
4
4
|
export type UptimeResultType = {
|
|
5
|
-
|
|
5
|
+
duration: tools.Duration;
|
|
6
6
|
formatted: ReturnType<(typeof tools.DateFormatters)["relative"]>;
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
export class Uptime {
|
|
10
|
-
static
|
|
11
|
-
const rounding = new tools.RoundToNearest();
|
|
12
|
-
|
|
13
|
-
const uptime = tools.Time.Seconds(rounding.round(process.uptime()));
|
|
10
|
+
private static readonly rounding = new tools.RoundToNearest();
|
|
14
11
|
|
|
15
|
-
|
|
12
|
+
static get(clock: ClockPort): UptimeResultType {
|
|
13
|
+
const uptime = tools.Duration.Seconds(Uptime.rounding.round(process.uptime()));
|
|
14
|
+
const uptimeFormatted = tools.DateFormatters.relative(clock.now().Minus(uptime));
|
|
16
15
|
|
|
17
|
-
return {
|
|
16
|
+
return { duration: uptime, formatted: uptimeFormatted };
|
|
18
17
|
}
|
|
19
18
|
}
|