@homebridge-plugins/homebridge-eufy-security 5.0.0-beta.4 → 5.0.0-beta.41

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 (121) hide show
  1. package/CONTRIBUTING.md +9 -17
  2. package/config.schema.json +60 -0
  3. package/dist/account/ownership.js +16 -16
  4. package/dist/account/ownership.js.map +1 -1
  5. package/dist/account/persistence.js +24 -74
  6. package/dist/account/persistence.js.map +1 -1
  7. package/dist/account/temporary-authentication.js +5 -3
  8. package/dist/account/temporary-authentication.js.map +1 -1
  9. package/dist/configuration.js +50 -13
  10. package/dist/configuration.js.map +1 -1
  11. package/dist/device/member-evidence.js +11 -4
  12. package/dist/device/member-evidence.js.map +1 -1
  13. package/dist/device/member-trust.js +14 -32
  14. package/dist/device/member-trust.js.map +1 -1
  15. package/dist/device/snapshot.js +6 -18
  16. package/dist/device/snapshot.js.map +1 -1
  17. package/dist/diagnostics.js +966 -337
  18. package/dist/diagnostics.js.map +1 -1
  19. package/dist/homekit/adapter.js +4 -1
  20. package/dist/homekit/adapter.js.map +1 -1
  21. package/dist/homekit/adapters/battery.js +3 -3
  22. package/dist/homekit/adapters/battery.js.map +1 -1
  23. package/dist/homekit/adapters/camera-controls.js +15 -37
  24. package/dist/homekit/adapters/camera-controls.js.map +1 -1
  25. package/dist/homekit/adapters/camera-streaming.js +74 -48
  26. package/dist/homekit/adapters/camera-streaming.js.map +1 -1
  27. package/dist/homekit/adapters/contact.js +5 -5
  28. package/dist/homekit/adapters/contact.js.map +1 -1
  29. package/dist/homekit/adapters/doorbell.js +3 -15
  30. package/dist/homekit/adapters/doorbell.js.map +1 -1
  31. package/dist/homekit/adapters/lock.js +72 -221
  32. package/dist/homekit/adapters/lock.js.map +1 -1
  33. package/dist/homekit/adapters/motion.js +3 -3
  34. package/dist/homekit/adapters/motion.js.map +1 -1
  35. package/dist/homekit/adapters/package-sensor.js +63 -0
  36. package/dist/homekit/adapters/package-sensor.js.map +1 -0
  37. package/dist/homekit/adapters/registry.js +2 -0
  38. package/dist/homekit/adapters/registry.js.map +1 -1
  39. package/dist/homekit/adapters/security-system.js +106 -250
  40. package/dist/homekit/adapters/security-system.js.map +1 -1
  41. package/dist/homekit/adapters/siren.js +5 -33
  42. package/dist/homekit/adapters/siren.js.map +1 -1
  43. package/dist/homekit/adapters/smart-light.js +19 -217
  44. package/dist/homekit/adapters/smart-light.js.map +1 -1
  45. package/dist/homekit/coverage-matrix.js +8 -67
  46. package/dist/homekit/coverage-matrix.js.map +1 -1
  47. package/dist/homekit/device-control.js +249 -13
  48. package/dist/homekit/device-control.js.map +1 -1
  49. package/dist/homekit/reconciler.js +25 -9
  50. package/dist/homekit/reconciler.js.map +1 -1
  51. package/dist/media/last-successful-image.js +8 -23
  52. package/dist/media/last-successful-image.js.map +1 -1
  53. package/dist/media/live-preview.js +217 -0
  54. package/dist/media/live-preview.js.map +1 -0
  55. package/dist/media/live-stream.js +689 -160
  56. package/dist/media/live-stream.js.map +1 -1
  57. package/dist/media/recording.js +41 -118
  58. package/dist/media/recording.js.map +1 -1
  59. package/dist/media/snapshot.js +22 -17
  60. package/dist/media/snapshot.js.map +1 -1
  61. package/dist/media/station-live-sessions.js +40 -51
  62. package/dist/media/station-live-sessions.js.map +1 -1
  63. package/dist/platform.js +61 -10
  64. package/dist/platform.js.map +1 -1
  65. package/dist/runtime/channel.js +227 -40
  66. package/dist/runtime/channel.js.map +1 -1
  67. package/dist/runtime/device-settings.js +88 -0
  68. package/dist/runtime/device-settings.js.map +1 -0
  69. package/dist/runtime/owner.js +30 -5
  70. package/dist/runtime/owner.js.map +1 -1
  71. package/dist/runtime/sdk-client.js +21 -17
  72. package/dist/runtime/sdk-client.js.map +1 -1
  73. package/dist/runtime/tracker.js +8 -38
  74. package/dist/runtime/tracker.js.map +1 -1
  75. package/dist/storage.js +1 -1
  76. package/dist/storage.js.map +1 -1
  77. package/dist/ui/dashboard.js +36 -16
  78. package/dist/ui/dashboard.js.map +1 -1
  79. package/dist/ui/runtime-channel-client.js +155 -184
  80. package/dist/ui/runtime-channel-client.js.map +1 -1
  81. package/dist/ui/server.js +94 -41
  82. package/dist/ui/server.js.map +1 -1
  83. package/homebridge-ui/public/app.css +531 -239
  84. package/homebridge-ui/public/assets/icons/auto_fix_high.svg +1 -0
  85. package/homebridge-ui/public/assets/icons/battery_0.svg +1 -0
  86. package/homebridge-ui/public/assets/icons/battery_1.svg +1 -0
  87. package/homebridge-ui/public/assets/icons/battery_2.svg +1 -0
  88. package/homebridge-ui/public/assets/icons/battery_3.svg +1 -0
  89. package/homebridge-ui/public/assets/icons/battery_4.svg +1 -0
  90. package/homebridge-ui/public/assets/icons/battery_5.svg +1 -0
  91. package/homebridge-ui/public/assets/icons/battery_6.svg +1 -0
  92. package/homebridge-ui/public/assets/icons/battery_full.svg +1 -0
  93. package/homebridge-ui/public/assets/icons/contact_support.svg +1 -0
  94. package/homebridge-ui/public/assets/icons/delete.svg +1 -0
  95. package/homebridge-ui/public/assets/icons/download.svg +1 -0
  96. package/homebridge-ui/public/assets/icons/extension_off.svg +1 -0
  97. package/homebridge-ui/public/assets/icons/info.svg +1 -0
  98. package/homebridge-ui/public/assets/icons/key_off.svg +1 -0
  99. package/homebridge-ui/public/assets/icons/keyboard_arrow_left.svg +1 -0
  100. package/homebridge-ui/public/assets/icons/keyboard_arrow_right.svg +1 -0
  101. package/homebridge-ui/public/assets/icons/keyboard_double_arrow_left.svg +1 -0
  102. package/homebridge-ui/public/assets/icons/keyboard_double_arrow_right.svg +1 -0
  103. package/homebridge-ui/public/assets/icons/movie_off.svg +1 -0
  104. package/homebridge-ui/public/assets/icons/play_arrow.svg +1 -0
  105. package/homebridge-ui/public/assets/icons/refresh.svg +1 -0
  106. package/homebridge-ui/public/assets/icons/satellite_alt.svg +1 -0
  107. package/homebridge-ui/public/assets/icons/search_off.svg +1 -0
  108. package/homebridge-ui/public/assets/icons/sensors_off.svg +1 -0
  109. package/homebridge-ui/public/assets/icons/settings_photo_camera.svg +1 -0
  110. package/homebridge-ui/public/assets/icons/solar_power.svg +1 -0
  111. package/homebridge-ui/public/assets/icons/stop.svg +1 -0
  112. package/homebridge-ui/public/assets/icons/videocam_off.svg +1 -0
  113. package/homebridge-ui/public/i18n/en.json +161 -82
  114. package/homebridge-ui/public/i18n/fr.json +162 -83
  115. package/homebridge-ui/public/index.html +224 -96
  116. package/homebridge-ui/public/js/app.js +821 -435
  117. package/homebridge-ui/public/js/dashboard.js +148 -31
  118. package/i18n/runtime/en.json +10 -3
  119. package/package.json +10 -11
  120. package/homebridge-ui/public/js/legacy-settings.js +0 -37
  121. package/homebridge-ui/public/js/profile-wizard.js +0 -61
