mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Ensure last mqtt node turns off the lights before closing
The mqtt-broker node disconnects when the last node using it is closed. But that node-close was not waiting for the disconnect to complete. This led to a race-condition where the using node was recreated and started trying to use the broker node whilst it was still disconnecting.
This commit is contained in:
parent
86064651af
commit
62694da7e6
@ -45,6 +45,7 @@ module.exports = function(RED) {
|
|||||||
this.brokerurl = "";
|
this.brokerurl = "";
|
||||||
this.connected = false;
|
this.connected = false;
|
||||||
this.connecting = false;
|
this.connecting = false;
|
||||||
|
this.closing = false;
|
||||||
this.options = {};
|
this.options = {};
|
||||||
this.queue = [];
|
this.queue = [];
|
||||||
this.subscriptions = {};
|
this.subscriptions = {};
|
||||||
@ -136,11 +137,17 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.deregister = function(mqttNode){
|
this.deregister = function(mqttNode,done){
|
||||||
delete node.users[mqttNode.id];
|
delete node.users[mqttNode.id];
|
||||||
if (Object.keys(node.users).length === 0) {
|
if (node.closing) {
|
||||||
node.client.end();
|
return done();
|
||||||
}
|
}
|
||||||
|
if (Object.keys(node.users).length === 0) {
|
||||||
|
if (node.client) {
|
||||||
|
return node.client.end(done);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done();
|
||||||
};
|
};
|
||||||
|
|
||||||
this.connect = function () {
|
this.connect = function () {
|
||||||
@ -274,8 +281,9 @@ module.exports = function(RED) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.on('close', function(done) {
|
this.on('close', function(done) {
|
||||||
|
this.closing = true;
|
||||||
if (this.connected) {
|
if (this.connected) {
|
||||||
this.client.on('close', function() {
|
this.client.once('close', function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
this.client.end();
|
this.client.end();
|
||||||
@ -302,6 +310,7 @@ module.exports = function(RED) {
|
|||||||
if (this.brokerConn) {
|
if (this.brokerConn) {
|
||||||
this.status({fill:"red",shape:"ring",text:"common.status.disconnected"});
|
this.status({fill:"red",shape:"ring",text:"common.status.disconnected"});
|
||||||
if (this.topic) {
|
if (this.topic) {
|
||||||
|
node.brokerConn.register(this);
|
||||||
this.brokerConn.subscribe(this.topic,2,function(topic,payload,packet) {
|
this.brokerConn.subscribe(this.topic,2,function(topic,payload,packet) {
|
||||||
if (isUtf8(payload)) { payload = payload.toString(); }
|
if (isUtf8(payload)) { payload = payload.toString(); }
|
||||||
var msg = {topic:topic,payload:payload, qos: packet.qos, retain: packet.retain};
|
var msg = {topic:topic,payload:payload, qos: packet.qos, retain: packet.retain};
|
||||||
@ -313,15 +322,14 @@ module.exports = function(RED) {
|
|||||||
if (this.brokerConn.connected) {
|
if (this.brokerConn.connected) {
|
||||||
node.status({fill:"green",shape:"dot",text:"common.status.connected"});
|
node.status({fill:"green",shape:"dot",text:"common.status.connected"});
|
||||||
}
|
}
|
||||||
node.brokerConn.register(this);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.error(RED._("mqtt.errors.not-defined"));
|
this.error(RED._("mqtt.errors.not-defined"));
|
||||||
}
|
}
|
||||||
this.on('close', function() {
|
this.on('close', function(done) {
|
||||||
if (node.brokerConn) {
|
if (node.brokerConn) {
|
||||||
node.brokerConn.unsubscribe(node.topic,node.id);
|
node.brokerConn.unsubscribe(node.topic,node.id);
|
||||||
node.brokerConn.deregister(node);
|
node.brokerConn.deregister(node,done);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@ -365,8 +373,8 @@ module.exports = function(RED) {
|
|||||||
node.status({fill:"green",shape:"dot",text:"common.status.connected"});
|
node.status({fill:"green",shape:"dot",text:"common.status.connected"});
|
||||||
}
|
}
|
||||||
node.brokerConn.register(node);
|
node.brokerConn.register(node);
|
||||||
this.on('close', function() {
|
this.on('close', function(done) {
|
||||||
node.brokerConn.deregister(node);
|
node.brokerConn.deregister(node,done);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.error(RED._("mqtt.errors.missing-config"));
|
this.error(RED._("mqtt.errors.missing-config"));
|
||||||
|
Loading…
Reference in New Issue
Block a user