// BLE Service entry point import * as Device from 'expo-device'; import { IBLEManager } from './types'; // Determine if BLE is available (real device vs simulator) export const isBLEAvailable = Device.isDevice; // Lazy singleton - only create BLEManager when first accessed let _bleManager: IBLEManager | null = null; function getBLEManager(): IBLEManager { if (!_bleManager) { // Dynamic import to prevent crash on Android startup if (isBLEAvailable) { // eslint-disable-next-line @typescript-eslint/no-require-imports const { RealBLEManager } = require('./BLEManager'); _bleManager = new RealBLEManager(); } else { // eslint-disable-next-line @typescript-eslint/no-require-imports const { MockBLEManager } = require('./MockBLEManager'); _bleManager = new MockBLEManager(); } } return _bleManager!; // Non-null assertion - we just assigned it above } // Proxy object that lazily initializes the real manager export const bleManager: IBLEManager = { scanDevices: () => getBLEManager().scanDevices(), stopScan: () => getBLEManager().stopScan(), connectDevice: (deviceId: string) => getBLEManager().connectDevice(deviceId), disconnectDevice: (deviceId: string) => getBLEManager().disconnectDevice(deviceId), isDeviceConnected: (deviceId: string) => getBLEManager().isDeviceConnected(deviceId), getConnectionState: (deviceId: string) => getBLEManager().getConnectionState(deviceId), getAllConnections: () => getBLEManager().getAllConnections(), addEventListener: (listener) => getBLEManager().addEventListener(listener), removeEventListener: (listener) => getBLEManager().removeEventListener(listener), sendCommand: (deviceId: string, command: string) => getBLEManager().sendCommand(deviceId, command), getWiFiList: (deviceId: string) => getBLEManager().getWiFiList(deviceId), setWiFi: (deviceId: string, ssid: string, password: string) => getBLEManager().setWiFi(deviceId, ssid, password), getCurrentWiFi: (deviceId: string) => getBLEManager().getCurrentWiFi(deviceId), rebootDevice: (deviceId: string) => getBLEManager().rebootDevice(deviceId), cleanup: () => getBLEManager().cleanup(), getSensorHealth: (wellId: number, mac: string) => getBLEManager().getSensorHealth(wellId, mac), getAllSensorHealth: () => getBLEManager().getAllSensorHealth(), bulkDisconnect: (deviceIds: string[]) => getBLEManager().bulkDisconnect(deviceIds), bulkReboot: (deviceIds: string[]) => getBLEManager().bulkReboot(deviceIds), bulkSetWiFi: (devices, ssid, password, onProgress) => getBLEManager().bulkSetWiFi(devices, ssid, password, onProgress), // Reconnect functionality setReconnectConfig: (config) => getBLEManager().setReconnectConfig(config), getReconnectConfig: () => getBLEManager().getReconnectConfig(), enableAutoReconnect: (deviceId, deviceName) => getBLEManager().enableAutoReconnect(deviceId, deviceName), disableAutoReconnect: (deviceId) => getBLEManager().disableAutoReconnect(deviceId), manualReconnect: (deviceId) => getBLEManager().manualReconnect(deviceId), getReconnectState: (deviceId) => getBLEManager().getReconnectState(deviceId), getAllReconnectStates: () => getBLEManager().getAllReconnectStates(), cancelReconnect: (deviceId) => getBLEManager().cancelReconnect(deviceId), }; // Re-export types export * from './types'; // Re-export permission utilities export * from './permissions'; // Re-export error types and utilities export * from './errors';