@@ -4,7 +4,8 @@ import { createServer } from 'node:net';
4
4
  import { tmpdir } from 'node:os';
5
5
  import { posix } from 'node:path';
6
6
  import { StringDecoder } from 'node:string_decoder';
7
- import { isSupportCaseId } from '../diagnostics.js';
7
+ import { isRecord } from '../configuration.js';
8
+ import { isSupportCaseId, knownCondition } from '../diagnostics.js';
8
9
  import { isBatteryLevel } from '../device/member-trust.js';
9
10
  /**
10
11
  * How many bytes `sockaddr_un.sun_path` holds, per platform, including the terminator.
@@ -47,6 +48,39 @@ export const RUNTIME_DIAGNOSTICS_PATH = '/diagnostics/authorization';
47
48
  export const RUNTIME_STAND_DOWN_PATH = '/runtime/stand-down';
48
49
  /** The path an end-and-respawn is requested on, so a superseded runtime is replaced by the installed build. */
49
50
  export const RUNTIME_RESTART_PATH = '/runtime/restart';
51
+ /** The path that answers the eufy settings one device states, among {@link DEVICE_SETTINGS}. */
52
+ export const RUNTIME_DEVICE_SETTINGS_PATH = '/runtime/device-settings';
53
+ /** The path one eufy setting of one device is written on. */
54
+ export const RUNTIME_DEVICE_SETTING_WRITE_PATH = '/runtime/device-settings/write';
55
+ /**
56
+ * The path one camera's live preview streams on: a base64 JPEG frame per picture under the request's id, beside
57
+ * the side it shows, the HomeKit side's encoder and that encoder's rate, then a refusal once it ends, carrying
58
+ * `unplayable` where the last HomeKit run yielded no picture. An empty `homekit` picture is a HomeKit run that
59
+ * ended without one while the camera side goes on. Closing the connection stops it.
60
+ */
61
+ export const RUNTIME_DEVICE_LIVE_PATH = '/runtime/device-live';
62
+ /** The path that restarts the HomeKit side of a camera's running live preview with other settings. */
63
+ export const RUNTIME_DEVICE_LIVE_ADAPT_PATH = '/runtime/device-live/adapt';
64
+ /**
65
+ * The eufy settings this channel reads and writes, and nothing else.
66
+ *
67
+ * Each is a typed SDK member with a confirmed write: `motionDetection` is the motion capability's master switch,
68
+ * `nightVision` and `notificationStyle` are camera settings whose values are the SDK's own enumerations.
69
+ */
70
+ export const DEVICE_SETTINGS = ['motionDetection', 'nightVision', 'notificationStyle'];
71
+ /** The end reason a live preview refusal carries where the coded video yielded no picture. */
72
+ export const LIVE_UNPLAYABLE = 'unplayable';
73
+ /** Room a live picture leaves in its frame for the envelope around it. */
74
+ const LIVE_FRAME_MARGIN = 1024;
75
+ /** The longest serial a settings request may name, which bounds what an inbound body can carry. */
76
+ const MAX_SERIAL_LENGTH = 64;
77
+ /**
78
+ * How long a client waits for a settings write, measured from the request.
79
+ *
80
+ * A write reaches the device over its station's session, which may first have to be connected, so it outlasts an
81
+ * ordinary answer.
82
+ */
83
+ export const RUNTIME_CHANNEL_WRITE_TIMEOUT_MS = 20_000;
50
84
  /**
51
85
  * How long a client waits for a requested stand-down, measured from the request.
52
86
  *
@@ -146,6 +180,9 @@ export function answeredStatus(status) {
146
180
  ...(status.generation === undefined ? {} : { generation: status.generation }),
147
181
  complete: status.complete,
148
182
  updatedAt: status.updatedAt,
183
+ ...(status.conditions === undefined
184
+ ? {}
185
+ : { conditions: status.conditions.flatMap((condition) => knownCondition(condition) ?? []) }),
149
186
  };
150
187
  }
151
188
  /**
@@ -160,6 +197,7 @@ export function answeredDevice(device) {
160
197
  ...(device.availability === undefined ? {} : { availability: device.availability }),
161
198
  ...(device.enabled === undefined ? {} : { enabled: device.enabled }),
162
199
  ...(device.battery === undefined ? {} : { battery: device.battery }),
200
+ ...(device.station === undefined ? {} : { station: device.station }),
163
201
  };
164
202
  }
165
203
  /**
@@ -170,17 +208,98 @@ export function answeredDevice(device) {
170
208
  * runtime. Nothing is the answer for a body that carries no such identifier.
171
209
  */
