Skip to content

Commit 58bc048

Browse files
committed
improve clientHttp disconnect
1 parent ac4b2cf commit 58bc048

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

arduino-cloud.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ module.exports = function (RED) {
5757
if (config.thing !== "" && config.property !== "") {
5858
this.arduinoRestClient = await connectionManager.getClientHttp(connectionConfig);
5959
if (this.arduinoRestClient){
60+
this.arduinoRestClient.openConnections++;
6061
this.thing = config.thing;
6162
this.propertyId = config.property;
6263
this.propertyName = config.name;
@@ -73,8 +74,8 @@ module.exports = function (RED) {
7374
this.status({ fill: "red", shape: "dot", text: "Error setting value" });
7475
}
7576
});
76-
this.on('close', function () {
77-
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid);
77+
this.on('close', function (done) {
78+
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid).then(() => { done(); });
7879
});
7980
}else{
8081
this.status({ fill: "red", shape: "ring", text: "Connection Error" });
@@ -100,6 +101,7 @@ module.exports = function (RED) {
100101
try {
101102
this.arduinoRestClient = await connectionManager.getClientHttp(connectionConfig);
102103
if (this.arduinoRestClient){
104+
this.arduinoRestClient.openConnections++;
103105
if (config.thing !== "" && config.property !== "") {
104106
this.thing = config.thing;
105107
this.propertyId = config.property;
@@ -135,8 +137,8 @@ module.exports = function (RED) {
135137
}
136138
});
137139

138-
this.on('close', function () {
139-
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid);
140+
this.on('close', function (done) {
141+
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid).then(() => { done(); });
140142
});
141143
}
142144
}else{
@@ -162,15 +164,16 @@ module.exports = function (RED) {
162164
try {
163165
this.arduinoRestClient = await connectionManager.getClientHttp(connectionConfig);
164166
if (this.arduinoRestClient){
167+
this.arduinoRestClient.openConnections++;
165168
if (config.thing !== "" && config.property !== "") {
166169
this.thing = config.thing;
167170
this.propertyId = config.property;
168171
this.propertyName = config.name;
169172
const pollTime = this.timeWindowCount * this.timeWindowUnit;
170173
if (pollTime !== null && pollTime !== "" && pollTime !== undefined && Number.isInteger(parseInt(pollTime)) && parseInt(pollTime) !== 0) {
171174
this.poll(connectionConfig, pollTime);
172-
this.on('close', function () {
173-
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid);
175+
this.on('close', function (done) {
176+
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid).then(() => { done(); });
174177
if (this.pollTimeoutPoll)
175178
clearTimeout(this.pollTimeoutPoll);
176179

@@ -224,6 +227,7 @@ module.exports = function (RED) {
224227
if (config.thing !== "" && config.property !== "") {
225228
this.arduinoRestClient = await connectionManager.getClientHttp(connectionConfig);
226229
if (this.arduinoRestClient){
230+
this.arduinoRestClient.openConnections++;
227231
this.thing = config.thing;
228232
this.propertyId = config.property;
229233
this.propertyName = config.name;
@@ -243,8 +247,8 @@ module.exports = function (RED) {
243247
else
244248
this.status({});
245249
});
246-
this.on('close', function () {
247-
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid);
250+
this.on('close', function (done) {
251+
connectionManager.deleteClientHttp(connectionConfig.credentials.clientid).then(() => { done(); });
248252
});
249253
}else{
250254
this.status({ fill: "red", shape: "ring", text: "Connection Error" });

utils/arduino-cloud-api-wrapper.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ const apiProperties = new ArduinoIotClient.PropertiesV2Api(client);
2828
const apiSeries = new ArduinoIotClient.SeriesV2Api(client);
2929
const apiThings = new ArduinoIotClient.ThingsV2Api(client);
3030

31-
class ArduinClientHttp {
31+
class ArduinoClientHttp {
3232
constructor(token) {
3333
this.token = token;
34-
34+
this.openConnections=0;
3535
if(process.env.API_BASE_PATH){
3636
client.basePath = process.env.API_BASE_PATH;
3737
}
@@ -74,4 +74,4 @@ class ArduinClientHttp {
7474
return apiSeries.seriesV2BatchQueryRaw(body);
7575
}
7676
}
77-
exports.ArduinClientHttp = ArduinClientHttp;
77+
exports.ArduinoClientHttp = ArduinoClientHttp;

utils/arduino-connection-manager.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const request = require("async-request");
2-
const ArduinClientHttp = require('./arduino-cloud-api-wrapper');
2+
const ArduinoClientHttp = require('./arduino-cloud-api-wrapper');
33
const ArduinoClientMqtt = require ('../arduino-iot-client-mqtt/arduino-iot-client-mqtt');
44
const accessTokenUri = process.env.NODE_RED_ACCESS_TOKEN_URI || 'https://login.arduino.cc/oauth/token';
55
const accessTokenAudience = process.env.NODE_RED_ACCESS_TOKEN_AUDIENCE || 'https://api2.arduino.cc/iot';
@@ -129,7 +129,8 @@ async function getClientHttp(connectionConfig){
129129

130130
var tokenInfo = await getToken(connectionConfig);
131131
if(tokenInfo !==undefined){
132-
clientHttp= new ArduinClientHttp.ArduinClientHttp(tokenInfo.token);
132+
clientHttp= new ArduinoClientHttp.ArduinoClientHttp(tokenInfo.token);
133+
133134
var timeout = setTimeout(() => { updateToken(connectionConfig) }, tokenInfo.expires_in * 1000);
134135
connections.push({
135136
clientId: connectionConfig.credentials.clientid,
@@ -147,11 +148,12 @@ async function getClientHttp(connectionConfig){
147148
if(connections[user].clientHttp !== null){
148149
clientHttp = connections[user].clientHttp;
149150
}else{
150-
clientHttp = new ArduinClientHttp.ArduinClientHttp(connections[user].token);
151+
clientHttp = new ArduinoClientHttp.ArduinoClientHttp(connections[user].token);
151152

152153
connections[user].clientHttp=clientHttp;
153154
}
154155
}
156+
155157
releaseMutex();
156158
return clientHttp;
157159
}catch(err){
@@ -214,18 +216,23 @@ async function deleteClientMqtt(clientId, thing, propertyName ){
214216
releaseMutex();
215217
}
216218

217-
function deleteClientHttp(clientId){
219+
async function deleteClientHttp(clientId){
220+
const releaseMutex = await getClientMutex.acquire();
218221
var user = findUser(clientId);
219222
if(user !== -1){
220223
if(connections[user].clientHttp !== null){
221-
connections[user].clientHttp= null;
224+
connections[user].clientHttp.openConnections--;
225+
if(connections[user].clientHttp.openConnections === 0){
226+
connections[user].clientHttp= null;
227+
}
222228
}
223229
if(connections[user].clientMqtt === null){
224230
if(connections[user].timeoutUpdateToken)
225231
clearTimeout(connections[user].timeoutUpdateToken);
226232
connections.splice(user,1);
227233
}
228234
}
235+
releaseMutex();
229236
}
230237

231238
async function reconnectMqtt(clientId){

0 commit comments

Comments
 (0)