import type { Styles } from '../payments/types'; import { initTelemetry } from '../telemetry/setup'; import { logger } from '../telemetry/logger'; export interface BoltConfig { publishableKey: string; environment?: 'production' | 'sandbox' | 'staging'; language?: string; } const ENVIRONMENT_URLS: Record = { production: 'https://connect.boltapp.com', sandbox: 'https://connect-sandbox.boltapp.com', staging: 'https://connect-staging.boltapp.com', }; const API_URLS: Record = { production: 'https://api.boltapp.com', sandbox: 'https://api-sandbox.boltapp.com', staging: 'https://api-staging.boltapp.com', }; export class Bolt { public readonly publishableKey: string; public readonly environment: 'production' | 'sandbox' | 'staging'; public readonly baseUrl: string; public readonly apiUrl: string; public readonly language: string; private onPageStyles?: Styles; constructor(config: BoltConfig) { if (!config.publishableKey) { throw new Error('Bolt: publishableKey is required'); } const env = config.environment ?? 'production'; this.publishableKey = config.publishableKey; this.environment = env; this.baseUrl = ENVIRONMENT_URLS[env] ?? ENVIRONMENT_URLS.production!; this.apiUrl = API_URLS[env] ?? API_URLS.production!; this.language = config.language ?? 'en'; initTelemetry(config); logger.info('Bolt client initialized', { environment: config.environment ?? 'production', publishableKey: config.publishableKey.slice(0, 8) + '...', }); } configureOnPageStyles(styles: Styles): void { this.onPageStyles = styles; } getOnPageStyles(): Styles | undefined { return this.onPageStyles; } /** * Returns the standard HTTP headers required for Bolt REST API calls. * Centralised here so every API caller uses a consistent header name. */ apiHeaders(): Record { return { 'X-Publishable-Key': this.publishableKey, }; } }