UNPKG

matterbridge-roborock-vacuum-plugin

Version:
45 lines 2.24 kB
import { MessageDispatcherFactory } from '../roborockCommunication/protocol/dispatcher/dispatcherFactory.js'; import { ClientRouter } from '../roborockCommunication/routing/clientRouter.js'; import { LoggingMessageListener } from './loggingMessageListener.js'; import { CONNECT_POLL_MS, CONNECT_TIMEOUT_MS } from './types.js'; async function waitForConnection(clientRouter) { const deadline = Date.now() + CONNECT_TIMEOUT_MS; while (Date.now() < deadline) { if (clientRouter.isReady() && clientRouter.isConnected()) return; await new Promise((r) => setTimeout(r, CONNECT_POLL_MS)); } throw new Error('MQTT connection timeout'); } async function waitForLocalConnection(client) { const deadline = Date.now() + CONNECT_TIMEOUT_MS; while (Date.now() < deadline) { if (client.isReady()) return; await new Promise((r) => setTimeout(r, CONNECT_POLL_MS)); } throw new Error('Local connection timeout'); } export async function connectDevice(duid, session, logger, local = false) { const device = session.devices.find((d) => d.duid === duid); if (!device) throw new Error(`Device not found: ${duid}`); const clientRouter = new ClientRouter(logger, session.userData); clientRouter.registerDevice(duid, device.localKey, device.pv, undefined); clientRouter.registerMessageListener(new LoggingMessageListener(duid, logger)); clientRouter.connect(); await waitForConnection(clientRouter); const dispatcher = new MessageDispatcherFactory(clientRouter, logger).getMessageDispatcher(device.specs.protocol, device.specs.model); if (local) { const info = await dispatcher.getNetworkInfo(duid); if (!info?.ip) throw new Error('Could not get device IP address for local connection'); console.log(`Connecting locally to ${info.ip}...`); const localClient = clientRouter.registerClient(duid, info.ip); localClient.connect(); await waitForLocalConnection(localClient); } console.log(`Connected via: ${local ? 'local network' : 'MQTT'} | dispatcher: ${dispatcher.dispatcherName}`); return { clientRouter, dispatcher }; } //# sourceMappingURL=connection.js.map