Skip to content

Commit

Permalink
[0.72] Implement WebSocketTurboModuleProxy (#12232)
Browse files Browse the repository at this point in the history
* Implement WebSocketTurboModuleProxy (#12214)

* Implement WebSocketTurboModuleProxy

* Change files

* Define common constant for proxy ID name

* Define common constant for shared state ID name

* Define common constant for content handler ID name

* clang format

* Remove change file

* Change files
  • Loading branch information
JunielKatarn committed Oct 12, 2023
1 parent cce9774 commit 78f5a3d
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "Implement WebSocketTurboModuleProxy (#12214)",
"packageName": "react-native-windows",
"email": "julio.rocha@microsoft.com",
"dependentChangeType": "patch"
}
45 changes: 37 additions & 8 deletions vnext/Shared/Modules/WebSocketModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ using Microsoft::React::Networking::IWebSocketResource;

constexpr char s_moduleName[] = "WebSocketModule";
constexpr wchar_t s_moduleNameW[] = L"WebSocketModule";
constexpr wchar_t s_proxyNameW[] = L"WebSocketModule.Proxy";
constexpr wchar_t s_sharedStateNameW[] = L"WebSocketModule.SharedState";
constexpr wchar_t s_contentHandlerNameW[] = L"BlobModule.ContentHandler";

msrn::ReactModuleProvider s_moduleProvider = msrn::MakeTurboModuleProvider<Microsoft::React::WebSocketTurboModule>();

Expand Down Expand Up @@ -119,7 +122,7 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
auto args = msrn::JSValueObject{{"id", id}, {"type", isBinary ? "binary" : "text"}};
shared_ptr<Microsoft::React::IWebSocketModuleContentHandler> contentHandler;
auto propId = ReactPropertyId<ReactNonAbiValue<weak_ptr<Microsoft::React::IWebSocketModuleContentHandler>>>{
L"BlobModule.ContentHandler"};
s_contentHandlerNameW};
if (auto prop = propBag.Get(propId))
contentHandler = prop.Value().lock();

Expand Down Expand Up @@ -171,11 +174,11 @@ WebSocketModule::WebSocketModule(winrt::Windows::Foundation::IInspectable const

auto propBag = ReactPropertyBag{m_sharedState->InspectableProps.try_as<IReactPropertyBag>()};

auto proxyPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleProxy>>>{L"WebSocketModule.Proxy"};
auto proxyPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleProxy>>>{s_proxyNameW};
auto proxy = weak_ptr<IWebSocketModuleProxy>{m_proxy};
propBag.Set(proxyPropId, std::move(proxy));

auto statePropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<SharedState>>>{L"WebSocketModule.SharedState"};
auto statePropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<SharedState>>>{s_sharedStateNameW};
auto state = weak_ptr<SharedState>{m_sharedState};
propBag.Set(statePropId, std::move(state));
}
Expand Down Expand Up @@ -309,10 +312,9 @@ vector<facebook::xplat::module::CxxModule::Method> WebSocketModule::getMethods()
WebSocketModuleProxy::WebSocketModuleProxy(IInspectable const &inspectableProperties) noexcept
: m_inspectableProps{inspectableProperties} {}

