@digital-alchemy/hass 24.9.5 → 24.10.2

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.
Files changed (45) hide show
  1. package/dist/dynamic.d.ts +3 -1
  2. package/dist/extensions/call-proxy.extension.d.ts +1 -1
  3. package/dist/extensions/call-proxy.extension.js +4 -1
  4. package/dist/extensions/call-proxy.extension.js.map +1 -1
  5. package/dist/extensions/entity.extension.js +3 -0
  6. package/dist/extensions/entity.extension.js.map +1 -1
  7. package/dist/extensions/events.extension.d.ts +1 -1
  8. package/dist/extensions/events.extension.js +26 -7
  9. package/dist/extensions/events.extension.js.map +1 -1
  10. package/dist/extensions/internal.extension.js +1 -1
  11. package/dist/extensions/internal.extension.js.map +1 -1
  12. package/dist/extensions/reference.extension.d.ts +51 -1
  13. package/dist/extensions/reference.extension.js +287 -181
  14. package/dist/extensions/reference.extension.js.map +1 -1
  15. package/dist/extensions/websocket-api.extension.js +9 -14
  16. package/dist/extensions/websocket-api.extension.js.map +1 -1
  17. package/dist/hass.module.d.ts +3 -3
  18. package/dist/hass.module.js +3 -3
  19. package/dist/hass.module.js.map +1 -1
  20. package/dist/helpers/entity-state.helper.d.ts +3 -5
  21. package/dist/helpers/interfaces.helper.d.ts +10 -10
  22. package/dist/helpers/interfaces.helper.js.map +1 -1
  23. package/dist/helpers/utility.helper.d.ts +5 -0
  24. package/dist/helpers/utility.helper.js +5 -0
  25. package/dist/helpers/utility.helper.js.map +1 -1
  26. package/dist/mock_assistant/mock-assistant.module.d.ts +4 -4
  27. package/dist/mock_assistant/mock-assistant.module.js +7 -0
  28. package/dist/mock_assistant/mock-assistant.module.js.map +1 -1
  29. package/dist/testing/fetch-api.spec.js +13 -13
  30. package/dist/testing/fetch-api.spec.js.map +1 -1
  31. package/package.json +27 -26
  32. package/scripts/test.sh +1 -1
  33. package/src/dynamic.ts +82 -77
  34. package/src/extensions/call-proxy.extension.ts +10 -1
  35. package/src/extensions/entity.extension.ts +3 -0
  36. package/src/extensions/events.extension.ts +26 -10
  37. package/src/extensions/internal.extension.ts +1 -1
  38. package/src/extensions/reference.extension.ts +314 -200
  39. package/src/extensions/websocket-api.extension.ts +12 -14
  40. package/src/hass.module.ts +4 -4
  41. package/src/helpers/entity-state.helper.ts +3 -4
  42. package/src/helpers/interfaces.helper.ts +10 -9
  43. package/src/helpers/utility.helper.ts +8 -0
  44. package/src/mock_assistant/mock-assistant.module.ts +7 -0
  45. package/src/testing/fetch-api.spec.ts +13 -13
@@ -1,9 +1,58 @@
1
1
  import { DOWN, is, NONE, sleep, UP } from "@digital-alchemy/core";
2
2
  import dayjs from "dayjs";
3
- import { SERVICE_LIST_UPDATED } from "..";
3
+ import { SERVICE_LIST_UPDATED, SOCKET_CONNECTED } from "..";
4
4
  import { domain, } from "../helpers";
