@homebridge-plugins/homebridge-eufy-security 5.0.0-beta.4 → 5.0.0-beta.40
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/CONTRIBUTING.md +9 -17
- package/config.schema.json +60 -0
- package/dist/account/ownership.js +16 -16
- package/dist/account/ownership.js.map +1 -1
- package/dist/account/persistence.js +24 -74
- package/dist/account/persistence.js.map +1 -1
- package/dist/account/temporary-authentication.js +5 -3
- package/dist/account/temporary-authentication.js.map +1 -1
- package/dist/configuration.js +50 -13
- package/dist/configuration.js.map +1 -1
- package/dist/device/member-evidence.js +11 -4
- package/dist/device/member-evidence.js.map +1 -1
- package/dist/device/member-trust.js +14 -32
- package/dist/device/member-trust.js.map +1 -1
- package/dist/device/snapshot.js +6 -18
- package/dist/device/snapshot.js.map +1 -1
- package/dist/diagnostics.js +951 -334
- package/dist/diagnostics.js.map +1 -1
- package/dist/homekit/adapter.js +4 -1
- package/dist/homekit/adapter.js.map +1 -1
- package/dist/homekit/adapters/battery.js +3 -3
- package/dist/homekit/adapters/battery.js.map +1 -1
- package/dist/homekit/adapters/camera-controls.js +15 -37
- package/dist/homekit/adapters/camera-controls.js.map +1 -1
- package/dist/homekit/adapters/camera-streaming.js +74 -48
- package/dist/homekit/adapters/camera-streaming.js.map +1 -1
- package/dist/homekit/adapters/contact.js +5 -5
- package/dist/homekit/adapters/contact.js.map +1 -1
- package/dist/homekit/adapters/doorbell.js +3 -15
- package/dist/homekit/adapters/doorbell.js.map +1 -1
- package/dist/homekit/adapters/lock.js +72 -221
- package/dist/homekit/adapters/lock.js.map +1 -1
- package/dist/homekit/adapters/motion.js +3 -3
- package/dist/homekit/adapters/motion.js.map +1 -1
- package/dist/homekit/adapters/package-sensor.js +63 -0
- package/dist/homekit/adapters/package-sensor.js.map +1 -0
- package/dist/homekit/adapters/registry.js +2 -0
- package/dist/homekit/adapters/registry.js.map +1 -1
- package/dist/homekit/adapters/security-system.js +106 -250
- package/dist/homekit/adapters/security-system.js.map +1 -1
- package/dist/homekit/adapters/siren.js +5 -33
- package/dist/homekit/adapters/siren.js.map +1 -1
- package/dist/homekit/adapters/smart-light.js +19 -217
- package/dist/homekit/adapters/smart-light.js.map +1 -1
- package/dist/homekit/coverage-matrix.js +8 -67
- package/dist/homekit/coverage-matrix.js.map +1 -1
- package/dist/homekit/device-control.js +249 -13
- package/dist/homekit/device-control.js.map +1 -1
- package/dist/homekit/reconciler.js +25 -9
- package/dist/homekit/reconciler.js.map +1 -1
- package/dist/media/last-successful-image.js +8 -23
- package/dist/media/last-successful-image.js.map +1 -1
- package/dist/media/live-preview.js +217 -0
- package/dist/media/live-preview.js.map +1 -0
- package/dist/media/live-stream.js +689 -160
- package/dist/media/live-stream.js.map +1 -1
- package/dist/media/recording.js +41 -118
- package/dist/media/recording.js.map +1 -1
- package/dist/media/snapshot.js +22 -17
- package/dist/media/snapshot.js.map +1 -1
- package/dist/media/station-live-sessions.js +40 -51
- package/dist/media/station-live-sessions.js.map +1 -1
- package/dist/platform.js +61 -10
- package/dist/platform.js.map +1 -1
- package/dist/runtime/channel.js +227 -40
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/device-settings.js +88 -0
- package/dist/runtime/device-settings.js.map +1 -0
- package/dist/runtime/owner.js +30 -5
- package/dist/runtime/owner.js.map +1 -1
- package/dist/runtime/sdk-client.js +21 -17
- package/dist/runtime/sdk-client.js.map +1 -1
- package/dist/runtime/tracker.js +8 -38
- package/dist/runtime/tracker.js.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/ui/dashboard.js +36 -16
- package/dist/ui/dashboard.js.map +1 -1
- package/dist/ui/runtime-channel-client.js +155 -184
- package/dist/ui/runtime-channel-client.js.map +1 -1
- package/dist/ui/server.js +81 -38
- package/dist/ui/server.js.map +1 -1
- package/homebridge-ui/public/app.css +531 -239
- package/homebridge-ui/public/assets/icons/auto_fix_high.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_0.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_1.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_2.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_3.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_4.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_5.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_6.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_full.svg +1 -0
- package/homebridge-ui/public/assets/icons/contact_support.svg +1 -0
- package/homebridge-ui/public/assets/icons/delete.svg +1 -0
- package/homebridge-ui/public/assets/icons/download.svg +1 -0
- package/homebridge-ui/public/assets/icons/extension_off.svg +1 -0
- package/homebridge-ui/public/assets/icons/info.svg +1 -0
- package/homebridge-ui/public/assets/icons/key_off.svg +1 -0
- package/homebridge-ui/public/assets/icons/keyboard_arrow_left.svg +1 -0
- package/homebridge-ui/public/assets/icons/keyboard_arrow_right.svg +1 -0
- package/homebridge-ui/public/assets/icons/keyboard_double_arrow_left.svg +1 -0
- package/homebridge-ui/public/assets/icons/keyboard_double_arrow_right.svg +1 -0
- package/homebridge-ui/public/assets/icons/movie_off.svg +1 -0
- package/homebridge-ui/public/assets/icons/play_arrow.svg +1 -0
- package/homebridge-ui/public/assets/icons/refresh.svg +1 -0
- package/homebridge-ui/public/assets/icons/satellite_alt.svg +1 -0
- package/homebridge-ui/public/assets/icons/search_off.svg +1 -0
- package/homebridge-ui/public/assets/icons/sensors_off.svg +1 -0
- package/homebridge-ui/public/assets/icons/settings_photo_camera.svg +1 -0
- package/homebridge-ui/public/assets/icons/solar_power.svg +1 -0
- package/homebridge-ui/public/assets/icons/stop.svg +1 -0
- package/homebridge-ui/public/assets/icons/videocam_off.svg +1 -0
- package/homebridge-ui/public/i18n/en.json +160 -82
- package/homebridge-ui/public/i18n/fr.json +161 -83
- package/homebridge-ui/public/index.html +225 -96
- package/homebridge-ui/public/js/app.js +814 -435
- package/homebridge-ui/public/js/dashboard.js +148 -31
- package/i18n/runtime/en.json +10 -3
- package/package.json +10 -11
- package/homebridge-ui/public/js/legacy-settings.js +0 -37
- package/homebridge-ui/public/js/profile-wizard.js +0 -61
package/dist/runtime/channel.js
CHANGED
|
@@ -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 {
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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.
|
|
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
|
-
|
|
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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"}
|
package/dist/runtime/owner.js
CHANGED
|
@@ -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,
|
|
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'),
|
|
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 ?
|
|
576
|
+
return camera ? cameraEnablementReader(camera, indexDeviceEvidence(manifest).members)() : undefined;
|
|
552
577
|
}
|
|
553
578
|
catch {
|
|
554
579
|
return undefined;
|