172
210
  export function noticedAuthorization(value) {
173
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
211
+ if (!isRecord(value)) {
174
212
  return undefined;
175
213
  }
176
214
  const candidate = value;
177
215
  return isSupportCaseId(candidate.supportCaseId) ? { supportCaseId: candidate.supportCaseId } : undefined;
178
216
  }
217
+ function isDeviceSettingName(value) {
218
+ return typeof value === 'string' && DEVICE_SETTINGS.includes(value);
219
+ }
220
+ function isSerial(value) {
221
+ return typeof value === 'string' && value.length > 0 && value.length <= MAX_SERIAL_LENGTH;
222
+ }
223
+ /** Whether a value is one a setting takes: a boolean for the switch, a whole number for an enumeration. */
224
+ function isDeviceSettingValue(setting, value) {
225
+ return setting === 'motionDetection' ? typeof value === 'boolean' : Number.isInteger(value);
226
+ }
227
+ /**
228
+ * Projects an inbound body onto a settings read, or nothing.
229
+ *
230
+ * Untrusted input in the process that owns the Eufy session, so it is narrowed to one bounded serial.
231
+ */
232
+ export function noticedDeviceSettingsQuery(value) {
233
+ if (!isRecord(value)) {
234
+ return undefined;
235
+ }
236
+ const candidate = value;
237
+ return isSerial(candidate.serial) ? { serial: candidate.serial } : undefined;
238
+ }
239
+ /**
240
+ * Projects an inbound body onto a live preview query, or nothing: a bounded serial, an ask of the closed set, and
241
+ * each live video setting a boolean.
242
+ */
243
+ export function noticedLivePreviewQuery(value) {
244
+ const query = noticedDeviceSettingsQuery(value);
245
+ const candidate = value?.adaptation;
246
+ if (!query || !isRecord(candidate))
247
+ return undefined;
248
+ const { ask, smallVideoPackets, liveVideoPassthrough, hardwareVideoEncoder, ignoreHomeBitRate } = candidate;
249
+ const settings = { smallVideoPackets, liveVideoPassthrough, hardwareVideoEncoder, ignoreHomeBitRate };
250
+ if ((ask !== 'wifi' && ask !== 'cellular') || Object.values(settings).some((on) => typeof on !== 'boolean')) {
251
+ return undefined;
252
+ }
253
+ return { serial: query.serial, adaptation: { ask, ...settings } };
254
+ }
255
+ /**
256
+ * Projects an inbound body onto one settings write, or nothing.
257
+ *
258
+ * Narrowed to a bounded serial, a setting of {@link DEVICE_SETTINGS}, and a value of the type that setting takes.
259
+ */
260
+ export function noticedDeviceSettingWrite(value) {
261
+ if (!isRecord(value)) {
262
+ return undefined;
263
+ }
264
+ const candidate = value;
265
+ if (!isSerial(candidate.serial) || !isDeviceSettingName(candidate.setting)) {
266
+ return undefined;
267
+ }
268
+ return isDeviceSettingValue(candidate.setting, candidate.value)
269
+ ? { serial: candidate.serial, setting: candidate.setting, value: candidate.value }
270
+ : undefined;
271
+ }
272
+ /** Projects one device setting onto the closed set of fields this protocol carries. */
273
+ export function answeredDeviceSetting(setting) {
274
+ return {
275
+ setting: setting.setting,
276
+ value: setting.value,
277
+ ...(setting.labels === undefined ? {} : { labels: { ...setting.labels } }),
278
+ writable: setting.writable,
279
+ };
280
+ }
281
+ /** Whether a value is the device settings this protocol version carries, each with its declared shape. */
282
+ export function areRuntimeChannelDeviceSettings(value) {
283
+ return (Array.isArray(value) &&
284
+ value.every((entry) => {
285
+ if (!isRecord(entry)) {
286
+ return false;
287
+ }
288
+ const candidate = entry;
289
+ return (isDeviceSettingName(candidate.setting) &&
290
+ isDeviceSettingValue(candidate.setting, candidate.value) &&
291
+ typeof candidate.writable === 'boolean' &&
292
+ (candidate.labels === undefined ||
293
+ (typeof candidate.labels === 'object' &&
294
+ candidate.labels !== null &&
295
+ Object.values(candidate.labels).every((label) => typeof label === 'string'))));
296
+ }));
297
+ }
179
298
  /** Whether a value is the device observations this protocol version carries, each with its declared shape. */
