hap-nodejs 0.11.0-beta.13 → 0.11.0-beta.14
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/dist/BridgedCore.js +4 -4
- package/dist/BridgedCore.js.map +1 -1
- package/dist/Core.js +2 -2
- package/dist/Core.js.map +1 -1
- package/dist/accessories/AirConditioner_accessory.js +18 -18
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +6 -6
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +96 -87
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +6 -6
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +4 -4
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +2 -2
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +10 -10
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +4 -4
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +3 -3
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +4 -4
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +5 -5
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +7 -7
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +9 -9
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +2 -2
- package/dist/accessories/TemperatureSensor_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.js +2 -2
- package/dist/accessories/Wi-FiRouter_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.js +2 -2
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts +2 -2
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +20 -20
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/index.d.ts +30 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -25
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +20 -125
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js +15 -5
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +71 -10
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +168 -148
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/AccessoryLoader.d.ts +12 -0
- package/dist/lib/AccessoryLoader.d.ts.map +1 -1
- package/dist/lib/AccessoryLoader.js +18 -6
- package/dist/lib/AccessoryLoader.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +26 -0
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +59 -39
- package/dist/lib/Advertiser.js.map +1 -1
- package/dist/lib/Bridge.d.ts +2 -0
- package/dist/lib/Bridge.d.ts.map +1 -1
- package/dist/lib/Bridge.js +3 -1
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +818 -13
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +155 -127
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +72 -18
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +178 -160
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +266 -14
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +36 -35
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/Camera.d.ts +13 -4
- package/dist/lib/camera/Camera.d.ts.map +1 -1
- package/dist/lib/camera/Camera.js +3 -0
- package/dist/lib/camera/Camera.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +5 -0
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +2 -1
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +154 -31
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +198 -161
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +61 -11
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +171 -138
- package/dist/lib/camera/RecordingManagement.js.map +1 -1
- package/dist/lib/camera/index.js +4 -4
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +28 -2
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +72 -65
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +44 -13
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +42 -34
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +28 -7
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js +7 -0
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +5 -1
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +5 -3
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +108 -39
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +190 -175
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.js +5 -5
- package/dist/lib/controller/index.js.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.d.ts +25 -19
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +36 -30
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +39 -0
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +125 -88
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +121 -46
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +134 -100
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.js +3 -3
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.js +799 -799
- package/dist/lib/definitions/CharacteristicDefinitions.js.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.js +77 -77
- package/dist/lib/definitions/ServiceDefinitions.js.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +60 -59
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +15 -15
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/definitions/index.js +2 -2
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/model/AccessoryInfo.d.ts +10 -4
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +21 -17
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts +3 -0
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +8 -5
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts +3 -0
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +4 -1
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +1 -0
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +3 -2
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +11 -0
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js +15 -7
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/clone.d.ts +2 -1
- package/dist/lib/util/clone.d.ts.map +1 -1
- package/dist/lib/util/clone.js +5 -4
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts +3 -0
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +4 -1
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +34 -5
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +62 -51
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +27 -0
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +28 -4
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.d.ts +2 -0
- package/dist/lib/util/hapStatusError.d.ts.map +1 -1
- package/dist/lib/util/hapStatusError.js +4 -2
- package/dist/lib/util/hapStatusError.js.map +1 -1
- package/dist/lib/util/net-utils.d.ts +7 -0
- package/dist/lib/util/net-utils.d.ts.map +1 -1
- package/dist/lib/util/net-utils.js +11 -4
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts +5 -0
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +6 -1
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/promise-utils.d.ts +9 -0
- package/dist/lib/util/promise-utils.d.ts.map +1 -1
- package/dist/lib/util/promise-utils.js +3 -0
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +16 -0
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +42 -27
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +6 -0
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +7 -1
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +33 -2
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +29 -5
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +2 -3
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +1 -1
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +264 -20
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/package.json +5 -4
- package/dist/lib/util/HAPHTTPError.d.ts +0 -16
- package/dist/lib/util/HAPHTTPError.d.ts.map +0 -1
- package/dist/lib/util/HAPHTTPError.js +0 -26
- package/dist/lib/util/HAPHTTPError.js.map +0 -1
- package/dist/lib/util/tlvError.d.ts +0 -14
- package/dist/lib/util/tlvError.d.ts.map +0 -1
- package/dist/lib/util/tlvError.js +0 -24
- package/dist/lib/util/tlvError.js.map +0 -1
package/dist/lib/HAPServer.js
CHANGED
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HAPServer = exports.HAPServerEventTypes = exports.HAPPairingHTTPCode = exports.HAPHTTPCode = exports.Status = exports.Codes = exports.IsKnownHAPStatusError = exports.HAPStatus = exports.TLVErrorCode = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var crypto_1 =
|
|
6
|
-
var debug_1 =
|
|
5
|
+
var crypto_1 = tslib_1.__importDefault(require("crypto"));
|
|
6
|
+
var debug_1 = tslib_1.__importDefault(require("debug"));
|
|
7
7
|
var events_1 = require("events");
|
|
8
8
|
var fast_srp_hap_1 = require("fast-srp-hap");
|
|
9
|
-
var tweetnacl_1 =
|
|
9
|
+
var tweetnacl_1 = tslib_1.__importDefault(require("tweetnacl"));
|
|
10
10
|
var url_1 = require("url");
|
|
11
11
|
var internal_types_1 = require("../internal-types");
|
|
12
12
|
var eventedhttp_1 = require("./util/eventedhttp");
|
|
13
|
-
var hapCrypto =
|
|
13
|
+
var hapCrypto = tslib_1.__importStar(require("./util/hapCrypto"));
|
|
14
14
|
var once_1 = require("./util/once");
|
|
15
|
-
var tlv =
|
|
15
|
+
var tlv = tslib_1.__importStar(require("./util/tlv"));
|
|
16
16
|
var debug = (0, debug_1.default)("HAP-NodeJS:HAPServer");
|
|
17
17
|
/**
|
|
18
|
-
* TLV error codes for the
|
|
18
|
+
* TLV error codes for the `TLVValues.ERROR_CODE` field.
|
|
19
|
+
*
|
|
20
|
+
* @group HAP Accessory Server
|
|
19
21
|
*/
|
|
20
22
|
var TLVErrorCode;
|
|
21
23
|
(function (TLVErrorCode) {
|
|
@@ -29,6 +31,9 @@ var TLVErrorCode;
|
|
|
29
31
|
TLVErrorCode[TLVErrorCode["UNAVAILABLE"] = 6] = "UNAVAILABLE";
|
|
30
32
|
TLVErrorCode[TLVErrorCode["BUSY"] = 7] = "BUSY"; // cannot accept pairing request at this time
|
|
31
33
|
})(TLVErrorCode = exports.TLVErrorCode || (exports.TLVErrorCode = {}));
|
|
34
|
+
/**
|
|
35
|
+
* @group HAP Accessory Server
|
|
36
|
+
*/
|
|
32
37
|
var HAPStatus;
|
|
33
38
|
(function (HAPStatus) {
|
|
34
39
|
// noinspection JSUnusedGlobalSymbols
|
|
@@ -49,7 +54,7 @@ var HAPStatus;
|
|
|
49
54
|
*/
|
|
50
55
|
HAPStatus[HAPStatus["RESOURCE_BUSY"] = -70403] = "RESOURCE_BUSY";
|
|
51
56
|
/**
|
|
52
|
-
* Cannot write a read-only characteristic ({@
|
|
57
|
+
* Cannot write a read-only characteristic ({@link Perms.PAIRED_WRITE} not defined).
|
|
53
58
|
*/
|
|
54
59
|
HAPStatus[HAPStatus["READ_ONLY_CHARACTERISTIC"] = -70404] = "READ_ONLY_CHARACTERISTIC";
|
|
55
60
|
/**
|
|
@@ -88,23 +93,27 @@ var HAPStatus;
|
|
|
88
93
|
})(HAPStatus = exports.HAPStatus || (exports.HAPStatus = {}));
|
|
89
94
|
/**
|
|
90
95
|
* Determines if the given status code is a known {@link HAPStatus} error code.
|
|
96
|
+
*
|
|
97
|
+
* @group HAP Accessory Server
|
|
91
98
|
*/
|
|
92
99
|
function IsKnownHAPStatusError(status) {
|
|
93
100
|
return (
|
|
94
101
|
// Lower bound (most negative error code)
|
|
95
|
-
status >= -70412 /* NOT_ALLOWED_IN_CURRENT_STATE */ &&
|
|
102
|
+
status >= -70412 /* HAPStatus.NOT_ALLOWED_IN_CURRENT_STATE */ &&
|
|
96
103
|
// Upper bound (negative error code closest to zero)
|
|
97
|
-
status <= -70401 /* INSUFFICIENT_PRIVILEGES */);
|
|
104
|
+
status <= -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */);
|
|
98
105
|
}
|
|
99
106
|
exports.IsKnownHAPStatusError = IsKnownHAPStatusError;
|
|
100
107
|
// noinspection JSUnusedGlobalSymbols
|
|
101
108
|
/**
|
|
109
|
+
* @group HAP Accessory Server
|
|
102
110
|
* @deprecated please use {@link TLVErrorCode} as naming is more precise
|
|
103
111
|
*/
|
|
104
112
|
// @ts-expect-error (as we use const enums with --preserveConstEnums)
|
|
105
113
|
exports.Codes = TLVErrorCode;
|
|
106
114
|
// noinspection JSUnusedGlobalSymbols
|
|
107
115
|
/**
|
|
116
|
+
* @group HAP Accessory Server
|
|
108
117
|
* @deprecated please use {@link HAPStatus} as naming is more precise
|
|
109
118
|
*/
|
|
110
119
|
// @ts-expect-error (as we use const enums with --preserveConstEnums)
|
|
@@ -116,6 +125,8 @@ exports.Status = HAPStatus;
|
|
|
116
125
|
* must include a status {@link HAPStatus} property.
|
|
117
126
|
*
|
|
118
127
|
* When the response is a MULTI_STATUS EVERY entry in the characteristics property MUST include a status property (even success).
|
|
128
|
+
*
|
|
129
|
+
* @group HAP Accessory Server
|
|
119
130
|
*/
|
|
120
131
|
var HAPHTTPCode;
|
|
121
132
|
(function (HAPHTTPCode) {
|
|
@@ -134,6 +145,8 @@ var HAPHTTPCode;
|
|
|
134
145
|
/**
|
|
135
146
|
* When in a request is made to the pairing endpoints, and mime type is 'application/pairing+tlv8'
|
|
136
147
|
* one should use the below status codes.
|
|
148
|
+
*
|
|
149
|
+
* @group HAP Accessory Server
|
|
137
150
|
*/
|
|
138
151
|
var HAPPairingHTTPCode;
|
|
139
152
|
(function (HAPPairingHTTPCode) {
|
|
@@ -145,6 +158,9 @@ var HAPPairingHTTPCode;
|
|
|
145
158
|
HAPPairingHTTPCode[HAPPairingHTTPCode["CONNECTION_AUTHORIZATION_REQUIRED"] = 470] = "CONNECTION_AUTHORIZATION_REQUIRED";
|
|
146
159
|
HAPPairingHTTPCode[HAPPairingHTTPCode["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
|
|
147
160
|
})(HAPPairingHTTPCode = exports.HAPPairingHTTPCode || (exports.HAPPairingHTTPCode = {}));
|
|
161
|
+
/**
|
|
162
|
+
* @group HAP Accessory Server
|
|
163
|
+
*/
|
|
148
164
|
var HAPServerEventTypes;
|
|
149
165
|
(function (HAPServerEventTypes) {
|
|
150
166
|
/**
|
|
@@ -206,10 +222,12 @@ var HAPServerEventTypes;
|
|
|
206
222
|
* the connection is open, the server can elect to issue "EVENT/1.0 200 OK" HTTP-style responses. These are
|
|
207
223
|
* typically sent to inform the iOS device of a characteristic change for the accessory (like "Door was Unlocked").
|
|
208
224
|
*
|
|
209
|
-
* See
|
|
225
|
+
* See {@link EventedHTTPServer} for more detail on the implementation of this protocol.
|
|
226
|
+
*
|
|
227
|
+
* @group HAP Accessory Server
|
|
210
228
|
*/
|
|
211
229
|
var HAPServer = /** @class */ (function (_super) {
|
|
212
|
-
|
|
230
|
+
tslib_1.__extends(HAPServer, _super);
|
|
213
231
|
function HAPServer(accessoryInfo) {
|
|
214
232
|
var _this = _super.call(this) || this;
|
|
215
233
|
_this.unsuccessfulPairAttempts = 0; // after 100 unsuccessful attempts the server won't accept any further attempts. Will currently be reset on a reboot
|
|
@@ -217,9 +235,9 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
217
235
|
_this.allowInsecureRequest = false;
|
|
218
236
|
// internal server that does all the actual communication
|
|
219
237
|
_this.httpServer = new eventedhttp_1.EventedHTTPServer();
|
|
220
|
-
_this.httpServer.on("listening" /* LISTENING */, _this.onListening.bind(_this));
|
|
221
|
-
_this.httpServer.on("request" /* REQUEST */, _this.handleRequestOnHAPConnection.bind(_this));
|
|
222
|
-
_this.httpServer.on("connection-closed" /* CONNECTION_CLOSED */, _this.handleConnectionClosed.bind(_this));
|
|
238
|
+
_this.httpServer.on("listening" /* EventedHTTPServerEvent.LISTENING */, _this.onListening.bind(_this));
|
|
239
|
+
_this.httpServer.on("request" /* EventedHTTPServerEvent.REQUEST */, _this.handleRequestOnHAPConnection.bind(_this));
|
|
240
|
+
_this.httpServer.on("connection-closed" /* EventedHTTPServerEvent.CONNECTION_CLOSED */, _this.handleConnectionClosed.bind(_this));
|
|
223
241
|
return _this;
|
|
224
242
|
}
|
|
225
243
|
HAPServer.prototype.listen = function (port, host) {
|
|
@@ -240,14 +258,14 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
240
258
|
};
|
|
241
259
|
/**
|
|
242
260
|
* Send an even notification for given characteristic and changed value to all connected clients.
|
|
243
|
-
* If
|
|
261
|
+
* If `originator` is specified, the given {@link HAPConnection} will be excluded from the broadcast.
|
|
244
262
|
*
|
|
245
263
|
* @param aid - The accessory id of the updated characteristic.
|
|
246
264
|
* @param iid - The instance id of the updated characteristic.
|
|
247
265
|
* @param value - The newly set value of the characteristic.
|
|
248
266
|
* @param originator - If specified, the connection will not get an event message.
|
|
249
267
|
* @param immediateDelivery - The HAP spec requires some characteristics to be delivery immediately.
|
|
250
|
-
* Namely, for the {@link ButtonEvent} and the {@link ProgrammableSwitchEvent} characteristics.
|
|
268
|
+
* Namely, for the {@link Characteristic.ButtonEvent} and the {@link Characteristic.ProgrammableSwitchEvent} characteristics.
|
|
251
269
|
*/
|
|
252
270
|
HAPServer.prototype.sendEventNotifications = function (aid, iid, value, originator, immediateDelivery) {
|
|
253
271
|
try {
|
|
@@ -258,7 +276,7 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
258
276
|
}
|
|
259
277
|
};
|
|
260
278
|
HAPServer.prototype.onListening = function (port, hostname) {
|
|
261
|
-
this.emit("listening" /* LISTENING */, port, hostname);
|
|
279
|
+
this.emit("listening" /* HAPServerEventTypes.LISTENING */, port, hostname);
|
|
262
280
|
};
|
|
263
281
|
// Called when an HTTP request was detected.
|
|
264
282
|
HAPServer.prototype.handleRequestOnHAPConnection = function (connection, request, response) {
|
|
@@ -271,8 +289,8 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
271
289
|
var handler = _this.getHandler(url);
|
|
272
290
|
if (!handler) {
|
|
273
291
|
debug("[%s] WARNING: Handler for %s not implemented", _this.accessoryInfo.username, request.url);
|
|
274
|
-
response.writeHead(404 /* NOT_FOUND */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
275
|
-
response.end(JSON.stringify({ status: -70409 /* RESOURCE_DOES_NOT_EXIST */ }));
|
|
292
|
+
response.writeHead(404 /* HAPHTTPCode.NOT_FOUND */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
293
|
+
response.end(JSON.stringify({ status: -70409 /* HAPStatus.RESOURCE_DOES_NOT_EXIST */ }));
|
|
276
294
|
}
|
|
277
295
|
else {
|
|
278
296
|
var data = Buffer.concat(buffers);
|
|
@@ -281,14 +299,14 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
281
299
|
}
|
|
282
300
|
catch (error) {
|
|
283
301
|
debug("[%s] Error executing route handler: %s", _this.accessoryInfo.username, error.stack);
|
|
284
|
-
response.writeHead(500 /* INTERNAL_SERVER_ERROR */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
285
|
-
response.end(JSON.stringify({ status: -70403 /* RESOURCE_BUSY */ })); // resource busy try again, does somehow fit?
|
|
302
|
+
response.writeHead(500 /* HAPHTTPCode.INTERNAL_SERVER_ERROR */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
303
|
+
response.end(JSON.stringify({ status: -70403 /* HAPStatus.RESOURCE_BUSY */ })); // resource busy try again, does somehow fit?
|
|
286
304
|
}
|
|
287
305
|
}
|
|
288
306
|
});
|
|
289
307
|
};
|
|
290
308
|
HAPServer.prototype.handleConnectionClosed = function (connection) {
|
|
291
|
-
this.emit("connection-closed" /* CONNECTION_CLOSED */, connection);
|
|
309
|
+
this.emit("connection-closed" /* HAPServerEventTypes.CONNECTION_CLOSED */, connection);
|
|
292
310
|
};
|
|
293
311
|
HAPServer.prototype.getHandler = function (url) {
|
|
294
312
|
switch (url.pathname.toLowerCase()) {
|
|
@@ -319,51 +337,51 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
319
337
|
var _this = this;
|
|
320
338
|
// POST body is empty
|
|
321
339
|
if (this.accessoryInfo.paired() && !this.allowInsecureRequest) {
|
|
322
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
323
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
340
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
341
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
324
342
|
return;
|
|
325
343
|
}
|
|
326
|
-
this.emit("identify" /* IDENTIFY */, (0, once_1.once)(function (err) {
|
|
344
|
+
this.emit("identify" /* HAPServerEventTypes.IDENTIFY */, (0, once_1.once)(function (err) {
|
|
327
345
|
if (!err) {
|
|
328
346
|
debug("[%s] Identification success", _this.accessoryInfo.username);
|
|
329
|
-
response.writeHead(204 /* NO_CONTENT */);
|
|
347
|
+
response.writeHead(204 /* HAPHTTPCode.NO_CONTENT */);
|
|
330
348
|
response.end();
|
|
331
349
|
}
|
|
332
350
|
else {
|
|
333
351
|
debug("[%s] Identification error: %s", _this.accessoryInfo.username, err.message);
|
|
334
|
-
response.writeHead(500 /* INTERNAL_SERVER_ERROR */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
335
|
-
response.end(JSON.stringify({ status: -70403 /* RESOURCE_BUSY */ }));
|
|
352
|
+
response.writeHead(500 /* HAPHTTPCode.INTERNAL_SERVER_ERROR */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
353
|
+
response.end(JSON.stringify({ status: -70403 /* HAPStatus.RESOURCE_BUSY */ }));
|
|
336
354
|
}
|
|
337
355
|
}));
|
|
338
356
|
};
|
|
339
357
|
HAPServer.prototype.handlePairSetup = function (connection, url, request, data, response) {
|
|
340
358
|
// Can only be directly paired with one iOS device
|
|
341
359
|
if (!this.allowInsecureRequest && this.accessoryInfo.paired()) {
|
|
342
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
343
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, 6 /* UNAVAILABLE */));
|
|
360
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
361
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, 6 /* TLVErrorCode.UNAVAILABLE */));
|
|
344
362
|
return;
|
|
345
363
|
}
|
|
346
364
|
if (this.unsuccessfulPairAttempts > 100) {
|
|
347
365
|
debug("[%s] Reached maximum amount of unsuccessful pair attempts!", this.accessoryInfo.username);
|
|
348
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
349
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, 5 /* MAX_TRIES */));
|
|
366
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
367
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, 5 /* TLVErrorCode.MAX_TRIES */));
|
|
350
368
|
return;
|
|
351
369
|
}
|
|
352
370
|
var tlvData = tlv.decode(data);
|
|
353
|
-
var sequence = tlvData[6 /* SEQUENCE_NUM */][0]; // value is single byte with sequence number
|
|
354
|
-
if (sequence === 1 /* M1 */) {
|
|
371
|
+
var sequence = tlvData[6 /* TLVValues.SEQUENCE_NUM */][0]; // value is single byte with sequence number
|
|
372
|
+
if (sequence === 1 /* PairingStates.M1 */) {
|
|
355
373
|
this.handlePairSetupM1(connection, request, response);
|
|
356
374
|
}
|
|
357
|
-
else if (sequence === 3 /* M3 */ && connection._pairSetupState === 2 /* M2 */) {
|
|
375
|
+
else if (sequence === 3 /* PairingStates.M3 */ && connection._pairSetupState === 2 /* PairingStates.M2 */) {
|
|
358
376
|
this.handlePairSetupM3(connection, request, response, tlvData);
|
|
359
377
|
}
|
|
360
|
-
else if (sequence === 5 /* M5 */ && connection._pairSetupState === 4 /* M4 */) {
|
|
378
|
+
else if (sequence === 5 /* PairingStates.M5 */ && connection._pairSetupState === 4 /* PairingStates.M4 */) {
|
|
361
379
|
this.handlePairSetupM5(connection, request, response, tlvData);
|
|
362
380
|
}
|
|
363
381
|
else {
|
|
364
382
|
// Invalid state/sequence number
|
|
365
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/pairing+tlv8" });
|
|
366
|
-
response.end(tlv.encode(6 /* STATE */, sequence + 1, 7 /* ERROR_CODE */, 1 /* UNKNOWN */));
|
|
383
|
+
response.writeHead(400 /* HAPPairingHTTPCode.BAD_REQUEST */, { "Content-Type": "application/pairing+tlv8" });
|
|
384
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, sequence + 1, 7 /* TLVValues.ERROR_CODE */, 1 /* TLVErrorCode.UNKNOWN */));
|
|
367
385
|
return;
|
|
368
386
|
}
|
|
369
387
|
};
|
|
@@ -378,20 +396,20 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
378
396
|
var srpB = srpServer.computeB();
|
|
379
397
|
// attach it to the current TCP session
|
|
380
398
|
connection.srpServer = srpServer;
|
|
381
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
382
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 2 /* M2 */, 2 /* SALT */, salt, 3 /* PUBLIC_KEY */, srpB));
|
|
383
|
-
connection._pairSetupState = 2 /* M2 */;
|
|
399
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
400
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 2 /* PairingStates.M2 */, 2 /* TLVValues.SALT */, salt, 3 /* TLVValues.PUBLIC_KEY */, srpB));
|
|
401
|
+
connection._pairSetupState = 2 /* PairingStates.M2 */;
|
|
384
402
|
}).catch(function (error) {
|
|
385
403
|
debug("[%s] Error occurred when generating srp key: %s", _this.accessoryInfo.username, error.message);
|
|
386
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
387
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, 1 /* UNKNOWN */));
|
|
404
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
405
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, 1 /* TLVErrorCode.UNKNOWN */));
|
|
388
406
|
return;
|
|
389
407
|
});
|
|
390
408
|
};
|
|
391
409
|
HAPServer.prototype.handlePairSetupM3 = function (connection, request, response, tlvData) {
|
|
392
410
|
debug("[%s] Pair step 2/5", this.accessoryInfo.username);
|
|
393
|
-
var A = tlvData[3 /* PUBLIC_KEY */]; // "A is a public key that exists only for a single login session."
|
|
394
|
-
var M1 = tlvData[4 /* PASSWORD_PROOF */]; // "M1 is the proof that you actually know your own password."
|
|
411
|
+
var A = tlvData[3 /* TLVValues.PUBLIC_KEY */]; // "A is a public key that exists only for a single login session."
|
|
412
|
+
var M1 = tlvData[4 /* TLVValues.PASSWORD_PROOF */]; // "M1 is the proof that you actually know your own password."
|
|
395
413
|
// pull the SRP server we created in stepOne out of the current session
|
|
396
414
|
var srpServer = connection.srpServer;
|
|
397
415
|
srpServer.setA(A);
|
|
@@ -402,22 +420,22 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
402
420
|
// most likely the client supplied an incorrect pincode.
|
|
403
421
|
this.unsuccessfulPairAttempts++;
|
|
404
422
|
debug("[%s] Error while checking pincode: %s", this.accessoryInfo.username, err.message);
|
|
405
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
406
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 4 /* M4 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
423
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
424
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 4 /* PairingStates.M4 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
407
425
|
connection._pairSetupState = undefined;
|
|
408
426
|
return;
|
|
409
427
|
}
|
|
410
428
|
// "M2 is the proof that the server actually knows your password."
|
|
411
429
|
var M2 = srpServer.computeM2();
|
|
412
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
413
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 4 /* M4 */, 4 /* PASSWORD_PROOF */, M2));
|
|
414
|
-
connection._pairSetupState = 4 /* M4 */;
|
|
430
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
431
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 4 /* PairingStates.M4 */, 4 /* TLVValues.PASSWORD_PROOF */, M2));
|
|
432
|
+
connection._pairSetupState = 4 /* PairingStates.M4 */;
|
|
415
433
|
};
|
|
416
434
|
HAPServer.prototype.handlePairSetupM5 = function (connection, request, response, tlvData) {
|
|
417
435
|
debug("[%s] Pair step 3/5", this.accessoryInfo.username);
|
|
418
436
|
// pull the SRP server we created in stepOne out of the current session
|
|
419
437
|
var srpServer = connection.srpServer;
|
|
420
|
-
var encryptedData = tlvData[5 /* ENCRYPTED_DATA */];
|
|
438
|
+
var encryptedData = tlvData[5 /* TLVValues.ENCRYPTED_DATA */];
|
|
421
439
|
var messageData = Buffer.alloc(encryptedData.length - 16);
|
|
422
440
|
var authTagData = Buffer.alloc(16);
|
|
423
441
|
encryptedData.copy(messageData, 0, 0, encryptedData.length - 16);
|
|
@@ -432,16 +450,16 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
432
450
|
}
|
|
433
451
|
catch (error) {
|
|
434
452
|
debug("[%s] Error while decrypting and verifying M5 subTlv: %s", this.accessoryInfo.username);
|
|
435
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
436
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 4 /* M4 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
453
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
454
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 4 /* PairingStates.M4 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
437
455
|
connection._pairSetupState = undefined;
|
|
438
456
|
return;
|
|
439
457
|
}
|
|
440
458
|
// decode the client payload and pass it on to the next step
|
|
441
459
|
var M5Packet = tlv.decode(plaintext);
|
|
442
|
-
var clientUsername = M5Packet[1 /* USERNAME */];
|
|
443
|
-
var clientLTPK = M5Packet[3 /* PUBLIC_KEY */];
|
|
444
|
-
var clientProof = M5Packet[10 /* PROOF */];
|
|
460
|
+
var clientUsername = M5Packet[1 /* TLVValues.USERNAME */];
|
|
461
|
+
var clientLTPK = M5Packet[3 /* TLVValues.PUBLIC_KEY */];
|
|
462
|
+
var clientProof = M5Packet[10 /* TLVValues.PROOF */];
|
|
445
463
|
this.handlePairSetupM5_2(connection, request, response, clientUsername, clientLTPK, clientProof, outputKey);
|
|
446
464
|
};
|
|
447
465
|
// M5-2
|
|
@@ -454,8 +472,8 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
454
472
|
var completeData = Buffer.concat([outputKey, clientUsername, clientLTPK]);
|
|
455
473
|
if (!tweetnacl_1.default.sign.detached.verify(completeData, clientProof, clientLTPK)) {
|
|
456
474
|
debug("[%s] Invalid signature", this.accessoryInfo.username);
|
|
457
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
458
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 6 /* M6 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
475
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
476
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 6 /* PairingStates.M6 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
459
477
|
connection._pairSetupState = undefined;
|
|
460
478
|
return;
|
|
461
479
|
}
|
|
@@ -474,42 +492,42 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
474
492
|
var material = Buffer.concat([outputKey, usernameData, serverLTPK]);
|
|
475
493
|
var privateKey = Buffer.from(this.accessoryInfo.signSk);
|
|
476
494
|
var serverProof = tweetnacl_1.default.sign.detached(material, privateKey);
|
|
477
|
-
var message = tlv.encode(1 /* USERNAME */, usernameData, 3 /* PUBLIC_KEY */, serverLTPK, 10 /* PROOF */, serverProof);
|
|
495
|
+
var message = tlv.encode(1 /* TLVValues.USERNAME */, usernameData, 3 /* TLVValues.PUBLIC_KEY */, serverLTPK, 10 /* TLVValues.PROOF */, serverProof);
|
|
478
496
|
var encrypted = hapCrypto.chacha20_poly1305_encryptAndSeal(hkdfEncKey, Buffer.from("PS-Msg06"), null, message);
|
|
479
497
|
// finally, notify listeners that we have been paired with a client
|
|
480
|
-
this.emit("pair" /* PAIR */, clientUsername.toString(), clientLTPK, (0, once_1.once)(function (err) {
|
|
498
|
+
this.emit("pair" /* HAPServerEventTypes.PAIR */, clientUsername.toString(), clientLTPK, (0, once_1.once)(function (err) {
|
|
481
499
|
if (err) {
|
|
482
500
|
debug("[%s] Error adding pairing info: %s", _this.accessoryInfo.username, err.message);
|
|
483
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
484
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 6 /* M6 */, 7 /* ERROR_CODE */, 1 /* UNKNOWN */));
|
|
501
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
502
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 6 /* PairingStates.M6 */, 7 /* TLVValues.ERROR_CODE */, 1 /* TLVErrorCode.UNKNOWN */));
|
|
485
503
|
connection._pairSetupState = undefined;
|
|
486
504
|
return;
|
|
487
505
|
}
|
|
488
506
|
// send final pairing response to client
|
|
489
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
490
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 6 /* M6 */, 5 /* ENCRYPTED_DATA */, Buffer.concat([encrypted.ciphertext, encrypted.authTag])));
|
|
507
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
508
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 6 /* PairingStates.M6 */, 5 /* TLVValues.ENCRYPTED_DATA */, Buffer.concat([encrypted.ciphertext, encrypted.authTag])));
|
|
491
509
|
connection._pairSetupState = undefined;
|
|
492
510
|
}));
|
|
493
511
|
};
|
|
494
512
|
HAPServer.prototype.handlePairVerify = function (connection, url, request, data, response) {
|
|
495
513
|
var tlvData = tlv.decode(data);
|
|
496
|
-
var sequence = tlvData[6 /* SEQUENCE_NUM */][0]; // value is single byte with sequence number
|
|
497
|
-
if (sequence === 1 /* M1 */) {
|
|
514
|
+
var sequence = tlvData[6 /* TLVValues.SEQUENCE_NUM */][0]; // value is single byte with sequence number
|
|
515
|
+
if (sequence === 1 /* PairingStates.M1 */) {
|
|
498
516
|
this.handlePairVerifyM1(connection, request, response, tlvData);
|
|
499
517
|
}
|
|
500
|
-
else if (sequence === 3 /* M3 */ && connection._pairVerifyState === 2 /* M2 */) {
|
|
518
|
+
else if (sequence === 3 /* PairingStates.M3 */ && connection._pairVerifyState === 2 /* PairingStates.M2 */) {
|
|
501
519
|
this.handlePairVerifyM3(connection, request, response, tlvData);
|
|
502
520
|
}
|
|
503
521
|
else {
|
|
504
522
|
// Invalid state/sequence number
|
|
505
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/pairing+tlv8" });
|
|
506
|
-
response.end(tlv.encode(6 /* STATE */, sequence + 1, 7 /* ERROR_CODE */, 1 /* UNKNOWN */));
|
|
523
|
+
response.writeHead(400 /* HAPPairingHTTPCode.BAD_REQUEST */, { "Content-Type": "application/pairing+tlv8" });
|
|
524
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, sequence + 1, 7 /* TLVValues.ERROR_CODE */, 1 /* TLVErrorCode.UNKNOWN */));
|
|
507
525
|
return;
|
|
508
526
|
}
|
|
509
527
|
};
|
|
510
528
|
HAPServer.prototype.handlePairVerifyM1 = function (connection, request, response, tlvData) {
|
|
511
529
|
debug("[%s] Pair verify step 1/2", this.accessoryInfo.username);
|
|
512
|
-
var clientPublicKey = tlvData[3 /* PUBLIC_KEY */]; // Buffer
|
|
530
|
+
var clientPublicKey = tlvData[3 /* TLVValues.PUBLIC_KEY */]; // Buffer
|
|
513
531
|
// generate new encryption keys for this session
|
|
514
532
|
var keyPair = hapCrypto.generateCurve25519KeyPair();
|
|
515
533
|
var secretKey = Buffer.from(keyPair.secretKey);
|
|
@@ -524,15 +542,15 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
524
542
|
var outputKey = hapCrypto.HKDF("sha512", encSalt, sharedSec, encInfo, 32).slice(0, 32);
|
|
525
543
|
connection.encryption = new eventedhttp_1.HAPEncryption(clientPublicKey, secretKey, publicKey, sharedSec, outputKey);
|
|
526
544
|
// compose the response data in TLV format
|
|
527
|
-
var message = tlv.encode(1 /* USERNAME */, usernameData, 10 /* PROOF */, serverProof);
|
|
545
|
+
var message = tlv.encode(1 /* TLVValues.USERNAME */, usernameData, 10 /* TLVValues.PROOF */, serverProof);
|
|
528
546
|
var encrypted = hapCrypto.chacha20_poly1305_encryptAndSeal(outputKey, Buffer.from("PV-Msg02"), null, message);
|
|
529
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
530
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 2 /* M2 */, 5 /* ENCRYPTED_DATA */, Buffer.concat([encrypted.ciphertext, encrypted.authTag]), 3 /* PUBLIC_KEY */, publicKey));
|
|
531
|
-
connection._pairVerifyState = 2 /* M2 */;
|
|
547
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
548
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 2 /* PairingStates.M2 */, 5 /* TLVValues.ENCRYPTED_DATA */, Buffer.concat([encrypted.ciphertext, encrypted.authTag]), 3 /* TLVValues.PUBLIC_KEY */, publicKey));
|
|
549
|
+
connection._pairVerifyState = 2 /* PairingStates.M2 */;
|
|
532
550
|
};
|
|
533
551
|
HAPServer.prototype.handlePairVerifyM3 = function (connection, request, response, objects) {
|
|
534
552
|
debug("[%s] Pair verify step 2/2", this.accessoryInfo.username);
|
|
535
|
-
var encryptedData = objects[5 /* ENCRYPTED_DATA */];
|
|
553
|
+
var encryptedData = objects[5 /* TLVValues.ENCRYPTED_DATA */];
|
|
536
554
|
var messageData = Buffer.alloc(encryptedData.length - 16);
|
|
537
555
|
var authTagData = Buffer.alloc(16);
|
|
538
556
|
encryptedData.copy(messageData, 0, 0, encryptedData.length - 16);
|
|
@@ -545,14 +563,14 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
545
563
|
}
|
|
546
564
|
catch (error) {
|
|
547
565
|
debug("[%s] M3: Failed to decrypt and/or verify", this.accessoryInfo.username);
|
|
548
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
549
|
-
response.end(tlv.encode(6 /* STATE */, 4 /* M4 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
566
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
567
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 4 /* PairingStates.M4 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
550
568
|
connection._pairVerifyState = undefined;
|
|
551
569
|
return;
|
|
552
570
|
}
|
|
553
571
|
var decoded = tlv.decode(plaintext);
|
|
554
|
-
var clientUsername = decoded[1 /* USERNAME */];
|
|
555
|
-
var proof = decoded[10 /* PROOF */];
|
|
572
|
+
var clientUsername = decoded[1 /* TLVValues.USERNAME */];
|
|
573
|
+
var proof = decoded[10 /* TLVValues.PROOF */];
|
|
556
574
|
var material = Buffer.concat([enc.clientPublicKey, clientUsername, enc.publicKey]);
|
|
557
575
|
// since we're paired, we should have the public key stored for this client
|
|
558
576
|
var clientPublicKey = this.accessoryInfo.getClientPublicKey(clientUsername.toString());
|
|
@@ -560,21 +578,21 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
560
578
|
// disagree. Respond with invalid request (seems to match HomeKit Accessory Simulator behavior)
|
|
561
579
|
if (!clientPublicKey) {
|
|
562
580
|
debug("[%s] Client %s attempting to verify, but we are not paired; rejecting client", this.accessoryInfo.username, clientUsername);
|
|
563
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
564
|
-
response.end(tlv.encode(6 /* STATE */, 4 /* M4 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
581
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
582
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 4 /* PairingStates.M4 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
565
583
|
connection._pairVerifyState = undefined;
|
|
566
584
|
return;
|
|
567
585
|
}
|
|
568
586
|
if (!tweetnacl_1.default.sign.detached.verify(material, proof, clientPublicKey)) {
|
|
569
587
|
debug("[%s] Client %s provided an invalid signature", this.accessoryInfo.username, clientUsername);
|
|
570
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
571
|
-
response.end(tlv.encode(6 /* STATE */, 4 /* M4 */, 7 /* ERROR_CODE */, 2 /* AUTHENTICATION */));
|
|
588
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
589
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 4 /* PairingStates.M4 */, 7 /* TLVValues.ERROR_CODE */, 2 /* TLVErrorCode.AUTHENTICATION */));
|
|
572
590
|
connection._pairVerifyState = undefined;
|
|
573
591
|
return;
|
|
574
592
|
}
|
|
575
593
|
debug("[%s] Client %s verification complete", this.accessoryInfo.username, clientUsername);
|
|
576
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
577
|
-
response.end(tlv.encode(6 /* SEQUENCE_NUM */, 4 /* M4 */));
|
|
594
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
595
|
+
response.end(tlv.encode(6 /* TLVValues.SEQUENCE_NUM */, 4 /* PairingStates.M4 */));
|
|
578
596
|
// now that the client has been verified, we must "upgrade" our pseudo-HTTP connection to include
|
|
579
597
|
// TCP-level encryption. We'll do this by adding some more encryption vars to the session, and using them
|
|
580
598
|
// in future calls to onEncrypt, onDecrypt.
|
|
@@ -591,64 +609,64 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
591
609
|
var _this = this;
|
|
592
610
|
// Only accept /pairing request if there is a secure session
|
|
593
611
|
if (!this.allowInsecureRequest && !connection.isAuthenticated()) {
|
|
594
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
595
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
612
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
613
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
596
614
|
return;
|
|
597
615
|
}
|
|
598
616
|
var objects = tlv.decode(data);
|
|
599
|
-
var method = objects[0 /* METHOD */][0]; // value is single byte with request type
|
|
600
|
-
var state = objects[6 /* STATE */][0];
|
|
601
|
-
if (state !== 1 /* M1 */) {
|
|
617
|
+
var method = objects[0 /* TLVValues.METHOD */][0]; // value is single byte with request type
|
|
618
|
+
var state = objects[6 /* TLVValues.STATE */][0];
|
|
619
|
+
if (state !== 1 /* PairingStates.M1 */) {
|
|
602
620
|
return;
|
|
603
621
|
}
|
|
604
|
-
if (method === 3 /* ADD_PAIRING */) {
|
|
605
|
-
var identifier = objects[1 /* IDENTIFIER */].toString();
|
|
606
|
-
var publicKey = objects[3 /* PUBLIC_KEY */];
|
|
607
|
-
var permissions = objects[11 /* PERMISSIONS */][0];
|
|
608
|
-
this.emit("add-pairing" /* ADD_PAIRING */, connection, identifier, publicKey, permissions, (0, once_1.once)(function (error) {
|
|
622
|
+
if (method === 3 /* PairMethods.ADD_PAIRING */) {
|
|
623
|
+
var identifier = objects[1 /* TLVValues.IDENTIFIER */].toString();
|
|
624
|
+
var publicKey = objects[3 /* TLVValues.PUBLIC_KEY */];
|
|
625
|
+
var permissions = objects[11 /* TLVValues.PERMISSIONS */][0];
|
|
626
|
+
this.emit("add-pairing" /* HAPServerEventTypes.ADD_PAIRING */, connection, identifier, publicKey, permissions, (0, once_1.once)(function (error) {
|
|
609
627
|
if (error > 0) {
|
|
610
628
|
debug("[%s] Pairings: failed ADD_PAIRING with code %d", _this.accessoryInfo.username, error);
|
|
611
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
612
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, error));
|
|
629
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
630
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, error));
|
|
613
631
|
return;
|
|
614
632
|
}
|
|
615
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
616
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */));
|
|
633
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
634
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */));
|
|
617
635
|
debug("[%s] Pairings: successfully executed ADD_PAIRING", _this.accessoryInfo.username);
|
|
618
636
|
}));
|
|
619
637
|
}
|
|
620
|
-
else if (method === 4 /* REMOVE_PAIRING */) {
|
|
621
|
-
var identifier = objects[1 /* IDENTIFIER */].toString();
|
|
622
|
-
this.emit("remove-pairing" /* REMOVE_PAIRING */, connection, identifier, (0, once_1.once)(function (error) {
|
|
638
|
+
else if (method === 4 /* PairMethods.REMOVE_PAIRING */) {
|
|
639
|
+
var identifier = objects[1 /* TLVValues.IDENTIFIER */].toString();
|
|
640
|
+
this.emit("remove-pairing" /* HAPServerEventTypes.REMOVE_PAIRING */, connection, identifier, (0, once_1.once)(function (error) {
|
|
623
641
|
if (error > 0) {
|
|
624
642
|
debug("[%s] Pairings: failed REMOVE_PAIRING with code %d", _this.accessoryInfo.username, error);
|
|
625
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
626
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, error));
|
|
643
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
644
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, error));
|
|
627
645
|
return;
|
|
628
646
|
}
|
|
629
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
630
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */));
|
|
647
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
648
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */));
|
|
631
649
|
debug("[%s] Pairings: successfully executed REMOVE_PAIRING", _this.accessoryInfo.username);
|
|
632
650
|
}));
|
|
633
651
|
}
|
|
634
|
-
else if (method === 5 /* LIST_PAIRINGS */) {
|
|
635
|
-
this.emit("list-pairings" /* LIST_PAIRINGS */, connection, (0, once_1.once)(function (error, data) {
|
|
652
|
+
else if (method === 5 /* PairMethods.LIST_PAIRINGS */) {
|
|
653
|
+
this.emit("list-pairings" /* HAPServerEventTypes.LIST_PAIRINGS */, connection, (0, once_1.once)(function (error, data) {
|
|
636
654
|
if (error > 0) {
|
|
637
655
|
debug("[%s] Pairings: failed LIST_PAIRINGS with code %d", _this.accessoryInfo.username, error);
|
|
638
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
639
|
-
response.end(tlv.encode(6 /* STATE */, 2 /* M2 */, 7 /* ERROR_CODE */, error));
|
|
656
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" });
|
|
657
|
+
response.end(tlv.encode(6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */, 7 /* TLVValues.ERROR_CODE */, error));
|
|
640
658
|
return;
|
|
641
659
|
}
|
|
642
660
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
643
661
|
var tlvList = [];
|
|
644
662
|
data.forEach(function (value, index) {
|
|
645
663
|
if (index > 0) {
|
|
646
|
-
tlvList.push(255 /* SEPARATOR */, Buffer.alloc(0));
|
|
664
|
+
tlvList.push(255 /* TLVValues.SEPARATOR */, Buffer.alloc(0));
|
|
647
665
|
}
|
|
648
|
-
tlvList.push(1 /* IDENTIFIER */, value.username, 3 /* PUBLIC_KEY */, value.publicKey, 11 /* PERMISSIONS */, value.permission);
|
|
666
|
+
tlvList.push(1 /* TLVValues.IDENTIFIER */, value.username, 3 /* TLVValues.PUBLIC_KEY */, value.publicKey, 11 /* TLVValues.PERMISSIONS */, value.permission);
|
|
649
667
|
});
|
|
650
|
-
var list = tlv.encode.apply(tlv,
|
|
651
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/pairing+tlv8" /* PAIRING_TLV8 */ });
|
|
668
|
+
var list = tlv.encode.apply(tlv, tslib_1.__spreadArray([6 /* TLVValues.STATE */, 2 /* PairingStates.M2 */], tslib_1.__read(tlvList), false));
|
|
669
|
+
response.writeHead(200 /* HAPPairingHTTPCode.OK */, { "Content-Type": "application/pairing+tlv8" /* HAPMimeTypes.PAIRING_TLV8 */ });
|
|
652
670
|
response.end(list);
|
|
653
671
|
debug("[%s] Pairings: successfully executed LIST_PAIRINGS", _this.accessoryInfo.username);
|
|
654
672
|
}));
|
|
@@ -656,18 +674,18 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
656
674
|
};
|
|
657
675
|
HAPServer.prototype.handleAccessories = function (connection, url, request, data, response) {
|
|
658
676
|
if (!this.allowInsecureRequest && !connection.isAuthenticated()) {
|
|
659
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
660
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
677
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
678
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
661
679
|
return;
|
|
662
680
|
}
|
|
663
681
|
// call out to listeners to retrieve the latest accessories JSON
|
|
664
|
-
this.emit("accessories" /* ACCESSORIES */, connection, (0, once_1.once)(function (error, result) {
|
|
682
|
+
this.emit("accessories" /* HAPServerEventTypes.ACCESSORIES */, connection, (0, once_1.once)(function (error, result) {
|
|
665
683
|
if (error) {
|
|
666
|
-
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
684
|
+
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
667
685
|
response.end(JSON.stringify({ status: error.status }));
|
|
668
686
|
}
|
|
669
687
|
else {
|
|
670
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
688
|
+
response.writeHead(200 /* HAPHTTPCode.OK */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
671
689
|
response.end(JSON.stringify(result));
|
|
672
690
|
}
|
|
673
691
|
}));
|
|
@@ -675,21 +693,21 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
675
693
|
HAPServer.prototype.handleCharacteristics = function (connection, url, request, data, response) {
|
|
676
694
|
var e_1, _a;
|
|
677
695
|
if (!this.allowInsecureRequest && !connection.isAuthenticated()) {
|
|
678
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
679
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
696
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
697
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
680
698
|
return;
|
|
681
699
|
}
|
|
682
700
|
if (request.method === "GET") {
|
|
683
701
|
var searchParams = url.searchParams;
|
|
684
702
|
var idParam = searchParams.get("id");
|
|
685
703
|
if (!idParam) {
|
|
686
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
687
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
704
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
705
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
688
706
|
return;
|
|
689
707
|
}
|
|
690
708
|
var ids = [];
|
|
691
709
|
try {
|
|
692
|
-
for (var _b =
|
|
710
|
+
for (var _b = tslib_1.__values(idParam.split(",")), _c = _b.next(); !_c.done; _c = _b.next()) { // ["1.9","2.14"]
|
|
693
711
|
var entry = _c.value;
|
|
694
712
|
var split = entry.split("."); // ["1","9"]
|
|
695
713
|
ids.push({
|
|
@@ -712,17 +730,17 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
712
730
|
includeType: (0, internal_types_1.consideredTrue)(searchParams.get("type")),
|
|
713
731
|
includeEvent: (0, internal_types_1.consideredTrue)(searchParams.get("ev")),
|
|
714
732
|
};
|
|
715
|
-
this.emit("get-characteristics" /* GET_CHARACTERISTICS */, connection, readRequest, (0, once_1.once)(function (error, readResponse) {
|
|
733
|
+
this.emit("get-characteristics" /* HAPServerEventTypes.GET_CHARACTERISTICS */, connection, readRequest, (0, once_1.once)(function (error, readResponse) {
|
|
716
734
|
var e_2, _a, e_3, _b;
|
|
717
735
|
if (error) {
|
|
718
|
-
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
736
|
+
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
719
737
|
response.end(JSON.stringify({ status: error.status }));
|
|
720
738
|
return;
|
|
721
739
|
}
|
|
722
740
|
var characteristics = readResponse.characteristics;
|
|
723
741
|
var errorOccurred = false; // determine if we send a 207 Multi-Status
|
|
724
742
|
try {
|
|
725
|
-
for (var characteristics_1 =
|
|
743
|
+
for (var characteristics_1 = tslib_1.__values(characteristics), characteristics_1_1 = characteristics_1.next(); !characteristics_1_1.done; characteristics_1_1 = characteristics_1.next()) {
|
|
726
744
|
var data_1 = characteristics_1_1.value;
|
|
727
745
|
if (data_1.status) {
|
|
728
746
|
errorOccurred = true;
|
|
@@ -739,10 +757,10 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
739
757
|
}
|
|
740
758
|
if (errorOccurred) { // on a 207 Multi-Status EVERY characteristic MUST include a status property
|
|
741
759
|
try {
|
|
742
|
-
for (var characteristics_2 =
|
|
760
|
+
for (var characteristics_2 = tslib_1.__values(characteristics), characteristics_2_1 = characteristics_2.next(); !characteristics_2_1.done; characteristics_2_1 = characteristics_2.next()) {
|
|
743
761
|
var data_2 = characteristics_2_1.value;
|
|
744
762
|
if (!data_2.status) { // a status is undefined if the request was successful
|
|
745
|
-
data_2.status = 0 /* SUCCESS */; // a value of zero indicates success
|
|
763
|
+
data_2.status = 0 /* HAPStatus.SUCCESS */; // a value of zero indicates success
|
|
746
764
|
}
|
|
747
765
|
}
|
|
748
766
|
}
|
|
@@ -755,35 +773,35 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
755
773
|
}
|
|
756
774
|
}
|
|
757
775
|
// 207 "multi-status" is returned when an error occurs reading a characteristic. otherwise 200 is returned
|
|
758
|
-
response.writeHead(errorOccurred ? 207 /* MULTI_STATUS */ : 200 /* OK */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
776
|
+
response.writeHead(errorOccurred ? 207 /* HAPHTTPCode.MULTI_STATUS */ : 200 /* HAPHTTPCode.OK */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
759
777
|
response.end(JSON.stringify({ characteristics: characteristics }));
|
|
760
778
|
}));
|
|
761
779
|
}
|
|
762
780
|
else if (request.method === "PUT") {
|
|
763
781
|
if (!connection.isAuthenticated()) {
|
|
764
782
|
if (!request.headers || (request.headers && request.headers.authorization !== this.accessoryInfo.pincode)) {
|
|
765
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
766
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
783
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
784
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
767
785
|
return;
|
|
768
786
|
}
|
|
769
787
|
}
|
|
770
788
|
if (data.length === 0) {
|
|
771
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
772
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
789
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
790
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
773
791
|
return;
|
|
774
792
|
}
|
|
775
793
|
var writeRequest = JSON.parse(data.toString("utf8"));
|
|
776
|
-
this.emit("set-characteristics" /* SET_CHARACTERISTICS */, connection, writeRequest, (0, once_1.once)(function (error, writeResponse) {
|
|
794
|
+
this.emit("set-characteristics" /* HAPServerEventTypes.SET_CHARACTERISTICS */, connection, writeRequest, (0, once_1.once)(function (error, writeResponse) {
|
|
777
795
|
var e_4, _a;
|
|
778
796
|
if (error) {
|
|
779
|
-
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
797
|
+
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
780
798
|
response.end(JSON.stringify({ status: error.status }));
|
|
781
799
|
return;
|
|
782
800
|
}
|
|
783
801
|
var characteristics = writeResponse.characteristics;
|
|
784
802
|
var multiStatus = false;
|
|
785
803
|
try {
|
|
786
|
-
for (var characteristics_3 =
|
|
804
|
+
for (var characteristics_3 = tslib_1.__values(characteristics), characteristics_3_1 = characteristics_3.next(); !characteristics_3_1.done; characteristics_3_1 = characteristics_3.next()) {
|
|
787
805
|
var data_3 = characteristics_3_1.value;
|
|
788
806
|
if (data_3.status || data_3.value !== undefined) {
|
|
789
807
|
// also send multiStatus on write response requests
|
|
@@ -801,32 +819,32 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
801
819
|
}
|
|
802
820
|
if (multiStatus) {
|
|
803
821
|
// 207 is "multi-status" since HomeKit may be setting multiple things and any one can fail independently
|
|
804
|
-
response.writeHead(207 /* MULTI_STATUS */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
822
|
+
response.writeHead(207 /* HAPHTTPCode.MULTI_STATUS */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
805
823
|
response.end(JSON.stringify({ characteristics: characteristics }));
|
|
806
824
|
}
|
|
807
825
|
else {
|
|
808
826
|
// if everything went fine send 204 no content response
|
|
809
|
-
response.writeHead(204 /* NO_CONTENT */);
|
|
827
|
+
response.writeHead(204 /* HAPHTTPCode.NO_CONTENT */);
|
|
810
828
|
response.end();
|
|
811
829
|
}
|
|
812
830
|
}));
|
|
813
831
|
}
|
|
814
832
|
else {
|
|
815
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ }); // method not allowed
|
|
816
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
833
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ }); // method not allowed
|
|
834
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
817
835
|
}
|
|
818
836
|
};
|
|
819
837
|
HAPServer.prototype.handlePrepareWrite = function (connection, url, request, data, response) {
|
|
820
838
|
var _this = this;
|
|
821
839
|
if (!this.allowInsecureRequest && !connection.isAuthenticated()) {
|
|
822
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
823
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
840
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
841
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
824
842
|
return;
|
|
825
843
|
}
|
|
826
844
|
if (request.method === "PUT") {
|
|
827
845
|
if (data.length === 0) {
|
|
828
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
829
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
846
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
847
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
830
848
|
return;
|
|
831
849
|
}
|
|
832
850
|
var prepareRequest_1 = JSON.parse(data.toString());
|
|
@@ -841,50 +859,50 @@ var HAPServer = /** @class */ (function (_super) {
|
|
|
841
859
|
connection.timedWritePid = undefined;
|
|
842
860
|
connection.timedWriteTimeout = undefined;
|
|
843
861
|
}, prepareRequest_1.ttl);
|
|
844
|
-
response.writeHead(200 /* OK */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
845
|
-
response.end(JSON.stringify({ status: 0 /* SUCCESS */ }));
|
|
862
|
+
response.writeHead(200 /* HAPHTTPCode.OK */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
863
|
+
response.end(JSON.stringify({ status: 0 /* HAPStatus.SUCCESS */ }));
|
|
846
864
|
return;
|
|
847
865
|
}
|
|
848
866
|
else {
|
|
849
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
850
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
867
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
868
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
851
869
|
}
|
|
852
870
|
}
|
|
853
871
|
else {
|
|
854
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
855
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
872
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
873
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
856
874
|
}
|
|
857
875
|
};
|
|
858
876
|
HAPServer.prototype.handleResource = function (connection, url, request, data, response) {
|
|
859
877
|
if (!connection.isAuthenticated()) {
|
|
860
878
|
if (!(this.allowInsecureRequest && request.headers && request.headers.authorization === this.accessoryInfo.pincode)) {
|
|
861
|
-
response.writeHead(470 /* CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
862
|
-
response.end(JSON.stringify({ status: -70401 /* INSUFFICIENT_PRIVILEGES */ }));
|
|
879
|
+
response.writeHead(470 /* HAPPairingHTTPCode.CONNECTION_AUTHORIZATION_REQUIRED */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
880
|
+
response.end(JSON.stringify({ status: -70401 /* HAPStatus.INSUFFICIENT_PRIVILEGES */ }));
|
|
863
881
|
return;
|
|
864
882
|
}
|
|
865
883
|
}
|
|
866
884
|
if (request.method === "POST") {
|
|
867
885
|
if (data.length === 0) {
|
|
868
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
869
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
886
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
887
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
870
888
|
return;
|
|
871
889
|
}
|
|
872
890
|
var resourceRequest = JSON.parse(data.toString());
|
|
873
891
|
// call out to listeners to retrieve the resource, snapshot only right now
|
|
874
|
-
this.emit("request-resource" /* REQUEST_RESOURCE */, resourceRequest, (0, once_1.once)(function (error, resource) {
|
|
892
|
+
this.emit("request-resource" /* HAPServerEventTypes.REQUEST_RESOURCE */, resourceRequest, (0, once_1.once)(function (error, resource) {
|
|
875
893
|
if (error) {
|
|
876
|
-
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAP_JSON */ });
|
|
894
|
+
response.writeHead(error.httpCode, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ });
|
|
877
895
|
response.end(JSON.stringify({ status: error.status }));
|
|
878
896
|
}
|
|
879
897
|
else {
|
|
880
|
-
response.writeHead(200 /* OK */, { "Content-Type": "image/jpeg" /* IMAGE_JPEG */ });
|
|
898
|
+
response.writeHead(200 /* HAPHTTPCode.OK */, { "Content-Type": "image/jpeg" /* HAPMimeTypes.IMAGE_JPEG */ });
|
|
881
899
|
response.end(resource);
|
|
882
900
|
}
|
|
883
901
|
}));
|
|
884
902
|
}
|
|
885
903
|
else {
|
|
886
|
-
response.writeHead(400 /* BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAP_JSON */ }); // method not allowed
|
|
887
|
-
response.end(JSON.stringify({ status: -70410 /* INVALID_VALUE_IN_REQUEST */ }));
|
|
904
|
+
response.writeHead(400 /* HAPHTTPCode.BAD_REQUEST */, { "Content-Type": "application/hap+json" /* HAPMimeTypes.HAP_JSON */ }); // method not allowed
|
|
905
|
+
response.end(JSON.stringify({ status: -70410 /* HAPStatus.INVALID_VALUE_IN_REQUEST */ }));
|
|
888
906
|
}
|
|
889
907
|
};
|
|
890
908
|
return HAPServer;
|