hap-nodejs 1.1.1-beta.1 → 1.1.1-beta.3
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 +50 -53
- package/README.md +16 -19
- package/dist/accessories/AirConditioner_accessory.js +28 -30
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +69 -81
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +141 -136
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +18 -22
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +33 -35
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +42 -44
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +32 -34
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +25 -26
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +13 -16
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +20 -22
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +18 -20
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +34 -37
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +43 -45
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +12 -15
- 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 +9 -12
- 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 +11 -14
- 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 +37 -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 +83 -87
- package/dist/accessories/types.js.map +1 -1
- package/dist/index.d.ts +26 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -34
- 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 +19 -21
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +39 -38
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +314 -292
- 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 +128 -136
- 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 +2 -6
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +40 -41
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +204 -208
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +31 -30
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +220 -229
- 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 +63 -67
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +2 -1
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +28 -44
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +34 -33
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +179 -151
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +19 -17
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +160 -151
- 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 +3 -6
- 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 +152 -144
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +22 -20
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +74 -78
- 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 +5 -8
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +5 -4
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +9 -13
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +39 -37
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +208 -197
- 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 +5 -8
- 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 +39 -39
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +1 -0
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +57 -77
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +23 -22
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +154 -164
- 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 +3 -6
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/dbus/align.d.ts +2 -0
- package/dist/lib/dbus/align.d.ts.map +1 -0
- package/dist/lib/dbus/align.js +12 -0
- package/dist/lib/dbus/align.js.map +1 -0
- package/dist/lib/dbus/bus.d.ts +38 -0
- package/dist/lib/dbus/bus.d.ts.map +1 -0
- package/dist/lib/dbus/bus.js +222 -0
- package/dist/lib/dbus/bus.js.map +1 -0
- package/dist/lib/dbus/constants.d.ts +43 -0
- package/dist/lib/dbus/constants.d.ts.map +1 -0
- package/dist/lib/dbus/constants.js +53 -0
- package/dist/lib/dbus/constants.js.map +1 -0
- package/dist/lib/dbus/dbus-buffer.d.ts +30 -0
- package/dist/lib/dbus/dbus-buffer.d.ts.map +1 -0
- package/dist/lib/dbus/dbus-buffer.js +175 -0
- package/dist/lib/dbus/dbus-buffer.js.map +1 -0
- package/dist/lib/dbus/handshake.d.ts +2 -0
- package/dist/lib/dbus/handshake.d.ts.map +1 -0
- package/dist/lib/dbus/handshake.js +130 -0
- package/dist/lib/dbus/handshake.js.map +1 -0
- package/dist/lib/dbus/index.d.ts +3 -0
- package/dist/lib/dbus/index.d.ts.map +1 -0
- package/dist/lib/dbus/index.js +123 -0
- package/dist/lib/dbus/index.js.map +1 -0
- package/dist/lib/dbus/introspect.d.ts +30 -0
- package/dist/lib/dbus/introspect.d.ts.map +1 -0
- package/dist/lib/dbus/introspect.js +208 -0
- package/dist/lib/dbus/introspect.js.map +1 -0
- package/dist/lib/dbus/marshall.d.ts +2 -0
- package/dist/lib/dbus/marshall.d.ts.map +1 -0
- package/dist/lib/dbus/marshall.js +97 -0
- package/dist/lib/dbus/marshall.js.map +1 -0
- package/dist/lib/dbus/marshallers.d.ts +10 -0
- package/dist/lib/dbus/marshallers.d.ts.map +1 -0
- package/dist/lib/dbus/marshallers.js +329 -0
- package/dist/lib/dbus/marshallers.js.map +1 -0
- package/dist/lib/dbus/message.d.ts +4 -0
- package/dist/lib/dbus/message.d.ts.map +1 -0
- package/dist/lib/dbus/message.js +116 -0
- package/dist/lib/dbus/message.js.map +1 -0
- package/dist/lib/dbus/put.d.ts +21 -0
- package/dist/lib/dbus/put.d.ts.map +1 -0
- package/dist/lib/dbus/put.js +120 -0
- package/dist/lib/dbus/put.js.map +1 -0
- package/dist/lib/dbus/readline.d.ts +2 -0
- package/dist/lib/dbus/readline.d.ts.map +1 -0
- package/dist/lib/dbus/readline.js +27 -0
- package/dist/lib/dbus/readline.js.map +1 -0
- package/dist/lib/dbus/signature.d.ts +2 -0
- package/dist/lib/dbus/signature.d.ts.map +1 -0
- package/dist/lib/dbus/signature.js +58 -0
- package/dist/lib/dbus/signature.js.map +1 -0
- package/dist/lib/dbus/stdifaces.d.ts +3 -0
- package/dist/lib/dbus/stdifaces.d.ts.map +1 -0
- package/dist/lib/dbus/stdifaces.js +206 -0
- package/dist/lib/dbus/stdifaces.js.map +1 -0
- 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 +958 -1204
- 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 +620 -695
- 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 +246 -253
- 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 +160 -165
- 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 +2 -5
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/model/AccessoryInfo.d.ts +4 -3
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +50 -53
- 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 +17 -22
- 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 +4 -11
- 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 +19 -27
- 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 +27 -29
- 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 +6 -9
- 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 +1 -5
- 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 +4 -9
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +23 -22
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +109 -116
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +3 -2
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +31 -40
- 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 +4 -8
- 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 +17 -23
- 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 +2 -6
- 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 +3 -9
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +3 -2
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +11 -19
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +1 -0
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +6 -11
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +1 -0
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +28 -43
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +1 -0
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +26 -38
- 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 +3 -5
- package/dist/types.js.map +1 -1
- package/package.json +51 -46
- package/@types/simple-plist.d.ts +0 -4
- package/dist/lib/gen/HomeKit.d.ts +0 -7
- package/dist/lib/gen/HomeKit.d.ts.map +0 -1
- package/dist/lib/gen/HomeKit.js +0 -8
- package/dist/lib/gen/HomeKit.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppleTVRemote_accessory.js","sourceRoot":"","sources":["../../src/accessories/AppleTVRemote_accessory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppleTVRemote_accessory.js","sourceRoot":"","sources":["../../src/accessories/AppleTVRemote_accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const camera = exports.accessory = new __1.Accessory("IPCamera", cameraUUID);
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { Buffer } from 'node:buffer';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { once } from 'node:events';
|
|
5
|
+
import { createServer } from 'node:net';
|
|
6
|
+
import process from 'node:process';
|
|
7
|
+
import { Accessory, CameraController, Characteristic, Service, uuid, } from '../index.js';
|
|
8
|
+
const cameraUUID = uuid.generate('hap-nodejs:accessories:ip-camera');
|
|
9
|
+
const camera = exports.accessory = new Accessory('IPCamera', cameraUUID);
|
|
11
10
|
// @ts-expect-error: Core/BridgeCore API
|
|
12
|
-
camera.username =
|
|
11
|
+
camera.username = '9F:B2:46:0C:40:DB';
|
|
13
12
|
// @ts-expect-error: Core/BridgeCore API
|
|
14
|
-
camera.pincode =
|
|
13
|
+
camera.pincode = '948-23-459';
|
|
15
14
|
camera.category = 17 /* Categories.IP_CAMERA */;
|
|
16
15
|
const FFMPEGH264ProfileNames = [
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
'baseline',
|
|
17
|
+
'main',
|
|
18
|
+
'high',
|
|
20
19
|
];
|
|
21
20
|
const FFMPEGH264LevelNames = [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
'3.1',
|
|
22
|
+
'3.2',
|
|
23
|
+
'4.0',
|
|
25
24
|
];
|
|
26
25
|
const ports = new Set();
|
|
27
26
|
function getPort() {
|
|
@@ -44,26 +43,26 @@ class ExampleCamera {
|
|
|
44
43
|
server;
|
|
45
44
|
handleSnapshotRequest(request, callback) {
|
|
46
45
|
const ffmpegCommand = `-f lavfi -i testsrc=s=${request.width}x${request.height} -vframes 1 -f mjpeg -`;
|
|
47
|
-
const ffmpeg =
|
|
46
|
+
const ffmpeg = spawn('ffmpeg', ffmpegCommand.split(' '), { env: process.env });
|
|
48
47
|
const snapshotBuffers = [];
|
|
49
|
-
ffmpeg.stdout.on(
|
|
50
|
-
ffmpeg.stderr.on(
|
|
48
|
+
ffmpeg.stdout.on('data', data => snapshotBuffers.push(data));
|
|
49
|
+
ffmpeg.stderr.on('data', (data) => {
|
|
51
50
|
if (this.ffmpegDebugOutput) {
|
|
52
|
-
console.log(
|
|
51
|
+
console.log(`SNAPSHOT: ${String(data)}`);
|
|
53
52
|
}
|
|
54
53
|
});
|
|
55
|
-
ffmpeg.on(
|
|
54
|
+
ffmpeg.on('exit', (code, signal) => {
|
|
56
55
|
if (signal) {
|
|
57
|
-
console.log(
|
|
58
|
-
callback(new Error(
|
|
56
|
+
console.log(`Snapshot process was killed with signal: ${signal}`);
|
|
57
|
+
callback(new Error(`killed with signal ${signal}`));
|
|
59
58
|
}
|
|
60
59
|
else if (code === 0) {
|
|
61
60
|
console.log(`Successfully captured snapshot at ${request.width}x${request.height}`);
|
|
62
61
|
callback(undefined, Buffer.concat(snapshotBuffers));
|
|
63
62
|
}
|
|
64
63
|
else {
|
|
65
|
-
console.log(
|
|
66
|
-
callback(new Error(
|
|
64
|
+
console.log(`Snapshot process exited with code ${code}`);
|
|
65
|
+
callback(new Error(`Snapshot process exited with code ${code}`));
|
|
67
66
|
}
|
|
68
67
|
});
|
|
69
68
|
}
|
|
@@ -75,15 +74,15 @@ class ExampleCamera {
|
|
|
75
74
|
const videoCryptoSuite = video.srtpCryptoSuite; // could be used to support multiple crypto suite (or support no suite for debugging)
|
|
76
75
|
const videoSrtpKey = video.srtp_key;
|
|
77
76
|
const videoSrtpSalt = video.srtp_salt;
|
|
78
|
-
const videoSSRC =
|
|
77
|
+
const videoSSRC = CameraController.generateSynchronisationSource();
|
|
79
78
|
const localPort = getPort();
|
|
80
79
|
const sessionInfo = {
|
|
81
80
|
address: targetAddress,
|
|
82
81
|
videoPort: video.port,
|
|
83
82
|
localVideoPort: localPort,
|
|
84
|
-
videoCryptoSuite
|
|
83
|
+
videoCryptoSuite,
|
|
85
84
|
videoSRTP: Buffer.concat([videoSrtpKey, videoSrtpSalt]),
|
|
86
|
-
videoSSRC
|
|
85
|
+
videoSSRC,
|
|
87
86
|
};
|
|
88
87
|
const response = {
|
|
89
88
|
video: {
|
|
@@ -111,7 +110,6 @@ class ExampleCamera {
|
|
|
111
110
|
const fps = video.fps;
|
|
112
111
|
const payloadType = video.pt;
|
|
113
112
|
const maxBitrate = video.max_bit_rate;
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
115
113
|
const rtcpInterval = video.rtcp_interval; // usually 0.5
|
|
116
114
|
const mtu = video.mtu; // maximum transmission unit
|
|
117
115
|
const address = sessionInfo.address;
|
|
@@ -119,52 +117,52 @@ class ExampleCamera {
|
|
|
119
117
|
const localVideoPort = sessionInfo.localVideoPort;
|
|
120
118
|
const ssrc = sessionInfo.videoSSRC;
|
|
121
119
|
const cryptoSuite = sessionInfo.videoCryptoSuite;
|
|
122
|
-
const videoSRTP = sessionInfo.videoSRTP.toString(
|
|
120
|
+
const videoSRTP = sessionInfo.videoSRTP.toString('base64');
|
|
123
121
|
console.log(`Starting video stream (${width}x${height}, ${fps} fps, ${maxBitrate} kbps, ${mtu} mtu)...`);
|
|
124
|
-
let videoffmpegCommand = `-re -f lavfi -i testsrc=s=${width}x${height}:r=${fps} -map 0:0 `
|
|
125
|
-
`-c:v h264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k `
|
|
126
|
-
`-profile:v ${profile} -level:v ${level} `
|
|
127
|
-
`-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `;
|
|
122
|
+
let videoffmpegCommand = `-re -f lavfi -i testsrc=s=${width}x${height}:r=${fps} -map 0:0 `
|
|
123
|
+
+ `-c:v h264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k `
|
|
124
|
+
+ `-profile:v ${profile} -level:v ${level} `
|
|
125
|
+
+ `-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `;
|
|
128
126
|
if (cryptoSuite !== 2 /* SRTPCryptoSuites.NONE */) {
|
|
129
127
|
let suite;
|
|
130
128
|
switch (cryptoSuite) {
|
|
131
129
|
case 0 /* SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80 */: // actually ffmpeg just supports AES_CM_128_HMAC_SHA1_80
|
|
132
|
-
suite =
|
|
130
|
+
suite = 'AES_CM_128_HMAC_SHA1_80';
|
|
133
131
|
break;
|
|
134
132
|
case 1 /* SRTPCryptoSuites.AES_CM_256_HMAC_SHA1_80 */:
|
|
135
|
-
suite =
|
|
133
|
+
suite = 'AES_CM_256_HMAC_SHA1_80';
|
|
136
134
|
break;
|
|
137
135
|
}
|
|
138
136
|
videoffmpegCommand += `-srtp_out_suite ${suite} -srtp_out_params ${videoSRTP} s`;
|
|
139
137
|
}
|
|
140
138
|
videoffmpegCommand += `rtp://${address}:${videoPort}?rtcpport=${videoPort}&localrtcpport=${localVideoPort}&pkt_size=${mtu}`;
|
|
141
139
|
if (this.ffmpegDebugOutput) {
|
|
142
|
-
console.log(
|
|
140
|
+
console.log(`FFMPEG command: ffmpeg ${videoffmpegCommand}`);
|
|
143
141
|
}
|
|
144
|
-
const ffmpegVideo =
|
|
142
|
+
const ffmpegVideo = spawn('ffmpeg', videoffmpegCommand.split(' '), { env: process.env });
|
|
145
143
|
let started = false;
|
|
146
|
-
ffmpegVideo.stderr.on(
|
|
147
|
-
console.log(data.toString(
|
|
144
|
+
ffmpegVideo.stderr.on('data', (data) => {
|
|
145
|
+
console.log(data.toString('utf8'));
|
|
148
146
|
if (!started) {
|
|
149
147
|
started = true;
|
|
150
|
-
console.log(
|
|
148
|
+
console.log('FFMPEG: received first frame');
|
|
151
149
|
callback(); // do not forget to execute callback once set up
|
|
152
150
|
}
|
|
153
151
|
if (this.ffmpegDebugOutput) {
|
|
154
|
-
console.log(
|
|
152
|
+
console.log(`VIDEO: ${String(data)}`);
|
|
155
153
|
}
|
|
156
154
|
});
|
|
157
|
-
ffmpegVideo.on(
|
|
158
|
-
console.log(
|
|
159
|
-
callback(new Error(
|
|
155
|
+
ffmpegVideo.on('error', (error) => {
|
|
156
|
+
console.log(`[Video] Failed to start video stream: ${error.message}`);
|
|
157
|
+
callback(new Error('ffmpeg process creation failed!'));
|
|
160
158
|
});
|
|
161
|
-
ffmpegVideo.on(
|
|
162
|
-
const message =
|
|
159
|
+
ffmpegVideo.on('exit', (code, signal) => {
|
|
160
|
+
const message = `[Video] ffmpeg exited with code: ${code} and signal: ${signal}`;
|
|
163
161
|
if (code == null || code === 255) {
|
|
164
|
-
console.log(message
|
|
162
|
+
console.log(`${message} (Video stream stopped!)`);
|
|
165
163
|
}
|
|
166
164
|
else {
|
|
167
|
-
console.log(message
|
|
165
|
+
console.log(`${message} (error)`);
|
|
168
166
|
if (!started) {
|
|
169
167
|
callback(new Error(message));
|
|
170
168
|
}
|
|
@@ -174,7 +172,7 @@ class ExampleCamera {
|
|
|
174
172
|
}
|
|
175
173
|
});
|
|
176
174
|
this.ongoingSessions[sessionId] = {
|
|
177
|
-
localVideoPort
|
|
175
|
+
localVideoPort,
|
|
178
176
|
process: ffmpegVideo,
|
|
179
177
|
};
|
|
180
178
|
delete this.pendingSessions[sessionId];
|
|
@@ -182,7 +180,7 @@ class ExampleCamera {
|
|
|
182
180
|
}
|
|
183
181
|
case "reconfigure" /* StreamRequestTypes.RECONFIGURE */:
|
|
184
182
|
// not supported by this example
|
|
185
|
-
console.log(
|
|
183
|
+
console.log(`Received (unsupported) request to reconfigure to: ${JSON.stringify(request.video)}`);
|
|
186
184
|
callback();
|
|
187
185
|
break;
|
|
188
186
|
case "stop" /* StreamRequestTypes.STOP */: {
|
|
@@ -193,14 +191,14 @@ class ExampleCamera {
|
|
|
193
191
|
}
|
|
194
192
|
ports.delete(ongoingSession.localVideoPort);
|
|
195
193
|
try {
|
|
196
|
-
ongoingSession.process.kill(
|
|
194
|
+
ongoingSession.process.kill('SIGKILL');
|
|
197
195
|
}
|
|
198
196
|
catch (e) {
|
|
199
|
-
console.log(
|
|
197
|
+
console.log('Error occurred terminating the video process!');
|
|
200
198
|
console.log(e);
|
|
201
199
|
}
|
|
202
200
|
delete this.ongoingSessions[sessionId];
|
|
203
|
-
console.log(
|
|
201
|
+
console.log('Stopped streaming session!');
|
|
204
202
|
callback();
|
|
205
203
|
break;
|
|
206
204
|
}
|
|
@@ -208,7 +206,7 @@ class ExampleCamera {
|
|
|
208
206
|
}
|
|
209
207
|
updateRecordingActive(active) {
|
|
210
208
|
// we haven't implemented a prebuffer
|
|
211
|
-
console.log(
|
|
209
|
+
console.log(`Recording active set to ${active}`);
|
|
212
210
|
}
|
|
213
211
|
updateRecordingConfiguration(configuration) {
|
|
214
212
|
this.configuration = configuration;
|
|
@@ -219,13 +217,12 @@ class ExampleCamera {
|
|
|
219
217
|
* CameraController supporting HomeKit Secure Video.
|
|
220
218
|
*
|
|
221
219
|
* An ideal implementation would diverge from this in the following ways:
|
|
222
|
-
*
|
|
223
|
-
*
|
|
220
|
+
* It would implement a prebuffer and respect the recording `active` characteristic for that.
|
|
221
|
+
* It would start to immediately record after a trigger event occurred and not just
|
|
224
222
|
* when the HomeKit Controller requests it (see the documentation of `CameraRecordingDelegate`).
|
|
225
223
|
*/
|
|
226
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
227
224
|
async *handleRecordingStreamRequest(streamId) {
|
|
228
|
-
(
|
|
225
|
+
assert(!!this.configuration);
|
|
229
226
|
/**
|
|
230
227
|
* With this flag you can control how the generator reacts to a reset to the motion trigger.
|
|
231
228
|
* If set to true, the generator will send a proper endOfStream if the motion stops.
|
|
@@ -235,62 +232,73 @@ class ExampleCamera {
|
|
|
235
232
|
*/
|
|
236
233
|
const STOP_AFTER_MOTION_STOP = false;
|
|
237
234
|
this.handlingStreamingRequest = true;
|
|
238
|
-
(
|
|
239
|
-
const profile = this.configuration.videoCodec.parameters.profile === 2 /* H264Profile.HIGH */
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
235
|
+
assert(this.configuration.videoCodec.type === 0 /* VideoCodecType.H264 */);
|
|
236
|
+
const profile = this.configuration.videoCodec.parameters.profile === 2 /* H264Profile.HIGH */
|
|
237
|
+
? 'high'
|
|
238
|
+
: this.configuration.videoCodec.parameters.profile === 1 /* H264Profile.MAIN */ ? 'main' : 'baseline';
|
|
239
|
+
const level = this.configuration.videoCodec.parameters.level === 2 /* H264Level.LEVEL4_0 */
|
|
240
|
+
? '4.0'
|
|
241
|
+
: this.configuration.videoCodec.parameters.level === 1 /* H264Level.LEVEL3_2 */ ? '3.2' : '3.1';
|
|
243
242
|
const videoArgs = [
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
243
|
+
'-an',
|
|
244
|
+
'-sn',
|
|
245
|
+
'-dn',
|
|
246
|
+
'-codec:v',
|
|
247
|
+
'libx264',
|
|
248
|
+
'-pix_fmt',
|
|
249
|
+
'yuv420p',
|
|
250
|
+
'-profile:v',
|
|
251
|
+
profile,
|
|
252
|
+
'-level:v',
|
|
253
|
+
level,
|
|
254
|
+
'-b:v',
|
|
255
|
+
`${this.configuration.videoCodec.parameters.bitRate}k`,
|
|
256
|
+
'-force_key_frames',
|
|
257
|
+
`expr:eq(t,n_forced*${this.configuration.videoCodec.parameters.iFrameInterval / 1000})`,
|
|
258
|
+
'-r',
|
|
259
|
+
this.configuration.videoCodec.resolution[2].toString(),
|
|
256
260
|
];
|
|
257
261
|
let samplerate;
|
|
258
262
|
switch (this.configuration.audioCodec.samplerate) {
|
|
259
263
|
case 0 /* AudioRecordingSamplerate.KHZ_8 */:
|
|
260
|
-
samplerate =
|
|
264
|
+
samplerate = '8';
|
|
261
265
|
break;
|
|
262
266
|
case 1 /* AudioRecordingSamplerate.KHZ_16 */:
|
|
263
|
-
samplerate =
|
|
267
|
+
samplerate = '16';
|
|
264
268
|
break;
|
|
265
269
|
case 2 /* AudioRecordingSamplerate.KHZ_24 */:
|
|
266
|
-
samplerate =
|
|
270
|
+
samplerate = '24';
|
|
267
271
|
break;
|
|
268
272
|
case 3 /* AudioRecordingSamplerate.KHZ_32 */:
|
|
269
|
-
samplerate =
|
|
273
|
+
samplerate = '32';
|
|
270
274
|
break;
|
|
271
275
|
case 4 /* AudioRecordingSamplerate.KHZ_44_1 */:
|
|
272
|
-
samplerate =
|
|
276
|
+
samplerate = '44.1';
|
|
273
277
|
break;
|
|
274
278
|
case 5 /* AudioRecordingSamplerate.KHZ_48 */:
|
|
275
|
-
samplerate =
|
|
279
|
+
samplerate = '48';
|
|
276
280
|
break;
|
|
277
281
|
default:
|
|
278
|
-
throw new Error(
|
|
282
|
+
throw new Error(`Unsupported audio samplerate: ${this.configuration.audioCodec.samplerate}`);
|
|
279
283
|
}
|
|
280
|
-
const audioArgs = this.controller?.recordingManagement?.recordingManagementService.getCharacteristic(
|
|
284
|
+
const audioArgs = this.controller?.recordingManagement?.recordingManagementService.getCharacteristic(Characteristic.RecordingAudioActive)
|
|
281
285
|
? [
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
[
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
286
|
+
'-acodec',
|
|
287
|
+
'libfdk_aac',
|
|
288
|
+
...(this.configuration.audioCodec.type === 0 /* AudioRecordingCodecType.AAC_LC */
|
|
289
|
+
? ['-profile:a', 'aac_low']
|
|
290
|
+
: ['-profile:a', 'aac_eld']),
|
|
291
|
+
'-ar',
|
|
292
|
+
`${samplerate}k`,
|
|
293
|
+
'-b:a',
|
|
294
|
+
`${this.configuration.audioCodec.bitrate}k`,
|
|
295
|
+
'-ac',
|
|
296
|
+
`${this.configuration.audioCodec.audioChannels}`,
|
|
289
297
|
]
|
|
290
298
|
: [];
|
|
291
|
-
this.server = new MP4StreamingServer(
|
|
299
|
+
this.server = new MP4StreamingServer('ffmpeg', `-f lavfi -i \
|
|
292
300
|
testsrc=s=${this.configuration.videoCodec.resolution[0]}x${this.configuration.videoCodec.resolution[1]}:r=${this.configuration.videoCodec.resolution[2]}`
|
|
293
|
-
.split(/ /
|
|
301
|
+
.split(/ /), audioArgs, videoArgs);
|
|
294
302
|
await this.server.start();
|
|
295
303
|
if (!this.server || this.server.destroyed) {
|
|
296
304
|
return; // early exit
|
|
@@ -299,30 +307,29 @@ class ExampleCamera {
|
|
|
299
307
|
try {
|
|
300
308
|
for await (const box of this.server.generator()) {
|
|
301
309
|
pending.push(box.header, box.data);
|
|
302
|
-
const motionDetected = camera.getService(
|
|
303
|
-
console.log(
|
|
304
|
-
if (box.type ===
|
|
310
|
+
const motionDetected = camera.getService(Service.MotionSensor)?.getCharacteristic(Characteristic.MotionDetected).value;
|
|
311
|
+
console.log(`mp4 box type ${box.type} and length ${box.length}`);
|
|
312
|
+
if (box.type === 'moov' || box.type === 'mdat') {
|
|
305
313
|
const fragment = Buffer.concat(pending);
|
|
306
314
|
pending.splice(0, pending.length);
|
|
307
315
|
const isLast = STOP_AFTER_MOTION_STOP && !motionDetected;
|
|
308
316
|
yield {
|
|
309
317
|
data: fragment,
|
|
310
|
-
isLast
|
|
318
|
+
isLast,
|
|
311
319
|
};
|
|
312
320
|
if (isLast) {
|
|
313
|
-
console.log(
|
|
321
|
+
console.log('Ending session due to motion stopped!');
|
|
314
322
|
break;
|
|
315
323
|
}
|
|
316
324
|
}
|
|
317
325
|
}
|
|
318
326
|
}
|
|
319
327
|
catch (error) {
|
|
320
|
-
if (!error.message.startsWith(
|
|
321
|
-
console.error(
|
|
328
|
+
if (!error.message.startsWith('FFMPEG')) { // cheap way of identifying our own emitted errors
|
|
329
|
+
console.error(`Encountered unexpected error on generator ${error.stack}`);
|
|
322
330
|
}
|
|
323
331
|
}
|
|
324
332
|
}
|
|
325
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
326
333
|
closeRecordingStream(streamId, reason) {
|
|
327
334
|
if (this.server) {
|
|
328
335
|
this.server.destroy();
|
|
@@ -349,33 +356,33 @@ class MP4StreamingServer {
|
|
|
349
356
|
connectResolve;
|
|
350
357
|
constructor(ffmpegPath, ffmpegInput, audioOutputArgs, videoOutputArgs) {
|
|
351
358
|
this.connectPromise = new Promise(resolve => this.connectResolve = resolve);
|
|
352
|
-
this.server =
|
|
359
|
+
this.server = createServer(this.handleConnection.bind(this));
|
|
353
360
|
this.ffmpegPath = ffmpegPath;
|
|
354
361
|
this.args = [];
|
|
355
362
|
this.args.push(...ffmpegInput);
|
|
356
363
|
this.args.push(...audioOutputArgs);
|
|
357
|
-
this.args.push(
|
|
364
|
+
this.args.push('-f', 'mp4');
|
|
358
365
|
this.args.push(...videoOutputArgs);
|
|
359
|
-
this.args.push(
|
|
360
|
-
this.args.push(
|
|
366
|
+
this.args.push('-fflags', '+genpts', '-reset_timestamps', '1');
|
|
367
|
+
this.args.push('-movflags', 'frag_keyframe+empty_moov+default_base_moof');
|
|
361
368
|
}
|
|
362
369
|
async start() {
|
|
363
|
-
const promise =
|
|
370
|
+
const promise = once(this.server, 'listening');
|
|
364
371
|
this.server.listen(); // listen on random port
|
|
365
372
|
await promise;
|
|
366
373
|
if (this.destroyed) {
|
|
367
374
|
return;
|
|
368
375
|
}
|
|
369
376
|
const port = this.server.address().port;
|
|
370
|
-
this.args.push(
|
|
371
|
-
console.log(this.ffmpegPath
|
|
372
|
-
this.childProcess =
|
|
377
|
+
this.args.push(`tcp://127.0.0.1:${port}`);
|
|
378
|
+
console.log(`${this.ffmpegPath} ${this.args.join(' ')}`);
|
|
379
|
+
this.childProcess = spawn(this.ffmpegPath, this.args, { env: process.env, stdio: this.debugMode ? 'pipe' : 'ignore' });
|
|
373
380
|
if (!this.childProcess || !this.childProcess.stdout || !this.childProcess.stderr) {
|
|
374
|
-
throw new Error(
|
|
381
|
+
throw new Error('ChildProcess or its streams is undefined directly after the init!');
|
|
375
382
|
}
|
|
376
383
|
if (this.debugMode) {
|
|
377
|
-
this.childProcess.stdout?.on(
|
|
378
|
-
this.childProcess.stderr?.on(
|
|
384
|
+
this.childProcess.stdout?.on('data', data => console.log(data.toString()));
|
|
385
|
+
this.childProcess.stderr?.on('data', data => console.log(data.toString()));
|
|
379
386
|
}
|
|
380
387
|
}
|
|
381
388
|
destroy() {
|
|
@@ -397,8 +404,8 @@ class MP4StreamingServer {
|
|
|
397
404
|
async *generator() {
|
|
398
405
|
await this.connectPromise;
|
|
399
406
|
if (!this.socket || !this.childProcess) {
|
|
400
|
-
console.log(
|
|
401
|
-
throw new Error(
|
|
407
|
+
console.log(`Socket undefined ${!!this.socket} childProcess undefined ${!!this.childProcess}`);
|
|
408
|
+
throw new Error('Unexpected state!');
|
|
402
409
|
}
|
|
403
410
|
while (true) {
|
|
404
411
|
const header = await this.read(8);
|
|
@@ -406,16 +413,16 @@ class MP4StreamingServer {
|
|
|
406
413
|
const type = header.slice(4).toString();
|
|
407
414
|
const data = await this.read(length);
|
|
408
415
|
yield {
|
|
409
|
-
header
|
|
410
|
-
length
|
|
411
|
-
type
|
|
412
|
-
data
|
|
416
|
+
header,
|
|
417
|
+
length,
|
|
418
|
+
type,
|
|
419
|
+
data,
|
|
413
420
|
};
|
|
414
421
|
}
|
|
415
422
|
}
|
|
416
423
|
async read(length) {
|
|
417
424
|
if (!this.socket) {
|
|
418
|
-
throw Error(
|
|
425
|
+
throw new Error('FFMPEG tried reading from closed socket!');
|
|
419
426
|
}
|
|
420
427
|
if (!length) {
|
|
421
428
|
return Buffer.alloc(0);
|
|
@@ -428,30 +435,28 @@ class MP4StreamingServer {
|
|
|
428
435
|
const readHandler = () => {
|
|
429
436
|
const value = this.socket.read(length);
|
|
430
437
|
if (value) {
|
|
431
|
-
// eslint-disable-
|
|
432
|
-
cleanup();
|
|
438
|
+
cleanup(); // eslint-disable-line ts/no-use-before-define
|
|
433
439
|
resolve(value);
|
|
434
440
|
}
|
|
435
441
|
};
|
|
436
442
|
const endHandler = () => {
|
|
437
|
-
// eslint-disable-
|
|
438
|
-
cleanup();
|
|
443
|
+
cleanup(); // eslint-disable-line ts/no-use-before-define
|
|
439
444
|
reject(new Error(`FFMPEG socket closed during read for ${length} bytes!`));
|
|
440
445
|
};
|
|
441
446
|
const cleanup = () => {
|
|
442
|
-
this.socket?.removeListener(
|
|
443
|
-
this.socket?.removeListener(
|
|
447
|
+
this.socket?.removeListener('readable', readHandler);
|
|
448
|
+
this.socket?.removeListener('close', endHandler);
|
|
444
449
|
};
|
|
445
450
|
if (!this.socket) {
|
|
446
|
-
throw new Error(
|
|
451
|
+
throw new Error('FFMPEG socket is closed now!');
|
|
447
452
|
}
|
|
448
|
-
this.socket.on(
|
|
449
|
-
this.socket.on(
|
|
453
|
+
this.socket.on('readable', readHandler);
|
|
454
|
+
this.socket.on('close', endHandler);
|
|
450
455
|
});
|
|
451
456
|
}
|
|
452
457
|
}
|
|
453
458
|
const streamDelegate = new ExampleCamera();
|
|
454
|
-
const cameraController = new
|
|
459
|
+
const cameraController = new CameraController({
|
|
455
460
|
cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine
|
|
456
461
|
delegate: streamDelegate,
|
|
457
462
|
streamingOptions: {
|
|
@@ -536,10 +541,10 @@ const cameraController = new __1.CameraController({
|
|
|
536
541
|
streamDelegate.controller = cameraController;
|
|
537
542
|
camera.configureController(cameraController);
|
|
538
543
|
// a service to trigger the motion sensor!
|
|
539
|
-
camera.addService(
|
|
540
|
-
.getCharacteristic(
|
|
541
|
-
.onSet(value => {
|
|
542
|
-
camera.getService(
|
|
543
|
-
?.updateCharacteristic(
|
|
544
|
+
camera.addService(Service.Switch, 'MOTION TRIGGER')
|
|
545
|
+
.getCharacteristic(Characteristic.On)
|
|
546
|
+
.onSet((value) => {
|
|
547
|
+
camera.getService(Service.MotionSensor)
|
|
548
|
+
?.updateCharacteristic(Characteristic.MotionDetected, value);
|
|
544
549
|
});
|
|
545
550
|
//# sourceMappingURL=Camera_accessory.js.map
|