Skip to content

Commit 4494c52

Browse files
committed
Allow multiple listeners for a single topic
1 parent e42977a commit 4494c52

3 files changed

Lines changed: 26 additions & 21 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"displayName": "Homebridge Easy MQTT",
55
"description": "Homebridge plugin for easy control of MQTT devices",
66
"type": "module",
7-
"version": "1.3.0-beta.0",
7+
"version": "1.3.0-beta.1",
88
"homepage": "https://github.com/mpatfield/homebridge-easy-mqtt#readme",
99
"repository": {
1010
"type": "git",

src/model/mqtt.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class MQTT {
5656
private isReconnecting = false;
5757
private reconnectCount = 0;
5858

59-
private listeners = new Map<string, MQTTListener>();
59+
private listeners = new Map<string, MQTTListener[]>();
6060

6161
constructor(
6262
private readonly log: Log,
@@ -124,7 +124,9 @@ export class MQTT {
124124

125125
this.client.subscribe(mqttListener.topic.base);
126126

127-
this.listeners.set(mqttListener.topic.base, mqttListener);
127+
const topicListeners = this.listeners.get(mqttListener.topic.base) ?? [];
128+
topicListeners.push(mqttListener);
129+
this.listeners.set(mqttListener.topic.base, topicListeners);
128130
}
129131

130132
publish(rawTopic: string, value: PrimitiveTypes): void {
@@ -172,33 +174,36 @@ export class MQTT {
172174

173175
this.log.ifVerbose(strings.mqtt.receivedMessage, this.caller, topic, message);
174176

175-
const listener = this.listeners.get(topic);
176-
if (!listener) {
177+
const listeners = this.listeners.get(topic);
178+
if (!listeners || listeners.length === 0) {
177179
this.log.ifVerbose(strings.mqtt.noListeners, this.caller, topic);
178180
return;
179181
}
180182

181-
let value;
182-
if (message.startsWith('{')) {
183+
for (const listener of listeners) {
183184

184-
value = JSON.parse(message);
185+
let value;
186+
if (message.startsWith('{')) {
185187

186-
for (const pathPart of listener.topic.jsonPath) {
187-
if (value && typeof value === 'object' && pathPart in value) {
188-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
189-
value = (value as any)[pathPart];
190-
} else {
191-
value = undefined;
192-
break;
188+
value = JSON.parse(message);
189+
190+
for (const pathPart of listener.topic.jsonPath) {
191+
if (value && typeof value === 'object' && pathPart in value) {
192+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
193+
value = (value as any)[pathPart];
194+
} else {
195+
value = undefined;
196+
break;
197+
}
193198
}
199+
200+
} else {
201+
value = message;
194202
}
195203

196-
} else {
197-
value = message;
204+
listener.handler(topic, toPrimitive(value));
198205
}
199206

200-
listener.handler(topic, toPrimitive(value));
201-
202207
} catch (e) {
203208
this.log.error(strings.mqtt.parseFailed, this.caller, `\n${message}`);
204209
}

0 commit comments

Comments
 (0)