@matter/protocol 0.16.0-alpha.0-20250809-ee8375bcb → 0.16.0-alpha.0-20250812-285b75d83
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/ble/BleConsts.d.ts +2 -1
- package/dist/cjs/ble/BleConsts.d.ts.map +1 -1
- package/dist/cjs/ble/BleConsts.js +3 -1
- package/dist/cjs/ble/BleConsts.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 +53 -150
- 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/protocol/ProtocolHandler.d.ts +4 -0
- package/dist/cjs/protocol/ProtocolHandler.d.ts.map +1 -1
- package/dist/cjs/protocol/ProtocolStatusMessage.d.ts +8 -4
- package/dist/cjs/protocol/ProtocolStatusMessage.d.ts.map +1 -1
- package/dist/cjs/protocol/ProtocolStatusMessage.js +23 -8
- package/dist/cjs/protocol/ProtocolStatusMessage.js.map +1 -1
- package/dist/cjs/securechannel/SecureChannelMessenger.js +2 -2
- package/dist/cjs/securechannel/SecureChannelMessenger.js.map +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts +3 -3
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -1
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js +3 -3
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.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/ble/BleConsts.d.ts +2 -1
- package/dist/esm/ble/BleConsts.d.ts.map +1 -1
- package/dist/esm/ble/BleConsts.js +3 -1
- package/dist/esm/ble/BleConsts.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 +55 -155
- 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/protocol/ProtocolHandler.d.ts +4 -0
- package/dist/esm/protocol/ProtocolHandler.d.ts.map +1 -1
- package/dist/esm/protocol/ProtocolStatusMessage.d.ts +8 -4
- package/dist/esm/protocol/ProtocolStatusMessage.d.ts.map +1 -1
- package/dist/esm/protocol/ProtocolStatusMessage.js +24 -9
- package/dist/esm/protocol/ProtocolStatusMessage.js.map +1 -1
- package/dist/esm/securechannel/SecureChannelMessenger.js +3 -3
- package/dist/esm/securechannel/SecureChannelMessenger.js.map +1 -1
- package/dist/esm/securechannel/SecureChannelProtocol.js +2 -2
- package/dist/esm/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts +3 -3
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -1
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js +3 -3
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.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 +6 -6
- 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/ble/BleConsts.ts +2 -1
- 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 +76 -198
- 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/protocol/ProtocolHandler.ts +7 -0
- package/src/protocol/ProtocolStatusMessage.ts +26 -10
- package/src/securechannel/SecureChannelMessenger.ts +3 -3
- package/src/securechannel/SecureChannelProtocol.ts +2 -2
- package/src/securechannel/SecureChannelStatusMessageSchema.ts +3 -3
- 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,68 @@
|
|
|
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
|
-
readonly #recordLastSentAsUnicastAnswer = new Map<string, number>();
|
|
66
44
|
|
|
67
|
-
readonly #
|
|
68
|
-
readonly #multicastServer: UdpMulticastServer;
|
|
69
|
-
readonly #netInterface: string | undefined;
|
|
45
|
+
readonly #socket: MdnsSocket;
|
|
70
46
|
|
|
71
|
-
constructor(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
);
|
|
75
|
-
this.#network = network;
|
|
76
|
-
this.#multicastServer = multicastServer;
|
|
77
|
-
this.#netInterface = netInterface;
|
|
47
|
+
constructor(socket: MdnsSocket) {
|
|
48
|
+
this.#socket = socket;
|
|
49
|
+
this.#observers.on(this.#socket.receipt, this.#handleMessage.bind(this));
|
|
78
50
|
}
|
|
79
51
|
|
|
80
|
-
|
|
81
|
-
return
|
|
52
|
+
get network() {
|
|
53
|
+
return this.#socket.network;
|
|
82
54
|
}
|
|
83
55
|
|
|
84
|
-
|
|
85
|
-
return
|
|
56
|
+
get supportsIpv4() {
|
|
57
|
+
return this.#socket.supportsIpv4;
|
|
86
58
|
}
|
|
87
59
|
|
|
88
|
-
|
|
89
|
-
return
|
|
60
|
+
buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
|
|
61
|
+
return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
|
|
90
62
|
}
|
|
91
63
|
|
|
92
|
-
async #
|
|
93
|
-
|
|
94
|
-
if (netInterface === undefined) return;
|
|
95
|
-
const records = await this.#records.get(netInterface);
|
|
64
|
+
async #handleMessage(message: MdnsSocket.Message) {
|
|
65
|
+
const records = await this.#records.get(message.sourceIntf);
|
|
96
66
|
|
|
97
|
-
//
|
|
67
|
+
// Ignore if we have no records for interface
|
|
98
68
|
if (records.size === 0) return;
|
|
99
69
|
|
|
100
|
-
const
|
|
101
|
-
if (message === undefined) return; // The message cannot be parsed
|
|
102
|
-
const { transactionId, messageType, queries, answers: knownAnswers } = message;
|
|
70
|
+
const { sourceIntf, sourceIp, transactionId, messageType, queries, answers: knownAnswers } = message;
|
|
103
71
|
if (messageType !== DnsMessageType.Query && messageType !== DnsMessageType.TruncatedQuery) return;
|
|
104
72
|
if (queries.length === 0) return; // No queries to answer, can happen in a TruncatedQuery, let's ignore for now
|
|
105
73
|
for (const portRecords of records.values()) {
|
|
@@ -132,54 +100,41 @@ export class MdnsServer {
|
|
|
132
100
|
let uniCastResponse = queries.filter(query => !query.uniCastResponse).length === 0;
|
|
133
101
|
const answersTimeSinceLastSent = answers.map(answer => ({
|
|
134
102
|
timeSinceLastMultiCast:
|
|
135
|
-
now -
|
|
136
|
-
|
|
137
|
-
timeSinceLastUniCast:
|
|
138
|
-
now -
|
|
139
|
-
(this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer, netInterface, remoteIp)) ??
|
|
140
|
-
0),
|
|
141
|
-
ttl: answer.ttl,
|
|
103
|
+
now - (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf)) ?? 0),
|
|
104
|
+
ttl: answer.ttl * 1000,
|
|
142
105
|
}));
|
|
143
106
|
if (
|
|
144
107
|
uniCastResponse &&
|
|
145
|
-
answersTimeSinceLastSent.some(
|
|
146
|
-
({ timeSinceLastMultiCast, ttl }) => timeSinceLastMultiCast > (ttl / 4) * 1000,
|
|
147
|
-
)
|
|
108
|
+
answersTimeSinceLastSent.some(({ timeSinceLastMultiCast, ttl }) => timeSinceLastMultiCast > ttl / 4)
|
|
148
109
|
) {
|
|
149
110
|
// If the query is for unicast response, still send as multicast if they were last sent as multicast longer then 1/4 of their ttl
|
|
150
111
|
uniCastResponse = false;
|
|
151
112
|
}
|
|
152
113
|
if (!uniCastResponse) {
|
|
153
|
-
answers = answers.filter(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
answers.forEach(answer =>
|
|
157
|
-
this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, netInterface), now),
|
|
114
|
+
answers = answers.filter(
|
|
115
|
+
(_, index) => answersTimeSinceLastSent[index].timeSinceLastMultiCast >= 900, // The last time sent as multicast was more than 900 ms ago
|
|
158
116
|
);
|
|
159
|
-
} else {
|
|
160
|
-
answers = answers.filter((_, index) => answersTimeSinceLastSent[index].timeSinceLastUniCast > 1000);
|
|
161
117
|
if (answers.length === 0) continue; // Nothing to send
|
|
162
118
|
|
|
163
119
|
answers.forEach(answer =>
|
|
164
|
-
this.#
|
|
165
|
-
this.buildDnsRecordKey(answer, netInterface, remoteIp),
|
|
166
|
-
now,
|
|
167
|
-
),
|
|
120
|
+
this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf), now),
|
|
168
121
|
);
|
|
169
122
|
}
|
|
170
123
|
|
|
171
|
-
this.#
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
124
|
+
this.#socket
|
|
125
|
+
.send(
|
|
126
|
+
{
|
|
127
|
+
messageType: DnsMessageType.Response,
|
|
128
|
+
transactionId,
|
|
129
|
+
answers,
|
|
130
|
+
additionalRecords,
|
|
131
|
+
},
|
|
132
|
+
sourceIntf,
|
|
133
|
+
uniCastResponse ? sourceIp : undefined,
|
|
134
|
+
)
|
|
135
|
+
.catch(error => {
|
|
136
|
+
logger.warn(`Failed to send mDNS response to ${sourceIp}`, error);
|
|
137
|
+
});
|
|
183
138
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
184
139
|
}
|
|
185
140
|
}
|
|
@@ -188,7 +143,7 @@ export class MdnsServer {
|
|
|
188
143
|
const answers = records.filter(({ recordType }) => recordType === DnsRecordType.PTR);
|
|
189
144
|
const additionalRecords = records.filter(({ recordType }) => recordType !== DnsRecordType.PTR);
|
|
190
145
|
|
|
191
|
-
await this.#
|
|
146
|
+
await this.#socket.send(
|
|
192
147
|
{
|
|
193
148
|
messageType: DnsMessageType.Response,
|
|
194
149
|
answers,
|
|
@@ -198,150 +153,67 @@ export class MdnsServer {
|
|
|
198
153
|
);
|
|
199
154
|
}
|
|
200
155
|
|
|
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) {
|
|
156
|
+
async broadcast(...services: string[]) {
|
|
256
157
|
await MatterAggregateError.allSettled(
|
|
257
158
|
(await this.#getMulticastInterfacesForAnnounce()).map(async ({ name: netInterface }) => {
|
|
258
159
|
const records = await this.#records.get(netInterface);
|
|
259
|
-
for (const [
|
|
260
|
-
if (
|
|
160
|
+
for (const [service, serviceRecords] of records) {
|
|
161
|
+
if (services.length && !services.includes(service)) continue;
|
|
261
162
|
|
|
262
163
|
// TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
|
|
263
|
-
await this.#announceRecordsForInterface(netInterface,
|
|
164
|
+
await this.#announceRecordsForInterface(netInterface, serviceRecords);
|
|
264
165
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
265
166
|
}
|
|
266
167
|
}),
|
|
267
|
-
"Error
|
|
168
|
+
"Error announcing MDNS messages",
|
|
268
169
|
).catch(error => logger.error(error));
|
|
269
170
|
}
|
|
270
171
|
|
|
271
|
-
async expireAnnouncements(
|
|
272
|
-
const { announcedNetPort, type, forInstance: instanceToExpire } = options ?? {};
|
|
172
|
+
async expireAnnouncements(...services: string[]) {
|
|
273
173
|
await MatterAggregateError.allSettled(
|
|
274
174
|
this.#records.keys().map(async netInterface => {
|
|
275
175
|
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;
|
|
176
|
+
for (const [service, serviceRecords] of records) {
|
|
177
|
+
if (services.length && !services.includes(service)) continue;
|
|
290
178
|
const instanceSet = new Set<string>();
|
|
291
|
-
|
|
179
|
+
serviceRecords.forEach(record => {
|
|
292
180
|
record.ttl = 0;
|
|
293
181
|
if (record.recordType === DnsRecordType.TXT) {
|
|
294
182
|
instanceSet.add(record.name);
|
|
295
183
|
}
|
|
296
184
|
});
|
|
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
185
|
|
|
312
186
|
// 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(
|
|
187
|
+
await this.#announceRecordsForInterface(netInterface, serviceRecords);
|
|
188
|
+
this.#recordsGenerator.delete(service);
|
|
315
189
|
await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
|
|
316
190
|
}
|
|
317
191
|
}),
|
|
318
192
|
"Error happened when expiring MDNS announcements",
|
|
319
193
|
).catch(error => logger.error(error));
|
|
194
|
+
await this.#resetServices();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async setRecordsGenerator(service: string, generator: MdnsServer.RecordGenerator) {
|
|
320
198
|
await this.#records.clear();
|
|
321
199
|
this.#recordLastSentAsMulticastAnswer.clear();
|
|
322
|
-
this.#
|
|
200
|
+
this.#recordsGenerator.set(service, generator);
|
|
323
201
|
}
|
|
324
202
|
|
|
325
|
-
async
|
|
326
|
-
hostPort: number,
|
|
327
|
-
type: AnnouncementType,
|
|
328
|
-
generator: (netInterface: string) => Promise<DnsRecord<any>[]>,
|
|
329
|
-
) {
|
|
203
|
+
async #resetServices() {
|
|
330
204
|
await this.#records.clear();
|
|
331
205
|
this.#recordLastSentAsMulticastAnswer.clear();
|
|
332
|
-
this.#recordLastSentAsUnicastAnswer.clear();
|
|
333
|
-
this.#recordsGenerator.set(this.buildTypePortKey(type, hostPort), generator);
|
|
334
206
|
}
|
|
335
207
|
|
|
336
208
|
async close() {
|
|
209
|
+
this.#observers.close();
|
|
337
210
|
await this.#records.close();
|
|
338
211
|
this.#recordLastSentAsMulticastAnswer.clear();
|
|
339
|
-
this.#recordLastSentAsUnicastAnswer.clear();
|
|
340
|
-
await this.#multicastServer.close();
|
|
341
212
|
}
|
|
342
213
|
|
|
343
214
|
#getMulticastInterfacesForAnnounce() {
|
|
344
|
-
|
|
215
|
+
const { netInterface } = this.#socket;
|
|
216
|
+
return netInterface === undefined ? this.network.getNetInterfaces() : [{ name: netInterface }];
|
|
345
217
|
}
|
|
346
218
|
|
|
347
219
|
#queryRecords({ name, recordType }: { name: string; recordType: DnsRecordType }, records: DnsRecord<any>[]) {
|
|
@@ -352,3 +224,9 @@ export class MdnsServer {
|
|
|
352
224
|
}
|
|
353
225
|
}
|
|
354
226
|
}
|
|
227
|
+
|
|
228
|
+
export namespace MdnsServer {
|
|
229
|
+
export interface RecordGenerator {
|
|
230
|
+
(intf: string, addrs: NetworkInterfaceDetails): DnsRecord[];
|
|
231
|
+
}
|
|
232
|
+
}
|
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 does 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
|
+
}
|