import { registerAs } from '@nestjs/config'; export interface ChatConfig { enabled: boolean; /** Synapse base URL reachable from this container (client + admin APIs). */ baseUrl: string; /** Synapse's public_baseurl — what Element itself is configured to call. Only * used to seed the sso.html handoff; server-to-server calls use {@link baseUrl}. */ publicBaseUrl: string; /** Public Element Web origin — the SSO handoff link points here. */ webUrl: string; /** Matrix server_name — the `:domain` half of every MXID. */ serverName: string; /** HS256 secret. Must exactly match Synapse's jwt_config.secret. */ jwtSecret: string; /** Bearer token for a Synapse server admin account (room/user provisioning). */ adminToken: string; } const REQUIRED_VARS = [ 'MATRIX_BASE_URL', 'MATRIX_PUBLIC_BASE_URL', 'MATRIX_CHAT_WEB_URL', 'MATRIX_SERVER_NAME', 'MATRIX_JWT_SECRET', 'MATRIX_ADMIN_TOKEN', ] as const; export default registerAs('chat', (): ChatConfig => { const enabled = (process.env.MATRIX_ENABLED ?? 'false').toLowerCase() === 'true'; if (!enabled) { return { enabled: false, baseUrl: '', publicBaseUrl: '', webUrl: '', serverName: '', jwtSecret: '', adminToken: '', }; } const missing = REQUIRED_VARS.filter((name) => !process.env[name]); if (missing.length > 0) { throw new Error( `Internal chat is enabled (MATRIX_ENABLED=true) but the following env vars are missing: ${missing.join(', ')}`, ); } return { enabled: true, baseUrl: process.env.MATRIX_BASE_URL!.replace(/\/$/, ''), publicBaseUrl: process.env.MATRIX_PUBLIC_BASE_URL!.replace(/\/$/, ''), webUrl: process.env.MATRIX_CHAT_WEB_URL!.replace(/\/$/, ''), serverName: process.env.MATRIX_SERVER_NAME!, jwtSecret: process.env.MATRIX_JWT_SECRET!, adminToken: process.env.MATRIX_ADMIN_TOKEN!, }; });