@matter/protocol 0.16.0-alpha.0-20250809-ee8375bcb → 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 +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/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
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { BtpCodec } from "#codec/BtpCodec.js";
|
|
8
|
+
import { Advertisement } from "../Advertisement.js";
|
|
9
|
+
import { ServiceDescription } from "../ServiceDescription.js";
|
|
10
|
+
import type { BleAdvertiser } from "./BleAdvertiser.js";
|
|
11
|
+
|
|
12
|
+
// Period for "fast" broadcast. See core spec 5.4.2.5.3
|
|
13
|
+
const EARLY_INTERVAL_SLEEP = 30_000;
|
|
14
|
+
|
|
15
|
+
// Period for "medium" broadcast. See core spec 5.4.2.5.3
|
|
16
|
+
const LATE_INTERVAL_SLEEP = 15 * 60_000 - EARLY_INTERVAL_SLEEP;
|
|
17
|
+
|
|
18
|
+
// Period for "extended" broadcast. See core spec 5.4.2.5.3
|
|
19
|
+
const EXTENDED_INTERVAL_SLEEP = 48 * 60 * 60_000 - LATE_INTERVAL_SLEEP;
|
|
20
|
+
|
|
21
|
+
export class BleAdvertisement extends Advertisement<ServiceDescription.Commissionable> {
|
|
22
|
+
declare advertiser: BleAdvertiser;
|
|
23
|
+
|
|
24
|
+
constructor(advertiser: BleAdvertiser, description: ServiceDescription.Commissionable) {
|
|
25
|
+
super(advertiser, "ble:commissioning", description);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
protected override async run(context: Advertisement.ActivityContext) {
|
|
29
|
+
const {
|
|
30
|
+
peripheral,
|
|
31
|
+
config: { earlyInterval, lateInterval, extendedInterval },
|
|
32
|
+
} = this.advertiser;
|
|
33
|
+
|
|
34
|
+
let aad = this.advertiser.config.aad;
|
|
35
|
+
|
|
36
|
+
let timeout = this.advertiser.config.timeout;
|
|
37
|
+
|
|
38
|
+
let advertisementData = this.#encodedAdvertisement;
|
|
39
|
+
|
|
40
|
+
let isExtended = false;
|
|
41
|
+
|
|
42
|
+
const intervals = [
|
|
43
|
+
{ sleepTime: EARLY_INTERVAL_SLEEP, broadcastInterval: earlyInterval },
|
|
44
|
+
{ sleepTime: LATE_INTERVAL_SLEEP, broadcastInterval: lateInterval },
|
|
45
|
+
{ sleepTime: EXTENDED_INTERVAL_SLEEP, broadcastInterval: extendedInterval },
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
for (const { sleepTime, broadcastInterval } of intervals) {
|
|
50
|
+
// Recreate advertisement data for extended announcement
|
|
51
|
+
if (!isExtended && this.isPrivacyMasked) {
|
|
52
|
+
isExtended = true;
|
|
53
|
+
advertisementData = this.#encodedAdvertisement;
|
|
54
|
+
aad = undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Configure BLE peripheral broadcasts at specified interval
|
|
58
|
+
await peripheral.advertise(advertisementData, aad, broadcastInterval);
|
|
59
|
+
|
|
60
|
+
// Wait for timeout at this broadcast interval
|
|
61
|
+
await context.sleep("BLE advertisement interval", Math.min(timeout, sleepTime));
|
|
62
|
+
|
|
63
|
+
timeout -= sleepTime;
|
|
64
|
+
if ((timeout -= sleepTime) <= 0) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
} finally {
|
|
69
|
+
await peripheral.stopAdvertising();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
get #encodedAdvertisement() {
|
|
74
|
+
const { discriminator, vendorId, productId } = this.description;
|
|
75
|
+
const { isPrivacyMasked: isExtendedAnnouncement } = this;
|
|
76
|
+
|
|
77
|
+
return BtpCodec.encodeBleAdvertisementData(
|
|
78
|
+
discriminator,
|
|
79
|
+
isExtendedAnnouncement ? 0 : vendorId,
|
|
80
|
+
isExtendedAnnouncement ? 0 : productId,
|
|
81
|
+
!isExtendedAnnouncement && !!this.advertiser.config.aad?.length,
|
|
82
|
+
isExtendedAnnouncement,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
isDuplicate() {
|
|
87
|
+
// We only allow a single advertisement per BLE interface
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { BlePeripheralInterface } from "#ble/Ble.js";
|
|
8
|
+
import { ImplementationError } from "#general";
|
|
9
|
+
import { DatatypeModel, FieldElement } from "#model";
|
|
10
|
+
import { MAXIMUM_COMMISSIONING_TIMEOUT_S } from "#types";
|
|
11
|
+
import { Advertisement } from "../Advertisement.js";
|
|
12
|
+
import { Advertiser } from "../Advertiser.js";
|
|
13
|
+
import { CommissioningMode } from "../CommissioningMode.js";
|
|
14
|
+
import { ServiceDescription } from "../ServiceDescription.js";
|
|
15
|
+
import { BleAdvertisement } from "./BleAdvertisement.js";
|
|
16
|
+
|
|
17
|
+
export class BleAdvertiser extends Advertiser {
|
|
18
|
+
#peripheral: BlePeripheralInterface;
|
|
19
|
+
#config: BleAdvertiser.Configuration;
|
|
20
|
+
#isClosed = false;
|
|
21
|
+
|
|
22
|
+
constructor(peripheral: BlePeripheralInterface, options?: BleAdvertiser.Options) {
|
|
23
|
+
super();
|
|
24
|
+
|
|
25
|
+
this.#peripheral = peripheral;
|
|
26
|
+
this.#config = BleAdvertiser.Configuration(options);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get peripheral() {
|
|
30
|
+
return this.#peripheral;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get config() {
|
|
34
|
+
return this.#config;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
getAdvertisement(description: ServiceDescription): Advertisement | undefined {
|
|
38
|
+
this.#assertOpen();
|
|
39
|
+
|
|
40
|
+
if (description.kind !== "commissionable" || description.mode !== CommissioningMode.Basic) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return new BleAdvertisement(this, description);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#assertOpen() {
|
|
48
|
+
if (this.#isClosed) {
|
|
49
|
+
throw new ImplementationError("Illegal operation on closed BleBroadcaster");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export namespace BleAdvertiser {
|
|
55
|
+
/**
|
|
56
|
+
* Advertisement configuration.
|
|
57
|
+
*
|
|
58
|
+
* All intervals are in milliseconds.
|
|
59
|
+
*/
|
|
60
|
+
export interface Configuration {
|
|
61
|
+
/**
|
|
62
|
+
* Additional advertisement data.
|
|
63
|
+
*/
|
|
64
|
+
readonly aad?: Uint8Array;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Advertisement timeout.
|
|
68
|
+
*/
|
|
69
|
+
readonly timeout: number;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Transmission interval for first 30 seconds.
|
|
73
|
+
*
|
|
74
|
+
* Per core spec 5.4.2.5.3 should be 20-60ms.
|
|
75
|
+
*/
|
|
76
|
+
readonly earlyInterval: number;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Transmission interval after first 30 seconds but before 15 minutes.
|
|
80
|
+
*
|
|
81
|
+
* Per core spec 5.4.2.5.3 should be 150-1285ms.
|
|
82
|
+
*/
|
|
83
|
+
readonly lateInterval: number;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Transmission interval after 15 minutes.
|
|
87
|
+
*
|
|
88
|
+
* Per core spec 5.4.2.5.3 should be ~1285ms.
|
|
89
|
+
*/
|
|
90
|
+
readonly extendedInterval: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface Options extends Partial<Configuration> {}
|
|
94
|
+
|
|
95
|
+
export function Configuration(options?: Options) {
|
|
96
|
+
return {
|
|
97
|
+
timeout: MAXIMUM_COMMISSIONING_TIMEOUT_S,
|
|
98
|
+
earlyInterval: 20,
|
|
99
|
+
lateInterval: 150,
|
|
100
|
+
extendedInterval: 1285,
|
|
101
|
+
...options,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Data model for BLE advertiser configuration.
|
|
107
|
+
*/
|
|
108
|
+
export const OptionsSchema = new DatatypeModel(
|
|
109
|
+
{ name: "BleAdvertiserOptions", type: "struct" },
|
|
110
|
+
FieldElement({ name: "add", type: "octstr" }),
|
|
111
|
+
FieldElement({ name: "timeout", type: "uint32" }),
|
|
112
|
+
FieldElement({ name: "earlyInterval", type: "uint32" }),
|
|
113
|
+
FieldElement({ name: "lateInterval", type: "uint32" }),
|
|
114
|
+
FieldElement({ name: "extendedInterval", type: "uint32" }),
|
|
115
|
+
);
|
|
116
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export * from "./Advertisement.js";
|
|
8
|
+
export * from "./Advertiser.js";
|
|
9
|
+
export * from "./ble/index.js";
|
|
10
|
+
export * from "./CommissioningMode.js";
|
|
11
|
+
export * from "./mdns/index.js";
|
|
12
|
+
export * from "./PairingHintBitmap.js";
|
|
13
|
+
export * from "./ServiceDescription.js";
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Advertisement } from "#advertisement/Advertisement.js";
|
|
8
|
+
import { PairingHintBitmapSchema } from "#advertisement/PairingHintBitmap.js";
|
|
9
|
+
import { ServiceDescription } from "#advertisement/ServiceDescription.js";
|
|
10
|
+
import { ImplementationError, PtrRecord } from "#general";
|
|
11
|
+
import {
|
|
12
|
+
DEFAULT_PAIRING_HINT,
|
|
13
|
+
getCommissionableDeviceQname,
|
|
14
|
+
getCommissioningModeQname,
|
|
15
|
+
getDeviceTypeQname,
|
|
16
|
+
getLongDiscriminatorQname,
|
|
17
|
+
getShortDiscriminatorQname,
|
|
18
|
+
getVendorQname,
|
|
19
|
+
MATTER_COMMISSION_SERVICE_QNAME,
|
|
20
|
+
PAIRING_HINTS_REQUIRING_INSTRUCTION,
|
|
21
|
+
SERVICE_DISCOVERY_QNAME,
|
|
22
|
+
} from "#mdns/MdnsConsts.js";
|
|
23
|
+
import { MdnsAdvertisement } from "./MdnsAdvertisement.js";
|
|
24
|
+
import type { MdnsAdvertiser } from "./MdnsAdvertiser.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Advertise a node as commissionable.
|
|
28
|
+
*/
|
|
29
|
+
export class CommissionableMdnsAdvertisement extends MdnsAdvertisement<ServiceDescription.Commissionable> {
|
|
30
|
+
instanceId: string;
|
|
31
|
+
|
|
32
|
+
constructor(advertiser: MdnsAdvertiser, description: ServiceDescription.Commissionable) {
|
|
33
|
+
const instanceId = advertiser.createInstanceId();
|
|
34
|
+
const qname = getCommissionableDeviceQname(instanceId);
|
|
35
|
+
|
|
36
|
+
super(advertiser, qname, description);
|
|
37
|
+
|
|
38
|
+
this.instanceId = instanceId;
|
|
39
|
+
|
|
40
|
+
this.#validatePairingInstructions();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
override get ptrRecords() {
|
|
44
|
+
const { discriminator, deviceType, vendorId } = this.description;
|
|
45
|
+
|
|
46
|
+
const shortDiscriminator = (discriminator >> 8) & 0x0f;
|
|
47
|
+
const vendorQname = getVendorQname(vendorId);
|
|
48
|
+
const deviceTypeQname = getDeviceTypeQname(deviceType);
|
|
49
|
+
const shortDiscriminatorQname = getShortDiscriminatorQname(shortDiscriminator);
|
|
50
|
+
const longDiscriminatorQname = getLongDiscriminatorQname(discriminator);
|
|
51
|
+
const commissionModeQname = getCommissioningModeQname();
|
|
52
|
+
|
|
53
|
+
const records = [
|
|
54
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, MATTER_COMMISSION_SERVICE_QNAME),
|
|
55
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, deviceTypeQname),
|
|
56
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, shortDiscriminatorQname),
|
|
57
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, longDiscriminatorQname),
|
|
58
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, commissionModeQname),
|
|
59
|
+
PtrRecord(MATTER_COMMISSION_SERVICE_QNAME, this.qname),
|
|
60
|
+
PtrRecord(deviceTypeQname, this.qname),
|
|
61
|
+
PtrRecord(shortDiscriminatorQname, this.qname),
|
|
62
|
+
PtrRecord(longDiscriminatorQname, this.qname),
|
|
63
|
+
PtrRecord(commissionModeQname, this.qname),
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
if (!this.isPrivacyMasked) {
|
|
67
|
+
records.push(PtrRecord(SERVICE_DISCOVERY_QNAME, vendorQname), PtrRecord(vendorQname, this.qname));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return records;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override get txtValues() {
|
|
74
|
+
const {
|
|
75
|
+
vendorId,
|
|
76
|
+
productId,
|
|
77
|
+
deviceType,
|
|
78
|
+
name,
|
|
79
|
+
discriminator,
|
|
80
|
+
mode,
|
|
81
|
+
pairingHint = DEFAULT_PAIRING_HINT,
|
|
82
|
+
pairingInstructions,
|
|
83
|
+
} = this.description;
|
|
84
|
+
|
|
85
|
+
const values: Record<string, unknown> = {
|
|
86
|
+
DN: name /* Device Name */,
|
|
87
|
+
DT: deviceType /* Device Type */,
|
|
88
|
+
D: discriminator /* Discriminator */,
|
|
89
|
+
CM: mode /* Commission Mode */,
|
|
90
|
+
PH: PairingHintBitmapSchema.encode(pairingHint) /* Pairing Hint */,
|
|
91
|
+
PI: pairingInstructions /* Pairing Instruction */,
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
if (!this.isPrivacyMasked) {
|
|
95
|
+
values.VP = `${vendorId}+${productId}`; /* Vendor / Product */
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return values;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
override isDuplicate(other: Advertisement) {
|
|
102
|
+
// Only one commissioning advertisement allowed per advertiser
|
|
103
|
+
return other.isCommissioning();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
#validatePairingInstructions() {
|
|
107
|
+
const { pairingHint, pairingInstructions } = this.description;
|
|
108
|
+
|
|
109
|
+
const needsInstructions =
|
|
110
|
+
pairingHint && PAIRING_HINTS_REQUIRING_INSTRUCTION.find(hint => pairingHint[hint] === true);
|
|
111
|
+
|
|
112
|
+
if (needsInstructions && !pairingInstructions) {
|
|
113
|
+
throw new ImplementationError(
|
|
114
|
+
`Pairing instructions required for pairing hint of type "${needsInstructions}"`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Advertisement } from "#advertisement/Advertisement.js";
|
|
8
|
+
import { ServiceDescription } from "#advertisement/ServiceDescription.js";
|
|
9
|
+
import { PtrRecord } from "#general";
|
|
10
|
+
import {
|
|
11
|
+
getCommissionerDeviceQname,
|
|
12
|
+
MATTER_COMMISSIONER_SERVICE_QNAME,
|
|
13
|
+
SERVICE_DISCOVERY_QNAME,
|
|
14
|
+
} from "#mdns/MdnsConsts.js";
|
|
15
|
+
import { MdnsAdvertisement } from "./MdnsAdvertisement.js";
|
|
16
|
+
import type { MdnsAdvertiser } from "./MdnsAdvertiser.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Advertise a node as a commissioner service.
|
|
20
|
+
*/
|
|
21
|
+
export class CommissionerMdnsAdvertisement extends MdnsAdvertisement<ServiceDescription.Commissioner> {
|
|
22
|
+
instanceId: string;
|
|
23
|
+
|
|
24
|
+
constructor(advertiser: MdnsAdvertiser, description: ServiceDescription.Commissioner) {
|
|
25
|
+
const instanceId = advertiser.createInstanceId();
|
|
26
|
+
const qname = getCommissionerDeviceQname(instanceId);
|
|
27
|
+
|
|
28
|
+
super(advertiser, qname, description);
|
|
29
|
+
|
|
30
|
+
this.instanceId = instanceId;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override get ptrRecords() {
|
|
34
|
+
const { deviceType, vendorId } = this.description;
|
|
35
|
+
|
|
36
|
+
const vendorQname = `_V${vendorId}._sub.${MATTER_COMMISSIONER_SERVICE_QNAME}`;
|
|
37
|
+
|
|
38
|
+
const records = [
|
|
39
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, MATTER_COMMISSIONER_SERVICE_QNAME),
|
|
40
|
+
PtrRecord(MATTER_COMMISSIONER_SERVICE_QNAME, vendorQname),
|
|
41
|
+
PtrRecord(vendorQname, this.qname),
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
if (deviceType !== undefined) {
|
|
45
|
+
const deviceTypeQname = `_T${deviceType}._sub.${MATTER_COMMISSIONER_SERVICE_QNAME}`;
|
|
46
|
+
|
|
47
|
+
records.push(PtrRecord(SERVICE_DISCOVERY_QNAME, deviceTypeQname));
|
|
48
|
+
records.push(PtrRecord(deviceTypeQname, this.qname));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return records;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
override get txtValues() {
|
|
55
|
+
const { vendorId, productId, deviceType, name: deviceName } = this.description;
|
|
56
|
+
|
|
57
|
+
const values: Record<string, unknown> = {
|
|
58
|
+
DN: deviceName /* Device Name */,
|
|
59
|
+
DT: deviceType /* Device Type */,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
if (!this.isPrivacyMasked) {
|
|
63
|
+
values.VP = `${vendorId}+${productId}`; /* Vendor / Product */
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return values;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
override isDuplicate(other: Advertisement) {
|
|
70
|
+
// Only one commissioning advertisement allowed per advertiser
|
|
71
|
+
return other.isCommissioning();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Advertisement } from "#advertisement/Advertisement.js";
|
|
8
|
+
import type { Advertiser } from "#advertisement/Advertiser.js";
|
|
9
|
+
import type { ServiceDescription } from "#advertisement/ServiceDescription.js";
|
|
10
|
+
import { SupportedTransportsSchema } from "#common/SupportedTransportsBitmap.js";
|
|
11
|
+
import { AAAARecord, ARecord, DnsRecord, Logger, NetworkInterfaceDetails, SrvRecord, Time, TxtRecord } from "#general";
|
|
12
|
+
import type { MdnsServer } from "#mdns/MdnsServer.js";
|
|
13
|
+
import { SessionIntervals } from "#session/SessionIntervals.js";
|
|
14
|
+
import type { MdnsAdvertiser } from "./MdnsAdvertiser.js";
|
|
15
|
+
|
|
16
|
+
const logger = Logger.get("MdnsAdvertisement");
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Base class for MDNS advertisements.
|
|
20
|
+
*
|
|
21
|
+
* Individual classes specialize for each type of service.
|
|
22
|
+
*/
|
|
23
|
+
export abstract class MdnsAdvertisement<T extends ServiceDescription = ServiceDescription> extends Advertisement<T> {
|
|
24
|
+
declare advertiser: MdnsAdvertiser;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The device qname.
|
|
28
|
+
*/
|
|
29
|
+
qname: string;
|
|
30
|
+
|
|
31
|
+
#isPrivacyMasked: boolean;
|
|
32
|
+
#stopAt?: number;
|
|
33
|
+
|
|
34
|
+
constructor(advertiser: MdnsAdvertiser, qname: string, description: T) {
|
|
35
|
+
description = {
|
|
36
|
+
...description,
|
|
37
|
+
...SessionIntervals(description),
|
|
38
|
+
};
|
|
39
|
+
super(advertiser, `mdns:${qname}`, description, { omitPrivateDetails: advertiser.omitPrivateDetails });
|
|
40
|
+
this.qname = qname;
|
|
41
|
+
this.#isPrivacyMasked = this.isPrivacyMasked;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected abstract ptrRecords: DnsRecord[];
|
|
45
|
+
|
|
46
|
+
protected get txtValues(): Record<string, unknown> {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
override async run(context: Advertisement.ActivityContext, event: Advertiser.BroadcastEvent = "startup") {
|
|
51
|
+
this.#stopAt = undefined;
|
|
52
|
+
let number = 0;
|
|
53
|
+
for (const retryInterval of this.advertiser.broadcastScheduleFor(this, event)) {
|
|
54
|
+
if (this.#stopAt !== undefined && this.#stopAt <= Time.nowMs()) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
number++;
|
|
59
|
+
logger.debug("Broadcast", this.dict({ number, next: retryInterval }));
|
|
60
|
+
await this.broadcast();
|
|
61
|
+
await context.sleep("MDNS repeat", retryInterval);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Broadcast a single announcement immediately.
|
|
67
|
+
*/
|
|
68
|
+
async broadcast() {
|
|
69
|
+
if (!this.#isPrivacyMasked && this.isPrivacyMasked) {
|
|
70
|
+
this.#isPrivacyMasked = true;
|
|
71
|
+
await this.advertiser.server.setRecordsGenerator(this.service, this.#recordsGenerator);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await this.advertiser.server.broadcast(this.service);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Broadcast expiration announcement immediately.
|
|
79
|
+
*/
|
|
80
|
+
async expire() {
|
|
81
|
+
logger.info("Unpublishing", this.dict({ time: this.duration }));
|
|
82
|
+
await this.advertiser.server.expireAnnouncements(this.service);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
override serviceConnected() {
|
|
86
|
+
const { broadcastAfterConnection } = this.advertiser.broadcastConfigFor(this);
|
|
87
|
+
|
|
88
|
+
if (broadcastAfterConnection === undefined) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (broadcastAfterConnection <= 0) {
|
|
93
|
+
this.stop();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
this.#stopAt = Time.nowMs() + broadcastAfterConnection;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
override serviceDisconnected() {
|
|
101
|
+
this.start("reconnect");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
protected override async onCreate() {
|
|
105
|
+
// Use Promise.resolve() to initialize on next microtick so the constructor completes before invocation
|
|
106
|
+
await Promise.resolve().then(() => {
|
|
107
|
+
// Install the records generator. This will be used for broadcast and to respond to queries
|
|
108
|
+
logger.info("Publishing", this.dict());
|
|
109
|
+
return this.advertiser.server.setRecordsGenerator(this.service, this.#recordsGenerator);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected override async onClose() {
|
|
114
|
+
// The MDNS server doesn't currently track which answers have been sent so just expire unconditionally
|
|
115
|
+
await this.expire();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
get #recordsGenerator(): MdnsServer.RecordGenerator {
|
|
119
|
+
return (_intf, addrs) => this.#recordsFor(addrs);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
#recordsFor(addrs: NetworkInterfaceDetails) {
|
|
123
|
+
const hostname = addrs.mac.replace(/:/g, "").toUpperCase() + "0000.local";
|
|
124
|
+
|
|
125
|
+
const records: DnsRecord[] = [
|
|
126
|
+
...this.ptrRecords,
|
|
127
|
+
SrvRecord(this.qname, { priority: 0, weight: 0, port: this.advertiser.port, target: hostname }),
|
|
128
|
+
TxtRecord(
|
|
129
|
+
this.qname,
|
|
130
|
+
Object.entries(this.#txtValues)
|
|
131
|
+
.filter(([, v]) => v !== undefined)
|
|
132
|
+
.map(([k, v]) => `${k}=${v}`),
|
|
133
|
+
),
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
for (const addr of addrs.ipV6) {
|
|
137
|
+
records.push(AAAARecord(hostname, addr));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (this.advertiser.server.supportsIpv4) {
|
|
141
|
+
for (const addr of addrs.ipV4) {
|
|
142
|
+
records.push(ARecord(hostname, addr));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return records;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
get #txtValues() {
|
|
150
|
+
const values: Record<string, unknown> = {
|
|
151
|
+
SII: this.description.idleIntervalMs /* Session Idle Interval */,
|
|
152
|
+
SAI: this.description.activeIntervalMs /* Session Active Interval */,
|
|
153
|
+
SAT: this.description.activeThresholdMs /* Session Active Threshold */,
|
|
154
|
+
...this.txtValues,
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
if (this.description.tcp !== undefined) {
|
|
158
|
+
values.T = SupportedTransportsSchema.encode(this.description.tcp); /* TCP support */
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (this.description.icd !== undefined) {
|
|
162
|
+
values.ICD = this.description.icd; /* ICD support */
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return values;
|
|
166
|
+
}
|
|
167
|
+
}
|