@@ -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