Skip to content

Commit fe37841

Browse files
committed
Add InspectorPackagerConnectionDelegate implementation
This adds an implementation of InspectorPackagerConnectionDelegate for react-native-windows.
1 parent bb79f34 commit fe37841

File tree

4 files changed

+119
-0
lines changed

4 files changed

+119
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
#include "FuseboxInspectorPackagerConnectionDelegate.h"
5+
#include <winrt/Microsoft.ReactNative.h>
6+
7+
namespace Microsoft::ReactNative {
8+
9+
FuseboxInspectorPackagerConnectionDelegate::WebSocket::WebSocket(
10+
std::string const &url,
11+
std::weak_ptr<facebook::react::jsinspector_modern::IWebSocketDelegate> delegate)
12+
: m_weakDelegate{delegate} {
13+
std::vector<winrt::Windows::Security::Cryptography::Certificates::ChainValidationResult> certExceptions;
14+
15+
m_packagerWebSocketConnection =
16+
std::make_shared<Microsoft::React::Networking::WinRTWebSocketResource>(std::move(certExceptions));
17+
18+
m_packagerWebSocketConnection->SetOnMessage([delegate](auto &&, const std::string &message, bool isBinary) {
19+
if (const auto strongDelegate = delegate.lock()) {
20+
strongDelegate->didReceiveMessage(message);
21+
}
22+
});
23+
m_packagerWebSocketConnection->SetOnError(
24+
[delegate](const Microsoft::React::Networking::IWebSocketResource::Error &error) {
25+
if (const auto strongDelegate = delegate.lock()) {
26+
strongDelegate->didFailWithError(std::nullopt, error.Message);
27+
}
28+
});
29+
// TODO: validate that this is called
30+
m_packagerWebSocketConnection->SetOnClose([delegate](auto &&...) {
31+
if (const auto strongDelegate = delegate.lock()) {
32+
strongDelegate->didClose();
33+
}
34+
});
35+
36+
Microsoft::React::Networking::IWebSocketResource::Protocols protocols;
37+
Microsoft::React::Networking::IWebSocketResource::Options options;
38+
m_packagerWebSocketConnection->Connect(std::string{url}, protocols, options);
39+
}
40+
41+
void FuseboxInspectorPackagerConnectionDelegate::WebSocket::send(std::string_view message) {
42+
m_packagerWebSocketConnection->Send(std::string{message});
43+
}
44+
45+
FuseboxInspectorPackagerConnectionDelegate::WebSocket::~WebSocket() {
46+
std::string reason{"Explicit close"};
47+
m_packagerWebSocketConnection->Close(
48+
Microsoft::React::Networking::WinRTWebSocketResource::CloseCode::GoingAway, reason);
49+
}
50+
51+
std::unique_ptr<facebook::react::jsinspector_modern::IWebSocket>
52+
FuseboxInspectorPackagerConnectionDelegate::connectWebSocket(
53+
const std::string &url,
54+
std::weak_ptr<facebook::react::jsinspector_modern::IWebSocketDelegate> delegate) {
55+
return std::make_unique<WebSocket>(url, delegate);
56+
}
57+
58+
winrt::fire_and_forget FuseboxInspectorPackagerConnectionDelegate::RunWithDelayAsync(
59+
std::function<void(void)> callback,
60+
std::chrono::milliseconds delayMs) {
61+
co_await winrt::resume_after(delayMs);
62+
m_inspectorThread->InvokeElsePost([callback]() { callback(); });
63+
}
64+
65+
void FuseboxInspectorPackagerConnectionDelegate::scheduleCallback(
66+
std::function<void(void)> callback,
67+
std::chrono::milliseconds delayMs) {
68+
RunWithDelayAsync(callback, delayMs);
69+
}
70+
71+
} // namespace Microsoft::ReactNative
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
#pragma once
5+
6+
#include <Networking/WinRTWebSocketResource.h>
7+
#include <dispatchQueue/dispatchQueue.h>
8+
#include <jsinspector-modern/InspectorPackagerConnection.h>
9+
10+
namespace Microsoft::ReactNative {
11+
12+
class FuseboxInspectorPackagerConnectionDelegate final
13+
: public facebook::react::jsinspector_modern::InspectorPackagerConnectionDelegate {
14+
class WebSocket : public facebook::react::jsinspector_modern::IWebSocket {
15+
public:
16+
WebSocket(std::string const &url, std::weak_ptr<facebook::react::jsinspector_modern::IWebSocketDelegate> delegate);
17+
virtual void send(std::string_view message) override;
18+
virtual ~WebSocket() override;
19+
20+
private:
21+
std::shared_ptr<Microsoft::React::Networking::WinRTWebSocketResource> m_packagerWebSocketConnection;
22+
std::weak_ptr<facebook::react::jsinspector_modern::IWebSocketDelegate> m_weakDelegate;
23+
};
24+
25+
public:
26+
FuseboxInspectorPackagerConnectionDelegate(std::shared_ptr<Mso::DispatchQueue> const &inspectorThread)
27+
: m_inspectorThread{inspectorThread} {}
28+
29+
virtual std::unique_ptr<facebook::react::jsinspector_modern::IWebSocket> connectWebSocket(
30+
const std::string &url,
31+
std::weak_ptr<facebook::react::jsinspector_modern::IWebSocketDelegate> delegate) override;
32+
33+
virtual void scheduleCallback(std::function<void(void)> callback, std::chrono::milliseconds delayMs) override;
34+
35+
private:
36+
winrt::fire_and_forget RunWithDelayAsync(std::function<void(void)> callback, std::chrono::milliseconds delayMs);
37+
38+
std::shared_ptr<Mso::DispatchQueue> m_inspectorThread;
39+
};
40+
} // namespace Microsoft::ReactNative

