From 82f152d624ca6228ef3bbc77d018d77e2da8a95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Mon, 26 Oct 2020 21:10:51 -0300 Subject: [PATCH] openWebSocket: use v2 API --- main.js | 5 +++++ src/mixins/index.js | 4 ++-- src/mixins/openWebSocket.js | 22 +++++++++++++++++++--- src/payloads/wssLoginPayload.js | 6 +++--- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/main.js b/main.js index 5b99219..b04ccd3 100644 --- a/main.js +++ b/main.js @@ -96,6 +96,11 @@ class eWeLink { 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 * @param device diff --git a/src/mixins/index.js b/src/mixins/index.js index ec71864..cb47833 100644 --- a/src/mixins/index.js +++ b/src/mixins/index.js @@ -13,7 +13,7 @@ const { getDevices } = require('./getDevices'); const { getFirmwareVersion } = require('./getFirmwareVersion'); const { getRegion } = require('./getRegion'); const { makeRequest } = require('./makeRequest'); -const { openWebSocket } = require('./openWebSocket'); +const openWebSocket = require('./openWebSocket'); const { saveDevicesCache } = require('./saveDevicesCache'); const { setDevicePowerState } = require('./setDevicePowerState'); const { toggleDevicePowerState } = require('./toggleDevicePowerState'); @@ -34,7 +34,7 @@ const mixins = { getFirmwareVersion, getRegion, makeRequest, - openWebSocket, + ...openWebSocket, saveDevicesCache, setDevicePowerState, toggleDevicePowerState, diff --git a/src/mixins/openWebSocket.js b/src/mixins/openWebSocket.js index 6660edc..81b0a65 100644 --- a/src/mixins/openWebSocket.js +++ b/src/mixins/openWebSocket.js @@ -1,7 +1,9 @@ +const fetch = require('node-fetch'); const W3CWebSocket = require('websocket').w3cwebsocket; const WebSocketAsPromised = require('websocket-as-promised'); const wssLoginPayload = require('../payloads/wssLoginPayload'); +const errors = require('../data/errors'); module.exports = { /** @@ -13,17 +15,20 @@ module.exports = { * @returns {Promise} */ async openWebSocket(callback, ...{ heartbeat = 120000 }) { + const dispatch = await this.getWebSocketServer(); + const WSS_URL = `wss://${dispatch.domain}:${dispatch.port}/api/ws`; + const payloadLogin = wssLoginPayload({ at: this.at, apiKey: this.apiKey, appid: this.APP_ID, }); - const wsp = new WebSocketAsPromised(this.getApiWebSocket(), { - createWebSocket: wss => new W3CWebSocket(wss), + const wsp = new WebSocketAsPromised(WSS_URL, { + createWebSocket: (wss) => new W3CWebSocket(wss), }); - wsp.onMessage.addListener(message => { + wsp.onMessage.addListener((message) => { try { const data = JSON.parse(message); callback(data); @@ -41,4 +46,15 @@ module.exports = { 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(); + }, }; diff --git a/src/payloads/wssLoginPayload.js b/src/payloads/wssLoginPayload.js index 034ee99..eb082f2 100644 --- a/src/payloads/wssLoginPayload.js +++ b/src/payloads/wssLoginPayload.js @@ -3,14 +3,14 @@ const { timestamp, nonce } = require('../helpers/utilities'); const wssLoginPayload = ({ at, apiKey, appid }) => { const payload = { action: 'userOnline', + version: 8, + ts: timestamp, at, + userAgent: 'app', apikey: apiKey, appid, nonce, - ts: timestamp, - userAgent: 'app', sequence: Math.floor(timestamp * 1000), - version: 8, }; return JSON.stringify(payload);