@homebridge-plugins/homebridge-updater 3.0.7 → 3.1.1

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.
@@ -6,10 +6,26 @@ export declare class PluginUpdatePlatform implements DynamicPlatformPlugin {
6
6
  private updateSensor;
7
7
  private failureSensor;
8
8
  private readonly updateSensorUuid;
9
+ private readonly legacyUpdateSensorUuid;
9
10
  private readonly failureSensorUuid;
10
11
  private failureSensorRegistered;
11
12
  private cachedFailureAccessory?;
13
+ /** Cached accessory with the legacy v2.x UUID — resolved in handleLegacyMigration */
14
+ private cachedLegacyUpdateAccessory?;
15
+ /** True when a v3 update-sensor accessory was found in the cache (current UUID) */
16
+ private updateSensorCached;
12
17
  constructor(log: Logging, config: PlatformConfig, api: API);
18
+ /**
19
+ * Resolves legacy v2.x cached accessories on first launch after an upgrade.
20
+ *
21
+ * Two scenarios:
22
+ * 1. Only the legacy UUID is in the cache (fresh v2→v3 migration): configure the
23
+ * update sensor on the legacy accessory so that {@link UpdateSensor.addUpdateSensor}
24
+ * sees `registered = true` and does NOT create a duplicate.
25
+ * 2. Both legacy and current UUIDs are in the cache (user already ran v3 once):
26
+ * unregister the stale legacy accessory and let the current-UUID accessory continue.
27
+ */
28
+ private handleLegacyMigration;
13
29
  private addFailureSensor;
14
30
  configureAccessory(accessory: any): void;
15
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Platform.HAP.d.ts","sourceRoot":"","sources":["../src/Platform.HAP.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAqB,cAAc,EAAE,MAAM,YAAY,CAAA;AAOxG,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,sBAAsB,CAAC,CAAmB;gBAEtC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG;IAe1D,OAAO,CAAC,gBAAgB;IAuBxB,kBAAkB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI;CA4BzC"}
1
+ {"version":3,"file":"Platform.HAP.d.ts","sourceRoot":"","sources":["../src/Platform.HAP.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAqB,cAAc,EAAE,MAAM,YAAY,CAAA;AAOxG,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,sBAAsB,CAAC,CAAmB;IAClD,qFAAqF;IACrF,OAAO,CAAC,2BAA2B,CAAC,CAAmB;IACvD,mFAAmF;IACnF,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG;IAkB1D;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,gBAAgB;IAuBxB,kBAAkB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI;CAkCzC"}
@@ -1,5 +1,5 @@
1
1
  import { FailureSensor } from './failureSensor.js';
2
- import { FAILURE_SENSOR_UUID_KEY, PLATFORM_NAME, PLUGIN_NAME, UPDATE_SENSOR_UUID_KEY } from './settings.js';
2
+ import { FAILURE_SENSOR_UUID_KEY, LEGACY_UPDATE_SENSOR_UUID_KEY, PLATFORM_NAME, PLUGIN_NAME, UPDATE_SENSOR_UUID_KEY } from './settings.js';
3
3
  import { UpdateSensor } from './updateSensor.js';
4
4
  import { isFailureSensorEnabled } from './utils.js';
5
5
  export class PluginUpdatePlatform {
@@ -9,16 +9,24 @@ export class PluginUpdatePlatform {
9
9
  updateSensor;
10
10
  failureSensor;
11
11
  updateSensorUuid;
12
+ legacyUpdateSensorUuid;
12
13
  failureSensorUuid;
13
14
  failureSensorRegistered = false;
14
15
  cachedFailureAccessory;
16
+ /** Cached accessory with the legacy v2.x UUID — resolved in handleLegacyMigration */
17
+ cachedLegacyUpdateAccessory;
18
+ /** True when a v3 update-sensor accessory was found in the cache (current UUID) */
19
+ updateSensorCached = false;
15
20
  constructor(log, config, api) {
16
21
  this.log = log;
17
22
  this.config = config;
18
23
  this.api = api;
19
24
  this.updateSensorUuid = api.hap.uuid.generate(UPDATE_SENSOR_UUID_KEY);
25
+ this.legacyUpdateSensorUuid = api.hap.uuid.generate(LEGACY_UPDATE_SENSOR_UUID_KEY);
20
26
  this.failureSensorUuid = api.hap.uuid.generate(FAILURE_SENSOR_UUID_KEY);
21
27
  this.failureSensor = new FailureSensor(log, api, config.failureSensorType || config.sensorType, 'hap');
28
+ // Register legacy migration BEFORE UpdateSensor so it runs first on didFinishLaunching
29
+ api.on('didFinishLaunching', this.handleLegacyMigration.bind(this));
22
30
  this.updateSensor = new UpdateSensor(log, config, api, {
23
31
  protocol: 'hap',
24
32
  onFailureStateChange: isFailureSensorEnabled(config) ? (failed) => this.failureSensor.setState(failed) : undefined,
@@ -26,6 +34,32 @@ export class PluginUpdatePlatform {
26
34
  // Register the failure sensor accessory
27
35
  api.on('didFinishLaunching', this.addFailureSensor.bind(this));
28
36
  }
37
+ /**
38
+ * Resolves legacy v2.x cached accessories on first launch after an upgrade.
39
+ *
40
+ * Two scenarios:
41
+ * 1. Only the legacy UUID is in the cache (fresh v2→v3 migration): configure the
42
+ * update sensor on the legacy accessory so that {@link UpdateSensor.addUpdateSensor}
43
+ * sees `registered = true` and does NOT create a duplicate.
44
+ * 2. Both legacy and current UUIDs are in the cache (user already ran v3 once):
45
+ * unregister the stale legacy accessory and let the current-UUID accessory continue.
46
+ */
47
+ handleLegacyMigration() {
48
+ if (!this.cachedLegacyUpdateAccessory) {
49
+ return;
50
+ }
51
+ if (this.updateSensorCached) {
52
+ // Current-UUID accessory already recognised — remove the stale legacy one
53
+ this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [this.cachedLegacyUpdateAccessory]);
54
+ this.cachedLegacyUpdateAccessory = undefined;
55
+ this.log.info('Removed stale legacy update sensor accessory (migrated to current UUID)');
56
+ return;
57
+ }
58
+ // Only the legacy accessory exists — use it for the update sensor so no duplicate is created
59
+ this.updateSensor.configureAccessory(this.cachedLegacyUpdateAccessory);
60
+ this.log.info('Restored update sensor from legacy cached accessory');
61
+ this.cachedLegacyUpdateAccessory = undefined;
62
+ }
29
63
  addFailureSensor() {
30
64
  // If the failure sensor has been disabled, remove any previously cached accessory
31
65
  if (!isFailureSensorEnabled(this.config)) {
@@ -54,9 +88,10 @@ export class PluginUpdatePlatform {
54
88
  }
55
89
  });
56
90
  }
57
- // Restore for update sensor
91
+ // Restore for update sensor (current UUID)
58
92
  if (accessory.UUID === this.updateSensorUuid) {
59
93
  this.updateSensor.configureAccessory(accessory);
94
+ this.updateSensorCached = true;
60
95
  return;
61
96
  }
62
97
  // Restore for failure sensor
@@ -71,6 +106,11 @@ export class PluginUpdatePlatform {
71
106
  this.failureSensorRegistered = true;
72
107
  return;
73
108
  }
109
+ // Legacy v2.x update sensor UUID — resolved in handleLegacyMigration
110
+ if (accessory.UUID === this.legacyUpdateSensorUuid) {
111
+ this.cachedLegacyUpdateAccessory = accessory;
112
+ return;
113
+ }
74
114
  this.log.warn(`Ignoring unknown cached accessory: ${accessory.displayName}`);
75
115
  }
76
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Platform.HAP.js","sourceRoot":"","sources":["../src/Platform.HAP.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Platform.HAP.js","sourceRoot":"","sources":["../src/Platform.HAP.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC1I,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,OAAO,oBAAoB;IACd,GAAG,CAAS;IACZ,MAAM,CAAgB;IACtB,GAAG,CAAK;IACjB,YAAY,CAAc;IAC1B,aAAa,CAAe;IACnB,gBAAgB,CAAQ;IACxB,sBAAsB,CAAQ;IAC9B,iBAAiB,CAAQ;IAClC,uBAAuB,GAAG,KAAK,CAAA;IAC/B,sBAAsB,CAAoB;IAClD,qFAAqF;IAC7E,2BAA2B,CAAoB;IACvD,mFAAmF;IAC3E,kBAAkB,GAAG,KAAK,CAAA;IAElC,YAAY,GAAY,EAAE,MAAsB,EAAE,GAAQ;QACxD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QACrE,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAA;QAClF,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAA;QACvE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACtG,uFAAuF;QACvF,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACrD,QAAQ,EAAE,KAAK;YACf,oBAAoB,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;SACnH,CAAC,CAAA;QACF,wCAAwC;QACxC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAChE,CAAC;IAED;;;;;;;;;OASG;IACK,qBAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACtC,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,0EAA0E;YAC1E,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAA;YACtG,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAA;YAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;YACxF,OAAM;QACR,CAAC;QAED,6FAA6F;QAC7F,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;QACpE,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAA;IAC9C,CAAC;IAEO,gBAAgB;QACtB,kFAAkF;QAClF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAA;gBACjG,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAA;gBACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;YACvF,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAA;QAC5C,MAAM,gBAAgB,GAAG,IAAI,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACvF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAA;IACrC,CAAC;IAED,sEAAsE;IACtE,kBAAkB,CAAC,SAAc;QAC/B,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YACpD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;gBAC5B,IAAI,IAAI,CAAC,YAAY,IAAK,IAAI,CAAC,YAAoB,CAAC,GAAG,EAAE,CAAC;oBACvD,IAAI,CAAC,YAAoB,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,WAAW,sBAAsB,CAAC,CAAA;gBAChF,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,2CAA2C;QAC3C,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;YAC/C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;YAC9B,OAAM;QACR,CAAC;QACD,6BAA6B;QAC7B,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,uEAAuE;gBACvE,gDAAgD;gBAChD,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAA;gBACvC,OAAM;YACR,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACvC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAA;YACnC,OAAM;QACR,CAAC;QACD,qEAAqE;QACrE,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACnD,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IAC9E,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Platform.HAP.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Platform.HAP.test.d.ts","sourceRoot":"","sources":["../src/Platform.HAP.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { LEGACY_UPDATE_SENSOR_UUID_KEY, UPDATE_SENSOR_UUID_KEY, FAILURE_SENSOR_UUID_KEY, PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
3
+ /**
4
+ * Unit tests for the legacy UUID migration logic in PluginUpdatePlatform.
5
+ *
6
+ * These tests validate the three key scenarios handled by handleLegacyMigration:
7
+ * 1. Only legacy UUID (v2.x) in cache — must restore without creating a duplicate.
8
+ * 2. Both legacy and current UUID in cache — must unregister the stale legacy accessory.
9
+ * 3. Normal v3 operation (no legacy) — must leave the current accessory untouched.
10
+ */
11
+ describe('PluginUpdatePlatform legacy UUID migration', () => {
12
+ function buildMocks(options = {}) {
13
+ // Map uuid key → deterministic UUID value
14
+ const uuidMap = {
15
+ [UPDATE_SENSOR_UUID_KEY]: 'uuid-v3-update',
16
+ [FAILURE_SENSOR_UUID_KEY]: 'uuid-v3-failure',
17
+ [LEGACY_UPDATE_SENSOR_UUID_KEY]: 'uuid-legacy-update',
18
+ ...options.generateReturnsByKey,
19
+ };
20
+ const didFinishListeners = [];
21
+ const mockLog = {
22
+ info: vi.fn(),
23
+ warn: vi.fn(),
24
+ error: vi.fn(),
25
+ debug: vi.fn(),
26
+ };
27
+ const mockApi = {
28
+ hap: {
29
+ uuid: {
30
+ generate: vi.fn((key) => uuidMap[key] ?? `uuid-${key}`),
31
+ },
32
+ },
33
+ on: vi.fn((event, cb) => {
34
+ if (event === 'didFinishLaunching') {
35
+ didFinishListeners.push(cb);
36
+ }
37
+ }),
38
+ platformAccessory: vi.fn(),
39
+ registerPlatformAccessories: vi.fn(),
40
+ unregisterPlatformAccessories: vi.fn(),
41
+ };
42
+ const mockConfig = {
43
+ sensorType: 'motion',
44
+ failureSensorType: undefined,
45
+ autoUpdateHomebridge: false,
46
+ autoUpdateHomebridgeUI: false,
47
+ autoUpdatePlugins: false,
48
+ autoUpdateNode: false,
49
+ name: 'PluginUpdate',
50
+ };
51
+ const mockUpdateSensor = {
52
+ configureAccessory: vi.fn(),
53
+ addUpdateSensor: vi.fn(),
54
+ };
55
+ const mockFailureSensor = {
56
+ configure: vi.fn(),
57
+ setState: vi.fn(),
58
+ };
59
+ function fireDidFinishLaunching() {
60
+ for (const cb of didFinishListeners) {
61
+ cb();
62
+ }
63
+ }
64
+ return { mockLog, mockApi, mockConfig, mockUpdateSensor, mockFailureSensor, uuidMap, didFinishListeners, fireDidFinishLaunching };
65
+ }
66
+ /**
67
+ * Simulate the Platform.HAP.ts logic directly using extracted functions so we can
68
+ * test it without requiring a full Homebridge runtime import.
69
+ */
70
+ function runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, cachedAccessories) {
71
+ const updateSensorUuid = mockApi.hap.uuid.generate(UPDATE_SENSOR_UUID_KEY);
72
+ const legacyUpdateSensorUuid = mockApi.hap.uuid.generate(LEGACY_UPDATE_SENSOR_UUID_KEY);
73
+ let cachedLegacyUpdateAccessory = undefined;
74
+ let updateSensorCached = false;
75
+ // Simulate configureAccessory for each cached accessory
76
+ for (const accessory of cachedAccessories) {
77
+ if (accessory.UUID === updateSensorUuid) {
78
+ mockUpdateSensor.configureAccessory(accessory);
79
+ updateSensorCached = true;
80
+ continue;
81
+ }
82
+ if (accessory.UUID === legacyUpdateSensorUuid) {
83
+ cachedLegacyUpdateAccessory = accessory;
84
+ continue;
85
+ }
86
+ mockLog.warn(`Ignoring unknown cached accessory: ${accessory.displayName}`);
87
+ }
88
+ // handleLegacyMigration (fires first on didFinishLaunching)
89
+ let registered = updateSensorCached;
90
+ function handleLegacyMigration() {
91
+ if (!cachedLegacyUpdateAccessory)
92
+ return;
93
+ if (updateSensorCached) {
94
+ mockApi.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [cachedLegacyUpdateAccessory]);
95
+ cachedLegacyUpdateAccessory = undefined;
96
+ mockLog.info('Removed stale legacy update sensor accessory (migrated to current UUID)');
97
+ return;
98
+ }
99
+ mockUpdateSensor.configureAccessory(cachedLegacyUpdateAccessory);
100
+ registered = true;
101
+ mockLog.info('Restored update sensor from legacy cached accessory');
102
+ cachedLegacyUpdateAccessory = undefined;
103
+ }
104
+ // addUpdateSensor (fires after handleLegacyMigration)
105
+ function addUpdateSensor() {
106
+ if (!registered) {
107
+ // would create a new accessory and register it
108
+ mockApi.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [{ displayName: 'new-accessory' }]);
109
+ registered = true;
110
+ }
111
+ }
112
+ handleLegacyMigration();
113
+ addUpdateSensor();
114
+ return { registered, cachedLegacyUpdateAccessory };
115
+ }
116
+ it('Scenario A: only legacy UUID in cache — must restore without creating a duplicate', () => {
117
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap, fireDidFinishLaunching } = buildMocks();
118
+ const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
119
+ const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory]);
120
+ // Legacy accessory used as update sensor
121
+ expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(legacyAccessory);
122
+ expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(1);
123
+ // registered was set to true so no new accessory was created
124
+ expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
125
+ // No stale unregister
126
+ expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
127
+ // Info log emitted
128
+ expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Restored update sensor from legacy cached accessory'));
129
+ // No unknown-accessory warning
130
+ expect(mockLog.warn).not.toHaveBeenCalled();
131
+ expect(registered).toBe(true);
132
+ });
133
+ it('Scenario B: both legacy and current UUID in cache — must unregister the stale legacy accessory', () => {
134
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
135
+ const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
136
+ const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
137
+ runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory, legacyAccessory]);
138
+ // v3 accessory configured as update sensor
139
+ expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(v3Accessory);
140
+ // Legacy unregistered
141
+ expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [legacyAccessory]);
142
+ // No new accessory created (v3 already registered)
143
+ expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
144
+ expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Removed stale legacy update sensor accessory'));
145
+ });
146
+ it('Scenario B (legacy processed first): same result regardless of configureAccessory order', () => {
147
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
148
+ const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
149
+ const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
150
+ // Legacy accessory arrives first in configureAccessory order
151
+ runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory, v3Accessory]);
152
+ expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(v3Accessory);
153
+ expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [legacyAccessory]);
154
+ expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
155
+ });
156
+ it('Scenario C: normal v3 operation — no legacy accessory, no side effects', () => {
157
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
158
+ const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
159
+ runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory]);
160
+ expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(v3Accessory);
161
+ expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
162
+ expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
163
+ expect(mockLog.info).not.toHaveBeenCalled();
164
+ expect(mockLog.warn).not.toHaveBeenCalled();
165
+ });
166
+ it('Scenario D: no cached accessories at all — creates new accessory normally', () => {
167
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
168
+ const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, []);
169
+ expect(mockUpdateSensor.configureAccessory).not.toHaveBeenCalled();
170
+ expect(mockApi.registerPlatformAccessories).toHaveBeenCalledTimes(1);
171
+ expect(registered).toBe(true);
172
+ expect(mockLog.warn).not.toHaveBeenCalled();
173
+ });
174
+ it('truly unknown accessories still emit a warning', () => {
175
+ const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
176
+ const unknownAccessory = { UUID: 'some-other-uuid', displayName: 'Some Other Accessory' };
177
+ runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [unknownAccessory]);
178
+ expect(mockLog.warn).toHaveBeenCalledWith(expect.stringContaining('Ignoring unknown cached accessory: Some Other Accessory'));
179
+ });
180
+ });
181
+ //# sourceMappingURL=Platform.HAP.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Platform.HAP.test.js","sourceRoot":"","sources":["../src/Platform.HAP.test.ts"],"names":[],"mappings":"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"}
@@ -8,4 +8,9 @@ export declare const PLATFORM_NAME = "HomebridgeUpdater";
8
8
  export declare const PLUGIN_NAME = "@homebridge-plugins/homebridge-updater";