vnext/Shared/Shared.vcxitems

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@
218218
<ClCompile Include="$(MSBuildThisFileDirectory)Hasher.cpp" />
219219
<ClCompile Include="$(MSBuildThisFileDirectory)HermesRuntimeHolder.cpp" />
220220
<ClCompile Include="$(MSBuildThisFileDirectory)HermesSamplingProfiler.cpp" />
221+
<ClCompile Include="$(MSBuildThisFileDirectory)FuseboxInspectorPackagerConnectionDelegate.cpp" />
221222
<ClCompile Include="$(MSBuildThisFileDirectory)InspectorPackagerConnection.cpp" />
222223
<ClCompile Include="$(MSBuildThisFileDirectory)InstanceManager.cpp" />
223224
<ClCompile Include="$(MSBuildThisFileDirectory)JSBigAbiString.cpp" />
@@ -415,6 +416,7 @@
415416
<ClInclude Include="$(MSBuildThisFileDirectory)FuseboxHostTargetSettings.h" />
416417
<ClInclude Include="$(MSBuildThisFileDirectory)Executors\WebSocketJSExecutor.h" />
417418
<ClInclude Include="$(MSBuildThisFileDirectory)HermesRuntimeHolder.h" />
419+
<ClInclude Include="$(MSBuildThisFileDirectory)FuseboxInspectorPackagerConnectionDelegate.h" />
418420
<ClInclude Include="$(MSBuildThisFileDirectory)InspectorPackagerConnection.h" />
419421
<ClInclude Include="$(MSBuildThisFileDirectory)IDevSupportManager.h" />
420422
<ClInclude Include="$(MSBuildThisFileDirectory)InstanceManager.h" />

vnext/Shared/Shared.vcxitems.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494
<ClCompile Include="$(MSBuildThisFileDirectory)JSI\JSExecutorFactorySettings.cpp">
9595
<Filter>Source Files\JSI</Filter>
9696
</ClCompile>
97+
<ClCompile Include="$(MSBuildThisFileDirectory)FuseboxInspectorPackagerConnectionDelegate.cpp">
98+
<Filter>Source Files</Filter>
99+
</ClCompile>
97100
<ClCompile Include="$(MSBuildThisFileDirectory)InspectorPackagerConnection.cpp">
98101
<Filter>Source Files</Filter>
99102
</ClCompile>
@@ -613,6 +616,9 @@
613616
<Filter>Header Files\JSI</Filter>
614617
</ClInclude>
615618
<ClInclude Include="$(MSBuildThisFileDirectory)..\include\Shared\cdebug.h" />
619+
<ClInclude Include="$(MSBuildThisFileDirectory)FuseboxInspectorPackagerConnectionDelegate.h">
620+
<Filter>Header Files</Filter>
621+
</ClInclude>
616622
<ClInclude Include="$(MSBuildThisFileDirectory)InspectorPackagerConnection.h">
617623
<Filter>Header Files</Filter>
618624
</ClInclude>

0 commit comments

Comments
 (0)