From 9cabe1e23a5ceafebfd459633a937eeae4817cce Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 10 Sep 2020 20:54:03 +0800 Subject: [PATCH] Fix frontend api messages pollution (#4326) --- lib/extension/frontend.js | 20 +++++++++++--------- test/frontend.test.js | 7 ++++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/extension/frontend.js b/lib/extension/frontend.js index 86f5bf78..a7d733ce 100644 --- a/lib/extension/frontend.js +++ b/lib/extension/frontend.js @@ -98,16 +98,18 @@ class Frontend extends Extension { onMQTTPublishedMessage(data) { let {topic, payload, options} = data; - // Send topic without base_topic - topic = topic.substring(this.mqttBaseTopic.length + 1); - payload = utils.parseJSON(payload, payload); - if (options.retain) { - this.retainedMessages.set(topic, payload); - } + if (topic.startsWith(`${this.mqttBaseTopic}/`)) { + // Send topic without base_topic + topic = topic.substring(this.mqttBaseTopic.length + 1); + payload = utils.parseJSON(payload, payload); + if (options.retain) { + this.retainedMessages.set(topic, payload); + } - for (const client of this.wss.clients) { - if (client.readyState === WebSocket.OPEN) { - client.send(stringify({topic, payload})); + for (const client of this.wss.clients) { + if (client.readyState === WebSocket.OPEN) { + client.send(stringify({topic, payload})); + } } } } diff --git a/test/frontend.test.js b/test/frontend.test.js index a95349fd..5032547c 100644 --- a/test/frontend.test.js +++ b/test/frontend.test.js @@ -87,6 +87,7 @@ describe('Frontend', () => { data.writeDefaultState(); settings._reRead(); settings.set(['experimental'], {new_api: true, frontend: {port: 8081}}); + settings.set(['homeassistant'], true); }); it('Start/stop', async () => { @@ -124,14 +125,14 @@ describe('Frontend', () => { await mockWS.events.connection(mockWSClient.implementation); expect(mockWSClient.implementation.send).toHaveBeenCalledTimes(9); expect(JSON.parse(mockWSClient.implementation.send.mock.calls[0])).toStrictEqual({topic: 'bridge/state', payload: 'online'}); - expect(JSON.parse(mockWSClient.implementation.send.mock.calls[8])).toStrictEqual({topic:"remote", payload:{brightness:255}}); + expect(JSON.parse(mockWSClient.implementation.send.mock.calls[8])).toStrictEqual({topic:"remote", payload:{brightness:255, update:{state: "idle"}, update_available: false}}); // Message MQTT.publish.mockClear(); mockWSClient.implementation.send.mockClear(); mockWSClient.events.message(stringify({topic: 'bulb_color/set', payload: {state: 'ON'}})) await flushPromises(); - expect(MQTT.publish).toHaveBeenCalledTimes(1); + expect(MQTT.publish).toHaveBeenCalledTimes(4); expect(MQTT.publish).toHaveBeenCalledWith( 'zigbee2mqtt/bulb_color', stringify({state: 'ON'}), @@ -140,7 +141,7 @@ describe('Frontend', () => { ); // Received message on socket - expect(mockWSClient.implementation.send).toHaveBeenCalledTimes(1); + expect(mockWSClient.implementation.send).toHaveBeenCalledTimes(4); expect(mockWSClient.implementation.send).toHaveBeenCalledWith(stringify({topic: 'bulb_color', payload: {state: 'ON'}})); // Shouldnt set when not ready