Skip to content

Commit 3b29626

Browse files
authored
Merge pull request #681 from codetheweb/set-fixes
More stability fixes around "set" (and "get")
2 parents 4f488ed + 960babe commit 3b29626

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

index.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,6 @@ class TuyaDevice extends EventEmitter {
392392
delete payload.data.t;
393393
}
394394

395-
if (options.shouldWaitForResponse && this._setResolver) {
396-
throw new Error('A set command is already in progress. Can not issue a second one that also should return a response.');
397-
}
398-
399395
debug('SET Payload:');
400396
debug(payload);
401397

@@ -409,10 +405,14 @@ class TuyaDevice extends EventEmitter {
409405
sequenceN
410406
});
411407

408+
// Make sure we only resolve or reject once
409+
let resolvedOrRejected = false;
410+
412411
// Queue this request and limit concurrent set requests to one
413412
return this._setQueue.add(() => pTimeout(new Promise((resolve, reject) => {
414-
// Make sure we only resolve or reject once
415-
let resolvedOrRejected = false;
413+
if (options.shouldWaitForResponse && this._setResolver) {
414+
throw new Error('A set command is already in progress. Can not issue a second one that also should return a response.');
415+
}
416416

417417
// Send request and wait for response
418418
try {
@@ -423,12 +423,14 @@ class TuyaDevice extends EventEmitter {
423423
// Send request
424424
this._send(buffer).catch(error => {
425425
if (options.shouldWaitForResponse && !resolvedOrRejected) {
426+
resolvedOrRejected = true;
426427
reject(error);
427428
}
428429
});
429430
if (options.shouldWaitForResponse) {
430431
this._setResolver = data => {
431432
if (!resolvedOrRejected) {
433+
resolvedOrRejected = true;
432434
resolve(data);
433435
}
434436
};
@@ -453,6 +455,10 @@ class TuyaDevice extends EventEmitter {
453455
'error',
454456
'Timeout waiting for status response from device id: ' + this.device.id
455457
);
458+
if (!resolvedOrRejected) {
459+
resolvedOrRejected = true;
460+
throw new Error('Timeout waiting for status response from device id: ' + this.device.id);
461+
}
456462
}));
457463
}
458464

@@ -462,7 +468,7 @@ class TuyaDevice extends EventEmitter {
462468
* wraps the entire operation in a retry.
463469
* @private
464470
* @param {Buffer} buffer buffer of data
465-
* @returns {Promise<Any>} returned data for request
471+
* @returns {Promise<any>} returned data for request
466472
*/
467473
_send(buffer) {
468474
const sequenceNo = this._currentSequenceN;
@@ -564,13 +570,19 @@ class TuyaDevice extends EventEmitter {
564570
// Automatically ask for dp_refresh so we
565571
// can emit a `dp_refresh` event as soon as possible
566572
if (this.globalOptions.issueRefreshOnConnect) {
567-
this.refresh();
573+
this.refresh().catch(error => {
574+
debug('Error refreshing on connect: ' + error);
575+
this.emit('error', error);
576+
});
568577
}
569578

570579
// Automatically ask for current state so we
571580
// can emit a `data` event as soon as possible
572581
if (this.globalOptions.issueGetOnConnect) {
573-
this.get();
582+
this.get().catch(error => {
583+
debug('Error getting on connect: ' + error);
584+
this.emit('error', error);
585+
});
574586
}
575587

576588
// Resolve

0 commit comments

Comments
 (0)