iotas-ts 1.2.0 → 1.3.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.0](https://github.com/mezaugusto/iotas-ts/compare/v1.2.0...v1.3.0) (2026-04-13)
4
+
5
+
6
+ ### Features
7
+
8
+ * :art: Implement write barriers for feature updates ([#14](https://github.com/mezaugusto/iotas-ts/issues/14)) ([aed365d](https://github.com/mezaugusto/iotas-ts/commit/aed365d46317dcec9d6998611e5d3fda796ef2c3))
9
+
3
10
  ## [1.2.0](https://github.com/mezaugusto/iotas-ts/compare/v1.1.0...v1.2.0) (2026-04-12)
4
11
 
5
12
 
@@ -1,31 +1,36 @@
1
1
  import type { IotasLogger } from '../logger.js';
2
- import type { IotasClient } from '../api/iotasClient.js';
3
2
  import type { FeatureCacheOptions, Rooms } from '../types.js';
4
3
  export type FeatureChangeCallback = (changed: Map<string, number>) => void;
5
4
  export type SnapshotFilter = (rooms: Rooms) => Rooms;
5
+ /** Internal interface for sending feature updates to the API. */
6
+ export interface FeatureUpdater {
7
+ updateFeature(featureId: string, value: number): void;
8
+ }
6
9
  /**
7
10
  * FeatureCache provides cached feature values with background polling.
8
11
  *
9
12
  * - Seeded from discovery snapshot (no cold-start defaults)
10
13
  * - Single getRooms() call per poll cycle
11
- * - Write barrier prevents stale poll data overwriting recent onSet
14
+ * - Per-device write barriers prevent stale poll data overwriting recent writes
15
+ * - Smart pending-value matching: confirming snapshots are accepted early
12
16
  * - Subscription model for pushing updates via updateValue
13
17
  */
14
18
  export declare class FeatureCache {
15
19
  private readonly log;
16
20
  private readonly client;
17
21
  private readonly values;
18
- private readonly writeTimestamps;
22
+ private readonly writeBarriers;
19
23
  private readonly subscriptions;
20
24
  private pollTimer;
21
25
  private consecutiveFailures;
22
26
  private stopped;
23
27
  private readonly pollIntervalMs;
24
- private readonly writeBarrierMs;
25
28
  private readonly pollBackoffBaseMs;
26
29
  private readonly pollBackoffMaxMs;
27
30
  private readonly snapshotFilter?;
28
- constructor(log: IotasLogger, client: IotasClient, options?: FeatureCacheOptions);
31
+ constructor(log: IotasLogger, client: FeatureUpdater & {
32
+ getRooms(): Promise<Rooms>;
33
+ }, options?: FeatureCacheOptions);
29
34
  seed(rooms: Rooms): void;
30
35
  get(featureId: string): number | undefined;
31
36
  set(featureId: string, value: number): void;
@@ -45,7 +50,7 @@ export declare class FeatureCache {
45
50
  /**
46
51
  * Reset for a fresh start (used when re-discovering devices).
47
52
  *
48
- * This clears all cached values, write timestamps, and subscriptions.
53
+ * This clears all cached values, write barriers, and subscriptions.
49
54
  * Callers must re-register subscriptions after calling reset().
50
55
  *
51
56
  * Expected call order:
@@ -1,5 +1,6 @@
1
+ import { getWriteBarrierMs } from '../quirks.js';
2
+ import { DEFAULT_WRITE_BARRIER_MS } from '../defaults.js';
1
3
  const DEFAULT_POLL_INTERVAL_MS = 30_000;
2
- const DEFAULT_WRITE_BARRIER_MS = 5_000;
3
4
  const DEFAULT_POLL_BACKOFF_BASE_MS = 5_000;
4
5
  const DEFAULT_POLL_BACKOFF_MAX_MS = 300_000; // 5 minutes max
5
6
  /**
@@ -7,20 +8,20 @@ const DEFAULT_POLL_BACKOFF_MAX_MS = 300_000; // 5 minutes max
7
8
  *
8
9
  * - Seeded from discovery snapshot (no cold-start defaults)
9
10
  * - Single getRooms() call per poll cycle
10
- * - Write barrier prevents stale poll data overwriting recent onSet
11
+ * - Per-device write barriers prevent stale poll data overwriting recent writes
12
+ * - Smart pending-value matching: confirming snapshots are accepted early
11
13
  * - Subscription model for pushing updates via updateValue
12
14
  */
13
15
  export class FeatureCache {
14
16
  log;
15
17
  client;
16
18
  values = new Map();
17
- writeTimestamps = new Map();
19
+ writeBarriers = new Map();
18
20
  subscriptions = new Set();
19
21
  pollTimer = null;
20
22
  consecutiveFailures = 0;
21
23
  stopped = false;
22
24
  pollIntervalMs;
23
- writeBarrierMs;
24
25
  pollBackoffBaseMs;
25
26
  pollBackoffMaxMs;
26
27
  snapshotFilter;
@@ -28,7 +29,6 @@ export class FeatureCache {
28
29
  this.log = log;
29
30
  this.client = client;
30
31
  this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
31
- this.writeBarrierMs = options?.writeBarrierMs ?? DEFAULT_WRITE_BARRIER_MS;
32
32
  this.pollBackoffBaseMs = options?.pollBackoffBaseMs ?? DEFAULT_POLL_BACKOFF_BASE_MS;
33
33
  this.pollBackoffMaxMs = options?.pollBackoffMaxMs ?? DEFAULT_POLL_BACKOFF_MAX_MS;
34
34
  this.snapshotFilter = options?.snapshotFilter;
@@ -50,7 +50,11 @@ export class FeatureCache {
50
50
  }
51
51
  set(featureId, value) {
52
52
  this.values.set(featureId, value);
53
- this.writeTimestamps.set(featureId, Date.now());
53
+ this.writeBarriers.set(featureId, {
54
+ timestamp: Date.now(),
55
+ durationMs: DEFAULT_WRITE_BARRIER_MS,
56
+ pendingValue: value,
57
+ });
54
58
  }
55
59
  /**
56
60
  * Write-through: sets cache value with write barrier AND sends the update
@@ -94,7 +98,7 @@ export class FeatureCache {
94
98
  /**
95
99
  * Reset for a fresh start (used when re-discovering devices).
96
100
  *
97
- * This clears all cached values, write timestamps, and subscriptions.
101
+ * This clears all cached values, write barriers, and subscriptions.
98
102
  * Callers must re-register subscriptions after calling reset().
99
103
  *
100
104
  * Expected call order:
@@ -107,7 +111,7 @@ export class FeatureCache {
107
111
  this.stop();
108
112
  this.stopped = false;
109
113
  this.values.clear();
110
- this.writeTimestamps.clear();
114
+ this.writeBarriers.clear();
111
115
  this.subscriptions.clear();
112
116
  }
113
117
  schedulePoll(delayMs) {
@@ -141,19 +145,27 @@ export class FeatureCache {
141
145
  const changedFeatureIds = new Set();
142
146
  for (const room of rooms) {
143
147
  for (const device of room.devices) {
148
+ const deviceBarrierMs = getWriteBarrierMs(device);
144
149
  for (const feature of device.features) {
145
150
  if (feature.value === undefined) {
146
151
  continue;
147
152
  }
148
153
  const featureId = feature.id.toString();
149
- const lastWrite = this.writeTimestamps.get(featureId) ?? 0;
150
- // Skip if within write barrier window
151
- if (now - lastWrite < this.writeBarrierMs) {
152
- continue;
153
- }
154
- // Clear expired write timestamp
155
- if (this.writeTimestamps.has(featureId)) {
156
- this.writeTimestamps.delete(featureId);
154
+ const barrier = this.writeBarriers.get(featureId);
155
+ if (barrier) {
156
+ const effectiveBarrierMs = Math.max(barrier.durationMs, deviceBarrierMs);
157
+ if (feature.value === barrier.pendingValue) {
158
+ // Snapshot confirms our write — accept and clear barrier
159
+ this.writeBarriers.delete(featureId);
160
+ }
161
+ else if (now - barrier.timestamp < effectiveBarrierMs) {
162
+ // Conflicting value within barrier window — skip stale data
163
+ continue;
164
+ }
165
+ else {
166
+ // Barrier expired — accept snapshot regardless
167
+ this.writeBarriers.delete(featureId);
168
+ }
157
169
  }
158
170
  const oldValue = this.values.get(featureId);
159
171
  if (oldValue !== feature.value) {
@@ -1 +1 @@
1
- {"version":3,"file":"featureCache.js","sourceRoot":"","sources":["../../../src/cache/featureCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"featureCache.js","sourceRoot":"","sources":["../../../src/cache/featureCache.ts"],"names":[],"mappings":"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"}
@@ -2,3 +2,5 @@ export declare const DEFAULT_CURRENT_TEMPERATURE_F = 70;
2
2
  export declare const DEFAULT_HEAT_SETPOINT_F = 68;
3
3
  export declare const DEFAULT_COOL_SETPOINT_F = 76;
4
4
  export declare const LOW_BATTERY_THRESHOLD = 20;
5
+ export declare const DEFAULT_WRITE_BARRIER_MS = 5000;
6
+ export declare const LOCK_WRITE_BARRIER_MS = 15000;
@@ -2,4 +2,6 @@ export const DEFAULT_CURRENT_TEMPERATURE_F = 70;
2
2
  export const DEFAULT_HEAT_SETPOINT_F = 68;
3
3
  export const DEFAULT_COOL_SETPOINT_F = 76;
4
4
  export const LOW_BATTERY_THRESHOLD = 20;
5
+ export const DEFAULT_WRITE_BARRIER_MS = 5_000;
6
+ export const LOCK_WRITE_BARRIER_MS = 15_000;
5
7
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC"}
@@ -2,11 +2,11 @@ export type { IotasLogger } from './logger.js';
2
2
  export { IotasClient } from './api/iotasClient.js';
3
3
  export { FeatureCache } from './cache/featureCache.js';
4
4
  export type { FeatureChangeCallback, SnapshotFilter } from './cache/featureCache.js';
5
- export type { Room, Rooms, Device, Feature, Residency, AuthResponse, AccountResponse, PhysicalDeviceDescription, IotasClientOptions, IotasTokens, FeatureCacheOptions, } from './types.js';
5
+ export type { Room, Rooms, Device, Feature, PhysicalDeviceDescription, IotasClientOptions, IotasTokens, FeatureCacheOptions, } from './types.js';
6
6
  export { Temperature, filterDevices } from './utils.js';
7
7
  export type { DeviceFilterOptions } from './utils.js';
8
8
  export { EventTypeName, FeatureCategory, FeatureTypeName, DeviceCategory, isDeviceCategory, READ_ONLY_CATEGORIES, DISCOVERY_EVENT_TYPES, } from './constants.js';
9
9
  export { getSerialNumber, getManufacturer, getModel, findFeatureByCategory, findFeatureByEventType } from './device.js';
10
10
  export { isReadOnlyCategory, isSupportedFeature, isDiscoverableFeature, isSupportedDevice } from './predicates.js';
11
- export { ThermostatMode, parseThermostatModeString, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
11
+ export { ThermostatMode, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
12
12
  export { DEFAULT_CURRENT_TEMPERATURE_F, DEFAULT_HEAT_SETPOINT_F, DEFAULT_COOL_SETPOINT_F, LOW_BATTERY_THRESHOLD, } from './defaults.js';
package/dist/src/index.js CHANGED
@@ -4,6 +4,6 @@ export { Temperature, filterDevices } from './utils.js';
4
4
  export { EventTypeName, FeatureCategory, FeatureTypeName, DeviceCategory, isDeviceCategory, READ_ONLY_CATEGORIES, DISCOVERY_EVENT_TYPES, } from './constants.js';
5
5
  export { getSerialNumber, getManufacturer, getModel, findFeatureByCategory, findFeatureByEventType } from './device.js';
6
6
  export { isReadOnlyCategory, isSupportedFeature, isDiscoverableFeature, isSupportedDevice } from './predicates.js';
7
- export { ThermostatMode, parseThermostatModeString, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
7
+ export { ThermostatMode, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
8
8
  export { DEFAULT_CURRENT_TEMPERATURE_F, DEFAULT_HEAT_SETPOINT_F, DEFAULT_COOL_SETPOINT_F, LOW_BATTERY_THRESHOLD, } from './defaults.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAiBvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAExH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAcvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAExH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnH,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC"}
@@ -1,2 +1,3 @@
1
1
  import type { Device } from './types.js';
2
2
  export declare function needsReliableUpdate(device: Device): boolean;
3
+ export declare function getWriteBarrierMs(device: Device): number;
@@ -1,4 +1,5 @@
1
1
  import { DeviceCategory } from './constants.js';
2
+ import { DEFAULT_WRITE_BARRIER_MS, LOCK_WRITE_BARRIER_MS } from './defaults.js';
2
3
  const ZWAVE_MANUFACTURERS = {
3
4
  JASCO: '0x0063',
4
5
  };
@@ -6,4 +7,10 @@ export function needsReliableUpdate(device) {
6
7
  return (device.category === DeviceCategory.Dimmer &&
7
8
  device.physicalDeviceDescription?.manufacturer === ZWAVE_MANUFACTURERS.JASCO);
8
9
  }
10
+ export function getWriteBarrierMs(device) {
11
+ if (device.category === DeviceCategory.Lock) {
12
+ return LOCK_WRITE_BARRIER_MS;
13
+ }
14
+ return DEFAULT_WRITE_BARRIER_MS;
15
+ }
9
16
  //# sourceMappingURL=quirks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quirks.js","sourceRoot":"","sources":["../../src/quirks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,QAAQ;CACP,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,MAAM;QACzC,MAAM,CAAC,yBAAyB,EAAE,YAAY,KAAK,mBAAmB,CAAC,KAAK,CAC7E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"quirks.js","sourceRoot":"","sources":["../../src/quirks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGhF,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,QAAQ;CACP,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,MAAM;QACzC,MAAM,CAAC,yBAAyB,EAAE,YAAY,KAAK,mBAAmB,CAAC,KAAK,CAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,OAAO,wBAAwB,CAAC;AAClC,CAAC"}
@@ -35,8 +35,6 @@ export interface IotasClientOptions {
35
35
  export interface FeatureCacheOptions {
36
36
  /** Polling interval in ms. Default: 30_000 */
37
37
  pollIntervalMs?: number;
38
- /** Write barrier duration in ms. Default: 5_000 */
39
- writeBarrierMs?: number;
40
38
  /** Base delay for exponential backoff on poll failure in ms. Default: 5_000 */
41
39
  pollBackoffBaseMs?: number;
42
40
  /** Maximum backoff delay on poll failure in ms. Default: 300_000 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iotas-ts",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Wrapper around the IOTAS API for use in matterbridge and homebridge ",
5
5
  "author": "Augusto Meza <mezaugusto@proton.me>",
6
6
  "license": "Apache-2.0",