axusage 3.8.2 → 3.8.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.
Files changed (57) hide show
  1. package/README.md +19 -8
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/fetch-service-usage.d.ts +4 -3
  5. package/dist/commands/fetch-service-usage.d.ts.map +1 -1
  6. package/dist/commands/fetch-service-usage.js +13 -27
  7. package/dist/commands/fetch-service-usage.js.map +1 -1
  8. package/dist/commands/serve-command.d.ts +1 -19
  9. package/dist/commands/serve-command.d.ts.map +1 -1
  10. package/dist/commands/serve-command.js +42 -104
  11. package/dist/commands/serve-command.js.map +1 -1
  12. package/dist/commands/usage-command.d.ts +2 -1
  13. package/dist/commands/usage-command.d.ts.map +1 -1
  14. package/dist/commands/usage-command.js +4 -0
  15. package/dist/commands/usage-command.js.map +1 -1
  16. package/dist/config/serve-config.d.ts +15 -0
  17. package/dist/config/serve-config.d.ts.map +1 -1
  18. package/dist/config/serve-config.js +57 -18
  19. package/dist/config/serve-config.js.map +1 -1
  20. package/dist/server/routes.d.ts +14 -8
  21. package/dist/server/routes.d.ts.map +1 -1
  22. package/dist/server/routes.js +111 -60
  23. package/dist/server/routes.js.map +1 -1
  24. package/dist/server/serve-logger.d.ts +5 -0
  25. package/dist/server/serve-logger.d.ts.map +1 -0
  26. package/dist/server/serve-logger.js +88 -0
  27. package/dist/server/serve-logger.js.map +1 -0
  28. package/dist/server/server.d.ts +14 -7
  29. package/dist/server/server.d.ts.map +1 -1
  30. package/dist/server/server.js +90 -56
  31. package/dist/server/server.js.map +1 -1
  32. package/dist/server/usage-cache.d.ts +26 -0
  33. package/dist/server/usage-cache.d.ts.map +1 -0
  34. package/dist/server/usage-cache.js +77 -0
  35. package/dist/server/usage-cache.js.map +1 -0
  36. package/dist/services/get-instance-access-token.d.ts +2 -1
  37. package/dist/services/get-instance-access-token.d.ts.map +1 -1
  38. package/dist/services/get-instance-access-token.js.map +1 -1
  39. package/dist/services/service-adapter-registry.d.ts +3 -2
  40. package/dist/services/service-adapter-registry.d.ts.map +1 -1
  41. package/dist/services/service-adapter-registry.js +3 -3
  42. package/dist/services/service-adapter-registry.js.map +1 -1
  43. package/dist/services/supported-service.d.ts.map +1 -1
  44. package/dist/services/supported-service.js +5 -1
  45. package/dist/services/supported-service.js.map +1 -1
  46. package/dist/types/serve-api.d.ts +53 -0
  47. package/dist/types/serve-api.d.ts.map +1 -0
  48. package/dist/types/serve-api.js +34 -0
  49. package/dist/types/serve-api.js.map +1 -0
  50. package/dist/utils/format-prometheus-metrics.d.ts.map +1 -1
  51. package/dist/utils/format-prometheus-metrics.js +8 -2
  52. package/dist/utils/format-prometheus-metrics.js.map +1 -1
  53. package/dist/utils/format-service-usage.d.ts +2 -1
  54. package/dist/utils/format-service-usage.d.ts.map +1 -1
  55. package/dist/utils/format-service-usage.js +2 -2
  56. package/dist/utils/format-service-usage.js.map +1 -1
  57. package/package.json +6 -3
package/README.md CHANGED
@@ -185,23 +185,34 @@ axusage serve --port 9090 --interval 60 --service claude
185
185
 
186
186
  # With environment variables
187
187
  AXUSAGE_PORT=9090 AXUSAGE_INTERVAL=60 axusage serve
