UNPKG

matterbridge-roborock-vacuum-plugin

Version:
78 lines (77 loc) 2.73 kB
import axios from 'axios'; import crypto from 'node:crypto'; import { URLSearchParams } from 'node:url'; export class RoborockAuthenticateApi { logger; axiosFactory; deviceId; username; authToken; constructor(logger, axiosFactory = axios) { this.deviceId = crypto.randomUUID(); this.axiosFactory = axiosFactory; this.logger = logger; } async loginWithUserData(username, userData) { this.loginWithAuthToken(username, userData.token); return userData; } async loginWithPassword(username, password) { const api = await this.getAPIFor(username); const response = await api.post('api/v1/login', new URLSearchParams({ username: username, password: password, needtwostepauth: 'false', }).toString()); return this.auth(username, response.data); } async getHomeDetails() { if (!this.username || !this.authToken) { return undefined; } const api = await this.getAPIFor(this.username); const response = await api.get('api/v1/getHomeDetail'); const apiResponse = response.data; if (!apiResponse.data) { throw new Error('Failed to retrieve the home details'); } return apiResponse.data; } async getAPIFor(username) { const baseUrl = await this.getBaseUrl(username); return this.apiForUser(username, baseUrl); } async getBaseUrl(username) { const api = await this.apiForUser(username); const response = await api.post('api/v1/getUrlByEmail', new URLSearchParams({ email: username, needtwostepauth: 'false', }).toString()); const apiResponse = response.data; if (!apiResponse.data) { throw new Error('Failed to retrieve base URL: ' + apiResponse.msg); } return apiResponse.data.url; } async apiForUser(username, baseUrl = 'https://usiot.roborock.com') { return this.axiosFactory.create({ baseURL: baseUrl, headers: { header_clientid: crypto.createHash('md5').update(username).update(this.deviceId).digest('base64'), Authorization: this.authToken, }, }); } auth(username, response) { const userdata = response.data; if (!userdata || !userdata.token) { throw new Error('Authentication failed: ' + response.msg + ' code: ' + response.code); } this.loginWithAuthToken(username, userdata.token); return userdata; } loginWithAuthToken(username, token) { this.username = username; this.authToken = token; } }