@matter/protocol 0.16.0-alpha.0-20251217-038f88085 → 0.16.0-alpha.0-20251221-21acf226d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/action/client/ClientBdx.d.ts +17 -0
- package/dist/cjs/action/client/ClientBdx.d.ts.map +1 -0
- package/dist/cjs/action/client/ClientBdx.js +22 -0
- package/dist/cjs/action/client/ClientBdx.js.map +6 -0
- package/dist/cjs/action/client/ClientInteraction.d.ts +10 -1
- package/dist/cjs/action/client/ClientInteraction.d.ts.map +1 -1
- package/dist/cjs/action/client/ClientInteraction.js +25 -2
- package/dist/cjs/action/client/ClientInteraction.js.map +1 -1
- package/dist/cjs/action/client/QueuedClientInteraction.d.ts +11 -3
- package/dist/cjs/action/client/QueuedClientInteraction.d.ts.map +1 -1
- package/dist/cjs/action/client/QueuedClientInteraction.js +6 -2
- package/dist/cjs/action/client/QueuedClientInteraction.js.map +1 -1
- package/dist/cjs/action/client/index.d.ts +1 -0
- package/dist/cjs/action/client/index.d.ts.map +1 -1
- package/dist/cjs/action/client/index.js +1 -0
- package/dist/cjs/action/client/index.js.map +1 -1
- package/dist/cjs/action/request/Read.d.ts.map +1 -1
- package/dist/cjs/action/request/Read.js +2 -2
- package/dist/cjs/action/request/Read.js.map +1 -1
- package/dist/cjs/action/request/Write.js +4 -3
- package/dist/cjs/action/request/Write.js.map +1 -1
- package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts +1 -1
- package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts.map +1 -1
- package/dist/cjs/advertisement/ble/BleAdvertisement.js +2 -2
- package/dist/cjs/advertisement/ble/BleAdvertisement.js.map +1 -1
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +1 -1
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js +1 -1
- package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +1 -1
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -1
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js +3 -5
- package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js.map +1 -1
- package/dist/cjs/bdx/BdxClient.d.ts +2 -0
- package/dist/cjs/bdx/BdxClient.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxClient.js +6 -0
- package/dist/cjs/bdx/BdxClient.js.map +1 -1
- package/dist/cjs/bdx/BdxError.d.ts +2 -0
- package/dist/cjs/bdx/BdxError.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxError.js +2 -0
- package/dist/cjs/bdx/BdxError.js.map +1 -1
- package/dist/cjs/bdx/BdxMessenger.d.ts +5 -1
- package/dist/cjs/bdx/BdxMessenger.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxMessenger.js +12 -4
- package/dist/cjs/bdx/BdxMessenger.js.map +1 -1
- package/dist/cjs/bdx/BdxProtocol.d.ts +14 -7
- package/dist/cjs/bdx/BdxProtocol.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxProtocol.js +81 -19
- package/dist/cjs/bdx/BdxProtocol.js.map +1 -1
- package/dist/cjs/bdx/BdxSession.d.ts +10 -3
- package/dist/cjs/bdx/BdxSession.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxSession.js +33 -8
- package/dist/cjs/bdx/BdxSession.js.map +1 -1
- package/dist/cjs/bdx/BdxSessionConfiguration.d.ts +16 -1
- package/dist/cjs/bdx/BdxSessionConfiguration.d.ts.map +1 -1
- package/dist/cjs/bdx/BdxSessionConfiguration.js +6 -1
- package/dist/cjs/bdx/BdxSessionConfiguration.js.map +1 -1
- package/dist/cjs/bdx/FileDesignator.d.ts +15 -1
- package/dist/cjs/bdx/FileDesignator.d.ts.map +1 -1
- package/dist/cjs/bdx/FileDesignator.js +28 -2
- package/dist/cjs/bdx/FileDesignator.js.map +1 -1
- package/dist/cjs/bdx/PersistedFileDesignator.d.ts +10 -2
- package/dist/cjs/bdx/PersistedFileDesignator.d.ts.map +1 -1
- package/dist/cjs/bdx/PersistedFileDesignator.js +23 -5
- package/dist/cjs/bdx/PersistedFileDesignator.js.map +1 -1
- package/dist/cjs/bdx/ScopedStorage.d.ts +18 -0
- package/dist/cjs/bdx/ScopedStorage.d.ts.map +1 -0
- package/dist/cjs/bdx/ScopedStorage.js +36 -0
- package/dist/cjs/bdx/ScopedStorage.js.map +6 -0
- package/dist/cjs/bdx/bdx-session-initiator.d.ts.map +1 -1
- package/dist/cjs/bdx/bdx-session-initiator.js +10 -2
- package/dist/cjs/bdx/bdx-session-initiator.js.map +1 -1
- package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/DrivenSendingFlow.js +2 -0
- package/dist/cjs/bdx/flow/DrivenSendingFlow.js.map +1 -1
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.js +1 -0
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.js.map +1 -1
- package/dist/cjs/bdx/flow/Flow.d.ts +7 -0
- package/dist/cjs/bdx/flow/Flow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/Flow.js +22 -1
- package/dist/cjs/bdx/flow/Flow.js.map +1 -1
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.js +3 -0
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.js.map +1 -1
- package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/FollowingSendingFlow.js +1 -0
- package/dist/cjs/bdx/flow/FollowingSendingFlow.js.map +1 -1
- package/dist/cjs/bdx/flow/OutboundFlow.d.ts.map +1 -1
- package/dist/cjs/bdx/flow/OutboundFlow.js +1 -0
- package/dist/cjs/bdx/flow/OutboundFlow.js.map +1 -1
- package/dist/cjs/bdx/index.d.ts +1 -0
- package/dist/cjs/bdx/index.d.ts.map +1 -1
- package/dist/cjs/bdx/index.js +1 -0
- package/dist/cjs/bdx/index.js.map +1 -1
- package/dist/cjs/certificate/kinds/Icac.d.ts.map +1 -1
- package/dist/cjs/certificate/kinds/Icac.js +1 -7
- package/dist/cjs/certificate/kinds/Icac.js.map +1 -1
- package/dist/cjs/certificate/kinds/Rcac.d.ts +1 -0
- package/dist/cjs/certificate/kinds/Rcac.d.ts.map +1 -1
- package/dist/cjs/certificate/kinds/Rcac.js +3 -0
- package/dist/cjs/certificate/kinds/Rcac.js.map +1 -1
- package/dist/cjs/certificate/kinds/definitions/operational.d.ts +1 -1
- package/dist/cjs/certificate/kinds/definitions/operational.js +1 -1
- package/dist/cjs/certificate/kinds/definitions/operational.js.map +1 -1
- package/dist/cjs/common/FailsafeContext.js +2 -2
- package/dist/cjs/common/FailsafeContext.js.map +1 -1
- package/dist/cjs/dcl/DclClient.d.ts.map +1 -1
- package/dist/cjs/dcl/DclClient.js +1 -2
- package/dist/cjs/dcl/DclClient.js.map +1 -1
- package/dist/cjs/dcl/DclOtaUpdateService.d.ts +30 -31
- package/dist/cjs/dcl/DclOtaUpdateService.d.ts.map +1 -1
- package/dist/cjs/dcl/DclOtaUpdateService.js +191 -92
- package/dist/cjs/dcl/DclOtaUpdateService.js.map +2 -2
- package/dist/cjs/dcl/index.d.ts +0 -3
- package/dist/cjs/dcl/index.d.ts.map +1 -1
- package/dist/cjs/dcl/index.js +0 -3
- package/dist/cjs/dcl/index.js.map +1 -1
- package/dist/cjs/fabric/Fabric.d.ts +53 -9
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +59 -32
- package/dist/cjs/fabric/Fabric.js.map +1 -1
- package/dist/cjs/fabric/FabricAuthority.js +1 -1
- package/dist/cjs/fabric/FabricAuthority.js.map +1 -1
- package/dist/cjs/fabric/FabricManager.d.ts +14 -5
- package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
- package/dist/cjs/fabric/FabricManager.js +63 -42
- package/dist/cjs/fabric/FabricManager.js.map +1 -1
- package/dist/cjs/groups/FabricGroups.d.ts.map +1 -1
- package/dist/cjs/groups/FabricGroups.js +4 -8
- package/dist/cjs/groups/FabricGroups.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.d.ts +1 -106
- package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.js +2 -143
- package/dist/cjs/interaction/InteractionMessenger.js.map +2 -2
- package/dist/cjs/interaction/index.d.ts +0 -1
- package/dist/cjs/interaction/index.d.ts.map +1 -1
- package/dist/cjs/interaction/index.js +0 -1
- package/dist/cjs/interaction/index.js.map +1 -1
- package/dist/cjs/mdns/MdnsClient.d.ts +4 -4
- package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsClient.js +12 -15
- package/dist/cjs/mdns/MdnsClient.js.map +1 -1
- package/dist/cjs/mdns/MdnsConsts.d.ts +3 -3
- package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsConsts.js +3 -2
- package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
- package/dist/{esm/dcl → cjs/ota}/OtaImageHeader.d.ts.map +1 -1
- package/dist/cjs/{dcl → ota}/OtaImageHeader.js.map +1 -1
- package/dist/cjs/{dcl → ota}/OtaImageReader.d.ts.map +1 -1
- package/dist/cjs/{dcl → ota}/OtaImageReader.js +0 -2
- package/dist/cjs/ota/OtaImageReader.js.map +6 -0
- package/dist/{esm/dcl → cjs/ota}/OtaImageWriter.d.ts +1 -1
- package/dist/cjs/{dcl → ota}/OtaImageWriter.d.ts.map +1 -1
- package/dist/cjs/{dcl → ota}/OtaImageWriter.js.map +1 -1
- package/dist/cjs/ota/index.d.ts +9 -0
- package/dist/cjs/ota/index.d.ts.map +1 -0
- package/dist/cjs/ota/index.js +26 -0
- package/dist/cjs/ota/index.js.map +6 -0
- package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioner.js +5 -0
- package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts +11 -3
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.js +119 -40
- package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/peer/PeerSet.js +17 -10
- package/dist/cjs/peer/PeerSet.js.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.js +3 -3
- package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/cjs/protocol/ExchangeProvider.d.ts +2 -2
- package/dist/cjs/protocol/ExchangeProvider.d.ts.map +1 -1
- package/dist/cjs/protocol/ExchangeProvider.js +2 -2
- package/dist/cjs/protocol/ExchangeProvider.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +3 -3
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/cjs/protocol/ProtocolMocks.d.ts +2 -2
- package/dist/cjs/protocol/ProtocolMocks.d.ts.map +1 -1
- package/dist/cjs/protocol/ProtocolMocks.js +1 -1
- package/dist/cjs/protocol/ProtocolMocks.js.map +1 -1
- package/dist/cjs/session/NodeSession.d.ts.map +1 -1
- package/dist/cjs/session/NodeSession.js +2 -2
- package/dist/cjs/session/NodeSession.js.map +1 -1
- package/dist/cjs/session/Session.d.ts.map +1 -1
- package/dist/cjs/session/Session.js +1 -0
- package/dist/cjs/session/Session.js.map +1 -1
- package/dist/cjs/session/SessionManager.js +2 -2
- package/dist/cjs/session/SessionManager.js.map +1 -1
- package/dist/cjs/session/SessionParameters.d.ts.map +1 -1
- package/dist/cjs/session/SessionParameters.js +7 -1
- package/dist/cjs/session/SessionParameters.js.map +1 -1
- package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseServer.js +1 -0
- package/dist/cjs/session/pase/PaseServer.js.map +1 -1
- package/dist/esm/action/client/ClientBdx.d.ts +17 -0
- package/dist/esm/action/client/ClientBdx.d.ts.map +1 -0
- package/dist/esm/action/client/ClientBdx.js +6 -0
- package/dist/esm/action/client/ClientBdx.js.map +6 -0
- package/dist/esm/action/client/ClientInteraction.d.ts +10 -1
- package/dist/esm/action/client/ClientInteraction.d.ts.map +1 -1
- package/dist/esm/action/client/ClientInteraction.js +24 -1
- package/dist/esm/action/client/ClientInteraction.js.map +1 -1
- package/dist/esm/action/client/QueuedClientInteraction.d.ts +11 -3
- package/dist/esm/action/client/QueuedClientInteraction.d.ts.map +1 -1
- package/dist/esm/action/client/QueuedClientInteraction.js +5 -1
- package/dist/esm/action/client/QueuedClientInteraction.js.map +1 -1
- package/dist/esm/action/client/index.d.ts +1 -0
- package/dist/esm/action/client/index.d.ts.map +1 -1
- package/dist/esm/action/client/index.js +1 -0
- package/dist/esm/action/client/index.js.map +1 -1
- package/dist/esm/action/request/Read.d.ts.map +1 -1
- package/dist/esm/action/request/Read.js +2 -2
- package/dist/esm/action/request/Read.js.map +1 -1
- package/dist/esm/action/request/Write.js +4 -3
- package/dist/esm/action/request/Write.js.map +1 -1
- package/dist/esm/advertisement/ble/BleAdvertisement.d.ts +1 -1
- package/dist/esm/advertisement/ble/BleAdvertisement.d.ts.map +1 -1
- package/dist/esm/advertisement/ble/BleAdvertisement.js +2 -2
- package/dist/esm/advertisement/ble/BleAdvertisement.js.map +1 -1
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +1 -1
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js +1 -1
- package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +1 -1
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -1
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js +4 -6
- package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js.map +1 -1
- package/dist/esm/bdx/BdxClient.d.ts +2 -0
- package/dist/esm/bdx/BdxClient.d.ts.map +1 -1
- package/dist/esm/bdx/BdxClient.js +6 -0
- package/dist/esm/bdx/BdxClient.js.map +1 -1
- package/dist/esm/bdx/BdxError.d.ts +2 -0
- package/dist/esm/bdx/BdxError.d.ts.map +1 -1
- package/dist/esm/bdx/BdxError.js +2 -0
- package/dist/esm/bdx/BdxError.js.map +1 -1
- package/dist/esm/bdx/BdxMessenger.d.ts +5 -1
- package/dist/esm/bdx/BdxMessenger.d.ts.map +1 -1
- package/dist/esm/bdx/BdxMessenger.js +14 -5
- package/dist/esm/bdx/BdxMessenger.js.map +1 -1
- package/dist/esm/bdx/BdxProtocol.d.ts +14 -7
- package/dist/esm/bdx/BdxProtocol.d.ts.map +1 -1
- package/dist/esm/bdx/BdxProtocol.js +82 -20
- package/dist/esm/bdx/BdxProtocol.js.map +1 -1
- package/dist/esm/bdx/BdxSession.d.ts +10 -3
- package/dist/esm/bdx/BdxSession.d.ts.map +1 -1
- package/dist/esm/bdx/BdxSession.js +34 -9
- package/dist/esm/bdx/BdxSession.js.map +1 -1
- package/dist/esm/bdx/BdxSessionConfiguration.d.ts +16 -1
- package/dist/esm/bdx/BdxSessionConfiguration.d.ts.map +1 -1
- package/dist/esm/bdx/BdxSessionConfiguration.js +6 -1
- package/dist/esm/bdx/BdxSessionConfiguration.js.map +1 -1
- package/dist/esm/bdx/FileDesignator.d.ts +15 -1
- package/dist/esm/bdx/FileDesignator.d.ts.map +1 -1
- package/dist/esm/bdx/FileDesignator.js +29 -3
- package/dist/esm/bdx/FileDesignator.js.map +1 -1
- package/dist/esm/bdx/PersistedFileDesignator.d.ts +10 -2
- package/dist/esm/bdx/PersistedFileDesignator.d.ts.map +1 -1
- package/dist/esm/bdx/PersistedFileDesignator.js +24 -6
- package/dist/esm/bdx/PersistedFileDesignator.js.map +1 -1
- package/dist/esm/bdx/ScopedStorage.d.ts +18 -0
- package/dist/esm/bdx/ScopedStorage.d.ts.map +1 -0
- package/dist/esm/bdx/ScopedStorage.js +16 -0
- package/dist/esm/bdx/ScopedStorage.js.map +6 -0
- package/dist/esm/bdx/bdx-session-initiator.d.ts.map +1 -1
- package/dist/esm/bdx/bdx-session-initiator.js +10 -2
- package/dist/esm/bdx/bdx-session-initiator.js.map +1 -1
- package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/DrivenSendingFlow.js +2 -0
- package/dist/esm/bdx/flow/DrivenSendingFlow.js.map +1 -1
- package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/DrivingReceivingFlow.js +1 -0
- package/dist/esm/bdx/flow/DrivingReceivingFlow.js.map +1 -1
- package/dist/esm/bdx/flow/Flow.d.ts +7 -0
- package/dist/esm/bdx/flow/Flow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/Flow.js +23 -2
- package/dist/esm/bdx/flow/Flow.js.map +1 -1
- package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/FollowingReceivingFlow.js +3 -0
- package/dist/esm/bdx/flow/FollowingReceivingFlow.js.map +1 -1
- package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/FollowingSendingFlow.js +1 -0
- package/dist/esm/bdx/flow/FollowingSendingFlow.js.map +1 -1
- package/dist/esm/bdx/flow/OutboundFlow.d.ts.map +1 -1
- package/dist/esm/bdx/flow/OutboundFlow.js +1 -0
- package/dist/esm/bdx/flow/OutboundFlow.js.map +1 -1
- package/dist/esm/bdx/index.d.ts +1 -0
- package/dist/esm/bdx/index.d.ts.map +1 -1
- package/dist/esm/bdx/index.js +1 -0
- package/dist/esm/bdx/index.js.map +1 -1
- package/dist/esm/certificate/kinds/Icac.d.ts.map +1 -1
- package/dist/esm/certificate/kinds/Icac.js +1 -7
- package/dist/esm/certificate/kinds/Icac.js.map +1 -1
- package/dist/esm/certificate/kinds/Rcac.d.ts +1 -0
- package/dist/esm/certificate/kinds/Rcac.d.ts.map +1 -1
- package/dist/esm/certificate/kinds/Rcac.js +3 -0
- package/dist/esm/certificate/kinds/Rcac.js.map +1 -1
- package/dist/esm/certificate/kinds/definitions/operational.d.ts +1 -1
- package/dist/esm/certificate/kinds/definitions/operational.js +1 -1
- package/dist/esm/certificate/kinds/definitions/operational.js.map +1 -1
- package/dist/esm/common/FailsafeContext.js +2 -2
- package/dist/esm/common/FailsafeContext.js.map +1 -1
- package/dist/esm/dcl/DclClient.d.ts.map +1 -1
- package/dist/esm/dcl/DclClient.js +1 -2
- package/dist/esm/dcl/DclClient.js.map +1 -1
- package/dist/esm/dcl/DclOtaUpdateService.d.ts +30 -31
- package/dist/esm/dcl/DclOtaUpdateService.d.ts.map +1 -1
- package/dist/esm/dcl/DclOtaUpdateService.js +191 -93
- package/dist/esm/dcl/DclOtaUpdateService.js.map +2 -2
- package/dist/esm/dcl/index.d.ts +0 -3
- package/dist/esm/dcl/index.d.ts.map +1 -1
- package/dist/esm/dcl/index.js +0 -3
- package/dist/esm/dcl/index.js.map +1 -1
- package/dist/esm/fabric/Fabric.d.ts +53 -9
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +67 -33
- package/dist/esm/fabric/Fabric.js.map +1 -1
- package/dist/esm/fabric/FabricAuthority.js +1 -1
- package/dist/esm/fabric/FabricAuthority.js.map +1 -1
- package/dist/esm/fabric/FabricManager.d.ts +14 -5
- package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
- package/dist/esm/fabric/FabricManager.js +66 -43
- package/dist/esm/fabric/FabricManager.js.map +1 -1
- package/dist/esm/groups/FabricGroups.d.ts.map +1 -1
- package/dist/esm/groups/FabricGroups.js +5 -9
- package/dist/esm/groups/FabricGroups.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.d.ts +1 -106
- package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.js +2 -144
- package/dist/esm/interaction/InteractionMessenger.js.map +2 -2
- package/dist/esm/interaction/index.d.ts +0 -1
- package/dist/esm/interaction/index.d.ts.map +1 -1
- package/dist/esm/interaction/index.js +0 -1
- package/dist/esm/interaction/index.js.map +1 -1
- package/dist/esm/mdns/MdnsClient.d.ts +4 -4
- package/dist/esm/mdns/MdnsClient.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsClient.js +13 -17
- package/dist/esm/mdns/MdnsClient.js.map +1 -1
- package/dist/esm/mdns/MdnsConsts.d.ts +3 -3
- package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsConsts.js +3 -2
- package/dist/esm/mdns/MdnsConsts.js.map +1 -1
- package/dist/{cjs/dcl → esm/ota}/OtaImageHeader.d.ts.map +1 -1
- package/dist/esm/{dcl → ota}/OtaImageHeader.js.map +1 -1
- package/dist/esm/{dcl → ota}/OtaImageReader.d.ts.map +1 -1
- package/dist/esm/{dcl → ota}/OtaImageReader.js +0 -3
- package/dist/esm/ota/OtaImageReader.js.map +6 -0
- package/dist/{cjs/dcl → esm/ota}/OtaImageWriter.d.ts +1 -1
- package/dist/esm/{dcl → ota}/OtaImageWriter.d.ts.map +1 -1
- package/dist/esm/{dcl → ota}/OtaImageWriter.js.map +1 -1
- package/dist/esm/ota/index.d.ts +9 -0
- package/dist/esm/ota/index.d.ts.map +1 -0
- package/dist/esm/ota/index.js +9 -0
- package/dist/esm/ota/index.js.map +6 -0
- package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioner.js +5 -0
- package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts +11 -3
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.js +119 -41
- package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/peer/PeerSet.js +17 -10
- package/dist/esm/peer/PeerSet.js.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.js +3 -3
- package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/esm/protocol/ExchangeProvider.d.ts +2 -2
- package/dist/esm/protocol/ExchangeProvider.d.ts.map +1 -1
- package/dist/esm/protocol/ExchangeProvider.js +2 -2
- package/dist/esm/protocol/ExchangeProvider.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +3 -3
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/protocol/ProtocolMocks.d.ts +2 -2
- package/dist/esm/protocol/ProtocolMocks.d.ts.map +1 -1
- package/dist/esm/protocol/ProtocolMocks.js +11 -2
- package/dist/esm/protocol/ProtocolMocks.js.map +1 -1
- package/dist/esm/session/NodeSession.d.ts.map +1 -1
- package/dist/esm/session/NodeSession.js +3 -3
- package/dist/esm/session/NodeSession.js.map +1 -1
- package/dist/esm/session/Session.d.ts.map +1 -1
- package/dist/esm/session/Session.js +1 -0
- package/dist/esm/session/Session.js.map +1 -1
- package/dist/esm/session/SessionManager.js +2 -2
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/SessionParameters.d.ts.map +1 -1
- package/dist/esm/session/SessionParameters.js +7 -1
- package/dist/esm/session/SessionParameters.js.map +1 -1
- package/dist/esm/session/pase/PaseServer.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseServer.js +1 -0
- package/dist/esm/session/pase/PaseServer.js.map +1 -1
- package/package.json +6 -6
- package/src/action/client/ClientBdx.ts +19 -0
- package/src/action/client/ClientInteraction.ts +34 -4
- package/src/action/client/QueuedClientInteraction.ts +16 -12
- package/src/action/client/index.ts +1 -0
- package/src/action/request/Read.ts +8 -2
- package/src/action/request/Write.ts +3 -3
- package/src/advertisement/ble/BleAdvertisement.ts +4 -4
- package/src/advertisement/mdns/CommissionableMdnsAdvertisement.ts +1 -1
- package/src/advertisement/mdns/OperationalMdnsAdvertisement.ts +4 -6
- package/src/bdx/BdxClient.ts +8 -0
- package/src/bdx/BdxError.ts +2 -0
- package/src/bdx/BdxMessenger.ts +16 -5
- package/src/bdx/BdxProtocol.ts +104 -22
- package/src/bdx/BdxSession.ts +38 -16
- package/src/bdx/BdxSessionConfiguration.ts +24 -2
- package/src/bdx/FileDesignator.ts +31 -2
- package/src/bdx/PersistedFileDesignator.ts +35 -8
- package/src/bdx/ScopedStorage.ts +25 -0
- package/src/bdx/bdx-session-initiator.ts +11 -2
- package/src/bdx/flow/DrivenSendingFlow.ts +3 -0
- package/src/bdx/flow/DrivingReceivingFlow.ts +1 -0
- package/src/bdx/flow/Flow.ts +29 -2
- package/src/bdx/flow/FollowingReceivingFlow.ts +3 -0
- package/src/bdx/flow/FollowingSendingFlow.ts +2 -0
- package/src/bdx/flow/OutboundFlow.ts +1 -0
- package/src/bdx/index.ts +1 -0
- package/src/certificate/kinds/Icac.ts +4 -1
- package/src/certificate/kinds/Rcac.ts +4 -0
- package/src/certificate/kinds/definitions/operational.ts +1 -1
- package/src/common/FailsafeContext.ts +2 -2
- package/src/dcl/DclClient.ts +1 -2
- package/src/dcl/DclOtaUpdateService.ts +266 -125
- package/src/dcl/index.ts +0 -3
- package/src/fabric/Fabric.ts +118 -39
- package/src/fabric/FabricAuthority.ts +1 -1
- package/src/fabric/FabricManager.ts +76 -49
- package/src/groups/FabricGroups.ts +5 -9
- package/src/index.ts +1 -0
- package/src/interaction/InteractionMessenger.ts +2 -186
- package/src/interaction/index.ts +0 -1
- package/src/mdns/MdnsClient.ts +14 -19
- package/src/mdns/MdnsConsts.ts +5 -4
- package/src/{dcl → ota}/OtaImageReader.ts +1 -5
- package/src/{dcl → ota}/OtaImageWriter.ts +1 -1
- package/src/ota/index.ts +9 -0
- package/src/peer/ControllerCommissioner.ts +7 -0
- package/src/peer/ControllerCommissioningFlow.ts +161 -54
- package/src/peer/PeerSet.ts +25 -12
- package/src/protocol/DeviceAdvertiser.ts +5 -5
- package/src/protocol/ExchangeProvider.ts +3 -3
- package/src/protocol/MessageExchange.ts +3 -3
- package/src/protocol/ProtocolMocks.ts +13 -4
- package/src/session/NodeSession.ts +3 -3
- package/src/session/Session.ts +1 -0
- package/src/session/SessionManager.ts +2 -2
- package/src/session/SessionParameters.ts +10 -2
- package/src/session/pase/PaseServer.ts +2 -1
- package/dist/cjs/dcl/OtaImageReader.js.map +0 -6
- package/dist/cjs/interaction/SubscriptionClient.d.ts +0 -39
- package/dist/cjs/interaction/SubscriptionClient.d.ts.map +0 -1
- package/dist/cjs/interaction/SubscriptionClient.js +0 -93
- package/dist/cjs/interaction/SubscriptionClient.js.map +0 -6
- package/dist/esm/dcl/OtaImageReader.js.map +0 -6
- package/dist/esm/interaction/SubscriptionClient.d.ts +0 -39
- package/dist/esm/interaction/SubscriptionClient.d.ts.map +0 -1
- package/dist/esm/interaction/SubscriptionClient.js +0 -73
- package/dist/esm/interaction/SubscriptionClient.js.map +0 -6
- package/src/interaction/SubscriptionClient.ts +0 -104
- /package/dist/cjs/{dcl → ota}/OtaImageHeader.d.ts +0 -0
- /package/dist/cjs/{dcl → ota}/OtaImageHeader.js +0 -0
- /package/dist/cjs/{dcl → ota}/OtaImageReader.d.ts +0 -0
- /package/dist/cjs/{dcl → ota}/OtaImageWriter.js +0 -0
- /package/dist/esm/{dcl → ota}/OtaImageHeader.d.ts +0 -0
- /package/dist/esm/{dcl → ota}/OtaImageHeader.js +0 -0
- /package/dist/esm/{dcl → ota}/OtaImageReader.d.ts +0 -0
- /package/dist/esm/{dcl → ota}/OtaImageWriter.js +0 -0
- /package/src/{dcl → ota}/OtaImageHeader.ts +0 -0
package/src/bdx/BdxProtocol.ts
CHANGED
|
@@ -4,9 +4,16 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { BdxError } from "#bdx/BdxError.js";
|
|
8
|
+
import { FileDesignator } from "#bdx/FileDesignator.js";
|
|
9
|
+
import { PersistedFileDesignator } from "#bdx/PersistedFileDesignator.js";
|
|
10
|
+
import { ScopedStorage } from "#bdx/ScopedStorage.js";
|
|
11
|
+
import { Duration, Environment, Environmental, isDeepEqual, Logger, MatterError, Observable } from "#general";
|
|
12
|
+
import { PeerAddress } from "#peer/PeerAddress.js";
|
|
13
|
+
import { ExchangeManager } from "#protocol/ExchangeManager.js";
|
|
8
14
|
import { MessageExchange } from "#protocol/MessageExchange.js";
|
|
9
15
|
import { ProtocolHandler } from "#protocol/ProtocolHandler.js";
|
|
16
|
+
import { SecureSession } from "#session/SecureSession.js";
|
|
10
17
|
import { BDX_PROTOCOL_ID, BdxMessageType, BdxStatusCode } from "#types";
|
|
11
18
|
import { Message } from "../codec/MessageCodec.js";
|
|
12
19
|
import { BdxMessenger } from "./BdxMessenger.js";
|
|
@@ -20,23 +27,68 @@ const logger = Logger.get("BdxProtocol");
|
|
|
20
27
|
export class BdxProtocol implements ProtocolHandler {
|
|
21
28
|
readonly id = BDX_PROTOCOL_ID;
|
|
22
29
|
readonly requiresSecureSession = true;
|
|
23
|
-
readonly #activeBdxSessions = new Map<MessageExchange, BdxSession>();
|
|
24
|
-
#storage:
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
readonly #activeBdxSessions = new Map<MessageExchange, { session: BdxSession; scope: string }>();
|
|
31
|
+
#peerScopes = new Map<string, { peer: PeerAddress; storage: ScopedStorage; config?: BdxProtocol.Config }>();
|
|
32
|
+
#sessionStarted = Observable<[session: BdxSession, scope: string]>();
|
|
33
|
+
#sessionClosed = Observable<[session: BdxSession, scope: string]>();
|
|
34
|
+
|
|
35
|
+
static [Environmental.create](env: Environment) {
|
|
36
|
+
const instance = new BdxProtocol();
|
|
37
|
+
env.get(ExchangeManager).addProtocolHandler(instance);
|
|
38
|
+
env.set(BdxProtocol, instance);
|
|
39
|
+
return instance;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
get sessionStarted() {
|
|
43
|
+
return this.#sessionStarted;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
get sessionClosed() {
|
|
47
|
+
return this.#sessionClosed;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#peerScopeKey(peer: PeerAddress, scope?: string) {
|
|
51
|
+
if (scope === undefined) {
|
|
52
|
+
throw new MatterError("StorageContext must have a defined scope to be used with enableScope");
|
|
53
|
+
}
|
|
54
|
+
return `${peer.toString()}-${scope}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
enablePeerForScope(peer: PeerAddress, storage: ScopedStorage, config?: BdxProtocol.Config) {
|
|
58
|
+
const peerScopeStr = this.#peerScopeKey(peer, storage.scope);
|
|
59
|
+
const peerDetails = this.#peerScopes.get(peerScopeStr);
|
|
60
|
+
if (peerDetails !== undefined) {
|
|
61
|
+
const { storage: existingStorage, config: existingConfig } = peerDetails;
|
|
62
|
+
logger.warn(config, "vs", existingConfig);
|
|
63
|
+
if (existingStorage !== storage || isDeepEqual(config, existingConfig)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
this.#peerScopes.set(peerScopeStr, { peer, storage, config });
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async disablePeerForScope(peer: PeerAddress, storage: ScopedStorage, force = false) {
|
|
73
|
+
if (this.#activeBdxSessions.size > 0) {
|
|
74
|
+
for (const { session, scope } of this.#activeBdxSessions.values()) {
|
|
75
|
+
if (storage.scope === scope && PeerAddress.is(peer, session.peerAddress)) {
|
|
76
|
+
if (force) {
|
|
77
|
+
await session.close(new MatterError("BDX protocol scope disabled"));
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
throw new MatterError(
|
|
81
|
+
`Cannot disable BDX for peer "${peer}" (scope: ${scope}) because there are active BDX sessions using it`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.#peerScopes.delete(this.#peerScopeKey(peer, storage.scope));
|
|
35
87
|
}
|
|
36
88
|
|
|
37
89
|
async onNewExchange(exchange: MessageExchange, message: Message) {
|
|
38
90
|
const initMessageType = message.payloadHeader.messageType;
|
|
39
|
-
|
|
91
|
+
SecureSession.assert(exchange.session);
|
|
40
92
|
|
|
41
93
|
switch (initMessageType) {
|
|
42
94
|
case BdxMessageType.SendInit:
|
|
@@ -44,13 +96,32 @@ export class BdxProtocol implements ProtocolHandler {
|
|
|
44
96
|
logger.debug(
|
|
45
97
|
`Initialize Session for ${BdxMessageType[initMessageType]} message on BDX protocol for exchange ${exchange.id}`,
|
|
46
98
|
);
|
|
99
|
+
await exchange.nextMessage(); // Read the message we just know
|
|
100
|
+
|
|
47
101
|
const { payload } = message;
|
|
48
|
-
|
|
102
|
+
|
|
103
|
+
const initMessage = new BdxInitMessageSchema().decode(payload);
|
|
104
|
+
const { fileDesignator: messageFileDesignator } = initMessage;
|
|
105
|
+
const fd = new FileDesignator(messageFileDesignator);
|
|
106
|
+
const [storageScope, fileDesignator] = fd.text.split("/");
|
|
107
|
+
const { storage, config } =
|
|
108
|
+
this.#peerScopes.get(this.#peerScopeKey(exchange.session.peerAddress, storageScope)) ?? {};
|
|
109
|
+
if (storage === undefined || fileDesignator === undefined) {
|
|
110
|
+
throw new BdxError(
|
|
111
|
+
`No storage context found for BDX file designator "${fd.text}"`,
|
|
112
|
+
BdxStatusCode.FileDesignatorUnknown,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const messenger = new BdxMessenger(exchange, config?.messageTimeout);
|
|
117
|
+
|
|
118
|
+
const bdxSession = BdxSession.fromMessage(messenger, {
|
|
49
119
|
initMessageType,
|
|
50
|
-
initMessage
|
|
51
|
-
|
|
120
|
+
initMessage,
|
|
121
|
+
fileDesignator: new PersistedFileDesignator(fileDesignator, storage),
|
|
122
|
+
...config,
|
|
52
123
|
});
|
|
53
|
-
await this.#registerSession(messenger, bdxSession);
|
|
124
|
+
await this.#registerSession(messenger, bdxSession, storageScope);
|
|
54
125
|
|
|
55
126
|
try {
|
|
56
127
|
await bdxSession.processTransfer();
|
|
@@ -63,31 +134,42 @@ export class BdxProtocol implements ProtocolHandler {
|
|
|
63
134
|
logger.warn(
|
|
64
135
|
`Unexpected BDX message type ${BdxMessageType[initMessageType]} on new exchange ${exchange.id}`,
|
|
65
136
|
);
|
|
66
|
-
await
|
|
137
|
+
await new BdxMessenger(exchange).sendError(BdxStatusCode.UnexpectedMessage);
|
|
67
138
|
}
|
|
68
139
|
}
|
|
69
140
|
|
|
70
141
|
/** Make sure only one BDX session can be active per exchange and that the exchange is closed with the BDX session. */
|
|
71
|
-
async #registerSession(messenger: BdxMessenger, bdxSession: BdxSession) {
|
|
142
|
+
async #registerSession(messenger: BdxMessenger, bdxSession: BdxSession, scope: string) {
|
|
72
143
|
const exchange = messenger.exchange;
|
|
73
144
|
if (this.#activeBdxSessions.has(exchange)) {
|
|
74
145
|
logger.warn(`BDX session for exchange ${exchange.id} already exists, sending error`);
|
|
75
146
|
await messenger.sendError(BdxStatusCode.UnexpectedMessage);
|
|
76
147
|
return;
|
|
77
148
|
}
|
|
78
|
-
this.#activeBdxSessions.set(exchange, bdxSession);
|
|
149
|
+
this.#activeBdxSessions.set(exchange, { session: bdxSession, scope });
|
|
150
|
+
|
|
151
|
+
this.#sessionStarted.emit(bdxSession, scope);
|
|
152
|
+
|
|
79
153
|
bdxSession.closed.on(async () => {
|
|
80
154
|
logger.debug(`BDX session for exchange ${exchange.id} closed`);
|
|
81
155
|
this.#activeBdxSessions.delete(exchange);
|
|
82
156
|
await exchange.close();
|
|
157
|
+
|
|
158
|
+
this.#sessionClosed.emit(bdxSession, scope);
|
|
83
159
|
});
|
|
84
160
|
}
|
|
85
161
|
|
|
86
162
|
async close() {
|
|
87
163
|
logger.debug(`Closing BDX protocol handler with ${this.#activeBdxSessions.size} active sessions`);
|
|
88
|
-
for (const session of this.#activeBdxSessions.values()) {
|
|
164
|
+
for (const { session } of this.#activeBdxSessions.values()) {
|
|
89
165
|
await session.close(new MatterError("BDX protocol handler closed"));
|
|
90
166
|
}
|
|
91
167
|
this.#activeBdxSessions.clear();
|
|
92
168
|
}
|
|
93
169
|
}
|
|
170
|
+
|
|
171
|
+
export namespace BdxProtocol {
|
|
172
|
+
export interface Config extends BdxSessionConfiguration.Config {
|
|
173
|
+
messageTimeout?: Duration;
|
|
174
|
+
}
|
|
175
|
+
}
|
package/src/bdx/BdxSession.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { AsyncObservable, ClassExtends, Diagnostic, Logger,
|
|
7
|
+
import { AsyncObservable, ClassExtends, Diagnostic, Logger, Observable } from "#general";
|
|
8
|
+
import { SecureSession } from "#session/SecureSession.js";
|
|
8
9
|
import { BdxMessageType, BdxStatusCode } from "#types";
|
|
9
10
|
import { bdxSessionInitiator } from "./bdx-session-initiator.js";
|
|
10
11
|
import { BdxError } from "./BdxError.js";
|
|
@@ -15,7 +16,6 @@ import { DrivingReceivingFlow } from "./flow/DrivingReceivingFlow.js";
|
|
|
15
16
|
import { Flow } from "./flow/Flow.js";
|
|
16
17
|
import { FollowingReceivingFlow } from "./flow/FollowingReceivingFlow.js";
|
|
17
18
|
import { FollowingSendingFlow } from "./flow/FollowingSendingFlow.js";
|
|
18
|
-
import { PersistedFileDesignator } from "./PersistedFileDesignator.js";
|
|
19
19
|
|
|
20
20
|
const logger = Logger.get("BdxSession");
|
|
21
21
|
|
|
@@ -36,10 +36,10 @@ export class BdxSession {
|
|
|
36
36
|
#started = false;
|
|
37
37
|
#closed = AsyncObservable();
|
|
38
38
|
#isClosed = false;
|
|
39
|
-
|
|
40
39
|
#config: BdxSessionConfiguration;
|
|
41
|
-
|
|
42
40
|
#transferFlow?: Flow;
|
|
41
|
+
#progressInfo = Observable<[bytesTransferred: number, totalBytesLength: number | undefined]>();
|
|
42
|
+
#progressFinished = Observable<[totalBytesTransferred: number]>();
|
|
43
43
|
|
|
44
44
|
/** Initializes a BdxSession as a sender, means that we upload data to the peer. */
|
|
45
45
|
static asSender(messenger: BdxMessenger, options: BdxSessionConfiguration.SenderInitiatorOptions): BdxSession {
|
|
@@ -51,13 +51,13 @@ export class BdxSession {
|
|
|
51
51
|
return new BdxSession(messenger, { isSender: false, ...options });
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
): BdxSession {
|
|
60
|
-
const { initMessageType
|
|
54
|
+
/**
|
|
55
|
+
* Initializes a BdxSession from an incoming *Init message. The message determines the direction of the transfer.
|
|
56
|
+
* The provided storages allow to map the file designator to a storage context depending on the path prefix in the
|
|
57
|
+
* file designator.
|
|
58
|
+
*/
|
|
59
|
+
static fromMessage(messenger: BdxMessenger, options: BdxSessionConfiguration.ReceiverOptions): BdxSession {
|
|
60
|
+
const { initMessageType } = options;
|
|
61
61
|
if (initMessageType !== BdxMessageType.SendInit && initMessageType !== BdxMessageType.ReceiveInit) {
|
|
62
62
|
throw new BdxError(
|
|
63
63
|
`Invalid message type for BDX session initialization: ${BdxMessageType[initMessageType]} (${initMessageType})`,
|
|
@@ -65,11 +65,8 @@ export class BdxSession {
|
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const { fileDesignator } = initMessage;
|
|
69
|
-
|
|
70
68
|
return new BdxSession(messenger, {
|
|
71
69
|
isSender: initMessageType === BdxMessageType.ReceiveInit,
|
|
72
|
-
fileDesignator: new PersistedFileDesignator(fileDesignator, storage),
|
|
73
70
|
...options,
|
|
74
71
|
});
|
|
75
72
|
}
|
|
@@ -80,15 +77,26 @@ export class BdxSession {
|
|
|
80
77
|
this.#config = new BdxSessionConfiguration(options);
|
|
81
78
|
|
|
82
79
|
const exchange = messenger.exchange;
|
|
83
|
-
if (!exchange.
|
|
84
|
-
throw new BdxError("Bdx Protocol requires a
|
|
80
|
+
if (!exchange.session.isSecure) {
|
|
81
|
+
throw new BdxError("Bdx Protocol requires a secure session.");
|
|
85
82
|
}
|
|
86
83
|
exchange.closed.on(async () => {
|
|
84
|
+
if (this.#isClosed) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
87
|
logger.debug(`Closing BDX session for exchange ${exchange.id}`);
|
|
88
88
|
await this.close();
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
get progressInfo() {
|
|
93
|
+
return this.#progressInfo;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
get progressFinished() {
|
|
97
|
+
return this.#progressFinished;
|
|
98
|
+
}
|
|
99
|
+
|
|
92
100
|
/** Method called to start the session. It will end with a successful Transfer or with an error */
|
|
93
101
|
async processTransfer() {
|
|
94
102
|
if (this.#started) {
|
|
@@ -112,6 +120,12 @@ export class BdxSession {
|
|
|
112
120
|
this.#started = true;
|
|
113
121
|
try {
|
|
114
122
|
this.#transferFlow = this.#initializeFlow(await bdxSessionInitiator(this.#messenger, this.#config));
|
|
123
|
+
this.#transferFlow.progressInfo.on((bytesTransferred, totalBytesLength) =>
|
|
124
|
+
this.#progressInfo.emit(bytesTransferred, totalBytesLength),
|
|
125
|
+
);
|
|
126
|
+
this.#transferFlow.progressFinished.on(totalBytesTransferred =>
|
|
127
|
+
this.#progressFinished.emit(totalBytesTransferred),
|
|
128
|
+
);
|
|
115
129
|
|
|
116
130
|
await this.#transferFlow.processTransfer();
|
|
117
131
|
|
|
@@ -123,6 +137,9 @@ export class BdxSession {
|
|
|
123
137
|
logger.warn(`BDX session failed with error:`, error);
|
|
124
138
|
|
|
125
139
|
await this.close(error);
|
|
140
|
+
|
|
141
|
+
error.bytesTransferred = this.#transferFlow?.transferredBytes ?? 0;
|
|
142
|
+
error.totalBytesLength = this.#transferFlow?.dataLength;
|
|
126
143
|
throw error;
|
|
127
144
|
}
|
|
128
145
|
}
|
|
@@ -161,6 +178,11 @@ export class BdxSession {
|
|
|
161
178
|
return this.#closed;
|
|
162
179
|
}
|
|
163
180
|
|
|
181
|
+
get peerAddress() {
|
|
182
|
+
SecureSession.assert(this.#messenger.exchange.session);
|
|
183
|
+
return this.#messenger.exchange.session.peerAddress;
|
|
184
|
+
}
|
|
185
|
+
|
|
164
186
|
async close(error?: unknown) {
|
|
165
187
|
if (this.#isClosed) {
|
|
166
188
|
return;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { FileDesignator } from "#bdx/FileDesignator.js";
|
|
7
8
|
import { ImplementationError } from "#general";
|
|
8
9
|
import { BdxMessageType } from "#types";
|
|
9
10
|
import { Flow } from "./flow/Flow.js";
|
|
@@ -15,10 +16,12 @@ export class BdxSessionConfiguration {
|
|
|
15
16
|
#initMessage?: BdxInit;
|
|
16
17
|
#transferConfig: BdxSessionConfiguration.Config;
|
|
17
18
|
#fileDesignator: PersistedFileDesignator;
|
|
19
|
+
#transferFileDesignator: FileDesignator;
|
|
18
20
|
|
|
19
21
|
constructor(options: BdxSessionConfiguration.Options) {
|
|
20
|
-
const { isSender, fileDesignator, initMessage } = options;
|
|
22
|
+
const { isSender, fileDesignator, transferFileDesignator, initMessage } = options;
|
|
21
23
|
this.#fileDesignator = fileDesignator;
|
|
24
|
+
this.#transferFileDesignator = transferFileDesignator ?? fileDesignator;
|
|
22
25
|
this.#isSender = isSender;
|
|
23
26
|
this.#initMessage = initMessage;
|
|
24
27
|
this.#transferConfig = { ...BdxSessionConfiguration.DefaultConfig, ...options };
|
|
@@ -65,6 +68,10 @@ export class BdxSessionConfiguration {
|
|
|
65
68
|
return this.#fileDesignator;
|
|
66
69
|
}
|
|
67
70
|
|
|
71
|
+
get transferFileDesignator(): FileDesignator {
|
|
72
|
+
return this.#transferFileDesignator;
|
|
73
|
+
}
|
|
74
|
+
|
|
68
75
|
get transferConfig(): BdxSessionConfiguration.Config {
|
|
69
76
|
return this.#transferConfig;
|
|
70
77
|
}
|
|
@@ -106,6 +113,11 @@ export namespace BdxSessionConfiguration {
|
|
|
106
113
|
export interface InitiatorOptions extends BdxSessionConfiguration.Config {
|
|
107
114
|
/** FileDesignator to use for the session. The value is usually pre-determined with the peer. */
|
|
108
115
|
fileDesignator: PersistedFileDesignator;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Optional file designator to use for the transfer. This can be used to separate the file designator used
|
|
119
|
+
* in BDX messages from the persisted file. */
|
|
120
|
+
transferFileDesignator?: FileDesignator;
|
|
109
121
|
}
|
|
110
122
|
|
|
111
123
|
export interface SenderInitiatorOptions extends InitiatorOptions {
|
|
@@ -119,15 +131,25 @@ export namespace BdxSessionConfiguration {
|
|
|
119
131
|
export interface ReceiverOptions extends BdxSessionConfiguration.Config {
|
|
120
132
|
initMessageType: BdxMessageType;
|
|
121
133
|
initMessage: BdxInit; // The initial message received to start the session
|
|
134
|
+
fileDesignator: PersistedFileDesignator;
|
|
122
135
|
}
|
|
123
136
|
|
|
124
137
|
export interface Options extends BdxSessionConfiguration.Config {
|
|
125
138
|
/** True if the session is initiated as a sender, false for receiver */
|
|
126
139
|
isSender: boolean;
|
|
127
140
|
|
|
128
|
-
/**
|
|
141
|
+
/**
|
|
142
|
+
* File designator to use for the session and read from or write to. It points to the persisted blob storage.
|
|
143
|
+
*/
|
|
129
144
|
fileDesignator: PersistedFileDesignator;
|
|
130
145
|
|
|
146
|
+
/**
|
|
147
|
+
* Optional Transfer FileDesignator to use for the transfer, if different from the fileDesignator. This is
|
|
148
|
+
* mainly useful when receiving data where the fileDesignator used in the BDX messages is defined by the file
|
|
149
|
+
* sender and when the persisted file is stored under a different designator.
|
|
150
|
+
*/
|
|
151
|
+
transferFileDesignator?: FileDesignator;
|
|
152
|
+
|
|
131
153
|
/** The initial message received to start the session */
|
|
132
154
|
initMessage?: BdxInit;
|
|
133
155
|
}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { Bytes } from "#general";
|
|
7
|
+
import { Bytes, Diagnostic, ImplementationError } from "#general";
|
|
8
|
+
import { NodeId } from "#types";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Class to represent a File designator from Matter.
|
|
@@ -14,6 +15,20 @@ import { Bytes } from "#general";
|
|
|
14
15
|
export class FileDesignator {
|
|
15
16
|
#fd: Bytes;
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Initialize a FileDesignator from a BDX URI string. Also returns the source node ID of the owner of the file.
|
|
20
|
+
*/
|
|
21
|
+
static fromBdxUri(uri: string) {
|
|
22
|
+
const bdxParts = uri.match(/^bdx:\/\/([0-9A-F]{16})\/(\S+)$/);
|
|
23
|
+
if (!bdxParts) {
|
|
24
|
+
throw new ImplementationError(`Invalid OTA URI "${uri}"`);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
fileDesignator: new FileDesignator(bdxParts[2]),
|
|
28
|
+
sourceNodeId: NodeId(BigInt(`0x${bdxParts[1]}`)),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
17
32
|
/** Create a FileDesignator from a string or bytes object. */
|
|
18
33
|
constructor(fd: string | Bytes) {
|
|
19
34
|
if (typeof fd === "string") {
|
|
@@ -38,7 +53,9 @@ export class FileDesignator {
|
|
|
38
53
|
(byte >= 0x61 && byte <= 0x7a) || // a-z
|
|
39
54
|
(byte >= 0x30 && byte <= 0x39) || // 0..9
|
|
40
55
|
byte === 0x2e || // "."
|
|
41
|
-
byte === 0x2d
|
|
56
|
+
byte === 0x2d || // "-"
|
|
57
|
+
byte === 0x5f || // "_"
|
|
58
|
+
byte === 0x2f, // "/"
|
|
42
59
|
);
|
|
43
60
|
if (isValidName) {
|
|
44
61
|
return fileDesignatorData.reduce((name, byte) => name + String.fromCharCode(byte), "");
|
|
@@ -46,4 +63,16 @@ export class FileDesignator {
|
|
|
46
63
|
return `0x${Bytes.toHex(fileDesignatorData)}`;
|
|
47
64
|
}
|
|
48
65
|
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Return the FileDesignator as a BDX URI string. The source node ID of the owner of the file is required to
|
|
69
|
+
* generate a valid URI.
|
|
70
|
+
*/
|
|
71
|
+
asBdxUri(sourceNode: NodeId) {
|
|
72
|
+
return `bdx://${NodeId.strOf(sourceNode).toUpperCase()}/${this.text}`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get [Diagnostic.value](): string {
|
|
76
|
+
return this.text;
|
|
77
|
+
}
|
|
49
78
|
}
|
|
@@ -4,32 +4,57 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { ScopedStorage } from "#bdx/ScopedStorage.js";
|
|
8
|
+
import { Bytes, ImplementationError, Logger, StorageContext } from "#general";
|
|
8
9
|
import { FileDesignator } from "./FileDesignator.js";
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
const logger = Logger.get("PersistedFileDesignator");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A FileDesignator that points to a persisted file in a given StorageContext.
|
|
15
|
+
* If the file is supposed to be used for Bdx transfers where it could be requested by a client and is not actively
|
|
16
|
+
* sent or the location to store a received file, you need to pass a ScopedStorage to allow automatic target detection
|
|
17
|
+
* for BDX.
|
|
18
|
+
* The logic supports providing names separated by "." to automatically create sub contexts
|
|
19
|
+
*/
|
|
11
20
|
export class PersistedFileDesignator extends FileDesignator {
|
|
12
21
|
#storage: StorageContext;
|
|
13
22
|
#blob?: Blob;
|
|
23
|
+
#blobName: string;
|
|
14
24
|
|
|
15
|
-
constructor(fd: string | Bytes | FileDesignator, storage: StorageContext) {
|
|
25
|
+
constructor(fd: string | Bytes | FileDesignator, storage: StorageContext | ScopedStorage) {
|
|
16
26
|
if (fd instanceof FileDesignator) {
|
|
17
27
|
fd = fd.bytes;
|
|
18
28
|
}
|
|
29
|
+
const blobName = Bytes.isBytes(fd) ? Bytes.toString(fd) : fd;
|
|
30
|
+
if (storage instanceof ScopedStorage) {
|
|
31
|
+
fd = Bytes.fromString(`${storage.scope}/${blobName}`);
|
|
32
|
+
storage = storage.context;
|
|
33
|
+
}
|
|
19
34
|
super(fd);
|
|
35
|
+
const subContext = blobName.split(".");
|
|
36
|
+
this.#blobName = subContext.pop()!;
|
|
37
|
+
for (const parts of subContext) {
|
|
38
|
+
storage = storage.createContext(parts);
|
|
39
|
+
}
|
|
40
|
+
|
|
20
41
|
this.#storage = storage;
|
|
21
42
|
}
|
|
22
43
|
|
|
23
44
|
exists() {
|
|
24
|
-
return this.#storage.has(this
|
|
45
|
+
return this.#storage.has(this.#blobName);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get blobName() {
|
|
49
|
+
return this.#blobName;
|
|
25
50
|
}
|
|
26
51
|
|
|
27
52
|
async openBlob() {
|
|
28
53
|
if (this.#blob === undefined) {
|
|
29
|
-
const blobName = this
|
|
54
|
+
const blobName = this.#blobName;
|
|
30
55
|
if (!this.#storage.has(blobName)) {
|
|
31
56
|
throw new ImplementationError(
|
|
32
|
-
|
|
57
|
+
`File designator must point to an existing blob "${blobName}" in the storage to send data`,
|
|
33
58
|
);
|
|
34
59
|
}
|
|
35
60
|
this.#blob = await this.#storage.openBlob(blobName);
|
|
@@ -38,10 +63,12 @@ export class PersistedFileDesignator extends FileDesignator {
|
|
|
38
63
|
}
|
|
39
64
|
|
|
40
65
|
writeFromStream(stream: ReadableStream<Bytes>) {
|
|
41
|
-
|
|
66
|
+
logger.debug(`Writing blob "${this.text}" (${this.#blobName}) to storage`);
|
|
67
|
+
return this.#storage.writeBlobFromStream(this.#blobName, stream);
|
|
42
68
|
}
|
|
43
69
|
|
|
44
70
|
delete() {
|
|
45
|
-
|
|
71
|
+
logger.debug(`Deleting blob "${this.text}" (${this.#blobName}) from storage`);
|
|
72
|
+
return this.#storage.delete(this.#blobName);
|
|
46
73
|
}
|
|
47
74
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { StorageContext } from "#general";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Storage Scopes allow flagging a context for a specific usage.
|
|
11
|
+
* This is mainly used for BDX transfers currently to allow separating OTA related storage from log related storage
|
|
12
|
+
* and to automatically choose the right one based on the incoming file designator.
|
|
13
|
+
*/
|
|
14
|
+
export type StorageScope = "ota" | "log";
|
|
15
|
+
|
|
16
|
+
export class ScopedStorage {
|
|
17
|
+
readonly scope: StorageScope;
|
|
18
|
+
|
|
19
|
+
constructor(
|
|
20
|
+
public readonly context: StorageContext,
|
|
21
|
+
scope: StorageScope,
|
|
22
|
+
) {
|
|
23
|
+
this.scope = scope;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { FileDesignator } from "#bdx/FileDesignator.js";
|
|
7
8
|
import { ImplementationError, InternalError, Logger } from "#general";
|
|
8
9
|
import { BdxStatusCode, TypeFromPartialBitSchema } from "#types";
|
|
9
10
|
import { BdxError } from "./BdxError.js";
|
|
@@ -45,6 +46,14 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
|
|
|
45
46
|
}
|
|
46
47
|
logger.debug(`Initialize BDX ${config.isSender ? "ReceiveInit" : "SendInit"} from incoming Message`, initMessage);
|
|
47
48
|
|
|
49
|
+
const incomingFileDesignator = new FileDesignator(initMessage.fileDesignator);
|
|
50
|
+
if (incomingFileDesignator.text !== config.transferFileDesignator.text) {
|
|
51
|
+
throw new BdxError(
|
|
52
|
+
`File designator in Init message (${incomingFileDesignator.text}) does not match the configured transfer file designator (${config.transferFileDesignator.text})`,
|
|
53
|
+
BdxStatusCode.FileDesignatorUnknown,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
48
57
|
if (config.isSender) {
|
|
49
58
|
// We are Sender and Responder
|
|
50
59
|
if (!config.fileDesignator.exists()) {
|
|
@@ -100,7 +109,7 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
|
|
|
100
109
|
preferredDriverModes,
|
|
101
110
|
asynchronousTransferAllowed,
|
|
102
111
|
} = config.transferConfig;
|
|
103
|
-
const { isSender, fileDesignator } = config;
|
|
112
|
+
const { isSender, fileDesignator, transferFileDesignator } = config;
|
|
104
113
|
|
|
105
114
|
let startOffset: number | undefined;
|
|
106
115
|
let maxLength: number | undefined;
|
|
@@ -153,7 +162,7 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
|
|
|
153
162
|
asynchronousTransfer: asynchronousTransferAllowed, // always false for now
|
|
154
163
|
},
|
|
155
164
|
maxBlockSize,
|
|
156
|
-
fileDesignator:
|
|
165
|
+
fileDesignator: transferFileDesignator.bytes,
|
|
157
166
|
startOffset,
|
|
158
167
|
maxLength,
|
|
159
168
|
};
|
|
@@ -23,12 +23,15 @@ export class DrivenSendingFlow extends OutboundFlow {
|
|
|
23
23
|
if (done) {
|
|
24
24
|
// Send the last Block and wait for AckEof and close down
|
|
25
25
|
await this.messenger.sendBlockEof({ data: data ?? new Uint8Array(), blockCounter });
|
|
26
|
+
this.transferredBytes += data?.byteLength ?? 0;
|
|
27
|
+
|
|
26
28
|
this.finalBlockCounter = blockCounter;
|
|
27
29
|
return true;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
// Send the next Block
|
|
31
33
|
await this.messenger.sendBlock({ data, blockCounter });
|
|
34
|
+
this.transferredBytes += data.byteLength;
|
|
32
35
|
|
|
33
36
|
// Sync transfer just continues when the Ack is received
|
|
34
37
|
if (!asynchronousTransfer) {
|
|
@@ -27,6 +27,7 @@ export class DrivingReceivingFlow extends InboundFlow {
|
|
|
27
27
|
message: { blockCounter: dataBlockCounter, data },
|
|
28
28
|
} = await this.messenger.readBlock();
|
|
29
29
|
this.validateCounter(dataBlockCounter, blockCounter);
|
|
30
|
+
this.transferredBytes += data.byteLength;
|
|
30
31
|
|
|
31
32
|
// Write the received data chunk into the writing stream
|
|
32
33
|
if (this.writeDataChunk(writeController, data, messageType)) {
|