openWebSocket: use v2 API

This commit is contained in:
Martín M
2020-10-26 21:10:51 -03:00
parent 08e84b5fea
commit 82f152d624
4 changed files with 29 additions and 8 deletions

View File

@@ -96,6 +96,11 @@ class eWeLink {
return `wss://${this.region}-pconnect3.coolkit.cc:8080/api/ws`; return `wss://${this.region}-pconnect3.coolkit.cc:8080/api/ws`;
} }
getDispatchServiceUrl() {
const domain = this.region === 'cn' ? 'cn' : 'cc';
return `https://${this.region}-dispa.coolkit.${domain}`;
}
/** /**
* Generate Zeroconf URL * Generate Zeroconf URL
* @param device * @param device

View File

@@ -13,7 +13,7 @@ const { getDevices } = require('./getDevices');
const { getFirmwareVersion } = require('./getFirmwareVersion'); const { getFirmwareVersion } = require('./getFirmwareVersion');
const { getRegion } = require('./getRegion'); const { getRegion } = require('./getRegion');
const { makeRequest } = require('./makeRequest'); const { makeRequest } = require('./makeRequest');
const { openWebSocket } = require('./openWebSocket'); const openWebSocket = require('./openWebSocket');
const { saveDevicesCache } = require('./saveDevicesCache'); const { saveDevicesCache } = require('./saveDevicesCache');
const { setDevicePowerState } = require('./setDevicePowerState'); const { setDevicePowerState } = require('./setDevicePowerState');
const { toggleDevicePowerState } = require('./toggleDevicePowerState'); const { toggleDevicePowerState } = require('./toggleDevicePowerState');
@@ -34,7 +34,7 @@ const mixins = {
getFirmwareVersion, getFirmwareVersion,
getRegion, getRegion,
makeRequest, makeRequest,
openWebSocket, ...openWebSocket,
saveDevicesCache, saveDevicesCache,
setDevicePowerState, setDevicePowerState,
toggleDevicePowerState, toggleDevicePowerState,

View File

@@ -1,7 +1,9 @@
const fetch = require('node-fetch');
const W3CWebSocket = require('websocket').w3cwebsocket; const W3CWebSocket = require('websocket').w3cwebsocket;
const WebSocketAsPromised = require('websocket-as-promised'); const WebSocketAsPromised = require('websocket-as-promised');
const wssLoginPayload = require('../payloads/wssLoginPayload'); const wssLoginPayload = require('../payloads/wssLoginPayload');
const errors = require('../data/errors');
module.exports = { module.exports = {
/** /**
@@ -13,17 +15,20 @@ module.exports = {
* @returns {Promise<WebSocketAsPromised>} * @returns {Promise<WebSocketAsPromised>}
*/ */
async openWebSocket(callback, ...{ heartbeat = 120000 }) { async openWebSocket(callback, ...{ heartbeat = 120000 }) {
const dispatch = await this.getWebSocketServer();
const WSS_URL = `wss://${dispatch.domain}:${dispatch.port}/api/ws`;
const payloadLogin = wssLoginPayload({ const payloadLogin = wssLoginPayload({
at: this.at, at: this.at,
apiKey: this.apiKey, apiKey: this.apiKey,
appid: this.APP_ID, appid: this.APP_ID,
}); });
const wsp = new WebSocketAsPromised(this.getApiWebSocket(), { const wsp = new WebSocketAsPromised(WSS_URL, {
createWebSocket: wss => new W3CWebSocket(wss), createWebSocket: (wss) => new W3CWebSocket(wss),
}); });
wsp.onMessage.addListener(message => { wsp.onMessage.addListener((message) => {
try { try {
const data = JSON.parse(message); const data = JSON.parse(message);
callback(data); callback(data);
@@ -41,4 +46,15 @@ module.exports = {
return wsp; return wsp;
}, },
async getWebSocketServer() {
const requestUrl = this.getDispatchServiceUrl();
const request = await fetch(`${requestUrl}/dispatch/app`);
if (!request.ok) {
throw new Error(`[${request.status}] ${errors[request.status]}`);
}
return request.json();
},
}; };

View File

@@ -3,14 +3,14 @@ const { timestamp, nonce } = require('../helpers/utilities');
const wssLoginPayload = ({ at, apiKey, appid }) => { const wssLoginPayload = ({ at, apiKey, appid }) => {
const payload = { const payload = {
action: 'userOnline', action: 'userOnline',
version: 8,
ts: timestamp,
at, at,
userAgent: 'app',
apikey: apiKey, apikey: apiKey,
appid, appid,
nonce, nonce,
ts: timestamp,
userAgent: 'app',
sequence: Math.floor(timestamp * 1000), sequence: Math.floor(timestamp * 1000),
version: 8,
}; };
return JSON.stringify(payload); return JSON.stringify(payload);