5
- export function ReferenceExtension({ hass, logger, internal, event, }) {
6
- const ENTITY_PROXIES = new Map();
5
+ /**
6
+ * ## Overview
7
+ *
8
+ * This service is intended for the creation of type safe entity references based on entity id.
9
+ *
10
+ * ```typescript
11
+ * const ref = hass.refBy.id("switch.example");
12
+ * ```
13
+ *
14
+ * These contain specialized type definitions that gets looked up by entity id, making typescript report info about the desired entity.
15
+ *
16
+ * ## Capabilities
17
+ *
18
+ * ### Event Listeners
19
+ *
20
+ * Run a callback in response to
21
+ * - `.onUpdate((new_state, old_state) => ...)`
22
+ * - `.once((new_state, old_state) => ...)`
23
+ *
24
+ * ### State lookups
25
+ *
26
+ * - `.nextState(timeout?)`
27
+ * - `.waitForState(state, timeout?)`
28
+ * - `.previous.state` | `.previous.attributes`
29
+ *
30
+ * ### Service Calling
31
+ *
32
+ * For services that appear on the same domain as the provided entity, the service call can be made directly from the reference.
33
+ *
34
+ * > Ex: `switch.example` calling `switch.turn_on`
35
+ *
36
+ * ```typescript
37
+ * ref.turn_on();
38
+ * ```
39
+ *
40
+ * The `entity_id` property that would normally be required is automatically provided by the proxy.
41
+ *
42
+ * ### Property Lookups
43
+ *
44
+ * - `.state`
45
+ * - `.entity_id`
46
+ * - `.attributes`
47
+ *
48
+ * ## Garbage Collection
49
+ *
50
+ * - `.removeAllListeners()`
51
+ *
52
+ * The reference may call the remove all active event listeners and timers at any time.
53
+ * It will interrupt any timers (nextState/waitForState), as well as detach any event listeners
54
+ */
55
+ export function ReferenceService({ hass, logger, internal, event, }) {
7
56
  // #MARK:proxyGetLogic
8
57
  function proxyGetLogic(entity, property) {
9
58
  const valid = ["state", "attributes", "last"].some(i => property.startsWith(i));
@@ -28,206 +77,263 @@ export function ReferenceExtension({ hass, logger, internal, event, }) {
28
77
  return (current.attributes || {});
29
78
  }
30
79
  // #MARK: byId
80
+ // ! Calls to this function MUST ALWAYS go through `hass.refBy.id`
81
+ // never call this function directly 💧
31
82
  function byId(entity_id) {
32
83
  const entity_domain = domain(entity_id);
33
- if (!ENTITY_PROXIES.has(entity_id)) {
34
- const { ...thing } = hass.entity.getCurrentState(entity_id);
35
- let loaded = false;
36
- function keys() {
37
- const entityDomain = domain(entity_id);
38
- return [
39
- "attributes",
40
- "entity_id",
41
- "history",
42
- "last",
43
- "nextState",
44
- "once",
45
- "onUpdate",
46
- "previous",
47
- "removeAllListeners",
48
- "state",
49
- "waitForState",
50
- ...hass.configure
51
- .getServices()
52
- .filter(({ domain }) => domain === entityDomain)
53
- .flatMap(i => Object.keys(i.services))
54
- .sort((a, b) => (a > b ? UP : DOWN)),
55
- ];
84
+ const { ...thing } = hass.entity.getCurrentState(entity_id);
85
+ let loaded = false;
86
+ function keys() {
87
+ const entityDomain = domain(entity_id);
88
+ return [
89
+ "attributes",
90
+ "entity_id",
91
+ "history",
92
+ "last",
93
+ "nextState",
94
+ "once",
95
+ "onUpdate",
96
+ "previous",
97
+ "removeAllListeners",
98
+ "state",
99
+ "waitForState",
100
+ ...hass.configure
101
+ .getServices()
102
+ .filter(({ domain }) => domain === entityDomain)
103
+ .flatMap(i => Object.keys(i.services))
104
+ .sort((a, b) => (a > b ? UP : DOWN)),
105
+ ];
106
+ }
107
+ function appendKeys(force = false) {
108
+ if (loaded && !force) {
109
+ return;
56
110
  }
57
- function appendKeys(force = false) {
58
- if (loaded && !force) {
59
- return;
60
- }
61
- // Not gonna build types for this, and ts-expect-error fails in jest
62
- // This is a weird hack for an obscure feature, so sue me
63
- //
64
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
65
- // @ts-ignore
66
- keys().forEach(i => (thing[i] ??= () => { }));
67
- if (!is.empty(hass.configure.getServices())) {
68
- loaded = true;
69
- }
111
+ // Not gonna build types for this, and ts-expect-error fails in jest
112
+ // This is a weird hack for an obscure feature, so sue me
113
+ //
114
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
115
+ // @ts-ignore
116
+ keys().forEach(i => (thing[i] ??= () => { }));
117
+ if (!is.empty(hass.configure.getServices())) {
118
+ loaded = true;
70
119
  }
71
- event.on(SERVICE_LIST_UPDATED, () => appendKeys(true));
72
- ENTITY_PROXIES.set(entity_id,
73
- // just because you can't do generics properly....
74
- new Proxy(thing, {
75
- // things that shouldn't be needed: this extract
76
- // eslint-disable-next-line sonarjs/function-return-type
77
- get: (_, property) => {
78
- switch (property) {
79
- // * onUpdate
80
- case "onUpdate": {
81
- return (callback) => {
82
- const removableCallback = async (a, b) => await internal.safeExec(async () => callback(a, b, remove));
83
- function remove() {
84
- event.removeListener(entity_id, removableCallback);
85
- }
86
- event.on(entity_id, removableCallback);
87
- return { remove };
120
+ }
121
+ event.on(SERVICE_LIST_UPDATED, () => appendKeys(true));
122
+ const listeners = new Set();
123
+ // just because you can't do generics properly....
124
+ return new Proxy(thing, {
125
+ // things that shouldn't be needed: this extract
126
+ // eslint-disable-next-line sonarjs/function-return-type
127
+ get: (_, property) => {
128
+ switch (property) {
129
+ // #MARK: onUpdate
130
+ case "onUpdate": {
131
+ return (callback) => {
132
+ const removableCallback = async (new_state, old_state) => await internal.safeExec(async () => callback(new_state, old_state, remove));
133
+ function remove() {
134
+ event.removeListener(entity_id, removableCallback);
135
+ event.removeListener(SOCKET_CONNECTED, removableCallback);
136
+ listeners.delete(remove);
137
+ logger.trace({ entity_id }, "remove [onUpdate] listener");
138
+ }
139
+ event.on(entity_id, removableCallback);
140
+ event.on(SOCKET_CONNECTED, removableCallback);
141
+ listeners.add(remove);
142
+ return is.removeFn(remove);
143
+ };
144
+ }
145
+ // #MARK: removeAllListeners
146
+ case "removeAllListeners": {
147
+ return function () {
148
+ // remove will delete from set
149
+ listeners.forEach(remove => remove());
150
+ };
151
+ }
152
+ // #MARK: history
153
+ case "history": {
154
+ return async function (from, to) {
155
+ return await hass.fetch.fetchEntityHistory(entity_id, from, to);
156
+ };
157
+ }
158
+ // #MARK: once
159
+ case "once": {
160
+ return (callback) => {
161
+ const remove = () => {
162
+ event.removeListener(entity_id, wrapped);
163
+ listeners.delete(remove);
164
+ logger.trace({ entity_id }, "remove [once] listener");
88
165
  };
89
- }
90
- // * removeAllListeners
91
- case "removeAllListeners": {
92
- return function () {
93
- event.removeAllListeners(entity_id);
166
+ const wrapped = async (a, b) => {
167
+ listeners.delete(remove);
168
+ callback(a, b);
94
169
  };
95
- }
96
- // * history
97
- case "history": {
98
- return async function (from, to) {
99
- return await hass.fetch.fetchEntityHistory(entity_id, from, to);
170
+ listeners.add(remove);
171
+ event.once(entity_id, wrapped);
172
+ return is.removeFn(remove);
173
+ };
174
+ }
175
+ // #MARK: entity_id
176
+ case "entity_id": {
177
+ return entity_id;
178
+ }
179
+ // #MARK: previous
180
+ case "previous": {
181
+ return hass.entity.previousState(entity_id);
182
+ }
183
+ // #MARK: nextState
184
+ case "nextState": {
185
+ return async (timeout) => await new Promise(async (done) => {
186
+ // - set up cleanup function
187
+ const remove = () => {
188
+ listeners.delete(remove);
189
+ event.removeListener(entity_id, complete);
190
+ done = undefined;
191
+ logger.trace({ entity_id }, "remove [nextState] listener");
192
+ if (wait) {
193
+ logger.trace({ entity_id }, "stopping [nextState] race timer");
194
+ wait.kill("stop");
195
+ }
100
196
  };
101
- }
102
- // * once
103
- case "once": {
104
- return (callback) => event.once(entity_id, async (a, b) => callback(a, b));
105
- }
106
- // * entity_id
107
- case "entity_id": {
108
- return entity_id;
109
- }
110
- // * previous
111
- case "previous": {
112
- return hass.entity.previousState(entity_id);
113
- }
114
- // * nextState
115
- case "nextState": {
116
- return async (timeout) => await new Promise(async (done) => {
117
- const complete = (entity) => {
118
- if (done) {
119
- done(entity);
120
- done = undefined;
121
- }
122
- };
123
- event.once(entity_id, complete);
124
- if (is.number(timeout) && timeout > NONE) {
125
- await sleep(timeout);
126
- if (done) {
127
- logger.debug({ entity_id, name: "nextState", timeout }, "timed out");
128
- done(undefined);
129
- done = undefined;
130
- event.removeListener(entity_id, complete);
131
- }
197
+ listeners.add(remove);
198
+ // - add wrapper & make friendly with race
199
+ const complete = (entity) => {
200
+ if (done) {
201
+ done(entity);
202
+ done = undefined;
132
203
  }
133
- });
134
- }
135
- // * waitForState
136
- case "waitForState": {
137
- return async (state, timeout) => await new Promise(async (done) => {
138
- const complete = (entity) => {
139
- if (entity.state !== state) {
140
- logger.trace({
141
- expected: state,
142
- incoming: entity.state,
143
- name: "waitForState",
144
- }, `state did not match`);
145
- return;
146
- }
147
- if (done) {
148
- done(entity);
149
- done = undefined;
150
- event.removeListener(entity_id, complete);
151
- }
152
- };
153
- event.on(entity_id, complete);
154
- if (is.number(timeout) && timeout > NONE) {
155
- await sleep(timeout);
156
- if (done) {
157
- logger.debug({ entity_id, name: "waitForState", timeout }, "timed out");
158
- done(undefined);
159
- done = undefined;
160
- event.removeListener(entity_id, complete);
161
- }
204
+ };
205
+ // - attach single run listener
206
+ event.once(entity_id, complete);
207
+ // - race!
208
+ let wait;
209
+ if (is.number(timeout) && timeout > NONE) {
210
+ // keep track of sleep so it can be cleaned up also
211
+ wait = sleep(timeout);
212
+ await wait;
213
+ wait = undefined;
214
+ if (done) {
215
+ logger.debug({ entity_id, name: "nextState", timeout }, "timed out");
216
+ done(undefined);
217
+ remove();
162
218
  }
163
- });
164
- }
165
- }
166
- if (hass.configure.isService(entity_domain, property)) {
167
- return async function (data = {}) {
168
- // @ts-expect-error it's fine
169
- return await hass.call[entity_domain][property]({
170
- entity_id,
171
- ...data,
172
- });
173
- };
219
+ }
220
+ });
174
221
  }
175
- return proxyGetLogic(entity_id, property);
176
- },
177
- has(_, property) {
178
- appendKeys();
179
- return property in thing;
180
- },
181
- ownKeys() {
182
- appendKeys();
183
- return Object.keys(thing);
184
- },
185
- set(_, property, value) {
186
- // * state
187
- if (property === "state") {
188
- setImmediate(async () => {
189
- logger.debug({ entity_id, state: value }, `emitting set state via rest`);
190
- await hass.fetch.updateEntity(entity_id, {
191
- state: value,
192
- });
222
+ // #MARK: waitForState
223
+ case "waitForState": {
224
+ return async (state, timeout) => await new Promise(async (done) => {
225
+ const remove = () => {
226
+ done = undefined;
227
+ listeners.delete(remove);
228
+ done = undefined;
229
+ logger.trace({ entity_id }, "remove [waitForState] listener");
230
+ if (wait) {
231
+ logger.trace({ entity_id }, "stopping [waitForState] race timer");
232
+ wait.kill("stop");
233
+ }
234
+ event.removeListener(entity_id, complete);
235
+ };
236
+ listeners.add(remove);
237
+ const complete = (entity) => {
238
+ if (entity.state !== state) {
239
+ logger.trace({
240
+ expected: state,
241
+ incoming: entity.state,
242
+ name: "waitForState",
243
+ }, `state did not match`);
244
+ return;
245
+ }
246
+ if (done) {
247
+ done(entity);
248
+ remove();
249
+ }
250
+ };
251
+ event.on(entity_id, complete);
252
+ let wait;
253
+ if (is.number(timeout) && timeout > NONE) {
254
+ wait = sleep(timeout);
255
+ await wait;
256
+ wait = undefined;
257
+ if (done) {
258
+ logger.debug({ entity_id, name: "waitForState", timeout }, "timed out");
259
+ done(undefined);
260
+ remove();
261
+ }
262
+ }
193
263
  });
194
- return true;
195
264
  }
196
- // * attributes
197
- if (property === "attributes") {
198
- if (!is.object(value)) {
199
- logger.error(`can only provide objects as attributes`);
200
- return false;
201
- }
202
- setImmediate(async () => {
203
- logger.debug({ attributes: Object.keys(value), entity_id }, `updating attributes via rest`);
204
- await hass.fetch.updateEntity(entity_id, {
205
- attributes: value,
206
- });
265
+ }
266
+ // #MARK: service calls
267
+ if (hass.configure.isService(entity_domain, property)) {
268
+ return async function (data = {}) {
269
+ // @ts-expect-error it's fine
270
+ return await hass.call[entity_domain][property]({
271
+ entity_id,
272
+ ...data,
273
+ });
274
+ };
275
+ }
276
+ return proxyGetLogic(entity_id, property);
277
+ },
278
+ // #MARK: has
279
+ has(_, property) {
280
+ appendKeys();
281
+ return property in thing;
282
+ },
283
+ // #MARK: ownKeys
284
+ ownKeys() {
285
+ appendKeys();
286
+ return Object.keys(thing);
287
+ },
288
+ // #MARK: set
289
+ set(_, property, value) {
290
+ // * state
291
+ if (property === "state") {
292
+ setImmediate(async () => {
293
+ logger.debug({ entity_id, state: value }, `emitting set state via rest`);
294
+ await hass.fetch.updateEntity(entity_id, {
295
+ state: value,
207
296
  });
208
- return true;
297
+ });
298
+ return true;
299
+ }
300
+ // * attributes
301
+ if (property === "attributes") {
302
+ if (!is.object(value)) {
303
+ logger.error(`can only provide objects as attributes`);
304
+ return false;
209
305
  }
210
- logger.error({ entity_id, property }, `cannot set property on entity`);
211
- return false;
212
- },
213
- }));
214
- }
215
- return ENTITY_PROXIES.get(entity_id);
306
+ setImmediate(async () => {
307
+ logger.debug({ attributes: Object.keys(value), entity_id }, `updating attributes via rest`);
308
+ await hass.fetch.updateEntity(entity_id, {
309
+ attributes: value,
310
+ });
311
+ });
312
+ return true;
313
+ }
314
+ logger.error({ entity_id, property }, `cannot set property on entity`);
315
+ return false;
316
+ },
317
+ });
216
318
  }
319
+ // #MARK: <return>
217
320
  return {
218
- area: (area, ...domains) => hass.idBy.area(area, ...domains).map(id => byId(id)),
219
- device: (device, ...domains) => hass.idBy.device(device, ...domains).map(id => byId(id)),
220
- domain: (domain) => hass.idBy.domain(domain).map(id => byId(id)),
221
- floor: (floor, ...domains) => hass.idBy.floor(floor, ...domains).map(id => byId(id)),
321
+ area: (area, ...domains) => hass.idBy.area(area, ...domains).map(id => hass.refBy.id(id)),
322
+ device: (device, ...domains) => hass.idBy.device(device, ...domains).map(id => hass.refBy.id(id)),
323
+ domain: (domain) => hass.idBy.domain(domain).map(id => hass.refBy.id(id)),
324
+ floor: (floor, ...domains) => hass.idBy.floor(floor, ...domains).map(id => hass.refBy.id(id)),
222
325
  id: byId,
223
- label: (label, ...domains) => hass.idBy.label(label, ...domains).map(id => byId(id)),
224
- platform: (platform, ...domains) => hass.idBy.platform(platform, ...domains).map(id => byId(id)),
326
+ label: (label, ...domains) => hass.idBy.label(label, ...domains).map(id => hass.refBy.id(id)),
327
+ platform: (platform, ...domains) => hass.idBy.platform(platform, ...domains).map(id => hass.refBy.id(id)),
225
328
  unique_id: (unique_id) => {
226
329
  const id = hass.idBy.unique_id(unique_id);
227
330
  if (!id) {
331
+ // mental note:
332
+ // this is technically fixable, but would require emitting internal events
333
+ // for both entity_id & unique_id
228
334
  return undefined;
229
335
  }
230
- return byId(id);
336
+ return hass.refBy.id(id);
231
337
  },
232
338
  };
233
339
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reference.extension.js","sourceRoot":"","sources":["../../src/extensions/reference.extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reference.extension.js","sourceRoot":"","sources":["../../src/extensions/reference.extension.ts"],"names":[],"mappings":"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"}
@@ -132,17 +132,11 @@ export function WebsocketAPI({ context, event, hass, config, internal, lifecycle
132
132
  // #MARK: attachScheduledFunctions
133
133
  function attachScheduledFunctions() {
134
134
  logger.trace({ name: attachScheduledFunctions }, `attaching interval schedules`);
135
- scheduler.interval({
136
- exec: async () => await manageConnection(),
137
- interval: config.hass.RETRY_INTERVAL * SECOND,
138
- });
139
- scheduler.interval({
140
- exec: () => {
141
- const target = Date.now() - SECOND * config.hass.SOCKET_AVG_DURATION;
142
- MESSAGE_TIMESTAMPS = MESSAGE_TIMESTAMPS.filter(time => time > target);
143
- },
144
- interval: CLEANUP_INTERVAL * SECOND,
145
- });
135
+ scheduler.setInterval(async () => await manageConnection(), config.hass.RETRY_INTERVAL * SECOND);
136
+ scheduler.setInterval(() => {
137
+ const target = Date.now() - SECOND * config.hass.SOCKET_AVG_DURATION;
138
+ MESSAGE_TIMESTAMPS = MESSAGE_TIMESTAMPS.filter(time => time > target);
139
+ }, CLEANUP_INTERVAL * SECOND);
146
140
  }
147
141
  lifecycle.onShutdownStart(async () => {
148
142
  logger.debug({ name: "onShutdownStart" }, `shutdown - tearing down connection`);
@@ -389,15 +383,15 @@ export function WebsocketAPI({ context, event, hass, config, internal, lifecycle
389
383
  else {
390
384
  socketEvents.on(event, callback);
391
385
  }
392
- return () => {
386
+ return is.removeFn(() => {
393
387
  logger.trace({ context, event, name: onEvent }, `removing socket event listener`);
394
388
  socketEvents.removeListener(event, callback);
395
- };
389
+ });
396
390
  }
397
391
  // #MARK: subscribe
398
392
  async function subscribe({ event_type, context, exec, }) {
399
393
  await hass.socket.sendMessage({ event_type, type: "subscribe_events" });
400
- hass.socket.onEvent({
394
+ return hass.socket.onEvent({
401
395
  context,
402
396
  event: event_type,
403
397
  exec,
@@ -414,6 +408,7 @@ export function WebsocketAPI({ context, event, hass, config, internal, lifecycle
414
408
  // attach anyways, for restarts or whatever
415
409
  }
416
410
  event.on(SOCKET_CONNECTED, wrapped);
411
+ return is.removeFn(() => event.removeListener(SOCKET_CONNECTED, wrapped));
417
412
  }
418
413
  // #MARK: return object
419
414
  return {