tsvesync 1.0.33 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -81,7 +81,7 @@ export declare class VeSync {
81
81
  /**
82
82
  * Login to VeSync server
83
83
  */
84
- login(): Promise<boolean>;
84
+ login(retryAttempts?: number, initialDelayMs?: number): Promise<boolean>;
85
85
  /**
86
86
  * Test if update interval has been exceeded
87
87
  */
@@ -385,30 +385,41 @@ class VeSync {
385
385
  /**
386
386
  * Login to VeSync server
387
387
  */
388
- async login() {
388
+ async login(retryAttempts = 3, initialDelayMs = 1000) {
389
389
  var _a;
390
390
  const body = helpers_1.Helpers.reqBody(this, 'login');
391
391
  logger_1.logger.debug('Login request:', {
392
392
  url: `${process.env.VESYNC_API_URL}/cloud/v1/user/login`,
393
393
  body
394
394
  });
395
- try {
396
- const [response, status] = await helpers_1.Helpers.callApi('/cloud/v1/user/login', 'post', body, {}, this);
397
- logger_1.logger.debug('Login response:', { status, response });
398
- if ((_a = response === null || response === void 0 ? void 0 : response.result) === null || _a === void 0 ? void 0 : _a.token) {
399
- this.token = response.result.token;
400
- this.accountId = response.result.accountID;
401
- this.countryCode = response.result.countryCode;
402
- this.enabled = true;
403
- return true;
395
+ for (let attempt = 0; attempt < retryAttempts; attempt++) {
396
+ try {
397
+ const [response, status] = await helpers_1.Helpers.callApi('/cloud/v1/user/login', 'post', body, {}, this);
398
+ logger_1.logger.debug('Login response:', { status, response });
399
+ if ((_a = response === null || response === void 0 ? void 0 : response.result) === null || _a === void 0 ? void 0 : _a.token) {
400
+ this.token = response.result.token;
401
+ this.accountId = response.result.accountID;
402
+ this.countryCode = response.result.countryCode;
403
+ this.enabled = true;
404
+ return true;
405
+ }
406
+ // If we reach here, login failed but didn't throw an error
407
+ const delay = initialDelayMs * Math.pow(2, attempt);
408
+ logger_1.logger.debug(`Login attempt ${attempt + 1} failed, retrying in ${delay}ms...`);
409
+ await new Promise(resolve => setTimeout(resolve, delay));
410
+ }
411
+ catch (error) {
412
+ if (attempt === retryAttempts - 1) {
413
+ logger_1.logger.error('Login error after all retry attempts:', error);
414
+ return false;
415
+ }
416
+ const delay = initialDelayMs * Math.pow(2, attempt);
417
+ logger_1.logger.debug(`Login attempt ${attempt + 1} failed with error, retrying in ${delay}ms...`, error);
418
+ await new Promise(resolve => setTimeout(resolve, delay));
404
419
  }
405
- logger_1.logger.error('Unable to login with supplied credentials');
406
- return false;
407
- }
408
- catch (error) {
409
- logger_1.logger.error('Login error:', error);
410
- return false;
411
420
  }
421
+ logger_1.logger.error('Unable to login with supplied credentials after all retry attempts');
422
+ return false;
412
423
  }
413
424
  /**
414
425
  * Test if update interval has been exceeded
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tsvesync",
3
- "version": "1.0.33",
3
+ "version": "1.0.34",
4
4
  "description": "A TypeScript library for interacting with VeSync smart home devices",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/lib/vesync.ts CHANGED
@@ -469,38 +469,52 @@ export class VeSync {
469
469
  /**
470
470
  * Login to VeSync server
471
471
  */
472
- async login(): Promise<boolean> {
472
+ async login(retryAttempts: number = 3, initialDelayMs: number = 1000): Promise<boolean> {
473
473
  const body = Helpers.reqBody(this, 'login');
474
474
  logger.debug('Login request:', {
475
475
  url: `${process.env.VESYNC_API_URL}/cloud/v1/user/login`,
476
476
  body
477
477
  });
478
478
 
479
- try {
480
- const [response, status] = await Helpers.callApi(
481
- '/cloud/v1/user/login',
482
- 'post',
483
- body,
484
- {},
485
- this
486
- );
487
-
488
- logger.debug('Login response:', { status, response });
479
+ for (let attempt = 0; attempt < retryAttempts; attempt++) {
480
+ try {
481
+ const [response, status] = await Helpers.callApi(
482
+ '/cloud/v1/user/login',
483
+ 'post',
484
+ body,
485
+ {},
486
+ this
487
+ );
488
+
489
+ logger.debug('Login response:', { status, response });
490
+
491
+ if (response?.result?.token) {
492
+ this.token = response.result.token;
493
+ this.accountId = response.result.accountID;
494
+ this.countryCode = response.result.countryCode;
495
+ this.enabled = true;
496
+ return true;
497
+ }
489
498
 
490
- if (response?.result?.token) {
491
- this.token = response.result.token;
492
- this.accountId = response.result.accountID;
493
- this.countryCode = response.result.countryCode;
494
- this.enabled = true;
495
- return true;
499
+ // If we reach here, login failed but didn't throw an error
500
+ const delay = initialDelayMs * Math.pow(2, attempt);
501
+ logger.debug(`Login attempt ${attempt + 1} failed, retrying in ${delay}ms...`);
502
+ await new Promise(resolve => setTimeout(resolve, delay));
503
+
504
+ } catch (error) {
505
+ if (attempt === retryAttempts - 1) {
506
+ logger.error('Login error after all retry attempts:', error);
507
+ return false;
508
+ }
509
+
510
+ const delay = initialDelayMs * Math.pow(2, attempt);
511
+ logger.debug(`Login attempt ${attempt + 1} failed with error, retrying in ${delay}ms...`, error);
512
+ await new Promise(resolve => setTimeout(resolve, delay));
496
513
  }
497
-
498
- logger.error('Unable to login with supplied credentials');
499
- return false;
500
- } catch (error) {
501
- logger.error('Login error:', error);
502
- return false;
503
514
  }
515
+
516
+ logger.error('Unable to login with supplied credentials after all retry attempts');
517
+ return false;
504
518
  }
505
519
 
506
520
  /**