homebridge-cync-app 0.1.6 → 0.1.7

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.
package/dist/platform.js CHANGED
@@ -2,6 +2,7 @@ import { PLATFORM_NAME } from './settings.js';
2
2
  import { CyncClient } from './cync/cync-client.js';
3
3
  import { ConfigClient } from './cync/config-client.js';
4
4
  import { TcpClient } from './cync/tcp-client.js';
5
+ import { lookupDeviceModel } from './cync/device-catalog.js';
5
6
  const toCyncLogger = (log) => ({
6
7
  debug: log.debug.bind(log),
7
8
  info: log.info.bind(log),
@@ -63,6 +64,23 @@ function hsvToRgb(hue, saturation, value) {
63
64
  b: Math.round(b * 255),
64
65
  };
65
66
  }
67
+ function resolveDeviceType(device) {
68
+ const typedDevice = device;
69
+ if (typeof typedDevice.device_type === 'number') {
70
+ return typedDevice.device_type;
71
+ }
72
+ const rawType = typedDevice.raw?.deviceType;
73
+ if (typeof rawType === 'number') {
74
+ return rawType;
75
+ }
76
+ if (typeof rawType === 'string' && rawType.trim() !== '') {
77
+ const parsed = Number(rawType.trim());
78
+ if (!Number.isNaN(parsed)) {
79
+ return parsed;
80
+ }
81
+ }
82
+ return undefined;
83
+ }
66
84
  export class CyncAppPlatform {
67
85
  accessories = [];
68
86
  configureAccessory(accessory) {
@@ -76,6 +94,36 @@ export class CyncAppPlatform {
76
94
  tcpClient;
77
95
  cloudConfig = null;
78
96
  deviceIdToAccessory = new Map();
97
+ deviceLastSeen = new Map();
98
+ devicePollTimers = new Map();
99
+ offlineTimeoutMs = 5 * 60 * 1000; // 5 minutes
100
+ pollIntervalMs = 60_000; // 60 seconds
101
+ markDeviceSeen(deviceId) {
102
+ this.deviceLastSeen.set(deviceId, Date.now());
103
+ }
104
+ isDeviceProbablyOffline(deviceId) {
105
+ const last = this.deviceLastSeen.get(deviceId);
106
+ if (!last) {
107
+ // No data yet; treat as online until we know better
108
+ return false;
109
+ }
110
+ return Date.now() - last > this.offlineTimeoutMs;
111
+ }
112
+ startPollingDevice(deviceId) {
113
+ // For now this is just a placeholder hook. We keep a timer per device so
114
+ // you can later add a real poll (e.g. TCP “ping” or cloud get) here if you want.
115
+ const existing = this.devicePollTimers.get(deviceId);
116
+ if (existing) {
117
+ clearInterval(existing);
118
+ }
119
+ const timer = setInterval(() => {
120
+ // Optional future hook:
121
+ // - Call a "getDeviceState" or similar on tcpClient/client
122
+ // - On success, call this.markDeviceSeen(deviceId)
123
+ // - On failure, optionally log or mark offline
124
+ }, this.pollIntervalMs);
125
+ this.devicePollTimers.set(deviceId, timer);
126
+ }
79
127
  handleLanUpdate(update) {
80
128
  // Parsed 0x83 frames from TcpClient.parseLanSwitchUpdate look like:
81
129
  // { controllerId: number, deviceId?: string, on: boolean, level: number }
@@ -84,6 +132,7 @@ export class CyncAppPlatform {
84
132
  return;
85
133
  }
86
134
  const accessory = this.deviceIdToAccessory.get(payload.deviceId);
135
+ this.markDeviceSeen(payload.deviceId);
87
136
  if (!accessory) {
88
137
  this.log.debug('Cync: LAN update for unknown deviceId=%s; no accessory mapping', payload.deviceId);
89
138
  return;
@@ -127,6 +176,7 @@ export class CyncAppPlatform {
127
176
  this.log.info('Cync: removing stale Lightbulb service from %s (deviceId=%s) before configuring as Switch', deviceName, deviceId);
128
177
  accessory.removeService(existingLight);
129
178
  }
179
+ this.applyAccessoryInformationFromCyncDevice(accessory, device, deviceName, deviceId);
130
180
  // Ensure context is initialized
131
181
  const ctx = accessory.context;
132
182
  ctx.cync = ctx.cync ?? {
@@ -137,9 +187,14 @@ export class CyncAppPlatform {
137
187
  };
138
188
  // Remember mapping for LAN updates
139
189
  this.deviceIdToAccessory.set(deviceId, accessory);
190
+ this.markDeviceSeen(deviceId);
191
+ this.startPollingDevice(deviceId);
140
192
  service
141
193
  .getCharacteristic(this.api.hap.Characteristic.On)
142
194
  .onGet(() => {
195
+ if (this.isDeviceProbablyOffline(deviceId)) {
196
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
197
+ }
143
198
  const currentOn = !!ctx.cync?.on;
144
199
  this.log.info('Cync: On.get -> %s for %s (deviceId=%s)', String(currentOn), deviceName, deviceId);
145
200
  return currentOn;
@@ -194,11 +249,16 @@ export class CyncAppPlatform {
194
249
  };
195
250
  // Remember mapping for LAN updates
196
251
  this.deviceIdToAccessory.set(deviceId, accessory);
252
+ this.markDeviceSeen(deviceId);
253
+ this.startPollingDevice(deviceId);
197
254
  const Characteristic = this.api.hap.Characteristic;
198
255
  // ----- On/Off -----
199
256
  service
200
257
  .getCharacteristic(Characteristic.On)
201
258
  .onGet(() => {
259
+ if (this.isDeviceProbablyOffline(deviceId)) {
260
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
261
+ }
202
262
  const currentOn = !!ctx.cync?.on;
203
263
  this.log.info('Cync: Light On.get -> %s for %s (deviceId=%s)', String(currentOn), deviceName, deviceId);
204
264
  return currentOn;
@@ -213,12 +273,22 @@ export class CyncAppPlatform {
213
273
  this.log.info('Cync: Light On.set -> %s for %s (deviceId=%s)', String(on), deviceName, cyncMeta.deviceId);
214
274
  // Optimistic local cache; LAN update will confirm
215
275
  cyncMeta.on = on;
216
- await this.tcpClient.setSwitchState(cyncMeta.deviceId, { on });
276
+ try {
277
+ await this.tcpClient.setSwitchState(cyncMeta.deviceId, { on });
278
+ this.markDeviceSeen(cyncMeta.deviceId);
279
+ }
280
+ catch (err) {
281
+ this.log.warn('Cync: Light On.set failed for %s (deviceId=%s): %s', deviceName, cyncMeta.deviceId, err.message ?? String(err));
282
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
283
+ }
217
284
  });
218
285
  // ----- Brightness (dimming via LAN combo_control) -----
219
286
  service
220
287
  .getCharacteristic(Characteristic.Brightness)
221
288
  .onGet(() => {
289
+ if (this.isDeviceProbablyOffline(deviceId)) {
290
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
291
+ }
222
292
  const current = ctx.cync?.brightness;
223
293
  // If we have a cached LAN level, use it; otherwise infer from On.
224
294
  if (typeof current === 'number') {
@@ -242,19 +312,29 @@ export class CyncAppPlatform {
242
312
  cyncMeta.brightness = brightness;
243
313
  cyncMeta.on = brightness > 0;
244
314
  this.log.info('Cync: Light Brightness.set -> %d for %s (deviceId=%s)', brightness, deviceName, cyncMeta.deviceId);
245
- // If we're in "color mode", keep the existing RGB and scale brightness via setColor();
246
- // otherwise treat this as a white-brightness change.
247
- if (cyncMeta.colorActive && cyncMeta.rgb) {
248
- await this.tcpClient.setColor(cyncMeta.deviceId, cyncMeta.rgb, brightness);
315
+ try {
316
+ // If we're in "color mode", keep the existing RGB and scale brightness via setColor();
317
+ // otherwise treat this as a white-brightness change.
318
+ if (cyncMeta.colorActive && cyncMeta.rgb) {
319
+ await this.tcpClient.setColor(cyncMeta.deviceId, cyncMeta.rgb, brightness);
320
+ }
321
+ else {
322
+ await this.tcpClient.setBrightness(cyncMeta.deviceId, brightness);
323
+ }
324
+ this.markDeviceSeen(cyncMeta.deviceId);
249
325
  }
250
- else {
251
- await this.tcpClient.setBrightness(cyncMeta.deviceId, brightness);
326
+ catch (err) {
327
+ this.log.warn('Cync: Light Brightness.set failed for %s (deviceId=%s): %s', deviceName, cyncMeta.deviceId, err.message ?? String(err));
328
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
252
329
  }
253
330
  });
254
331
  // ----- Hue -----
255
332
  service
256
333
  .getCharacteristic(Characteristic.Hue)
257
334
  .onGet(() => {
335
+ if (this.isDeviceProbablyOffline(deviceId)) {
336
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
337
+ }
258
338
  const hue = ctx.cync?.hue;
259
339
  if (typeof hue === 'number') {
260
340
  return hue;
@@ -274,12 +354,8 @@ export class CyncAppPlatform {
274
354
  return;
275
355
  }
276
356
  // Use cached saturation/brightness if available, otherwise sane defaults
277
- const saturation = typeof cyncMeta.saturation === 'number'
278
- ? cyncMeta.saturation
279
- : 100;
280
- const brightness = typeof cyncMeta.brightness === 'number'
281
- ? cyncMeta.brightness
282
- : 100;
357
+ const saturation = typeof cyncMeta.saturation === 'number' ? cyncMeta.saturation : 100;
358
+ const brightness = typeof cyncMeta.brightness === 'number' ? cyncMeta.brightness : 100;
283
359
  const rgb = hsvToRgb(hue, saturation, brightness);
284
360
  // Optimistic cache
285
361
  cyncMeta.hue = hue;
@@ -289,12 +365,22 @@ export class CyncAppPlatform {
289
365
  cyncMeta.on = brightness > 0;
290
366
  cyncMeta.brightness = brightness;
291
367
  this.log.info('Cync: Light Hue.set -> %d for %s (deviceId=%s) -> rgb=(%d,%d,%d) brightness=%d', hue, deviceName, cyncMeta.deviceId, rgb.r, rgb.g, rgb.b, brightness);
292
- await this.tcpClient.setColor(cyncMeta.deviceId, rgb, brightness);
368
+ try {
369
+ await this.tcpClient.setColor(cyncMeta.deviceId, rgb, brightness);
370
+ this.markDeviceSeen(cyncMeta.deviceId);
371
+ }
372
+ catch (err) {
373
+ this.log.warn('Cync: Light Hue.set failed for %s (deviceId=%s): %s', deviceName, cyncMeta.deviceId, err.message ?? String(err));
374
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
375
+ }
293
376
  });
294
377
  // ----- Saturation -----
295
378
  service
296
379
  .getCharacteristic(Characteristic.Saturation)
297
380
  .onGet(() => {
381
+ if (this.isDeviceProbablyOffline(deviceId)) {
382
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
383
+ }
298
384
  const sat = ctx.cync?.saturation;
299
385
  if (typeof sat === 'number') {
300
386
  return sat;
@@ -312,12 +398,8 @@ export class CyncAppPlatform {
312
398
  this.log.warn('Cync: Light Saturation.set received invalid value=%o for %s (deviceId=%s)', value, deviceName, cyncMeta.deviceId);
313
399
  return;
314
400
  }
315
- const hue = typeof cyncMeta.hue === 'number'
316
- ? cyncMeta.hue
317
- : 0;
318
- const brightness = typeof cyncMeta.brightness === 'number'
319
- ? cyncMeta.brightness
320
- : 100;
401
+ const hue = typeof cyncMeta.hue === 'number' ? cyncMeta.hue : 0;
402
+ const brightness = typeof cyncMeta.brightness === 'number' ? cyncMeta.brightness : 100;
321
403
  const rgb = hsvToRgb(hue, saturation, brightness);
322
404
  // Optimistic cache
323
405
  cyncMeta.hue = hue;
@@ -327,7 +409,14 @@ export class CyncAppPlatform {
327
409
  cyncMeta.on = brightness > 0;
328
410
  cyncMeta.brightness = brightness;
329
411
  this.log.info('Cync: Light Saturation.set -> %d for %s (deviceId=%s) -> rgb=(%d,%d,%d) brightness=%d', saturation, deviceName, cyncMeta.deviceId, rgb.r, rgb.g, rgb.b, brightness);
330
- await this.tcpClient.setColor(cyncMeta.deviceId, rgb, brightness);
412
+ try {
413
+ await this.tcpClient.setColor(cyncMeta.deviceId, rgb, brightness);
414
+ this.markDeviceSeen(cyncMeta.deviceId);
415
+ }
416
+ catch (err) {
417
+ this.log.warn('Cync: Light Saturation.set failed for %s (deviceId=%s): %s', deviceName, cyncMeta.deviceId, err.message ?? String(err));
418
+ throw new this.api.hap.HapStatusError(-70402 /* this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
419
+ }
331
420
  });
332
421
  }
333
422
  applyAccessoryInformationFromCyncDevice(accessory, device, deviceName, deviceId) {
@@ -343,14 +432,34 @@ export class CyncAppPlatform {
343
432
  infoService.updateCharacteristic(Characteristic.Name, name);
344
433
  // Manufacturer: fixed for all Cync devices
345
434
  infoService.updateCharacteristic(Characteristic.Manufacturer, 'GE Lighting');
346
- // Model: use the device's displayName + type if available
347
- const modelBase = typeof rawDevice.displayName === 'string' && rawDevice.displayName.trim().length > 0
348
- ? rawDevice.displayName.trim()
349
- : 'Cync Device';
350
- const modelSuffix = typeof rawDevice.deviceType === 'number'
351
- ? ` (Type ${rawDevice.deviceType})`
352
- : '';
353
- infoService.updateCharacteristic(Characteristic.Model, modelBase + modelSuffix);
435
+ // Model: prefer catalog entry (Cync app-style model name), fall back to raw info
436
+ const resolvedType = resolveDeviceType(device);
437
+ const catalogEntry = typeof resolvedType === 'number'
438
+ ? lookupDeviceModel(resolvedType)
439
+ : undefined;
440
+ let model;
441
+ if (catalogEntry) {
442
+ // Use the Cync app-style model name
443
+ model = catalogEntry.modelName;
444
+ // Persist for debugging / future use
445
+ const ctx = accessory.context;
446
+ ctx.deviceType = resolvedType;
447
+ ctx.modelName = catalogEntry.modelName;
448
+ if (catalogEntry.marketingName) {
449
+ ctx.marketingName = catalogEntry.marketingName;
450
+ }
451
+ }
452
+ else {
453
+ // Fallback: use device displayName + type
454
+ const modelBase = typeof rawDevice.displayName === 'string' && rawDevice.displayName.trim().length > 0
455
+ ? rawDevice.displayName.trim()
456
+ : 'Cync Device';
457
+ const modelSuffix = typeof resolvedType === 'number'
458
+ ? ` (Type ${resolvedType})`
459
+ : '';
460
+ model = modelBase + modelSuffix;
461
+ }
462
+ infoService.updateCharacteristic(Characteristic.Model, model);
354
463
  // Serial: prefer wifiMac, then mac, then deviceID, then the string deviceId
355
464
  const serial = (typeof rawDevice.wifiMac === 'string' && rawDevice.wifiMac.trim().length > 0)
356
465
  ? rawDevice.wifiMac.trim()
@@ -483,23 +592,7 @@ export class CyncAppPlatform {
483
592
  this.api.registerPlatformAccessories('homebridge-cync-app', 'CyncAppPlatform', [accessory]);
484
593
  this.accessories.push(accessory);
485
594
  }
486
- // Decide how to expose this device in HomeKit based on device_type / raw.deviceType
487
- const typedDevice = device;
488
- let deviceType;
489
- if (typeof typedDevice.device_type === 'number') {
490
- deviceType = typedDevice.device_type;
491
- }
492
- else if (typedDevice.raw && typeof typedDevice.raw.deviceType === 'number') {
493
- deviceType = typedDevice.raw.deviceType;
494
- }
495
- else if (typedDevice.raw &&
496
- typeof typedDevice.raw.deviceType === 'string' &&
497
- typedDevice.raw.deviceType.trim() !== '') {
498
- const parsed = Number(typedDevice.raw.deviceType);
499
- if (!Number.isNaN(parsed)) {
500
- deviceType = parsed;
501
- }
502
- }
595
+ const deviceType = resolveDeviceType(device);
503
596
  const isDownlight = deviceType === 46;
504
597
  if (isDownlight) {
505
598
  this.log.info('Cync: configuring %s as Lightbulb (deviceType=%s, deviceId=%s)', deviceName, String(deviceType), deviceId);
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "homebridge-cync-app",
3
3
  "displayName": "Homebridge Cync App",
4
4
  "type": "module",
5
- "version": "0.1.6",
5
+ "version": "0.1.7",
6
6
  "private": false,
7
7
  "description": "Homebridge plugin that integrates your GE Cync account (via the Cync app/API) and exposes all supported devices: plugs, lights, switches, etc",
8
8
  "author": "Dustin Newell",
@@ -64,6 +64,11 @@ export interface CyncCloudConfig {
64
64
  meshes: CyncDeviceMesh[];
65
65
  }
66
66
 
67
+ export interface CyncRefreshResponse {
68
+ accessToken: string;
69
+ refreshToken?: string;
70
+ expiresAt?: number;
71
+ }
67
72
 
68
73
  export interface CyncLogger {
69
74
  debug(message: string, ...args: unknown[]): void;
@@ -218,6 +223,80 @@ export class ConfigClient {
218
223
  raw: json,
219
224
  };
220
225
  }
226
+ /**
227
+ * Refresh the access token using a stored refresh token.
228
+ *
229
+ * This mirrors the 2FA login flow in shape, but only exchanges the
230
+ * refresh_token for a new access_token (and possibly a new refresh_token).
231
+ */
232
+ public async refreshAccessToken(refreshToken: string): Promise<CyncRefreshResponse> {
233
+ const url = `${CYNC_API_BASE}user_auth/refresh`;
234
+ this.log.debug('Refreshing Cync access token…');
235
+
236
+ const body = {
237
+ corp_id: CORP_ID,
238
+ refresh_token: refreshToken,
239
+ resource: ConfigClient.randomLoginResource(),
240
+ };
241
+
242
+ const res = (await fetch(url, {
243
+ method: 'POST',
244
+ headers: {
245
+ 'Content-Type': 'application/json',
246
+ },
247
+ body: JSON.stringify(body),
248
+ })) as HttpResponse;
249
+
250
+ const json: unknown = await res.json().catch(async () => {
251
+ const text = await res.text().catch(() => '');
252
+ throw new Error(`Cync refresh returned non-JSON payload: ${text}`);
253
+ });
254
+
255
+ if (!res.ok) {
256
+ this.log.error(
257
+ 'Cync refresh failed: HTTP %d %s %o',
258
+ res.status,
259
+ res.statusText,
260
+ json,
261
+ );
262
+ const errBody = json as CyncErrorBody;
263
+ const msg =
264
+ errBody.error?.msg ??
265
+ `Cync refresh failed with status ${res.status} ${res.statusText}`;
266
+ throw new Error(msg);
267
+ }
268
+
269
+ const obj = json as Record<string, unknown>;
270
+ this.log.debug('Cync refresh response: keys=%o', Object.keys(obj));
271
+
272
+ const accessTokenRaw = obj.access_token ?? obj.accessToken;
273
+ const refreshTokenRaw = obj.refresh_token ?? obj.refreshToken;
274
+ const expiresAtRaw = obj.expires_at ?? obj.expiresAt;
275
+
276
+ const accessToken =
277
+ typeof accessTokenRaw === 'string' && accessTokenRaw.length > 0
278
+ ? accessTokenRaw
279
+ : undefined;
280
+
281
+ if (!accessToken) {
282
+ this.log.error('Cync refresh missing access_token: %o', json);
283
+ throw new Error('Cync refresh response missing access_token');
284
+ }
285
+
286
+ const next: CyncRefreshResponse = {
287
+ accessToken,
288
+ };
289
+
290
+ if (typeof refreshTokenRaw === 'string' && refreshTokenRaw.length > 0) {
291
+ next.refreshToken = refreshTokenRaw;
292
+ }
293
+
294
+ if (typeof expiresAtRaw === 'number') {
295
+ next.expiresAt = expiresAtRaw;
296
+ }
297
+
298
+ return next;
299
+ }
221
300
 
222
301
  /**
223
302
  * Fetch the list of meshes/devices for the current user from the cloud.
@@ -321,6 +321,120 @@ export class CyncClient {
321
321
  * // user reads email, gets code…
322
322
  * await client.submitTwoFactor(username, password, code); // completes login
323
323
  */
324
+ // ### 🧩 Refresh Error Detector: identifies "Access-Token Expired" responses
325
+ private isAccessTokenExpiredError(err: unknown): boolean {
326
+ if (!err || typeof err !== 'object') {
327
+ return false;
328
+ }
329
+
330
+ type ErrorWithShape = {
331
+ status?: number;
332
+ message?: string;
333
+ error?: {
334
+ msg?: string;
335
+ code?: number;
336
+ };
337
+ };
338
+
339
+ const e = err as ErrorWithShape;
340
+
341
+ // Shape we see in logs:
342
+ // { error: { msg: 'Access-Token Expired', code: 4031021 } }
343
+ if (e.error && (e.error.msg === 'Access-Token Expired' || e.error.code === 4031021)) {
344
+ return true;
345
+ }
346
+
347
+ // Fallback: generic 403 with message string
348
+ if (e.status === 403 && e.message && e.message.includes('Access-Token Expired')) {
349
+ return true;
350
+ }
351
+
352
+ return false;
353
+ }
354
+
355
+ // ### 🧩 Token Refresh Helper: exchanges refreshToken for a new accessToken
356
+ private async refreshAccessToken(stored: CyncTokenData): Promise<CyncTokenData | null> {
357
+ if (!stored.refreshToken) {
358
+ this.log.warn(
359
+ 'CyncClient: refreshAccessToken() called but no refreshToken is stored; cannot refresh.',
360
+ );
361
+ return null;
362
+ }
363
+
364
+ try {
365
+ const resp = await this.configClient.refreshAccessToken(stored.refreshToken);
366
+
367
+ const next: CyncTokenData = {
368
+ ...stored,
369
+ accessToken: resp.accessToken,
370
+ refreshToken: resp.refreshToken ?? stored.refreshToken,
371
+ expiresAt: resp.expiresAt ?? stored.expiresAt,
372
+ };
373
+
374
+ await this.tokenStore.save(next);
375
+ this.tokenData = next;
376
+ this.applyAccessToken(next);
377
+
378
+ this.log.info(
379
+ 'CyncClient: refreshed access token for userId=%s; expiresAt=%s',
380
+ next.userId,
381
+ next.expiresAt ? new Date(next.expiresAt).toISOString() : 'unknown',
382
+ );
383
+
384
+ return next;
385
+ } catch (err) {
386
+ this.log.error('CyncClient: token refresh failed: %o', err);
387
+ return null;
388
+ }
389
+ }
390
+
391
+ // ### 🧩 Cloud Config Wrapper: auto-refreshes access token
392
+ private async getCloudConfigWithRefresh(): Promise<CyncCloudConfig> {
393
+ try {
394
+ return await this.configClient.getCloudConfig();
395
+ } catch (err) {
396
+ if (this.isAccessTokenExpiredError(err) && this.tokenData) {
397
+ this.log.warn(
398
+ 'CyncClient: access token expired when calling getCloudConfig(); refreshing and retrying once.',
399
+ );
400
+
401
+ const refreshed = await this.refreshAccessToken(this.tokenData);
402
+ if (refreshed) {
403
+ return await this.configClient.getCloudConfig();
404
+ }
405
+ }
406
+
407
+ throw err;
408
+ }
409
+ }
410
+
411
+ // ### 🧩 Device Properties Wrapper: auto-refresh on Access-Token Expired for mesh calls
412
+ private async getDevicePropertiesWithRefresh(
413
+ productId: string | number,
414
+ meshId: string | number,
415
+ ): Promise<Record<string, unknown>> {
416
+ // Normalise to strings for ConfigClient
417
+ const productIdStr = String(productId);
418
+ const meshIdStr = String(meshId);
419
+
420
+ try {
421
+ return await this.configClient.getDeviceProperties(productIdStr, meshIdStr);
422
+ } catch (err) {
423
+ if (this.isAccessTokenExpiredError(err) && this.tokenData) {
424
+ this.log.warn(
425
+ 'CyncClient: access token expired when calling getDeviceProperties(); refreshing and retrying once.',
426
+ );
427
+
428
+ const refreshed = await this.refreshAccessToken(this.tokenData);
429
+ if (refreshed) {
430
+ return await this.configClient.getDeviceProperties(productIdStr, meshIdStr);
431
+ }
432
+ }
433
+
434
+ throw err;
435
+ }
436
+ }
437
+
324
438
  public async authenticate(username: string): Promise<void> {
325
439
  const email = username.trim();
326
440
 
@@ -381,7 +495,7 @@ export class CyncClient {
381
495
  this.ensureSession();
382
496
 
383
497
  this.log.info('CyncClient: loading Cync cloud configuration…');
384
- const cfg = await this.configClient.getCloudConfig();
498
+ const cfg = await this.getCloudConfigWithRefresh();
385
499
 
386
500
  // Reset LAN topology caches on each reload
387
501
  this.homeDevices = {};
@@ -405,7 +519,7 @@ export class CyncClient {
405
519
  const homeControllers: number[] = [];
406
520
 
407
521
  try {
408
- const props = await this.configClient.getDeviceProperties(
522
+ const props = await this.getDevicePropertiesWithRefresh(
409
523
  mesh.product_id,
410
524
  mesh.id,
411
525
  );