void WebSocketModuleProxy::SendBinary(std::string &&base64String, int64_t id) noexcept /*override*/ {
void WebSocketModuleProxy::SendBinary(string &&base64String, int64_t id) noexcept /*override*/ {
auto propBag = ReactPropertyBag{m_inspectableProps.try_as<IReactPropertyBag>()};
auto sharedPropId =
ReactPropertyId<ReactNonAbiValue<weak_ptr<WebSocketModule::SharedState>>>{L"WebSocketModule.SharedState"};
auto sharedPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<WebSocketModule::SharedState>>>{s_sharedStateNameW};
auto state = propBag.Get(sharedPropId).Value();

weak_ptr weakWs = GetOrCreateWebSocket(id, {}, std::move(state));
Expand Down Expand Up @@ -353,8 +355,7 @@ shared_ptr<IWebSocketResource> WebSocketTurboModule::CreateResource(int64_t id,
rc->SetOnMessage([id, context = m_context](size_t length, const string &message, bool isBinary) {
auto args = msrn::JSValueObject{{"id", id}, {"type", isBinary ? "binary" : "text"}};
shared_ptr<IWebSocketModuleContentHandler> contentHandler;
auto propId =
ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleContentHandler>>>{L"BlobModule.ContentHandler"};
auto propId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleContentHandler>>>{s_contentHandlerNameW};
auto propBag = context.Properties();
if (auto prop = propBag.Get(propId))
contentHandler = prop.Value().lock();
Expand Down Expand Up @@ -396,6 +397,11 @@ shared_ptr<IWebSocketResource> WebSocketTurboModule::CreateResource(int64_t id,

void WebSocketTurboModule::Initialize(msrn::ReactContext const &reactContext) noexcept {
m_context = reactContext.Handle();
m_proxy = std::make_shared<WebSocketTurboModuleProxy>(m_resourceMap);

auto proxyPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleProxy>>>{s_proxyNameW};
auto proxy = weak_ptr<IWebSocketModuleProxy>{m_proxy};
m_context.Properties().Set(proxyPropId, std::move(proxy));
}

void WebSocketTurboModule::Connect(
Expand Down Expand Up @@ -487,6 +493,29 @@ void WebSocketTurboModule::RemoveListeners(double /*count*/) noexcept {}

#pragma endregion WebSocketTurboModule

#pragma region WebSocketTurboModuleProxy

WebSocketTurboModuleProxy::WebSocketTurboModuleProxy(
std::unordered_map<double, shared_ptr<IWebSocketResource>> &resourceMap) noexcept
: m_resourceMap{resourceMap} {}

#pragma endregion WebSocketTurboModuleProxy

void WebSocketTurboModuleProxy::SendBinary(string &&base64String, int64_t id) noexcept /*override*/
{
auto rcItr = m_resourceMap.find(static_cast<double>(id));
if (rcItr == m_resourceMap.cend()) {
return;
}

weak_ptr<IWebSocketResource> weakRc = (*rcItr).second;
if (auto rc = weakRc.lock()) {
rc->SendBinary(std::move(base64String));
}
}

#pragma region WebSocketTurboModule

/*extern*/ const char *GetWebSocketModuleName() noexcept {
return s_moduleName;
}
Expand Down
19 changes: 19 additions & 0 deletions vnext/Shared/Modules/WebSocketTurboModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,20 @@

namespace Microsoft::React {

class WebSocketTurboModuleProxy final : public IWebSocketModuleProxy {
std::unordered_map<double, std::shared_ptr<Networking::IWebSocketResource>> &m_resourceMap;

public:
WebSocketTurboModuleProxy(
std::unordered_map<double, std::shared_ptr<Networking::IWebSocketResource>> &resourceMap) noexcept;

#pragma region IWebSocketModuleProxy

void SendBinary(std::string &&base64String, int64_t id) noexcept override;

#pragma endregion
};

REACT_MODULE(WebSocketTurboModule, L"WebSocketModule")
struct WebSocketTurboModule {
using ModuleSpec = ReactNativeSpecs::WebSocketModuleSpec;
Expand Down Expand Up @@ -47,6 +61,11 @@ struct WebSocketTurboModule {

winrt::Microsoft::ReactNative::ReactContext m_context;
std::unordered_map<double, std::shared_ptr<Networking::IWebSocketResource>> m_resourceMap;

/// <summary>
/// Exposes a subset of the module's methods.
/// </summary>
std::shared_ptr<IWebSocketModuleProxy> m_proxy;
};

} // namespace Microsoft::React

0 comments on commit 78f5a3d

Please sign in to comment.