iotas-ts 0.1.0 → 0.2.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 ADDED
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## [0.2.0](https://github.com/mezaugusto/iotas-ts/compare/v0.1.1...v0.2.0) (2026-04-12)
4
+
5
+
6
+ ### Features
7
+
8
+ * :sparkles: Implement allow/deny listing devices ([#6](https://github.com/mezaugusto/iotas-ts/issues/6)) ([0ef03c5](https://github.com/mezaugusto/iotas-ts/commit/0ef03c5ccf6acb9ffcf1238d69352625d5b9f5cd))
9
+
10
+ ## 0.1.1 (2026-04-11)
11
+
12
+ ### Features
13
+
14
+ - :sparkles: Initial abstraction from homebridge plugin ([#1](https://github.com/mezaugusto/iotas-ts/issues/1)) ([8907c54](https://github.com/mezaugusto/iotas-ts/commit/8907c54d69be6c3f3d8702da8412b26bc6a62298))
@@ -2,6 +2,8 @@ import type { IotasLogger } from '../logger.js';
2
2
  import type { IotasClient } from '../api/iotasClient.js';
3
3
  import type { FeatureCacheOptions, Rooms } from '../types.js';
4
4
  export type FeatureChangeCallback = (changed: Map<string, number>) => void;
5
+ /** Optional transform applied to every rooms snapshot (discovery and polling). */
6
+ export type SnapshotFilter = (rooms: Rooms) => Rooms;
5
7
  /**
6
8
  * FeatureCache provides cached feature values with background polling.
7
9
  *
@@ -23,6 +25,7 @@ export declare class FeatureCache {
23
25
  private readonly writeBarrierMs;
24
26
  private readonly pollBackoffBaseMs;
25
27
  private readonly pollBackoffMaxMs;
28
+ private readonly snapshotFilter?;
26
29
  constructor(log: IotasLogger, client: IotasClient, options?: FeatureCacheOptions);
27
30
  seed(rooms: Rooms): void;
28
31
  get(featureId: string): number | undefined;
@@ -23,6 +23,7 @@ export class FeatureCache {
23
23
  writeBarrierMs;
24
24
  pollBackoffBaseMs;
25
25
  pollBackoffMaxMs;
26
+ snapshotFilter;
26
27
  constructor(log, client, options) {
27
28
  this.log = log;
28
29
  this.client = client;
@@ -30,6 +31,7 @@ export class FeatureCache {
30
31
  this.writeBarrierMs = options?.writeBarrierMs ?? DEFAULT_WRITE_BARRIER_MS;
31
32
  this.pollBackoffBaseMs = options?.pollBackoffBaseMs ?? DEFAULT_POLL_BACKOFF_BASE_MS;
32
33
  this.pollBackoffMaxMs = options?.pollBackoffMaxMs ?? DEFAULT_POLL_BACKOFF_MAX_MS;
34
+ this.snapshotFilter = options?.snapshotFilter;
33
35
  }
34
36
  seed(rooms) {
35
37
  for (const room of rooms) {
@@ -111,7 +113,10 @@ export class FeatureCache {
111
113
  return;
112
114
  }
113
115
  try {
114
- const rooms = await this.client.getRooms();
116
+ let rooms = await this.client.getRooms();
117
+ if (this.snapshotFilter) {
118
+ rooms = this.snapshotFilter(rooms);
119
+ }
115
120
  this.updateFromSnapshot(rooms);
116
121
  this.consecutiveFailures = 0;
117
122
  this.schedulePoll(this.pollIntervalMs);
@@ -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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"}
@@ -1,6 +1,7 @@
1
1
  export type { IotasLogger } from './logger.js';
2
2
  export { IotasClient } from './api/iotasClient.js';
3
3
  export { FeatureCache } from './cache/featureCache.js';
4
- export type { FeatureChangeCallback } from './cache/featureCache.js';
4
+ export type { FeatureChangeCallback, SnapshotFilter } from './cache/featureCache.js';
5
5
  export type { Room, Rooms, Device, Feature, Residency, AuthResponse, AccountResponse, PhysicalDeviceDescription, IotasClientOptions, IotasTokens, FeatureCacheOptions, } from './types.js';
6
- export { Temperature } from './utils.js';
6
+ export { Temperature, filterDevices } from './utils.js';
7
+ export type { DeviceFilterOptions } from './utils.js';
package/dist/src/index.js CHANGED
@@ -3,5 +3,5 @@ export { IotasClient } from './api/iotasClient.js';
3
3
  // Caching
4
4
  export { FeatureCache } from './cache/featureCache.js';
5
5
  // Utilities
6
- export { Temperature } from './utils.js';
6
+ export { Temperature, filterDevices } from './utils.js';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAkBvD,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAkBvD,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -41,6 +41,8 @@ export interface FeatureCacheOptions {
41
41
  pollBackoffBaseMs?: number;
42
42
  /** Maximum backoff delay on poll failure in ms. Default: 300_000 */
43
43
  pollBackoffMaxMs?: number;
44
+ /** Optional transform applied to every rooms snapshot (discovery and polling). */
45
+ snapshotFilter?: (rooms: Rooms) => Rooms;
44
46
  }
45
47
  export interface Room {
46
48
  id: number;
@@ -1,4 +1,22 @@
1
+ import type { Rooms } from './types.js';
1
2
  export declare const Temperature: {
2
3
  readonly toFahrenheit: (c: number) => number;
3
4
  readonly toCelsius: (f: number) => number;
4
5
  };
6
+ export interface DeviceFilterOptions {
7
+ /** Only include devices whose name is in this list (case-insensitive, trimmed). */
8
+ allowList?: string[];
9
+ /** Exclude devices whose name is in this list (case-insensitive, trimmed). */
10
+ denyList?: string[];
11
+ }
12
+ /**
13
+ * Filter devices in rooms by allowList and/or denyList.
14
+ *
15
+ * - If allowList is non-empty, only devices matching it are kept.
16
+ * - If denyList is non-empty, matching devices are excluded.
17
+ * - Both can be applied simultaneously (allowed AND not denied).
18
+ * - Matching is case-insensitive and trimmed.
19
+ * - Rooms with no remaining devices are excluded from the result.
20
+ * - Returns a new array; input is not mutated.
21
+ */
22
+ export declare function filterDevices(rooms: Rooms, options?: DeviceFilterOptions): Rooms;
package/dist/src/utils.js CHANGED
@@ -2,4 +2,47 @@ export const Temperature = {
2
2
  toFahrenheit: (c) => (c * 9) / 5 + 32,
3
3
  toCelsius: (f) => ((f - 32) * 5) / 9,
4
4
  };
5
+ function normalizeSet(list) {
6
+ if (!list || list.length === 0) {
7
+ return new Set();
8
+ }
9
+ return new Set(list.map((s) => s.trim().toLowerCase()));
10
+ }
11
+ /**
12
+ * Filter devices in rooms by allowList and/or denyList.
13
+ *
14
+ * - If allowList is non-empty, only devices matching it are kept.
15
+ * - If denyList is non-empty, matching devices are excluded.
16
+ * - Both can be applied simultaneously (allowed AND not denied).
17
+ * - Matching is case-insensitive and trimmed.
18
+ * - Rooms with no remaining devices are excluded from the result.
19
+ * - Returns a new array; input is not mutated.
20
+ */
21
+ export function filterDevices(rooms, options) {
22
+ if (!options) {
23
+ return rooms;
24
+ }
25
+ const allowSet = normalizeSet(options.allowList);
26
+ const denySet = normalizeSet(options.denyList);
27
+ if (allowSet.size === 0 && denySet.size === 0) {
28
+ return rooms;
29
+ }
30
+ const filtered = [];
31
+ for (const room of rooms) {
32
+ const devices = room.devices.filter((device) => {
33
+ const name = device.name.trim().toLowerCase();
34
+ if (allowSet.size > 0 && !allowSet.has(name)) {
35
+ return false;
36
+ }
37
+ if (denySet.size > 0 && denySet.has(name)) {
38
+ return false;
39
+ }
40
+ return true;
41
+ });
42
+ if (devices.length > 0) {
43
+ filtered.push({ ...room, devices });
44
+ }
45
+ }
46
+ return filtered;
47
+ }
5
48
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;IAC7C,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;CACpC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;IAC7C,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;CACpC,CAAC;AASX,SAAS,YAAY,CAAC,IAAe;IACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,OAA6B;IACvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAU,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iotas-ts",
3
- "version": "0.1.0",
3
+ "version": "0.2.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",