@matter/protocol 0.16.0-alpha.0-20250807-37b08c9bb → 0.16.0-alpha.0-20250810-5c91a95d2
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/cjs/advertisement/Advertisement.d.ts +119 -0
- package/dist/cjs/advertisement/Advertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/Advertisement.js +267 -0
- package/dist/cjs/advertisement/Advertisement.js.map +6 -0
- package/dist/cjs/advertisement/Advertiser.d.ts +50 -0
- package/dist/cjs/advertisement/Advertiser.d.ts.map +1 -0
- package/dist/cjs/advertisement/Advertiser.js +81 -0
- package/dist/cjs/advertisement/Advertiser.js.map +6 -0
- package/dist/cjs/advertisement/CommissioningMode.d.ts +11 -0
- package/dist/cjs/advertisement/CommissioningMode.d.ts.map +1 -0
- package/dist/cjs/advertisement/CommissioningMode.js +35 -0
- package/dist/cjs/advertisement/CommissioningMode.js.map +6 -0
- package/dist/cjs/{common/InstanceBroadcaster.d.ts → advertisement/PairingHintBitmap.d.ts} +3 -69
- package/dist/cjs/advertisement/PairingHintBitmap.d.ts.map +1 -0
- package/dist/cjs/{common/InstanceBroadcaster.js → advertisement/PairingHintBitmap.js} +5 -12
- package/dist/cjs/advertisement/PairingHintBitmap.js.map +6 -0
- package/dist/cjs/advertisement/ServiceDescription.d.ts +70 -0
- package/dist/cjs/advertisement/ServiceDescription.d.ts.map +1 -0
- package/dist/cjs/advertisement/ServiceDescription.js +61 -0
- package/dist/cjs/advertisement/ServiceDescription.js.map +6 -0
- package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts +16 -0
- package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/ble/BleAdvertisement.js +85 -0
- package/dist/cjs/advertisement/ble/BleAdvertisement.js.map +6 -0
- package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts +66 -0
- package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts.map +1 -0
- package/dist/cjs/advertisement/ble/BleAdvertiser.js +83 -0
- package/dist/cjs/advertisement/ble/BleAdvertiser.js.map +6 -0
- package/dist/cjs/advertisement/ble/index.d.ts +8 -0
- package/dist/cjs/advertisement/ble/index.d.ts.map +1 -0
- package/dist/cjs/advertisement/ble/index.js +25 -0
- package/dist/cjs/advertisement/ble/index.js.map +6 -0
- package/dist/cjs/advertisement/index.d.ts +13 -0
- package/dist/cjs/advertisement/index.d.ts.map +1 -0
- package/dist/cjs/advertisement/index.js +30 -0
- package/dist/cjs/advertisement/index.js.map +6 -0
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +21 -0
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js +104 -0
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +6 -0
- package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts +20 -0
- package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.js +70 -0
- package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.js.map +6 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertisement.d.ts +40 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertisement.js +145 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertisement.js.map +6 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts +99 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js +166 -0
- package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js.map +6 -0
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts +18 -0
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js +55 -0
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js.map +6 -0
- package/dist/cjs/advertisement/mdns/index.d.ts +11 -0
- package/dist/cjs/advertisement/mdns/index.d.ts.map +1 -0
- package/dist/cjs/advertisement/mdns/index.js +28 -0
- package/dist/cjs/advertisement/mdns/index.js.map +6 -0
- package/dist/cjs/ble/Ble.d.ts +7 -5
- package/dist/cjs/ble/Ble.d.ts.map +1 -1
- package/dist/cjs/ble/Ble.js.map +1 -1
- package/dist/cjs/codec/BtpCodec.d.ts +1 -1
- package/dist/cjs/codec/BtpCodec.d.ts.map +1 -1
- package/dist/cjs/codec/BtpCodec.js +4 -4
- package/dist/cjs/codec/BtpCodec.js.map +1 -1
- package/dist/cjs/common/Scanner.d.ts +1 -25
- package/dist/cjs/common/Scanner.d.ts.map +1 -1
- package/dist/cjs/common/Scanner.js +1 -18
- package/dist/cjs/common/Scanner.js.map +1 -1
- package/dist/cjs/common/SupportedTransportsBitmap.d.ts +33 -0
- package/dist/cjs/common/SupportedTransportsBitmap.d.ts.map +1 -0
- package/dist/cjs/common/SupportedTransportsBitmap.js +45 -0
- package/dist/cjs/common/SupportedTransportsBitmap.js.map +6 -0
- package/dist/cjs/common/index.d.ts +1 -1
- package/dist/cjs/common/index.d.ts.map +1 -1
- package/dist/cjs/common/index.js +1 -1
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/fabric/Fabric.d.ts +1 -0
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +7 -0
- package/dist/cjs/fabric/Fabric.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/{esm/mdns/MdnsScanner.d.ts → cjs/mdns/MdnsClient.d.ts} +11 -14
- package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -0
- package/dist/cjs/mdns/{MdnsScanner.js → MdnsClient.js} +35 -90
- package/dist/cjs/mdns/MdnsClient.js.map +6 -0
- package/dist/cjs/mdns/MdnsConsts.d.ts +11 -2
- package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsConsts.js +31 -4
- package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
- package/dist/cjs/mdns/MdnsServer.d.ts +13 -22
- package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsServer.js +55 -140
- package/dist/cjs/mdns/MdnsServer.js.map +2 -2
- package/dist/cjs/mdns/MdnsService.d.ts +4 -5
- package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsService.js +22 -23
- package/dist/cjs/mdns/MdnsService.js.map +1 -1
- package/dist/cjs/mdns/MdnsSocket.d.ts +32 -0
- package/dist/cjs/mdns/MdnsSocket.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsSocket.js +144 -0
- package/dist/cjs/mdns/MdnsSocket.js.map +6 -0
- package/dist/cjs/mdns/index.d.ts +2 -3
- package/dist/cjs/mdns/index.d.ts.map +1 -1
- package/dist/cjs/mdns/index.js +2 -3
- package/dist/cjs/mdns/index.js.map +1 -1
- package/dist/cjs/peer/ControllerCommissioner.js +2 -2
- package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
- package/dist/cjs/peer/ControllerDiscovery.d.ts +3 -3
- package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerDiscovery.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/peer/PeerSet.js +10 -5
- package/dist/cjs/peer/PeerSet.js.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts +23 -18
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.js +130 -129
- package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/cjs/protocol/DeviceCommissioner.d.ts +0 -1
- package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
- package/dist/cjs/protocol/DeviceCommissioner.js +44 -44
- package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +1 -1
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +6 -8
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/cjs/session/NodeSession.d.ts +1 -0
- package/dist/cjs/session/NodeSession.d.ts.map +1 -1
- package/dist/cjs/session/NodeSession.js +3 -0
- package/dist/cjs/session/NodeSession.js.map +1 -1
- package/dist/cjs/session/Session.d.ts +3 -33
- package/dist/cjs/session/Session.d.ts.map +1 -1
- package/dist/cjs/session/Session.js +4 -9
- package/dist/cjs/session/Session.js.map +1 -1
- package/dist/cjs/session/SessionIntervals.d.ts +36 -0
- package/dist/cjs/session/SessionIntervals.d.ts.map +1 -0
- package/dist/cjs/session/SessionIntervals.js +51 -0
- package/dist/cjs/session/SessionIntervals.js.map +6 -0
- package/dist/cjs/session/SessionManager.d.ts +1 -1
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +11 -12
- package/dist/cjs/session/SessionManager.js.map +1 -1
- package/dist/cjs/session/pase/PaseMessages.js +2 -2
- package/dist/cjs/session/pase/PaseMessages.js.map +1 -1
- package/dist/esm/advertisement/Advertisement.d.ts +119 -0
- package/dist/esm/advertisement/Advertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/Advertisement.js +247 -0
- package/dist/esm/advertisement/Advertisement.js.map +6 -0
- package/dist/esm/advertisement/Advertiser.d.ts +50 -0
- package/dist/esm/advertisement/Advertiser.d.ts.map +1 -0
- package/dist/esm/advertisement/Advertiser.js +61 -0
- package/dist/esm/advertisement/Advertiser.js.map +6 -0
- package/dist/esm/advertisement/CommissioningMode.d.ts +11 -0
- package/dist/esm/advertisement/CommissioningMode.d.ts.map +1 -0
- package/dist/esm/advertisement/CommissioningMode.js +15 -0
- package/dist/esm/advertisement/CommissioningMode.js.map +6 -0
- package/dist/esm/{common/InstanceBroadcaster.d.ts → advertisement/PairingHintBitmap.d.ts} +3 -69
- package/dist/esm/advertisement/PairingHintBitmap.d.ts.map +1 -0
- package/dist/esm/{common/InstanceBroadcaster.js → advertisement/PairingHintBitmap.js} +2 -9
- package/dist/esm/{common/InstanceBroadcaster.js.map → advertisement/PairingHintBitmap.js.map} +3 -3
- package/dist/esm/advertisement/ServiceDescription.d.ts +70 -0
- package/dist/esm/advertisement/ServiceDescription.d.ts.map +1 -0
- package/dist/esm/advertisement/ServiceDescription.js +41 -0
- package/dist/esm/advertisement/ServiceDescription.js.map +6 -0
- package/dist/esm/advertisement/ble/BleAdvertisement.d.ts +16 -0
- package/dist/esm/advertisement/ble/BleAdvertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/ble/BleAdvertisement.js +65 -0
- package/dist/esm/advertisement/ble/BleAdvertisement.js.map +6 -0
- package/dist/esm/advertisement/ble/BleAdvertiser.d.ts +66 -0
- package/dist/esm/advertisement/ble/BleAdvertiser.d.ts.map +1 -0
- package/dist/esm/advertisement/ble/BleAdvertiser.js +63 -0
- package/dist/esm/advertisement/ble/BleAdvertiser.js.map +6 -0
- package/dist/esm/advertisement/ble/index.d.ts +8 -0
- package/dist/esm/advertisement/ble/index.d.ts.map +1 -0
- package/dist/esm/advertisement/ble/index.js +8 -0
- package/dist/esm/advertisement/ble/index.js.map +6 -0
- package/dist/esm/advertisement/index.d.ts +13 -0
- package/dist/esm/advertisement/index.d.ts.map +1 -0
- package/dist/esm/advertisement/index.js +13 -0
- package/dist/esm/advertisement/index.js.map +6 -0
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +21 -0
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js +95 -0
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +6 -0
- package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts +20 -0
- package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js +54 -0
- package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js.map +6 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts +40 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertisement.js +125 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertisement.js.map +6 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts +99 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertiser.js +146 -0
- package/dist/esm/advertisement/mdns/MdnsAdvertiser.js.map +6 -0
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts +18 -0
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js +40 -0
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js.map +6 -0
- package/dist/esm/advertisement/mdns/index.d.ts +11 -0
- package/dist/esm/advertisement/mdns/index.d.ts.map +1 -0
- package/dist/esm/advertisement/mdns/index.js +11 -0
- package/dist/esm/advertisement/mdns/index.js.map +6 -0
- package/dist/esm/ble/Ble.d.ts +7 -5
- package/dist/esm/ble/Ble.d.ts.map +1 -1
- package/dist/esm/ble/Ble.js.map +1 -1
- package/dist/esm/codec/BtpCodec.d.ts +1 -1
- package/dist/esm/codec/BtpCodec.d.ts.map +1 -1
- package/dist/esm/codec/BtpCodec.js +4 -4
- package/dist/esm/codec/BtpCodec.js.map +1 -1
- package/dist/esm/common/Scanner.d.ts +1 -25
- package/dist/esm/common/Scanner.d.ts.map +1 -1
- package/dist/esm/common/Scanner.js +1 -18
- package/dist/esm/common/Scanner.js.map +1 -1
- package/dist/esm/common/SupportedTransportsBitmap.d.ts +33 -0
- package/dist/esm/common/SupportedTransportsBitmap.d.ts.map +1 -0
- package/dist/esm/common/SupportedTransportsBitmap.js +25 -0
- package/dist/esm/common/SupportedTransportsBitmap.js.map +6 -0
- package/dist/esm/common/index.d.ts +1 -1
- package/dist/esm/common/index.d.ts.map +1 -1
- package/dist/esm/common/index.js +1 -1
- package/dist/esm/fabric/Fabric.d.ts +1 -0
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +7 -0
- package/dist/esm/fabric/Fabric.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/{cjs/mdns/MdnsScanner.d.ts → esm/mdns/MdnsClient.d.ts} +11 -14
- package/dist/esm/mdns/MdnsClient.d.ts.map +1 -0
- package/dist/esm/mdns/{MdnsScanner.js → MdnsClient.js} +34 -92
- package/dist/esm/mdns/MdnsClient.js.map +6 -0
- package/dist/esm/mdns/MdnsConsts.d.ts +11 -2
- package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsConsts.js +31 -4
- package/dist/esm/mdns/MdnsConsts.js.map +1 -1
- package/dist/esm/mdns/MdnsServer.d.ts +13 -22
- package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsServer.js +57 -145
- package/dist/esm/mdns/MdnsServer.js.map +2 -2
- package/dist/esm/mdns/MdnsService.d.ts +4 -5
- package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsService.js +22 -24
- package/dist/esm/mdns/MdnsService.js.map +1 -1
- package/dist/esm/mdns/MdnsSocket.d.ts +32 -0
- package/dist/esm/mdns/MdnsSocket.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsSocket.js +133 -0
- package/dist/esm/mdns/MdnsSocket.js.map +6 -0
- package/dist/esm/mdns/index.d.ts +2 -3
- package/dist/esm/mdns/index.d.ts.map +1 -1
- package/dist/esm/mdns/index.js +2 -3
- package/dist/esm/mdns/index.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioner.js +2 -2
- package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
- package/dist/esm/peer/ControllerDiscovery.d.ts +3 -3
- package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -1
- package/dist/esm/peer/ControllerDiscovery.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/peer/PeerSet.js +10 -5
- package/dist/esm/peer/PeerSet.js.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.d.ts +23 -18
- package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.js +131 -139
- package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/esm/protocol/DeviceCommissioner.d.ts +0 -1
- package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
- package/dist/esm/protocol/DeviceCommissioner.js +47 -47
- package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +1 -1
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +6 -12
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/session/NodeSession.d.ts +1 -0
- package/dist/esm/session/NodeSession.d.ts.map +1 -1
- package/dist/esm/session/NodeSession.js +3 -0
- package/dist/esm/session/NodeSession.js.map +1 -1
- package/dist/esm/session/Session.d.ts +3 -33
- package/dist/esm/session/Session.d.ts.map +1 -1
- package/dist/esm/session/Session.js +4 -9
- package/dist/esm/session/Session.js.map +1 -1
- package/dist/esm/session/SessionIntervals.d.ts +36 -0
- package/dist/esm/session/SessionIntervals.d.ts.map +1 -0
- package/dist/esm/session/SessionIntervals.js +31 -0
- package/dist/esm/session/SessionIntervals.js.map +6 -0
- package/dist/esm/session/SessionManager.d.ts +1 -1
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +10 -14
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/pase/PaseMessages.js +1 -1
- package/package.json +9 -9
- package/src/advertisement/Advertisement.ts +348 -0
- package/src/advertisement/Advertiser.ts +83 -0
- package/src/advertisement/CommissioningMode.ts +11 -0
- package/src/{common/InstanceBroadcaster.ts → advertisement/PairingHintBitmap.ts} +1 -92
- package/src/advertisement/ServiceDescription.ts +110 -0
- package/src/advertisement/ble/BleAdvertisement.ts +90 -0
- package/src/advertisement/ble/BleAdvertiser.ts +116 -0
- package/src/advertisement/ble/index.ts +8 -0
- package/src/advertisement/index.ts +13 -0
- package/src/advertisement/mdns/CommissionableMdnsAdvertisement.ts +118 -0
- package/src/advertisement/mdns/CommissionerMdnsAdvertisement.ts +73 -0
- package/src/advertisement/mdns/MdnsAdvertisement.ts +167 -0
- package/src/advertisement/mdns/MdnsAdvertiser.ts +248 -0
- package/src/advertisement/mdns/OperationalMdnsAdvertisement.ts +50 -0
- package/src/advertisement/mdns/index.ts +11 -0
- package/src/ble/Ble.ts +8 -5
- package/src/codec/BtpCodec.ts +4 -3
- package/src/common/Scanner.ts +1 -17
- package/src/common/SupportedTransportsBitmap.ts +25 -0
- package/src/common/index.ts +1 -1
- package/src/fabric/Fabric.ts +8 -0
- package/src/index.ts +1 -0
- package/src/mdns/{MdnsScanner.ts → MdnsClient.ts} +34 -103
- package/src/mdns/MdnsConsts.ts +27 -2
- package/src/mdns/MdnsServer.ts +79 -184
- package/src/mdns/MdnsService.ts +24 -27
- package/src/mdns/MdnsSocket.ts +179 -0
- package/src/mdns/index.ts +2 -3
- package/src/peer/ControllerCommissioner.ts +2 -2
- package/src/peer/ControllerDiscovery.ts +3 -3
- package/src/peer/PeerSet.ts +15 -9
- package/src/protocol/DeviceAdvertiser.ts +161 -151
- package/src/protocol/DeviceCommissioner.ts +65 -75
- package/src/protocol/ExchangeManager.ts +1 -1
- package/src/protocol/MessageExchange.ts +8 -14
- package/src/session/NodeSession.ts +4 -0
- package/src/session/Session.ts +6 -42
- package/src/session/SessionIntervals.ts +57 -0
- package/src/session/SessionManager.ts +9 -13
- package/src/session/pase/PaseMessages.ts +1 -1
- package/dist/cjs/common/InstanceBroadcaster.d.ts.map +0 -1
- package/dist/cjs/common/InstanceBroadcaster.js.map +0 -6
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts +0 -34
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +0 -1
- package/dist/cjs/mdns/MdnsBroadcaster.js +0 -365
- package/dist/cjs/mdns/MdnsBroadcaster.js.map +0 -6
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.js +0 -87
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.js.map +0 -6
- package/dist/cjs/mdns/MdnsScanner.d.ts.map +0 -1
- package/dist/cjs/mdns/MdnsScanner.js.map +0 -6
- package/dist/esm/common/InstanceBroadcaster.d.ts.map +0 -1
- package/dist/esm/mdns/MdnsBroadcaster.d.ts +0 -34
- package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +0 -1
- package/dist/esm/mdns/MdnsBroadcaster.js +0 -378
- package/dist/esm/mdns/MdnsBroadcaster.js.map +0 -6
- package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
- package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
- package/dist/esm/mdns/MdnsInstanceBroadcaster.js +0 -67
- package/dist/esm/mdns/MdnsInstanceBroadcaster.js.map +0 -6
- package/dist/esm/mdns/MdnsScanner.d.ts.map +0 -1
- package/dist/esm/mdns/MdnsScanner.js.map +0 -6
- package/src/mdns/MdnsBroadcaster.ts +0 -451
- package/src/mdns/MdnsInstanceBroadcaster.ts +0 -88
package/src/mdns/MdnsServer.ts
CHANGED
|
@@ -6,100 +6,69 @@
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
AsyncCache,
|
|
9
|
-
Diagnostic,
|
|
10
|
-
DnsCodec,
|
|
11
|
-
DnsMessage,
|
|
12
|
-
DnsMessagePartiallyPreEncoded,
|
|
13
9
|
DnsMessageType,
|
|
14
10
|
DnsRecord,
|
|
15
11
|
DnsRecordType,
|
|
16
12
|
isDeepEqual,
|
|
17
13
|
Logger,
|
|
18
14
|
MatterAggregateError,
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
NetworkInterfaceDetails,
|
|
16
|
+
ObserverGroup,
|
|
21
17
|
Time,
|
|
22
|
-
UdpMulticastServer,
|
|
23
18
|
} from "#general";
|
|
19
|
+
import { MdnsSocket } from "./MdnsSocket.js";
|
|
24
20
|
|
|
25
21
|
const logger = Logger.get("MdnsServer");
|
|
26
22
|
|
|
27
|
-
export const MDNS_BROADCAST_IPV4 = "224.0.0.251";
|
|
28
|
-
export const MDNS_BROADCAST_IPV6 = "ff02::fb";
|
|
29
|
-
export const MDNS_BROADCAST_PORT = 5353;
|
|
30
|
-
|
|
31
|
-
export enum AnnouncementType {
|
|
32
|
-
Commissionable,
|
|
33
|
-
Operative,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
23
|
export class MdnsServer {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return new MdnsServer(
|
|
40
|
-
network,
|
|
41
|
-
await UdpMulticastServer.create({
|
|
42
|
-
network,
|
|
43
|
-
netInterface,
|
|
44
|
-
broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
|
|
45
|
-
broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
|
|
46
|
-
listeningPort: MDNS_BROADCAST_PORT,
|
|
47
|
-
}),
|
|
48
|
-
netInterface,
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
#recordsGenerator = new Map<string, (netInterface: string) => Promise<DnsRecord<any>[]>>();
|
|
24
|
+
#observers = new ObserverGroup();
|
|
25
|
+
#recordsGenerator = new Map<string, MdnsServer.RecordGenerator>();
|
|
53
26
|
readonly #records = new AsyncCache<Map<string, DnsRecord<any>[]>>(
|
|
54
27
|
"MDNS discovery",
|
|
55
28
|
async (multicastInterface: string) => {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
29
|
+
const serviceRecords = new Map<string, DnsRecord<any>[]>();
|
|
30
|
+
const addrs = await this.network.getIpMac(multicastInterface);
|
|
31
|
+
if (addrs === undefined) {
|
|
32
|
+
return serviceRecords;
|
|
59
33
|
}
|
|
60
|
-
|
|
34
|
+
|
|
35
|
+
for (const [service, generator] of this.#recordsGenerator) {
|
|
36
|
+
serviceRecords.set(service, generator(multicastInterface, addrs));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return serviceRecords;
|
|
61
40
|
},
|
|
62
41
|
15 * 60 * 1000 /* 15mn - also matches maximum commissioning window time. */,
|
|
63
42
|
);
|
|
64
43
|
readonly #recordLastSentAsMulticastAnswer = new Map<string, number>();
|
|
65
44
|
readonly #recordLastSentAsUnicastAnswer = new Map<string, number>();
|
|
66
45
|
|
|
67
|
-
readonly #
|
|
68
|
-
readonly #multicastServer: UdpMulticastServer;
|
|
69
|
-
readonly #netInterface: string | undefined;
|
|
46
|
+
readonly #socket: MdnsSocket;
|
|
70
47
|
|
|
71
|
-
constructor(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
);
|
|
75
|
-
this.#network = network;
|
|
76
|
-
this.#multicastServer = multicastServer;
|
|
77
|
-
this.#netInterface = netInterface;
|
|
48
|
+
constructor(socket: MdnsSocket) {
|
|
49
|
+
this.#socket = socket;
|
|
50
|
+
this.#observers.on(this.#socket.receipt, this.#handleMessage.bind(this));
|
|
78
51
|
}
|
|
79
52
|
|
|
80
|
-
|
|
81
|
-
return
|
|
53
|
+
get network() {
|
|
54
|
+
return this.#socket.network;
|
|
82
55
|
}
|
|
83
56
|
|
|
84
|
-
|
|
85
|
-
return
|
|
57
|
+
get supportsIpv4() {
|
|
58
|
+
return this.#socket.supportsIpv4;
|
|
86
59
|
}
|
|
87
60
|
|
|
88
|
-
|
|
89
|
-
return
|
|
61
|
+
buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
|
|
62
|
+
return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
|
|
90
63
|
}
|
|
91
64
|
|
|
92
|
-
async #
|
|
93
|
-
|
|
94
|
-
if (netInterface === undefined) return;
|
|
95
|
-
const records = await this.#records.get(netInterface);
|
|
65
|
+
async #handleMessage(message: MdnsSocket.Message) {
|
|
66
|
+
const records = await this.#records.get(message.sourceIntf);
|
|
96
67
|
|
|
97
|
-
//
|
|
68
|
+
// Ignore if we have no records for interface
|
|
98
69
|
if (records.size === 0) return;
|
|
99
70
|
|
|
100
|
-
const
|
|
101
|
-
if (message === undefined) return; // The message cannot be parsed
|
|
102
|
-
const { transactionId, messageType, queries, answers: knownAnswers } = message;
|
|
71
|
+
const { sourceIntf, sourceIp, transactionId, messageType, queries, answers: knownAnswers } = message;
|
|
103
72
|
if (messageType !== DnsMessageType.Query && messageType !== DnsMessageType.TruncatedQuery) return;
|
|
104
73
|
if (queries.length === 0) return; // No queries to answer, can happen in a TruncatedQuery, let's ignore for now
|
|
105
74
|
for (const portRecords of records.values()) {
|
|
@@ -132,11 +101,10 @@ export class MdnsServer {
|
|
|
132
101
|
let uniCastResponse = queries.filter(query => !query.uniCastResponse).length === 0;
|
|
133
102
|
const answersTimeSinceLastSent = answers.map(answer => ({
|
|
134
103
|
timeSinceLastMultiCast:
|
|
135
|
-
now -
|
|
136
|
-
(this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, netInterface)) ?? 0),
|
|
104
|
+
now - (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf)) ?? 0),
|
|
137
105
|
timeSinceLastUniCast:
|
|
138
106
|
now -
|
|
139
|
-
(this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer,
|
|
107
|
+
(this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf, sourceIp)) ??
|
|
140
108
|
0),
|
|
141
109
|
ttl: answer.ttl,
|
|
142
110
|
}));
|
|
@@ -154,32 +122,31 @@ export class MdnsServer {
|
|
|
154
122
|
if (answers.length === 0) continue; // Nothing to send
|
|
155
123
|
|
|
156
124
|
answers.forEach(answer =>
|
|
157
|
-
this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer,
|
|
125
|
+
this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf), now),
|
|
158
126
|
);
|
|
159
127
|
} else {
|
|
160
128
|
answers = answers.filter((_, index) => answersTimeSinceLastSent[index].timeSinceLastUniCast > 1000);
|
|
161
129
|
if (answers.length === 0) continue; // Nothing to send
|
|
162
130
|
|
|
163
131
|
answers.forEach(answer =>
|
|
164
|
-
this.#recordLastSentAsUnicastAnswer.set(
|
|
165
|
-
this.buildDnsRecordKey(answer, netInterface, remoteIp),
|
|
166
|
-
now,
|
|
167
|
-
),
|
|
132
|
+
this.#recordLastSentAsUnicastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf, sourceIp), now),
|
|
168
133
|
);
|
|
169
134
|
}
|
|
170
135
|
|
|
171
|
-
this.#
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
136
|
+
this.#socket
|
|
137
|
+
.send(
|
|
138
|
+
{
|
|
139
|
+
messageType: DnsMessageType.Response,
|
|
140
|
+
transactionId,
|
|
141
|
+
answers,
|
|
142
|
+
additionalRecords,
|
|
143
|
+
},
|
|
144
|
+
sourceIntf,
|
|
145
|
+
uniCastResponse ? sourceIp : undefined,
|
|
146
|
+
)
|
|
147
|
+
.catch(error => {
|
|
148
|
+
logger.warn(`Failed to send mDNS response to ${sourceIp}`, error);
|
|
149
|
+
});
|
|
183
150
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
184
151
|
}
|
|
185
152
|
}
|
|
@@ -188,7 +155,7 @@ export class MdnsServer {
|
|
|
188
155
|
const answers = records.filter(({ recordType }) => recordType === DnsRecordType.PTR);
|
|
189
156
|
const additionalRecords = records.filter(({ recordType }) => recordType !== DnsRecordType.PTR);
|
|
190
157
|
|
|
191
|
-
await this.#
|
|
158
|
+
await this.#socket.send(
|
|
192
159
|
{
|
|
193
160
|
messageType: DnsMessageType.Response,
|
|
194
161
|
answers,
|
|
@@ -198,150 +165,72 @@ export class MdnsServer {
|
|
|
198
165
|
);
|
|
199
166
|
}
|
|
200
167
|
|
|
201
|
-
async
|
|
202
|
-
const { answers = [], additionalRecords = [] } = dnsMessageData;
|
|
203
|
-
const answersToSend = [...answers];
|
|
204
|
-
const additionalRecordsToSend = [...additionalRecords];
|
|
205
|
-
|
|
206
|
-
const dnsMessageDataToSend = {
|
|
207
|
-
...dnsMessageData,
|
|
208
|
-
answers: [],
|
|
209
|
-
additionalRecords: [],
|
|
210
|
-
} as DnsMessagePartiallyPreEncoded;
|
|
211
|
-
|
|
212
|
-
const emptyDnsMessage = DnsCodec.encode(dnsMessageDataToSend);
|
|
213
|
-
let dnsMessageSize = emptyDnsMessage.length;
|
|
214
|
-
|
|
215
|
-
while (true) {
|
|
216
|
-
if (answersToSend.length > 0) {
|
|
217
|
-
const nextAnswer = answersToSend.shift();
|
|
218
|
-
if (nextAnswer === undefined) {
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const nextAnswerEncoded = DnsCodec.encodeRecord(nextAnswer);
|
|
223
|
-
dnsMessageSize += nextAnswerEncoded.length; // Add additional record as long as size is ok
|
|
224
|
-
|
|
225
|
-
if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
226
|
-
// New answer do not fit anymore, send out the message
|
|
227
|
-
await this.#multicastServer.send(
|
|
228
|
-
DnsCodec.encode(dnsMessageDataToSend),
|
|
229
|
-
netInterface,
|
|
230
|
-
unicastTarget,
|
|
231
|
-
);
|
|
232
|
-
|
|
233
|
-
// Reset the message, length counter and included answers to count for next message
|
|
234
|
-
dnsMessageDataToSend.answers.length = 0;
|
|
235
|
-
dnsMessageSize = emptyDnsMessage.length + nextAnswerEncoded.length;
|
|
236
|
-
}
|
|
237
|
-
dnsMessageDataToSend.answers.push(nextAnswerEncoded);
|
|
238
|
-
} else {
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
for (const additionalRecord of additionalRecordsToSend) {
|
|
244
|
-
const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
|
|
245
|
-
dnsMessageSize += additionalRecordEncoded.length; // Add additional record as long as size is ok
|
|
246
|
-
if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
dnsMessageDataToSend.additionalRecords.push(additionalRecordEncoded);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
await this.#multicastServer.send(DnsCodec.encode(dnsMessageDataToSend), netInterface, unicastTarget);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async announce(announcedNetPort?: number) {
|
|
168
|
+
async broadcast(...services: string[]) {
|
|
256
169
|
await MatterAggregateError.allSettled(
|
|
257
170
|
(await this.#getMulticastInterfacesForAnnounce()).map(async ({ name: netInterface }) => {
|
|
258
171
|
const records = await this.#records.get(netInterface);
|
|
259
|
-
for (const [
|
|
260
|
-
if (
|
|
172
|
+
for (const [service, serviceRecords] of records) {
|
|
173
|
+
if (services.length && !services.includes(service)) continue;
|
|
261
174
|
|
|
262
175
|
// TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
|
|
263
|
-
await this.#announceRecordsForInterface(netInterface,
|
|
176
|
+
await this.#announceRecordsForInterface(netInterface, serviceRecords);
|
|
264
177
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
265
178
|
}
|
|
266
179
|
}),
|
|
267
|
-
"Error
|
|
180
|
+
"Error announcing MDNS messages",
|
|
268
181
|
).catch(error => logger.error(error));
|
|
269
182
|
}
|
|
270
183
|
|
|
271
|
-
async expireAnnouncements(
|
|
272
|
-
const { announcedNetPort, type, forInstance: instanceToExpire } = options ?? {};
|
|
184
|
+
async expireAnnouncements(...services: string[]) {
|
|
273
185
|
await MatterAggregateError.allSettled(
|
|
274
186
|
this.#records.keys().map(async netInterface => {
|
|
275
187
|
const records = await this.#records.get(netInterface);
|
|
276
|
-
for (const [
|
|
277
|
-
if (
|
|
278
|
-
if (
|
|
279
|
-
announcedNetPort !== undefined &&
|
|
280
|
-
type !== undefined &&
|
|
281
|
-
portType !== this.buildTypePortKey(type, announcedNetPort)
|
|
282
|
-
)
|
|
283
|
-
continue;
|
|
284
|
-
const recordsToProcess =
|
|
285
|
-
instanceToExpire !== undefined
|
|
286
|
-
? portTypeRecords.filter(
|
|
287
|
-
({ forInstance }) => forInstance !== undefined && instanceToExpire === forInstance,
|
|
288
|
-
)
|
|
289
|
-
: portTypeRecords;
|
|
188
|
+
for (const [service, serviceRecords] of records) {
|
|
189
|
+
if (services.length && !services.includes(service)) continue;
|
|
290
190
|
const instanceSet = new Set<string>();
|
|
291
|
-
|
|
191
|
+
serviceRecords.forEach(record => {
|
|
292
192
|
record.ttl = 0;
|
|
293
193
|
if (record.recordType === DnsRecordType.TXT) {
|
|
294
194
|
instanceSet.add(record.name);
|
|
295
195
|
}
|
|
296
196
|
});
|
|
297
|
-
const instanceName =
|
|
298
|
-
instanceSet.size > 1
|
|
299
|
-
? "multiple"
|
|
300
|
-
: instanceSet.size === 1
|
|
301
|
-
? Array.from(instanceSet.values())[0]
|
|
302
|
-
: "";
|
|
303
|
-
logger.debug(
|
|
304
|
-
`Expiring records`,
|
|
305
|
-
Diagnostic.dict({
|
|
306
|
-
instanceName,
|
|
307
|
-
port: announcedNetPort,
|
|
308
|
-
netInterface,
|
|
309
|
-
}),
|
|
310
|
-
);
|
|
311
197
|
|
|
312
198
|
// TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
|
|
313
|
-
await this.#announceRecordsForInterface(netInterface,
|
|
314
|
-
this.#recordsGenerator.delete(
|
|
199
|
+
await this.#announceRecordsForInterface(netInterface, serviceRecords);
|
|
200
|
+
this.#recordsGenerator.delete(service);
|
|
315
201
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
316
202
|
}
|
|
317
203
|
}),
|
|
318
204
|
"Error happened when expiring MDNS announcements",
|
|
319
205
|
).catch(error => logger.error(error));
|
|
320
|
-
await this.#
|
|
321
|
-
this.#recordLastSentAsMulticastAnswer.clear();
|
|
322
|
-
this.#recordLastSentAsUnicastAnswer.clear();
|
|
206
|
+
await this.#resetServices(services);
|
|
323
207
|
}
|
|
324
208
|
|
|
325
|
-
async setRecordsGenerator(
|
|
326
|
-
hostPort: number,
|
|
327
|
-
type: AnnouncementType,
|
|
328
|
-
generator: (netInterface: string) => Promise<DnsRecord<any>[]>,
|
|
329
|
-
) {
|
|
209
|
+
async setRecordsGenerator(service: string, generator: MdnsServer.RecordGenerator) {
|
|
330
210
|
await this.#records.clear();
|
|
331
211
|
this.#recordLastSentAsMulticastAnswer.clear();
|
|
332
212
|
this.#recordLastSentAsUnicastAnswer.clear();
|
|
333
|
-
this.#recordsGenerator.set(
|
|
213
|
+
this.#recordsGenerator.set(service, generator);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async #resetServices(services: string[]) {
|
|
217
|
+
for (const service of services) {
|
|
218
|
+
await this.#records.delete(service);
|
|
219
|
+
this.#recordLastSentAsMulticastAnswer.delete(service);
|
|
220
|
+
this.#recordLastSentAsUnicastAnswer.delete(service);
|
|
221
|
+
}
|
|
334
222
|
}
|
|
335
223
|
|
|
336
224
|
async close() {
|
|
225
|
+
this.#observers.close();
|
|
337
226
|
await this.#records.close();
|
|
338
227
|
this.#recordLastSentAsMulticastAnswer.clear();
|
|
339
228
|
this.#recordLastSentAsUnicastAnswer.clear();
|
|
340
|
-
await this.#multicastServer.close();
|
|
341
229
|
}
|
|
342
230
|
|
|
343
231
|
#getMulticastInterfacesForAnnounce() {
|
|
344
|
-
|
|
232
|
+
const { netInterface } = this.#socket;
|
|
233
|
+
return netInterface === undefined ? this.network.getNetInterfaces() : [{ name: netInterface }];
|
|
345
234
|
}
|
|
346
235
|
|
|
347
236
|
#queryRecords({ name, recordType }: { name: string; recordType: DnsRecordType }, records: DnsRecord<any>[]) {
|
|
@@ -352,3 +241,9 @@ export class MdnsServer {
|
|
|
352
241
|
}
|
|
353
242
|
}
|
|
354
243
|
}
|
|
244
|
+
|
|
245
|
+
export namespace MdnsServer {
|
|
246
|
+
export interface RecordGenerator {
|
|
247
|
+
(intf: string, addrs: NetworkInterfaceDetails): DnsRecord[];
|
|
248
|
+
}
|
|
249
|
+
}
|
package/src/mdns/MdnsService.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
Construction,
|
|
9
|
-
Crypto,
|
|
10
9
|
Diagnostic,
|
|
11
10
|
Environment,
|
|
12
11
|
Environmental,
|
|
@@ -16,14 +15,16 @@ import {
|
|
|
16
15
|
Network,
|
|
17
16
|
VariableService,
|
|
18
17
|
} from "#general";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
18
|
+
import { MdnsServer } from "../mdns/MdnsServer.js";
|
|
19
|
+
import { MdnsClient } from "./MdnsClient.js";
|
|
20
|
+
import { MdnsSocket } from "./MdnsSocket.js";
|
|
21
21
|
|
|
22
22
|
const logger = Logger.get("MDNS");
|
|
23
23
|
|
|
24
24
|
export class MdnsService {
|
|
25
|
-
#
|
|
26
|
-
#
|
|
25
|
+
#socket?: MdnsSocket;
|
|
26
|
+
#server?: MdnsServer;
|
|
27
|
+
#client?: MdnsClient;
|
|
27
28
|
#env: Environment;
|
|
28
29
|
readonly #construction: Construction<MdnsService>;
|
|
29
30
|
readonly #enableIpv4: boolean;
|
|
@@ -35,6 +36,7 @@ export class MdnsService {
|
|
|
35
36
|
|
|
36
37
|
constructor(environment: Environment, options?: MdnsService.Options) {
|
|
37
38
|
this.#env = environment;
|
|
39
|
+
const network = environment.get(Network);
|
|
38
40
|
const rootEnvironment = environment.root;
|
|
39
41
|
rootEnvironment.set(MdnsService, this);
|
|
40
42
|
rootEnvironment.runtime.add(this);
|
|
@@ -44,18 +46,13 @@ export class MdnsService {
|
|
|
44
46
|
this.limitedToNetInterface = vars.get("mdns.networkInterface", options?.networkInterface);
|
|
45
47
|
|
|
46
48
|
this.#construction = Construction(this, async () => {
|
|
47
|
-
|
|
48
|
-
const network = environment.get(Network);
|
|
49
|
-
|
|
50
|
-
this.#broadcaster = await MdnsBroadcaster.create(crypto, network, {
|
|
51
|
-
enableIpv4: this.enableIpv4,
|
|
52
|
-
multicastInterface: this.limitedToNetInterface,
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
this.#scanner = await MdnsScanner.create(network, {
|
|
49
|
+
this.#socket = await MdnsSocket.create(network, {
|
|
56
50
|
enableIpv4: this.enableIpv4,
|
|
57
51
|
netInterface: this.limitedToNetInterface,
|
|
58
52
|
});
|
|
53
|
+
|
|
54
|
+
this.#server = new MdnsServer(this.#socket);
|
|
55
|
+
this.#client = new MdnsClient(this.#socket);
|
|
59
56
|
});
|
|
60
57
|
}
|
|
61
58
|
|
|
@@ -63,16 +60,12 @@ export class MdnsService {
|
|
|
63
60
|
return new this(environment);
|
|
64
61
|
}
|
|
65
62
|
|
|
66
|
-
|
|
67
|
-
return this.
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
get broadcaster() {
|
|
71
|
-
return this.#construction.assert("MDNS service", this.#broadcaster);
|
|
63
|
+
get server() {
|
|
64
|
+
return this.#construction.assert("MDNS service", this.#server);
|
|
72
65
|
}
|
|
73
66
|
|
|
74
|
-
get
|
|
75
|
-
return this.#construction.assert("MDNS service", this.#
|
|
67
|
+
get client() {
|
|
68
|
+
return this.#construction.assert("MDNS service", this.#client);
|
|
76
69
|
}
|
|
77
70
|
|
|
78
71
|
get [Diagnostic.value]() {
|
|
@@ -87,12 +80,12 @@ export class MdnsService {
|
|
|
87
80
|
this.#env.delete(MdnsService, this);
|
|
88
81
|
|
|
89
82
|
await this.#construction.close(async () => {
|
|
90
|
-
const broadcasterDisposal = MaybePromise.then(this.#
|
|
91
|
-
logger.error("Error disposing of MDNS
|
|
83
|
+
const broadcasterDisposal = MaybePromise.then(this.#server?.close(), undefined, e =>
|
|
84
|
+
logger.error("Error disposing of MDNS server", e),
|
|
92
85
|
);
|
|
93
86
|
|
|
94
|
-
const scannerDisposal = MaybePromise.then(this.#
|
|
95
|
-
logger.error("Error disposing of MDNS
|
|
87
|
+
const scannerDisposal = MaybePromise.then(this.#client?.close(), undefined, e =>
|
|
88
|
+
logger.error("Error disposing of MDNS client", e),
|
|
96
89
|
);
|
|
97
90
|
|
|
98
91
|
await MatterAggregateError.allSettled(
|
|
@@ -100,7 +93,11 @@ export class MdnsService {
|
|
|
100
93
|
"Error disposing MDNS services",
|
|
101
94
|
).catch(error => logger.error(error));
|
|
102
95
|
|
|
103
|
-
|
|
96
|
+
if (this.#socket) {
|
|
97
|
+
await this.#socket?.close();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.#server = this.#client = undefined;
|
|
104
101
|
});
|
|
105
102
|
}
|
|
106
103
|
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
BasicObservable,
|
|
9
|
+
Diagnostic,
|
|
10
|
+
DnsCodec,
|
|
11
|
+
DnsMessage,
|
|
12
|
+
DnsMessagePartiallyPreEncoded,
|
|
13
|
+
DnsMessageType,
|
|
14
|
+
Logger,
|
|
15
|
+
MatterAggregateError,
|
|
16
|
+
MAX_MDNS_MESSAGE_SIZE,
|
|
17
|
+
MaybePromise,
|
|
18
|
+
Network,
|
|
19
|
+
UdpMulticastServer,
|
|
20
|
+
} from "#general";
|
|
21
|
+
import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsConsts.js";
|
|
22
|
+
|
|
23
|
+
const logger = Logger.get("MdnsListener");
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Manages the UDP socket for {@link MdnsServer} and {@link MdnsClient}.
|
|
27
|
+
*/
|
|
28
|
+
export class MdnsSocket {
|
|
29
|
+
#socket: UdpMulticastServer;
|
|
30
|
+
#handlers?: Set<PromiseLike<void>>;
|
|
31
|
+
#isClosed = false;
|
|
32
|
+
#receipt = new BasicObservable<[message: MdnsSocket.Message]>(
|
|
33
|
+
error => logger.error("Unhandled error in MDNS listener", error),
|
|
34
|
+
true,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
static async create(network: Network, options?: { enableIpv4?: boolean; netInterface?: string }) {
|
|
38
|
+
const { enableIpv4 = true, netInterface } = options ?? {};
|
|
39
|
+
const socket = new MdnsSocket(
|
|
40
|
+
await UdpMulticastServer.create({
|
|
41
|
+
network,
|
|
42
|
+
netInterface,
|
|
43
|
+
broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
|
|
44
|
+
broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
|
|
45
|
+
listeningPort: MDNS_BROADCAST_PORT,
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
return socket;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
constructor(socket: UdpMulticastServer) {
|
|
52
|
+
this.#socket = socket;
|
|
53
|
+
socket.onMessage(this.#handleMessage.bind(this));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get network() {
|
|
57
|
+
return this.#socket.network;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get supportsIpv4() {
|
|
61
|
+
return this.#socket.supportsIpv4;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get netInterface() {
|
|
65
|
+
return this.#socket.netInterface;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get receipt() {
|
|
69
|
+
return this.#receipt;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async send(message: Partial<DnsMessage> & { messageType: DnsMessageType }, intf?: string, unicastDest?: string) {
|
|
73
|
+
const chunk: DnsMessagePartiallyPreEncoded = {
|
|
74
|
+
transactionId: 0,
|
|
75
|
+
queries: [],
|
|
76
|
+
authorities: [],
|
|
77
|
+
|
|
78
|
+
...message,
|
|
79
|
+
|
|
80
|
+
answers: [],
|
|
81
|
+
additionalRecords: [],
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// Note - for size calculations we assume queries are relatively small. We only split answers across messages
|
|
85
|
+
let encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
86
|
+
let chunkSize = encodedChunkWithoutAnswers.length;
|
|
87
|
+
|
|
88
|
+
// Add answers, splitting message as necessary
|
|
89
|
+
for (const answer of message.answers ?? []) {
|
|
90
|
+
const answerEncoded = DnsCodec.encodeRecord(answer);
|
|
91
|
+
|
|
92
|
+
if (chunkSize + answerEncoded.length > MAX_MDNS_MESSAGE_SIZE) {
|
|
93
|
+
if (chunk.answers.length === 0) {
|
|
94
|
+
// The first answer is already too big, log at least a warning
|
|
95
|
+
logger.warn(
|
|
96
|
+
`MDNS message with ${Diagnostic.json(
|
|
97
|
+
chunk.queries,
|
|
98
|
+
)} is too big to fit into a single MDNS message. Send anyway, but please report!`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// New answer do not fit anymore, send out the message
|
|
103
|
+
await this.#send(chunk, intf, unicastDest);
|
|
104
|
+
|
|
105
|
+
// Reset the message, length counter and included answers to count for next message
|
|
106
|
+
if (chunk.queries.length) {
|
|
107
|
+
chunk.queries.length = 0;
|
|
108
|
+
encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
109
|
+
}
|
|
110
|
+
chunk.answers.length = 0;
|
|
111
|
+
chunkSize = encodedChunkWithoutAnswers.length + answerEncoded.length;
|
|
112
|
+
} else {
|
|
113
|
+
chunkSize += answerEncoded.length;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
chunk.answers.push(answerEncoded);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Add "additional records"... We include these but only if they fit
|
|
120
|
+
const additionalRecords = message.additionalRecords ?? [];
|
|
121
|
+
for (const additionalRecord of additionalRecords) {
|
|
122
|
+
const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
|
|
123
|
+
chunkSize += additionalRecordEncoded.length;
|
|
124
|
+
if (chunkSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
chunk.additionalRecords.push(additionalRecordEncoded);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
await this.#send(chunk, intf, unicastDest);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async #send(message: DnsMessagePartiallyPreEncoded, intf?: string, unicastDest?: string) {
|
|
134
|
+
await this.#socket.send(DnsCodec.encode(message), intf, unicastDest);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async close() {
|
|
138
|
+
this.#isClosed = true;
|
|
139
|
+
await this.#socket.close();
|
|
140
|
+
if (this.#handlers) {
|
|
141
|
+
await MatterAggregateError.allSettled(this.#handlers);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
#handleMessage(bytes: Uint8Array, sourceIp: string, sourceIntf: string) {
|
|
146
|
+
// Ignore if closed
|
|
147
|
+
if (this.#isClosed) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Parse
|
|
152
|
+
const parsed = DnsCodec.decode(bytes);
|
|
153
|
+
|
|
154
|
+
// Skip unparseable
|
|
155
|
+
if (parsed === undefined) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let promise = this.#receipt.emit({
|
|
160
|
+
...parsed,
|
|
161
|
+
sourceIp,
|
|
162
|
+
sourceIntf,
|
|
163
|
+
}) as MaybePromise;
|
|
164
|
+
|
|
165
|
+
if (MaybePromise.is(promise)) {
|
|
166
|
+
if (this.#handlers === undefined) {
|
|
167
|
+
this.#handlers = new Set();
|
|
168
|
+
}
|
|
169
|
+
promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise as PromiseLike<void>));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export namespace MdnsSocket {
|
|
175
|
+
export interface Message extends DnsMessage {
|
|
176
|
+
sourceIp: string;
|
|
177
|
+
sourceIntf: string;
|
|
178
|
+
}
|
|
179
|
+
}
|