@matter/protocol 0.11.0-alpha.0-20241005-e3e4e4a7a
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/LICENSE +201 -0
- package/dist/cjs/MatterDevice.d.ts +79 -0
- package/dist/cjs/MatterDevice.d.ts.map +1 -0
- package/dist/cjs/MatterDevice.js +253 -0
- package/dist/cjs/MatterDevice.js.map +6 -0
- package/dist/cjs/ble/Ble.d.ts +29 -0
- package/dist/cjs/ble/Ble.d.ts.map +1 -0
- package/dist/cjs/ble/Ble.js +50 -0
- package/dist/cjs/ble/Ble.js.map +6 -0
- package/dist/cjs/ble/BleConsts.d.ts +32 -0
- package/dist/cjs/ble/BleConsts.d.ts.map +1 -0
- package/dist/cjs/ble/BleConsts.js +53 -0
- package/dist/cjs/ble/BleConsts.js.map +6 -0
- package/dist/cjs/ble/BtpSessionHandler.d.ts +87 -0
- package/dist/cjs/ble/BtpSessionHandler.d.ts.map +1 -0
- package/dist/cjs/ble/BtpSessionHandler.js +432 -0
- package/dist/cjs/ble/BtpSessionHandler.js.map +6 -0
- package/dist/cjs/ble/index.d.ts +9 -0
- package/dist/cjs/ble/index.d.ts.map +1 -0
- package/dist/cjs/ble/index.js +26 -0
- package/dist/cjs/ble/index.js.map +6 -0
- package/dist/cjs/certificate/AttestationCertificateManager.d.ts +28 -0
- package/dist/cjs/certificate/AttestationCertificateManager.d.ts.map +1 -0
- package/dist/cjs/certificate/AttestationCertificateManager.js +171 -0
- package/dist/cjs/certificate/AttestationCertificateManager.js.map +6 -0
- package/dist/cjs/certificate/CertificateManager.d.ts +575 -0
- package/dist/cjs/certificate/CertificateManager.d.ts.map +1 -0
- package/dist/cjs/certificate/CertificateManager.js +810 -0
- package/dist/cjs/certificate/CertificateManager.js.map +6 -0
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +5 -0
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +1 -0
- package/dist/cjs/certificate/CertificationDeclarationManager.js +54 -0
- package/dist/cjs/certificate/CertificationDeclarationManager.js.map +6 -0
- package/dist/cjs/certificate/ChipPAAuthorities.d.ts +14 -0
- package/dist/cjs/certificate/ChipPAAuthorities.d.ts.map +1 -0
- package/dist/cjs/certificate/ChipPAAuthorities.js +57 -0
- package/dist/cjs/certificate/ChipPAAuthorities.js.map +6 -0
- package/dist/cjs/certificate/DeviceCertification.d.ts +30 -0
- package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -0
- package/dist/cjs/certificate/DeviceCertification.js +103 -0
- package/dist/cjs/certificate/DeviceCertification.js.map +6 -0
- package/dist/cjs/certificate/RootCertificateManager.d.ts +33 -0
- package/dist/cjs/certificate/RootCertificateManager.d.ts.map +1 -0
- package/dist/cjs/certificate/RootCertificateManager.js +142 -0
- package/dist/cjs/certificate/RootCertificateManager.js.map +6 -0
- package/dist/cjs/certificate/index.d.ts +12 -0
- package/dist/cjs/certificate/index.d.ts.map +1 -0
- package/dist/cjs/certificate/index.js +29 -0
- package/dist/cjs/certificate/index.js.map +6 -0
- package/dist/cjs/cluster/client/AttributeClient.d.ts +61 -0
- package/dist/cjs/cluster/client/AttributeClient.d.ts.map +1 -0
- package/dist/cjs/cluster/client/AttributeClient.js +177 -0
- package/dist/cjs/cluster/client/AttributeClient.js.map +6 -0
- package/dist/cjs/cluster/client/ClusterClient.d.ts +10 -0
- package/dist/cjs/cluster/client/ClusterClient.d.ts.map +1 -0
- package/dist/cjs/cluster/client/ClusterClient.js +281 -0
- package/dist/cjs/cluster/client/ClusterClient.js.map +6 -0
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +171 -0
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts.map +1 -0
- package/dist/cjs/cluster/client/ClusterClientTypes.js +22 -0
- package/dist/cjs/cluster/client/ClusterClientTypes.js.map +6 -0
- package/dist/cjs/cluster/client/EventClient.d.ts +41 -0
- package/dist/cjs/cluster/client/EventClient.d.ts.map +1 -0
- package/dist/cjs/cluster/client/EventClient.js +94 -0
- package/dist/cjs/cluster/client/EventClient.js.map +6 -0
- package/dist/cjs/cluster/client/index.d.ts +10 -0
- package/dist/cjs/cluster/client/index.d.ts.map +1 -0
- package/dist/cjs/cluster/client/index.js +27 -0
- package/dist/cjs/cluster/client/index.js.map +6 -0
- package/dist/cjs/cluster/index.d.ts +8 -0
- package/dist/cjs/cluster/index.d.ts.map +1 -0
- package/dist/cjs/cluster/index.js +25 -0
- package/dist/cjs/cluster/index.js.map +6 -0
- package/dist/cjs/cluster/server/AttributeServer.d.ts +307 -0
- package/dist/cjs/cluster/server/AttributeServer.d.ts.map +1 -0
- package/dist/cjs/cluster/server/AttributeServer.js +734 -0
- package/dist/cjs/cluster/server/AttributeServer.js.map +6 -0
- package/dist/cjs/cluster/server/ClusterDatasource.d.ts +16 -0
- package/dist/cjs/cluster/server/ClusterDatasource.d.ts.map +1 -0
- package/dist/cjs/cluster/server/ClusterDatasource.js +22 -0
- package/dist/cjs/cluster/server/ClusterDatasource.js.map +6 -0
- package/dist/cjs/cluster/server/ClusterServer.d.ts +40 -0
- package/dist/cjs/cluster/server/ClusterServer.d.ts.map +1 -0
- package/dist/cjs/cluster/server/ClusterServer.js +22 -0
- package/dist/cjs/cluster/server/ClusterServer.js.map +6 -0
- package/dist/cjs/cluster/server/CommandServer.d.ts +34 -0
- package/dist/cjs/cluster/server/CommandServer.d.ts.map +1 -0
- package/dist/cjs/cluster/server/CommandServer.js +76 -0
- package/dist/cjs/cluster/server/CommandServer.js.map +6 -0
- package/dist/cjs/cluster/server/EventServer.d.ts +41 -0
- package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -0
- package/dist/cjs/cluster/server/EventServer.js +149 -0
- package/dist/cjs/cluster/server/EventServer.js.map +6 -0
- package/dist/cjs/cluster/server/index.d.ts +11 -0
- package/dist/cjs/cluster/server/index.d.ts.map +1 -0
- package/dist/cjs/cluster/server/index.js +28 -0
- package/dist/cjs/cluster/server/index.js.map +6 -0
- package/dist/cjs/codec/BtpCodec.d.ts +78 -0
- package/dist/cjs/codec/BtpCodec.d.ts.map +1 -0
- package/dist/cjs/codec/BtpCodec.js +254 -0
- package/dist/cjs/codec/BtpCodec.js.map +6 -0
- package/dist/cjs/codec/MessageCodec.d.ts +63 -0
- package/dist/cjs/codec/MessageCodec.d.ts.map +1 -0
- package/dist/cjs/codec/MessageCodec.js +220 -0
- package/dist/cjs/codec/MessageCodec.js.map +6 -0
- package/dist/cjs/codec/index.d.ts +9 -0
- package/dist/cjs/codec/index.d.ts.map +1 -0
- package/dist/cjs/codec/index.js +36 -0
- package/dist/cjs/codec/index.js.map +6 -0
- package/dist/cjs/common/FailsafeContext.d.ts +79 -0
- package/dist/cjs/common/FailsafeContext.d.ts.map +1 -0
- package/dist/cjs/common/FailsafeContext.js +237 -0
- package/dist/cjs/common/FailsafeContext.js.map +6 -0
- package/dist/cjs/common/FailsafeTimer.d.ts +25 -0
- package/dist/cjs/common/FailsafeTimer.d.ts.map +1 -0
- package/dist/cjs/common/FailsafeTimer.js +91 -0
- package/dist/cjs/common/FailsafeTimer.js.map +6 -0
- package/dist/cjs/common/InstanceBroadcaster.d.ts +273 -0
- package/dist/cjs/common/InstanceBroadcaster.d.ts.map +1 -0
- package/dist/cjs/common/InstanceBroadcaster.js +139 -0
- package/dist/cjs/common/InstanceBroadcaster.js.map +6 -0
- package/dist/cjs/common/OperationalCredentialsTypes.d.ts +21 -0
- package/dist/cjs/common/OperationalCredentialsTypes.d.ts.map +1 -0
- package/dist/cjs/common/OperationalCredentialsTypes.js +45 -0
- package/dist/cjs/common/OperationalCredentialsTypes.js.map +6 -0
- package/dist/cjs/common/Scanner.d.ts +121 -0
- package/dist/cjs/common/Scanner.d.ts.map +1 -0
- package/dist/cjs/common/Scanner.js +51 -0
- package/dist/cjs/common/Scanner.js.map +6 -0
- package/dist/cjs/common/index.d.ts +12 -0
- package/dist/cjs/common/index.d.ts.map +1 -0
- package/dist/cjs/common/index.js +29 -0
- package/dist/cjs/common/index.js.map +6 -0
- package/dist/cjs/endpoint/EndpointInterface.d.ts +37 -0
- package/dist/cjs/endpoint/EndpointInterface.d.ts.map +1 -0
- package/dist/cjs/endpoint/EndpointInterface.js +22 -0
- package/dist/cjs/endpoint/EndpointInterface.js.map +6 -0
- package/dist/cjs/endpoint/EndpointStructureLogger.d.ts +31 -0
- package/dist/cjs/endpoint/EndpointStructureLogger.d.ts.map +1 -0
- package/dist/cjs/endpoint/EndpointStructureLogger.js +236 -0
- package/dist/cjs/endpoint/EndpointStructureLogger.js.map +6 -0
- package/dist/cjs/endpoint/index.d.ts +8 -0
- package/dist/cjs/endpoint/index.d.ts.map +1 -0
- package/dist/cjs/endpoint/index.js +25 -0
- package/dist/cjs/endpoint/index.js.map +6 -0
- package/dist/cjs/fabric/Fabric.d.ts +121 -0
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -0
- package/dist/cjs/fabric/Fabric.js +427 -0
- package/dist/cjs/fabric/Fabric.js.map +6 -0
- package/dist/cjs/fabric/FabricManager.d.ts +44 -0
- package/dist/cjs/fabric/FabricManager.d.ts.map +1 -0
- package/dist/cjs/fabric/FabricManager.js +209 -0
- package/dist/cjs/fabric/FabricManager.js.map +6 -0
- package/dist/cjs/fabric/index.d.ts +8 -0
- package/dist/cjs/fabric/index.d.ts.map +1 -0
- package/dist/cjs/fabric/index.js +25 -0
- package/dist/cjs/fabric/index.js.map +6 -0
- package/dist/cjs/index.d.ts +20 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/interaction/AccessControlManager.d.ts +49 -0
- package/dist/cjs/interaction/AccessControlManager.d.ts.map +1 -0
- package/dist/cjs/interaction/AccessControlManager.js +248 -0
- package/dist/cjs/interaction/AccessControlManager.js.map +6 -0
- package/dist/cjs/interaction/AttributeDataDecoder.d.ts +52 -0
- package/dist/cjs/interaction/AttributeDataDecoder.d.ts.map +1 -0
- package/dist/cjs/interaction/AttributeDataDecoder.js +185 -0
- package/dist/cjs/interaction/AttributeDataDecoder.js.map +6 -0
- package/dist/cjs/interaction/AttributeDataEncoder.d.ts +71 -0
- package/dist/cjs/interaction/AttributeDataEncoder.d.ts.map +1 -0
- package/dist/cjs/interaction/AttributeDataEncoder.js +190 -0
- package/dist/cjs/interaction/AttributeDataEncoder.js.map +6 -0
- package/dist/cjs/interaction/EventDataDecoder.d.ts +30 -0
- package/dist/cjs/interaction/EventDataDecoder.d.ts.map +1 -0
- package/dist/cjs/interaction/EventDataDecoder.js +103 -0
- package/dist/cjs/interaction/EventDataDecoder.js.map +6 -0
- package/dist/cjs/interaction/EventHandler.d.ts +42 -0
- package/dist/cjs/interaction/EventHandler.d.ts.map +1 -0
- package/dist/cjs/interaction/EventHandler.js +112 -0
- package/dist/cjs/interaction/EventHandler.js.map +6 -0
- package/dist/cjs/interaction/InteractionClient.d.ts +294 -0
- package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -0
- package/dist/cjs/interaction/InteractionClient.js +829 -0
- package/dist/cjs/interaction/InteractionClient.js.map +6 -0
- package/dist/cjs/interaction/InteractionEndpointStructure.d.ts +59 -0
- package/dist/cjs/interaction/InteractionEndpointStructure.d.ts.map +1 -0
- package/dist/cjs/interaction/InteractionEndpointStructure.js +341 -0
- package/dist/cjs/interaction/InteractionEndpointStructure.js.map +6 -0
- package/dist/cjs/interaction/InteractionMessenger.d.ts +315 -0
- package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -0
- package/dist/cjs/interaction/InteractionMessenger.js +484 -0
- package/dist/cjs/interaction/InteractionMessenger.js.map +6 -0
- package/dist/cjs/interaction/InteractionServer.d.ts +97 -0
- package/dist/cjs/interaction/InteractionServer.d.ts.map +1 -0
- package/dist/cjs/interaction/InteractionServer.js +1026 -0
- package/dist/cjs/interaction/InteractionServer.js.map +6 -0
- package/dist/cjs/interaction/ServerSubscription.d.ts +121 -0
- package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -0
- package/dist/cjs/interaction/ServerSubscription.js +672 -0
- package/dist/cjs/interaction/ServerSubscription.js.map +6 -0
- package/dist/cjs/interaction/Subscription.d.ts +44 -0
- package/dist/cjs/interaction/Subscription.d.ts.map +1 -0
- package/dist/cjs/interaction/Subscription.js +85 -0
- package/dist/cjs/interaction/Subscription.js.map +6 -0
- package/dist/cjs/interaction/SubscriptionOptions.d.ts +43 -0
- package/dist/cjs/interaction/SubscriptionOptions.d.ts.map +1 -0
- package/dist/cjs/interaction/SubscriptionOptions.js +46 -0
- package/dist/cjs/interaction/SubscriptionOptions.js.map +6 -0
- package/dist/cjs/interaction/index.d.ts +17 -0
- package/dist/cjs/interaction/index.d.ts.map +1 -0
- package/dist/cjs/interaction/index.js +34 -0
- package/dist/cjs/interaction/index.js.map +6 -0
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts +34 -0
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsBroadcaster.js +338 -0
- package/dist/cjs/mdns/MdnsBroadcaster.js.map +6 -0
- package/dist/cjs/mdns/MdnsConsts.d.ts +19 -0
- package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsConsts.js +52 -0
- package/dist/cjs/mdns/MdnsConsts.js.map +6 -0
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts +28 -0
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.js +87 -0
- package/dist/cjs/mdns/MdnsInstanceBroadcaster.js.map +6 -0
- package/dist/cjs/mdns/MdnsScanner.d.ts +79 -0
- package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsScanner.js +842 -0
- package/dist/cjs/mdns/MdnsScanner.js.map +6 -0
- package/dist/cjs/mdns/MdnsServer.d.ts +29 -0
- package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsServer.js +275 -0
- package/dist/cjs/mdns/MdnsServer.js.map +6 -0
- package/dist/cjs/mdns/MdnsService.d.ts +28 -0
- package/dist/cjs/mdns/MdnsService.d.ts.map +1 -0
- package/dist/cjs/mdns/MdnsService.js +95 -0
- package/dist/cjs/mdns/MdnsService.js.map +6 -0
- package/dist/cjs/mdns/index.d.ts +12 -0
- package/dist/cjs/mdns/index.d.ts.map +1 -0
- package/dist/cjs/mdns/index.js +29 -0
- package/dist/cjs/mdns/index.js.map +6 -0
- package/dist/cjs/package.json +10 -0
- package/dist/cjs/peer/ControllerCommissioner.d.ts +82 -0
- package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -0
- package/dist/cjs/peer/ControllerCommissioner.js +224 -0
- package/dist/cjs/peer/ControllerCommissioner.js.map +6 -0
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts +88 -0
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -0
- package/dist/cjs/peer/ControllerCommissioningFlow.js +849 -0
- package/dist/cjs/peer/ControllerCommissioningFlow.js.map +6 -0
- package/dist/cjs/peer/ControllerDiscovery.d.ts +43 -0
- package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -0
- package/dist/cjs/peer/ControllerDiscovery.js +192 -0
- package/dist/cjs/peer/ControllerDiscovery.js.map +6 -0
- package/dist/cjs/peer/OperationalPeer.d.ts +28 -0
- package/dist/cjs/peer/OperationalPeer.d.ts.map +1 -0
- package/dist/cjs/peer/OperationalPeer.js +22 -0
- package/dist/cjs/peer/OperationalPeer.js.map +6 -0
- package/dist/cjs/peer/PeerAddress.d.ts +30 -0
- package/dist/cjs/peer/PeerAddress.d.ts.map +1 -0
- package/dist/cjs/peer/PeerAddress.js +71 -0
- package/dist/cjs/peer/PeerAddress.js.map +6 -0
- package/dist/cjs/peer/PeerSet.d.ts +98 -0
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -0
- package/dist/cjs/peer/PeerSet.js +500 -0
- package/dist/cjs/peer/PeerSet.js.map +6 -0
- package/dist/cjs/peer/PeerStore.d.ts +17 -0
- package/dist/cjs/peer/PeerStore.d.ts.map +1 -0
- package/dist/cjs/peer/PeerStore.js +31 -0
- package/dist/cjs/peer/PeerStore.js.map +6 -0
- package/dist/cjs/peer/index.d.ts +13 -0
- package/dist/cjs/peer/index.d.ts.map +1 -0
- package/dist/cjs/peer/index.js +30 -0
- package/dist/cjs/peer/index.js.map +6 -0
- package/dist/cjs/protocol/ChannelManager.d.ts +30 -0
- package/dist/cjs/protocol/ChannelManager.d.ts.map +1 -0
- package/dist/cjs/protocol/ChannelManager.js +168 -0
- package/dist/cjs/protocol/ChannelManager.js.map +6 -0
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts +43 -0
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -0
- package/dist/cjs/protocol/DeviceAdvertiser.js +185 -0
- package/dist/cjs/protocol/DeviceAdvertiser.js.map +6 -0
- package/dist/cjs/protocol/DeviceCommissioner.d.ts +49 -0
- package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -0
- package/dist/cjs/protocol/DeviceCommissioner.js +198 -0
- package/dist/cjs/protocol/DeviceCommissioner.js.map +6 -0
- package/dist/cjs/protocol/ExchangeManager.d.ts +73 -0
- package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -0
- package/dist/cjs/protocol/ExchangeManager.js +407 -0
- package/dist/cjs/protocol/ExchangeManager.js.map +6 -0
- package/dist/cjs/protocol/MessageCounter.d.ts +57 -0
- package/dist/cjs/protocol/MessageCounter.d.ts.map +1 -0
- package/dist/cjs/protocol/MessageCounter.js +104 -0
- package/dist/cjs/protocol/MessageCounter.js.map +6 -0
- package/dist/cjs/protocol/MessageExchange.d.ts +84 -0
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -0
- package/dist/cjs/protocol/MessageExchange.js +508 -0
- package/dist/cjs/protocol/MessageExchange.js.map +6 -0
- package/dist/cjs/protocol/MessageReceptionState.d.ts +65 -0
- package/dist/cjs/protocol/MessageReceptionState.d.ts.map +1 -0
- package/dist/cjs/protocol/MessageReceptionState.js +173 -0
- package/dist/cjs/protocol/MessageReceptionState.js.map +6 -0
- package/dist/cjs/protocol/ProtocolHandler.d.ts +13 -0
- package/dist/cjs/protocol/ProtocolHandler.d.ts.map +1 -0
- package/dist/cjs/protocol/ProtocolHandler.js +22 -0
- package/dist/cjs/protocol/ProtocolHandler.js.map +6 -0
- package/dist/cjs/protocol/index.d.ts +14 -0
- package/dist/cjs/protocol/index.d.ts.map +1 -0
- package/dist/cjs/protocol/index.js +31 -0
- package/dist/cjs/protocol/index.js.map +6 -0
- package/dist/cjs/securechannel/SecureChannelMessenger.d.ts +53 -0
- package/dist/cjs/securechannel/SecureChannelMessenger.d.ts.map +1 -0
- package/dist/cjs/securechannel/SecureChannelMessenger.js +143 -0
- package/dist/cjs/securechannel/SecureChannelMessenger.js.map +6 -0
- package/dist/cjs/securechannel/SecureChannelProtocol.d.ts +31 -0
- package/dist/cjs/securechannel/SecureChannelProtocol.d.ts.map +1 -0
- package/dist/cjs/securechannel/SecureChannelProtocol.js +140 -0
- package/dist/cjs/securechannel/SecureChannelProtocol.js.map +6 -0
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts +23 -0
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -0
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js +53 -0
- package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js.map +6 -0
- package/dist/cjs/securechannel/index.d.ts +9 -0
- package/dist/cjs/securechannel/index.d.ts.map +1 -0
- package/dist/cjs/securechannel/index.js +26 -0
- package/dist/cjs/securechannel/index.js.map +6 -0
- package/dist/cjs/session/InsecureSession.d.ts +38 -0
- package/dist/cjs/session/InsecureSession.d.ts.map +1 -0
- package/dist/cjs/session/InsecureSession.js +95 -0
- package/dist/cjs/session/InsecureSession.js.map +6 -0
- package/dist/cjs/session/SecureSession.d.ts +81 -0
- package/dist/cjs/session/SecureSession.d.ts.map +1 -0
- package/dist/cjs/session/SecureSession.js +291 -0
- package/dist/cjs/session/SecureSession.js.map +6 -0
- package/dist/cjs/session/Session.d.ts +102 -0
- package/dist/cjs/session/Session.d.ts.map +1 -0
- package/dist/cjs/session/Session.js +141 -0
- package/dist/cjs/session/Session.js.map +6 -0
- package/dist/cjs/session/SessionManager.d.ts +132 -0
- package/dist/cjs/session/SessionManager.d.ts.map +1 -0
- package/dist/cjs/session/SessionManager.js +410 -0
- package/dist/cjs/session/SessionManager.js.map +6 -0
- package/dist/cjs/session/case/CaseClient.d.ts +18 -0
- package/dist/cjs/session/case/CaseClient.d.ts.map +1 -0
- package/dist/cjs/session/case/CaseClient.js +216 -0
- package/dist/cjs/session/case/CaseClient.js.map +6 -0
- package/dist/cjs/session/case/CaseMessages.d.ts +82 -0
- package/dist/cjs/session/case/CaseMessages.d.ts.map +1 -0
- package/dist/cjs/session/case/CaseMessages.js +97 -0
- package/dist/cjs/session/case/CaseMessages.js.map +6 -0
- package/dist/cjs/session/case/CaseMessenger.d.ts +79 -0
- package/dist/cjs/session/case/CaseMessenger.d.ts.map +1 -0
- package/dist/cjs/session/case/CaseMessenger.js +74 -0
- package/dist/cjs/session/case/CaseMessenger.js.map +6 -0
- package/dist/cjs/session/case/CaseServer.d.ts +18 -0
- package/dist/cjs/session/case/CaseServer.d.ts.map +1 -0
- package/dist/cjs/session/case/CaseServer.js +232 -0
- package/dist/cjs/session/case/CaseServer.js.map +6 -0
- package/dist/cjs/session/index.d.ts +18 -0
- package/dist/cjs/session/index.d.ts.map +1 -0
- package/dist/cjs/session/index.js +35 -0
- package/dist/cjs/session/index.js.map +6 -0
- package/dist/cjs/session/pase/PaseClient.d.ts +18 -0
- package/dist/cjs/session/pase/PaseClient.d.ts.map +1 -0
- package/dist/cjs/session/pase/PaseClient.js +101 -0
- package/dist/cjs/session/pase/PaseClient.js.map +6 -0
- package/dist/cjs/session/pase/PaseMessages.d.ts +85 -0
- package/dist/cjs/session/pase/PaseMessages.d.ts.map +1 -0
- package/dist/cjs/session/pase/PaseMessages.js +88 -0
- package/dist/cjs/session/pase/PaseMessages.js.map +6 -0
- package/dist/cjs/session/pase/PaseMessenger.d.ts +75 -0
- package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -0
- package/dist/cjs/session/pase/PaseMessenger.js +86 -0
- package/dist/cjs/session/pase/PaseMessenger.js.map +6 -0
- package/dist/cjs/session/pase/PaseServer.d.ts +29 -0
- package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -0
- package/dist/cjs/session/pase/PaseServer.js +159 -0
- package/dist/cjs/session/pase/PaseServer.js.map +6 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/MatterDevice.d.ts +79 -0
- package/dist/esm/MatterDevice.d.ts.map +1 -0
- package/dist/esm/MatterDevice.js +239 -0
- package/dist/esm/MatterDevice.js.map +6 -0
- package/dist/esm/ble/Ble.d.ts +29 -0
- package/dist/esm/ble/Ble.d.ts.map +1 -0
- package/dist/esm/ble/Ble.js +30 -0
- package/dist/esm/ble/Ble.js.map +6 -0
- package/dist/esm/ble/BleConsts.d.ts +32 -0
- package/dist/esm/ble/BleConsts.d.ts.map +1 -0
- package/dist/esm/ble/BleConsts.js +33 -0
- package/dist/esm/ble/BleConsts.js.map +6 -0
- package/dist/esm/ble/BtpSessionHandler.d.ts +87 -0
- package/dist/esm/ble/BtpSessionHandler.d.ts.map +1 -0
- package/dist/esm/ble/BtpSessionHandler.js +419 -0
- package/dist/esm/ble/BtpSessionHandler.js.map +6 -0
- package/dist/esm/ble/index.d.ts +9 -0
- package/dist/esm/ble/index.d.ts.map +1 -0
- package/dist/esm/ble/index.js +9 -0
- package/dist/esm/ble/index.js.map +6 -0
- package/dist/esm/certificate/AttestationCertificateManager.d.ts +28 -0
- package/dist/esm/certificate/AttestationCertificateManager.d.ts.map +1 -0
- package/dist/esm/certificate/AttestationCertificateManager.js +155 -0
- package/dist/esm/certificate/AttestationCertificateManager.js.map +6 -0
- package/dist/esm/certificate/CertificateManager.d.ts +575 -0
- package/dist/esm/certificate/CertificateManager.d.ts.map +1 -0
- package/dist/esm/certificate/CertificateManager.js +837 -0
- package/dist/esm/certificate/CertificateManager.js.map +6 -0
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts +5 -0
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +1 -0
- package/dist/esm/certificate/CertificationDeclarationManager.js +34 -0
- package/dist/esm/certificate/CertificationDeclarationManager.js.map +6 -0
- package/dist/esm/certificate/ChipPAAuthorities.d.ts +14 -0
- package/dist/esm/certificate/ChipPAAuthorities.d.ts.map +1 -0
- package/dist/esm/certificate/ChipPAAuthorities.js +37 -0
- package/dist/esm/certificate/ChipPAAuthorities.js.map +6 -0
- package/dist/esm/certificate/DeviceCertification.d.ts +30 -0
- package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -0
- package/dist/esm/certificate/DeviceCertification.js +83 -0
- package/dist/esm/certificate/DeviceCertification.js.map +6 -0
- package/dist/esm/certificate/RootCertificateManager.d.ts +33 -0
- package/dist/esm/certificate/RootCertificateManager.d.ts.map +1 -0
- package/dist/esm/certificate/RootCertificateManager.js +139 -0
- package/dist/esm/certificate/RootCertificateManager.js.map +6 -0
- package/dist/esm/certificate/index.d.ts +12 -0
- package/dist/esm/certificate/index.d.ts.map +1 -0
- package/dist/esm/certificate/index.js +12 -0
- package/dist/esm/certificate/index.js.map +6 -0
- package/dist/esm/cluster/client/AttributeClient.d.ts +61 -0
- package/dist/esm/cluster/client/AttributeClient.d.ts.map +1 -0
- package/dist/esm/cluster/client/AttributeClient.js +157 -0
- package/dist/esm/cluster/client/AttributeClient.js.map +6 -0
- package/dist/esm/cluster/client/ClusterClient.d.ts +10 -0
- package/dist/esm/cluster/client/ClusterClient.d.ts.map +1 -0
- package/dist/esm/cluster/client/ClusterClient.js +267 -0
- package/dist/esm/cluster/client/ClusterClient.js.map +6 -0
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts +171 -0
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts.map +1 -0
- package/dist/esm/cluster/client/ClusterClientTypes.js +6 -0
- package/dist/esm/cluster/client/ClusterClientTypes.js.map +6 -0
- package/dist/esm/cluster/client/EventClient.d.ts +41 -0
- package/dist/esm/cluster/client/EventClient.d.ts.map +1 -0
- package/dist/esm/cluster/client/EventClient.js +74 -0
- package/dist/esm/cluster/client/EventClient.js.map +6 -0
- package/dist/esm/cluster/client/index.d.ts +10 -0
- package/dist/esm/cluster/client/index.d.ts.map +1 -0
- package/dist/esm/cluster/client/index.js +10 -0
- package/dist/esm/cluster/client/index.js.map +6 -0
- package/dist/esm/cluster/index.d.ts +8 -0
- package/dist/esm/cluster/index.d.ts.map +1 -0
- package/dist/esm/cluster/index.js +8 -0
- package/dist/esm/cluster/index.js.map +6 -0
- package/dist/esm/cluster/server/AttributeServer.d.ts +307 -0
- package/dist/esm/cluster/server/AttributeServer.d.ts.map +1 -0
- package/dist/esm/cluster/server/AttributeServer.js +718 -0
- package/dist/esm/cluster/server/AttributeServer.js.map +6 -0
- package/dist/esm/cluster/server/ClusterDatasource.d.ts +16 -0
- package/dist/esm/cluster/server/ClusterDatasource.d.ts.map +1 -0
- package/dist/esm/cluster/server/ClusterDatasource.js +6 -0
- package/dist/esm/cluster/server/ClusterDatasource.js.map +6 -0
- package/dist/esm/cluster/server/ClusterServer.d.ts +40 -0
- package/dist/esm/cluster/server/ClusterServer.d.ts.map +1 -0
- package/dist/esm/cluster/server/ClusterServer.js +6 -0
- package/dist/esm/cluster/server/ClusterServer.js.map +6 -0
- package/dist/esm/cluster/server/CommandServer.d.ts +34 -0
- package/dist/esm/cluster/server/CommandServer.d.ts.map +1 -0
- package/dist/esm/cluster/server/CommandServer.js +56 -0
- package/dist/esm/cluster/server/CommandServer.js.map +6 -0
- package/dist/esm/cluster/server/EventServer.d.ts +41 -0
- package/dist/esm/cluster/server/EventServer.d.ts.map +1 -0
- package/dist/esm/cluster/server/EventServer.js +137 -0
- package/dist/esm/cluster/server/EventServer.js.map +6 -0
- package/dist/esm/cluster/server/index.d.ts +11 -0
- package/dist/esm/cluster/server/index.d.ts.map +1 -0
- package/dist/esm/cluster/server/index.js +11 -0
- package/dist/esm/cluster/server/index.js.map +6 -0
- package/dist/esm/codec/BtpCodec.d.ts +78 -0
- package/dist/esm/codec/BtpCodec.d.ts.map +1 -0
- package/dist/esm/codec/BtpCodec.js +234 -0
- package/dist/esm/codec/BtpCodec.js.map +6 -0
- package/dist/esm/codec/MessageCodec.d.ts +63 -0
- package/dist/esm/codec/MessageCodec.d.ts.map +1 -0
- package/dist/esm/codec/MessageCodec.js +200 -0
- package/dist/esm/codec/MessageCodec.js.map +6 -0
- package/dist/esm/codec/index.d.ts +9 -0
- package/dist/esm/codec/index.d.ts.map +1 -0
- package/dist/esm/codec/index.js +15 -0
- package/dist/esm/codec/index.js.map +6 -0
- package/dist/esm/common/FailsafeContext.d.ts +79 -0
- package/dist/esm/common/FailsafeContext.d.ts.map +1 -0
- package/dist/esm/common/FailsafeContext.js +217 -0
- package/dist/esm/common/FailsafeContext.js.map +6 -0
- package/dist/esm/common/FailsafeTimer.d.ts +25 -0
- package/dist/esm/common/FailsafeTimer.d.ts.map +1 -0
- package/dist/esm/common/FailsafeTimer.js +71 -0
- package/dist/esm/common/FailsafeTimer.js.map +6 -0
- package/dist/esm/common/InstanceBroadcaster.d.ts +273 -0
- package/dist/esm/common/InstanceBroadcaster.d.ts.map +1 -0
- package/dist/esm/common/InstanceBroadcaster.js +119 -0
- package/dist/esm/common/InstanceBroadcaster.js.map +6 -0
- package/dist/esm/common/OperationalCredentialsTypes.d.ts +21 -0
- package/dist/esm/common/OperationalCredentialsTypes.d.ts.map +1 -0
- package/dist/esm/common/OperationalCredentialsTypes.js +25 -0
- package/dist/esm/common/OperationalCredentialsTypes.js.map +6 -0
- package/dist/esm/common/Scanner.d.ts +121 -0
- package/dist/esm/common/Scanner.d.ts.map +1 -0
- package/dist/esm/common/Scanner.js +31 -0
- package/dist/esm/common/Scanner.js.map +6 -0
- package/dist/esm/common/index.d.ts +12 -0
- package/dist/esm/common/index.d.ts.map +1 -0
- package/dist/esm/common/index.js +12 -0
- package/dist/esm/common/index.js.map +6 -0
- package/dist/esm/endpoint/EndpointInterface.d.ts +37 -0
- package/dist/esm/endpoint/EndpointInterface.d.ts.map +1 -0
- package/dist/esm/endpoint/EndpointInterface.js +6 -0
- package/dist/esm/endpoint/EndpointInterface.js.map +6 -0
- package/dist/esm/endpoint/EndpointStructureLogger.d.ts +31 -0
- package/dist/esm/endpoint/EndpointStructureLogger.d.ts.map +1 -0
- package/dist/esm/endpoint/EndpointStructureLogger.js +216 -0
- package/dist/esm/endpoint/EndpointStructureLogger.js.map +6 -0
- package/dist/esm/endpoint/index.d.ts +8 -0
- package/dist/esm/endpoint/index.d.ts.map +1 -0
- package/dist/esm/endpoint/index.js +8 -0
- package/dist/esm/endpoint/index.js.map +6 -0
- package/dist/esm/fabric/Fabric.d.ts +121 -0
- package/dist/esm/fabric/Fabric.d.ts.map +1 -0
- package/dist/esm/fabric/Fabric.js +422 -0
- package/dist/esm/fabric/Fabric.js.map +6 -0
- package/dist/esm/fabric/FabricManager.d.ts +44 -0
- package/dist/esm/fabric/FabricManager.d.ts.map +1 -0
- package/dist/esm/fabric/FabricManager.js +200 -0
- package/dist/esm/fabric/FabricManager.js.map +6 -0
- package/dist/esm/fabric/index.d.ts +8 -0
- package/dist/esm/fabric/index.d.ts.map +1 -0
- package/dist/esm/fabric/index.js +8 -0
- package/dist/esm/fabric/index.js.map +6 -0
- package/dist/esm/index.d.ts +20 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/interaction/AccessControlManager.d.ts +49 -0
- package/dist/esm/interaction/AccessControlManager.d.ts.map +1 -0
- package/dist/esm/interaction/AccessControlManager.js +228 -0
- package/dist/esm/interaction/AccessControlManager.js.map +6 -0
- package/dist/esm/interaction/AttributeDataDecoder.d.ts +52 -0
- package/dist/esm/interaction/AttributeDataDecoder.d.ts.map +1 -0
- package/dist/esm/interaction/AttributeDataDecoder.js +171 -0
- package/dist/esm/interaction/AttributeDataDecoder.js.map +6 -0
- package/dist/esm/interaction/AttributeDataEncoder.d.ts +71 -0
- package/dist/esm/interaction/AttributeDataEncoder.d.ts.map +1 -0
- package/dist/esm/interaction/AttributeDataEncoder.js +174 -0
- package/dist/esm/interaction/AttributeDataEncoder.js.map +6 -0
- package/dist/esm/interaction/EventDataDecoder.d.ts +30 -0
- package/dist/esm/interaction/EventDataDecoder.d.ts.map +1 -0
- package/dist/esm/interaction/EventDataDecoder.js +87 -0
- package/dist/esm/interaction/EventDataDecoder.js.map +6 -0
- package/dist/esm/interaction/EventHandler.d.ts +42 -0
- package/dist/esm/interaction/EventHandler.d.ts.map +1 -0
- package/dist/esm/interaction/EventHandler.js +96 -0
- package/dist/esm/interaction/EventHandler.js.map +6 -0
- package/dist/esm/interaction/InteractionClient.d.ts +294 -0
- package/dist/esm/interaction/InteractionClient.d.ts.map +1 -0
- package/dist/esm/interaction/InteractionClient.js +827 -0
- package/dist/esm/interaction/InteractionClient.js.map +6 -0
- package/dist/esm/interaction/InteractionEndpointStructure.d.ts +59 -0
- package/dist/esm/interaction/InteractionEndpointStructure.d.ts.map +1 -0
- package/dist/esm/interaction/InteractionEndpointStructure.js +343 -0
- package/dist/esm/interaction/InteractionEndpointStructure.js.map +6 -0
- package/dist/esm/interaction/InteractionMessenger.d.ts +315 -0
- package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -0
- package/dist/esm/interaction/InteractionMessenger.js +489 -0
- package/dist/esm/interaction/InteractionMessenger.js.map +6 -0
- package/dist/esm/interaction/InteractionServer.d.ts +97 -0
- package/dist/esm/interaction/InteractionServer.d.ts.map +1 -0
- package/dist/esm/interaction/InteractionServer.js +1027 -0
- package/dist/esm/interaction/InteractionServer.js.map +6 -0
- package/dist/esm/interaction/ServerSubscription.d.ts +121 -0
- package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -0
- package/dist/esm/interaction/ServerSubscription.js +669 -0
- package/dist/esm/interaction/ServerSubscription.js.map +6 -0
- package/dist/esm/interaction/Subscription.d.ts +44 -0
- package/dist/esm/interaction/Subscription.d.ts.map +1 -0
- package/dist/esm/interaction/Subscription.js +65 -0
- package/dist/esm/interaction/Subscription.js.map +6 -0
- package/dist/esm/interaction/SubscriptionOptions.d.ts +43 -0
- package/dist/esm/interaction/SubscriptionOptions.d.ts.map +1 -0
- package/dist/esm/interaction/SubscriptionOptions.js +26 -0
- package/dist/esm/interaction/SubscriptionOptions.js.map +6 -0
- package/dist/esm/interaction/index.d.ts +17 -0
- package/dist/esm/interaction/index.d.ts.map +1 -0
- package/dist/esm/interaction/index.js +17 -0
- package/dist/esm/interaction/index.js.map +6 -0
- package/dist/esm/mdns/MdnsBroadcaster.d.ts +34 -0
- package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsBroadcaster.js +351 -0
- package/dist/esm/mdns/MdnsBroadcaster.js.map +6 -0
- package/dist/esm/mdns/MdnsConsts.d.ts +19 -0
- package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsConsts.js +32 -0
- package/dist/esm/mdns/MdnsConsts.js.map +6 -0
- package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts +28 -0
- package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsInstanceBroadcaster.js +67 -0
- package/dist/esm/mdns/MdnsInstanceBroadcaster.js.map +6 -0
- package/dist/esm/mdns/MdnsScanner.d.ts +79 -0
- package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsScanner.js +847 -0
- package/dist/esm/mdns/MdnsScanner.js.map +6 -0
- package/dist/esm/mdns/MdnsServer.d.ts +29 -0
- package/dist/esm/mdns/MdnsServer.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsServer.js +266 -0
- package/dist/esm/mdns/MdnsServer.js.map +6 -0
- package/dist/esm/mdns/MdnsService.d.ts +28 -0
- package/dist/esm/mdns/MdnsService.d.ts.map +1 -0
- package/dist/esm/mdns/MdnsService.js +83 -0
- package/dist/esm/mdns/MdnsService.js.map +6 -0
- package/dist/esm/mdns/index.d.ts +12 -0
- package/dist/esm/mdns/index.d.ts.map +1 -0
- package/dist/esm/mdns/index.js +12 -0
- package/dist/esm/mdns/index.js.map +6 -0
- package/dist/esm/package.json +10 -0
- package/dist/esm/peer/ControllerCommissioner.d.ts +82 -0
- package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -0
- package/dist/esm/peer/ControllerCommissioner.js +211 -0
- package/dist/esm/peer/ControllerCommissioner.js.map +6 -0
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts +88 -0
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -0
- package/dist/esm/peer/ControllerCommissioningFlow.js +832 -0
- package/dist/esm/peer/ControllerCommissioningFlow.js.map +6 -0
- package/dist/esm/peer/ControllerDiscovery.d.ts +43 -0
- package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -0
- package/dist/esm/peer/ControllerDiscovery.js +172 -0
- package/dist/esm/peer/ControllerDiscovery.js.map +6 -0
- package/dist/esm/peer/OperationalPeer.d.ts +28 -0
- package/dist/esm/peer/OperationalPeer.d.ts.map +1 -0
- package/dist/esm/peer/OperationalPeer.js +6 -0
- package/dist/esm/peer/OperationalPeer.js.map +6 -0
- package/dist/esm/peer/PeerAddress.d.ts +30 -0
- package/dist/esm/peer/PeerAddress.d.ts.map +1 -0
- package/dist/esm/peer/PeerAddress.js +51 -0
- package/dist/esm/peer/PeerAddress.js.map +6 -0
- package/dist/esm/peer/PeerSet.d.ts +98 -0
- package/dist/esm/peer/PeerSet.d.ts.map +1 -0
- package/dist/esm/peer/PeerSet.js +495 -0
- package/dist/esm/peer/PeerSet.js.map +6 -0
- package/dist/esm/peer/PeerStore.d.ts +17 -0
- package/dist/esm/peer/PeerStore.d.ts.map +1 -0
- package/dist/esm/peer/PeerStore.js +11 -0
- package/dist/esm/peer/PeerStore.js.map +6 -0
- package/dist/esm/peer/index.d.ts +13 -0
- package/dist/esm/peer/index.d.ts.map +1 -0
- package/dist/esm/peer/index.js +13 -0
- package/dist/esm/peer/index.js.map +6 -0
- package/dist/esm/protocol/ChannelManager.d.ts +30 -0
- package/dist/esm/protocol/ChannelManager.d.ts.map +1 -0
- package/dist/esm/protocol/ChannelManager.js +148 -0
- package/dist/esm/protocol/ChannelManager.js.map +6 -0
- package/dist/esm/protocol/DeviceAdvertiser.d.ts +43 -0
- package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -0
- package/dist/esm/protocol/DeviceAdvertiser.js +173 -0
- package/dist/esm/protocol/DeviceAdvertiser.js.map +6 -0
- package/dist/esm/protocol/DeviceCommissioner.d.ts +49 -0
- package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -0
- package/dist/esm/protocol/DeviceCommissioner.js +187 -0
- package/dist/esm/protocol/DeviceCommissioner.js.map +6 -0
- package/dist/esm/protocol/ExchangeManager.d.ts +73 -0
- package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -0
- package/dist/esm/protocol/ExchangeManager.js +398 -0
- package/dist/esm/protocol/ExchangeManager.js.map +6 -0
- package/dist/esm/protocol/MessageCounter.d.ts +57 -0
- package/dist/esm/protocol/MessageCounter.d.ts.map +1 -0
- package/dist/esm/protocol/MessageCounter.js +84 -0
- package/dist/esm/protocol/MessageCounter.js.map +6 -0
- package/dist/esm/protocol/MessageExchange.d.ts +84 -0
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -0
- package/dist/esm/protocol/MessageExchange.js +504 -0
- package/dist/esm/protocol/MessageExchange.js.map +6 -0
- package/dist/esm/protocol/MessageReceptionState.d.ts +65 -0
- package/dist/esm/protocol/MessageReceptionState.d.ts.map +1 -0
- package/dist/esm/protocol/MessageReceptionState.js +153 -0
- package/dist/esm/protocol/MessageReceptionState.js.map +6 -0
- package/dist/esm/protocol/ProtocolHandler.d.ts +13 -0
- package/dist/esm/protocol/ProtocolHandler.d.ts.map +1 -0
- package/dist/esm/protocol/ProtocolHandler.js +6 -0
- package/dist/esm/protocol/ProtocolHandler.js.map +6 -0
- package/dist/esm/protocol/index.d.ts +14 -0
- package/dist/esm/protocol/index.d.ts.map +1 -0
- package/dist/esm/protocol/index.js +14 -0
- package/dist/esm/protocol/index.js.map +6 -0
- package/dist/esm/securechannel/SecureChannelMessenger.d.ts +53 -0
- package/dist/esm/securechannel/SecureChannelMessenger.d.ts.map +1 -0
- package/dist/esm/securechannel/SecureChannelMessenger.js +128 -0
- package/dist/esm/securechannel/SecureChannelMessenger.js.map +6 -0
- package/dist/esm/securechannel/SecureChannelProtocol.d.ts +31 -0
- package/dist/esm/securechannel/SecureChannelProtocol.d.ts.map +1 -0
- package/dist/esm/securechannel/SecureChannelProtocol.js +127 -0
- package/dist/esm/securechannel/SecureChannelProtocol.js.map +6 -0
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts +23 -0
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -0
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js +33 -0
- package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js.map +6 -0
- package/dist/esm/securechannel/index.d.ts +9 -0
- package/dist/esm/securechannel/index.d.ts.map +1 -0
- package/dist/esm/securechannel/index.js +9 -0
- package/dist/esm/securechannel/index.js.map +6 -0
- package/dist/esm/session/InsecureSession.d.ts +38 -0
- package/dist/esm/session/InsecureSession.d.ts.map +1 -0
- package/dist/esm/session/InsecureSession.js +75 -0
- package/dist/esm/session/InsecureSession.js.map +6 -0
- package/dist/esm/session/SecureSession.d.ts +81 -0
- package/dist/esm/session/SecureSession.d.ts.map +1 -0
- package/dist/esm/session/SecureSession.js +281 -0
- package/dist/esm/session/SecureSession.js.map +6 -0
- package/dist/esm/session/Session.d.ts +102 -0
- package/dist/esm/session/Session.d.ts.map +1 -0
- package/dist/esm/session/Session.js +121 -0
- package/dist/esm/session/Session.js.map +6 -0
- package/dist/esm/session/SessionManager.d.ts +132 -0
- package/dist/esm/session/SessionManager.d.ts.map +1 -0
- package/dist/esm/session/SessionManager.js +411 -0
- package/dist/esm/session/SessionManager.js.map +6 -0
- package/dist/esm/session/case/CaseClient.d.ts +18 -0
- package/dist/esm/session/case/CaseClient.d.ts.map +1 -0
- package/dist/esm/session/case/CaseClient.js +208 -0
- package/dist/esm/session/case/CaseClient.js.map +6 -0
- package/dist/esm/session/case/CaseMessages.d.ts +82 -0
- package/dist/esm/session/case/CaseMessages.d.ts.map +1 -0
- package/dist/esm/session/case/CaseMessages.js +83 -0
- package/dist/esm/session/case/CaseMessages.js.map +6 -0
- package/dist/esm/session/case/CaseMessenger.d.ts +79 -0
- package/dist/esm/session/case/CaseMessenger.d.ts.map +1 -0
- package/dist/esm/session/case/CaseMessenger.js +54 -0
- package/dist/esm/session/case/CaseMessenger.js.map +6 -0
- package/dist/esm/session/case/CaseServer.d.ts +18 -0
- package/dist/esm/session/case/CaseServer.d.ts.map +1 -0
- package/dist/esm/session/case/CaseServer.js +224 -0
- package/dist/esm/session/case/CaseServer.js.map +6 -0
- package/dist/esm/session/index.d.ts +18 -0
- package/dist/esm/session/index.d.ts.map +1 -0
- package/dist/esm/session/index.js +18 -0
- package/dist/esm/session/index.js.map +6 -0
- package/dist/esm/session/pase/PaseClient.d.ts +18 -0
- package/dist/esm/session/pase/PaseClient.d.ts.map +1 -0
- package/dist/esm/session/pase/PaseClient.js +81 -0
- package/dist/esm/session/pase/PaseClient.js.map +6 -0
- package/dist/esm/session/pase/PaseMessages.d.ts +85 -0
- package/dist/esm/session/pase/PaseMessages.d.ts.map +1 -0
- package/dist/esm/session/pase/PaseMessages.js +68 -0
- package/dist/esm/session/pase/PaseMessages.js.map +6 -0
- package/dist/esm/session/pase/PaseMessenger.d.ts +75 -0
- package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -0
- package/dist/esm/session/pase/PaseMessenger.js +75 -0
- package/dist/esm/session/pase/PaseMessenger.js.map +6 -0
- package/dist/esm/session/pase/PaseServer.d.ts +29 -0
- package/dist/esm/session/pase/PaseServer.d.ts.map +1 -0
- package/dist/esm/session/pase/PaseServer.js +148 -0
- package/dist/esm/session/pase/PaseServer.js.map +6 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +83 -0
- package/src/MatterDevice.ts +319 -0
- package/src/ble/Ble.ts +40 -0
- package/src/ble/BleConsts.ts +41 -0
- package/src/ble/BtpSessionHandler.ts +490 -0
- package/src/ble/index.ts +9 -0
- package/src/certificate/AttestationCertificateManager.ts +166 -0
- package/src/certificate/CertificateManager.ts +1136 -0
- package/src/certificate/CertificationDeclarationManager.ts +52 -0
- package/src/certificate/ChipPAAuthorities.ts +35 -0
- package/src/certificate/DeviceCertification.ts +116 -0
- package/src/certificate/RootCertificateManager.ts +179 -0
- package/src/certificate/index.ts +12 -0
- package/src/cluster/client/AttributeClient.ts +196 -0
- package/src/cluster/client/ClusterClient.ts +354 -0
- package/src/cluster/client/ClusterClientTypes.ts +257 -0
- package/src/cluster/client/EventClient.ts +110 -0
- package/src/cluster/client/index.ts +10 -0
- package/src/cluster/index.ts +8 -0
- package/src/cluster/server/AttributeServer.ts +986 -0
- package/src/cluster/server/ClusterDatasource.ts +17 -0
- package/src/cluster/server/ClusterServer.ts +46 -0
- package/src/cluster/server/CommandServer.ts +89 -0
- package/src/cluster/server/EventServer.ts +198 -0
- package/src/cluster/server/index.ts +11 -0
- package/src/codec/BtpCodec.ts +333 -0
- package/src/codec/MessageCodec.ts +276 -0
- package/src/codec/index.ts +9 -0
- package/src/common/FailsafeContext.ts +330 -0
- package/src/common/FailsafeTimer.ts +91 -0
- package/src/common/InstanceBroadcaster.ts +220 -0
- package/src/common/OperationalCredentialsTypes.ts +24 -0
- package/src/common/Scanner.ts +188 -0
- package/src/common/index.ts +12 -0
- package/src/endpoint/EndpointInterface.ts +41 -0
- package/src/endpoint/EndpointStructureLogger.ts +277 -0
- package/src/endpoint/index.ts +8 -0
- package/src/fabric/Fabric.ts +528 -0
- package/src/fabric/FabricManager.ts +231 -0
- package/src/fabric/index.ts +8 -0
- package/src/index.ts +20 -0
- package/src/interaction/AccessControlManager.ts +343 -0
- package/src/interaction/AttributeDataDecoder.ts +266 -0
- package/src/interaction/AttributeDataEncoder.ts +268 -0
- package/src/interaction/EventDataDecoder.ts +133 -0
- package/src/interaction/EventHandler.ts +141 -0
- package/src/interaction/InteractionClient.ts +1215 -0
- package/src/interaction/InteractionEndpointStructure.ts +462 -0
- package/src/interaction/InteractionMessenger.ts +592 -0
- package/src/interaction/InteractionServer.ts +1428 -0
- package/src/interaction/ServerSubscription.ts +908 -0
- package/src/interaction/Subscription.ts +89 -0
- package/src/interaction/SubscriptionOptions.ts +49 -0
- package/src/interaction/index.ts +17 -0
- package/src/mdns/MdnsBroadcaster.ts +415 -0
- package/src/mdns/MdnsConsts.ts +24 -0
- package/src/mdns/MdnsInstanceBroadcaster.ts +88 -0
- package/src/mdns/MdnsScanner.ts +1042 -0
- package/src/mdns/MdnsServer.ts +322 -0
- package/src/mdns/MdnsService.ts +102 -0
- package/src/mdns/index.ts +12 -0
- package/src/peer/ControllerCommissioner.ts +372 -0
- package/src/peer/ControllerCommissioningFlow.ts +1127 -0
- package/src/peer/ControllerDiscovery.ts +231 -0
- package/src/peer/OperationalPeer.ts +32 -0
- package/src/peer/PeerAddress.ts +78 -0
- package/src/peer/PeerSet.ts +684 -0
- package/src/peer/PeerStore.ts +19 -0
- package/src/peer/index.ts +13 -0
- package/src/protocol/ChannelManager.ts +168 -0
- package/src/protocol/DeviceAdvertiser.ts +208 -0
- package/src/protocol/DeviceCommissioner.ts +280 -0
- package/src/protocol/ExchangeManager.ts +493 -0
- package/src/protocol/MessageCounter.ts +128 -0
- package/src/protocol/MessageExchange.ts +662 -0
- package/src/protocol/MessageReceptionState.ts +207 -0
- package/src/protocol/ProtocolHandler.ts +14 -0
- package/src/protocol/index.ts +14 -0
- package/src/securechannel/SecureChannelMessenger.ts +166 -0
- package/src/securechannel/SecureChannelProtocol.ts +150 -0
- package/src/securechannel/SecureChannelStatusMessageSchema.ts +40 -0
- package/src/securechannel/index.ts +10 -0
- package/src/session/InsecureSession.ts +96 -0
- package/src/session/SecureSession.ts +349 -0
- package/src/session/Session.ts +188 -0
- package/src/session/SessionManager.ts +559 -0
- package/src/session/case/CaseClient.ts +235 -0
- package/src/session/case/CaseMessages.ts +81 -0
- package/src/session/case/CaseMessenger.ts +57 -0
- package/src/session/case/CaseServer.ts +269 -0
- package/src/session/index.ts +21 -0
- package/src/session/pase/PaseClient.ts +100 -0
- package/src/session/pase/PaseMessages.ts +72 -0
- package/src/session/pase/PaseMessenger.ts +86 -0
- package/src/session/pase/PaseServer.ts +187 -0
- package/src/tsconfig.json +20 -0
|
@@ -0,0 +1,1042 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
Bytes,
|
|
9
|
+
ChannelType,
|
|
10
|
+
Diagnostic,
|
|
11
|
+
DnsCodec,
|
|
12
|
+
DnsMessagePartiallyPreEncoded,
|
|
13
|
+
DnsMessageType,
|
|
14
|
+
DnsQuery,
|
|
15
|
+
DnsRecord,
|
|
16
|
+
DnsRecordClass,
|
|
17
|
+
DnsRecordType,
|
|
18
|
+
ImplementationError,
|
|
19
|
+
Logger,
|
|
20
|
+
MAX_MDNS_MESSAGE_SIZE,
|
|
21
|
+
Network,
|
|
22
|
+
ServerAddress,
|
|
23
|
+
ServerAddressIp,
|
|
24
|
+
SrvRecordValue,
|
|
25
|
+
Time,
|
|
26
|
+
Timer,
|
|
27
|
+
UdpMulticastServer,
|
|
28
|
+
createPromise,
|
|
29
|
+
isIPv6,
|
|
30
|
+
} from "#general";
|
|
31
|
+
import { NodeId, VendorId } from "#types";
|
|
32
|
+
import {
|
|
33
|
+
CommissionableDevice,
|
|
34
|
+
CommissionableDeviceIdentifiers,
|
|
35
|
+
DiscoveryData,
|
|
36
|
+
OperationalDevice,
|
|
37
|
+
Scanner,
|
|
38
|
+
} from "../common/Scanner.js";
|
|
39
|
+
import { Fabric } from "../fabric/Fabric.js";
|
|
40
|
+
import {
|
|
41
|
+
MATTER_COMMISSION_SERVICE_QNAME,
|
|
42
|
+
MATTER_SERVICE_QNAME,
|
|
43
|
+
getCommissioningModeQname,
|
|
44
|
+
getDeviceInstanceQname,
|
|
45
|
+
getDeviceMatterQname,
|
|
46
|
+
getDeviceTypeQname,
|
|
47
|
+
getLongDiscriminatorQname,
|
|
48
|
+
getShortDiscriminatorQname,
|
|
49
|
+
getVendorQname,
|
|
50
|
+
} from "./MdnsConsts.js";
|
|
51
|
+
import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsServer.js";
|
|
52
|
+
|
|
53
|
+
const logger = Logger.get("MdnsScanner");
|
|
54
|
+
|
|
55
|
+
type MatterServerRecordWithExpire = ServerAddressIp & {
|
|
56
|
+
expires: number;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
type CommissionableDeviceRecordWithExpire = Omit<CommissionableDevice, "addresses"> & {
|
|
60
|
+
expires: number;
|
|
61
|
+
addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
|
|
62
|
+
instanceId: string; // instance ID
|
|
63
|
+
SD: number; // Additional Field for Short discriminator
|
|
64
|
+
V?: number; // Additional Field for Vendor ID
|
|
65
|
+
P?: number; // Additional Field for Product ID
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
type OperationalDeviceRecordWithExpire = Omit<OperationalDevice, "addresses"> & {
|
|
69
|
+
expires: number;
|
|
70
|
+
addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/** The initial number of seconds between two announcements. MDNS specs require 1-2 seconds, so lets use the middle. */
|
|
74
|
+
const START_ANNOUNCE_INTERVAL_SECONDS = 1.5;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* This class implements the Scanner interface for a MDNS scanner via UDP messages in a IP based network.
|
|
78
|
+
* It sends out queries to discover various types of Matter device types and listens for announcements.
|
|
79
|
+
*/
|
|
80
|
+
export class MdnsScanner implements Scanner {
|
|
81
|
+
get type() {
|
|
82
|
+
return ChannelType.UDP;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static async create(network: Network, options?: { enableIpv4?: boolean; netInterface?: string }) {
|
|
86
|
+
const { enableIpv4, netInterface } = options ?? {};
|
|
87
|
+
return new MdnsScanner(
|
|
88
|
+
await UdpMulticastServer.create({
|
|
89
|
+
network,
|
|
90
|
+
netInterface: netInterface,
|
|
91
|
+
broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
|
|
92
|
+
broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
|
|
93
|
+
listeningPort: MDNS_BROADCAST_PORT,
|
|
94
|
+
}),
|
|
95
|
+
enableIpv4,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
readonly #activeAnnounceQueries = new Map<string, { queries: DnsQuery[]; answers: DnsRecord<any>[] }>();
|
|
100
|
+
#queryTimer?: Timer;
|
|
101
|
+
#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
|
|
102
|
+
|
|
103
|
+
readonly #operationalDeviceRecords = new Map<string, OperationalDeviceRecordWithExpire>();
|
|
104
|
+
readonly #commissionableDeviceRecords = new Map<string, CommissionableDeviceRecordWithExpire>();
|
|
105
|
+
readonly #recordWaiters = new Map<
|
|
106
|
+
string,
|
|
107
|
+
{
|
|
108
|
+
resolver: () => void;
|
|
109
|
+
timer?: Timer;
|
|
110
|
+
resolveOnUpdatedRecords: boolean;
|
|
111
|
+
}
|
|
112
|
+
>();
|
|
113
|
+
readonly #periodicTimer: Timer;
|
|
114
|
+
#closing = false;
|
|
115
|
+
|
|
116
|
+
readonly #multicastServer: UdpMulticastServer;
|
|
117
|
+
readonly #enableIpv4?: boolean;
|
|
118
|
+
|
|
119
|
+
constructor(multicastServer: UdpMulticastServer, enableIpv4?: boolean) {
|
|
120
|
+
multicastServer.onMessage((message, remoteIp, netInterface) =>
|
|
121
|
+
this.#handleDnsMessage(message, remoteIp, netInterface),
|
|
122
|
+
);
|
|
123
|
+
this.#multicastServer = multicastServer;
|
|
124
|
+
this.#enableIpv4 = enableIpv4;
|
|
125
|
+
this.#periodicTimer = Time.getPeriodicTimer("Discovered node expiration", 60 * 1000 /* 1 mn */, () =>
|
|
126
|
+
this.#expire(),
|
|
127
|
+
).start();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Sends out one DNS-SD query for all collected announce records and start a timer for the next query with doubled
|
|
132
|
+
* interval, maximum 60min, as per MDNS specs. The already known answers are tried to be sent in the query as long
|
|
133
|
+
* as they fit into a maximum 1500 byte long packet (as defined in MDNS specs), else they are split into more
|
|
134
|
+
* packets and the query is sent as Truncated query.
|
|
135
|
+
*/
|
|
136
|
+
async #sendQueries() {
|
|
137
|
+
this.#queryTimer?.stop();
|
|
138
|
+
const allQueries = Array.from(this.#activeAnnounceQueries.values());
|
|
139
|
+
const queries = allQueries.flatMap(({ queries }) => queries);
|
|
140
|
+
const answers = allQueries.flatMap(({ answers }) => answers);
|
|
141
|
+
|
|
142
|
+
this.#queryTimer = Time.getTimer("MDNS discovery", this.#nextAnnounceIntervalSeconds * 1000, () =>
|
|
143
|
+
this.#sendQueries(),
|
|
144
|
+
).start();
|
|
145
|
+
|
|
146
|
+
logger.debug(
|
|
147
|
+
`Sending ${queries.length} query records for ${this.#activeAnnounceQueries.size} queries with ${answers.length} known answers. Re-Announce in ${this.#nextAnnounceIntervalSeconds} seconds`,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const nextAnnounceInterval = this.#nextAnnounceIntervalSeconds * 2;
|
|
151
|
+
this.#nextAnnounceIntervalSeconds = Math.min(nextAnnounceInterval, 60 * 60 /* 1 hour */);
|
|
152
|
+
|
|
153
|
+
const answersToSend = [...answers];
|
|
154
|
+
|
|
155
|
+
const dnsMessageDataToSend = {
|
|
156
|
+
messageType: DnsMessageType.TruncatedQuery,
|
|
157
|
+
transactionId: 0,
|
|
158
|
+
queries,
|
|
159
|
+
authorities: [],
|
|
160
|
+
answers: [],
|
|
161
|
+
additionalRecords: [],
|
|
162
|
+
} as DnsMessagePartiallyPreEncoded;
|
|
163
|
+
|
|
164
|
+
const emptyDnsMessage = DnsCodec.encode(dnsMessageDataToSend);
|
|
165
|
+
let dnsMessageSize = emptyDnsMessage.length;
|
|
166
|
+
|
|
167
|
+
while (true) {
|
|
168
|
+
if (answersToSend.length > 0) {
|
|
169
|
+
const nextAnswer = answersToSend.shift();
|
|
170
|
+
if (nextAnswer === undefined) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const nextAnswerEncoded = DnsCodec.encodeRecord(nextAnswer);
|
|
175
|
+
dnsMessageSize += nextAnswerEncoded.length; // Add additional record as long as size is ok
|
|
176
|
+
|
|
177
|
+
if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
178
|
+
if (dnsMessageDataToSend.answers.length === 0) {
|
|
179
|
+
// The first answer is already too big, log at least a warning
|
|
180
|
+
logger.warn(
|
|
181
|
+
`MDNS Query with ${Logger.toJSON(
|
|
182
|
+
queries,
|
|
183
|
+
)} is too big to fit into a single MDNS message. Send anyway, but please report!`,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
// New answer do not fit anymore, send out the message
|
|
187
|
+
await this.#multicastServer.send(DnsCodec.encode(dnsMessageDataToSend));
|
|
188
|
+
|
|
189
|
+
// Reset the message, length counter and included answers to count for next message
|
|
190
|
+
dnsMessageDataToSend.queries.length = 0;
|
|
191
|
+
dnsMessageDataToSend.answers.length = 0;
|
|
192
|
+
dnsMessageSize = emptyDnsMessage.length + nextAnswerEncoded.length;
|
|
193
|
+
}
|
|
194
|
+
dnsMessageDataToSend.answers.push(nextAnswerEncoded);
|
|
195
|
+
} else {
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
await this.#multicastServer.send(
|
|
201
|
+
DnsCodec.encode({ ...dnsMessageDataToSend, messageType: DnsMessageType.Query }),
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Set new DnsQuery records to the list of active queries to discover devices in the network and start sending them
|
|
207
|
+
* out. When entry already exists the query is overwritten and answers are always added.
|
|
208
|
+
*/
|
|
209
|
+
#setQueryRecords(queryId: string, queries: DnsQuery[], answers: DnsRecord<any>[] = []) {
|
|
210
|
+
const activeExistingQuery = this.#activeAnnounceQueries.get(queryId);
|
|
211
|
+
if (activeExistingQuery) {
|
|
212
|
+
const { queries: existingQueries } = activeExistingQuery;
|
|
213
|
+
const newQueries = queries.filter(
|
|
214
|
+
query =>
|
|
215
|
+
!existingQueries.some(
|
|
216
|
+
existingQuery =>
|
|
217
|
+
existingQuery.name === query.name &&
|
|
218
|
+
existingQuery.recordType === query.recordType &&
|
|
219
|
+
existingQuery.recordClass === query.recordClass,
|
|
220
|
+
),
|
|
221
|
+
);
|
|
222
|
+
if (newQueries.length === 0) {
|
|
223
|
+
// All queries already sent out
|
|
224
|
+
logger.debug(
|
|
225
|
+
`No new query records for query ${queryId}, keeping existing queries and do not re-announce.`,
|
|
226
|
+
);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
queries = [...newQueries, ...existingQueries];
|
|
230
|
+
answers = [...activeExistingQuery.answers, ...answers];
|
|
231
|
+
}
|
|
232
|
+
this.#activeAnnounceQueries.set(queryId, { queries, answers });
|
|
233
|
+
logger.debug(`Set ${queries.length} query records for query ${queryId}: ${Logger.toJSON(queries)}`);
|
|
234
|
+
this.#queryTimer?.stop();
|
|
235
|
+
this.#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS; // Reset query interval
|
|
236
|
+
this.#queryTimer = Time.getTimer("MDNS discovery", 0, () => this.#sendQueries()).start();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
#getActiveQueryEarlierAnswers() {
|
|
240
|
+
return Array.from(this.#activeAnnounceQueries.values()).flatMap(({ answers }) => answers);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Remove a query from the list of active queries because discovery has finished or timed out and stop sending it
|
|
245
|
+
* out. If it was the last query announcing will stop completely.
|
|
246
|
+
*/
|
|
247
|
+
#removeQuery(queryId: string) {
|
|
248
|
+
this.#activeAnnounceQueries.delete(queryId);
|
|
249
|
+
if (this.#activeAnnounceQueries.size === 0) {
|
|
250
|
+
logger.debug(`Removing last query ${queryId} and stopping announce timer`);
|
|
251
|
+
this.#queryTimer?.stop();
|
|
252
|
+
this.#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
|
|
253
|
+
} else {
|
|
254
|
+
logger.debug(`Removing query ${queryId}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Returns the list of all targets (IP/port) discovered for a queried operational device record.
|
|
260
|
+
*/
|
|
261
|
+
#getOperationalDeviceRecords(deviceMatterQname: string): OperationalDevice | undefined {
|
|
262
|
+
const device = this.#operationalDeviceRecords.get(deviceMatterQname);
|
|
263
|
+
if (device === undefined) {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
const { addresses } = device;
|
|
267
|
+
if (addresses.size === 0) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
...device,
|
|
272
|
+
addresses: this.#sortServerEntries(Array.from(addresses.values())).map(({ ip, port }) => ({
|
|
273
|
+
ip,
|
|
274
|
+
port,
|
|
275
|
+
type: "udp",
|
|
276
|
+
})) as ServerAddressIp[],
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Sort the list of found IP/ports and make sure link-local IPv6 addresses come first, IPv6 next and IPv4 last.
|
|
282
|
+
*
|
|
283
|
+
* @param entries
|
|
284
|
+
*/
|
|
285
|
+
#sortServerEntries(entries: MatterServerRecordWithExpire[]) {
|
|
286
|
+
return entries.sort((a, b) => {
|
|
287
|
+
const aIsIPv6 = isIPv6(a.ip);
|
|
288
|
+
const bIsIPv6 = isIPv6(b.ip);
|
|
289
|
+
|
|
290
|
+
if (aIsIPv6 && !bIsIPv6) {
|
|
291
|
+
return -1; // IPv6 comes first
|
|
292
|
+
} else if (!aIsIPv6 && bIsIPv6) {
|
|
293
|
+
return 1; // IPv4 comes after IPv6
|
|
294
|
+
} else if (aIsIPv6 && bIsIPv6) {
|
|
295
|
+
if (a.ip.startsWith("fd") && !b.ip.startsWith("fd")) {
|
|
296
|
+
return -1; // addresses starting with "fd" come before other IPv6 addresses
|
|
297
|
+
} else if (!a.ip.startsWith("fd") && b.ip.startsWith("fd")) {
|
|
298
|
+
return 1; // addresses starting with "fd" come after other IPv6 addresses
|
|
299
|
+
} else if (a.ip.startsWith("fe80:") && !b.ip.startsWith("fe80:")) {
|
|
300
|
+
return -1; // link-local IPv6 comes before other global IPv6 addresses
|
|
301
|
+
} else if (!a.ip.startsWith("fe80:") && b.ip.startsWith("fe80:")) {
|
|
302
|
+
return 1; // link-local IPv6 comes after other global IPv6 addresses
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return 0; // no preference
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
311
|
+
* The promise will be resolved when the timer runs out latest.
|
|
312
|
+
*/
|
|
313
|
+
async #registerWaiterPromise(queryId: string, timeoutSeconds?: number, resolveOnUpdatedRecords = true) {
|
|
314
|
+
const { promise, resolver } = createPromise<void>();
|
|
315
|
+
const timer =
|
|
316
|
+
timeoutSeconds !== undefined
|
|
317
|
+
? Time.getTimer("MDNS timeout", timeoutSeconds * 1000, () => this.#finishWaiter(queryId, true)).start()
|
|
318
|
+
: undefined;
|
|
319
|
+
this.#recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords });
|
|
320
|
+
logger.debug(
|
|
321
|
+
`Registered waiter for query ${queryId} with ${
|
|
322
|
+
timeoutSeconds !== undefined ? `timeout ${timeoutSeconds} seconds` : "no timeout"
|
|
323
|
+
}${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`,
|
|
324
|
+
);
|
|
325
|
+
return { promise };
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
330
|
+
* promise.
|
|
331
|
+
*/
|
|
332
|
+
#finishWaiter(queryId: string, resolvePromise: boolean, isUpdatedRecord = false) {
|
|
333
|
+
const waiter = this.#recordWaiters.get(queryId);
|
|
334
|
+
if (waiter === undefined) return;
|
|
335
|
+
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
336
|
+
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
337
|
+
logger.debug(`Finishing waiter for query ${queryId}, resolving: ${resolvePromise}`);
|
|
338
|
+
if (timer !== undefined) {
|
|
339
|
+
timer.stop();
|
|
340
|
+
}
|
|
341
|
+
if (resolvePromise) {
|
|
342
|
+
resolver();
|
|
343
|
+
}
|
|
344
|
+
this.#recordWaiters.delete(queryId);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** Returns weather a waiter promise is registered for a specific queryId. */
|
|
348
|
+
#hasWaiter(queryId: string) {
|
|
349
|
+
return this.#recordWaiters.has(queryId);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
#createOperationalMatterQName(operationalId: Uint8Array, nodeId: NodeId) {
|
|
353
|
+
const operationalIdString = Bytes.toHex(operationalId).toUpperCase();
|
|
354
|
+
return getDeviceMatterQname(operationalIdString, NodeId.toHexString(nodeId));
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Method to find an operational device (already commissioned) and return a promise with the list of discovered
|
|
359
|
+
* IP/ports or an empty array if not found.
|
|
360
|
+
*/
|
|
361
|
+
async findOperationalDevice(
|
|
362
|
+
{ operationalId }: Fabric,
|
|
363
|
+
nodeId: NodeId,
|
|
364
|
+
timeoutSeconds?: number,
|
|
365
|
+
ignoreExistingRecords = false,
|
|
366
|
+
): Promise<OperationalDevice | undefined> {
|
|
367
|
+
if (this.#closing) {
|
|
368
|
+
throw new ImplementationError("Cannot discover operational device because scanner is closing.");
|
|
369
|
+
}
|
|
370
|
+
const deviceMatterQname = this.#createOperationalMatterQName(operationalId, nodeId);
|
|
371
|
+
|
|
372
|
+
let storedDevice = ignoreExistingRecords ? undefined : this.#getOperationalDeviceRecords(deviceMatterQname);
|
|
373
|
+
if (storedDevice === undefined) {
|
|
374
|
+
const { promise } = await this.#registerWaiterPromise(deviceMatterQname, timeoutSeconds);
|
|
375
|
+
|
|
376
|
+
this.#setQueryRecords(deviceMatterQname, [
|
|
377
|
+
{
|
|
378
|
+
name: deviceMatterQname,
|
|
379
|
+
recordClass: DnsRecordClass.IN,
|
|
380
|
+
recordType: DnsRecordType.SRV,
|
|
381
|
+
},
|
|
382
|
+
]);
|
|
383
|
+
|
|
384
|
+
await promise;
|
|
385
|
+
storedDevice = this.#getOperationalDeviceRecords(deviceMatterQname);
|
|
386
|
+
this.#removeQuery(deviceMatterQname);
|
|
387
|
+
}
|
|
388
|
+
return storedDevice;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
cancelOperationalDeviceDiscovery(fabric: Fabric, nodeId: NodeId, resolvePromise = true) {
|
|
392
|
+
const deviceMatterQname = this.#createOperationalMatterQName(fabric.operationalId, nodeId);
|
|
393
|
+
this.#finishWaiter(deviceMatterQname, resolvePromise);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise = true) {
|
|
397
|
+
const queryId = this.#buildCommissionableQueryIdentifier(identifier);
|
|
398
|
+
this.#finishWaiter(queryId, resolvePromise);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
getDiscoveredOperationalDevice({ operationalId }: Fabric, nodeId: NodeId) {
|
|
402
|
+
return this.#getOperationalDeviceRecords(this.#createOperationalMatterQName(operationalId, nodeId));
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Returns the metadata and list of all target addresses (IP/port) discovered for a queried commissionable device
|
|
407
|
+
* record.
|
|
408
|
+
*/
|
|
409
|
+
#getCommissionableDeviceRecords(identifier: CommissionableDeviceIdentifiers) {
|
|
410
|
+
const storedRecords = Array.from(this.#commissionableDeviceRecords.values());
|
|
411
|
+
|
|
412
|
+
const foundRecords = new Array<CommissionableDeviceRecordWithExpire>();
|
|
413
|
+
if ("instanceId" in identifier) {
|
|
414
|
+
foundRecords.push(...storedRecords.filter(({ instanceId }) => instanceId === identifier.instanceId));
|
|
415
|
+
} else if ("longDiscriminator" in identifier) {
|
|
416
|
+
foundRecords.push(...storedRecords.filter(({ D }) => D === identifier.longDiscriminator));
|
|
417
|
+
} else if ("shortDiscriminator" in identifier) {
|
|
418
|
+
foundRecords.push(...storedRecords.filter(({ SD }) => SD === identifier.shortDiscriminator));
|
|
419
|
+
} else if ("vendorId" in identifier && "productId" in identifier) {
|
|
420
|
+
foundRecords.push(
|
|
421
|
+
...storedRecords.filter(({ V, P }) => V === identifier.vendorId && P === identifier.productId),
|
|
422
|
+
);
|
|
423
|
+
} else if ("vendorId" in identifier) {
|
|
424
|
+
foundRecords.push(...storedRecords.filter(({ V }) => V === identifier.vendorId));
|
|
425
|
+
} else if ("deviceType" in identifier) {
|
|
426
|
+
foundRecords.push(...storedRecords.filter(({ DT }) => DT === identifier.deviceType));
|
|
427
|
+
} else if ("productId" in identifier) {
|
|
428
|
+
foundRecords.push(...storedRecords.filter(({ P }) => P === identifier.productId));
|
|
429
|
+
} else if (Object.keys(identifier).length === 0) {
|
|
430
|
+
foundRecords.push(...storedRecords.filter(({ CM }) => CM === 1 || CM === 2));
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return foundRecords.map(record => {
|
|
434
|
+
return {
|
|
435
|
+
...record,
|
|
436
|
+
addresses: this.#sortServerEntries(Array.from(record.addresses.values())).map(({ ip, port }) => ({
|
|
437
|
+
ip,
|
|
438
|
+
port,
|
|
439
|
+
type: "udp",
|
|
440
|
+
})) as ServerAddressIp[],
|
|
441
|
+
expires: undefined,
|
|
442
|
+
};
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
448
|
+
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
449
|
+
*/
|
|
450
|
+
#buildCommissionableQueryIdentifier(identifier: CommissionableDeviceIdentifiers) {
|
|
451
|
+
if ("instanceId" in identifier) {
|
|
452
|
+
return getDeviceInstanceQname(identifier.instanceId);
|
|
453
|
+
} else if ("longDiscriminator" in identifier) {
|
|
454
|
+
return getLongDiscriminatorQname(identifier.longDiscriminator);
|
|
455
|
+
} else if ("shortDiscriminator" in identifier) {
|
|
456
|
+
return getShortDiscriminatorQname(identifier.shortDiscriminator);
|
|
457
|
+
} else if ("vendorId" in identifier && "productId" in identifier) {
|
|
458
|
+
// Custom identifier because normally productId is only included in TXT record
|
|
459
|
+
return `_VP${identifier.vendorId}+${identifier.productId}`;
|
|
460
|
+
} else if ("vendorId" in identifier) {
|
|
461
|
+
return getVendorQname(identifier.vendorId);
|
|
462
|
+
} else if ("deviceType" in identifier) {
|
|
463
|
+
return getDeviceTypeQname(identifier.deviceType);
|
|
464
|
+
} else if ("productId" in identifier) {
|
|
465
|
+
// Custom identifier because normally productId is only included in TXT record
|
|
466
|
+
return `_P${identifier.productId}`;
|
|
467
|
+
} else if (Object.keys(identifier).length === 0) {
|
|
468
|
+
return getCommissioningModeQname();
|
|
469
|
+
}
|
|
470
|
+
throw new ImplementationError(`Invalid commissionable device identifier : ${Logger.toJSON(identifier)}`); // Should neven happen
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
#extractInstanceId(instanceName: string) {
|
|
474
|
+
const instanceNameSeparator = instanceName.indexOf(".");
|
|
475
|
+
if (instanceNameSeparator !== -1) {
|
|
476
|
+
return instanceName.substring(0, instanceNameSeparator);
|
|
477
|
+
}
|
|
478
|
+
return instanceName;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Check all options for a query identifier and return the most relevant one with an active query
|
|
483
|
+
*/
|
|
484
|
+
#findCommissionableQueryIdentifier(instanceName: string, record: CommissionableDeviceRecordWithExpire) {
|
|
485
|
+
if (this.#closing) {
|
|
486
|
+
throw new ImplementationError("Cannot discover commissionable device because scanner is closing.");
|
|
487
|
+
}
|
|
488
|
+
const instanceQueryId = this.#buildCommissionableQueryIdentifier({
|
|
489
|
+
instanceId: this.#extractInstanceId(instanceName),
|
|
490
|
+
});
|
|
491
|
+
if (this.#activeAnnounceQueries.has(instanceQueryId)) {
|
|
492
|
+
return instanceQueryId;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
const longDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
|
|
496
|
+
if (this.#activeAnnounceQueries.has(longDiscriminatorQueryId)) {
|
|
497
|
+
return longDiscriminatorQueryId;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
const shortDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
|
|
501
|
+
if (this.#activeAnnounceQueries.has(shortDiscriminatorQueryId)) {
|
|
502
|
+
return shortDiscriminatorQueryId;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
if (record.V !== undefined && record.P !== undefined) {
|
|
506
|
+
const vendorProductIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
507
|
+
vendorId: VendorId(record.V),
|
|
508
|
+
productId: record.P,
|
|
509
|
+
});
|
|
510
|
+
if (this.#activeAnnounceQueries.has(vendorProductIdQueryId)) {
|
|
511
|
+
return vendorProductIdQueryId;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (record.V !== undefined) {
|
|
516
|
+
const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({ vendorId: VendorId(record.V) });
|
|
517
|
+
if (this.#activeAnnounceQueries.has(vendorIdQueryId)) {
|
|
518
|
+
return vendorIdQueryId;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (record.DT !== undefined) {
|
|
523
|
+
const deviceTypeQueryId = this.#buildCommissionableQueryIdentifier({ deviceType: record.DT });
|
|
524
|
+
if (this.#activeAnnounceQueries.has(deviceTypeQueryId)) {
|
|
525
|
+
return deviceTypeQueryId;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if (record.P !== undefined) {
|
|
530
|
+
const productIdQueryId = this.#buildCommissionableQueryIdentifier({ productId: record.P });
|
|
531
|
+
if (this.#activeAnnounceQueries.has(productIdQueryId)) {
|
|
532
|
+
return productIdQueryId;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const commissioningModeQueryId = this.#buildCommissionableQueryIdentifier({});
|
|
537
|
+
if (this.#activeAnnounceQueries.has(commissioningModeQueryId)) {
|
|
538
|
+
return commissioningModeQueryId;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return undefined;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
#getCommissionableQueryRecords(identifier: CommissionableDeviceIdentifiers): DnsQuery[] {
|
|
545
|
+
const names = new Array<string>();
|
|
546
|
+
|
|
547
|
+
names.push(MATTER_COMMISSION_SERVICE_QNAME);
|
|
548
|
+
|
|
549
|
+
if ("instanceId" in identifier) {
|
|
550
|
+
names.push(getDeviceInstanceQname(identifier.instanceId));
|
|
551
|
+
} else if ("longDiscriminator" in identifier) {
|
|
552
|
+
names.push(getLongDiscriminatorQname(identifier.longDiscriminator));
|
|
553
|
+
} else if ("shortDiscriminator" in identifier) {
|
|
554
|
+
names.push(getShortDiscriminatorQname(identifier.shortDiscriminator));
|
|
555
|
+
} else if ("vendorId" in identifier) {
|
|
556
|
+
names.push(getVendorQname(identifier.vendorId));
|
|
557
|
+
} else if ("deviceType" in identifier) {
|
|
558
|
+
names.push(getDeviceTypeQname(identifier.deviceType));
|
|
559
|
+
} else {
|
|
560
|
+
// Other queries just scan for commissionable devices
|
|
561
|
+
names.push(getCommissioningModeQname());
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return names.map(name => ({ name, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.PTR }));
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Discovers commissionable devices based on a defined identifier for maximal given timeout, but returns the
|
|
569
|
+
* first found entries. If already a discovered device matches in the cache the response is returned directly and
|
|
570
|
+
* no query is triggered. If no record exists a query is sent out and the promise gets fulfilled as soon as at least
|
|
571
|
+
* one device is found. If no device is discovered in the defined timeframe an empty array is returned. When the
|
|
572
|
+
* promise got fulfilled no more queries are send out, but more device entries might be added when discovered later.
|
|
573
|
+
* These can be requested by the getCommissionableDevices method.
|
|
574
|
+
*/
|
|
575
|
+
async findCommissionableDevices(
|
|
576
|
+
identifier: CommissionableDeviceIdentifiers,
|
|
577
|
+
timeoutSeconds = 5,
|
|
578
|
+
ignoreExistingRecords = false,
|
|
579
|
+
): Promise<CommissionableDevice[]> {
|
|
580
|
+
let storedRecords = ignoreExistingRecords
|
|
581
|
+
? []
|
|
582
|
+
: this.#getCommissionableDeviceRecords(identifier).filter(({ addresses }) => addresses.length > 0);
|
|
583
|
+
if (storedRecords.length === 0) {
|
|
584
|
+
const queryId = this.#buildCommissionableQueryIdentifier(identifier);
|
|
585
|
+
const { promise } = await this.#registerWaiterPromise(queryId, timeoutSeconds);
|
|
586
|
+
|
|
587
|
+
this.#setQueryRecords(queryId, this.#getCommissionableQueryRecords(identifier));
|
|
588
|
+
|
|
589
|
+
await promise;
|
|
590
|
+
storedRecords = this.#getCommissionableDeviceRecords(identifier);
|
|
591
|
+
this.#removeQuery(queryId);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return storedRecords;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Discovers commissionable devices based on a defined identifier and returns the first found entries. If already a
|
|
599
|
+
* @param identifier
|
|
600
|
+
* @param callback
|
|
601
|
+
* @param timeoutSeconds
|
|
602
|
+
*/
|
|
603
|
+
async findCommissionableDevicesContinuously(
|
|
604
|
+
identifier: CommissionableDeviceIdentifiers,
|
|
605
|
+
callback: (device: CommissionableDevice) => void,
|
|
606
|
+
timeoutSeconds = 900,
|
|
607
|
+
): Promise<CommissionableDevice[]> {
|
|
608
|
+
const discoveredDevices = new Set<string>();
|
|
609
|
+
|
|
610
|
+
const discoveryEndTime = Time.nowMs() + timeoutSeconds * 1000;
|
|
611
|
+
const queryId = this.#buildCommissionableQueryIdentifier(identifier);
|
|
612
|
+
this.#setQueryRecords(queryId, this.#getCommissionableQueryRecords(identifier));
|
|
613
|
+
|
|
614
|
+
while (true) {
|
|
615
|
+
this.#getCommissionableDeviceRecords(identifier).forEach(device => {
|
|
616
|
+
const { deviceIdentifier } = device;
|
|
617
|
+
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
618
|
+
discoveredDevices.add(deviceIdentifier);
|
|
619
|
+
callback(device);
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
const remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1000);
|
|
624
|
+
if (remainingTime <= 0) {
|
|
625
|
+
break;
|
|
626
|
+
}
|
|
627
|
+
const { promise } = await this.#registerWaiterPromise(queryId, remainingTime, false);
|
|
628
|
+
await promise;
|
|
629
|
+
}
|
|
630
|
+
return this.#getCommissionableDeviceRecords(identifier);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
getDiscoveredCommissionableDevices(identifier: CommissionableDeviceIdentifiers) {
|
|
634
|
+
return this.#getCommissionableDeviceRecords(identifier);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Close all connects, end all timers and resolve all pending promises.
|
|
639
|
+
*/
|
|
640
|
+
async close() {
|
|
641
|
+
this.#closing = true;
|
|
642
|
+
this.#periodicTimer.stop();
|
|
643
|
+
this.#queryTimer?.stop();
|
|
644
|
+
await this.#multicastServer.close();
|
|
645
|
+
// Resolve all pending promises where logic waits for the response (aka: has a timer)
|
|
646
|
+
[...this.#recordWaiters.keys()].forEach(queryId =>
|
|
647
|
+
this.#finishWaiter(queryId, !!this.#recordWaiters.get(queryId)?.timer),
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* Main method to handle all incoming DNS messages.
|
|
653
|
+
* It will parse the message and check if it contains relevant discovery records.
|
|
654
|
+
*/
|
|
655
|
+
#handleDnsMessage(messageBytes: Uint8Array, _remoteIp: string, netInterface: string) {
|
|
656
|
+
if (this.#closing) return;
|
|
657
|
+
const message = DnsCodec.decode(messageBytes);
|
|
658
|
+
if (message === undefined) return; // The message cannot be parsed
|
|
659
|
+
if (message.messageType !== DnsMessageType.Response && message.messageType !== DnsMessageType.TruncatedResponse)
|
|
660
|
+
return;
|
|
661
|
+
|
|
662
|
+
const answers = [...message.answers, ...message.additionalRecords];
|
|
663
|
+
|
|
664
|
+
// Check if we got operational discovery records and handle them
|
|
665
|
+
if (this.#handleOperationalRecords(answers, this.#getActiveQueryEarlierAnswers(), netInterface)) return;
|
|
666
|
+
|
|
667
|
+
// Else check if we got commissionable discovery records and handle them
|
|
668
|
+
this.#handleCommissionableRecords(answers, this.#getActiveQueryEarlierAnswers(), netInterface);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
#handleIpRecords(
|
|
672
|
+
answers: DnsRecord<any>[],
|
|
673
|
+
target: string,
|
|
674
|
+
netInterface: string,
|
|
675
|
+
): { value: string; ttl: number }[] {
|
|
676
|
+
const ipRecords = answers.filter(
|
|
677
|
+
({ name, recordType }) =>
|
|
678
|
+
((recordType === DnsRecordType.A && this.#enableIpv4) || recordType === DnsRecordType.AAAA) &&
|
|
679
|
+
name === target,
|
|
680
|
+
);
|
|
681
|
+
return (ipRecords as DnsRecord<string>[]).map(({ value, ttl }) => ({
|
|
682
|
+
value: value.startsWith("fe80::") ? `${value}%${netInterface}` : value,
|
|
683
|
+
ttl,
|
|
684
|
+
}));
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
#handleOperationalRecords(answers: DnsRecord<any>[], formerAnswers: DnsRecord<any>[], netInterface: string) {
|
|
688
|
+
let recordsHandled = false;
|
|
689
|
+
// Does the message contain data for an operational service?
|
|
690
|
+
const operationalTxtRecord = answers.find(
|
|
691
|
+
({ name, recordType }) => recordType === DnsRecordType.TXT && name.endsWith(MATTER_SERVICE_QNAME),
|
|
692
|
+
);
|
|
693
|
+
if (operationalTxtRecord !== undefined) {
|
|
694
|
+
this.#handleOperationalTxtRecord(operationalTxtRecord, netInterface);
|
|
695
|
+
recordsHandled = true;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
const operationalSrvRecord =
|
|
699
|
+
answers.find(
|
|
700
|
+
({ name, recordType }) => recordType === DnsRecordType.SRV && name.endsWith(MATTER_SERVICE_QNAME),
|
|
701
|
+
) ??
|
|
702
|
+
formerAnswers.find(
|
|
703
|
+
({ name, recordType }) => recordType === DnsRecordType.SRV && name.endsWith(MATTER_SERVICE_QNAME),
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
if (operationalSrvRecord !== undefined) {
|
|
707
|
+
this.#handleOperationalSrvRecord(operationalSrvRecord, answers, formerAnswers, netInterface);
|
|
708
|
+
recordsHandled = true;
|
|
709
|
+
}
|
|
710
|
+
return recordsHandled;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
#handleOperationalTxtRecord(record: DnsRecord<any>, netInterface: string) {
|
|
714
|
+
const { name: matterName, value, ttl } = record as DnsRecord<string[]>;
|
|
715
|
+
|
|
716
|
+
// we got an expiry info, so we can remove the record if we know it already and are done
|
|
717
|
+
if (ttl === 0) {
|
|
718
|
+
if (this.#operationalDeviceRecords.has(matterName)) {
|
|
719
|
+
logger.debug(
|
|
720
|
+
`Removing operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
|
|
721
|
+
);
|
|
722
|
+
this.#operationalDeviceRecords.delete(matterName);
|
|
723
|
+
}
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
if (!Array.isArray(value)) return;
|
|
727
|
+
|
|
728
|
+
const txtData = this.#parseTxtRecord(record);
|
|
729
|
+
if (txtData === undefined) return;
|
|
730
|
+
let device = this.#operationalDeviceRecords.get(matterName);
|
|
731
|
+
if (device !== undefined) {
|
|
732
|
+
device = {
|
|
733
|
+
...device,
|
|
734
|
+
expires: Time.nowMs() + ttl * 1000,
|
|
735
|
+
...txtData,
|
|
736
|
+
};
|
|
737
|
+
} else {
|
|
738
|
+
logger.debug(
|
|
739
|
+
`Adding operational device ${matterName} in cache (interface ${netInterface}) with TXT data:`,
|
|
740
|
+
MdnsScanner.discoveryDataDiagnostics(txtData),
|
|
741
|
+
);
|
|
742
|
+
device = {
|
|
743
|
+
deviceIdentifier: matterName,
|
|
744
|
+
addresses: new Map<string, MatterServerRecordWithExpire>(),
|
|
745
|
+
expires: Time.nowMs() + ttl * 1000,
|
|
746
|
+
...txtData,
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
this.#operationalDeviceRecords.set(matterName, device);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
#handleOperationalSrvRecord(
|
|
754
|
+
record: DnsRecord<any>,
|
|
755
|
+
answers: DnsRecord<any>[],
|
|
756
|
+
formerAnswers: DnsRecord<any>[],
|
|
757
|
+
netInterface: string,
|
|
758
|
+
) {
|
|
759
|
+
const {
|
|
760
|
+
name: matterName,
|
|
761
|
+
ttl,
|
|
762
|
+
value: { target, port },
|
|
763
|
+
} = record;
|
|
764
|
+
|
|
765
|
+
// we got an expiry info, so we can remove the record if we know it already and are done
|
|
766
|
+
if (ttl === 0) {
|
|
767
|
+
if (this.#operationalDeviceRecords.has(matterName)) {
|
|
768
|
+
logger.debug(
|
|
769
|
+
`Removing operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
|
|
770
|
+
);
|
|
771
|
+
this.#operationalDeviceRecords.delete(matterName);
|
|
772
|
+
}
|
|
773
|
+
return true;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
const ips = this.#handleIpRecords([...answers, ...formerAnswers], target, netInterface);
|
|
777
|
+
const deviceExisted = this.#operationalDeviceRecords.has(matterName);
|
|
778
|
+
const device = this.#operationalDeviceRecords.get(matterName) ?? {
|
|
779
|
+
deviceIdentifier: matterName,
|
|
780
|
+
addresses: new Map<string, MatterServerRecordWithExpire>(),
|
|
781
|
+
expires: Time.nowMs() + ttl * 1000,
|
|
782
|
+
};
|
|
783
|
+
const { addresses } = device;
|
|
784
|
+
if (ips.length > 0) {
|
|
785
|
+
for (const { value: ip, ttl } of ips) {
|
|
786
|
+
if (ttl === 0) {
|
|
787
|
+
logger.debug(
|
|
788
|
+
`Removing IP ${ip} for operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
|
|
789
|
+
);
|
|
790
|
+
addresses.delete(ip);
|
|
791
|
+
continue;
|
|
792
|
+
}
|
|
793
|
+
const matterServer = addresses.get(ip) ?? { ip, port, type: "udp", expires: 0 };
|
|
794
|
+
matterServer.expires = Time.nowMs() + ttl * 1000;
|
|
795
|
+
|
|
796
|
+
addresses.set(matterServer.ip, matterServer);
|
|
797
|
+
}
|
|
798
|
+
device.addresses = addresses;
|
|
799
|
+
if (!this.#operationalDeviceRecords.has(matterName)) {
|
|
800
|
+
logger.debug(
|
|
801
|
+
`Added IPs for operational device ${matterName} to cache (interface ${netInterface}):`,
|
|
802
|
+
...MdnsScanner.deviceAddressDiagnostics(addresses),
|
|
803
|
+
);
|
|
804
|
+
}
|
|
805
|
+
this.#operationalDeviceRecords.set(matterName, device);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
if (addresses.size === 0 && this.#hasWaiter(matterName)) {
|
|
809
|
+
// We have no or no more (because expired) IPs, and we are interested in this particular service name, request them
|
|
810
|
+
const queries = [{ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.AAAA }];
|
|
811
|
+
if (this.#enableIpv4) {
|
|
812
|
+
queries.push({ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.A });
|
|
813
|
+
}
|
|
814
|
+
logger.debug(`Requesting IP addresses for operational device ${matterName} (interface ${netInterface}).`);
|
|
815
|
+
this.#setQueryRecords(matterName, queries, answers);
|
|
816
|
+
} else if (addresses.size > 0) {
|
|
817
|
+
this.#finishWaiter(matterName, true, deviceExisted);
|
|
818
|
+
}
|
|
819
|
+
return true;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
#handleCommissionableRecords(answers: DnsRecord<any>[], formerAnswers: DnsRecord<any>[], netInterface: string) {
|
|
823
|
+
// Does the message contain a SRV record for an operational service we are interested in?
|
|
824
|
+
let commissionableRecords = answers.filter(({ name }) => name.endsWith(MATTER_COMMISSION_SERVICE_QNAME));
|
|
825
|
+
if (!commissionableRecords.length) {
|
|
826
|
+
commissionableRecords = formerAnswers.filter(({ name }) => name.endsWith(MATTER_COMMISSION_SERVICE_QNAME));
|
|
827
|
+
if (!commissionableRecords.length) return;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
const queryMissingDataForInstances = new Set<string>();
|
|
831
|
+
|
|
832
|
+
// First process the TXT records
|
|
833
|
+
const txtRecords = commissionableRecords.filter(({ recordType }) => recordType === DnsRecordType.TXT);
|
|
834
|
+
for (const record of txtRecords) {
|
|
835
|
+
const { name, ttl } = record;
|
|
836
|
+
if (ttl === 0) {
|
|
837
|
+
if (this.#commissionableDeviceRecords.has(name)) {
|
|
838
|
+
logger.debug(
|
|
839
|
+
`Removing commissionable device ${name} from cache (interface ${netInterface}) because of ttl=0`,
|
|
840
|
+
);
|
|
841
|
+
this.#commissionableDeviceRecords.delete(name);
|
|
842
|
+
}
|
|
843
|
+
continue;
|
|
844
|
+
}
|
|
845
|
+
const parsedRecord = this.#parseCommissionableTxtRecord(record);
|
|
846
|
+
if (parsedRecord === undefined) continue;
|
|
847
|
+
parsedRecord.instanceId = this.#extractInstanceId(name);
|
|
848
|
+
parsedRecord.deviceIdentifier = parsedRecord.instanceId;
|
|
849
|
+
if (parsedRecord.D !== undefined && parsedRecord.SD === undefined) {
|
|
850
|
+
parsedRecord.SD = (parsedRecord.D >> 8) & 0x0f;
|
|
851
|
+
}
|
|
852
|
+
if (parsedRecord.VP !== undefined) {
|
|
853
|
+
const VpValueArr = parsedRecord.VP.split("+");
|
|
854
|
+
parsedRecord.V = VpValueArr[0] !== undefined ? parseInt(VpValueArr[0]) : undefined;
|
|
855
|
+
parsedRecord.P = VpValueArr[1] !== undefined ? parseInt(VpValueArr[1]) : undefined;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
const storedRecord = this.#commissionableDeviceRecords.get(name);
|
|
859
|
+
if (storedRecord === undefined) {
|
|
860
|
+
queryMissingDataForInstances.add(name);
|
|
861
|
+
|
|
862
|
+
logger.debug(
|
|
863
|
+
`Found commissionable device ${name} with data:`,
|
|
864
|
+
MdnsScanner.discoveryDataDiagnostics(parsedRecord),
|
|
865
|
+
);
|
|
866
|
+
} else {
|
|
867
|
+
parsedRecord.addresses = storedRecord.addresses;
|
|
868
|
+
}
|
|
869
|
+
this.#commissionableDeviceRecords.set(name, parsedRecord);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// We got SRV records for the instance ID, so we know the host name now and can collect the IP addresses
|
|
873
|
+
const srvRecords = commissionableRecords.filter(({ recordType }) => recordType === DnsRecordType.SRV);
|
|
874
|
+
for (const record of srvRecords) {
|
|
875
|
+
const storedRecord = this.#commissionableDeviceRecords.get(record.name);
|
|
876
|
+
if (storedRecord === undefined) continue;
|
|
877
|
+
const {
|
|
878
|
+
value: { target, port },
|
|
879
|
+
ttl,
|
|
880
|
+
} = record as DnsRecord<SrvRecordValue>;
|
|
881
|
+
if (ttl === 0) {
|
|
882
|
+
logger.debug(
|
|
883
|
+
`Removing commissionable device ${record.name} from cache (interface ${netInterface}) because of ttl=0`,
|
|
884
|
+
);
|
|
885
|
+
this.#commissionableDeviceRecords.delete(record.name);
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
const recordExisting = storedRecord.addresses.size > 0;
|
|
890
|
+
|
|
891
|
+
const ips = this.#handleIpRecords([...answers, ...formerAnswers], target, netInterface);
|
|
892
|
+
if (ips.length > 0) {
|
|
893
|
+
for (const { value: ip, ttl } of ips) {
|
|
894
|
+
if (ttl === 0) {
|
|
895
|
+
logger.debug(
|
|
896
|
+
`Removing IP ${ip} for commissionable device ${record.name} from cache (interface ${netInterface}) because of ttl=0`,
|
|
897
|
+
);
|
|
898
|
+
storedRecord.addresses.delete(ip);
|
|
899
|
+
continue;
|
|
900
|
+
}
|
|
901
|
+
const matterServer = storedRecord.addresses.get(ip) ?? { ip, port, type: "udp", expires: 0 };
|
|
902
|
+
matterServer.expires = Time.nowMs() + ttl * 1000;
|
|
903
|
+
|
|
904
|
+
storedRecord.addresses.set(ip, matterServer);
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
this.#commissionableDeviceRecords.set(record.name, storedRecord);
|
|
908
|
+
if (storedRecord.addresses.size === 0) {
|
|
909
|
+
const queryId = this.#findCommissionableQueryIdentifier("", storedRecord);
|
|
910
|
+
if (queryId === undefined) continue;
|
|
911
|
+
// We have no or no more (because expired) IPs and we are interested in such a service name, request them
|
|
912
|
+
const queries = [{ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.AAAA }];
|
|
913
|
+
if (this.#enableIpv4) {
|
|
914
|
+
queries.push({ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.A });
|
|
915
|
+
}
|
|
916
|
+
logger.debug(
|
|
917
|
+
`Requesting IP addresses for commissionable device ${record.name} (interface ${netInterface}).`,
|
|
918
|
+
);
|
|
919
|
+
this.#setQueryRecords(queryId, queries, answers);
|
|
920
|
+
}
|
|
921
|
+
if (storedRecord.addresses.size === 0) continue;
|
|
922
|
+
|
|
923
|
+
const queryId = this.#findCommissionableQueryIdentifier(record.name, storedRecord);
|
|
924
|
+
if (queryId === undefined) continue;
|
|
925
|
+
|
|
926
|
+
queryMissingDataForInstances.delete(record.name); // No need to query anymore, we have anything we need
|
|
927
|
+
this.#finishWaiter(queryId, true, recordExisting);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// We have to query for the SRV records for the missing commissionable devices where we only had TXT records
|
|
931
|
+
if (queryMissingDataForInstances.size !== 0) {
|
|
932
|
+
for (const name of Array.from(queryMissingDataForInstances.values())) {
|
|
933
|
+
const storedRecord = this.#commissionableDeviceRecords.get(name);
|
|
934
|
+
if (storedRecord === undefined) continue;
|
|
935
|
+
const queryId = this.#findCommissionableQueryIdentifier("", storedRecord);
|
|
936
|
+
if (queryId === undefined) continue;
|
|
937
|
+
logger.debug(`Requesting more records for commissionable device ${name} (interface ${netInterface}).`);
|
|
938
|
+
this.#setQueryRecords(
|
|
939
|
+
queryId,
|
|
940
|
+
[{ name, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.ANY }],
|
|
941
|
+
answers,
|
|
942
|
+
);
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
#parseTxtRecord(record: DnsRecord<any>): DiscoveryData | undefined {
|
|
948
|
+
const { value } = record as DnsRecord<string[]>;
|
|
949
|
+
const result = {} as any;
|
|
950
|
+
if (Array.isArray(value)) {
|
|
951
|
+
for (const item of value) {
|
|
952
|
+
const [key, value] = item.split("=");
|
|
953
|
+
if (key === undefined || value === undefined) continue;
|
|
954
|
+
if (["SII", "SAI", "SAT", "T", "D", "CM", "DT", "PH", "ICD"].includes(key)) {
|
|
955
|
+
const intValue = parseInt(value);
|
|
956
|
+
if (isNaN(intValue)) continue;
|
|
957
|
+
result[key] = intValue;
|
|
958
|
+
} else if (["VP", "DN", "RI", "PI"].includes(key)) {
|
|
959
|
+
result[key] = value;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
// Fill in some defaults for convenience
|
|
965
|
+
if (result.T === undefined) {
|
|
966
|
+
result.T = 0; // TCP not supported
|
|
967
|
+
} else if (result.T === 1) {
|
|
968
|
+
// Value 1 is reserved and should be handled as 0 according to Matter spec
|
|
969
|
+
result.T = 0; // TCP not supported
|
|
970
|
+
}
|
|
971
|
+
if (result.ICD === undefined) {
|
|
972
|
+
result.ICD = 0; // Device is not operating as Long Idle Time ICD
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
return result;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
#parseCommissionableTxtRecord(record: DnsRecord<any>): CommissionableDeviceRecordWithExpire | undefined {
|
|
979
|
+
const { value, ttl } = record as DnsRecord<string[]>;
|
|
980
|
+
if (!Array.isArray(value)) return undefined;
|
|
981
|
+
const result = {
|
|
982
|
+
addresses: new Map<string, ServerAddress>(),
|
|
983
|
+
expires: Time.nowMs() + ttl * 1000,
|
|
984
|
+
...this.#parseTxtRecord(record),
|
|
985
|
+
} as any;
|
|
986
|
+
if (result.D === undefined || result.CM === undefined) return undefined; // Required data fields need to be existing
|
|
987
|
+
return result as CommissionableDeviceRecordWithExpire;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
#expire() {
|
|
991
|
+
const now = Time.nowMs();
|
|
992
|
+
[...this.#operationalDeviceRecords.entries()].forEach(([recordKey, { addresses, expires }]) => {
|
|
993
|
+
if (now < expires) {
|
|
994
|
+
[...addresses.entries()].forEach(([key, { expires }]) => {
|
|
995
|
+
if (now < expires) return;
|
|
996
|
+
addresses.delete(key);
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
if (now >= expires || addresses.size === 0) {
|
|
1000
|
+
this.#operationalDeviceRecords.delete(recordKey);
|
|
1001
|
+
}
|
|
1002
|
+
});
|
|
1003
|
+
[...this.#commissionableDeviceRecords.entries()].forEach(([recordKey, { addresses, expires }]) => {
|
|
1004
|
+
if (now < expires) {
|
|
1005
|
+
// Entry still ok but check addresses for expiry
|
|
1006
|
+
[...addresses.entries()].forEach(([key, { expires }]) => {
|
|
1007
|
+
if (now < expires) return;
|
|
1008
|
+
addresses.delete(key);
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
if (now >= expires || addresses.size === 0) {
|
|
1012
|
+
this.#commissionableDeviceRecords.delete(recordKey);
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
static discoveryDataDiagnostics(data: DiscoveryData) {
|
|
1018
|
+
return Diagnostic.dict({
|
|
1019
|
+
SII: data.SII,
|
|
1020
|
+
SAI: data.SAI,
|
|
1021
|
+
SAT: data.SAT,
|
|
1022
|
+
T: data.T,
|
|
1023
|
+
DT: data.DT,
|
|
1024
|
+
PH: data.PH,
|
|
1025
|
+
ICD: data.ICD,
|
|
1026
|
+
VP: data.VP,
|
|
1027
|
+
DN: data.DN,
|
|
1028
|
+
RI: data.RI,
|
|
1029
|
+
PI: data.PI,
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
static deviceAddressDiagnostics(addresses: Map<string, MatterServerRecordWithExpire>) {
|
|
1034
|
+
return Array.from(addresses.values()).map(address =>
|
|
1035
|
+
Diagnostic.dict({
|
|
1036
|
+
ip: address.ip,
|
|
1037
|
+
port: address.port,
|
|
1038
|
+
type: address.type,
|
|
1039
|
+
}),
|
|
1040
|
+
);
|
|
1041
|
+
}
|
|
1042
|
+
}
|