import MQTT, { MQTTConfig } from '../adapter/mqtt'; // Default MQTT configuration for HiveMQ broker const defaultConfig: MQTTConfig = { host: 'broker.hivemq.com', port: 1883, username: undefined, password: undefined }; export const BASE_TOPIC = '/Jtkcp2N/pressurebed/'; // Singleton MQTT client instance let mqttInstance: MQTT | null = null; export class MQTTService { private static instance: MQTT | null = null; static async initialize(config?: Partial): Promise { if (!MQTTService.instance) { const finalConfig = { ...defaultConfig, ...config }; MQTTService.instance = new MQTT(); await MQTTService.instance.initialize(finalConfig); } return MQTTService.instance; } static getInstance(): MQTT | null { return MQTTService.instance; } static async disconnect(): Promise { if (MQTTService.instance) { await MQTTService.instance.disconnect(); MQTTService.instance = null; } } } // Factory function to get or create MQTT client export async function getMQTTClient(config?: Partial): Promise { if (!mqttInstance) { mqttInstance = new MQTT(); const finalConfig = { ...defaultConfig, ...config }; await mqttInstance.initialize(finalConfig); } return mqttInstance; } // Export the singleton instance getter export function getMQTTInstance(): MQTT | null { return mqttInstance; } // Cleanup function export async function disconnectMQTT(): Promise { if (mqttInstance) { await mqttInstance.disconnect(); mqttInstance = null; } } // Export default configured client (lazy initialization) const mqttService = { async getClient(config?: Partial): Promise { return getMQTTClient(config); }, getInstance: getMQTTInstance, disconnect: disconnectMQTT }; export default mqttService;