From da05c996d8202f8b232b2a4acb3040f8a15201f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20C=C3=A9sar=20Rocha?= Date: Fri, 20 Oct 2023 13:31:07 -0700 Subject: [PATCH 1/3] Implement BlobCollector (#12269) * Implement BlobCollector * Change files * clang format --- ...-5d9952b2-0b6d-4246-a1ec-994f54168545.json | 7 ++++++ vnext/Shared/Modules/BlobCollector.cpp | 21 +++++++++++++++++ vnext/Shared/Modules/BlobCollector.h | 23 +++++++++++++++++++ vnext/Shared/Modules/BlobModule.cpp | 19 +++++++++++++++ vnext/Shared/Shared.vcxitems | 2 ++ vnext/Shared/Shared.vcxitems.filters | 6 +++++ 6 files changed, 78 insertions(+) create mode 100644 change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json create mode 100644 vnext/Shared/Modules/BlobCollector.cpp create mode 100644 vnext/Shared/Modules/BlobCollector.h diff --git a/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json b/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json new file mode 100644 index 00000000000..50e0a89c002 --- /dev/null +++ b/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Implement BlobCollector", + "packageName": "react-native-windows", + "email": "julio.rocha@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/vnext/Shared/Modules/BlobCollector.cpp b/vnext/Shared/Modules/BlobCollector.cpp new file mode 100644 index 00000000000..131f4c6fb78 --- /dev/null +++ b/vnext/Shared/Modules/BlobCollector.cpp @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "BlobCollector.h" + +using std::string; + +namespace Microsoft::React { + +using Networking::IBlobResource; + +BlobCollector::BlobCollector(string blobId, std::shared_ptr resource) noexcept + : m_blobId{blobId}, m_weakResource{std::weak_ptr(resource)} {} + +BlobCollector::~BlobCollector() noexcept { + if (auto rc = m_weakResource.lock()) { + rc->Release(std::move(m_blobId)); + } +} + +} // namespace Microsoft::React diff --git a/vnext/Shared/Modules/BlobCollector.h b/vnext/Shared/Modules/BlobCollector.h new file mode 100644 index 00000000000..f8fc27e8ca1 --- /dev/null +++ b/vnext/Shared/Modules/BlobCollector.h @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once + +#include + +// JSI +#include + +namespace Microsoft::React { + +class JSI_EXPORT BlobCollector : public facebook::jsi::HostObject { + std::string m_blobId; + std::weak_ptr m_weakResource; + + public: + BlobCollector(std::string blobId, std::shared_ptr resource) noexcept; + + ~BlobCollector() noexcept; +}; + +} // namespace Microsoft::React diff --git a/vnext/Shared/Modules/BlobModule.cpp b/vnext/Shared/Modules/BlobModule.cpp index 4750d3e58a1..d54220cdb61 100644 --- a/vnext/Shared/Modules/BlobModule.cpp +++ b/vnext/Shared/Modules/BlobModule.cpp @@ -4,7 +4,9 @@ #include "BlobModule.h" #include +#include #include +#include "BlobCollector.h" // React Native #include @@ -38,6 +40,23 @@ void BlobTurboModule::Initialize(msrn::ReactContext const &reactContext) noexcep m_resource->Callbacks().OnError = [&reactContext](string &&errorText) { Modules::SendEvent(reactContext, L"blobFailed", {errorText}); }; + + namespace jsi = facebook::jsi; + msrn::ExecuteJsi(reactContext, [resource = m_resource](jsi::Runtime &runtime) { + runtime.global().setProperty( + runtime, + "__blobCollectorProvider", + jsi::Function::createFromHostFunction( + runtime, + jsi::PropNameID::forAscii(runtime, "__blobCollectorProvider"), + 1, + [resource](jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *args, size_t count) { + auto blobId = args[0].asString(rt).utf8(rt); + auto collector = std::make_shared(blobId, resource); + + return jsi::Object::createFromHostObject(rt, collector); + })); + }); } ReactNativeSpecs::BlobModuleSpec_Constants BlobTurboModule::GetConstants() noexcept { diff --git a/vnext/Shared/Shared.vcxitems b/vnext/Shared/Shared.vcxitems index ad5d51daa45..885812c516c 100644 --- a/vnext/Shared/Shared.vcxitems +++ b/vnext/Shared/Shared.vcxitems @@ -45,6 +45,7 @@ true + @@ -99,6 +100,7 @@ + diff --git a/vnext/Shared/Shared.vcxitems.filters b/vnext/Shared/Shared.vcxitems.filters index dd3b4021fe4..957a2c860cd 100644 --- a/vnext/Shared/Shared.vcxitems.filters +++ b/vnext/Shared/Shared.vcxitems.filters @@ -158,6 +158,9 @@ + + Source Files\Modules + @@ -487,6 +490,9 @@ + + Header Files\Modules + From 8161962983242942abe7f09bd6ef34549b17874c Mon Sep 17 00:00:00 2001 From: "Julio C. Rocha" Date: Fri, 20 Oct 2023 13:48:35 -0700 Subject: [PATCH 2/3] Remove change files --- ...ative-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json diff --git a/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json b/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json deleted file mode 100644 index 50e0a89c002..00000000000 --- a/change/react-native-windows-5d9952b2-0b6d-4246-a1ec-994f54168545.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Implement BlobCollector", - "packageName": "react-native-windows", - "email": "julio.rocha@microsoft.com", - "dependentChangeType": "patch" -} From bd414eb6344dec695de2634cb2ff2b54d43f6910 Mon Sep 17 00:00:00 2001 From: "Julio C. Rocha" Date: Fri, 20 Oct 2023 14:11:27 -0700 Subject: [PATCH 3/3] Change files --- ...ative-windows-097e5d2f-9d66-45b1-be82-d94fad723fcf.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/react-native-windows-097e5d2f-9d66-45b1-be82-d94fad723fcf.json diff --git a/change/react-native-windows-097e5d2f-9d66-45b1-be82-d94fad723fcf.json b/change/react-native-windows-097e5d2f-9d66-45b1-be82-d94fad723fcf.json new file mode 100644 index 00000000000..06042ae5362 --- /dev/null +++ b/change/react-native-windows-097e5d2f-9d66-45b1-be82-d94fad723fcf.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Implement BlobCollector (#12269)", + "packageName": "react-native-windows", + "email": "julio.rocha@microsoft.com", + "dependentChangeType": "patch" +}