188
+
189
+ # With debug logging
190
+ AXUSAGE_LOG_LEVEL=debug axusage serve
188
191
  ```
189
192
 
190
193
  ### Options
191
194
 
192
- | Flag | Env Var | Default | Description |
193
- | ---------------------- | ------------------ | ----------- | ------------------------ |
194
- | `--port <port>` | `AXUSAGE_PORT` | `3848` | Port to listen on |
195
- | `--host <host>` | `AXUSAGE_HOST` | `127.0.0.1` | Host to bind to |
196
- | `--interval <seconds>` | `AXUSAGE_INTERVAL` | `300` | Max cache age in seconds |
197
- | `--service <service>` | `AXUSAGE_SERVICE` | all | Service to monitor |
195
+ | Flag | Env Var | Default | Description |
196
+ | ---------------------- | --------------------- | ----------- | ----------------------------------------------------- |
197
+ | `--port <port>` | `AXUSAGE_PORT` | `3848` | Port to listen on |
198
+ | `--host <host>` | `AXUSAGE_HOST` | `127.0.0.1` | Host to bind to |
199
+ | `--interval <seconds>` | `AXUSAGE_INTERVAL` | `300` | Max cache age in seconds |
200
+ | `--log-level <level>` | `AXUSAGE_LOG_LEVEL` | `info` | Fastify/Pino log level |
201
+ | `--service <service>` | `AXUSAGE_SERVICE` | all | Service to monitor |
202
+ | — | `AXUSAGE_TRUST_PROXY` | `false` | Trust proxy headers (set `true` behind reverse proxy) |
203
+
204
+ Invalid serve-mode configuration now fails fast. For example, non-numeric ports, zero/negative intervals, or unsupported log levels exit with an error instead of silently falling back to defaults.
198
205
 
199
206
  ### Endpoints
200
207
 
201
- - `GET /metrics` — Prometheus text exposition (`text/plain; version=0.0.4`). Serves cached data immediately; triggers a background refresh when stale. Returns 503 when all services are currently failing.
202
- - `GET /usage` — JSON array of usage objects (one per service instance; multi-instance configs produce multiple entries per service type). Waits for a fresh snapshot when stale. Returns 503 if no data is available. Date fields (e.g. `resetsAt`) are serialized as ISO 8601 strings.
208
+ - `GET /metrics` — Prometheus text exposition (`text/plain; version=0.0.4`). Serves cached data immediately; triggers a background refresh when stale. Returns 503 with JSON `{ "error": "No data yet" }` when no usage data is available.
209
+ - `GET /usage` — JSON array of usage objects (one per service instance; multi-instance configs produce multiple entries per service type). Waits for a fresh snapshot when stale. Returns 503 with JSON `{ "error": "No data yet" }` if no data is available. Date fields (e.g. `resetsAt`) are serialized as ISO 8601 strings.
203
210
  - `GET /health` — JSON health status with version, last refresh time, tracked services, and errors. Always responds immediately from cached state without triggering a refresh.
204
211
 
212
+ Rate limiting is applied globally (100 req/min per client); `/health` and `/metrics` are exempt. Unmatched routes (404s) are also rate-limited to prevent URL probing. Security headers are set via `@fastify/helmet`.
213
+
214
+ Serve mode uses Fastify's structured logger and graceful shutdown handling. Request/response validation and serialization are enforced with Zod-backed route schemas.
215
+
205
216
  ### Container Deployment
206
217
 
207
218
  ```bash
package/dist/cli.js CHANGED
@@ -6,6 +6,7 @@ import { authStatusCommand } from "./commands/auth-status-command.js";
6
6
  import { serveCommand } from "./commands/serve-command.js";
7
7
  import { usageCommand } from "./commands/usage-command.js";
8
8
  import { getCredentialSourcesPath } from "./config/credential-sources.js";
9
+ import { SERVE_LOG_LEVELS } from "./config/serve-config.js";
9
10
  import { getAvailableServices } from "./services/service-adapter-registry.js";
10
11
  import { configureColor } from "./utils/color.js";
11
12
  import { formatRequiresHelpText } from "./utils/format-requires-help-text.js";