9
9
  export declare const UPDATE_SENSOR_UUID_KEY = "PluginUpdateCheck-UpdateSensor";
10
10
  export declare const FAILURE_SENSOR_UUID_KEY = "PluginUpdateCheck-FailureSensor";
11
+ /**
12
+ * UUID key used by v2.x of homebridge-plugin-update-check.
13
+ * Stored here to support migration of cached accessories from old installs.
14
+ */
15
+ export declare const LEGACY_UPDATE_SENSOR_UUID_KEY = "PluginUpdate";
11
16
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,WAAW,2CAA2C,CAAA;AAEnE,eAAO,MAAM,sBAAsB,mCAAmC,CAAA;AAEtE,eAAO,MAAM,uBAAuB,oCAAoC,CAAA"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,WAAW,2CAA2C,CAAA;AAEnE,eAAO,MAAM,sBAAsB,mCAAmC,CAAA;AAEtE,eAAO,MAAM,uBAAuB,oCAAoC,CAAA;AAExE;;;GAGG;AACH,eAAO,MAAM,6BAA6B,iBAAiB,CAAA"}
package/dist/settings.js CHANGED
@@ -8,4 +8,9 @@ export const PLATFORM_NAME = 'HomebridgeUpdater';
8
8
  export const PLUGIN_NAME = '@homebridge-plugins/homebridge-updater';
9
9
  export const UPDATE_SENSOR_UUID_KEY = 'PluginUpdateCheck-UpdateSensor';
10
10
  export const FAILURE_SENSOR_UUID_KEY = 'PluginUpdateCheck-FailureSensor';
11
+ /**
12
+ * UUID key used by v2.x of homebridge-plugin-update-check.
13
+ * Stored here to support migration of cached accessories from old installs.
14
+ */
15
+ export const LEGACY_UPDATE_SENSOR_UUID_KEY = 'PluginUpdate';
11
16
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAA;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAA;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAA;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAA;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,cAAc,CAAA"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@homebridge-plugins/homebridge-updater",
3
3
  "displayName": "Homebridge Updater",
4
4
  "type": "module",
5
- "version": "3.0.7",
5
+ "version": "3.1.1",
6
6
  "description": "A Homebridge plugin for checking for updates to Homebridge and plugins",
7
7
  "author": "David Maher",
8
8
  "license": "BSD-2-Clause",
@@ -93,4 +93,4 @@
93
93
  "typedoc": "^0.28.19",
94
94
  "vitest": "^4.1.5"
95
95
  }
96
- }
96
+ }