diff --git a/README.md b/README.md index 81fa767..8dfc950 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # ewelink-api -> eWeLink API for Node.js +> eWeLink API for JavaScript + + +## Key features +* can run on browsers, node scripts or serverless environment +* set on/off devices +* get power consumption on devices like Sonoff POW +* listen for devices events ## Installation @@ -9,11 +16,4 @@ ## Usage -Check docs at https://ewelink-api.now.sh. - - -## Testing -1. open `test/_setup/credentials.json` and update parameters. -2. in a terminal, `npm run test` - -* Tests needs to be performed serially, so if run jest manually, add `--runInBand` parameter. \ No newline at end of file +Check docs at https://ewelink-api.now.sh \ No newline at end of file diff --git a/main.js b/main.js index 768c920..9df8ce3 100644 --- a/main.js +++ b/main.js @@ -142,6 +142,9 @@ const getDeviceMixin = require('./mixins/devices/getDeviceMixin'); const getDeviceChannelCountMixin = require('./mixins/devices/getDeviceChannelCountMixin'); const getFirmwareVersionMixin = require('./mixins/devices/getFirmwareVersionMixin'); +/* LOAD MIXINS: websocket */ +const openWebSocketMixin = require('./mixins/websocket/openWebSocketMixin'); + Object.assign( eWeLink.prototype, getDevicePowerStateMixin, @@ -169,4 +172,6 @@ Object.assign( getFirmwareVersionMixin ); +Object.assign(eWeLink.prototype, openWebSocketMixin); + module.exports = eWeLink; diff --git a/mixins/websocket/openWebSocketMixin.js b/mixins/websocket/openWebSocketMixin.js new file mode 100644 index 0000000..5e4e241 --- /dev/null +++ b/mixins/websocket/openWebSocketMixin.js @@ -0,0 +1,37 @@ +const W3CWebSocket = require('websocket').w3cwebsocket; +const WebSocketAsPromised = require('websocket-as-promised'); + +const payloads = require('../../lib/payloads'); + +const openWebSocketMixin = { + /** + * Open a socket connection to eWeLink + * and execute callback function with server message as argument + * + * @param callback + * + * @returns {Promise} + */ + async openWebSocket(callback) { + const payloadLogin = await payloads.wssLoginPayload({ + at: this.at, + apiKey: this.apiKey, + }); + + const wsp = new WebSocketAsPromised(this.getApiWebSocket(), { + createWebSocket: wss => new W3CWebSocket(wss), + }); + + wsp.onMessage.addListener(message => { + const data = JSON.parse(message); + callback(data); + }); + + await wsp.open(); + await wsp.send(payloadLogin); + + return wsp; + }, +}; + +module.exports = openWebSocketMixin; diff --git a/package-lock.json b/package-lock.json index f194a4e..962e211 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ewelink-api", - "version": "1.5.1", + "version": "1.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6fbe7d0..249167f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ewelink-api", - "version": "1.5.1", + "version": "1.6.0", "description": "eWeLink API for Node.js", "author": "Martín M.", "license": "MIT",