180
299
  export function areRuntimeChannelDevices(value) {
181
300
  return (Array.isArray(value) &&
182
301
  value.every((entry) => {
183
- if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
302
+ if (!isRecord(entry)) {
184
303
  return false;
185
304
  }
186
305
  const candidate = entry;
@@ -189,7 +308,8 @@ export function areRuntimeChannelDevices(value) {
189
308
  candidate.availability === 'available' ||
190
309
  candidate.availability === 'unavailable') &&
191
310
  (candidate.enabled === undefined || typeof candidate.enabled === 'boolean') &&
192
- (candidate.battery === undefined || isBatteryLevel(candidate.battery)));
311
+ (candidate.battery === undefined || isBatteryLevel(candidate.battery)) &&
312
+ (candidate.station === undefined || isSerial(candidate.station)));
193
313
  }));
194
314
  }
195
315
  /**
@@ -199,7 +319,7 @@ export function areRuntimeChannelDevices(value) {
199
319
  * at, so an answer arriving on this channel is untrusted input.
200
320
  */
201
321
  export function isRuntimeChannelStatus(value) {
202
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
322
+ if (!isRecord(value)) {
203
323
  return false;
204
324
  }
205
325
  const candidate = value;
@@ -207,7 +327,8 @@ export function isRuntimeChannelStatus(value) {
207
327
  typeof candidate.status === 'string' &&
208
328
  typeof candidate.complete === 'boolean' &&
209
329
  typeof candidate.updatedAt === 'string' &&
210
- (candidate.generation === undefined || typeof candidate.generation === 'string'));
330
+ (candidate.generation === undefined || typeof candidate.generation === 'string') &&
331
+ (candidate.conditions === undefined || Array.isArray(candidate.conditions)));
211
332
  }
