Skip to content

Commit 0b83a21

Browse files
committed
Add InspectorPackagerConnectionDelegate implementation
This adds an implementation of InspectorPackagerConnectionDelegate for react-native-windows.
1 parent 5358bfd commit 0b83a21

File tree

4 files changed

+116
-0
lines changed

4 files changed

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