hap-nodejs 1.1.1-beta.2 → 1.1.1-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@types/bonjour-hap.d.ts +50 -53
- package/README.md +16 -19
- package/dist/accessories/AirConditioner_accessory.js +28 -30
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +69 -81
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +141 -136
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +18 -22
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +33 -35
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +42 -44
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +32 -34
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +25 -26
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +13 -16
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +20 -22
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +18 -20
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +34 -37
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +43 -45
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +12 -15
- package/dist/accessories/TemperatureSensor_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.js +9 -12
- package/dist/accessories/Wi-FiRouter_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.js +11 -14
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts +3 -3
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +37 -38
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/accessories/types.d.ts +63 -63
- package/dist/accessories/types.d.ts.map +1 -1
- package/dist/accessories/types.js +83 -87
- package/dist/accessories/types.js.map +1 -1
- package/dist/index.d.ts +26 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -34
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js +19 -21
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +38 -37
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +286 -291
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +7 -7
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +128 -136
- package/dist/lib/Advertiser.js.map +1 -1
- package/dist/lib/Bridge.d.ts +1 -1
- package/dist/lib/Bridge.d.ts.map +1 -1
- package/dist/lib/Bridge.js +2 -6
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +40 -41
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +204 -208
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +31 -30
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +220 -229
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +22 -22
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +63 -67
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +2 -1
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +28 -44
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +34 -33
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +179 -151
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +19 -17
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +160 -151
- package/dist/lib/camera/RecordingManagement.js.map +1 -1
- package/dist/lib/camera/index.d.ts +3 -3
- package/dist/lib/camera/index.d.ts.map +1 -1
- package/dist/lib/camera/index.js +3 -6
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +33 -33
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +152 -144
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +22 -20
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +74 -78
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +4 -4
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js +5 -8
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +5 -4
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +9 -13
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +39 -37
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +208 -197
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.d.ts +5 -5
- package/dist/lib/controller/index.d.ts.map +1 -1
- package/dist/lib/controller/index.js +5 -8
- package/dist/lib/controller/index.js.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.d.ts +2 -2
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +39 -39
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +1 -0
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +57 -77
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +23 -22
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +154 -164
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.d.ts +3 -3
- package/dist/lib/datastream/index.d.ts.map +1 -1
- package/dist/lib/datastream/index.js +3 -6
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/dbus/align.d.ts +2 -0
- package/dist/lib/dbus/align.d.ts.map +1 -0
- package/dist/lib/dbus/align.js +12 -0
- package/dist/lib/dbus/align.js.map +1 -0
- package/dist/lib/dbus/bus.d.ts +38 -0
- package/dist/lib/dbus/bus.d.ts.map +1 -0
- package/dist/lib/dbus/bus.js +222 -0
- package/dist/lib/dbus/bus.js.map +1 -0
- package/dist/lib/dbus/constants.d.ts +43 -0
- package/dist/lib/dbus/constants.d.ts.map +1 -0
- package/dist/lib/dbus/constants.js +53 -0
- package/dist/lib/dbus/constants.js.map +1 -0
- package/dist/lib/dbus/dbus-buffer.d.ts +30 -0
- package/dist/lib/dbus/dbus-buffer.d.ts.map +1 -0
- package/dist/lib/dbus/dbus-buffer.js +175 -0
- package/dist/lib/dbus/dbus-buffer.js.map +1 -0
- package/dist/lib/dbus/handshake.d.ts +2 -0
- package/dist/lib/dbus/handshake.d.ts.map +1 -0
- package/dist/lib/dbus/handshake.js +130 -0
- package/dist/lib/dbus/handshake.js.map +1 -0
- package/dist/lib/dbus/index.d.ts +3 -0
- package/dist/lib/dbus/index.d.ts.map +1 -0
- package/dist/lib/dbus/index.js +123 -0
- package/dist/lib/dbus/index.js.map +1 -0
- package/dist/lib/dbus/introspect.d.ts +30 -0
- package/dist/lib/dbus/introspect.d.ts.map +1 -0
- package/dist/lib/dbus/introspect.js +208 -0
- package/dist/lib/dbus/introspect.js.map +1 -0
- package/dist/lib/dbus/marshall.d.ts +2 -0
- package/dist/lib/dbus/marshall.d.ts.map +1 -0
- package/dist/lib/dbus/marshall.js +97 -0
- package/dist/lib/dbus/marshall.js.map +1 -0
- package/dist/lib/dbus/marshallers.d.ts +10 -0
- package/dist/lib/dbus/marshallers.d.ts.map +1 -0
- package/dist/lib/dbus/marshallers.js +329 -0
- package/dist/lib/dbus/marshallers.js.map +1 -0
- package/dist/lib/dbus/message.d.ts +4 -0
- package/dist/lib/dbus/message.d.ts.map +1 -0
- package/dist/lib/dbus/message.js +116 -0
- package/dist/lib/dbus/message.js.map +1 -0
- package/dist/lib/dbus/put.d.ts +21 -0
- package/dist/lib/dbus/put.d.ts.map +1 -0
- package/dist/lib/dbus/put.js +120 -0
- package/dist/lib/dbus/put.js.map +1 -0
- package/dist/lib/dbus/readline.d.ts +2 -0
- package/dist/lib/dbus/readline.d.ts.map +1 -0
- package/dist/lib/dbus/readline.js +27 -0
- package/dist/lib/dbus/readline.js.map +1 -0
- package/dist/lib/dbus/signature.d.ts +2 -0
- package/dist/lib/dbus/signature.d.ts.map +1 -0
- package/dist/lib/dbus/signature.js +58 -0
- package/dist/lib/dbus/signature.js.map +1 -0
- package/dist/lib/dbus/stdifaces.d.ts +3 -0
- package/dist/lib/dbus/stdifaces.d.ts.map +1 -0
- package/dist/lib/dbus/stdifaces.js +206 -0
- package/dist/lib/dbus/stdifaces.js.map +1 -0
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.js +958 -1204
- package/dist/lib/definitions/CharacteristicDefinitions.js.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.js +620 -695
- package/dist/lib/definitions/ServiceDefinitions.js.map +1 -1
- package/dist/lib/definitions/generate-definitions.d.ts +3 -3
- package/dist/lib/definitions/generate-definitions.d.ts.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +246 -253
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +160 -165
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/definitions/index.d.ts +2 -2
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +2 -5
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/model/AccessoryInfo.d.ts +4 -3
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +50 -53
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts +3 -3
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +17 -22
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts +2 -2
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +4 -11
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +1 -1
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +19 -27
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +9 -9
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js +27 -29
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/checkName.d.ts +2 -2
- package/dist/lib/util/checkName.d.ts.map +1 -1
- package/dist/lib/util/checkName.js +6 -9
- package/dist/lib/util/checkName.js.map +1 -1
- package/dist/lib/util/clone.d.ts.map +1 -1
- package/dist/lib/util/clone.js +1 -5
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts +1 -1
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +4 -9
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +23 -22
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +109 -116
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +3 -2
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +31 -40
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.d.ts +1 -1
- package/dist/lib/util/hapStatusError.d.ts.map +1 -1
- package/dist/lib/util/hapStatusError.js +4 -8
- package/dist/lib/util/hapStatusError.js.map +1 -1
- package/dist/lib/util/net-utils.d.ts +1 -1
- package/dist/lib/util/net-utils.js +17 -23
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +2 -6
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/promise-utils.d.ts +1 -1
- package/dist/lib/util/promise-utils.d.ts.map +1 -1
- package/dist/lib/util/promise-utils.js +3 -9
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +3 -2
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +11 -19
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +1 -0
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +6 -11
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +1 -0
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +28 -43
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +1 -0
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +26 -38
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +24 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -5
- package/dist/types.js.map +1 -1
- package/package.json +48 -45
- package/@types/simple-plist.d.ts +0 -4
- package/dist/lib/gen/HomeKit.d.ts +0 -7
- package/dist/lib/gen/HomeKit.d.ts.map +0 -1
- package/dist/lib/gen/HomeKit.js +0 -8
- package/dist/lib/gen/HomeKit.js.map +0 -1
package/dist/lib/Advertiser.js
CHANGED
|
@@ -1,52 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const crypto_1 = tslib_1.__importDefault(require("crypto"));
|
|
12
|
-
const debug_1 = tslib_1.__importDefault(require("debug"));
|
|
13
|
-
const events_1 = require("events");
|
|
14
|
-
const promise_utils_1 = require("./util/promise-utils");
|
|
15
|
-
const debug = (0, debug_1.default)("HAP-NodeJS:Advertiser");
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { Buffer } from 'node:buffer';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
import { getResponder } from '@homebridge/ciao';
|
|
6
|
+
import bonjour from 'bonjour-hap';
|
|
7
|
+
import createDebug from 'debug';
|
|
8
|
+
import { systemBus } from './dbus/index.js';
|
|
9
|
+
import { PromiseTimeout } from './util/promise-utils.js';
|
|
10
|
+
const debug = createDebug('HAP-NodeJS:Advertiser');
|
|
16
11
|
/**
|
|
17
12
|
* This enum lists all bitmasks for all known status flags.
|
|
18
13
|
* When the bit for the given bitmask is set, it represents the state described by the name.
|
|
19
14
|
*
|
|
20
15
|
* @group Advertiser
|
|
21
16
|
*/
|
|
22
|
-
|
|
17
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
18
|
+
export var StatusFlag;
|
|
23
19
|
(function (StatusFlag) {
|
|
24
20
|
StatusFlag[StatusFlag["NOT_PAIRED"] = 1] = "NOT_PAIRED";
|
|
25
21
|
StatusFlag[StatusFlag["NOT_JOINED_WIFI"] = 2] = "NOT_JOINED_WIFI";
|
|
26
22
|
StatusFlag[StatusFlag["PROBLEM_DETECTED"] = 4] = "PROBLEM_DETECTED";
|
|
27
|
-
})(StatusFlag || (
|
|
23
|
+
})(StatusFlag || (StatusFlag = {}));
|
|
28
24
|
/**
|
|
29
25
|
* This enum lists all bitmasks for all known pairing feature flags.
|
|
30
26
|
* When the bit for the given bitmask is set, it represents the state described by the name.
|
|
31
27
|
*
|
|
32
28
|
* @group Advertiser
|
|
33
29
|
*/
|
|
34
|
-
|
|
30
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
31
|
+
export var PairingFeatureFlag;
|
|
35
32
|
(function (PairingFeatureFlag) {
|
|
36
33
|
PairingFeatureFlag[PairingFeatureFlag["SUPPORTS_HARDWARE_AUTHENTICATION"] = 1] = "SUPPORTS_HARDWARE_AUTHENTICATION";
|
|
37
34
|
PairingFeatureFlag[PairingFeatureFlag["SUPPORTS_SOFTWARE_AUTHENTICATION"] = 2] = "SUPPORTS_SOFTWARE_AUTHENTICATION";
|
|
38
|
-
})(PairingFeatureFlag || (
|
|
35
|
+
})(PairingFeatureFlag || (PairingFeatureFlag = {}));
|
|
39
36
|
/**
|
|
40
37
|
* @group Advertiser
|
|
41
38
|
*/
|
|
42
|
-
|
|
39
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
40
|
+
export var AdvertiserEvent;
|
|
43
41
|
(function (AdvertiserEvent) {
|
|
44
42
|
/**
|
|
45
43
|
* Emitted if the underlying mDNS advertisers signals, that the service name
|
|
46
44
|
* was automatically changed due to some naming conflicts on the network.
|
|
47
45
|
*/
|
|
48
46
|
AdvertiserEvent["UPDATED_NAME"] = "updated-name";
|
|
49
|
-
})(AdvertiserEvent || (
|
|
47
|
+
})(AdvertiserEvent || (AdvertiserEvent = {}));
|
|
50
48
|
/**
|
|
51
49
|
* Advertiser uses mdns to broadcast the presence of an Accessory to the local network.
|
|
52
50
|
*
|
|
@@ -57,9 +55,9 @@ var AdvertiserEvent;
|
|
|
57
55
|
*
|
|
58
56
|
* @group Advertiser
|
|
59
57
|
*/
|
|
60
|
-
class CiaoAdvertiser extends
|
|
61
|
-
static protocolVersion =
|
|
62
|
-
static protocolVersionService =
|
|
58
|
+
export class CiaoAdvertiser extends EventEmitter {
|
|
59
|
+
static protocolVersion = '1.1';
|
|
60
|
+
static protocolVersionService = '1.1.0';
|
|
63
61
|
accessoryInfo;
|
|
64
62
|
setupHash;
|
|
65
63
|
responder;
|
|
@@ -68,7 +66,7 @@ class CiaoAdvertiser extends events_1.EventEmitter {
|
|
|
68
66
|
super();
|
|
69
67
|
this.accessoryInfo = accessoryInfo;
|
|
70
68
|
this.setupHash = CiaoAdvertiser.computeSetupHash(accessoryInfo);
|
|
71
|
-
this.responder =
|
|
69
|
+
this.responder = getResponder({
|
|
72
70
|
...responderOptions,
|
|
73
71
|
});
|
|
74
72
|
this.advertisedService = this.responder.createService({
|
|
@@ -90,7 +88,7 @@ class CiaoAdvertiser extends events_1.EventEmitter {
|
|
|
90
88
|
}
|
|
91
89
|
updateAdvertisement(silent) {
|
|
92
90
|
const txt = CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash);
|
|
93
|
-
debug(
|
|
91
|
+
debug('Updating txt record (txt: %o, silent: %d)', txt, silent);
|
|
94
92
|
this.advertisedService.updateTxt(txt, silent);
|
|
95
93
|
}
|
|
96
94
|
async destroy() {
|
|
@@ -104,21 +102,21 @@ class CiaoAdvertiser extends events_1.EventEmitter {
|
|
|
104
102
|
statusFlags.push(1 /* StatusFlag.NOT_PAIRED */);
|
|
105
103
|
}
|
|
106
104
|
return {
|
|
107
|
-
|
|
108
|
-
ff: CiaoAdvertiser.ff(), // pairing feature flags
|
|
109
|
-
id: accessoryInfo.username, // device id
|
|
110
|
-
md: accessoryInfo.model, // model name
|
|
111
|
-
pv: CiaoAdvertiser.protocolVersion, // protocol version
|
|
112
|
-
|
|
113
|
-
sf: CiaoAdvertiser.sf(...statusFlags), // status flags
|
|
114
|
-
ci: accessoryInfo.category,
|
|
115
|
-
sh: setupHash,
|
|
105
|
+
'c#': accessoryInfo.getConfigVersion(), // current configuration number
|
|
106
|
+
'ff': CiaoAdvertiser.ff(), // pairing feature flags
|
|
107
|
+
'id': accessoryInfo.username, // device id
|
|
108
|
+
'md': accessoryInfo.model, // model name
|
|
109
|
+
'pv': CiaoAdvertiser.protocolVersion, // protocol version
|
|
110
|
+
's#': 1, // current state number (must be 1)
|
|
111
|
+
'sf': CiaoAdvertiser.sf(...statusFlags), // status flags
|
|
112
|
+
'ci': accessoryInfo.category,
|
|
113
|
+
'sh': setupHash,
|
|
116
114
|
};
|
|
117
115
|
}
|
|
118
116
|
static computeSetupHash(accessoryInfo) {
|
|
119
|
-
const hash =
|
|
117
|
+
const hash = createHash('sha512');
|
|
120
118
|
hash.update(accessoryInfo.setupID + accessoryInfo.username.toUpperCase());
|
|
121
|
-
return hash.digest().
|
|
119
|
+
return hash.digest().subarray(0, 4).toString('base64');
|
|
122
120
|
}
|
|
123
121
|
static ff(...flags) {
|
|
124
122
|
let value = 0;
|
|
@@ -131,13 +129,12 @@ class CiaoAdvertiser extends events_1.EventEmitter {
|
|
|
131
129
|
return value;
|
|
132
130
|
}
|
|
133
131
|
}
|
|
134
|
-
exports.CiaoAdvertiser = CiaoAdvertiser;
|
|
135
132
|
/**
|
|
136
133
|
* Advertiser base on the legacy "bonjour-hap" library.
|
|
137
134
|
*
|
|
138
135
|
* @group Advertiser
|
|
139
136
|
*/
|
|
140
|
-
class BonjourHAPAdvertiser extends
|
|
137
|
+
export class BonjourHAPAdvertiser extends EventEmitter {
|
|
141
138
|
accessoryInfo;
|
|
142
139
|
setupHash;
|
|
143
140
|
serviceOptions;
|
|
@@ -150,36 +147,36 @@ class BonjourHAPAdvertiser extends events_1.EventEmitter {
|
|
|
150
147
|
this.accessoryInfo = accessoryInfo;
|
|
151
148
|
this.setupHash = CiaoAdvertiser.computeSetupHash(accessoryInfo);
|
|
152
149
|
this.serviceOptions = serviceOptions;
|
|
153
|
-
this.bonjour = (
|
|
150
|
+
this.bonjour = bonjour();
|
|
154
151
|
debug(`Preparing Advertiser for '${this.accessoryInfo.displayName}' using bonjour-hap backend!`);
|
|
155
152
|
}
|
|
156
153
|
initPort(port) {
|
|
157
154
|
this.port = port;
|
|
158
155
|
}
|
|
159
156
|
startAdvertising() {
|
|
160
|
-
(
|
|
157
|
+
assert(!this.destroyed, 'Can\'t advertise on a destroyed bonjour instance!');
|
|
161
158
|
if (this.port == null) {
|
|
162
|
-
throw new Error(
|
|
159
|
+
throw new Error('Tried starting bonjour-hap advertisement without initializing port!');
|
|
163
160
|
}
|
|
164
161
|
debug(`Starting to advertise '${this.accessoryInfo.displayName}' using bonjour-hap backend!`);
|
|
165
162
|
if (this.advertisement) {
|
|
166
163
|
this.destroy();
|
|
167
164
|
}
|
|
168
|
-
const hostname = this.accessoryInfo.username.replace(/:/
|
|
165
|
+
const hostname = `${this.accessoryInfo.username.replace(/:/g, '_')}.local`;
|
|
169
166
|
this.advertisement = this.bonjour.publish({
|
|
170
167
|
name: this.accessoryInfo.displayName,
|
|
171
|
-
type:
|
|
168
|
+
type: 'hap',
|
|
172
169
|
port: this.port,
|
|
173
170
|
txt: CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash),
|
|
174
171
|
host: hostname,
|
|
175
172
|
addUnsafeServiceEnumerationRecord: true,
|
|
176
173
|
...this.serviceOptions,
|
|
177
174
|
});
|
|
178
|
-
return
|
|
175
|
+
return PromiseTimeout(1);
|
|
179
176
|
}
|
|
180
177
|
updateAdvertisement(silent) {
|
|
181
178
|
const txt = CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash);
|
|
182
|
-
debug(
|
|
179
|
+
debug('Updating txt record (txt: %o, silent: %d)', txt, silent);
|
|
183
180
|
if (this.advertisement) {
|
|
184
181
|
this.advertisement.updateTxt(txt, silent);
|
|
185
182
|
}
|
|
@@ -197,32 +194,34 @@ class BonjourHAPAdvertiser extends events_1.EventEmitter {
|
|
|
197
194
|
}
|
|
198
195
|
}
|
|
199
196
|
}
|
|
200
|
-
exports.BonjourHAPAdvertiser = BonjourHAPAdvertiser;
|
|
201
197
|
function messageBusConnectionResult(bus) {
|
|
202
198
|
return new Promise((resolve, reject) => {
|
|
199
|
+
debug('Waiting for connection to message bus...');
|
|
203
200
|
const errorHandler = (error) => {
|
|
204
|
-
|
|
205
|
-
|
|
201
|
+
debug('Failed to connect to message bus: %s', error);
|
|
202
|
+
// eslint-disable-next-line ts/no-use-before-define
|
|
203
|
+
bus.connection.removeListener('connect', connectHandler);
|
|
206
204
|
reject(error);
|
|
207
205
|
};
|
|
208
206
|
const connectHandler = () => {
|
|
209
|
-
|
|
207
|
+
debug('Connected to message bus!');
|
|
208
|
+
bus.connection.removeListener('error', errorHandler);
|
|
210
209
|
resolve();
|
|
211
210
|
};
|
|
212
|
-
bus.connection.once(
|
|
213
|
-
bus.connection.once(
|
|
211
|
+
bus.connection.once('connect', connectHandler);
|
|
212
|
+
bus.connection.once('error', errorHandler);
|
|
213
|
+
debug('Listening for connection to message bus...');
|
|
214
214
|
});
|
|
215
215
|
}
|
|
216
216
|
/**
|
|
217
217
|
* @group Advertiser
|
|
218
218
|
*/
|
|
219
|
-
class DBusInvokeError extends Error {
|
|
219
|
+
export class DBusInvokeError extends Error {
|
|
220
220
|
errorName;
|
|
221
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
222
221
|
constructor(errorObject) {
|
|
223
222
|
super();
|
|
224
223
|
Object.setPrototypeOf(this, DBusInvokeError.prototype);
|
|
225
|
-
this.name =
|
|
224
|
+
this.name = 'DBusInvokeError';
|
|
226
225
|
this.errorName = errorObject.name;
|
|
227
226
|
if (Array.isArray(errorObject.message) && errorObject.message.length === 1) {
|
|
228
227
|
this.message = errorObject.message[0];
|
|
@@ -232,8 +231,6 @@ class DBusInvokeError extends Error {
|
|
|
232
231
|
}
|
|
233
232
|
}
|
|
234
233
|
}
|
|
235
|
-
exports.DBusInvokeError = DBusInvokeError;
|
|
236
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
234
|
function dbusInvoke(bus, destination, path, dbusInterface, member, others) {
|
|
238
235
|
return new Promise((resolve, reject) => {
|
|
239
236
|
const command = {
|
|
@@ -260,9 +257,9 @@ function dbusInvoke(bus, destination, path, dbusInterface, member, others) {
|
|
|
260
257
|
*
|
|
261
258
|
* @group Advertiser
|
|
262
259
|
*/
|
|
260
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
263
261
|
var AvahiServerState;
|
|
264
262
|
(function (AvahiServerState) {
|
|
265
|
-
// noinspection JSUnusedGlobalSymbols
|
|
266
263
|
AvahiServerState[AvahiServerState["INVALID"] = 0] = "INVALID";
|
|
267
264
|
AvahiServerState[AvahiServerState["REGISTERING"] = 1] = "REGISTERING";
|
|
268
265
|
AvahiServerState[AvahiServerState["RUNNING"] = 2] = "RUNNING";
|
|
@@ -278,7 +275,7 @@ var AvahiServerState;
|
|
|
278
275
|
*
|
|
279
276
|
* @group Advertiser
|
|
280
277
|
*/
|
|
281
|
-
class AvahiAdvertiser extends
|
|
278
|
+
export class AvahiAdvertiser extends EventEmitter {
|
|
282
279
|
accessoryInfo;
|
|
283
280
|
setupHash;
|
|
284
281
|
port;
|
|
@@ -291,53 +288,53 @@ class AvahiAdvertiser extends events_1.EventEmitter {
|
|
|
291
288
|
this.accessoryInfo = accessoryInfo;
|
|
292
289
|
this.setupHash = CiaoAdvertiser.computeSetupHash(accessoryInfo);
|
|
293
290
|
debug(`Preparing Advertiser for '${this.accessoryInfo.displayName}' using Avahi backend!`);
|
|
294
|
-
this.bus =
|
|
291
|
+
this.bus = systemBus();
|
|
295
292
|
this.stateChangeHandler = this.handleStateChangedEvent.bind(this);
|
|
296
293
|
}
|
|
297
294
|
createTxt() {
|
|
298
295
|
return Object
|
|
299
296
|
.entries(CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash))
|
|
300
|
-
.map((el) => Buffer.from(el[0]
|
|
297
|
+
.map((el) => Buffer.from(`${el[0]}=${el[1]}`));
|
|
301
298
|
}
|
|
302
299
|
initPort(port) {
|
|
303
300
|
this.port = port;
|
|
304
301
|
}
|
|
305
302
|
async startAdvertising() {
|
|
306
303
|
if (this.port == null) {
|
|
307
|
-
throw new Error(
|
|
304
|
+
throw new Error('Tried starting Avahi advertisement without initializing port!');
|
|
308
305
|
}
|
|
309
306
|
if (!this.bus) {
|
|
310
|
-
throw new Error(
|
|
307
|
+
throw new Error('Tried to start Avahi advertisement on a destroyed advertiser!');
|
|
311
308
|
}
|
|
312
309
|
debug(`Starting to advertise '${this.accessoryInfo.displayName}' using Avahi backend!`);
|
|
313
|
-
this.path = await AvahiAdvertiser.avahiInvoke(this.bus,
|
|
314
|
-
await AvahiAdvertiser.avahiInvoke(this.bus, this.path,
|
|
310
|
+
this.path = await AvahiAdvertiser.avahiInvoke(this.bus, '/', 'Server', 'EntryGroupNew');
|
|
311
|
+
await AvahiAdvertiser.avahiInvoke(this.bus, this.path, 'EntryGroup', 'AddService', {
|
|
315
312
|
body: [
|
|
316
313
|
-1, // interface
|
|
317
314
|
-1, // protocol
|
|
318
315
|
0, // flags
|
|
319
316
|
this.accessoryInfo.displayName, // name
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
317
|
+
'_hap._tcp', // type
|
|
318
|
+
'', // domain
|
|
319
|
+
'', // host
|
|
323
320
|
this.port, // port
|
|
324
321
|
this.createTxt(), // txt
|
|
325
322
|
],
|
|
326
|
-
signature:
|
|
323
|
+
signature: 'iiussssqaay',
|
|
327
324
|
});
|
|
328
|
-
await AvahiAdvertiser.avahiInvoke(this.bus, this.path,
|
|
325
|
+
await AvahiAdvertiser.avahiInvoke(this.bus, this.path, 'EntryGroup', 'Commit');
|
|
329
326
|
try {
|
|
330
327
|
if (!this.avahiServerInterface) {
|
|
331
|
-
this.avahiServerInterface = await AvahiAdvertiser.avahiInterface(this.bus,
|
|
332
|
-
this.avahiServerInterface.on(
|
|
328
|
+
this.avahiServerInterface = await AvahiAdvertiser.avahiInterface(this.bus, 'Server');
|
|
329
|
+
this.avahiServerInterface.on('StateChanged', this.stateChangeHandler);
|
|
333
330
|
}
|
|
334
331
|
}
|
|
335
332
|
catch (error) {
|
|
336
333
|
// We have some problem on Synology https://github.com/homebridge/HAP-NodeJS/issues/993
|
|
337
|
-
console.warn(
|
|
338
|
-
|
|
334
|
+
console.warn(`Failed to create listener for avahi-daemon server state. The system will not be notified about restarts of avahi-daemon `
|
|
335
|
+
+ `and will therefore stay undiscoverable in those instances. Error message: ${error}`);
|
|
339
336
|
if (error.stack) {
|
|
340
|
-
debug(
|
|
337
|
+
debug(`Detailed error: ${error.stack}`);
|
|
341
338
|
}
|
|
342
339
|
}
|
|
343
340
|
}
|
|
@@ -349,67 +346,67 @@ class AvahiAdvertiser extends events_1.EventEmitter {
|
|
|
349
346
|
*/
|
|
350
347
|
handleStateChangedEvent(state) {
|
|
351
348
|
if (state === 2 /* AvahiServerState.RUNNING */ && this.path) {
|
|
352
|
-
debug(
|
|
349
|
+
debug('Found Avahi daemon to have restarted!');
|
|
353
350
|
this.startAdvertising()
|
|
354
|
-
.catch(reason => console.error(
|
|
351
|
+
.catch(reason => console.error(`Could not (re-)create mDNS advertisement. The HAP-Server won't be discoverable: ${reason}`));
|
|
355
352
|
}
|
|
356
353
|
}
|
|
357
354
|
async updateAdvertisement(silent) {
|
|
358
355
|
if (!this.bus) {
|
|
359
|
-
throw new Error(
|
|
356
|
+
throw new Error('Tried to update Avahi advertisement on a destroyed advertiser!');
|
|
360
357
|
}
|
|
361
358
|
if (!this.path) {
|
|
362
|
-
debug(
|
|
359
|
+
debug('Tried to update advertisement without a valid `path`!');
|
|
363
360
|
return;
|
|
364
361
|
}
|
|
365
|
-
debug(
|
|
362
|
+
debug('Updating txt record (txt: %o, silent: %d)', CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash), silent);
|
|
366
363
|
try {
|
|
367
|
-
await AvahiAdvertiser.avahiInvoke(this.bus, this.path,
|
|
368
|
-
body: [-1, -1, 0, this.accessoryInfo.displayName,
|
|
369
|
-
signature:
|
|
364
|
+
await AvahiAdvertiser.avahiInvoke(this.bus, this.path, 'EntryGroup', 'UpdateServiceTxt', {
|
|
365
|
+
body: [-1, -1, 0, this.accessoryInfo.displayName, '_hap._tcp', '', this.createTxt()],
|
|
366
|
+
signature: 'iiusssaay',
|
|
370
367
|
});
|
|
371
368
|
}
|
|
372
369
|
catch (error) {
|
|
373
|
-
console.error(
|
|
370
|
+
console.error(`Failed to update avahi advertisement: ${error}`);
|
|
374
371
|
}
|
|
375
372
|
}
|
|
376
373
|
async destroy() {
|
|
377
374
|
if (!this.bus) {
|
|
378
|
-
throw new Error(
|
|
375
|
+
throw new Error('Tried to destroy Avahi advertisement on a destroyed advertiser!');
|
|
379
376
|
}
|
|
380
377
|
if (this.path) {
|
|
381
378
|
try {
|
|
382
|
-
await AvahiAdvertiser.avahiInvoke(this.bus, this.path,
|
|
379
|
+
await AvahiAdvertiser.avahiInvoke(this.bus, this.path, 'EntryGroup', 'Free');
|
|
383
380
|
}
|
|
384
381
|
catch (error) {
|
|
385
382
|
// Typically, this fails if e.g. avahi service was stopped in the meantime.
|
|
386
|
-
debug(
|
|
383
|
+
debug(`Destroying Avahi advertisement failed: ${error}`);
|
|
387
384
|
}
|
|
388
385
|
this.path = undefined;
|
|
389
386
|
}
|
|
390
387
|
if (this.avahiServerInterface) {
|
|
391
|
-
this.avahiServerInterface.removeListener(
|
|
388
|
+
this.avahiServerInterface.removeListener('StateChanged', this.stateChangeHandler);
|
|
392
389
|
this.avahiServerInterface = undefined;
|
|
393
390
|
}
|
|
394
391
|
this.bus.connection.stream.destroy();
|
|
395
392
|
this.bus = undefined;
|
|
396
393
|
}
|
|
397
394
|
static async isAvailable() {
|
|
398
|
-
|
|
395
|
+
debug('Checking for Avahi/DBus availability...');
|
|
396
|
+
const bus = systemBus();
|
|
399
397
|
try {
|
|
400
398
|
try {
|
|
401
399
|
await messageBusConnectionResult(bus);
|
|
402
400
|
}
|
|
403
401
|
catch (error) {
|
|
404
|
-
debug("Avahi/DBus classified unavailable due to missing dbus interface!");
|
|
405
402
|
return false;
|
|
406
403
|
}
|
|
407
404
|
try {
|
|
408
|
-
const version = await this.avahiInvoke(bus,
|
|
409
|
-
debug(
|
|
405
|
+
const version = await this.avahiInvoke(bus, '/', 'Server', 'GetVersionString');
|
|
406
|
+
debug('Detected Avahi over DBus interface running version \'%s\'.', version);
|
|
410
407
|
}
|
|
411
408
|
catch (error) {
|
|
412
|
-
debug(
|
|
409
|
+
debug('Avahi/DBus classified unavailable due to missing avahi interface!');
|
|
413
410
|
return false;
|
|
414
411
|
}
|
|
415
412
|
return true;
|
|
@@ -418,17 +415,16 @@ class AvahiAdvertiser extends events_1.EventEmitter {
|
|
|
418
415
|
bus.connection.stream.destroy();
|
|
419
416
|
}
|
|
420
417
|
}
|
|
421
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
422
418
|
static avahiInvoke(bus, path, dbusInterface, member, others) {
|
|
423
|
-
return dbusInvoke(bus,
|
|
419
|
+
return dbusInvoke(bus, 'org.freedesktop.Avahi', path, `org.freedesktop.Avahi.${dbusInterface}`, member, others);
|
|
424
420
|
}
|
|
425
421
|
static avahiInterface(bus, dbusInterface) {
|
|
426
422
|
return new Promise((resolve, reject) => {
|
|
427
423
|
bus
|
|
428
|
-
.getService(
|
|
429
|
-
.getInterface(
|
|
424
|
+
.getService('org.freedesktop.Avahi')
|
|
425
|
+
.getInterface('/', `org.freedesktop.Avahi.${dbusInterface}`, (error, iface) => {
|
|
430
426
|
if (error || !iface) {
|
|
431
|
-
reject(error ?? new Error(
|
|
427
|
+
reject(error ?? new Error('Interface not present!'));
|
|
432
428
|
}
|
|
433
429
|
else {
|
|
434
430
|
resolve(iface);
|
|
@@ -437,11 +433,10 @@ class AvahiAdvertiser extends events_1.EventEmitter {
|
|
|
437
433
|
});
|
|
438
434
|
}
|
|
439
435
|
}
|
|
440
|
-
exports.AvahiAdvertiser = AvahiAdvertiser;
|
|
441
436
|
const RESOLVED_PERMISSIONS_ERRORS = [
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
437
|
+
'org.freedesktop.DBus.Error.AccessDenied',
|
|
438
|
+
'org.freedesktop.DBus.Error.AuthFailed',
|
|
439
|
+
'org.freedesktop.DBus.Error.InteractiveAuthorizationRequired',
|
|
445
440
|
];
|
|
446
441
|
/**
|
|
447
442
|
* Advertiser based on the systemd-resolved D-Bus library.
|
|
@@ -449,7 +444,7 @@ const RESOLVED_PERMISSIONS_ERRORS = [
|
|
|
449
444
|
*
|
|
450
445
|
* @group Advertiser
|
|
451
446
|
*/
|
|
452
|
-
class ResolvedAdvertiser extends
|
|
447
|
+
export class ResolvedAdvertiser extends EventEmitter {
|
|
453
448
|
accessoryInfo;
|
|
454
449
|
setupHash;
|
|
455
450
|
port;
|
|
@@ -459,7 +454,7 @@ class ResolvedAdvertiser extends events_1.EventEmitter {
|
|
|
459
454
|
super();
|
|
460
455
|
this.accessoryInfo = accessoryInfo;
|
|
461
456
|
this.setupHash = CiaoAdvertiser.computeSetupHash(accessoryInfo);
|
|
462
|
-
this.bus =
|
|
457
|
+
this.bus = systemBus();
|
|
463
458
|
debug(`Preparing Advertiser for '${this.accessoryInfo.displayName}' using systemd-resolved backend!`);
|
|
464
459
|
}
|
|
465
460
|
createTxt() {
|
|
@@ -472,24 +467,24 @@ class ResolvedAdvertiser extends events_1.EventEmitter {
|
|
|
472
467
|
}
|
|
473
468
|
async startAdvertising() {
|
|
474
469
|
if (this.port == null) {
|
|
475
|
-
throw new Error(
|
|
470
|
+
throw new Error('Tried starting systemd-resolved advertisement without initializing port!');
|
|
476
471
|
}
|
|
477
472
|
if (!this.bus) {
|
|
478
|
-
throw new Error(
|
|
473
|
+
throw new Error('Tried to start systemd-resolved advertisement on a destroyed advertiser!');
|
|
479
474
|
}
|
|
480
475
|
debug(`Starting to advertise '${this.accessoryInfo.displayName}' using systemd-resolved backend!`);
|
|
481
476
|
try {
|
|
482
|
-
this.path = await ResolvedAdvertiser.managerInvoke(this.bus,
|
|
477
|
+
this.path = await ResolvedAdvertiser.managerInvoke(this.bus, 'RegisterService', {
|
|
483
478
|
body: [
|
|
484
479
|
this.accessoryInfo.displayName, // name
|
|
485
480
|
this.accessoryInfo.displayName, // name_template
|
|
486
|
-
|
|
481
|
+
'_hap._tcp', // type
|
|
487
482
|
this.port, // service_port
|
|
488
483
|
0, // service_priority
|
|
489
484
|
0, // service_weight
|
|
490
485
|
[this.createTxt()], // txt_datas
|
|
491
486
|
],
|
|
492
|
-
signature:
|
|
487
|
+
signature: 'sssqqqaa{say}',
|
|
493
488
|
});
|
|
494
489
|
}
|
|
495
490
|
catch (error) {
|
|
@@ -503,76 +498,76 @@ class ResolvedAdvertiser extends events_1.EventEmitter {
|
|
|
503
498
|
}
|
|
504
499
|
async updateAdvertisement(silent) {
|
|
505
500
|
if (!this.bus) {
|
|
506
|
-
throw new Error(
|
|
501
|
+
throw new Error('Tried to update systemd-resolved advertisement on a destroyed advertiser!');
|
|
507
502
|
}
|
|
508
|
-
debug(
|
|
503
|
+
debug('Updating txt record (txt: %o, silent: %d)', CiaoAdvertiser.createTxt(this.accessoryInfo, this.setupHash), silent);
|
|
509
504
|
// Currently, systemd-resolved has no way to update an existing record.
|
|
510
505
|
await this.stopAdvertising();
|
|
511
506
|
await this.startAdvertising();
|
|
512
507
|
}
|
|
513
508
|
async stopAdvertising() {
|
|
514
509
|
if (!this.bus) {
|
|
515
|
-
throw new Error(
|
|
510
|
+
throw new Error('Tried to destroy systemd-resolved advertisement on a destroyed advertiser!');
|
|
516
511
|
}
|
|
517
512
|
if (this.path) {
|
|
518
513
|
try {
|
|
519
|
-
await ResolvedAdvertiser.managerInvoke(this.bus,
|
|
514
|
+
await ResolvedAdvertiser.managerInvoke(this.bus, 'UnregisterService', {
|
|
520
515
|
body: [this.path],
|
|
521
|
-
signature:
|
|
516
|
+
signature: 'o',
|
|
522
517
|
});
|
|
523
518
|
}
|
|
524
519
|
catch (error) {
|
|
525
520
|
// Typically, this fails if e.g. systemd-resolved service was stopped in the meantime.
|
|
526
|
-
debug(
|
|
521
|
+
debug(`Destroying systemd-resolved advertisement failed: ${error}`);
|
|
527
522
|
}
|
|
528
523
|
this.path = undefined;
|
|
529
524
|
}
|
|
530
525
|
}
|
|
531
526
|
async destroy() {
|
|
532
527
|
if (!this.bus) {
|
|
533
|
-
throw new Error(
|
|
528
|
+
throw new Error('Tried to destroy systemd-resolved advertisement on a destroyed advertiser!');
|
|
534
529
|
}
|
|
535
530
|
await this.stopAdvertising();
|
|
536
531
|
this.bus.connection.stream.destroy();
|
|
537
532
|
this.bus = undefined;
|
|
538
533
|
}
|
|
539
534
|
static async isAvailable() {
|
|
540
|
-
const bus =
|
|
535
|
+
const bus = systemBus();
|
|
541
536
|
try {
|
|
542
537
|
try {
|
|
543
538
|
await messageBusConnectionResult(bus);
|
|
544
539
|
}
|
|
545
540
|
catch (error) {
|
|
546
|
-
debug(
|
|
541
|
+
debug('systemd-resolved/DBus classified unavailable due to missing dbus interface!');
|
|
547
542
|
return false;
|
|
548
543
|
}
|
|
549
544
|
try {
|
|
550
545
|
// Ensure that systemd-resolved is accessible.
|
|
551
|
-
await this.managerInvoke(bus,
|
|
552
|
-
body: [0,
|
|
553
|
-
signature:
|
|
546
|
+
await this.managerInvoke(bus, 'ResolveHostname', {
|
|
547
|
+
body: [0, '127.0.0.1', 0, 0],
|
|
548
|
+
signature: 'isit',
|
|
554
549
|
});
|
|
555
|
-
debug(
|
|
550
|
+
debug('Detected systemd-resolved over DBus interface running version.');
|
|
556
551
|
}
|
|
557
552
|
catch (error) {
|
|
558
|
-
debug(
|
|
553
|
+
debug('systemd-resolved/DBus classified unavailable due to missing systemd-resolved interface!');
|
|
559
554
|
return false;
|
|
560
555
|
}
|
|
561
556
|
try {
|
|
562
|
-
const mdnsStatus = await this.resolvedInvoke(bus,
|
|
563
|
-
body: [
|
|
564
|
-
signature:
|
|
557
|
+
const mdnsStatus = await this.resolvedInvoke(bus, 'org.freedesktop.DBus.Properties', 'Get', {
|
|
558
|
+
body: ['org.freedesktop.resolve1.Manager', 'MulticastDNS'],
|
|
559
|
+
signature: 'ss',
|
|
565
560
|
});
|
|
566
|
-
if (mdnsStatus[0][0].type !==
|
|
567
|
-
throw new Error(
|
|
561
|
+
if (mdnsStatus[0][0].type !== 's') {
|
|
562
|
+
throw new Error('Invalid type for MulticastDNS');
|
|
568
563
|
}
|
|
569
|
-
if (mdnsStatus[1][0] !==
|
|
570
|
-
debug(
|
|
564
|
+
if (mdnsStatus[1][0] !== 'yes') {
|
|
565
|
+
debug('systemd-resolved/DBus classified unavailable because MulticastDNS is not enabled!');
|
|
571
566
|
return false;
|
|
572
567
|
}
|
|
573
568
|
}
|
|
574
569
|
catch (error) {
|
|
575
|
-
debug(
|
|
570
|
+
debug(`systemd-resolved/DBus classified unavailable due to failure checking system status: ${error}`);
|
|
576
571
|
return false;
|
|
577
572
|
}
|
|
578
573
|
return true;
|
|
@@ -581,14 +576,11 @@ class ResolvedAdvertiser extends events_1.EventEmitter {
|
|
|
581
576
|
bus.connection.stream.destroy();
|
|
582
577
|
}
|
|
583
578
|
}
|
|
584
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
585
579
|
static resolvedInvoke(bus, dbusInterface, member, others) {
|
|
586
|
-
return dbusInvoke(bus,
|
|
580
|
+
return dbusInvoke(bus, 'org.freedesktop.resolve1', '/org/freedesktop/resolve1', dbusInterface, member, others);
|
|
587
581
|
}
|
|
588
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
589
582
|
static managerInvoke(bus, member, others) {
|
|
590
|
-
return this.resolvedInvoke(bus,
|
|
583
|
+
return this.resolvedInvoke(bus, 'org.freedesktop.resolve1.Manager', member, others);
|
|
591
584
|
}
|
|
592
585
|
}
|
|
593
|
-
exports.ResolvedAdvertiser = ResolvedAdvertiser;
|
|
594
586
|
//# sourceMappingURL=Advertiser.js.map
|