212
333
  /**
213
334
  * Serves the runtime channel for as long as this process holds the account ownership lease.
@@ -224,27 +345,18 @@ export class RuntimeChannelServer {
224
345
  status;
225
346
  server;
226
347
  connections = new Set();
227
- protocol;
228
- idleTimeoutMs;
229
- frameBytes;
230
- devices;
231
- authorization;
232
- standDown;
233
- version;
234
- restartable;
235
- restart;
348
+ options;
349
+ /** The running live previews by camera serial, which an adapt request reaches. */
350
+ previews = new Map();
236
351
  constructor(endpoint, status, options = {}) {
237
352
  this.endpoint = endpoint;
238
353
  this.status = status;
239
- this.protocol = options.protocol ?? RUNTIME_CHANNEL_PROTOCOL;
240
- this.idleTimeoutMs = options.idleTimeoutMs ?? RUNTIME_CHANNEL_IDLE_TIMEOUT_MS;
241
- this.frameBytes = options.frameBytes ?? RUNTIME_CHANNEL_FRAME_BYTES;
242
- this.devices = options.devices;
243
- this.authorization = options.authorization;
244
- this.standDown = options.standDown;
245
- this.version = options.version;
246
- this.restartable = options.restartable;
247
- this.restart = options.restart;
354
+ this.options = {
355
+ ...options,
356
+ protocol: options.protocol ?? RUNTIME_CHANNEL_PROTOCOL,
357
+ idleTimeoutMs: options.idleTimeoutMs ?? RUNTIME_CHANNEL_IDLE_TIMEOUT_MS,
358
+ frameBytes: options.frameBytes ?? RUNTIME_CHANNEL_FRAME_BYTES,
359
+ };
248
360
  }
249
361
  /** Binds the endpoint, reporting whether it bound. An unbound channel is an absent one. */
