From bc735dfdb904bec92728f86766fbb0bcb4c046f4 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 20 Mar 2026 17:31:01 -0700 Subject: [PATCH] feat(backend): add @bytelyst/backend-flags + backend-telemetry, fix config defaults - Add @bytelyst/backend-flags and @bytelyst/backend-telemetry packages - Create feature-flags.ts and telemetry.ts wrappers using shared packages - Add TELEMETRY_ENABLED and FEATURE_FLAGS_ENABLED config fields - Default DB_PROVIDER to memory (fixes test failures without env vars) - Add JWT_SECRET dev default and PLATFORM_SERVICE_URL - 176/176 tests pass --- backend/package-lock.json | 26 ++++++++++++++++++++++++++ backend/package.json | 2 ++ backend/src/lib/config.ts | 11 +++++++---- backend/src/lib/feature-flags.ts | 15 +++++++++++++++ backend/src/lib/telemetry.ts | 8 ++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 backend/src/lib/feature-flags.ts create mode 100644 backend/src/lib/telemetry.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index effc902..39ded77 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,8 @@ "@azure/cosmos": "^4.2.0", "@bytelyst/auth": "file:../../learning_ai_common_plat/packages/auth", "@bytelyst/backend-config": "file:../../learning_ai_common_plat/packages/backend-config", + "@bytelyst/backend-flags": "file:../../learning_ai_common_plat/packages/backend-flags", + "@bytelyst/backend-telemetry": "file:../../learning_ai_common_plat/packages/backend-telemetry", "@bytelyst/config": "file:../../learning_ai_common_plat/packages/config", "@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos", "@bytelyst/datastore": "file:../../learning_ai_common_plat/packages/datastore", @@ -50,6 +52,22 @@ "vitest": "^3.0.5" } }, + "../../learning_ai_common_plat/packages/backend-flags": { + "name": "@bytelyst/backend-flags", + "version": "0.1.0", + "devDependencies": { + "typescript": "^5.7.3", + "vitest": "^3.0.5" + } + }, + "../../learning_ai_common_plat/packages/backend-telemetry": { + "name": "@bytelyst/backend-telemetry", + "version": "0.1.0", + "devDependencies": { + "typescript": "^5.7.3", + "vitest": "^3.0.5" + } + }, "../../learning_ai_common_plat/packages/config": { "name": "@bytelyst/config", "version": "0.1.0", @@ -375,6 +393,14 @@ "resolved": "../../learning_ai_common_plat/packages/backend-config", "link": true }, + "node_modules/@bytelyst/backend-flags": { + "resolved": "../../learning_ai_common_plat/packages/backend-flags", + "link": true + }, + "node_modules/@bytelyst/backend-telemetry": { + "resolved": "../../learning_ai_common_plat/packages/backend-telemetry", + "link": true + }, "node_modules/@bytelyst/config": { "resolved": "../../learning_ai_common_plat/packages/config", "link": true diff --git a/backend/package.json b/backend/package.json index 36de7e1..b9bc530 100644 --- a/backend/package.json +++ b/backend/package.json @@ -18,6 +18,8 @@ "@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos", "@bytelyst/datastore": "file:../../learning_ai_common_plat/packages/datastore", "@bytelyst/backend-config": "file:../../learning_ai_common_plat/packages/backend-config", + "@bytelyst/backend-flags": "file:../../learning_ai_common_plat/packages/backend-flags", + "@bytelyst/backend-telemetry": "file:../../learning_ai_common_plat/packages/backend-telemetry", "@bytelyst/errors": "file:../../learning_ai_common_plat/packages/errors", "@bytelyst/fastify-auth": "file:../../learning_ai_common_plat/packages/fastify-auth", "@bytelyst/fastify-core": "file:../../learning_ai_common_plat/packages/fastify-core", diff --git a/backend/src/lib/config.ts b/backend/src/lib/config.ts index 0a94a83..50cfb8f 100644 --- a/backend/src/lib/config.ts +++ b/backend/src/lib/config.ts @@ -1,11 +1,14 @@ +import { z } from 'zod'; import { baseBackendConfigSchema } from '@bytelyst/backend-config'; const envSchema = baseBackendConfigSchema.extend({ PORT: baseBackendConfigSchema.shape.PORT.default(4011), SERVICE_NAME: baseBackendConfigSchema.shape.SERVICE_NAME.default('chronomind-backend'), -}).refine( - data => data.DB_PROVIDER === 'memory' || (data.COSMOS_ENDPOINT.length > 0 && data.COSMOS_KEY.length > 0), - { message: 'COSMOS_ENDPOINT and COSMOS_KEY are required when DB_PROVIDER is cosmos' } -); + DB_PROVIDER: baseBackendConfigSchema.shape.DB_PROVIDER.default('memory'), + JWT_SECRET: z.string().default('dev-secret-do-not-use-in-prod'), + PLATFORM_SERVICE_URL: z.string().default('http://localhost:4003'), + TELEMETRY_ENABLED: z.coerce.boolean().default(false), + FEATURE_FLAGS_ENABLED: z.coerce.boolean().default(false), +}); export const config = envSchema.parse(process.env); diff --git a/backend/src/lib/feature-flags.ts b/backend/src/lib/feature-flags.ts new file mode 100644 index 0000000..42a52ad --- /dev/null +++ b/backend/src/lib/feature-flags.ts @@ -0,0 +1,15 @@ +import { createFlagRegistry } from '@bytelyst/backend-flags'; +import { config } from './config.js'; + +const registry = createFlagRegistry({ + defaults: { + 'timers.cascade': true, + 'timers.linked': true, + 'routines.enabled': true, + 'households.enabled': true, + 'shared_timers.enabled': true, + }, + enabled: config.FEATURE_FLAGS_ENABLED, +}); + +export const { isFeatureEnabled, getAllFlags, setFlag } = registry; diff --git a/backend/src/lib/telemetry.ts b/backend/src/lib/telemetry.ts new file mode 100644 index 0000000..9bd6411 --- /dev/null +++ b/backend/src/lib/telemetry.ts @@ -0,0 +1,8 @@ +import { createTelemetryBuffer } from '@bytelyst/backend-telemetry'; +import { config } from './config.js'; + +export type { TelemetryEvent } from '@bytelyst/backend-telemetry'; + +const buffer = createTelemetryBuffer({ enabled: config.TELEMETRY_ENABLED }); + +export const { trackEvent, getBufferedEvents, flushEvents } = buffer;