- Add .npmrc with scoped Gitea npm registry for @mosaicstack packages - Create MosaicTelemetryModule (global, lifecycle-aware) at apps/api/src/mosaic-telemetry/ - Create MosaicTelemetryService wrapping TelemetryClient with convenience methods: trackTaskCompletion, getPrediction, refreshPredictions, eventBuilder - Create mosaic-telemetry.config.ts for env var integration via NestJS ConfigService - Register MosaicTelemetryModule in AppModule - Add 32 unit tests covering module init, service methods, disabled mode, dry-run mode, and lifecycle management Refs #369 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
79 lines
2.4 KiB
TypeScript
79 lines
2.4 KiB
TypeScript
import type { ConfigService } from "@nestjs/config";
|
|
import type { TelemetryConfig } from "@mosaicstack/telemetry-client";
|
|
|
|
/**
|
|
* Configuration interface for the Mosaic Telemetry module.
|
|
* Maps environment variables to SDK configuration.
|
|
*/
|
|
export interface MosaicTelemetryModuleConfig {
|
|
/** Whether telemetry collection is enabled. Default: true */
|
|
enabled: boolean;
|
|
/** Base URL of the telemetry server */
|
|
serverUrl: string;
|
|
/** API key for authentication (64-char hex string) */
|
|
apiKey: string;
|
|
/** Instance UUID for this client */
|
|
instanceId: string;
|
|
/** If true, log events instead of sending them. Default: false */
|
|
dryRun: boolean;
|
|
}
|
|
|
|
/**
|
|
* Environment variable names used by the Mosaic Telemetry module.
|
|
*/
|
|
export const MOSAIC_TELEMETRY_ENV = {
|
|
ENABLED: "MOSAIC_TELEMETRY_ENABLED",
|
|
SERVER_URL: "MOSAIC_TELEMETRY_SERVER_URL",
|
|
API_KEY: "MOSAIC_TELEMETRY_API_KEY",
|
|
INSTANCE_ID: "MOSAIC_TELEMETRY_INSTANCE_ID",
|
|
DRY_RUN: "MOSAIC_TELEMETRY_DRY_RUN",
|
|
} as const;
|
|
|
|
/**
|
|
* Read Mosaic Telemetry configuration from environment variables via NestJS ConfigService.
|
|
*
|
|
* @param configService - NestJS ConfigService instance
|
|
* @returns Parsed module configuration
|
|
*/
|
|
export function loadMosaicTelemetryConfig(
|
|
configService: ConfigService
|
|
): MosaicTelemetryModuleConfig {
|
|
const enabledRaw = configService.get<string>(MOSAIC_TELEMETRY_ENV.ENABLED, "true");
|
|
const dryRunRaw = configService.get<string>(MOSAIC_TELEMETRY_ENV.DRY_RUN, "false");
|
|
|
|
return {
|
|
enabled: enabledRaw.toLowerCase() === "true",
|
|
serverUrl: configService.get<string>(MOSAIC_TELEMETRY_ENV.SERVER_URL, ""),
|
|
apiKey: configService.get<string>(MOSAIC_TELEMETRY_ENV.API_KEY, ""),
|
|
instanceId: configService.get<string>(MOSAIC_TELEMETRY_ENV.INSTANCE_ID, ""),
|
|
dryRun: dryRunRaw.toLowerCase() === "true",
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Convert module config to SDK TelemetryConfig format.
|
|
* Includes the onError callback for NestJS Logger integration.
|
|
*
|
|
* @param config - Module configuration
|
|
* @param onError - Error callback (typically NestJS Logger)
|
|
* @returns SDK-compatible TelemetryConfig
|
|
*/
|
|
export function toSdkConfig(
|
|
config: MosaicTelemetryModuleConfig,
|
|
onError?: (error: Error) => void
|
|
): TelemetryConfig {
|
|
const sdkConfig: TelemetryConfig = {
|
|
serverUrl: config.serverUrl,
|
|
apiKey: config.apiKey,
|
|
instanceId: config.instanceId,
|
|
enabled: config.enabled,
|
|
dryRun: config.dryRun,
|
|
};
|
|
|
|
if (onError) {
|
|
sdkConfig.onError = onError;
|
|
}
|
|
|
|
return sdkConfig;
|
|
}
|