amaran-light-cli 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -14
- package/dist/__tests__/autoCct.test.js +27 -0
- package/dist/__tests__/autoCct.test.js.map +1 -1
- package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
- package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
- package/dist/__tests__/bleHttpControl.test.js +230 -0
- package/dist/__tests__/bleHttpControl.test.js.map +1 -0
- package/dist/__tests__/bleStack.test.d.ts +2 -0
- package/dist/__tests__/bleStack.test.d.ts.map +1 -0
- package/dist/__tests__/bleStack.test.js +1239 -0
- package/dist/__tests__/bleStack.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.js +9 -4
- package/dist/__tests__/cctUtil.test.js.map +1 -1
- package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
- package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
- package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
- package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
- package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
- package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
- package/dist/__tests__/circadianIsolation.test.js +30 -0
- package/dist/__tests__/circadianIsolation.test.js.map +1 -0
- package/dist/__tests__/cli.config.test.js +49 -0
- package/dist/__tests__/cli.config.test.js.map +1 -1
- package/dist/__tests__/cli.smoke.test.js +34 -0
- package/dist/__tests__/cli.smoke.test.js.map +1 -1
- package/dist/__tests__/currentCct.test.d.ts +2 -0
- package/dist/__tests__/currentCct.test.d.ts.map +1 -0
- package/dist/__tests__/currentCct.test.js +29 -0
- package/dist/__tests__/currentCct.test.js.map +1 -0
- package/dist/__tests__/dashboard.test.d.ts +2 -0
- package/dist/__tests__/dashboard.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard.test.js +126 -0
- package/dist/__tests__/dashboard.test.js.map +1 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
- package/dist/__tests__/desktopImport.test.d.ts +2 -0
- package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
- package/dist/__tests__/desktopImport.test.js +234 -0
- package/dist/__tests__/desktopImport.test.js.map +1 -0
- package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
- package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.basic.test.js +119 -0
- package/dist/__tests__/lightControl.basic.test.js.map +1 -0
- package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
- package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
- package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
- package/dist/__tests__/lightControl.management.test.d.ts +2 -0
- package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.management.test.js +90 -0
- package/dist/__tests__/lightControl.management.test.js.map +1 -0
- package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
- package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
- package/dist/__tests__/lightControlTestUtils.js +57 -0
- package/dist/__tests__/lightControlTestUtils.js.map +1 -0
- package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
- package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
- package/dist/__tests__/meshConfiguration.test.js +78 -0
- package/dist/__tests__/meshConfiguration.test.js.map +1 -0
- package/dist/__tests__/nativeGroups.test.d.ts +2 -0
- package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
- package/dist/__tests__/nativeGroups.test.js +104 -0
- package/dist/__tests__/nativeGroups.test.js.map +1 -0
- package/dist/__tests__/programApi.test.d.ts +2 -0
- package/dist/__tests__/programApi.test.d.ts.map +1 -0
- package/dist/__tests__/programApi.test.js +73 -0
- package/dist/__tests__/programApi.test.js.map +1 -0
- package/dist/__tests__/programs.test.d.ts +2 -0
- package/dist/__tests__/programs.test.d.ts.map +1 -0
- package/dist/__tests__/programs.test.js +176 -0
- package/dist/__tests__/programs.test.js.map +1 -0
- package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
- package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
- package/dist/__tests__/scheduleMaker.test.js +25 -0
- package/dist/__tests__/scheduleMaker.test.js.map +1 -0
- package/dist/ble/async.d.ts +2 -0
- package/dist/ble/async.d.ts.map +1 -0
- package/dist/ble/async.js +15 -0
- package/dist/ble/async.js.map +1 -0
- package/dist/ble/colors.d.ts +5 -0
- package/dist/ble/colors.d.ts.map +1 -0
- package/dist/ble/colors.js +44 -0
- package/dist/ble/colors.js.map +1 -0
- package/dist/ble/configuration.d.ts +22 -0
- package/dist/ble/configuration.d.ts.map +1 -0
- package/dist/ble/configuration.js +122 -0
- package/dist/ble/configuration.js.map +1 -0
- package/dist/ble/controller.d.ts +118 -0
- package/dist/ble/controller.d.ts.map +1 -0
- package/dist/ble/controller.js +931 -0
- package/dist/ble/controller.js.map +1 -0
- package/dist/ble/crypto.d.ts +34 -0
- package/dist/ble/crypto.d.ts.map +1 -0
- package/dist/ble/crypto.js +178 -0
- package/dist/ble/crypto.js.map +1 -0
- package/dist/ble/daemon.d.ts +2 -0
- package/dist/ble/daemon.d.ts.map +1 -0
- package/dist/ble/daemon.js +76 -0
- package/dist/ble/daemon.js.map +1 -0
- package/dist/ble/dashboard.d.ts +331 -0
- package/dist/ble/dashboard.d.ts.map +1 -0
- package/dist/ble/dashboard.js +280 -0
- package/dist/ble/dashboard.js.map +1 -0
- package/dist/ble/desktop.d.ts +4 -0
- package/dist/ble/desktop.d.ts.map +1 -0
- package/dist/ble/desktop.js +33 -0
- package/dist/ble/desktop.js.map +1 -0
- package/dist/ble/desktopLibrary.d.ts +12 -0
- package/dist/ble/desktopLibrary.d.ts.map +1 -0
- package/dist/ble/desktopLibrary.js +346 -0
- package/dist/ble/desktopLibrary.js.map +1 -0
- package/dist/ble/effects.d.ts +34 -0
- package/dist/ble/effects.d.ts.map +1 -0
- package/dist/ble/effects.js +138 -0
- package/dist/ble/effects.js.map +1 -0
- package/dist/ble/fan.d.ts +244 -0
- package/dist/ble/fan.d.ts.map +1 -0
- package/dist/ble/fan.js +46 -0
- package/dist/ble/fan.js.map +1 -0
- package/dist/ble/library.d.ts +341 -0
- package/dist/ble/library.d.ts.map +1 -0
- package/dist/ble/library.js +201 -0
- package/dist/ble/library.js.map +1 -0
- package/dist/ble/media.d.ts +133 -0
- package/dist/ble/media.d.ts.map +1 -0
- package/dist/ble/media.js +186 -0
- package/dist/ble/media.js.map +1 -0
- package/dist/ble/nativeGroups.d.ts +22 -0
- package/dist/ble/nativeGroups.d.ts.map +1 -0
- package/dist/ble/nativeGroups.js +114 -0
- package/dist/ble/nativeGroups.js.map +1 -0
- package/dist/ble/packets.d.ts +3 -0
- package/dist/ble/packets.d.ts.map +1 -0
- package/dist/ble/packets.js +15 -0
- package/dist/ble/packets.js.map +1 -0
- package/dist/ble/programs.d.ts +318 -0
- package/dist/ble/programs.d.ts.map +1 -0
- package/dist/ble/programs.js +329 -0
- package/dist/ble/programs.js.map +1 -0
- package/dist/ble/provisioning.d.ts +13 -0
- package/dist/ble/provisioning.d.ts.map +1 -0
- package/dist/ble/provisioning.js +39 -0
- package/dist/ble/provisioning.js.map +1 -0
- package/dist/ble/server.d.ts +18 -0
- package/dist/ble/server.d.ts.map +1 -0
- package/dist/ble/server.js +548 -0
- package/dist/ble/server.js.map +1 -0
- package/dist/ble/service.d.ts +2 -0
- package/dist/ble/service.d.ts.map +1 -0
- package/dist/ble/service.js +77 -0
- package/dist/ble/service.js.map +1 -0
- package/dist/ble/settings.d.ts +18 -0
- package/dist/ble/settings.d.ts.map +1 -0
- package/dist/ble/settings.js +25 -0
- package/dist/ble/settings.js.map +1 -0
- package/dist/ble/setup.d.ts +2 -0
- package/dist/ble/setup.d.ts.map +1 -0
- package/dist/ble/setup.js +31 -0
- package/dist/ble/setup.js.map +1 -0
- package/dist/ble/storage.d.ts +94 -0
- package/dist/ble/storage.d.ts.map +1 -0
- package/dist/ble/storage.js +132 -0
- package/dist/ble/storage.js.map +1 -0
- package/dist/ble/telink.d.ts +63 -0
- package/dist/ble/telink.d.ts.map +1 -0
- package/dist/ble/telink.js +108 -0
- package/dist/ble/telink.js.map +1 -0
- package/dist/ble/transitions.d.ts +3 -0
- package/dist/ble/transitions.d.ts.map +1 -0
- package/dist/ble/transitions.js +28 -0
- package/dist/ble/transitions.js.map +1 -0
- package/dist/ble/transport.d.ts +48 -0
- package/dist/ble/transport.d.ts.map +1 -0
- package/dist/ble/transport.js +370 -0
- package/dist/ble/transport.js.map +1 -0
- package/dist/circadian.d.ts +3 -0
- package/dist/circadian.d.ts.map +1 -1
- package/dist/circadian.js +2 -0
- package/dist/circadian.js.map +1 -1
- package/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +125 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/newCommands.test.js +3 -4
- package/dist/commands/__tests__/newCommands.test.js.map +1 -1
- package/dist/commands/cmdUtils.d.ts +5 -2
- package/dist/commands/cmdUtils.d.ts.map +1 -1
- package/dist/commands/cmdUtils.js +29 -10
- package/dist/commands/cmdUtils.js.map +1 -1
- package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/autoCct.js +67 -197
- package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.js +2 -2
- package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
- package/dist/commands/daylightSimulation/service.d.ts +1 -1
- package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/service.js +5 -3
- package/dist/commands/daylightSimulation/service.js.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.js +5 -4
- package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
- package/dist/commands/deviceControl/ble.d.ts +4 -0
- package/dist/commands/deviceControl/ble.d.ts.map +1 -0
- package/dist/commands/deviceControl/ble.js +214 -0
- package/dist/commands/deviceControl/ble.js.map +1 -0
- package/dist/commands/deviceControl/cct.d.ts.map +1 -1
- package/dist/commands/deviceControl/cct.js +41 -11
- package/dist/commands/deviceControl/cct.js.map +1 -1
- package/dist/commands/deviceControl/color.d.ts.map +1 -1
- package/dist/commands/deviceControl/color.js +13 -3
- package/dist/commands/deviceControl/color.js.map +1 -1
- package/dist/commands/deviceControl/config.d.ts.map +1 -1
- package/dist/commands/deviceControl/config.js +26 -3
- package/dist/commands/deviceControl/config.js.map +1 -1
- package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
- package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
- package/dist/commands/deviceControl/desktop.js +66 -0
- package/dist/commands/deviceControl/desktop.js.map +1 -0
- package/dist/commands/deviceControl/effect.d.ts.map +1 -1
- package/dist/commands/deviceControl/effect.js +90 -159
- package/dist/commands/deviceControl/effect.js.map +1 -1
- package/dist/commands/deviceControl/fan.d.ts.map +1 -1
- package/dist/commands/deviceControl/fan.js +77 -95
- package/dist/commands/deviceControl/fan.js.map +1 -1
- package/dist/commands/deviceControl/group.d.ts.map +1 -1
- package/dist/commands/deviceControl/group.js +43 -6
- package/dist/commands/deviceControl/group.js.map +1 -1
- package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
- package/dist/commands/deviceControl/hsi.js +3 -1
- package/dist/commands/deviceControl/hsi.js.map +1 -1
- package/dist/commands/deviceControl/info.d.ts.map +1 -1
- package/dist/commands/deviceControl/info.js +0 -50
- package/dist/commands/deviceControl/info.js.map +1 -1
- package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
- package/dist/commands/deviceControl/intensity.js +32 -8
- package/dist/commands/deviceControl/intensity.js.map +1 -1
- package/dist/commands/deviceControl/list.d.ts.map +1 -1
- package/dist/commands/deviceControl/list.js +3 -2
- package/dist/commands/deviceControl/list.js.map +1 -1
- package/dist/commands/deviceControl/power.d.ts.map +1 -1
- package/dist/commands/deviceControl/power.js +9 -3
- package/dist/commands/deviceControl/power.js.map +1 -1
- package/dist/commands/deviceControl/preset.d.ts.map +1 -1
- package/dist/commands/deviceControl/preset.js +56 -19
- package/dist/commands/deviceControl/preset.js.map +1 -1
- package/dist/commands/deviceControl/program.d.ts +4 -0
- package/dist/commands/deviceControl/program.d.ts.map +1 -0
- package/dist/commands/deviceControl/program.js +199 -0
- package/dist/commands/deviceControl/program.js.map +1 -0
- package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
- package/dist/commands/deviceControl/quickshot.js +75 -13
- package/dist/commands/deviceControl/quickshot.js.map +1 -1
- package/dist/commands/deviceControl/scene.d.ts.map +1 -1
- package/dist/commands/deviceControl/scene.js +72 -9
- package/dist/commands/deviceControl/scene.js.map +1 -1
- package/dist/commands/deviceControl/status.d.ts.map +1 -1
- package/dist/commands/deviceControl/status.js +26 -3
- package/dist/commands/deviceControl/status.js.map +1 -1
- package/dist/commands/parseUtils.d.ts +1 -1
- package/dist/commands/parseUtils.d.ts.map +1 -1
- package/dist/commands/parseUtils.js +1 -11
- package/dist/commands/parseUtils.js.map +1 -1
- package/dist/commands-api.d.ts +1 -1
- package/dist/commands-api.d.ts.map +1 -1
- package/dist/commands-api.js +1 -1
- package/dist/commands-api.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +4 -2
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -2
- package/dist/config.js.map +1 -1
- package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
- package/dist/daylightSimulation/cctUtil.js +2 -2
- package/dist/daylightSimulation/cctUtil.js.map +1 -1
- package/dist/daylightSimulation/constants.d.ts +10 -0
- package/dist/daylightSimulation/constants.d.ts.map +1 -1
- package/dist/daylightSimulation/constants.js +4 -0
- package/dist/daylightSimulation/constants.js.map +1 -1
- package/dist/daylightSimulation/currentCct.d.ts +42 -0
- package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
- package/dist/daylightSimulation/currentCct.js +217 -0
- package/dist/daylightSimulation/currentCct.js.map +1 -0
- package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
- package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
- package/dist/daylightSimulation/dashboardSettings.js +95 -0
- package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
- package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
- package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
- package/dist/daylightSimulation/dashboardStatus.js +191 -0
- package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
- package/dist/daylightSimulation/parseUtils.d.ts +3 -0
- package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
- package/dist/daylightSimulation/parseUtils.js +25 -0
- package/dist/daylightSimulation/parseUtils.js.map +1 -0
- package/dist/daylightSimulation/scheduleMaker.d.ts +2 -2
- package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
- package/dist/daylightSimulation/scheduleMaker.js +6 -6
- package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
- package/dist/daylightSimulation/types.d.ts +13 -2
- package/dist/daylightSimulation/types.d.ts.map +1 -1
- package/dist/daylightSimulation/types.js +0 -2
- package/dist/daylightSimulation/types.js.map +1 -1
- package/dist/device-control.d.ts +1 -0
- package/dist/device-control.d.ts.map +1 -1
- package/dist/device-control.js +1 -0
- package/dist/device-control.js.map +1 -1
- package/dist/deviceControl/bleHttpControl.d.ts +129 -0
- package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
- package/dist/deviceControl/bleHttpControl.js +753 -0
- package/dist/deviceControl/bleHttpControl.js.map +1 -0
- package/dist/deviceControl/lightControl.d.ts +8 -68
- package/dist/deviceControl/lightControl.d.ts.map +1 -1
- package/dist/deviceControl/lightControl.js +6 -246
- package/dist/deviceControl/lightControl.js.map +1 -1
- package/dist/deviceControl/lightControlCommands.d.ts +68 -0
- package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
- package/dist/deviceControl/lightControlCommands.js +244 -0
- package/dist/deviceControl/lightControlCommands.js.map +1 -0
- package/dist/deviceControl/types.d.ts +75 -4
- package/dist/deviceControl/types.d.ts.map +1 -1
- package/dist/deviceControl/types.js +1 -0
- package/dist/deviceControl/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/test/MockLightServer.d.ts +1 -0
- package/dist/test/MockLightServer.d.ts.map +1 -1
- package/dist/test/MockLightServer.js +5 -0
- package/dist/test/MockLightServer.js.map +1 -1
- package/docs/CHANGELOG.md +37 -0
- package/docs/DIRECT_BLE.md +359 -0
- package/package.json +8 -4
- package/scripts/ble-cli-check.ts +129 -0
- package/scripts/ble-config-probe.ts +109 -0
- package/scripts/ble-effects-check.ts +82 -0
- package/scripts/ble-extended-probe.ts +44 -0
- package/scripts/ble-fan-check.ts +129 -0
- package/scripts/ble-feature-probe.ts +37 -0
- package/scripts/ble-followup-check.ts +165 -0
- package/scripts/ble-hardware-check.ts +99 -0
- package/scripts/ble-live-extended-check.ts +205 -0
- package/scripts/ble-non-ota-check.ts +193 -0
- package/scripts/ble-probe.ts +45 -0
- package/scripts/calibrate-webcam.ts +152 -0
- package/scripts/desktop-reference.ts +85 -0
- package/scripts/webcam.ts +129 -0
- package/dist/__tests__/lightControl.test.d.ts +0 -2
- package/dist/__tests__/lightControl.test.d.ts.map +0 -1
- package/dist/__tests__/lightControl.test.js +0 -424
- package/dist/__tests__/lightControl.test.js.map +0 -1
- package/dist/commands/deviceControl/discover.d.ts.map +0 -1
- package/dist/commands/deviceControl/discover.js +0 -29
- package/dist/commands/deviceControl/discover.js.map +0 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { effectName } from './effects.js';
|
|
6
|
+
import { FanSettingSchema } from './fan.js';
|
|
7
|
+
import { atomicJson } from './storage.js';
|
|
8
|
+
export const SavedStateSchema = z
|
|
9
|
+
.object({
|
|
10
|
+
sleep: z.boolean(),
|
|
11
|
+
intensity: z.number().int().min(0).max(1000),
|
|
12
|
+
mode: z.enum(['cct', 'hsi', 'effect']),
|
|
13
|
+
cct: z.number().int().min(2500).max(7500).optional(),
|
|
14
|
+
gm: z.number().min(-100).max(100).optional(),
|
|
15
|
+
hue: z.number().min(0).max(360).optional(),
|
|
16
|
+
sat: z.number().min(0).max(100).optional(),
|
|
17
|
+
effect: z.string().transform(effectName).optional(),
|
|
18
|
+
frequency: z.number().min(1).max(10).optional(),
|
|
19
|
+
speed: z.number().int().min(0).max(10).optional(),
|
|
20
|
+
trigger: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(),
|
|
21
|
+
palette: z.number().min(0).max(2).optional(),
|
|
22
|
+
observedAt: z.string().datetime(),
|
|
23
|
+
fan: FanSettingSchema.optional(),
|
|
24
|
+
})
|
|
25
|
+
.strict()
|
|
26
|
+
.superRefine((state, context) => {
|
|
27
|
+
if ((state.mode === 'cct' && state.cct === undefined) ||
|
|
28
|
+
(state.mode === 'hsi' && (state.hue === undefined || state.sat === undefined)) ||
|
|
29
|
+
(state.mode === 'effect' && (!state.effect || state.frequency === undefined))) {
|
|
30
|
+
context.addIssue({ code: 'custom', message: 'Saved state is missing active-mode parameters' });
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const Name = z.string().trim().min(1).max(80);
|
|
34
|
+
const Entry = z.object({ id: z.string(), name: Name, states: z.record(SavedStateSchema) });
|
|
35
|
+
const Group = z.object({
|
|
36
|
+
id: z.string(),
|
|
37
|
+
name: Name,
|
|
38
|
+
members: z.array(z.string()).max(128),
|
|
39
|
+
native: z
|
|
40
|
+
.object({
|
|
41
|
+
address: z.number().int().min(0xc000).max(0xfeff),
|
|
42
|
+
status: z.enum(['pending', 'ready']),
|
|
43
|
+
managed: z.array(z.string()).min(1),
|
|
44
|
+
})
|
|
45
|
+
.optional(),
|
|
46
|
+
});
|
|
47
|
+
const Schema = z.object({
|
|
48
|
+
version: z.literal(1),
|
|
49
|
+
scenes: z.array(Entry).max(128),
|
|
50
|
+
presets: z.array(Entry).max(128),
|
|
51
|
+
quickshots: z.array(Entry).max(128),
|
|
52
|
+
groups: z.array(Group).max(128),
|
|
53
|
+
steady: z.record(SavedStateSchema),
|
|
54
|
+
overrides: z.record(z.number().int().nonnegative()).default({}),
|
|
55
|
+
});
|
|
56
|
+
export class LocalLibrary {
|
|
57
|
+
data = {
|
|
58
|
+
version: 1,
|
|
59
|
+
scenes: [],
|
|
60
|
+
presets: [],
|
|
61
|
+
quickshots: [],
|
|
62
|
+
groups: [],
|
|
63
|
+
steady: {},
|
|
64
|
+
overrides: {},
|
|
65
|
+
};
|
|
66
|
+
filename;
|
|
67
|
+
constructor(directory) {
|
|
68
|
+
if (directory) {
|
|
69
|
+
this.filename = path.join(directory, 'library.json');
|
|
70
|
+
if (existsSync(this.filename))
|
|
71
|
+
this.data = Schema.parse(JSON.parse(readFileSync(this.filename, 'utf8')));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
commit(data) {
|
|
75
|
+
const validated = Schema.parse(data);
|
|
76
|
+
if (this.filename)
|
|
77
|
+
atomicJson(this.filename, validated);
|
|
78
|
+
this.data = validated;
|
|
79
|
+
}
|
|
80
|
+
list(collection) {
|
|
81
|
+
return structuredClone(this.data[collection]);
|
|
82
|
+
}
|
|
83
|
+
find(collection, key) {
|
|
84
|
+
const entry = this.data[collection].find((item) => item.id === key || item.name.toLowerCase() === key.toLowerCase());
|
|
85
|
+
if (!entry)
|
|
86
|
+
throw new Error(`Unknown ${collection} entry: ${key}`);
|
|
87
|
+
return structuredClone(entry);
|
|
88
|
+
}
|
|
89
|
+
save(collection, name, states, key) {
|
|
90
|
+
const normalized = Name.parse(name);
|
|
91
|
+
const existing = key === undefined ? undefined : this.find(collection, key);
|
|
92
|
+
if (!Object.keys(states).length)
|
|
93
|
+
throw new Error('Cannot save an empty lighting state');
|
|
94
|
+
if (collection === 'presets' && Object.keys(states).length !== 1)
|
|
95
|
+
throw new Error('A preset stores exactly one fixture state');
|
|
96
|
+
if (this.data[collection].some((item) => item.name.toLowerCase() === normalized.toLowerCase() && item.id !== existing?.id))
|
|
97
|
+
throw new Error(`Name already exists: ${normalized}`);
|
|
98
|
+
const entry = Entry.parse({ id: existing?.id ?? randomUUID(), name: normalized, states });
|
|
99
|
+
const data = structuredClone(this.data);
|
|
100
|
+
data[collection] = [...data[collection].filter((item) => item.id !== entry.id), entry];
|
|
101
|
+
this.commit(data);
|
|
102
|
+
return entry;
|
|
103
|
+
}
|
|
104
|
+
delete(collection, key) {
|
|
105
|
+
const entry = this.find(collection, key);
|
|
106
|
+
const data = structuredClone(this.data);
|
|
107
|
+
data[collection] = data[collection].filter((item) => item.id !== entry.id);
|
|
108
|
+
this.commit(data);
|
|
109
|
+
}
|
|
110
|
+
groups() {
|
|
111
|
+
return structuredClone(this.data.groups);
|
|
112
|
+
}
|
|
113
|
+
group(key) {
|
|
114
|
+
const group = this.data.groups.find((item) => item.id === key || item.name.toLowerCase() === key.toLowerCase());
|
|
115
|
+
if (!group)
|
|
116
|
+
throw new Error(`Unknown group: ${key}`);
|
|
117
|
+
return structuredClone(group);
|
|
118
|
+
}
|
|
119
|
+
createGroup(name) {
|
|
120
|
+
const normalized = Name.parse(name);
|
|
121
|
+
if (this.data.groups.some((item) => item.name.toLowerCase() === normalized.toLowerCase()))
|
|
122
|
+
throw new Error(`Group name already exists: ${normalized}`);
|
|
123
|
+
const group = { id: `group:${randomUUID()}`, name: normalized, members: [] };
|
|
124
|
+
this.commit({ ...this.data, groups: [...this.data.groups, group] });
|
|
125
|
+
return group;
|
|
126
|
+
}
|
|
127
|
+
deleteGroup(key) {
|
|
128
|
+
const group = this.group(key);
|
|
129
|
+
if (group.native)
|
|
130
|
+
throw new Error('Disable native subscriptions before deleting the group');
|
|
131
|
+
this.commit({ ...this.data, groups: this.data.groups.filter((item) => item.id !== group.id) });
|
|
132
|
+
}
|
|
133
|
+
renameGroup(key, name) {
|
|
134
|
+
const group = this.group(key);
|
|
135
|
+
const normalized = Name.parse(name);
|
|
136
|
+
if (this.data.groups.some((item) => item.id !== group.id && item.name.toLowerCase() === normalized.toLowerCase()))
|
|
137
|
+
throw new Error(`Group name already exists: ${normalized}`);
|
|
138
|
+
group.name = normalized;
|
|
139
|
+
this.commit({ ...this.data, groups: this.data.groups.map((item) => (item.id === group.id ? group : item)) });
|
|
140
|
+
return group;
|
|
141
|
+
}
|
|
142
|
+
updateGroup(key, member, remove) {
|
|
143
|
+
const group = this.group(key);
|
|
144
|
+
if (group.native?.status === 'ready')
|
|
145
|
+
throw new Error('Native membership changes must be synchronized with the fixtures');
|
|
146
|
+
if (remove && !group.members.includes(member))
|
|
147
|
+
throw new Error(`${member} is not in ${group.name}`);
|
|
148
|
+
group.members = remove ? group.members.filter((item) => item !== member) : [...new Set([...group.members, member])];
|
|
149
|
+
this.commit({ ...this.data, groups: this.data.groups.map((item) => (item.id === group.id ? group : item)) });
|
|
150
|
+
}
|
|
151
|
+
setNativeGroup(key, native) {
|
|
152
|
+
const group = this.group(key);
|
|
153
|
+
group.native = native;
|
|
154
|
+
this.commit({ ...this.data, groups: this.data.groups.map((item) => (item.id === group.id ? group : item)) });
|
|
155
|
+
return group;
|
|
156
|
+
}
|
|
157
|
+
importLibrary(plan, apply, replace = false) {
|
|
158
|
+
const next = structuredClone(this.data);
|
|
159
|
+
let created = 0, updated = 0, unchanged = 0;
|
|
160
|
+
const merge = (items, incoming) => {
|
|
161
|
+
const existing = items.find((item) => item.id === incoming.id);
|
|
162
|
+
if (items.some((item) => item.id !== incoming.id && item.name.toLowerCase() === incoming.name.toLowerCase()))
|
|
163
|
+
throw new Error(`Import name conflicts with a local item: ${incoming.name}`);
|
|
164
|
+
if (existing && JSON.stringify(existing) === JSON.stringify(incoming)) {
|
|
165
|
+
unchanged++;
|
|
166
|
+
return items;
|
|
167
|
+
}
|
|
168
|
+
if (existing && !replace)
|
|
169
|
+
throw new Error(`Import would update ${incoming.name}; explicitly enable replacement`);
|
|
170
|
+
if (existing)
|
|
171
|
+
updated++;
|
|
172
|
+
else
|
|
173
|
+
created++;
|
|
174
|
+
return [...items.filter((item) => item.id !== incoming.id), incoming];
|
|
175
|
+
};
|
|
176
|
+
for (const incoming of plan.groups) {
|
|
177
|
+
if (next.groups.find((item) => item.id === incoming.id)?.native)
|
|
178
|
+
throw new Error(`Disable native subscriptions before replacing imported group ${incoming.name}`);
|
|
179
|
+
next.groups = merge(next.groups, Group.parse(incoming));
|
|
180
|
+
}
|
|
181
|
+
for (const { collection, entry } of plan.entries)
|
|
182
|
+
next[collection] = merge(next[collection], Entry.parse(entry));
|
|
183
|
+
Schema.parse(next);
|
|
184
|
+
if (apply)
|
|
185
|
+
this.commit(next);
|
|
186
|
+
return { applied: apply, created, updated, unchanged };
|
|
187
|
+
}
|
|
188
|
+
getSteady(key) {
|
|
189
|
+
return this.data.steady[key] ? structuredClone(this.data.steady[key]) : undefined;
|
|
190
|
+
}
|
|
191
|
+
saveSteady(key, state) {
|
|
192
|
+
this.commit({ ...this.data, steady: { ...this.data.steady, [key]: SavedStateSchema.parse(state) } });
|
|
193
|
+
}
|
|
194
|
+
getOverride(key) {
|
|
195
|
+
return this.data.overrides[key];
|
|
196
|
+
}
|
|
197
|
+
setOverride(key, until) {
|
|
198
|
+
this.commit({ ...this.data, overrides: { ...this.data.overrides, [key]: until } });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/ble/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const MediaSourceSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
|
|
3
|
+
kind: z.ZodLiteral<"samples">;
|
|
4
|
+
media: z.ZodEnum<["audio", "image"]>;
|
|
5
|
+
}, "strict", z.ZodTypeAny, {
|
|
6
|
+
kind: "samples";
|
|
7
|
+
media: "audio" | "image";
|
|
8
|
+
}, {
|
|
9
|
+
kind: "samples";
|
|
10
|
+
media: "audio" | "image";
|
|
11
|
+
}>, z.ZodObject<{
|
|
12
|
+
kind: z.ZodLiteral<"audio-file">;
|
|
13
|
+
file: z.ZodString;
|
|
14
|
+
}, "strict", z.ZodTypeAny, {
|
|
15
|
+
kind: "audio-file";
|
|
16
|
+
file: string;
|
|
17
|
+
}, {
|
|
18
|
+
kind: "audio-file";
|
|
19
|
+
file: string;
|
|
20
|
+
}>, z.ZodObject<{
|
|
21
|
+
kind: z.ZodLiteral<"microphone">;
|
|
22
|
+
device: z.ZodNumber;
|
|
23
|
+
}, "strict", z.ZodTypeAny, {
|
|
24
|
+
kind: "microphone";
|
|
25
|
+
device: number;
|
|
26
|
+
}, {
|
|
27
|
+
kind: "microphone";
|
|
28
|
+
device: number;
|
|
29
|
+
}>, z.ZodObject<{
|
|
30
|
+
kind: z.ZodLiteral<"image-file">;
|
|
31
|
+
file: z.ZodString;
|
|
32
|
+
region: z.ZodOptional<z.ZodObject<{
|
|
33
|
+
x: z.ZodNumber;
|
|
34
|
+
y: z.ZodNumber;
|
|
35
|
+
width: z.ZodNumber;
|
|
36
|
+
height: z.ZodNumber;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
y: number;
|
|
39
|
+
x: number;
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
}, {
|
|
43
|
+
y: number;
|
|
44
|
+
x: number;
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
}>>;
|
|
48
|
+
}, "strict", z.ZodTypeAny, {
|
|
49
|
+
kind: "image-file";
|
|
50
|
+
file: string;
|
|
51
|
+
region?: {
|
|
52
|
+
y: number;
|
|
53
|
+
x: number;
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
} | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
kind: "image-file";
|
|
59
|
+
file: string;
|
|
60
|
+
region?: {
|
|
61
|
+
y: number;
|
|
62
|
+
x: number;
|
|
63
|
+
width: number;
|
|
64
|
+
height: number;
|
|
65
|
+
} | undefined;
|
|
66
|
+
}>, z.ZodObject<{
|
|
67
|
+
kind: z.ZodLiteral<"camera">;
|
|
68
|
+
device: z.ZodNumber;
|
|
69
|
+
region: z.ZodOptional<z.ZodObject<{
|
|
70
|
+
x: z.ZodNumber;
|
|
71
|
+
y: z.ZodNumber;
|
|
72
|
+
width: z.ZodNumber;
|
|
73
|
+
height: z.ZodNumber;
|
|
74
|
+
}, "strip", z.ZodTypeAny, {
|
|
75
|
+
y: number;
|
|
76
|
+
x: number;
|
|
77
|
+
width: number;
|
|
78
|
+
height: number;
|
|
79
|
+
}, {
|
|
80
|
+
y: number;
|
|
81
|
+
x: number;
|
|
82
|
+
width: number;
|
|
83
|
+
height: number;
|
|
84
|
+
}>>;
|
|
85
|
+
}, "strict", z.ZodTypeAny, {
|
|
86
|
+
kind: "camera";
|
|
87
|
+
device: number;
|
|
88
|
+
region?: {
|
|
89
|
+
y: number;
|
|
90
|
+
x: number;
|
|
91
|
+
width: number;
|
|
92
|
+
height: number;
|
|
93
|
+
} | undefined;
|
|
94
|
+
}, {
|
|
95
|
+
kind: "camera";
|
|
96
|
+
device: number;
|
|
97
|
+
region?: {
|
|
98
|
+
y: number;
|
|
99
|
+
x: number;
|
|
100
|
+
width: number;
|
|
101
|
+
height: number;
|
|
102
|
+
} | undefined;
|
|
103
|
+
}>]>;
|
|
104
|
+
export type MediaSource = z.infer<typeof MediaSourceSchema>;
|
|
105
|
+
export type MediaSample = {
|
|
106
|
+
rms: number;
|
|
107
|
+
} | {
|
|
108
|
+
rgb: [number, number, number];
|
|
109
|
+
};
|
|
110
|
+
export declare const MediaSampleSchema: z.ZodUnion<[z.ZodObject<{
|
|
111
|
+
rms: z.ZodNumber;
|
|
112
|
+
}, "strict", z.ZodTypeAny, {
|
|
113
|
+
rms: number;
|
|
114
|
+
}, {
|
|
115
|
+
rms: number;
|
|
116
|
+
}>, z.ZodObject<{
|
|
117
|
+
rgb: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
|
|
118
|
+
}, "strict", z.ZodTypeAny, {
|
|
119
|
+
rgb: [number, number, number];
|
|
120
|
+
}, {
|
|
121
|
+
rgb: [number, number, number];
|
|
122
|
+
}>]>;
|
|
123
|
+
export declare function mediaExecutable(): string;
|
|
124
|
+
export declare function decodeAudio(data: Buffer): MediaSample;
|
|
125
|
+
export declare function decodeImage(data: Buffer): MediaSample;
|
|
126
|
+
export declare function mediaCommand(source: MediaSource): {
|
|
127
|
+
executable: string;
|
|
128
|
+
args: string[];
|
|
129
|
+
frameBytes: number;
|
|
130
|
+
audio: boolean;
|
|
131
|
+
};
|
|
132
|
+
export declare function mediaSamples(source: MediaSource, signal: AbortSignal): AsyncGenerator<MediaSample>;
|
|
133
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/ble/media.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAC9E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;IAW5B,CAAC;AAEH,wBAAgB,eAAe,IAAI,MAAM,CAqBxC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CASrD;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAMrD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,CA8BA;AAED,wBAAuB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,CA0EzG"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { accessSync, constants, existsSync, realpathSync, statSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const Region = z.object({
|
|
6
|
+
x: z.number().int().min(0),
|
|
7
|
+
y: z.number().int().min(0),
|
|
8
|
+
width: z.number().int().positive(),
|
|
9
|
+
height: z.number().int().positive(),
|
|
10
|
+
});
|
|
11
|
+
export const MediaSourceSchema = z.discriminatedUnion('kind', [
|
|
12
|
+
z.object({ kind: z.literal('samples'), media: z.enum(['audio', 'image']) }).strict(),
|
|
13
|
+
z.object({ kind: z.literal('audio-file'), file: z.string() }).strict(),
|
|
14
|
+
z.object({ kind: z.literal('microphone'), device: z.number().int().min(0).max(64) }).strict(),
|
|
15
|
+
z.object({ kind: z.literal('image-file'), file: z.string(), region: Region.optional() }).strict(),
|
|
16
|
+
z.object({ kind: z.literal('camera'), device: z.number().int().min(0).max(64), region: Region.optional() }).strict(),
|
|
17
|
+
]);
|
|
18
|
+
export const MediaSampleSchema = z.union([
|
|
19
|
+
z.object({ rms: z.number().min(0).max(1) }).strict(),
|
|
20
|
+
z
|
|
21
|
+
.object({
|
|
22
|
+
rgb: z.tuple([
|
|
23
|
+
z.number().int().min(0).max(255),
|
|
24
|
+
z.number().int().min(0).max(255),
|
|
25
|
+
z.number().int().min(0).max(255),
|
|
26
|
+
]),
|
|
27
|
+
})
|
|
28
|
+
.strict(),
|
|
29
|
+
]);
|
|
30
|
+
export function mediaExecutable() {
|
|
31
|
+
const configured = process.env.AMARAN_FFMPEG_PATH;
|
|
32
|
+
const candidates = configured
|
|
33
|
+
? [configured]
|
|
34
|
+
: [
|
|
35
|
+
'/opt/homebrew/bin/ffmpeg',
|
|
36
|
+
'/usr/local/bin/ffmpeg',
|
|
37
|
+
'/usr/bin/ffmpeg',
|
|
38
|
+
...(process.env.PATH ?? '')
|
|
39
|
+
.split(path.delimiter)
|
|
40
|
+
.filter((directory) => path.isAbsolute(directory))
|
|
41
|
+
.map((directory) => path.join(directory, 'ffmpeg')),
|
|
42
|
+
];
|
|
43
|
+
for (const candidate of candidates) {
|
|
44
|
+
if (!existsSync(candidate))
|
|
45
|
+
continue;
|
|
46
|
+
accessSync(candidate, constants.X_OK);
|
|
47
|
+
const resolved = realpathSync(candidate);
|
|
48
|
+
if (!statSync(resolved).isFile())
|
|
49
|
+
throw new Error('Configured ffmpeg executable is not a file');
|
|
50
|
+
return resolved;
|
|
51
|
+
}
|
|
52
|
+
throw new Error('ffmpeg was not found; install it or set AMARAN_FFMPEG_PATH to its executable');
|
|
53
|
+
}
|
|
54
|
+
export function decodeAudio(data) {
|
|
55
|
+
let squares = 0;
|
|
56
|
+
if (!data.length || data.length % 4)
|
|
57
|
+
throw new Error('Invalid PCM frame');
|
|
58
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
59
|
+
const value = data.readFloatLE(i);
|
|
60
|
+
if (!Number.isFinite(value))
|
|
61
|
+
throw new Error('Nonfinite audio sample');
|
|
62
|
+
squares += value * value;
|
|
63
|
+
}
|
|
64
|
+
return { rms: Math.min(1, Math.sqrt(squares / (data.length / 4))) };
|
|
65
|
+
}
|
|
66
|
+
export function decodeImage(data) {
|
|
67
|
+
if (!data.length || data.length % 3)
|
|
68
|
+
throw new Error('Invalid RGB frame');
|
|
69
|
+
const rgb = [0, 0, 0];
|
|
70
|
+
for (let i = 0; i < data.length; i++)
|
|
71
|
+
rgb[i % 3] += data[i];
|
|
72
|
+
for (let i = 0; i < 3; i++)
|
|
73
|
+
rgb[i] = Math.round(rgb[i] / (data.length / 3));
|
|
74
|
+
return { rgb };
|
|
75
|
+
}
|
|
76
|
+
export function mediaCommand(source) {
|
|
77
|
+
if (source.kind === 'samples')
|
|
78
|
+
throw new Error('Numeric sample streams do not start a media process');
|
|
79
|
+
if (source.kind === 'camera' &&
|
|
80
|
+
source.region &&
|
|
81
|
+
(source.region.x + source.region.width > 1280 || source.region.y + source.region.height > 720))
|
|
82
|
+
throw new Error('Camera crop is outside the 1280x720 capture');
|
|
83
|
+
const audio = source.kind === 'audio-file' || source.kind === 'microphone';
|
|
84
|
+
const args = ['-hide_banner', '-loglevel', 'error', '-nostdin', '-threads', '1', '-protocol_whitelist', 'file,pipe'];
|
|
85
|
+
if ('file' in source) {
|
|
86
|
+
const file = realpathSync(source.file);
|
|
87
|
+
if (!statSync(file).isFile())
|
|
88
|
+
throw new Error('Media source must be a local file');
|
|
89
|
+
args.push('-re');
|
|
90
|
+
if (source.kind === 'image-file')
|
|
91
|
+
args.push('-loop', '1', '-framerate', '2');
|
|
92
|
+
args.push('-i', file);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
if (process.platform !== 'darwin')
|
|
96
|
+
throw new Error('Live camera/microphone capture currently requires macOS');
|
|
97
|
+
args.push('-f', 'avfoundation');
|
|
98
|
+
if (source.kind === 'camera')
|
|
99
|
+
args.push('-pixel_format', 'nv12', '-framerate', '30', '-video_size', '1280x720');
|
|
100
|
+
args.push('-i', source.kind === 'camera' ? `${source.device}:none` : `none:${source.device}`);
|
|
101
|
+
}
|
|
102
|
+
args.push('-threads', '1');
|
|
103
|
+
if (audio)
|
|
104
|
+
args.push('-vn', '-ac', '1', '-ar', '16000', '-f', 'f32le', 'pipe:1');
|
|
105
|
+
else {
|
|
106
|
+
const region = 'region' in source ? source.region : undefined;
|
|
107
|
+
const crop = region ? `crop=${region.width}:${region.height}:${region.x}:${region.y},` : '';
|
|
108
|
+
args.push('-an', '-vf', `${crop}fps=2,scale=32:32`, '-pix_fmt', 'rgb24', '-f', 'rawvideo', 'pipe:1');
|
|
109
|
+
}
|
|
110
|
+
return { executable: mediaExecutable(), args, frameBytes: audio ? 8000 * 4 : 32 * 32 * 3, audio };
|
|
111
|
+
}
|
|
112
|
+
export async function* mediaSamples(source, signal) {
|
|
113
|
+
const command = mediaCommand(source);
|
|
114
|
+
const child = spawn(command.executable, command.args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
115
|
+
let pending = Buffer.alloc(0), latest, failure, ended = false, stderr = '';
|
|
116
|
+
let wake;
|
|
117
|
+
const notify = () => wake?.();
|
|
118
|
+
child.stderr.on('data', (data) => {
|
|
119
|
+
stderr = (stderr + data.toString()).slice(-4096);
|
|
120
|
+
});
|
|
121
|
+
child.stdout.on('data', (data) => {
|
|
122
|
+
try {
|
|
123
|
+
pending = Buffer.concat([pending, data]);
|
|
124
|
+
while (pending.length >= command.frameBytes) {
|
|
125
|
+
const frame = pending.subarray(0, command.frameBytes);
|
|
126
|
+
pending = pending.subarray(command.frameBytes);
|
|
127
|
+
latest = command.audio ? decodeAudio(frame) : decodeImage(frame);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
failure = error instanceof Error ? error : new Error(String(error));
|
|
132
|
+
}
|
|
133
|
+
notify();
|
|
134
|
+
});
|
|
135
|
+
child.once('error', (error) => {
|
|
136
|
+
failure = error;
|
|
137
|
+
ended = true;
|
|
138
|
+
notify();
|
|
139
|
+
});
|
|
140
|
+
const closed = new Promise((resolve) => child.once('close', (code) => {
|
|
141
|
+
ended = true;
|
|
142
|
+
if (code !== 0 && !signal.aborted)
|
|
143
|
+
failure = new Error(stderr || `ffmpeg exited ${code}`);
|
|
144
|
+
notify();
|
|
145
|
+
resolve();
|
|
146
|
+
}));
|
|
147
|
+
const abort = () => {
|
|
148
|
+
child.kill('SIGTERM');
|
|
149
|
+
notify();
|
|
150
|
+
};
|
|
151
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
152
|
+
try {
|
|
153
|
+
while (true) {
|
|
154
|
+
signal.throwIfAborted();
|
|
155
|
+
if (failure)
|
|
156
|
+
throw failure;
|
|
157
|
+
if (latest) {
|
|
158
|
+
const sample = latest;
|
|
159
|
+
latest = undefined;
|
|
160
|
+
yield sample;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (ended)
|
|
164
|
+
break;
|
|
165
|
+
await new Promise((resolve) => {
|
|
166
|
+
const timer = setTimeout(() => {
|
|
167
|
+
failure = new Error('No media frames received for 10 seconds');
|
|
168
|
+
resolve();
|
|
169
|
+
}, 10_000);
|
|
170
|
+
wake = () => {
|
|
171
|
+
clearTimeout(timer);
|
|
172
|
+
wake = undefined;
|
|
173
|
+
resolve();
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
signal.removeEventListener('abort', abort);
|
|
180
|
+
child.kill('SIGTERM');
|
|
181
|
+
const timer = setTimeout(() => child.kill('SIGKILL'), 3000);
|
|
182
|
+
await closed;
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/ble/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ConfigurationLink } from './configuration.js';
|
|
2
|
+
import type { LightingGroup, LocalLibrary } from './library.js';
|
|
3
|
+
import type { MeshConfig } from './storage.js';
|
|
4
|
+
export declare class NativeGroups {
|
|
5
|
+
private readonly config;
|
|
6
|
+
private readonly link;
|
|
7
|
+
private readonly library;
|
|
8
|
+
constructor(config: MeshConfig, link: ConfigurationLink, library: LocalLibrary);
|
|
9
|
+
inspect(): Promise<{
|
|
10
|
+
key: string;
|
|
11
|
+
address: number;
|
|
12
|
+
composition: import("./configuration.js").Composition;
|
|
13
|
+
model: import("./configuration.js").MeshModel;
|
|
14
|
+
groups: number[];
|
|
15
|
+
keyRefreshPhase: number;
|
|
16
|
+
}[]>;
|
|
17
|
+
enable(key: string, address?: number): Promise<LightingGroup>;
|
|
18
|
+
sync(key: string, actual?: Awaited<ReturnType<NativeGroups['inspect']>>): Promise<LightingGroup>;
|
|
19
|
+
member(key: string, member: string, remove: boolean): Promise<LightingGroup>;
|
|
20
|
+
disable(key: string): Promise<LightingGroup>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=nativeGroups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeGroups.d.ts","sourceRoot":"","sources":["../../src/ble/nativeGroups.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAMvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,YAAY;IAGlC,OAAO;;;;;;;;IA6BP,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyB7D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAwBhG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAS5E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAenD"}
|