matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
78 lines (77 loc) • 2.73 kB
JavaScript
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;
}
}