hap-nodejs 1.1.1-beta.5 → 1.1.1-beta.7
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/@types/bonjour-hap.d.ts +53 -50
- package/@types/simple-plist.d.ts +4 -0
- package/README.md +19 -16
- package/dist/accessories/AirConditioner_accessory.js +32 -30
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +86 -74
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +138 -143
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +24 -20
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +37 -35
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +46 -44
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +36 -34
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +28 -27
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +18 -15
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +24 -22
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +22 -20
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +39 -36
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +47 -45
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +17 -14
- package/dist/accessories/TemperatureSensor_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.js +14 -11
- package/dist/accessories/Wi-FiRouter_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.js +16 -13
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts +3 -3
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +39 -38
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/accessories/types.d.ts +63 -63
- package/dist/accessories/types.d.ts.map +1 -1
- package/dist/accessories/types.js +87 -83
- package/dist/accessories/types.js.map +1 -1
- package/dist/index.d.ts +28 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -40
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js +21 -19
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +37 -38
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +299 -289
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +7 -7
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +136 -128
- package/dist/lib/Advertiser.js.map +1 -1
- package/dist/lib/Bridge.d.ts +1 -1
- package/dist/lib/Bridge.d.ts.map +1 -1
- package/dist/lib/Bridge.js +6 -2
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +41 -40
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +210 -206
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +30 -35
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +229 -225
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +22 -22
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +71 -67
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +1 -2
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +44 -28
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +33 -34
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +149 -181
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +17 -19
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +153 -162
- package/dist/lib/camera/RecordingManagement.js.map +1 -1
- package/dist/lib/camera/index.d.ts +3 -3
- package/dist/lib/camera/index.d.ts.map +1 -1
- package/dist/lib/camera/index.js +6 -3
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +33 -33
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +146 -154
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +20 -22
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +78 -74
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +4 -4
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js +8 -5
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +4 -5
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +13 -9
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +37 -39
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +199 -210
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.d.ts +5 -5
- package/dist/lib/controller/index.d.ts.map +1 -1
- package/dist/lib/controller/index.js +8 -5
- package/dist/lib/controller/index.js.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.d.ts +2 -2
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +40 -40
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +0 -1
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +77 -57
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +22 -27
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +164 -159
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.d.ts +3 -3
- package/dist/lib/datastream/index.d.ts.map +1 -1
- package/dist/lib/datastream/index.js +6 -3
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.js +1203 -957
- package/dist/lib/definitions/CharacteristicDefinitions.js.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.js +695 -620
- package/dist/lib/definitions/ServiceDefinitions.js.map +1 -1
- package/dist/lib/definitions/generate-definitions.d.ts +3 -3
- package/dist/lib/definitions/generate-definitions.d.ts.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +259 -247
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +181 -176
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/definitions/index.d.ts +2 -2
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +5 -2
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/gen/HomeKit.d.ts +7 -0
- package/dist/lib/gen/HomeKit.d.ts.map +1 -0
- package/dist/lib/gen/HomeKit.js +8 -0
- package/dist/lib/gen/HomeKit.js.map +1 -0
- package/dist/lib/model/AccessoryInfo.d.ts +3 -4
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +55 -52
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts +3 -3
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +23 -18
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts +2 -2
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +11 -4
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +1 -1
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +27 -19
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +9 -9
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js +29 -27
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/checkName.d.ts +2 -2
- package/dist/lib/util/checkName.d.ts.map +1 -1
- package/dist/lib/util/checkName.js +9 -6
- package/dist/lib/util/checkName.js.map +1 -1
- package/dist/lib/util/clone.d.ts.map +1 -1
- package/dist/lib/util/clone.js +5 -1
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts +1 -1
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +9 -4
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +22 -23
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +116 -109
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +2 -3
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +40 -31
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.d.ts +1 -1
- package/dist/lib/util/hapStatusError.d.ts.map +1 -1
- package/dist/lib/util/hapStatusError.js +8 -4
- package/dist/lib/util/hapStatusError.js.map +1 -1
- package/dist/lib/util/net-utils.d.ts +1 -1
- package/dist/lib/util/net-utils.js +23 -17
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +6 -2
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/promise-utils.d.ts +1 -1
- package/dist/lib/util/promise-utils.d.ts.map +1 -1
- package/dist/lib/util/promise-utils.js +10 -3
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +2 -3
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +19 -11
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +0 -1
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +11 -6
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +0 -1
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +43 -28
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +0 -1
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +38 -26
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +24 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -3
- package/dist/types.js.map +1 -1
- package/package.json +47 -52
- package/dist/lib/dbus/align.d.ts +0 -2
- package/dist/lib/dbus/align.d.ts.map +0 -1
- package/dist/lib/dbus/align.js +0 -12
- package/dist/lib/dbus/align.js.map +0 -1
- package/dist/lib/dbus/bus.d.ts +0 -38
- package/dist/lib/dbus/bus.d.ts.map +0 -1
- package/dist/lib/dbus/bus.js +0 -222
- package/dist/lib/dbus/bus.js.map +0 -1
- package/dist/lib/dbus/constants.d.ts +0 -43
- package/dist/lib/dbus/constants.d.ts.map +0 -1
- package/dist/lib/dbus/constants.js +0 -53
- package/dist/lib/dbus/constants.js.map +0 -1
- package/dist/lib/dbus/dbus-buffer.d.ts +0 -30
- package/dist/lib/dbus/dbus-buffer.d.ts.map +0 -1
- package/dist/lib/dbus/dbus-buffer.js +0 -175
- package/dist/lib/dbus/dbus-buffer.js.map +0 -1
- package/dist/lib/dbus/handshake.d.ts +0 -2
- package/dist/lib/dbus/handshake.d.ts.map +0 -1
- package/dist/lib/dbus/handshake.js +0 -130
- package/dist/lib/dbus/handshake.js.map +0 -1
- package/dist/lib/dbus/index.d.ts +0 -3
- package/dist/lib/dbus/index.d.ts.map +0 -1
- package/dist/lib/dbus/index.js +0 -123
- package/dist/lib/dbus/index.js.map +0 -1
- package/dist/lib/dbus/introspect.d.ts +0 -30
- package/dist/lib/dbus/introspect.d.ts.map +0 -1
- package/dist/lib/dbus/introspect.js +0 -208
- package/dist/lib/dbus/introspect.js.map +0 -1
- package/dist/lib/dbus/marshall.d.ts +0 -2
- package/dist/lib/dbus/marshall.d.ts.map +0 -1
- package/dist/lib/dbus/marshall.js +0 -97
- package/dist/lib/dbus/marshall.js.map +0 -1
- package/dist/lib/dbus/marshallers.d.ts +0 -10
- package/dist/lib/dbus/marshallers.d.ts.map +0 -1
- package/dist/lib/dbus/marshallers.js +0 -329
- package/dist/lib/dbus/marshallers.js.map +0 -1
- package/dist/lib/dbus/message.d.ts +0 -4
- package/dist/lib/dbus/message.d.ts.map +0 -1
- package/dist/lib/dbus/message.js +0 -116
- package/dist/lib/dbus/message.js.map +0 -1
- package/dist/lib/dbus/put.d.ts +0 -21
- package/dist/lib/dbus/put.d.ts.map +0 -1
- package/dist/lib/dbus/put.js +0 -120
- package/dist/lib/dbus/put.js.map +0 -1
- package/dist/lib/dbus/readline.d.ts +0 -2
- package/dist/lib/dbus/readline.d.ts.map +0 -1
- package/dist/lib/dbus/readline.js +0 -27
- package/dist/lib/dbus/readline.js.map +0 -1
- package/dist/lib/dbus/signature.d.ts +0 -2
- package/dist/lib/dbus/signature.d.ts.map +0 -1
- package/dist/lib/dbus/signature.js +0 -59
- package/dist/lib/dbus/signature.js.map +0 -1
- package/dist/lib/dbus/stdifaces.d.ts +0 -3
- package/dist/lib/dbus/stdifaces.d.ts.map +0 -1
- package/dist/lib/dbus/stdifaces.js +0 -206
- package/dist/lib/dbus/stdifaces.js.map +0 -1
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RecordingManagement = exports.PacketDataType = exports.AudioRecordingSamplerate = exports.AudioRecordingCodecType = exports.MediaContainerType = exports.EventTriggerOption = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const crypto_1 = tslib_1.__importDefault(require("crypto"));
|
|
6
|
+
const debug_1 = tslib_1.__importDefault(require("debug"));
|
|
7
|
+
const events_1 = require("events");
|
|
8
|
+
const Characteristic_1 = require("../Characteristic");
|
|
9
|
+
const datastream_1 = require("../datastream");
|
|
10
|
+
const Service_1 = require("../Service");
|
|
11
|
+
const hapStatusError_1 = require("../util/hapStatusError");
|
|
12
|
+
const tlv = tslib_1.__importStar(require("../util/tlv"));
|
|
13
|
+
const debug = (0, debug_1.default)("HAP-NodeJS:Camera:RecordingManagement");
|
|
11
14
|
/**
|
|
12
15
|
* Describes the Event trigger.
|
|
13
16
|
*
|
|
14
17
|
* @group Camera
|
|
15
18
|
*/
|
|
16
|
-
|
|
17
|
-
export var EventTriggerOption;
|
|
19
|
+
var EventTriggerOption;
|
|
18
20
|
(function (EventTriggerOption) {
|
|
19
21
|
/**
|
|
20
22
|
* The Motion trigger. If enabled motion should trigger the start of a recording.
|
|
@@ -29,23 +31,20 @@ export var EventTriggerOption;
|
|
|
29
31
|
* See https://github.com/homebridge/HAP-NodeJS/issues/976#issuecomment-1280301989.
|
|
30
32
|
*/
|
|
31
33
|
EventTriggerOption[EventTriggerOption["DOORBELL"] = 2] = "DOORBELL";
|
|
32
|
-
})(EventTriggerOption || (EventTriggerOption = {}));
|
|
34
|
+
})(EventTriggerOption || (exports.EventTriggerOption = EventTriggerOption = {}));
|
|
33
35
|
/**
|
|
34
36
|
* @group Camera
|
|
35
37
|
*/
|
|
36
|
-
|
|
37
|
-
export var MediaContainerType;
|
|
38
|
+
var MediaContainerType;
|
|
38
39
|
(function (MediaContainerType) {
|
|
39
40
|
MediaContainerType[MediaContainerType["FRAGMENTED_MP4"] = 0] = "FRAGMENTED_MP4";
|
|
40
|
-
})(MediaContainerType || (MediaContainerType = {}));
|
|
41
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
41
|
+
})(MediaContainerType || (exports.MediaContainerType = MediaContainerType = {}));
|
|
42
42
|
var VideoCodecConfigurationTypes;
|
|
43
43
|
(function (VideoCodecConfigurationTypes) {
|
|
44
44
|
VideoCodecConfigurationTypes[VideoCodecConfigurationTypes["CODEC_TYPE"] = 1] = "CODEC_TYPE";
|
|
45
45
|
VideoCodecConfigurationTypes[VideoCodecConfigurationTypes["CODEC_PARAMETERS"] = 2] = "CODEC_PARAMETERS";
|
|
46
46
|
VideoCodecConfigurationTypes[VideoCodecConfigurationTypes["ATTRIBUTES"] = 3] = "ATTRIBUTES";
|
|
47
47
|
})(VideoCodecConfigurationTypes || (VideoCodecConfigurationTypes = {}));
|
|
48
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
49
48
|
var VideoCodecParametersTypes;
|
|
50
49
|
(function (VideoCodecParametersTypes) {
|
|
51
50
|
VideoCodecParametersTypes[VideoCodecParametersTypes["PROFILE_ID"] = 1] = "PROFILE_ID";
|
|
@@ -53,14 +52,12 @@ var VideoCodecParametersTypes;
|
|
|
53
52
|
VideoCodecParametersTypes[VideoCodecParametersTypes["BITRATE"] = 3] = "BITRATE";
|
|
54
53
|
VideoCodecParametersTypes[VideoCodecParametersTypes["IFRAME_INTERVAL"] = 4] = "IFRAME_INTERVAL";
|
|
55
54
|
})(VideoCodecParametersTypes || (VideoCodecParametersTypes = {}));
|
|
56
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
57
55
|
var VideoAttributesTypes;
|
|
58
56
|
(function (VideoAttributesTypes) {
|
|
59
57
|
VideoAttributesTypes[VideoAttributesTypes["IMAGE_WIDTH"] = 1] = "IMAGE_WIDTH";
|
|
60
58
|
VideoAttributesTypes[VideoAttributesTypes["IMAGE_HEIGHT"] = 2] = "IMAGE_HEIGHT";
|
|
61
59
|
VideoAttributesTypes[VideoAttributesTypes["FRAME_RATE"] = 3] = "FRAME_RATE";
|
|
62
60
|
})(VideoAttributesTypes || (VideoAttributesTypes = {}));
|
|
63
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
64
61
|
var SelectedCameraRecordingConfigurationTypes;
|
|
65
62
|
(function (SelectedCameraRecordingConfigurationTypes) {
|
|
66
63
|
SelectedCameraRecordingConfigurationTypes[SelectedCameraRecordingConfigurationTypes["SELECTED_RECORDING_CONFIGURATION"] = 1] = "SELECTED_RECORDING_CONFIGURATION";
|
|
@@ -70,17 +67,15 @@ var SelectedCameraRecordingConfigurationTypes;
|
|
|
70
67
|
/**
|
|
71
68
|
* @group Camera
|
|
72
69
|
*/
|
|
73
|
-
|
|
74
|
-
export var AudioRecordingCodecType;
|
|
70
|
+
var AudioRecordingCodecType;
|
|
75
71
|
(function (AudioRecordingCodecType) {
|
|
76
72
|
AudioRecordingCodecType[AudioRecordingCodecType["AAC_LC"] = 0] = "AAC_LC";
|
|
77
73
|
AudioRecordingCodecType[AudioRecordingCodecType["AAC_ELD"] = 1] = "AAC_ELD";
|
|
78
|
-
})(AudioRecordingCodecType || (AudioRecordingCodecType = {}));
|
|
74
|
+
})(AudioRecordingCodecType || (exports.AudioRecordingCodecType = AudioRecordingCodecType = {}));
|
|
79
75
|
/**
|
|
80
76
|
* @group Camera
|
|
81
77
|
*/
|
|
82
|
-
|
|
83
|
-
export var AudioRecordingSamplerate;
|
|
78
|
+
var AudioRecordingSamplerate;
|
|
84
79
|
(function (AudioRecordingSamplerate) {
|
|
85
80
|
AudioRecordingSamplerate[AudioRecordingSamplerate["KHZ_8"] = 0] = "KHZ_8";
|
|
86
81
|
AudioRecordingSamplerate[AudioRecordingSamplerate["KHZ_16"] = 1] = "KHZ_16";
|
|
@@ -88,45 +83,38 @@ export var AudioRecordingSamplerate;
|
|
|
88
83
|
AudioRecordingSamplerate[AudioRecordingSamplerate["KHZ_32"] = 3] = "KHZ_32";
|
|
89
84
|
AudioRecordingSamplerate[AudioRecordingSamplerate["KHZ_44_1"] = 4] = "KHZ_44_1";
|
|
90
85
|
AudioRecordingSamplerate[AudioRecordingSamplerate["KHZ_48"] = 5] = "KHZ_48";
|
|
91
|
-
})(AudioRecordingSamplerate || (AudioRecordingSamplerate = {}));
|
|
92
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
86
|
+
})(AudioRecordingSamplerate || (exports.AudioRecordingSamplerate = AudioRecordingSamplerate = {}));
|
|
93
87
|
var SupportedVideoRecordingConfigurationTypes;
|
|
94
88
|
(function (SupportedVideoRecordingConfigurationTypes) {
|
|
95
89
|
SupportedVideoRecordingConfigurationTypes[SupportedVideoRecordingConfigurationTypes["VIDEO_CODEC_CONFIGURATION"] = 1] = "VIDEO_CODEC_CONFIGURATION";
|
|
96
90
|
})(SupportedVideoRecordingConfigurationTypes || (SupportedVideoRecordingConfigurationTypes = {}));
|
|
97
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
98
91
|
var SupportedCameraRecordingConfigurationTypes;
|
|
99
92
|
(function (SupportedCameraRecordingConfigurationTypes) {
|
|
100
93
|
SupportedCameraRecordingConfigurationTypes[SupportedCameraRecordingConfigurationTypes["PREBUFFER_LENGTH"] = 1] = "PREBUFFER_LENGTH";
|
|
101
94
|
SupportedCameraRecordingConfigurationTypes[SupportedCameraRecordingConfigurationTypes["EVENT_TRIGGER_OPTIONS"] = 2] = "EVENT_TRIGGER_OPTIONS";
|
|
102
95
|
SupportedCameraRecordingConfigurationTypes[SupportedCameraRecordingConfigurationTypes["MEDIA_CONTAINER_CONFIGURATIONS"] = 3] = "MEDIA_CONTAINER_CONFIGURATIONS";
|
|
103
96
|
})(SupportedCameraRecordingConfigurationTypes || (SupportedCameraRecordingConfigurationTypes = {}));
|
|
104
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
105
97
|
var MediaContainerConfigurationTypes;
|
|
106
98
|
(function (MediaContainerConfigurationTypes) {
|
|
107
99
|
MediaContainerConfigurationTypes[MediaContainerConfigurationTypes["MEDIA_CONTAINER_TYPE"] = 1] = "MEDIA_CONTAINER_TYPE";
|
|
108
100
|
MediaContainerConfigurationTypes[MediaContainerConfigurationTypes["MEDIA_CONTAINER_PARAMETERS"] = 2] = "MEDIA_CONTAINER_PARAMETERS";
|
|
109
101
|
})(MediaContainerConfigurationTypes || (MediaContainerConfigurationTypes = {}));
|
|
110
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
111
102
|
var MediaContainerParameterTypes;
|
|
112
103
|
(function (MediaContainerParameterTypes) {
|
|
113
104
|
MediaContainerParameterTypes[MediaContainerParameterTypes["FRAGMENT_LENGTH"] = 1] = "FRAGMENT_LENGTH";
|
|
114
105
|
})(MediaContainerParameterTypes || (MediaContainerParameterTypes = {}));
|
|
115
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
116
106
|
var AudioCodecParametersTypes;
|
|
117
107
|
(function (AudioCodecParametersTypes) {
|
|
118
108
|
AudioCodecParametersTypes[AudioCodecParametersTypes["CHANNEL"] = 1] = "CHANNEL";
|
|
119
109
|
AudioCodecParametersTypes[AudioCodecParametersTypes["BIT_RATE"] = 2] = "BIT_RATE";
|
|
120
110
|
AudioCodecParametersTypes[AudioCodecParametersTypes["SAMPLE_RATE"] = 3] = "SAMPLE_RATE";
|
|
121
|
-
AudioCodecParametersTypes[AudioCodecParametersTypes["MAX_AUDIO_BITRATE"] = 4] = "MAX_AUDIO_BITRATE";
|
|
111
|
+
AudioCodecParametersTypes[AudioCodecParametersTypes["MAX_AUDIO_BITRATE"] = 4] = "MAX_AUDIO_BITRATE"; // only present in selected audio codec parameters tlv
|
|
122
112
|
})(AudioCodecParametersTypes || (AudioCodecParametersTypes = {}));
|
|
123
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
124
113
|
var AudioCodecConfigurationTypes;
|
|
125
114
|
(function (AudioCodecConfigurationTypes) {
|
|
126
115
|
AudioCodecConfigurationTypes[AudioCodecConfigurationTypes["CODEC_TYPE"] = 1] = "CODEC_TYPE";
|
|
127
116
|
AudioCodecConfigurationTypes[AudioCodecConfigurationTypes["CODEC_PARAMETERS"] = 2] = "CODEC_PARAMETERS";
|
|
128
117
|
})(AudioCodecConfigurationTypes || (AudioCodecConfigurationTypes = {}));
|
|
129
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
130
118
|
var SupportedAudioRecordingConfigurationTypes;
|
|
131
119
|
(function (SupportedAudioRecordingConfigurationTypes) {
|
|
132
120
|
SupportedAudioRecordingConfigurationTypes[SupportedAudioRecordingConfigurationTypes["AUDIO_CODEC_CONFIGURATION"] = 1] = "AUDIO_CODEC_CONFIGURATION";
|
|
@@ -134,8 +122,7 @@ var SupportedAudioRecordingConfigurationTypes;
|
|
|
134
122
|
/**
|
|
135
123
|
* @group Camera
|
|
136
124
|
*/
|
|
137
|
-
|
|
138
|
-
export var PacketDataType;
|
|
125
|
+
var PacketDataType;
|
|
139
126
|
(function (PacketDataType) {
|
|
140
127
|
/**
|
|
141
128
|
* mp4 moov box
|
|
@@ -145,11 +132,11 @@ export var PacketDataType;
|
|
|
145
132
|
* mp4 moof + mdat boxes
|
|
146
133
|
*/
|
|
147
134
|
PacketDataType["MEDIA_FRAGMENT"] = "mediaFragment";
|
|
148
|
-
})(PacketDataType || (PacketDataType = {}));
|
|
135
|
+
})(PacketDataType || (exports.PacketDataType = PacketDataType = {}));
|
|
149
136
|
/**
|
|
150
137
|
* @group Camera
|
|
151
138
|
*/
|
|
152
|
-
|
|
139
|
+
class RecordingManagement {
|
|
153
140
|
options;
|
|
154
141
|
delegate;
|
|
155
142
|
stateChangeDelegate;
|
|
@@ -197,32 +184,32 @@ export class RecordingManagement {
|
|
|
197
184
|
this.setupServiceHandlers();
|
|
198
185
|
}
|
|
199
186
|
constructService() {
|
|
200
|
-
const recordingManagement = new Service.CameraRecordingManagement(
|
|
201
|
-
recordingManagement.setCharacteristic(Characteristic.Active, false);
|
|
202
|
-
recordingManagement.setCharacteristic(Characteristic.RecordingAudioActive, false);
|
|
203
|
-
const operatingMode = new Service.CameraOperatingMode(
|
|
204
|
-
operatingMode.setCharacteristic(Characteristic.EventSnapshotsActive, true);
|
|
205
|
-
operatingMode.setCharacteristic(Characteristic.HomeKitCameraActive, true);
|
|
206
|
-
operatingMode.setCharacteristic(Characteristic.PeriodicSnapshotsActive, true);
|
|
207
|
-
const dataStreamManagement = new DataStreamManagement();
|
|
187
|
+
const recordingManagement = new Service_1.Service.CameraRecordingManagement("", "");
|
|
188
|
+
recordingManagement.setCharacteristic(Characteristic_1.Characteristic.Active, false);
|
|
189
|
+
recordingManagement.setCharacteristic(Characteristic_1.Characteristic.RecordingAudioActive, false);
|
|
190
|
+
const operatingMode = new Service_1.Service.CameraOperatingMode("", "");
|
|
191
|
+
operatingMode.setCharacteristic(Characteristic_1.Characteristic.EventSnapshotsActive, true);
|
|
192
|
+
operatingMode.setCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive, true);
|
|
193
|
+
operatingMode.setCharacteristic(Characteristic_1.Characteristic.PeriodicSnapshotsActive, true);
|
|
194
|
+
const dataStreamManagement = new datastream_1.DataStreamManagement();
|
|
208
195
|
recordingManagement.addLinkedService(dataStreamManagement.getService());
|
|
209
196
|
return {
|
|
210
|
-
recordingManagement,
|
|
211
|
-
operatingMode,
|
|
212
|
-
dataStreamManagement,
|
|
197
|
+
recordingManagement: recordingManagement,
|
|
198
|
+
operatingMode: operatingMode,
|
|
199
|
+
dataStreamManagement: dataStreamManagement,
|
|
213
200
|
};
|
|
214
201
|
}
|
|
215
202
|
setupServiceHandlers() {
|
|
216
203
|
// update the current configuration values to the current state.
|
|
217
|
-
this.recordingManagementService.setCharacteristic(Characteristic.SupportedCameraRecordingConfiguration, this.supportedCameraRecordingConfiguration);
|
|
218
|
-
this.recordingManagementService.setCharacteristic(Characteristic.SupportedVideoRecordingConfiguration, this.supportedVideoRecordingConfiguration);
|
|
219
|
-
this.recordingManagementService.setCharacteristic(Characteristic.SupportedAudioRecordingConfiguration, this.supportedAudioRecordingConfiguration);
|
|
220
|
-
this.recordingManagementService.getCharacteristic(Characteristic.SelectedCameraRecordingConfiguration)
|
|
204
|
+
this.recordingManagementService.setCharacteristic(Characteristic_1.Characteristic.SupportedCameraRecordingConfiguration, this.supportedCameraRecordingConfiguration);
|
|
205
|
+
this.recordingManagementService.setCharacteristic(Characteristic_1.Characteristic.SupportedVideoRecordingConfiguration, this.supportedVideoRecordingConfiguration);
|
|
206
|
+
this.recordingManagementService.setCharacteristic(Characteristic_1.Characteristic.SupportedAudioRecordingConfiguration, this.supportedAudioRecordingConfiguration);
|
|
207
|
+
this.recordingManagementService.getCharacteristic(Characteristic_1.Characteristic.SelectedCameraRecordingConfiguration)
|
|
221
208
|
.onGet(this.handleSelectedCameraRecordingConfigurationRead.bind(this))
|
|
222
209
|
.onSet(this.handleSelectedCameraRecordingConfigurationWrite.bind(this))
|
|
223
210
|
.setProps({ adminOnlyAccess: [1 /* Access.WRITE */] });
|
|
224
|
-
this.recordingManagementService.getCharacteristic(Characteristic.Active)
|
|
225
|
-
.onSet(
|
|
211
|
+
this.recordingManagementService.getCharacteristic(Characteristic_1.Characteristic.Active)
|
|
212
|
+
.onSet(value => {
|
|
226
213
|
if (!!value === this.recordingActive) {
|
|
227
214
|
return; // skip delegate call if state didn't change!
|
|
228
215
|
}
|
|
@@ -231,12 +218,12 @@ export class RecordingManagement {
|
|
|
231
218
|
})
|
|
232
219
|
.on("change" /* CharacteristicEventTypes.CHANGE */, () => this.stateChangeDelegate?.())
|
|
233
220
|
.setProps({ adminOnlyAccess: [1 /* Access.WRITE */] });
|
|
234
|
-
this.recordingManagementService.getCharacteristic(Characteristic.RecordingAudioActive)
|
|
221
|
+
this.recordingManagementService.getCharacteristic(Characteristic_1.Characteristic.RecordingAudioActive)
|
|
235
222
|
.on("change" /* CharacteristicEventTypes.CHANGE */, () => this.stateChangeDelegate?.());
|
|
236
|
-
this.operatingModeService.getCharacteristic(Characteristic.HomeKitCameraActive)
|
|
237
|
-
.on("change" /* CharacteristicEventTypes.CHANGE */,
|
|
223
|
+
this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive)
|
|
224
|
+
.on("change" /* CharacteristicEventTypes.CHANGE */, change => {
|
|
238
225
|
for (const service of this.sensorServices) {
|
|
239
|
-
service.setCharacteristic(Characteristic.StatusActive, !!change.newValue);
|
|
226
|
+
service.setCharacteristic(Characteristic_1.Characteristic.StatusActive, !!change.newValue);
|
|
240
227
|
}
|
|
241
228
|
if (!change.newValue && this.recordingStream) {
|
|
242
229
|
this.recordingStream.close(1 /* HDSProtocolSpecificErrorReason.NOT_ALLOWED */);
|
|
@@ -244,70 +231,71 @@ export class RecordingManagement {
|
|
|
244
231
|
this.stateChangeDelegate?.();
|
|
245
232
|
})
|
|
246
233
|
.setProps({ adminOnlyAccess: [1 /* Access.WRITE */] });
|
|
247
|
-
this.operatingModeService.getCharacteristic(Characteristic.EventSnapshotsActive)
|
|
234
|
+
this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.EventSnapshotsActive)
|
|
248
235
|
.on("change" /* CharacteristicEventTypes.CHANGE */, () => this.stateChangeDelegate?.())
|
|
249
236
|
.setProps({ adminOnlyAccess: [1 /* Access.WRITE */] });
|
|
250
|
-
this.operatingModeService.getCharacteristic(Characteristic.PeriodicSnapshotsActive)
|
|
237
|
+
this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.PeriodicSnapshotsActive)
|
|
251
238
|
.on("change" /* CharacteristicEventTypes.CHANGE */, () => this.stateChangeDelegate?.())
|
|
252
239
|
.setProps({ adminOnlyAccess: [1 /* Access.WRITE */] });
|
|
253
240
|
this.dataStreamManagement
|
|
254
241
|
.onRequestMessage("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, this.handleDataSendOpen.bind(this));
|
|
255
242
|
}
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
256
244
|
handleDataSendOpen(connection, id, message) {
|
|
257
245
|
// for message fields see https://github.com/Supereg/secure-video-specification#41-start
|
|
258
246
|
const streamId = message.streamId;
|
|
259
247
|
const type = message.type;
|
|
260
248
|
const target = message.target;
|
|
261
249
|
const reason = message.reason;
|
|
262
|
-
if (target !==
|
|
263
|
-
debug(
|
|
264
|
-
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
250
|
+
if (target !== "controller" || type !== "ipcamera.recording") {
|
|
251
|
+
debug("[HDS %s] Received data send with unexpected target: %s or type: %d. Rejecting...", connection.remoteAddress, target, type);
|
|
252
|
+
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, datastream_1.HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
265
253
|
status: 5 /* HDSProtocolSpecificErrorReason.UNEXPECTED_FAILURE */,
|
|
266
254
|
});
|
|
267
255
|
return;
|
|
268
256
|
}
|
|
269
257
|
if (!this.recordingActive) {
|
|
270
|
-
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
258
|
+
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, datastream_1.HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
271
259
|
status: 1 /* HDSProtocolSpecificErrorReason.NOT_ALLOWED */,
|
|
272
260
|
});
|
|
273
261
|
return;
|
|
274
262
|
}
|
|
275
|
-
if (!this.operatingModeService.getCharacteristic(Characteristic.HomeKitCameraActive).value) {
|
|
276
|
-
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
263
|
+
if (!this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive).value) {
|
|
264
|
+
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, datastream_1.HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
277
265
|
status: 1 /* HDSProtocolSpecificErrorReason.NOT_ALLOWED */,
|
|
278
266
|
});
|
|
279
267
|
return;
|
|
280
268
|
}
|
|
281
269
|
if (this.recordingStream) {
|
|
282
|
-
debug(
|
|
270
|
+
debug("[HDS %s] Rejecting DATA_SEND OPEN as another stream (%s) is already recording with streamId %d!", connection.remoteAddress, this.recordingStream.connection.remoteAddress, this.recordingStream.streamId);
|
|
283
271
|
// there is already a recording stream running.
|
|
284
|
-
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
272
|
+
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, datastream_1.HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
285
273
|
status: 2 /* HDSProtocolSpecificErrorReason.BUSY */,
|
|
286
274
|
});
|
|
287
275
|
return;
|
|
288
276
|
}
|
|
289
277
|
if (!this.selectedConfiguration) {
|
|
290
|
-
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
278
|
+
connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, id, datastream_1.HDSStatus.PROTOCOL_SPECIFIC_ERROR, {
|
|
291
279
|
status: 9 /* HDSProtocolSpecificErrorReason.INVALID_CONFIGURATION */,
|
|
292
280
|
});
|
|
293
281
|
return;
|
|
294
282
|
}
|
|
295
|
-
debug(
|
|
296
|
-
// eslint-disable-next-line
|
|
283
|
+
debug("[HDS %s] HDS DATA_SEND Open with reason '%s'.", connection.remoteAddress, reason);
|
|
284
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
297
285
|
this.recordingStream = new CameraRecordingStream(connection, this.delegate, id, streamId);
|
|
298
|
-
// eslint-disable-next-line ts/no-use-before-define
|
|
299
286
|
this.recordingStream.on("closed" /* CameraRecordingStreamEvents.CLOSED */, () => {
|
|
300
|
-
debug(
|
|
287
|
+
debug("[HDS %s] Removing active recoding session from recording management!", connection.remoteAddress);
|
|
301
288
|
this.recordingStream = undefined;
|
|
302
289
|
});
|
|
303
290
|
this.recordingStream.startStreaming();
|
|
304
291
|
}
|
|
305
292
|
handleSelectedCameraRecordingConfigurationRead() {
|
|
306
293
|
if (!this.selectedConfiguration) {
|
|
307
|
-
throw new HapStatusError(-70402 /* HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
294
|
+
throw new hapStatusError_1.HapStatusError(-70402 /* HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
308
295
|
}
|
|
309
296
|
return this.selectedConfiguration.base64;
|
|
310
297
|
}
|
|
298
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
311
299
|
handleSelectedCameraRecordingConfigurationWrite(value) {
|
|
312
300
|
const configuration = this.parseSelectedConfiguration(value);
|
|
313
301
|
const changed = this.selectedConfiguration?.base64 !== value;
|
|
@@ -322,19 +310,19 @@ export class RecordingManagement {
|
|
|
322
310
|
}
|
|
323
311
|
}
|
|
324
312
|
parseSelectedConfiguration(value) {
|
|
325
|
-
const decoded = decode(Buffer.from(value,
|
|
326
|
-
const recording = decode(decoded[1 /* SelectedCameraRecordingConfigurationTypes.SELECTED_RECORDING_CONFIGURATION */]);
|
|
327
|
-
const video = decode(decoded[2 /* SelectedCameraRecordingConfigurationTypes.SELECTED_VIDEO_CONFIGURATION */]);
|
|
328
|
-
const audio = decode(decoded[3 /* SelectedCameraRecordingConfigurationTypes.SELECTED_AUDIO_CONFIGURATION */]);
|
|
313
|
+
const decoded = tlv.decode(Buffer.from(value, "base64"));
|
|
314
|
+
const recording = tlv.decode(decoded[1 /* SelectedCameraRecordingConfigurationTypes.SELECTED_RECORDING_CONFIGURATION */]);
|
|
315
|
+
const video = tlv.decode(decoded[2 /* SelectedCameraRecordingConfigurationTypes.SELECTED_VIDEO_CONFIGURATION */]);
|
|
316
|
+
const audio = tlv.decode(decoded[3 /* SelectedCameraRecordingConfigurationTypes.SELECTED_AUDIO_CONFIGURATION */]);
|
|
329
317
|
const prebufferLength = recording[1 /* SupportedCameraRecordingConfigurationTypes.PREBUFFER_LENGTH */].readInt32LE(0);
|
|
330
318
|
let eventTriggerOptions = recording[2 /* SupportedCameraRecordingConfigurationTypes.EVENT_TRIGGER_OPTIONS */].readInt32LE(0);
|
|
331
|
-
const mediaContainerConfiguration = decode(recording[3 /* SupportedCameraRecordingConfigurationTypes.MEDIA_CONTAINER_CONFIGURATIONS */]);
|
|
319
|
+
const mediaContainerConfiguration = tlv.decode(recording[3 /* SupportedCameraRecordingConfigurationTypes.MEDIA_CONTAINER_CONFIGURATIONS */]);
|
|
332
320
|
const containerType = mediaContainerConfiguration[1 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_TYPE */][0];
|
|
333
|
-
const mediaContainerParameters = decode(mediaContainerConfiguration[2 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_PARAMETERS */]);
|
|
321
|
+
const mediaContainerParameters = tlv.decode(mediaContainerConfiguration[2 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_PARAMETERS */]);
|
|
334
322
|
const fragmentLength = mediaContainerParameters[1 /* MediaContainerParameterTypes.FRAGMENT_LENGTH */].readInt32LE(0);
|
|
335
323
|
const videoCodec = video[1 /* VideoCodecConfigurationTypes.CODEC_TYPE */][0];
|
|
336
|
-
const videoParameters = decode(video[2 /* VideoCodecConfigurationTypes.CODEC_PARAMETERS */]);
|
|
337
|
-
const videoAttributes = decode(video[3 /* VideoCodecConfigurationTypes.ATTRIBUTES */]);
|
|
324
|
+
const videoParameters = tlv.decode(video[2 /* VideoCodecConfigurationTypes.CODEC_PARAMETERS */]);
|
|
325
|
+
const videoAttributes = tlv.decode(video[3 /* VideoCodecConfigurationTypes.ATTRIBUTES */]);
|
|
338
326
|
const profile = videoParameters[1 /* VideoCodecParametersTypes.PROFILE_ID */][0];
|
|
339
327
|
const level = videoParameters[2 /* VideoCodecParametersTypes.LEVEL */][0];
|
|
340
328
|
const videoBitrate = videoParameters[3 /* VideoCodecParametersTypes.BITRATE */].readInt32LE(0);
|
|
@@ -343,22 +331,22 @@ export class RecordingManagement {
|
|
|
343
331
|
const height = videoAttributes[2 /* VideoAttributesTypes.IMAGE_HEIGHT */].readInt16LE(0);
|
|
344
332
|
const framerate = videoAttributes[3 /* VideoAttributesTypes.FRAME_RATE */][0];
|
|
345
333
|
const audioCodec = audio[1 /* AudioCodecConfigurationTypes.CODEC_TYPE */][0];
|
|
346
|
-
const audioParameters = decode(audio[2 /* AudioCodecConfigurationTypes.CODEC_PARAMETERS */]);
|
|
334
|
+
const audioParameters = tlv.decode(audio[2 /* AudioCodecConfigurationTypes.CODEC_PARAMETERS */]);
|
|
347
335
|
const audioChannels = audioParameters[1 /* AudioCodecParametersTypes.CHANNEL */][0];
|
|
348
336
|
const samplerate = audioParameters[3 /* AudioCodecParametersTypes.SAMPLE_RATE */][0];
|
|
349
337
|
const audioBitrateMode = audioParameters[2 /* AudioCodecParametersTypes.BIT_RATE */][0];
|
|
350
338
|
const audioBitrate = audioParameters[4 /* AudioCodecParametersTypes.MAX_AUDIO_BITRATE */].readUInt32LE(0);
|
|
351
339
|
const typedEventTriggers = [];
|
|
352
|
-
let
|
|
340
|
+
let bit_index = 0;
|
|
353
341
|
while (eventTriggerOptions > 0) {
|
|
354
|
-
if (eventTriggerOptions
|
|
355
|
-
typedEventTriggers.push(1 <<
|
|
342
|
+
if (eventTriggerOptions & 0x01) { // of the lowest bit is set add the next event trigger option
|
|
343
|
+
typedEventTriggers.push(1 << bit_index);
|
|
356
344
|
}
|
|
357
|
-
eventTriggerOptions =
|
|
358
|
-
|
|
345
|
+
eventTriggerOptions = eventTriggerOptions >> 1; // shift to right till we reach zero.
|
|
346
|
+
bit_index += 1; // count our current bit index
|
|
359
347
|
}
|
|
360
348
|
return {
|
|
361
|
-
prebufferLength,
|
|
349
|
+
prebufferLength: prebufferLength,
|
|
362
350
|
eventTriggerTypes: typedEventTriggers,
|
|
363
351
|
mediaContainerConfiguration: {
|
|
364
352
|
type: containerType,
|
|
@@ -367,10 +355,10 @@ export class RecordingManagement {
|
|
|
367
355
|
videoCodec: {
|
|
368
356
|
type: videoCodec,
|
|
369
357
|
parameters: {
|
|
370
|
-
profile,
|
|
371
|
-
level,
|
|
358
|
+
profile: profile,
|
|
359
|
+
level: level,
|
|
372
360
|
bitRate: videoBitrate,
|
|
373
|
-
iFrameInterval,
|
|
361
|
+
iFrameInterval: iFrameInterval,
|
|
374
362
|
},
|
|
375
363
|
resolution: [width, height, framerate],
|
|
376
364
|
},
|
|
@@ -391,23 +379,23 @@ export class RecordingManagement {
|
|
|
391
379
|
const eventTriggerOptions = Buffer.alloc(8);
|
|
392
380
|
prebufferLength.writeInt32LE(options.prebufferLength, 0);
|
|
393
381
|
eventTriggerOptions.writeInt32LE(this.eventTriggerOptions, 0);
|
|
394
|
-
return encode(1 /* SupportedCameraRecordingConfigurationTypes.PREBUFFER_LENGTH */, prebufferLength, 2 /* SupportedCameraRecordingConfigurationTypes.EVENT_TRIGGER_OPTIONS */, eventTriggerOptions, 3 /* SupportedCameraRecordingConfigurationTypes.MEDIA_CONTAINER_CONFIGURATIONS */, mediaContainers.map(
|
|
382
|
+
return tlv.encode(1 /* SupportedCameraRecordingConfigurationTypes.PREBUFFER_LENGTH */, prebufferLength, 2 /* SupportedCameraRecordingConfigurationTypes.EVENT_TRIGGER_OPTIONS */, eventTriggerOptions, 3 /* SupportedCameraRecordingConfigurationTypes.MEDIA_CONTAINER_CONFIGURATIONS */, mediaContainers.map(config => {
|
|
395
383
|
const fragmentLength = Buffer.alloc(4);
|
|
396
384
|
fragmentLength.writeInt32LE(config.fragmentLength, 0);
|
|
397
|
-
return encode(1 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_TYPE */, config.type, 2 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_PARAMETERS */, encode(1 /* MediaContainerParameterTypes.FRAGMENT_LENGTH */, fragmentLength));
|
|
398
|
-
})).toString(
|
|
385
|
+
return tlv.encode(1 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_TYPE */, config.type, 2 /* MediaContainerConfigurationTypes.MEDIA_CONTAINER_PARAMETERS */, tlv.encode(1 /* MediaContainerParameterTypes.FRAGMENT_LENGTH */, fragmentLength));
|
|
386
|
+
})).toString("base64");
|
|
399
387
|
}
|
|
400
388
|
_supportedVideoRecordingConfiguration(videoOptions) {
|
|
401
389
|
if (!videoOptions.parameters) {
|
|
402
|
-
throw new Error(
|
|
390
|
+
throw new Error("Video parameters cannot be undefined");
|
|
403
391
|
}
|
|
404
392
|
if (!videoOptions.resolutions) {
|
|
405
|
-
throw new Error(
|
|
393
|
+
throw new Error("Video resolutions cannot be undefined");
|
|
406
394
|
}
|
|
407
|
-
const codecParameters = encode(1 /* VideoCodecParametersTypes.PROFILE_ID */, videoOptions.parameters.profiles, 2 /* VideoCodecParametersTypes.LEVEL */, videoOptions.parameters.levels);
|
|
408
|
-
const videoStreamConfiguration = encode(1 /* VideoCodecConfigurationTypes.CODEC_TYPE */, videoOptions.type, 2 /* VideoCodecConfigurationTypes.CODEC_PARAMETERS */, codecParameters, 3 /* VideoCodecConfigurationTypes.ATTRIBUTES */, videoOptions.resolutions.map(
|
|
395
|
+
const codecParameters = tlv.encode(1 /* VideoCodecParametersTypes.PROFILE_ID */, videoOptions.parameters.profiles, 2 /* VideoCodecParametersTypes.LEVEL */, videoOptions.parameters.levels);
|
|
396
|
+
const videoStreamConfiguration = tlv.encode(1 /* VideoCodecConfigurationTypes.CODEC_TYPE */, videoOptions.type, 2 /* VideoCodecConfigurationTypes.CODEC_PARAMETERS */, codecParameters, 3 /* VideoCodecConfigurationTypes.ATTRIBUTES */, videoOptions.resolutions.map(resolution => {
|
|
409
397
|
if (resolution.length !== 3) {
|
|
410
|
-
throw new Error(
|
|
398
|
+
throw new Error("Unexpected video resolution");
|
|
411
399
|
}
|
|
412
400
|
const width = Buffer.alloc(2);
|
|
413
401
|
const height = Buffer.alloc(2);
|
|
@@ -415,35 +403,35 @@ export class RecordingManagement {
|
|
|
415
403
|
width.writeUInt16LE(resolution[0], 0);
|
|
416
404
|
height.writeUInt16LE(resolution[1], 0);
|
|
417
405
|
frameRate.writeUInt8(resolution[2], 0);
|
|
418
|
-
return encode(1 /* VideoAttributesTypes.IMAGE_WIDTH */, width, 2 /* VideoAttributesTypes.IMAGE_HEIGHT */, height, 3 /* VideoAttributesTypes.FRAME_RATE */, frameRate);
|
|
406
|
+
return tlv.encode(1 /* VideoAttributesTypes.IMAGE_WIDTH */, width, 2 /* VideoAttributesTypes.IMAGE_HEIGHT */, height, 3 /* VideoAttributesTypes.FRAME_RATE */, frameRate);
|
|
419
407
|
}));
|
|
420
|
-
return encode(1 /* SupportedVideoRecordingConfigurationTypes.VIDEO_CODEC_CONFIGURATION */, videoStreamConfiguration).toString(
|
|
408
|
+
return tlv.encode(1 /* SupportedVideoRecordingConfigurationTypes.VIDEO_CODEC_CONFIGURATION */, videoStreamConfiguration).toString("base64");
|
|
421
409
|
}
|
|
422
410
|
_supportedAudioStreamConfiguration(audioOptions) {
|
|
423
411
|
const audioCodecs = Array.isArray(audioOptions.codecs)
|
|
424
412
|
? audioOptions.codecs
|
|
425
413
|
: [audioOptions.codecs];
|
|
426
414
|
if (audioCodecs.length === 0) {
|
|
427
|
-
throw
|
|
415
|
+
throw Error("CameraRecordingOptions.audio: At least one audio codec configuration must be specified!");
|
|
428
416
|
}
|
|
429
|
-
const codecConfigurations = audioCodecs.map(
|
|
417
|
+
const codecConfigurations = audioCodecs.map(codec => {
|
|
430
418
|
const providedSamplerates = Array.isArray(codec.samplerate)
|
|
431
419
|
? codec.samplerate
|
|
432
420
|
: [codec.samplerate];
|
|
433
421
|
if (providedSamplerates.length === 0) {
|
|
434
|
-
throw new Error(
|
|
422
|
+
throw new Error("CameraRecordingOptions.audio.codecs: Audio samplerate cannot be empty!");
|
|
435
423
|
}
|
|
436
|
-
const audioParameters = encode(1 /* AudioCodecParametersTypes.CHANNEL */, Math.max(1, codec.audioChannels || 1), 2 /* AudioCodecParametersTypes.BIT_RATE */, codec.bitrateMode || 0 /* AudioBitrate.VARIABLE */, 3 /* AudioCodecParametersTypes.SAMPLE_RATE */, providedSamplerates);
|
|
437
|
-
return encode(1 /* AudioCodecConfigurationTypes.CODEC_TYPE */, codec.type, 2 /* AudioCodecConfigurationTypes.CODEC_PARAMETERS */, audioParameters);
|
|
424
|
+
const audioParameters = tlv.encode(1 /* AudioCodecParametersTypes.CHANNEL */, Math.max(1, codec.audioChannels || 1), 2 /* AudioCodecParametersTypes.BIT_RATE */, codec.bitrateMode || 0 /* AudioBitrate.VARIABLE */, 3 /* AudioCodecParametersTypes.SAMPLE_RATE */, providedSamplerates);
|
|
425
|
+
return tlv.encode(1 /* AudioCodecConfigurationTypes.CODEC_TYPE */, codec.type, 2 /* AudioCodecConfigurationTypes.CODEC_PARAMETERS */, audioParameters);
|
|
438
426
|
});
|
|
439
|
-
return encode(1 /* SupportedAudioRecordingConfigurationTypes.AUDIO_CODEC_CONFIGURATION */, codecConfigurations).toString(
|
|
427
|
+
return tlv.encode(1 /* SupportedAudioRecordingConfigurationTypes.AUDIO_CODEC_CONFIGURATION */, codecConfigurations).toString("base64");
|
|
440
428
|
}
|
|
441
|
-
computeConfigurationHash(algorithm =
|
|
442
|
-
const configurationHash = createHash(algorithm);
|
|
429
|
+
computeConfigurationHash(algorithm = "sha256") {
|
|
430
|
+
const configurationHash = crypto_1.default.createHash(algorithm);
|
|
443
431
|
configurationHash.update(this.supportedCameraRecordingConfiguration);
|
|
444
432
|
configurationHash.update(this.supportedVideoRecordingConfiguration);
|
|
445
433
|
configurationHash.update(this.supportedAudioRecordingConfiguration);
|
|
446
|
-
return configurationHash.digest().toString(
|
|
434
|
+
return configurationHash.digest().toString("hex");
|
|
447
435
|
}
|
|
448
436
|
/**
|
|
449
437
|
* @private
|
|
@@ -451,15 +439,15 @@ export class RecordingManagement {
|
|
|
451
439
|
serialize() {
|
|
452
440
|
return {
|
|
453
441
|
configurationHash: {
|
|
454
|
-
algorithm:
|
|
455
|
-
hash: this.computeConfigurationHash(
|
|
442
|
+
algorithm: "sha256",
|
|
443
|
+
hash: this.computeConfigurationHash("sha256"),
|
|
456
444
|
},
|
|
457
445
|
selectedConfiguration: this.selectedConfiguration?.base64,
|
|
458
446
|
recordingActive: this.recordingActive,
|
|
459
|
-
recordingAudioActive: !!this.recordingManagementService.getCharacteristic(Characteristic.RecordingAudioActive).value,
|
|
460
|
-
eventSnapshotsActive: !!this.operatingModeService.getCharacteristic(Characteristic.EventSnapshotsActive).value,
|
|
461
|
-
homeKitCameraActive: !!this.operatingModeService.getCharacteristic(Characteristic.HomeKitCameraActive).value,
|
|
462
|
-
periodicSnapshotsActive: !!this.operatingModeService.getCharacteristic(Characteristic.PeriodicSnapshotsActive).value,
|
|
447
|
+
recordingAudioActive: !!this.recordingManagementService.getCharacteristic(Characteristic_1.Characteristic.RecordingAudioActive).value,
|
|
448
|
+
eventSnapshotsActive: !!this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.EventSnapshotsActive).value,
|
|
449
|
+
homeKitCameraActive: !!this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive).value,
|
|
450
|
+
periodicSnapshotsActive: !!this.operatingModeService.getCharacteristic(Characteristic_1.Characteristic.PeriodicSnapshotsActive).value,
|
|
463
451
|
};
|
|
464
452
|
}
|
|
465
453
|
/**
|
|
@@ -481,13 +469,13 @@ export class RecordingManagement {
|
|
|
481
469
|
}
|
|
482
470
|
}
|
|
483
471
|
this.recordingActive = serialized.recordingActive;
|
|
484
|
-
this.recordingManagementService.updateCharacteristic(Characteristic.Active, serialized.recordingActive);
|
|
485
|
-
this.recordingManagementService.updateCharacteristic(Characteristic.RecordingAudioActive, serialized.recordingAudioActive);
|
|
486
|
-
this.operatingModeService.updateCharacteristic(Characteristic.EventSnapshotsActive, serialized.eventSnapshotsActive);
|
|
487
|
-
this.operatingModeService.updateCharacteristic(Characteristic.PeriodicSnapshotsActive, serialized.periodicSnapshotsActive);
|
|
488
|
-
this.operatingModeService.updateCharacteristic(Characteristic.HomeKitCameraActive, serialized.homeKitCameraActive);
|
|
472
|
+
this.recordingManagementService.updateCharacteristic(Characteristic_1.Characteristic.Active, serialized.recordingActive);
|
|
473
|
+
this.recordingManagementService.updateCharacteristic(Characteristic_1.Characteristic.RecordingAudioActive, serialized.recordingAudioActive);
|
|
474
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.EventSnapshotsActive, serialized.eventSnapshotsActive);
|
|
475
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.PeriodicSnapshotsActive, serialized.periodicSnapshotsActive);
|
|
476
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive, serialized.homeKitCameraActive);
|
|
489
477
|
for (const service of this.sensorServices) {
|
|
490
|
-
service.setCharacteristic(Characteristic.StatusActive, serialized.homeKitCameraActive);
|
|
478
|
+
service.setCharacteristic(Characteristic_1.Characteristic.StatusActive, serialized.homeKitCameraActive);
|
|
491
479
|
}
|
|
492
480
|
try {
|
|
493
481
|
if (this.selectedConfiguration) {
|
|
@@ -498,7 +486,7 @@ export class RecordingManagement {
|
|
|
498
486
|
}
|
|
499
487
|
}
|
|
500
488
|
catch (error) {
|
|
501
|
-
console.error(
|
|
489
|
+
console.error("Failed to properly initialize CameraRecordingDelegate from persistent storage: " + error.stack);
|
|
502
490
|
}
|
|
503
491
|
if (changedState) {
|
|
504
492
|
this.stateChangeDelegate?.();
|
|
@@ -515,13 +503,13 @@ export class RecordingManagement {
|
|
|
515
503
|
}
|
|
516
504
|
handleFactoryReset() {
|
|
517
505
|
this.selectedConfiguration = undefined;
|
|
518
|
-
this.recordingManagementService.updateCharacteristic(Characteristic.Active, false);
|
|
519
|
-
this.recordingManagementService.updateCharacteristic(Characteristic.RecordingAudioActive, false);
|
|
520
|
-
this.operatingModeService.updateCharacteristic(Characteristic.EventSnapshotsActive, true);
|
|
521
|
-
this.operatingModeService.updateCharacteristic(Characteristic.PeriodicSnapshotsActive, true);
|
|
522
|
-
this.operatingModeService.updateCharacteristic(Characteristic.HomeKitCameraActive, true);
|
|
506
|
+
this.recordingManagementService.updateCharacteristic(Characteristic_1.Characteristic.Active, false);
|
|
507
|
+
this.recordingManagementService.updateCharacteristic(Characteristic_1.Characteristic.RecordingAudioActive, false);
|
|
508
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.EventSnapshotsActive, true);
|
|
509
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.PeriodicSnapshotsActive, true);
|
|
510
|
+
this.operatingModeService.updateCharacteristic(Characteristic_1.Characteristic.HomeKitCameraActive, true);
|
|
523
511
|
for (const service of this.sensorServices) {
|
|
524
|
-
service.setCharacteristic(Characteristic.StatusActive, true);
|
|
512
|
+
service.setCharacteristic(Characteristic_1.Characteristic.StatusActive, true);
|
|
525
513
|
}
|
|
526
514
|
try {
|
|
527
515
|
// notifying the delegate about the updated state
|
|
@@ -529,14 +517,14 @@ export class RecordingManagement {
|
|
|
529
517
|
this.delegate.updateRecordingConfiguration(undefined);
|
|
530
518
|
}
|
|
531
519
|
catch (error) {
|
|
532
|
-
console.error(
|
|
520
|
+
console.error("CameraRecordingDelegate failed to update state after handleFactoryReset: " + error.stack);
|
|
533
521
|
}
|
|
534
522
|
}
|
|
535
523
|
}
|
|
524
|
+
exports.RecordingManagement = RecordingManagement;
|
|
536
525
|
/**
|
|
537
526
|
* @group Camera
|
|
538
527
|
*/
|
|
539
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
540
528
|
var CameraRecordingStreamEvents;
|
|
541
529
|
(function (CameraRecordingStreamEvents) {
|
|
542
530
|
/**
|
|
@@ -552,8 +540,8 @@ var CameraRecordingStreamEvents;
|
|
|
552
540
|
*
|
|
553
541
|
* @group Camera
|
|
554
542
|
*/
|
|
555
|
-
// eslint-disable-next-line
|
|
556
|
-
class CameraRecordingStream extends EventEmitter {
|
|
543
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
|
|
544
|
+
class CameraRecordingStream extends events_1.EventEmitter {
|
|
557
545
|
connection;
|
|
558
546
|
delegate;
|
|
559
547
|
hdsRequestId;
|
|
@@ -587,12 +575,13 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
587
575
|
this.connection.addProtocolHandler("dataSend" /* Protocols.DATA_SEND */, this);
|
|
588
576
|
}
|
|
589
577
|
startStreaming() {
|
|
578
|
+
// noinspection JSIgnoredPromiseFromCall
|
|
590
579
|
this._startStreaming();
|
|
591
580
|
}
|
|
592
581
|
async _startStreaming() {
|
|
593
|
-
debug(
|
|
594
|
-
this.connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, this.hdsRequestId, HDSStatus.SUCCESS, {
|
|
595
|
-
status: HDSStatus.SUCCESS,
|
|
582
|
+
debug("[HDS %s] Sending DATA_SEND OPEN response for streamId %d", this.connection.remoteAddress, this.streamId);
|
|
583
|
+
this.connection.sendResponse("dataSend" /* Protocols.DATA_SEND */, "open" /* Topics.OPEN */, this.hdsRequestId, datastream_1.HDSStatus.SUCCESS, {
|
|
584
|
+
status: datastream_1.HDSStatus.SUCCESS,
|
|
596
585
|
});
|
|
597
586
|
// 256 KiB (1KiB to 900 KiB)
|
|
598
587
|
const maxChunk = 0x40000;
|
|
@@ -619,24 +608,24 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
619
608
|
if (this.closed) {
|
|
620
609
|
break;
|
|
621
610
|
}
|
|
622
|
-
const data = fragment.
|
|
611
|
+
const data = fragment.slice(offset, offset + maxChunk);
|
|
623
612
|
offset += data.length;
|
|
624
613
|
// see https://github.com/Supereg/secure-video-specification#42-binary-data
|
|
625
614
|
const event = {
|
|
626
615
|
streamId: this.streamId,
|
|
627
616
|
packets: [{
|
|
628
|
-
data,
|
|
617
|
+
data: data,
|
|
629
618
|
metadata: {
|
|
630
619
|
dataType: initialization ? "mediaInitialization" /* PacketDataType.MEDIA_INITIALIZATION */ : "mediaFragment" /* PacketDataType.MEDIA_FRAGMENT */,
|
|
631
|
-
dataSequenceNumber,
|
|
632
|
-
dataChunkSequenceNumber,
|
|
620
|
+
dataSequenceNumber: dataSequenceNumber,
|
|
621
|
+
dataChunkSequenceNumber: dataChunkSequenceNumber,
|
|
633
622
|
isLastDataChunk: offset >= fragment.length,
|
|
634
623
|
dataTotalSize: dataChunkSequenceNumber === 1 ? fragment.length : undefined,
|
|
635
624
|
},
|
|
636
625
|
}],
|
|
637
626
|
endOfStream: offset >= fragment.length ? Boolean(packet.isLast).valueOf() : undefined,
|
|
638
627
|
};
|
|
639
|
-
debug(
|
|
628
|
+
debug("[HDS %s] Sending DATA_SEND DATA for stream %d with metadata: %o and length %d; EoS: %s", this.connection.remoteAddress, this.streamId, event.packets[0].metadata, data.length, event.endOfStream);
|
|
640
629
|
this.connection.sendEvent("dataSend" /* Protocols.DATA_SEND */, "data" /* Topics.DATA */, event);
|
|
641
630
|
dataChunkSequenceNumber++;
|
|
642
631
|
initialization = false;
|
|
@@ -649,8 +638,8 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
649
638
|
}
|
|
650
639
|
if (!lastFragmentWasMarkedLast && !this.closed) {
|
|
651
640
|
// Delegate violates the contract. Exited normally on a non-closed stream without properly setting `isLast`.
|
|
652
|
-
console.warn(`[HDS ${this.connection.remoteAddress}] Delegate finished streaming for ${this.streamId} without setting RecordingPacket.isLast. `
|
|
653
|
-
|
|
641
|
+
console.warn(`[HDS ${this.connection.remoteAddress}] Delegate finished streaming for ${this.streamId} without setting RecordingPacket.isLast. ` +
|
|
642
|
+
"Can't notify Controller about endOfStream!");
|
|
654
643
|
}
|
|
655
644
|
}
|
|
656
645
|
catch (error) {
|
|
@@ -659,13 +648,13 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
659
648
|
}
|
|
660
649
|
else {
|
|
661
650
|
let closeReason = 5 /* HDSProtocolSpecificErrorReason.UNEXPECTED_FAILURE */;
|
|
662
|
-
if (error instanceof HDSProtocolError) {
|
|
651
|
+
if (error instanceof datastream_1.HDSProtocolError) {
|
|
663
652
|
closeReason = error.reason;
|
|
664
|
-
debug(
|
|
653
|
+
debug("[HDS %s] Delegate signaled to close the recording stream %d.", this.connection.remoteAddress, this.streamId);
|
|
665
654
|
}
|
|
666
|
-
else if (error instanceof HDSConnectionError && error.type === 2 /* HDSConnectionErrorType.CLOSED_SOCKET */) {
|
|
655
|
+
else if (error instanceof datastream_1.HDSConnectionError && error.type === 2 /* HDSConnectionErrorType.CLOSED_SOCKET */) {
|
|
667
656
|
// we are probably on a shutdown or just late. Connection is dead. End the stream!
|
|
668
|
-
debug(
|
|
657
|
+
debug("[HDS %s] Exited recording stream due to closed HDS socket: stream id %d.", this.connection.remoteAddress, this.streamId);
|
|
669
658
|
return; // execute finally and then exit (we want to skip the `sendEvent` below)
|
|
670
659
|
}
|
|
671
660
|
else {
|
|
@@ -688,17 +677,19 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
688
677
|
this.kickOffCloseTimeout();
|
|
689
678
|
}
|
|
690
679
|
}
|
|
691
|
-
debug(
|
|
680
|
+
debug("[HDS %s] Finished DATA_SEND transmission for stream %d!", this.connection.remoteAddress, this.streamId);
|
|
692
681
|
}
|
|
682
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
693
683
|
handleDataSendAck(message) {
|
|
694
684
|
const streamId = message.streamId;
|
|
695
685
|
const endOfStream = message.endOfStream;
|
|
696
686
|
// The HomeKit Controller will send a DATA_SEND ACK if we set the `endOfStream` flag in the last packet
|
|
697
687
|
// of our DATA_SEND DATA packet.
|
|
698
688
|
// To my testing the session is then considered complete and the HomeKit controller will close the HDS Connection after 5 seconds.
|
|
699
|
-
debug(
|
|
689
|
+
debug("[HDS %s] Received DATA_SEND ACK packet for streamId %s. Acknowledged %s.", this.connection.remoteAddress, streamId, endOfStream);
|
|
700
690
|
this.handleClosed(() => this.delegate.acknowledgeStream?.(this.streamId));
|
|
701
691
|
}
|
|
692
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
702
693
|
handleDataSendClose(message) {
|
|
703
694
|
// see https://github.com/Supereg/secure-video-specification#43-close
|
|
704
695
|
const streamId = message.streamId;
|
|
@@ -706,13 +697,13 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
706
697
|
if (streamId !== this.streamId) {
|
|
707
698
|
return;
|
|
708
699
|
}
|
|
709
|
-
debug(
|
|
710
|
-
// @ts-expect-error
|
|
711
|
-
this.connection.remoteAddress, streamId,
|
|
700
|
+
debug("[HDS %s] Received DATA_SEND CLOSE for streamId %d with reason %s",
|
|
701
|
+
// @ts-expect-error: forceConsistentCasingInFileNames compiler option
|
|
702
|
+
this.connection.remoteAddress, streamId, datastream_1.HDSProtocolSpecificErrorReason[reason]);
|
|
712
703
|
this.handleClosed(() => this.delegate.closeRecordingStream(streamId, reason));
|
|
713
704
|
}
|
|
714
705
|
handleDataStreamConnectionClosed() {
|
|
715
|
-
debug(
|
|
706
|
+
debug("[HDS %s] The HDS connection of the stream %d closed.", this.connection.remoteAddress, this.streamId);
|
|
716
707
|
this.handleClosed(() => this.delegate.closeRecordingStream(this.streamId, undefined));
|
|
717
708
|
}
|
|
718
709
|
handleClosed(closure) {
|
|
@@ -727,8 +718,8 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
727
718
|
// when this variable is defined, the generator hasn't returned yet.
|
|
728
719
|
// we start a timeout to uncover potential programming mistakes where we await forever and can't free resources.
|
|
729
720
|
this.generatorTimeout = setTimeout(() => {
|
|
730
|
-
console.error(
|
|
731
|
-
|
|
721
|
+
console.error("[HDS %s] Recording download stream %d is still awaiting generator although stream was closed 10s ago! " +
|
|
722
|
+
"This is a programming mistake by the camera implementation which prevents freeing up resources.", this.connection.remoteAddress, this.streamId);
|
|
732
723
|
}, 10000);
|
|
733
724
|
}
|
|
734
725
|
try {
|
|
@@ -747,14 +738,14 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
747
738
|
if (this.closed) {
|
|
748
739
|
return;
|
|
749
740
|
}
|
|
750
|
-
debug(
|
|
751
|
-
// @ts-expect-error
|
|
752
|
-
this.connection.remoteAddress, this.streamId, reason ? HDSProtocolSpecificErrorReason[reason] :
|
|
741
|
+
debug("[HDS %s] Recording stream %d was closed manually with reason %s.",
|
|
742
|
+
// @ts-expect-error: forceConsistentCasingInFileNames compiler option
|
|
743
|
+
this.connection.remoteAddress, this.streamId, reason ? datastream_1.HDSProtocolSpecificErrorReason[reason] : "CLOSED");
|
|
753
744
|
// the `isConsideredClosed` check just ensures that the won't ever throw here and that `handledClosed` is always executed.
|
|
754
745
|
if (!this.connection.isConsideredClosed()) {
|
|
755
746
|
this.connection.sendEvent("dataSend" /* Protocols.DATA_SEND */, "close" /* Topics.CLOSE */, {
|
|
756
747
|
streamId: this.streamId,
|
|
757
|
-
reason,
|
|
748
|
+
reason: reason,
|
|
758
749
|
});
|
|
759
750
|
}
|
|
760
751
|
this.handleClosed(() => this.delegate.closeRecordingStream(this.streamId, reason));
|
|
@@ -767,7 +758,7 @@ class CameraRecordingStream extends EventEmitter {
|
|
|
767
758
|
if (this.closed) {
|
|
768
759
|
return;
|
|
769
760
|
}
|
|
770
|
-
debug(
|
|
761
|
+
debug("[HDS %s] Recording stream %d took longer than expected to fully close. Force closing now!", this.connection.remoteAddress, this.streamId);
|
|
771
762
|
this.close(3 /* HDSProtocolSpecificErrorReason.CANCELLED */);
|
|
772
763
|
}, 12000);
|
|
773
764
|
}
|