@@ -35,6 +36,7 @@ program
35
36
  .option("-p, --port <port>", "Port to listen on (env: AXUSAGE_PORT)")
36
37
  .option("-H, --host <host>", "Host to bind to (env: AXUSAGE_HOST)")
37
38
  .option("--interval <seconds>", "Max cache age in seconds (env: AXUSAGE_INTERVAL)")
39
+ .addOption(new Option("--log-level <level>", "Server log level (env: AXUSAGE_LOG_LEVEL)").choices([...SERVE_LOG_LEVELS]))
38
40
  .option("-s, --service <service>", "Service to monitor (env: AXUSAGE_SERVICE, default: all)")
39
41
  .action(async (options) => {
40
42
  await serveCommand(options);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,15 @@
1
- import type { ServiceResult } from "../types/domain.js";
1
+ import { type ServiceResult } from "../types/domain.js";
2
+ import { type SupportedService } from "../services/supported-service.js";
2
3
  export type UsageCommandOptions = {
3
4
  readonly service?: string;
4
5
  readonly format?: "text" | "tsv" | "json" | "prometheus";
5
6
  };
6
- export declare function selectServicesToQuery(service?: string): string[];
7
+ export declare function selectServicesToQuery(service?: string): SupportedService[];
7
8
  /**
8
9
  * Fetch usage for all instances of a service type.
9
10
  *
10
11
  * Resolves tokens and fetches usage for each configured instance in parallel.
11
12
  * Produces N results with resolved display names and stable instance IDs.
12
13
  */
13
- export declare function fetchServiceInstanceUsage(serviceType: string): Promise<ServiceResult[]>;
14
+ export declare function fetchServiceInstanceUsage(serviceType: SupportedService): Promise<ServiceResult[]>;
14
15
  //# sourceMappingURL=fetch-service-usage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-service-usage.d.ts","sourceRoot":"","sources":["../../src/commands/fetch-service-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAWlE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;CAC1D,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhE;AAiBD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,CAwF1B"}
1
+ {"version":3,"file":"fetch-service-usage.d.ts","sourceRoot":"","sources":["../../src/commands/fetch-service-usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQlE,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;CAC1D,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAI1E;AAiBD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAoE1B"}
@@ -1,13 +1,13 @@
1
- import { ApiError as ApiErrorClass } from "../types/domain.js";
1
+ import { ApiError } from "../types/domain.js";
2
2
  import { getAvailableServices, getServiceUsageFetcher, } from "../services/service-adapter-registry.js";
3
3
  import { getServiceInstanceConfigs } from "../config/credential-sources.js";
4
4
  import { getInstanceAccessToken } from "../services/get-instance-access-token.js";
5
5
  import { resolveInstanceDisplayName } from "../services/resolve-service-instances.js";
6
+ import { validateService, } from "../services/supported-service.js";
6
7
  export function selectServicesToQuery(service) {
7
- const normalized = service?.toLowerCase();
8
- if (!service || normalized === "all")
8
+ if (!service || service.toLowerCase() === "all")
9
9
  return getAvailableServices();
10
- return [service];
10
+ return [validateService(service)];
11
11
  }
12
12
  /**
13
13
  * Derive a stable instance identifier for metrics labeling.
@@ -27,33 +27,19 @@ function deriveInstanceId(serviceType, credentialName, index, total) {
27
27
  * Produces N results with resolved display names and stable instance IDs.
28
28
  */
29
29
  export async function fetchServiceInstanceUsage(serviceType) {
30
- const normalized = serviceType.toLowerCase();
31
- const fetcher = getServiceUsageFetcher(normalized);
32
- if (!fetcher) {
33
- const available = getAvailableServices().join(", ");
34
- return [
35
- {
36
- service: serviceType,
37
- result: {
38
- ok: false,
39
- error: new ApiErrorClass(`Unknown service "${serviceType}". Supported services: ${available}. ` +
40
- "Run 'axusage --help' for usage."),
41
- },
42
- },
43
- ];
44
- }
45
- const instanceConfigs = getServiceInstanceConfigs(normalized);
30
+ const fetcher = getServiceUsageFetcher(serviceType);
31
+ const instanceConfigs = getServiceInstanceConfigs(serviceType);
46
32
  const results = await Promise.all(instanceConfigs.map(async (config, index) => {
47
- const tokenResult = await getInstanceAccessToken(normalized, config);
33
+ const tokenResult = await getInstanceAccessToken(serviceType, config);
48
34
  if (!tokenResult.token) {
49
- const label = config.name ?? normalized;
35
+ const label = config.name ?? serviceType;
50
36
  const isVaultPath = config.source === "vault" ||
51
37
  (config.source === "auto" && config.name !== undefined);
52
38
  return {
53
- service: normalized,
39
+ service: serviceType,
54
40
  result: {
55
41
  ok: false,
56
- error: new ApiErrorClass(`No credentials found for ${label}. ` +
42
+ error: new ApiError(`No credentials found for ${label}. ` +
57
43
  (isVaultPath
58
44
  ? config.name
59
45
  ? `Check that vault is configured and credential "${config.name}" exists.`
@@ -65,9 +51,9 @@ export async function fetchServiceInstanceUsage(serviceType) {
65
51
  const usageResult = await fetcher.fetchUsageWithToken(tokenResult.token);
66
52
  if (usageResult.ok) {
67
53
  const displayName = resolveInstanceDisplayName(config.displayName, tokenResult.vaultDisplayName, fetcher.name, index, instanceConfigs.length);
68
- const instanceId = deriveInstanceId(normalized, config.name, index, instanceConfigs.length);
54
+ const instanceId = deriveInstanceId(serviceType, config.name, index, instanceConfigs.length);
69
55
  return {
70
- service: normalized,
56
+ service: serviceType,
71
57
  result: {
72
58
  ok: true,
73
59
  value: {
@@ -79,7 +65,7 @@ export async function fetchServiceInstanceUsage(serviceType) {
79
65
  };
80
66
  }
81
67
  return {
82
- service: normalized,
68
+ service: serviceType,
83
69
  result: usageResult,
84
70
  };
85
71
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-service-usage.js","sourceRoot":"","sources":["../../src/commands/fetch-service-usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-service-usage.js","sourceRoot":"","sources":["../../src/commands/fetch-service-usage.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,13 @@
1
1
  /**
2
2
  * Serve command handler — starts an HTTP server exposing usage data.
3
3
  */
4
- import { type ServerState } from "../server/routes.js";
5
- import type { ServiceResult } from "../types/domain.js";
6
4
  type ServeCommandOptions = {
7
5
  readonly port?: string;
8
6
  readonly host?: string;
9
7
  readonly interval?: string;
10
8
  readonly service?: string;
9
+ readonly logLevel?: string;
11
10
  };
12
- type UsageCache = {
13
- readonly getState: () => ServerState | undefined;
14
- /** Waits for a fresh snapshot before returning. Use for data endpoints where staleness is unacceptable. */
15
- readonly getFreshState: () => Promise<ServerState | undefined>;
16
- /** Serves the current snapshot immediately; triggers a background refresh when stale.
17
- * Blocks only if no snapshot exists yet (first ever request). Use for Prometheus /metrics
18
- * where scrape latency matters more than strict freshness. */
19
- readonly getStateStaleWhileRevalidate: () => Promise<ServerState | undefined>;
20
- };
21
- /**
22
- * Creates an on-demand usage cache. Data is fetched via `doFetch` when a
23
- * caller requests fresh state and the cached snapshot is older than `intervalMs`.
24
- * Concurrent callers during a refresh all receive the same in-flight promise.
25
- * When all services fail, the cache retries after a short backoff (≤5s) rather
26
- * than waiting the full interval.
27
- */
28
- export declare function createUsageCache(doFetch: () => Promise<ServiceResult[]>, intervalMs: number): UsageCache;
29
11
  export declare function serveCommand(options: ServeCommandOptions): Promise<void>;
30
12
  export {};
31
13
  //# sourceMappingURL=serve-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../src/commands/serve-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,oBAAoB,CAAC;AAE1E,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IACjD,2GAA2G;IAC3G,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC/D;;mEAE+D;IAC/D,QAAQ,CAAC,4BAA4B,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;CAC/E,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,EACvC,UAAU,EAAE,MAAM,GACjB,UAAU,CA+DZ;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsEf"}
1
+ {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../src/commands/serve-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
@@ -1,123 +1,61 @@
1
1
  /**
2
2
  * Serve command handler — starts an HTTP server exposing usage data.
3
3
  */
4
+ import closeWithGrace from "close-with-grace";
4
5
  import { getServeConfig } from "../config/serve-config.js";
5
6
  import { selectServicesToQuery } from "./fetch-service-usage.js";
6
7
  import { fetchServicesInParallel } from "./usage-command.js";
8
+ import { createDeferredServeLogger } from "../server/serve-logger.js";
7
9
  import { createServer } from "../server/server.js";
8
- import { createHealthRouter, createMetricsRouter, createUsageRouter, } from "../server/routes.js";
9
- import { getAvailableServices } from "../services/service-adapter-registry.js";
10
- /**
11
- * Creates an on-demand usage cache. Data is fetched via `doFetch` when a
12
- * caller requests fresh state and the cached snapshot is older than `intervalMs`.
13
- * Concurrent callers during a refresh all receive the same in-flight promise.
14
- * When all services fail, the cache retries after a short backoff (≤5s) rather
15
- * than waiting the full interval.
16
- */
17
- export function createUsageCache(doFetch, intervalMs) {
18
- let state;
19
- let refreshPromise;
20
- async function doRefresh() {
21
- const results = await doFetch();
22
- const usage = [];
23
- const errors = [];
24
- for (const { service, result } of results) {
25
- if (result.ok) {
26
- usage.push(result.value);
27
- }
28
- else {
29
- const statusSuffix = result.error.status === undefined
30
- ? ""
31
- : ` (HTTP ${String(result.error.status)})`;
32
- errors.push(`${service}: fetch failed${statusSuffix}`);
33
- console.error(`Warning: Failed to fetch ${service}: ${result.error.message}`);
34
- }
35
- }
36
- state = { usage, refreshedAt: new Date(), errors };
37
- }
38
- function ensureFresh() {
39
- const age = state === undefined ? Infinity : Date.now() - state.refreshedAt.getTime();
40
- // If the last refresh produced no data (all services failed), retry on a
41
- // short backoff so the server recovers promptly after transient failures
42
- // rather than waiting the full cache interval.
43
- const hasData = state !== undefined && state.usage.length > 0;
44
- const maxAge = hasData ? intervalMs : Math.min(intervalMs, 5000);
45
- if (age < maxAge)
46
- return Promise.resolve();
47
- refreshPromise ??= doRefresh().finally(() => {
48
- refreshPromise = undefined;
49
- });
50
- return refreshPromise;
51
- }
52
- return {
53
- getState: () => state,
54
- getFreshState: async () => {
55
- await ensureFresh();
56
- return state;
57
- },
58
- getStateStaleWhileRevalidate: async () => {
59
- if (state === undefined) {
60
- // No snapshot yet — block until we have something to serve.
61
- await ensureFresh();
62
- }
63
- else {
64
- // Serve the current snapshot immediately; kick off a background
65
- // refresh if stale. Errors are logged; callers are not affected.
66
- void ensureFresh().catch((error) => {
67
- console.error("Background metrics refresh failed:", error);
68
- });
69
- }
70
- return state;
71
- },
72
- };
73
- }
10
+ import { createHealthPlugin, createMetricsPlugin, createUsagePlugin, } from "../server/routes.js";
11
+ import { createUsageCache } from "../server/usage-cache.js";
74
12
  export async function serveCommand(options) {
75
13
  const config = getServeConfig(options);
76
- const availableServices = getAvailableServices();
77
- if (config.service !== undefined &&
78
- config.service.toLowerCase() !== "all" &&
79
- !availableServices.includes(config.service.toLowerCase())) {
80
- console.error(`Unknown service "${config.service}". Supported: ${availableServices.join(", ")}.`);
81
- if (process.exitCode === undefined)
82
- process.exitCode = 1;
83
- return;
84
- }
85
14
  const servicesToQuery = selectServicesToQuery(config.service);
86
- const cache = createUsageCache(() => fetchServicesInParallel(servicesToQuery), config.intervalMs);
15
+ const serverReference = { current: undefined };
16
+ const logger = createDeferredServeLogger(() => serverReference.current?.app.log);
17
+ let shuttingDown = false;
18
+ const cache = createUsageCache(() => fetchServicesInParallel(servicesToQuery), config.intervalMs, logger);
87
19
  const server = createServer(config, [
88
- createHealthRouter(servicesToQuery, cache.getState),
89
- createMetricsRouter(cache.getStateStaleWhileRevalidate),
90
- createUsageRouter(cache.getFreshState),
20
+ createHealthPlugin(servicesToQuery, cache.getState, () => shuttingDown),
21
+ createMetricsPlugin(cache.getStateStaleWhileRevalidate),
22
+ createUsagePlugin(cache.getFreshState),
91
23
  ]);
92
- const shutdown = () => {
93
- console.error("\nShutting down...");
94
- const forceExit = setTimeout(() => {
95
- console.error("Shutdown timed out, forcing exit");
96
- // eslint-disable-next-line unicorn/no-process-exit -- CLI graceful shutdown
97
- process.exit(1);
98
- }, 5000);
99
- forceExit.unref();
100
- server
101
- .stop()
102
- .finally(() => {
103
- clearTimeout(forceExit);
104
- })
105
- .then(() => {
106
- // eslint-disable-next-line unicorn/no-process-exit -- CLI graceful shutdown
107
- process.exit(0);
108
- }, (error) => {
109
- console.error("Error during shutdown:", error);
110
- // eslint-disable-next-line unicorn/no-process-exit -- CLI graceful shutdown
111
- process.exit(1);
24
+ serverReference.current = server;
25
+ // Register shutdown handler before the initial fetch so signals arriving
26
+ // at any point during startup are caught instead of using Node's default
27
+ // (immediate termination).
28
+ closeWithGrace({
29
+ delay: 5000,
30
+ logger: false,
31
+ onTimeout(delay) {
32
+ server.app.log.error({ delay }, "Graceful shutdown timed out");
33
+ },
34
+ }, async ({ signal, err, manual }) => {
35
+ shuttingDown = true;
36
+ cache.shutdown();
37
+ if (err) {
38
+ server.app.log.error({ err, signal, manual }, "Shutting down axusage server due to fatal error");
39
+ }
40
+ else {
41
+ server.app.log.info({ signal, manual }, "Shutting down axusage server");
42
+ }
43
+ await server.stop();
44
+ await cache.waitForPending().catch((error) => {
45
+ server.app.log.warn({ err: error }, "In-flight refresh failed during shutdown");
112
46
  });
113
- };
114
- process.once("SIGTERM", shutdown);
115
- process.once("SIGINT", shutdown);
47
+ });
116
48
  // Pre-populate the cache before accepting connections so /health returns a
117
49
  // meaningful status immediately (important for container readiness checks).
118
- console.error(`Fetching initial data for: ${servicesToQuery.join(", ")}`);
50
+ server.app.log.info({ services: servicesToQuery }, "Fetching initial data for serve mode");
119
51
  await cache.getFreshState();
52
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- mutated by closeWithGrace signal handler above
53
+ if (shuttingDown)
54
+ return;
120
55
  await server.start();
121
- console.error(`Serving usage for: ${servicesToQuery.join(", ")} (max age: ${String(config.intervalMs / 1000)}s)`);
56
+ server.app.log.info({
57
+ services: servicesToQuery,
58
+ maxAgeSeconds: config.intervalMs / 1000,
59
+ }, "Serving usage");
122
60
  }
123
61
  //# sourceMappingURL=serve-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve-command.js","sourceRoot":"","sources":["../../src/commands/serve-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve-command.js","sourceRoot":"","sources":["../../src/commands/serve-command.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import type { ServiceResult } from "../types/domain.js";
2
+ import type { SupportedService } from "../services/supported-service.js";
2
3
  import type { UsageCommandOptions } from "./fetch-service-usage.js";
3
4
  /**
4
5
  * Fetches usage for all requested services in parallel.
5
6
  * Each service type may produce multiple results (multi-instance support).
6
7
  */
7
- export declare function fetchServicesInParallel(servicesToQuery: string[]): Promise<ServiceResult[]>;
8
+ export declare function fetchServicesInParallel(servicesToQuery: SupportedService[]): Promise<ServiceResult[]>;
8
9
  /**
9
10
  * Executes the usage command
10
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"usage-command.d.ts","sourceRoot":"","sources":["../../src/commands/usage-command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQpE;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CAO1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkHf"}
1
+ {"version":3,"file":"usage-command.d.ts","sourceRoot":"","sources":["../../src/commands/usage-command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQpE;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,eAAe,EAAE,gBAAgB,EAAE,GAClC,OAAO,CAAC,aAAa,EAAE,CAAC,CAO1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsHf"}
@@ -109,6 +109,10 @@ export async function usageCommand(options) {
109
109
  }
110
110
  break;
111
111
  }
112
+ default: {
113
+ const _exhaustive = format;
114
+ throw new Error(`Unhandled format: ${String(_exhaustive)}`);
115
+ }
112
116
  }
113
117
  if (hasPartialFailures) {
114
118
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"usage-command.js","sourceRoot":"","sources":["../../src/commands/usage-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage-command.js","sourceRoot":"","sources":["../../src/commands/usage-command.ts"],"names":[],"mappings":"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"}
@@ -3,17 +3,32 @@
3
3
  *
4
4
  * Priority: CLI flags > environment variables > defaults.
5
5
  */
6
+ import { z } from "zod";
7
+ export declare const SERVE_LOG_LEVELS: readonly ["trace", "debug", "info", "warn", "error", "fatal", "silent"];
8
+ declare const ServeLogLevelSchema: z.ZodEnum<{
9
+ error: "error";
10
+ trace: "trace";
11
+ debug: "debug";
12
+ info: "info";
13
+ warn: "warn";
14
+ fatal: "fatal";
15
+ silent: "silent";
16
+ }>;
17
+ export type ServeLogLevel = z.infer<typeof ServeLogLevelSchema>;
6
18
  export type ServeConfig = {
7
19
  readonly port: number;
8
20
  readonly host: string;
9
21
  readonly intervalMs: number;
10
22
  readonly service: string | undefined;
23
+ readonly logLevel: ServeLogLevel;
24
+ readonly trustProxy: boolean;
11
25
  };
12
26
  type ServeConfigOverrides = {
13
27
  readonly port?: string;
14
28
  readonly host?: string;
15
29
  readonly interval?: string;
16
30
  readonly service?: string;
31
+ readonly logLevel?: string;
17
32
  };
18
33
  /** Parse serve config from environment and CLI overrides */
19
34
  export declare function getServeConfig(overrides?: ServeConfigOverrides): ServeConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"serve-config.d.ts","sourceRoot":"","sources":["../../src/config/serve-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAMF,4DAA4D;AAC5D,wBAAgB,cAAc,CAC5B,SAAS,GAAE,oBAAyB,GACnC,WAAW,CAkBb"}
1
+ {"version":3,"file":"serve-config.d.ts","sourceRoot":"","sources":["../../src/config/serve-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,yEAQnB,CAAC;AAEX,QAAA,MAAM,mBAAmB;;;;;;;;EAA2B,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAcF,4DAA4D;AAC5D,wBAAgB,cAAc,CAC5B,SAAS,GAAE,oBAAyB,GACnC,WAAW,CAsCb"}