hap-nodejs 0.9.8 → 0.10.0-beta.11
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 +4 -3
- package/@types/simple-plist.d.ts +2 -1
- package/dist/BridgedCore.js +5 -4
- package/dist/BridgedCore.js.map +1 -1
- package/dist/Core.js +12 -10
- package/dist/Core.js.map +1 -1
- package/dist/accessories/AirConditioner_accessory.js +9 -9
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +9 -8
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +414 -35
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +6 -11
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +7 -8
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +3 -4
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +23 -14
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +7 -8
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +5 -6
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +5 -6
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +6 -6
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +12 -13
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +4 -5
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +5 -6
- 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 +7 -8
- 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 +6 -7
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +14 -15
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/index.d.ts +22 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +2 -0
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +18 -14
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +242 -203
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/AccessoryLoader.d.ts +10 -10
- package/dist/lib/AccessoryLoader.d.ts.map +1 -1
- package/dist/lib/AccessoryLoader.js +105 -95
- package/dist/lib/AccessoryLoader.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +24 -4
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +215 -10
- 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.map +1 -1
- package/dist/lib/Characteristic.d.ts +22 -21
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +100 -97
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +2 -2
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +18 -14
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +3 -3
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +26 -26
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/Camera.d.ts +2 -2
- package/dist/lib/camera/Camera.d.ts.map +1 -1
- package/dist/lib/camera/Camera.js +3 -3
- package/dist/lib/camera/Camera.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +19 -19
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +229 -207
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +44 -8
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +111 -37
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +267 -0
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -0
- package/dist/lib/camera/RecordingManagement.js +750 -0
- package/dist/lib/camera/RecordingManagement.js.map +1 -0
- package/dist/lib/camera/index.d.ts +4 -3
- package/dist/lib/camera/index.d.ts.map +1 -1
- package/dist/lib/camera/index.js +1 -0
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +9 -9
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +25 -19
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +253 -7
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +378 -31
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +3 -3
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +43 -1
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +63 -11
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +4 -4
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +62 -52
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.d.ts +4 -4
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +10 -9
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +24 -24
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +16 -7
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +24 -5
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +100 -59
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.d.ts +3 -3
- package/dist/lib/definitions/generate-definitions.d.ts.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +18 -14
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +32 -14
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/model/AccessoryInfo.d.ts +6 -6
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +79 -69
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +3 -3
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +1 -0
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +11 -11
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +67 -65
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/clone.js +1 -0
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +1 -1
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +4 -4
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +25 -22
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +5 -5
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +57 -86
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.js +1 -1
- package/dist/lib/util/net-utils.d.ts.map +1 -1
- package/dist/lib/util/net-utils.js +0 -2
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts +1 -1
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +1 -0
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +1 -0
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +1 -1
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +5 -5
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +9 -6
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +25 -19
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +16 -12
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from "events";
|
|
3
3
|
import { SessionIdentifier } from "../../types";
|
|
4
|
-
import { CameraStreamingOptions, PrepareStreamRequest, PrepareStreamResponse, RTPStreamManagement, SnapshotRequest, StreamingRequest } from "../camera";
|
|
5
|
-
import
|
|
4
|
+
import { CameraRecordingConfiguration, CameraRecordingOptions, CameraStreamingOptions, EventTriggerOption, PrepareStreamRequest, PrepareStreamResponse, RecordingManagement, RecordingManagementState, RecordingPacket, RTPStreamManagement, RTPStreamManagementState, SnapshotRequest, StreamingRequest } from "../camera";
|
|
5
|
+
import { HDSProtocolSpecificErrorReason } from "../datastream";
|
|
6
|
+
import { CameraOperatingMode, CameraRecordingManagement, DataStreamTransportManagement, Doorbell, Microphone, MotionSensor, OccupancySensor, Speaker } from "../definitions";
|
|
6
7
|
import { HAPStatus } from "../HAPServer";
|
|
7
|
-
import {
|
|
8
|
+
import { Service } from "../Service";
|
|
9
|
+
import { ControllerIdentifier, ControllerServiceMap, SerializableController, StateChangeDelegate } from "./Controller";
|
|
8
10
|
export interface CameraControllerOptions {
|
|
9
11
|
/**
|
|
10
12
|
* Amount of parallel camera streams the accessory is capable of running.
|
|
11
|
-
* As of the official HAP specification non
|
|
13
|
+
* As of the official HAP specification non SecureVideo cameras have a minimum required amount of 2 (but 1 is also fine).
|
|
12
14
|
* Secure Video cameras just expose 1 stream.
|
|
13
15
|
*
|
|
14
16
|
* Default value: 1
|
|
@@ -22,10 +24,73 @@ export interface CameraControllerOptions {
|
|
|
22
24
|
* Options regarding video/audio streaming
|
|
23
25
|
*/
|
|
24
26
|
streamingOptions: CameraStreamingOptions;
|
|
27
|
+
/**
|
|
28
|
+
* When supplying this option, it will enable support for HomeKit Secure Video.
|
|
29
|
+
* This will create the {@link Service.CameraRecordingManagement}, {@link Service.CameraOperatingMode}
|
|
30
|
+
* and {@link Service.DataStreamTransportManagement} services.
|
|
31
|
+
*
|
|
32
|
+
* NOTE: The controller only initializes the required characteristics for the {@link Service.CameraOperatingMode}.
|
|
33
|
+
* You may add optional characteristics, if required, by accessing the service directly {@link CameraController.recordingManagement.operatingModeService}.
|
|
34
|
+
*/
|
|
35
|
+
recording?: {
|
|
36
|
+
/**
|
|
37
|
+
* Options regarding Recordings (Secure Video)
|
|
38
|
+
*/
|
|
39
|
+
options: CameraRecordingOptions;
|
|
40
|
+
/**
|
|
41
|
+
* Delegate which handles the audio/video recording data streaming on motion.
|
|
42
|
+
*/
|
|
43
|
+
delegate: CameraRecordingDelegate;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* This config section configures optional sensors for the camera.
|
|
47
|
+
* It e.g. may be used to set up a {@link EventTriggerOption.MOTION} trigger when configuring Secure Video.
|
|
48
|
+
*
|
|
49
|
+
* You may specify to enable the desired services either as a `boolean` flag. In this case the controller will create
|
|
50
|
+
* and maintain the service for you. Otherwise, you can supply an already created instance of the respective {@link Service}.
|
|
51
|
+
* In this case you are responsible to manage the service yourself (e.g. creating, restoring, adding to accessory, ...).
|
|
52
|
+
*
|
|
53
|
+
* The services can be accessed through the documented property after the call to {@link Accessory.configureController} has returned.
|
|
54
|
+
*/
|
|
55
|
+
sensors?: {
|
|
56
|
+
/**
|
|
57
|
+
* Define if a {@link Service.MotionSensor} should be created/associated with the controller.
|
|
58
|
+
*
|
|
59
|
+
* You may access the created service via the {@link CameraController.motionService} property to configure listeners.
|
|
60
|
+
*
|
|
61
|
+
* ## HomeKit Secure Video:
|
|
62
|
+
*
|
|
63
|
+
* If supplied, this sensor will be used as a {@link EventTriggerOption.MOTION} trigger.
|
|
64
|
+
* The characteristic {@link Characteristic.StatusActive} will be added, which is used to enable or disable the sensor.
|
|
65
|
+
*/
|
|
66
|
+
motion?: Service | boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Define if a {@link Service.OccupancySensor} should be created/associated with the controller.
|
|
69
|
+
*
|
|
70
|
+
* You may access the created service via the {@link CameraController.occupancyService} property to configure listeners.
|
|
71
|
+
*
|
|
72
|
+
* ## HomeKit Secure Video:
|
|
73
|
+
*
|
|
74
|
+
* The characteristic {@link Characteristic.StatusActive} will be added, which is used to enable or disable the sensor.
|
|
75
|
+
*/
|
|
76
|
+
occupancy?: Service | boolean;
|
|
77
|
+
};
|
|
25
78
|
}
|
|
26
79
|
export declare type SnapshotRequestCallback = (error?: Error | HAPStatus, buffer?: Buffer) => void;
|
|
27
80
|
export declare type PrepareStreamCallback = (error?: Error, response?: PrepareStreamResponse) => void;
|
|
28
81
|
export declare type StreamRequestCallback = (error?: Error) => void;
|
|
82
|
+
export declare const enum ResourceRequestReason {
|
|
83
|
+
/**
|
|
84
|
+
* The reason describes periodic resource requests.
|
|
85
|
+
* In the example of camera image snapshots those are the typical preview images every 10 seconds.
|
|
86
|
+
*/
|
|
87
|
+
PERIODIC = 0,
|
|
88
|
+
/**
|
|
89
|
+
* The resource request is the result of some event.
|
|
90
|
+
* In the example of camera image snapshots, requests are made due to e.g. a motion event or similar.
|
|
91
|
+
*/
|
|
92
|
+
EVENT = 1
|
|
93
|
+
}
|
|
29
94
|
export interface CameraStreamingDelegate {
|
|
30
95
|
/**
|
|
31
96
|
* This method is called when a HomeKit controller requests a snapshot image for the given camera.
|
|
@@ -41,14 +106,156 @@ export interface CameraStreamingDelegate {
|
|
|
41
106
|
prepareStream(request: PrepareStreamRequest, callback: PrepareStreamCallback): void;
|
|
42
107
|
handleStreamRequest(request: StreamingRequest, callback: StreamRequestCallback): void;
|
|
43
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* A `CameraRecordingDelegate` is responsible for handling recordings of a HomeKit Secure Video camera.
|
|
111
|
+
*
|
|
112
|
+
* It is responsible for maintaining the prebuffer (see {@see CameraRecordingOptions.prebufferLength},
|
|
113
|
+
* once recording was activated (see {@see updateRecordingActive}).
|
|
114
|
+
*
|
|
115
|
+
* Before recording is considered enabled two things must happen:
|
|
116
|
+
* - Recording must be enabled by the user. Signaled through {@link updateRecordingActive}.
|
|
117
|
+
* - Recording configurations must be selected by a HomeKit controller through {@link updateRecordingConfiguration}.
|
|
118
|
+
*
|
|
119
|
+
* A typical recording event scenario happens as follows:
|
|
120
|
+
* - The camera is in idle mode, maintaining the prebuffer (the duration of the prebuffer depends on the selected {@link CameraRecordingConfiguration}).
|
|
121
|
+
* - A recording event is triggered (e.g. motion or doorbell button press) and the camera signals it through
|
|
122
|
+
* the respective characteristics (e.g. {@link Characteristic.MotionDetected} or {@link Characteristic.ProgrammableSwitchEvent}).
|
|
123
|
+
* Further, the camera saves the content of the prebuffer and starts recording the video.
|
|
124
|
+
* The camera should continue to store the recording until it runs out of space.
|
|
125
|
+
* In any case the camera should preserve recordings which are nearest to the triggered event.
|
|
126
|
+
* A stored recording might be completely deleted if a stream request wasn't initiated for eight seconds.
|
|
127
|
+
* - A HomeKit Controller will open a new recording session to download the next recording.
|
|
128
|
+
* This results in a call to {@link handleRecordingStreamRequest}.
|
|
129
|
+
* - Once the recording event is finished the camera will reset the state accordingly
|
|
130
|
+
* (e.g. in the {@link Service.MotionSensor} or {@link Service.Doorbell} service).
|
|
131
|
+
* It will continue to send the remaining fragments of the currently ongoing recording stream request.
|
|
132
|
+
* - The camera will either reach the end of the recording (and signal this via {@link RecordingPacket.isLast}. Also see {@link acknowledgeStream})
|
|
133
|
+
* or it will continue to stream til the HomeKit Controller closes
|
|
134
|
+
* the stream {@link closeRecordingStream with reason {@link HDSProtocolSpecificErrorReason.NORMAL}}.
|
|
135
|
+
* - The camera goes back into idle mode.
|
|
136
|
+
*/
|
|
137
|
+
export interface CameraRecordingDelegate {
|
|
138
|
+
/**
|
|
139
|
+
* A call to this method notifies the `CameraRecordingDelegate` about a change to the
|
|
140
|
+
* `CameraRecordingManagement.Active` characteristic. This characteristic controls
|
|
141
|
+
* if the camera should react to recording events.
|
|
142
|
+
*
|
|
143
|
+
* If recording is disabled the camera can stop maintaining its prebuffer.
|
|
144
|
+
* If recording is enabled the camera should start recording into its prebuffer.
|
|
145
|
+
*
|
|
146
|
+
* A `CameraRecordingDelegate` should assume active to be `false` on startup.
|
|
147
|
+
* HAP-NodeJS will persist the state of the `Active` characteristic across reboots
|
|
148
|
+
* and will call {@link updateRecordingActive} accordingly on startup, if recording was previously enabled.
|
|
149
|
+
*
|
|
150
|
+
* NOTE: HAP-NodeJS cannot guarantee that a {@link CameraRecordingConfiguration} is present
|
|
151
|
+
* when recording is activated (e.g. the selected configuration might be erased due to changes
|
|
152
|
+
* in the supplied {@link CameraRecordingOptions}, but the camera is still `active`; or we can't otherwise
|
|
153
|
+
* influence the order which a HomeKit Controller might call those characteristics).
|
|
154
|
+
* However, HAP-NodeJS guarantees that if there is a valid {@link CameraRecordingConfiguration},
|
|
155
|
+
* {@link updateRecordingConfiguration} is called before {@link updateRecordingActive} (when enabling)
|
|
156
|
+
* to avoid any unnecessary and potentially expensive reconfigurations.
|
|
157
|
+
*
|
|
158
|
+
* @param active - Specifies if recording is active or not.
|
|
159
|
+
*/
|
|
160
|
+
updateRecordingActive(active: boolean): void;
|
|
161
|
+
/**
|
|
162
|
+
* A call to this method signals that the selected (by the HomeKit Controller)
|
|
163
|
+
* recording configuration of the camera has changed.
|
|
164
|
+
*
|
|
165
|
+
* On startup the delegate should assume `configuration = undefined`.
|
|
166
|
+
* HAP-NodeJS will persist the state of both across reboots and will call
|
|
167
|
+
* {@link updateRecordingConfiguration} on startup if there is a **selected configuration** present.
|
|
168
|
+
*
|
|
169
|
+
* NOTE: An update to the recording configuration might happen while there is still a running
|
|
170
|
+
* recording stream. The camera MUST continue to use the previous configuration for the
|
|
171
|
+
* currently running stream and only apply the updated configuration to the next stream.
|
|
172
|
+
*
|
|
173
|
+
* @param configuration - The {@link CameraRecordingConfiguration}. Reconfigure your recording pipeline accordingly.
|
|
174
|
+
* The parameter might be `undefined` when the selected configuration became invalid. This typically ony happens
|
|
175
|
+
* e.g. due to a factory reset (when all pairings are removed). Disable the recording pipeline in such a case
|
|
176
|
+
* even if recording is still enabled for the camera.
|
|
177
|
+
*/
|
|
178
|
+
updateRecordingConfiguration(configuration: CameraRecordingConfiguration | undefined): void;
|
|
179
|
+
/**
|
|
180
|
+
* This method is called to stream the next recording event.
|
|
181
|
+
* It is guaranteed that there is only ever one ongoing recording stream request at a time.
|
|
182
|
+
*
|
|
183
|
+
* When this method is called return the currently ongoing (or next in case of a potentially queued)
|
|
184
|
+
* recording via a `AsyncGenerator`. Every `yield` of the generator represents a complete recording `packet`.
|
|
185
|
+
* The first packet MUST always be the {@link PacketDataType.MEDIA_INITIALIZATION} packet.
|
|
186
|
+
* Any following packet will transport the actual mp4 fragments in {@link PacketDataType.MEDIA_FRAGMENT} packets,
|
|
187
|
+
* starting with the content of the prebuffer. Every {@link PacketDataType.MEDIA_FRAGMENT} starts with a key frame
|
|
188
|
+
* and must not be longer than the specified duration set via the {@link CameraRecordingConfiguration.mediaContainerConfiguration.fragmentLength}
|
|
189
|
+
* **selected** by the HomeKit Controller in {@link updateRecordingConfiguration}.
|
|
190
|
+
*
|
|
191
|
+
* NOTE: You MUST respect the value of {@link Characteristic.RecordingAudioActive} characteristic of the {@link Service.CameraOperatingMode}
|
|
192
|
+
* service. When the characteristic is set to false you MUST NOT include audio in the mp4 fragments. You can access the characteristic via
|
|
193
|
+
* the {@link CameraController.recordingManagement.operatingModeService} property.
|
|
194
|
+
*
|
|
195
|
+
* You might throw an error in this method if encountering a non-recoverable state.
|
|
196
|
+
* You may throw a {@link HDSProtocolError} to manually define the {@link HDSProtocolSpecificErrorReason} for the `DATA_SEND` `CLOSE` event.
|
|
197
|
+
*
|
|
198
|
+
* There are three ways an ongoing recording stream can be closed:
|
|
199
|
+
* - Closed by the Accessory: There are no further fragments to transmit. The delegate MUST signal this by setting {@link RecordingPacket.isLast}
|
|
200
|
+
* to `true`. Once the HomeKit Controller receives this last fragment it will call {@link acknowledgeStream} to notify the accessory about
|
|
201
|
+
* the successful transmission.
|
|
202
|
+
* - Closed by the HomeKit Controller (expectedly): After the event trigger has been reset, the accessory continues to stream fragments.
|
|
203
|
+
* At some point the HomeKit Controller will decide to shut down the stream by calling {@link closeRecordingStream} with a reason
|
|
204
|
+
* of {@link HDSProtocolSpecificErrorReason.NORMAL}.
|
|
205
|
+
* - Closed by the HomeKit Controller (unexpectedly): A HomeKit Controller might at any point decide to close a recording stream
|
|
206
|
+
* if it encounters erroneous state. This is signaled by a call to {@link closeRecordingStream} with the respective reason.
|
|
207
|
+
*
|
|
208
|
+
* Once a close of stream is signaled, the `AsyncGenerator` function must return gracefully.
|
|
209
|
+
*
|
|
210
|
+
* For more information about `AsyncGenerator`s you might have a look at:
|
|
211
|
+
* * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of
|
|
212
|
+
*
|
|
213
|
+
* NOTE: HAP-NodeJS guarantees that this method is only called with a valid selected {@link CameraRecordingConfiguration}.
|
|
214
|
+
*
|
|
215
|
+
* NOTE: Don't rely on the streamId for unique identification. Two {@link DataStreamConnection}s might share the same identifier space.
|
|
216
|
+
*
|
|
217
|
+
* @param streamId - The streamId of the currently ongoing stream.
|
|
218
|
+
*/
|
|
219
|
+
handleRecordingStreamRequest(streamId: number): AsyncGenerator<RecordingPacket>;
|
|
220
|
+
/**
|
|
221
|
+
* This method is called once the HomeKit Controller acknowledges the `endOfStream`.
|
|
222
|
+
* A `endOfStream` is sent by the accessory by setting {@link RecordingPacket.isLast} to `true` in the last packet yielded
|
|
223
|
+
* by the {@link handleRecordingStreamRequest} `AsyncGenerator`.
|
|
224
|
+
*
|
|
225
|
+
* @param streamId - The streamId of the acknowledged stream.
|
|
226
|
+
*/
|
|
227
|
+
acknowledgeStream?(streamId: number): void;
|
|
228
|
+
/**
|
|
229
|
+
* This method is called to notify the delegate that a recording stream started via {@link handleRecordingStreamRequest} was closed.
|
|
230
|
+
*
|
|
231
|
+
* The method is also called if an ongoing recording stream is closed gracefully (using {@link HDSProtocolSpecificErrorReason.NORMAL}).
|
|
232
|
+
* In either case, the delegate should stop supplying further fragments to the recording stream.
|
|
233
|
+
* The `AsyncGenerator` function must return without yielding any further {@link RecordingPacket}s.
|
|
234
|
+
* HAP-NodeJS won't send out any fragments from this point onwards.
|
|
235
|
+
*
|
|
236
|
+
* @param streamId - The streamId for which the close event was sent.
|
|
237
|
+
* @param reason - The reason with which the stream was closed.
|
|
238
|
+
* NOTE: This method is also called in case of a closed connection. This is encoded by setting the `reason` to undefined.
|
|
239
|
+
*/
|
|
240
|
+
closeRecordingStream(streamId: number, reason: HDSProtocolSpecificErrorReason | undefined): void;
|
|
241
|
+
}
|
|
44
242
|
/**
|
|
45
243
|
* @private
|
|
46
244
|
*/
|
|
47
245
|
export interface CameraControllerServiceMap extends ControllerServiceMap {
|
|
48
246
|
microphone?: Microphone;
|
|
49
247
|
speaker?: Speaker;
|
|
248
|
+
cameraEventRecordingManagement?: CameraRecordingManagement;
|
|
249
|
+
cameraOperatingMode?: CameraOperatingMode;
|
|
250
|
+
dataStreamTransportManagement?: DataStreamTransportManagement;
|
|
251
|
+
motionService?: MotionSensor;
|
|
252
|
+
occupancyService?: OccupancySensor;
|
|
50
253
|
doorbell?: Doorbell;
|
|
51
254
|
}
|
|
255
|
+
interface CameraControllerState {
|
|
256
|
+
streamManagements: RTPStreamManagementState[];
|
|
257
|
+
recordingManagement?: RecordingManagementState;
|
|
258
|
+
}
|
|
52
259
|
export declare const enum CameraControllerEvents {
|
|
53
260
|
/**
|
|
54
261
|
* Emitted when the mute state or the volume changed. The Apple Home App typically does not set those values
|
|
@@ -71,22 +278,42 @@ export declare interface CameraController {
|
|
|
71
278
|
/**
|
|
72
279
|
* Everything needed to expose a HomeKit Camera.
|
|
73
280
|
*/
|
|
74
|
-
export declare class CameraController extends EventEmitter implements
|
|
281
|
+
export declare class CameraController extends EventEmitter implements SerializableController<CameraControllerServiceMap, CameraControllerState> {
|
|
75
282
|
private static readonly STREAM_MANAGEMENT;
|
|
283
|
+
private stateChangeDelegate?;
|
|
76
284
|
private readonly streamCount;
|
|
77
285
|
private readonly delegate;
|
|
78
286
|
private readonly streamingOptions;
|
|
287
|
+
/**
|
|
288
|
+
* **Temporary** storage for {@link CameraRecordingOptions} and {@link CameraRecordingDelegate}.
|
|
289
|
+
* This property is reset to `undefined` after the CameraController was fully initialized.
|
|
290
|
+
* You can still access those values via the {@link CameraController.recordingManagement}.
|
|
291
|
+
*/
|
|
292
|
+
private recording?;
|
|
293
|
+
/**
|
|
294
|
+
* Temporary storage for the sensor option.
|
|
295
|
+
*/
|
|
296
|
+
private sensorOptions?;
|
|
79
297
|
private readonly legacyMode;
|
|
80
298
|
/**
|
|
81
299
|
* @private
|
|
82
300
|
*/
|
|
83
301
|
streamManagements: RTPStreamManagement[];
|
|
302
|
+
/**
|
|
303
|
+
* The {@link RecordingManagement} which is responsible for handling HomeKit Secure Video.
|
|
304
|
+
* This property is only present if recording was configured.
|
|
305
|
+
*/
|
|
306
|
+
recordingManagement?: RecordingManagement;
|
|
84
307
|
private microphoneService?;
|
|
85
308
|
private speakerService?;
|
|
86
309
|
private microphoneMuted;
|
|
87
310
|
private microphoneVolume;
|
|
88
311
|
private speakerMuted;
|
|
89
312
|
private speakerVolume;
|
|
313
|
+
motionService?: MotionSensor;
|
|
314
|
+
private motionServiceExternallySupplied;
|
|
315
|
+
occupancyService?: OccupancySensor;
|
|
316
|
+
private occupancyServiceExternallySupplied;
|
|
90
317
|
constructor(options: CameraControllerOptions, legacyMode?: boolean);
|
|
91
318
|
/**
|
|
92
319
|
* @private
|
|
@@ -94,7 +321,7 @@ export declare class CameraController extends EventEmitter implements Controller
|
|
|
94
321
|
controllerId(): ControllerIdentifier;
|
|
95
322
|
/**
|
|
96
323
|
* Call this method if you want to forcefully suspend an ongoing streaming session.
|
|
97
|
-
* This would be adequate if the
|
|
324
|
+
* This would be adequate if the rtp server or media encoding encountered an unexpected error.
|
|
98
325
|
*
|
|
99
326
|
* @param sessionId {SessionIdentifier} - id of the current ongoing streaming session
|
|
100
327
|
*/
|
|
@@ -114,11 +341,17 @@ export declare class CameraController extends EventEmitter implements Controller
|
|
|
114
341
|
* @private
|
|
115
342
|
*/
|
|
116
343
|
initWithServices(serviceMap: CameraControllerServiceMap): void | CameraControllerServiceMap;
|
|
344
|
+
protected _initWithServices(serviceMap: CameraControllerServiceMap): {
|
|
345
|
+
serviceMap: CameraControllerServiceMap;
|
|
346
|
+
updated: boolean;
|
|
347
|
+
};
|
|
117
348
|
protected migrateFromDoorbell(serviceMap: ControllerServiceMap): boolean;
|
|
349
|
+
protected retrieveEventTriggerOptions(): Set<EventTriggerOption>;
|
|
118
350
|
/**
|
|
119
351
|
* @private
|
|
120
352
|
*/
|
|
121
353
|
configureServices(): void;
|
|
354
|
+
private rtpStreamManagementDisabledThroughOperatingMode;
|
|
122
355
|
/**
|
|
123
356
|
* @private
|
|
124
357
|
*/
|
|
@@ -130,10 +363,23 @@ export declare class CameraController extends EventEmitter implements Controller
|
|
|
130
363
|
/**
|
|
131
364
|
* @private
|
|
132
365
|
*/
|
|
133
|
-
|
|
366
|
+
serialize(): CameraControllerState | undefined;
|
|
367
|
+
/**
|
|
368
|
+
* @private
|
|
369
|
+
*/
|
|
370
|
+
deserialize(serialized: CameraControllerState): void;
|
|
371
|
+
/**
|
|
372
|
+
* @private
|
|
373
|
+
*/
|
|
374
|
+
setupStateChangeDelegate(delegate?: StateChangeDelegate): void;
|
|
375
|
+
/**
|
|
376
|
+
* @private
|
|
377
|
+
*/
|
|
378
|
+
handleSnapshotRequest(height: number, width: number, accessoryName?: string, reason?: ResourceRequestReason): Promise<Buffer>;
|
|
134
379
|
/**
|
|
135
380
|
* @private
|
|
136
381
|
*/
|
|
137
382
|
handleCloseConnection(sessionID: SessionIdentifier): void;
|
|
138
383
|
}
|
|
384
|
+
export {};
|
|
139
385
|
//# sourceMappingURL=CameraController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CameraController.d.ts","sourceRoot":"","sources":["../../../src/lib/controller/CameraController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAuB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,sBAAsB,
|
|
1
|
+
{"version":3,"file":"CameraController.d.ts","sourceRoot":"","sources":["../../../src/lib/controller/CameraController.ts"],"names":[],"mappings":"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"}
|