250
362
  async open() {
@@ -294,25 +406,46 @@ export class RuntimeChannelServer {
294
406
  * A provider reaches into the runtime's own registry and manifest evidence, or reads a file and writes a
295
407
  * record, any of which may throw. This runs inside a socket's data listener, where a thrown error is an
296
408
  * uncaught exception in the process that owns the Eufy session, so no request on this channel may be able to
297
- * end it. A refusal is a state every consumer already handles.
409
+ * end it. A refusal is a state every consumer already handles. A settings write is the one answer that waits
410
+ * on the device, and a rejected write is refused the same way.
298
411
  */
299
412
  answered(request) {
300
413
  try {
414
+ if (request.path === RUNTIME_DEVICE_SETTINGS_PATH && this.options.deviceSettings) {
415
+ const query = noticedDeviceSettingsQuery(request.body);
416
+ const settings = query ? this.options.deviceSettings(query) : undefined;
417
+ return settings
418
+ ? { id: request.id, ok: true, data: settings.map(answeredDeviceSetting) }
419
+ : { id: request.id, ok: false };
420
+ }
421
+ if (request.path === RUNTIME_DEVICE_SETTING_WRITE_PATH && this.options.writeDeviceSetting) {
422
+ const write = noticedDeviceSettingWrite(request.body);
423
+ if (!write) {
424
+ return { id: request.id, ok: false };
425
+ }
426
+ return this.options.writeDeviceSetting(write).then((ok) => ({ id: request.id, ok }), () => ({ id: request.id, ok: false }));
427
+ }
428
+ if (request.path === RUNTIME_DEVICE_LIVE_ADAPT_PATH) {
429
+ const query = noticedLivePreviewQuery(request.body);
430
+ const preview = query && this.previews.get(query.serial);
431
+ preview?.adapt(query.adaptation);
432
+ return { id: request.id, ok: preview !== undefined };
433
+ }
301
434
  if (request.path === RUNTIME_STATUS_PATH) {
302
435
  return { id: request.id, ok: true, data: answeredStatus(this.status()) };
303
436
  }
304
- if (request.path === RUNTIME_DEVICES_PATH && this.devices) {
305
- return { id: request.id, ok: true, data: this.devices().map(answeredDevice) };
437
+ if (request.path === RUNTIME_DEVICES_PATH && this.options.devices) {
438
+ return { id: request.id, ok: true, data: this.options.devices().map(answeredDevice) };
306
439
  }
307
- if (request.path === RUNTIME_DIAGNOSTICS_PATH && this.authorization) {
440
+ if (request.path === RUNTIME_DIAGNOSTICS_PATH && this.options.authorization) {
308
441
  const notice = noticedAuthorization(request.body);
309
- return { id: request.id, ok: notice !== undefined && this.authorization(notice) };
442
+ return { id: request.id, ok: notice !== undefined && this.options.authorization(notice) };
310
443
  }
311
- if (request.path === RUNTIME_STAND_DOWN_PATH && this.standDown) {
312
- return { id: request.id, ok: this.standDown() };
444
+ if (request.path === RUNTIME_STAND_DOWN_PATH && this.options.standDown) {
445
+ return { id: request.id, ok: this.options.standDown() };
313
446
  }
314
- if (request.path === RUNTIME_RESTART_PATH && this.restart) {
315
- return { id: request.id, ok: this.restart() };
447
+ if (request.path === RUNTIME_RESTART_PATH && this.options.restart) {
448
+ return { id: request.id, ok: this.options.restart() };
316
449
  }
317
450
  }
318
451
  catch {
@@ -331,20 +464,21 @@ export class RuntimeChannelServer {
331
464
  }
332
465
  serve(connection) {
333
466
  this.connections.add(connection);
334
- connection.setTimeout(this.idleTimeoutMs, () => connection.destroy());
467
+ connection.setTimeout(this.options.idleTimeoutMs, () => connection.destroy());
335
468
  connection.on('error', () => connection.destroy());
336
469
  connection.on('close', () => this.connections.delete(connection));
337
470
  const current = this.status();
338
471
  const greeting = {
339
- protocol: this.protocol,
472
+ protocol: this.options.protocol,
340
473
  ready: ready(current.state),
341
474
  state: current.state,
342
475
  ...(current.generation === undefined ? {} : { generation: current.generation }),
343
- ...(this.version === undefined ? {} : { version: this.version }),
344
- ...(this.restartable === undefined ? {} : { restartable: this.restartable }),
476
+ ...(this.options.version === undefined ? {} : { version: this.options.version }),
477
+ ...(this.options.build === undefined ? {} : { build: this.options.build }),
478
+ ...(this.options.restartable === undefined ? {} : { restartable: this.options.restartable }),
345
479
  };
346
480
  connection.write(`${JSON.stringify(greeting)}\n`);
347
- const reader = new FrameReader(this.frameBytes);
481
+ const reader = new FrameReader(this.options.frameBytes);
348
482
  connection.on('data', (chunk) => {
349
483
  const frames = reader.accept(chunk);
350
484
  if (!frames) {
@@ -365,11 +499,64 @@ export class RuntimeChannelServer {
365
499
  connection.destroy();
366
500
  return;
367
501
  }
368
- if (typeof request?.id !== 'number' || request.v !== this.protocol) {
502
+ if (typeof request?.id !== 'number' || request.v !== this.options.protocol) {
369
503
  connection.destroy();
370
504
  return;
371
505
  }
372
- connection.write(`${JSON.stringify(this.answered(request))}\n`);
506
+ if (request.path === RUNTIME_DEVICE_LIVE_PATH && this.options.deviceLive) {
507
+ this.streamLive(connection, request, this.options.deviceLive);
508
+ return;
509
+ }
510
+ void Promise.resolve(this.answered(request)).then((response) => {
511
+ if (!connection.destroyed) {
512
+ connection.write(`${JSON.stringify(response)}\n`);
513
+ }
514
+ });
515
+ }
516
+ /**
517
+ * Streams one camera's live preview on this connection until it ends or the connection closes.
518
+ *
519
+ * A picture is dropped while the reader has not taken the previous ones, and one too large for a frame is
520
+ * dropped too: these are pictures for a person to look at, so the next one replaces a missed one. An empty
521
+ * picture is never dropped for a slow reader, because no next one replaces it. A provider that faults or has no
522
+ * preview to give is refused, like any other request.
523
+ */
524
+ streamLive(connection, request, deviceLive) {
525
+ const ended = (unplayable = false) => {
526
+ const response = { id: request.id, ok: false, ...(unplayable ? { data: LIVE_UNPLAYABLE } : {}) };
527
+ if (!connection.destroyed)
528
+ connection.write(`${JSON.stringify(response)}\n`);
529
+ };
530
+ const query = noticedLivePreviewQuery(request.body);
531
+ let preview;
532
+ try {
533
+ preview = query
534
+ ? deviceLive(query, (jpeg, coding) => {
535
+ const data = jpeg.toString('base64');
536
+ if (connection.destroyed || (connection.writableNeedDrain && jpeg.length > 0))
537
+ return;
538
+ if (data.length > this.options.frameBytes - LIVE_FRAME_MARGIN)
539
+ return;
540
+ const { side, encoder, kbps } = coding;
541
+ const response = { id: request.id, ok: true, data, coding: { side, encoder, kbps } };
542
+ connection.write(`${JSON.stringify(response)}\n`);
543
+ }, ended)
544
+ : undefined;
545
+ }
546
+ catch {
547
+ preview = undefined;
548
+ }
549
+ if (!query || !preview) {
550
+ ended();
551
+ return;
552
+ }
553
+ const running = preview;
554
+ this.previews.set(query.serial, running);
555
+ connection.once('close', () => {
556
+ if (this.previews.get(query.serial) === running)
557
+ this.previews.delete(query.serial);
558
+ running.stop();
559
+ });
373
560
  }
374
561
  }
375
562
  //# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/runtime/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/runtime/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /** The capability and getter each setting is read through, which is also where `describe()` states it. */
2
+ const SETTING_MEMBERS = {
3
+ motionDetection: { capability: 'motion', accessor: 'detectionEnabled' },
4
+ nightVision: { capability: 'camera', accessor: 'nightVision' },
5
+ notificationStyle: { capability: 'camera', accessor: 'notificationStyle' },
6
+ };
7
+ /** The value one setting states now through its typed getter, or nothing where the device states none. */
8
+ function settingValue(device, setting) {
9
+ switch (setting) {
10
+ case 'motionDetection':
11
+ return device.motion?.()?.detectionEnabled;
12
+ case 'nightVision':
13
+ return device.camera?.()?.nightVision;
14
+ case 'notificationStyle':
15
+ return device.camera?.()?.notificationStyle;
16
+ }
17
+ }
18
+ /**
19
+ * The settings one device states now, each with the labels and writability its own description gives.
20
+ *
21
+ * A setting the device does not state is left out. The capability accessors are calls into the SDK's binding and
22
+ * can fault, which leaves that setting out rather than the whole answer.
23
+ */
24
+ export function readDeviceSettings(device) {
25
+ let details = [];
26
+ try {
27
+ details = device.describe().details;
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ return Object.keys(SETTING_MEMBERS).flatMap((setting) => {
33
+ const member = SETTING_MEMBERS[setting];
34
+ const read = details
35
+ .find((detail) => detail.capability === member.capability)
36
+ ?.reads.find((entry) => entry.accessor === member.accessor);
37
+ let value;
38
+ try {
39
+ value = settingValue(device, setting);
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ if (!read || value === undefined) {
45
+ return [];
46
+ }
47
+ return [
48
+ {
49
+ setting,
50
+ value,
51
+ ...(read.labels === undefined ? {} : { labels: { ...read.labels } }),
52
+ writable: read.writable,
53
+ },
54
+ ];
55
+ });
56
+ }
57
+ /**
58
+ * Writes one setting through its typed setter, reporting whether the SDK delivered it.
59
+ *
60
+ * False where the device offers no setter for it. Delivery is not convergence: the device's next statement of the
61
+ * setting is what says it changed.
62
+ */
63
+ export async function writeDeviceSetting(device, write) {
64
+ switch (write.setting) {
65
+ case 'motionDetection': {
66
+ const motion = device.motion?.();
67
+ if (typeof motion?.setDetection !== 'function' || typeof write.value !== 'boolean')
68
+ return false;
69
+ await motion.setDetection(write.value);
70
+ return true;
71
+ }
72
+ case 'nightVision': {
73
+ const camera = device.camera?.();
74
+ if (typeof camera?.setNightVision !== 'function' || typeof write.value !== 'number')
75
+ return false;
76
+ await camera.setNightVision(write.value);
77
+ return true;
78
+ }
79
+ case 'notificationStyle': {
80
+ const camera = device.camera?.();
81
+ if (typeof camera?.setNotificationStyle !== 'function' || typeof write.value !== 'number')
82
+ return false;
83
+ await camera.setNotificationStyle(write.value);
84
+ return true;
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=device-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-settings.js","sourceRoot":"","sources":["../../src/runtime/device-settings.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { join } from 'node:path';
2
2
  import { AccountOwnership } from '../account/ownership.js';
3
3
  import { AccountSessionPersistence } from '../account/persistence.js';
4
- import { armDiagnosticsAuthorization, PLUGIN_VERSION, reportRuntimeNotice, } from '../diagnostics.js';
4
+ import { armDiagnosticsAuthorization, PLUGIN_BUILD, PLUGIN_VERSION, reportRuntimeNotice, } from '../diagnostics.js';
5
5
  import { indexDeviceEvidence } from '../device/member-evidence.js';
6
- import { batteryLevel, cameraEnablement } from '../device/member-trust.js';
6
+ import { batteryLevel, cameraEnablementReader } from '../device/member-trust.js';
7
7
  import { parseCompleteDeviceSnapshot } from '../device/snapshot.js';
8
8
  import { RuntimeChannelServer, runtimeChannelEndpointForHost, } from './channel.js';
9
+ import { readDeviceSettings, writeDeviceSetting } from './device-settings.js';
9
10
  import { RuntimeTracker, runtimeStatusFor } from './tracker.js';
10
11
  /**
11
12
  * How long a runtime that stood down on request keeps trying to take the account session back.
@@ -15,7 +16,6 @@ import { RuntimeTracker, runtimeStatusFor } from './tracker.js';
15
16
  const REARM_WINDOW_MS = 15 * 60_000;
16
17
  /** How long between attempts to take the account session back after standing down on request. */
17
18
  const REARM_INTERVAL_MS = 15_000;
18
- /** Owns the long-lived SDK session, canonical registry, and runtime state transitions. */
19
19
  /**
20
20
  * Whether a process with this title is a Homebridge child bridge, and so may end itself to be replaced.
21
21
  *
@@ -26,6 +26,7 @@ const REARM_INTERVAL_MS = 15_000;
26
26
  export function isChildBridgeTitle(title) {
27
27
  return title.startsWith('homebridge: ');
28
28
  }
29
+ /** Owns the long-lived SDK session, canonical registry, and runtime state transitions. */
29
30
  export class RuntimeOwner {
30
31
  log;
31
32
  configuredConfig;
@@ -51,6 +52,8 @@ export class RuntimeOwner {
51
52
  cleanupTerminalState;
52
53
  storageRoot;
53
54
  persistence;
55
+ conditions;
56
+ livePreview;
54
57
  shutdownTimeoutMs;
55
58
  rearmWindowMs;
56
59
  rearmIntervalMs;
@@ -72,6 +75,8 @@ export class RuntimeOwner {
72
75
  this.ownership = options.ownership;
73
76
  this.statusPublisher = options.statusPublisher;
74
77
  this.channel = options.channel;
78
+ this.conditions = options.conditions;
79
+ this.livePreview = options.livePreview;
75
80
  if (this.storageRoot) {
76
81
  this.persistence = options.persistence ?? new AccountSessionPersistence(join(this.storageRoot, 'accounts'));
77
82
  }
@@ -337,7 +342,7 @@ export class RuntimeOwner {
337
342
  return { active, config: configuration };
338
343
  }
339
344
  createStatusPublisher() {
340
- return new RuntimeTracker(join(this.storageRoot, 'tracker.json'), 90_000, Date.now, () => {
345
+ return new RuntimeTracker(join(this.storageRoot, 'tracker.json'), Date.now, () => {
341
346
  reportRuntimeNotice(this.log, 'status-publication-failed');
342
347
  });
343
348
  }
@@ -479,8 +484,21 @@ export class RuntimeOwner {
479
484
  authorization: (notice) => armDiagnosticsAuthorization(this.log, storageRoot, notice.supportCaseId),
480
485
  standDown: () => this.standDown(),
481
486
  version: PLUGIN_VERSION,
487
+ build: PLUGIN_BUILD,
482
488
  restartable: isChildBridgeTitle(process.title),
483
489
  restart: () => this.endForReplacement(),
490
+ deviceSettings: ({ serial }) => {
491
+ const device = this.registryView?.registry.get(serial);
492
+ return device ? readDeviceSettings(device) : undefined;
493
+ },
494
+ writeDeviceSetting: async (write) => {
495
+ const device = this.registryView?.registry.get(write.serial);
496
+ return device ? writeDeviceSetting(device, write) : false;
497
+ },
498
+ deviceLive: ({ serial, adaptation }, onPicture, onEnd) => {
499
+ const device = this.registryView?.registry.get(serial);
500
+ return device && this.livePreview ? this.livePreview(device, adaptation, onPicture, onEnd) : undefined;
501
+ },
484
502
  });
485
503
  }
486
504
  if (this.channel && !(await this.channel.open())) {
@@ -517,6 +535,7 @@ export class RuntimeOwner {
517
535
  ...(published?.generation === undefined ? {} : { generation: published.generation }),
518
536
  complete: published?.complete ?? false,
519
537
  updatedAt: new Date().toISOString(),
538
+ ...(this.conditions === undefined ? {} : { conditions: this.conditions() }),
520
539
  };
521
540
  }
522
541
  /**
@@ -537,8 +556,14 @@ export class RuntimeOwner {
537
556
  availability: this.currentAvailability(manifest.sn)?.availability,
538
557
  enabled: this.observedEnablement(view.registry.get(manifest.sn), manifest),
539
558
  battery: this.observedBattery(view.registry.get(manifest.sn), manifest),
559
+ station: this.attachedStation(view.registry.get(manifest.sn)),
540
560
  }));
541
561
  }
562
+ /** The HomeBase a device hangs off, or nothing for a device that is its own station. */
563
+ attachedStation(device) {
564
+ const station = device?.stationSn;
565
+ return station && station !== device.sn ? station : undefined;
566
+ }
542
567
  /**
543
568
  * A camera's enablement where its own surface states one.
544
569
  *
@@ -548,7 +573,7 @@ export class RuntimeOwner {
548
573
  observedEnablement(device, manifest) {
549
574
  try {
550
575
  const camera = device?.camera?.();
551
- return camera ? cameraEnablement(camera, indexDeviceEvidence(manifest).members) : undefined;
576
+ return camera ? cameraEnablementReader(camera, indexDeviceEvidence(manifest).members)() : undefined;
552
577
  }
553
578
  catch {
554
579
  return undefined;