react-native-windows 0.71.24 → 0.71.26

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.
Files changed (78) hide show
  1. package/Directory.Build.props +5 -0
  2. package/Libraries/Network/RCTNetworking.windows.js +10 -16
  3. package/Microsoft.ReactNative/IReactDispatcher.cpp +4 -0
  4. package/Microsoft.ReactNative/IReactDispatcher.h +1 -0
  5. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +3 -7
  6. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -7
  7. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +43 -21
  8. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.h +0 -2
  9. package/Microsoft.ReactNative/Views/DevMenu.cpp +3 -3
  10. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiLoader.cpp +16 -0
  11. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +43 -12
  12. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems.filters +17 -6
  13. package/Microsoft.ReactNative.Managed/packages.lock.json +73 -4
  14. package/PropertySheets/External/Microsoft.ReactNative.Uwp.CSharpApp.targets +1 -1
  15. package/PropertySheets/External/Microsoft.ReactNative.Uwp.CppApp.targets +1 -1
  16. package/PropertySheets/External/Microsoft.ReactNative.WinAppSDK.CSharpApp.targets +1 -1
  17. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  18. package/PropertySheets/JSEngine.props +4 -4
  19. package/PropertySheets/React.Cpp.props +3 -3
  20. package/PropertySheets/Warnings.props +6 -0
  21. package/ReactCommon/ReactCommon.vcxproj +53 -1
  22. package/ReactCommon/cgmanifest.json +15 -0
  23. package/Scripts/Tfs/Layout-MSRN-Headers.ps1 +36 -0
  24. package/Shared/BaseFileReaderResource.cpp +95 -0
  25. package/Shared/BaseFileReaderResource.h +41 -0
  26. package/Shared/CreateModules.h +27 -5
  27. package/Shared/DevSupportManager.cpp +2 -9
  28. package/Shared/DevSupportManager.h +2 -6
  29. package/Shared/HermesRuntimeHolder.cpp +344 -84
  30. package/Shared/HermesRuntimeHolder.h +32 -21
  31. package/Shared/HermesSamplingProfiler.cpp +66 -14
  32. package/Shared/HermesSamplingProfiler.h +5 -3
  33. package/Shared/IFileReaderResource.h +36 -0
  34. package/Shared/InspectorPackagerConnection.cpp +62 -108
  35. package/Shared/InspectorPackagerConnection.h +9 -21
  36. package/Shared/JSI/RuntimeHolder.h +2 -2
  37. package/Shared/JSI/ScriptStore.h +18 -20
  38. package/Shared/JSI/V8RuntimeHolder.cpp +260 -0
  39. package/Shared/JSI/V8RuntimeHolder.h +37 -0
  40. package/Shared/Modules/BlobModule.cpp +93 -298
  41. package/Shared/Modules/BlobModule.h +25 -91
  42. package/Shared/Modules/CxxModuleUtilities.cpp +32 -0
  43. package/Shared/Modules/CxxModuleUtilities.h +17 -0
  44. package/Shared/Modules/FileReaderModule.cpp +118 -51
  45. package/Shared/Modules/FileReaderModule.h +27 -1
  46. package/Shared/Modules/HttpModule.cpp +143 -32
  47. package/Shared/Modules/HttpModule.h +33 -1
  48. package/Shared/Modules/IRequestBodyHandler.h +6 -4
  49. package/Shared/Modules/IResponseHandler.h +3 -3
  50. package/Shared/Modules/IUriHandler.h +3 -3
  51. package/Shared/Modules/IWebSocketModuleContentHandler.h +6 -4
  52. package/Shared/Modules/WebSocketModule.cpp +190 -7
  53. package/Shared/Modules/WebSocketTurboModule.h +52 -0
  54. package/Shared/Networking/DefaultBlobResource.cpp +328 -0
  55. package/Shared/Networking/DefaultBlobResource.h +133 -0
  56. package/Shared/Networking/IBlobResource.h +56 -0
  57. package/Shared/Networking/IHttpResource.h +6 -5
  58. package/Shared/Networking/WinRTHttpResource.cpp +49 -32
  59. package/Shared/Networking/WinRTHttpResource.h +4 -3
  60. package/Shared/Networking/WinRTTypes.h +3 -3
  61. package/Shared/OInstance.cpp +32 -68
  62. package/Shared/SafeLoadLibrary.cpp +41 -0
  63. package/Shared/SafeLoadLibrary.h +15 -0
  64. package/Shared/Shared.vcxitems +27 -9
  65. package/Shared/Shared.vcxitems.filters +47 -33
  66. package/package.json +2 -2
  67. package/template/cs-app-WinAppSDK/proj/ExperimentalFeatures.props +1 -1
  68. package/Microsoft.ReactNative/Base/CoreNativeModules.cpp +0 -59
  69. package/Microsoft.ReactNative/Base/CoreNativeModules.h +0 -30
  70. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.cpp +0 -2103
  71. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.h +0 -73
  72. package/Shared/HermesShim.cpp +0 -118
  73. package/Shared/HermesShim.h +0 -21
  74. package/Shared/JSI/NapiJsiV8RuntimeHolder.cpp +0 -209
  75. package/Shared/JSI/NapiJsiV8RuntimeHolder.h +0 -44
  76. package/Shared/V8JSIRuntimeHolder.cpp +0 -70
  77. package/Shared/V8JSIRuntimeHolder.h +0 -53
  78. /package/Shared/{Modules/IBlobPersistor.h → IBlobPersistor.h} +0 -0
@@ -0,0 +1,328 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #include "DefaultBlobResource.h"
5
+
6
+ #include <Modules/IHttpModuleProxy.h>
7
+ #include <Modules/IWebSocketModuleProxy.h>
8
+
9
+ // Boost Libraries
10
+ #include <boost/uuid/uuid_io.hpp>
11
+
12
+ // Windows API
13
+ #include <winrt/Windows.Security.Cryptography.h>
14
+
15
+ using std::scoped_lock;
16
+ using std::shared_ptr;
17
+ using std::string;
18
+ using std::vector;
19
+ using std::weak_ptr;
20
+ using winrt::array_view;
21
+ using winrt::Windows::Security::Cryptography::CryptographicBuffer;
22
+
23
+ namespace msrn = winrt::Microsoft::ReactNative;
24
+
25
+ namespace {
26
+
27
+ constexpr Microsoft::React::Networking::IBlobResource::BlobFieldNames
28
+ blobKeys{"blob", "blobId", "offset", "size", "type", "data"};
29
+
30
+ } // namespace
31
+
32
+ namespace Microsoft::React::Networking {
33
+
34
+ #pragma region DefaultBlobResource
35
+
36
+ DefaultBlobResource::DefaultBlobResource(
37
+ shared_ptr<MemoryBlobPersistor> blobPersistor,
38
+ shared_ptr<BlobWebSocketModuleContentHandler> contentHandler,
39
+ shared_ptr<BlobModuleRequestBodyHandler> requestBodyHandler,
40
+ shared_ptr<BlobModuleResponseHandler> responseHandler,
41
+ msrn::ReactPropertyBag propertyBag)
42
+ : m_blobPersistor{blobPersistor},
43
+ m_contentHandler{contentHandler},
44
+ m_requestBodyHandler{requestBodyHandler},
45
+ m_responseHandler{responseHandler},
46
+ m_propertyBag{propertyBag} {}
47
+
48
+ #pragma region IBlobResource
49
+
50
+ /*static*/ const IBlobResource::BlobFieldNames &IBlobResource::FieldNames() noexcept {
51
+ return blobKeys;
52
+ }
53
+
54
+ /*static*/ shared_ptr<IBlobResource> IBlobResource::Make(
55
+ winrt::Windows::Foundation::IInspectable const &inspectableProperties) {
56
+ using namespace msrn;
57
+
58
+ auto propBag = ReactPropertyBag{inspectableProperties.try_as<IReactPropertyBag>()};
59
+
60
+ auto blobPersistor = std::make_shared<MemoryBlobPersistor>();
61
+ auto contentHandler = std::make_shared<BlobWebSocketModuleContentHandler>(blobPersistor);
62
+ auto requestBodyHanlder = std::make_shared<BlobModuleRequestBodyHandler>(blobPersistor);
63
+ auto responseHandler = std::make_shared<BlobModuleResponseHandler>(blobPersistor);
64
+
65
+ auto contentHandlerPropId =
66
+ ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleContentHandler>>>{L"BlobModule.ContentHandler"};
67
+ propBag.Set(contentHandlerPropId, weak_ptr<IWebSocketModuleContentHandler>{contentHandler});
68
+
69
+ auto blobPersistorPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IBlobPersistor>>>{L"Blob.Persistor"};
70
+ ;
71
+ propBag.Set(blobPersistorPropId, weak_ptr<IBlobPersistor>{blobPersistor});
72
+
73
+ auto result = std::make_shared<DefaultBlobResource>(
74
+ blobPersistor, contentHandler, requestBodyHanlder, responseHandler, propBag);
75
+
76
+ return result;
77
+ }
78
+
79
+ void DefaultBlobResource::SendOverSocket(string &&blobId, int64_t offset, int64_t size, int64_t socketId) noexcept
80
+ /*override*/ {
81
+ auto propId =
82
+ msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IWebSocketModuleProxy>>>{L"WebSocketModule.Proxy"};
83
+ shared_ptr<IWebSocketModuleProxy> wsProxy;
84
+ if (auto prop = m_propertyBag.Get(propId)) {
85
+ wsProxy = prop.Value().lock();
86
+ }
87
+ if (!wsProxy) {
88
+ return;
89
+ }
90
+
91
+ array_view<uint8_t const> data;
92
+ try {
93
+ data = m_blobPersistor->ResolveMessage(std::move(blobId), offset, size);
94
+ } catch (const std::exception &e) {
95
+ return m_callbacks.OnError(e.what());
96
+ }
97
+
98
+ auto buffer = CryptographicBuffer::CreateFromByteArray(data);
99
+ auto base64Hstring = CryptographicBuffer::EncodeToBase64String(std::move(buffer));
100
+ auto base64String = winrt::to_string(base64Hstring);
101
+
102
+ wsProxy->SendBinary(std::move(base64String), socketId);
103
+ }
104
+
105
+ void DefaultBlobResource::CreateFromParts(msrn::JSValueArray &&parts, string &&blobId) noexcept /*override*/ {
106
+ vector<uint8_t> buffer{};
107
+
108
+ for (const auto &partItem : parts) {
109
+ auto &part = partItem.AsObject();
110
+ auto type = part.at(blobKeys.Type).AsString();
111
+ if (blobKeys.Blob == type) {
112
+ auto &blob = part.at(blobKeys.Data).AsObject();
113
+ array_view<uint8_t const> bufferPart;
114
+ try {
115
+ bufferPart = m_blobPersistor->ResolveMessage(
116
+ blob.at(blobKeys.BlobId).AsString(), blob.at(blobKeys.Offset).AsInt64(), blob.at(blobKeys.Size).AsInt64());
117
+ } catch (const std::exception &e) {
118
+ return m_callbacks.OnError(e.what());
119
+ }
120
+
121
+ buffer.reserve(buffer.size() + bufferPart.size());
122
+ buffer.insert(buffer.end(), bufferPart.begin(), bufferPart.end());
123
+ } else if ("string" == type) {
124
+ auto data = part.at(blobKeys.Data).AsString();
125
+
126
+ buffer.reserve(buffer.size() + data.size());
127
+ buffer.insert(buffer.end(), data.begin(), data.end());
128
+ } else {
129
+ return m_callbacks.OnError("Invalid type for blob: " + type);
130
+ }
131
+ }
132
+
133
+ m_blobPersistor->StoreMessage(std::move(buffer), std::move(blobId));
134
+ }
135
+
136
+ void DefaultBlobResource::Release(string &&blobId) noexcept /*override*/ {
137
+ m_blobPersistor->RemoveMessage(std::move(blobId));
138
+ }
139
+
140
+ void DefaultBlobResource::AddNetworkingHandler() noexcept /*override*/ {
141
+ auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IHttpModuleProxy>>>{L"HttpModule.Proxy"};
142
+
143
+ if (auto prop = m_propertyBag.Get(propId)) {
144
+ if (auto httpHandler = prop.Value().lock()) {
145
+ httpHandler->AddRequestBodyHandler(m_requestBodyHandler);
146
+ httpHandler->AddResponseHandler(m_responseHandler);
147
+ }
148
+ } else {
149
+ // #11439 - The absence of HttpModule.Proxy may be caused by a module initialization race condition.
150
+ // Best-effort approach to set up the request/response handlers by exposing this interface to dependents
151
+ // (i.e. IHttpResource).
152
+ auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IBlobResource>>>{L"Blob.Resource"};
153
+ m_propertyBag.Set(propId, weak_ptr<IBlobResource>(shared_from_this()));
154
+ }
155
+ }
156
+
157
+ void DefaultBlobResource::AddWebSocketHandler(int64_t id) noexcept /*override*/ {
158
+ m_contentHandler->Register(id);
159
+ }
160
+
161
+ void DefaultBlobResource::RemoveWebSocketHandler(int64_t id) noexcept /*override*/ {
162
+ m_contentHandler->Unregister(id);
163
+ }
164
+
165
+ IBlobResource::BlobCallbacks &DefaultBlobResource::Callbacks() noexcept /*override*/ {
166
+ return m_callbacks;
167
+ }
168
+
169
+ #pragma endregion IBlobResource
170
+
171
+ #pragma endregion DefaultBlobResource
172
+
173
+ #pragma region MemoryBlobPersistor
174
+
175
+ #pragma region IBlobPersistor
176
+
177
+ array_view<uint8_t const> MemoryBlobPersistor::ResolveMessage(string &&blobId, int64_t offset, int64_t size) {
178
+ if (size < 1)
179
+ return {};
180
+
181
+ scoped_lock lock{m_mutex};
182
+
183
+ auto dataItr = m_blobs.find(std::move(blobId));
184
+ // Not found.
185
+ if (dataItr == m_blobs.cend())
186
+ throw std::invalid_argument("Blob object not found");
187
+
188
+ auto &bytes = (*dataItr).second;
189
+ auto endBound = static_cast<size_t>(offset + size);
190
+ // Out of bounds.
191
+ if (endBound > bytes.size() || offset >= static_cast<int64_t>(bytes.size()) || offset < 0)
192
+ throw std::out_of_range("Offset or size out of range");
193
+
194
+ return array_view<uint8_t const>(bytes.data() + offset, bytes.data() + endBound);
195
+ }
196
+
197
+ void MemoryBlobPersistor::RemoveMessage(string &&blobId) noexcept {
198
+ scoped_lock lock{m_mutex};
199
+
200
+ m_blobs.erase(std::move(blobId));
201
+ }
202
+
203
+ void MemoryBlobPersistor::StoreMessage(vector<uint8_t> &&message, string &&blobId) noexcept {
204
+ scoped_lock lock{m_mutex};
205
+
206
+ m_blobs.insert_or_assign(std::move(blobId), std::move(message));
207
+ }
208
+
209
+ string MemoryBlobPersistor::StoreMessage(vector<uint8_t> &&message) noexcept {
210
+ auto blobId = boost::uuids::to_string(m_guidGenerator());
211
+
212
+ scoped_lock lock{m_mutex};
213
+ m_blobs.insert_or_assign(blobId, std::move(message));
214
+
215
+ return blobId;
216
+ }
217
+
218
+ #pragma endregion IBlobPersistor
219
+
220
+ #pragma endregion MemoryBlobPersistor
221
+
222
+ #pragma region BlobWebSocketModuleContentHandler
223
+
224
+ BlobWebSocketModuleContentHandler::BlobWebSocketModuleContentHandler(shared_ptr<IBlobPersistor> blobPersistor) noexcept
225
+ : m_blobPersistor{blobPersistor} {}
226
+
227
+ #pragma region IWebSocketModuleContentHandler
228
+
229
+ void BlobWebSocketModuleContentHandler::ProcessMessage(
230
+ string &&message,
231
+ msrn::JSValueObject &params) noexcept /*override*/
232
+ {
233
+ params[blobKeys.Data] = std::move(message);
234
+ }
235
+
236
+ void BlobWebSocketModuleContentHandler::ProcessMessage(
237
+ vector<uint8_t> &&message,
238
+ msrn::JSValueObject &params) noexcept /*override*/
239
+ {
240
+ auto blob = msrn::JSValueObject{
241
+ {blobKeys.Offset, 0},
242
+ {blobKeys.Size, message.size()},
243
+ {blobKeys.BlobId, m_blobPersistor->StoreMessage(std::move(message))}};
244
+
245
+ params[blobKeys.Data] = std::move(blob);
246
+ params[blobKeys.Type] = blobKeys.Blob;
247
+ }
248
+
249
+ #pragma endregion IWebSocketModuleContentHandler
250
+
251
+ void BlobWebSocketModuleContentHandler::Register(int64_t socketID) noexcept {
252
+ scoped_lock lock{m_mutex};
253
+ m_socketIds.insert(socketID);
254
+ }
255
+
256
+ void BlobWebSocketModuleContentHandler::Unregister(int64_t socketID) noexcept {
257
+ scoped_lock lock{m_mutex};
258
+
259
+ auto itr = m_socketIds.find(socketID);
260
+ if (itr != m_socketIds.end())
261
+ m_socketIds.erase(itr);
262
+ }
263
+
264
+ #pragma endregion BlobWebSocketModuleContentHandler
265
+
266
+ #pragma region BlobModuleRequestBodyHandler
267
+
268
+ BlobModuleRequestBodyHandler::BlobModuleRequestBodyHandler(shared_ptr<IBlobPersistor> blobPersistor) noexcept
269
+ : m_blobPersistor{blobPersistor} {}
270
+
271
+ #pragma region IRequestBodyHandler
272
+
273
+ bool BlobModuleRequestBodyHandler::Supports(msrn::JSValueObject &data) /*override*/ {
274
+ auto itr = data.find(blobKeys.Blob);
275
+
276
+ return itr != data.cend() && !(*itr).second.AsString().empty();
277
+ }
278
+
279
+ msrn::JSValueObject BlobModuleRequestBodyHandler::ToRequestBody(
280
+ msrn::JSValueObject &data,
281
+ string &contentType) /*override*/ {
282
+ auto type = contentType;
283
+ auto itr = data.find(blobKeys.Type);
284
+ if (itr != data.cend() && !(*itr).second.AsString().empty()) {
285
+ type = (*itr).second.AsString();
286
+ }
287
+ if (type.empty()) {
288
+ type = "application/octet-stream";
289
+ }
290
+
291
+ auto &blob = data[blobKeys.Blob].AsObject();
292
+ auto blobId = blob[blobKeys.BlobId].AsString();
293
+ auto bytes = m_blobPersistor->ResolveMessage(
294
+ std::move(blobId), blob[blobKeys.Offset].AsInt64(), blob[blobKeys.Size].AsInt64());
295
+
296
+ return {
297
+ {blobKeys.Type, type},
298
+ {blobKeys.Size, bytes.size()},
299
+ {"bytes", msrn::JSValueArray(bytes.cbegin(), bytes.cend())}};
300
+ }
301
+
302
+ #pragma endregion IRequestBodyHandler
303
+
304
+ #pragma endregion BlobModuleRequestBodyHandler
305
+
306
+ #pragma region BlobModuleResponseHandler
307
+
308
+ BlobModuleResponseHandler::BlobModuleResponseHandler(shared_ptr<IBlobPersistor> blobPersistor) noexcept
309
+ : m_blobPersistor{blobPersistor} {}
310
+
311
+ #pragma region IResponseHandler
312
+
313
+ bool BlobModuleResponseHandler::Supports(string &responseType) /*override*/ {
314
+ return blobKeys.Blob == responseType;
315
+ }
316
+
317
+ msrn::JSValueObject BlobModuleResponseHandler::ToResponseData(vector<uint8_t> &&content) /*override*/ {
318
+ return {
319
+ {blobKeys.Offset, 0},
320
+ {blobKeys.Size, content.size()},
321
+ {blobKeys.BlobId, m_blobPersistor->StoreMessage(std::move(content))}};
322
+ }
323
+
324
+ #pragma endregion IResponseHandler
325
+
326
+ #pragma endregion BlobModuleResponseHandler
327
+
328
+ } // namespace Microsoft::React::Networking
@@ -0,0 +1,133 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ #include "IBlobResource.h"
7
+
8
+ #include <IBlobPersistor.h>
9
+ #include <Modules/IRequestBodyHandler.h>
10
+ #include <Modules/IResponseHandler.h>
11
+ #include <Modules/IWebSocketModuleContentHandler.h>
12
+
13
+ // React Native Windows
14
+ #include <ReactPropertyBag.h>
15
+
16
+ // Boost Libraries
17
+ #include <boost/uuid/uuid_generators.hpp>
18
+
19
+ // Standard Library
20
+ #include <mutex>
21
+ #include <unordered_set>
22
+
23
+ namespace Microsoft::React::Networking {
24
+
25
+ class MemoryBlobPersistor final : public IBlobPersistor {
26
+ std::unordered_map<std::string, std::vector<uint8_t>> m_blobs;
27
+ std::mutex m_mutex;
28
+ boost::uuids::random_generator m_guidGenerator;
29
+
30
+ public:
31
+ #pragma region IBlobPersistor
32
+
33
+ winrt::array_view<uint8_t const> ResolveMessage(std::string &&blobId, int64_t offset, int64_t size) override;
34
+
35
+ void RemoveMessage(std::string &&blobId) noexcept override;
36
+
37
+ void StoreMessage(std::vector<uint8_t> &&message, std::string &&blobId) noexcept override;
38
+
39
+ std::string StoreMessage(std::vector<uint8_t> &&message) noexcept override;
40
+
41
+ #pragma endregion IBlobPersistor
42
+ };
43
+
44
+ class BlobWebSocketModuleContentHandler final : public IWebSocketModuleContentHandler {
45
+ std::unordered_set<int64_t> m_socketIds;
46
+ std::mutex m_mutex;
47
+ std::shared_ptr<IBlobPersistor> m_blobPersistor;
48
+
49
+ public:
50
+ BlobWebSocketModuleContentHandler(std::shared_ptr<IBlobPersistor> blobPersistor) noexcept;
51
+
52
+ #pragma region IWebSocketModuleContentHandler
53
+
54
+ void ProcessMessage(std::string &&message, winrt::Microsoft::ReactNative::JSValueObject &params) noexcept override;
55
+
56
+ void ProcessMessage(std::vector<uint8_t> &&message, winrt::Microsoft::ReactNative::JSValueObject &params) noexcept
57
+ override;
58
+
59
+ #pragma endregion IWebSocketModuleContentHandler
60
+
61
+ void Register(int64_t socketID) noexcept;
62
+
63
+ void Unregister(int64_t socketID) noexcept;
64
+ };
65
+
66
+ class BlobModuleRequestBodyHandler final : public IRequestBodyHandler {
67
+ std::shared_ptr<IBlobPersistor> m_blobPersistor;
68
+
69
+ public:
70
+ BlobModuleRequestBodyHandler(std::shared_ptr<IBlobPersistor> blobPersistor) noexcept;
71
+
72
+ #pragma region IRequestBodyHandler
73
+
74
+ bool Supports(winrt::Microsoft::ReactNative::JSValueObject &data) override;
75
+
76
+ winrt::Microsoft::ReactNative::JSValueObject ToRequestBody(
77
+ winrt::Microsoft::ReactNative::JSValueObject &data,
78
+ std::string &contentType) override;
79
+
80
+ #pragma endregion IRequestBodyHandler
81
+ };
82
+
83
+ class BlobModuleResponseHandler final : public IResponseHandler {
84
+ std::shared_ptr<IBlobPersistor> m_blobPersistor;
85
+
86
+ public:
87
+ BlobModuleResponseHandler(std::shared_ptr<IBlobPersistor> blobPersistor) noexcept;
88
+
89
+ #pragma region IResponseHandler
90
+
91
+ bool Supports(std::string &responseType) override;
92
+
93
+ winrt::Microsoft::ReactNative::JSValueObject ToResponseData(std::vector<uint8_t> &&content) override;
94
+
95
+ #pragma endregion IResponseHandler
96
+ };
97
+
98
+ class DefaultBlobResource : public IBlobResource, public std::enable_shared_from_this<DefaultBlobResource> {
99
+ std::shared_ptr<MemoryBlobPersistor> m_blobPersistor;
100
+ std::shared_ptr<BlobWebSocketModuleContentHandler> m_contentHandler;
101
+ std::shared_ptr<BlobModuleRequestBodyHandler> m_requestBodyHandler;
102
+ std::shared_ptr<BlobModuleResponseHandler> m_responseHandler;
103
+ winrt::Microsoft::ReactNative::ReactPropertyBag m_propertyBag;
104
+ BlobCallbacks m_callbacks;
105
+
106
+ public:
107
+ DefaultBlobResource(
108
+ std::shared_ptr<MemoryBlobPersistor> blobPersistor,
109
+ std::shared_ptr<BlobWebSocketModuleContentHandler> contentHandler,
110
+ std::shared_ptr<BlobModuleRequestBodyHandler> requestBodyHandler,
111
+ std::shared_ptr<BlobModuleResponseHandler> responseHandler,
112
+ winrt::Microsoft::ReactNative::ReactPropertyBag propertyBag);
113
+
114
+ #pragma region IBlobResource
115
+
116
+ void SendOverSocket(std::string &&blobId, int64_t offset, int64_t size, int64_t socketId) noexcept override;
117
+
118
+ void CreateFromParts(winrt::Microsoft::ReactNative::JSValueArray &&parts, std::string &&blobId) noexcept override;
119
+
120
+ void Release(std::string &&blobId) noexcept override;
121
+
122
+ void AddNetworkingHandler() noexcept override;
123
+
124
+ void AddWebSocketHandler(int64_t id) noexcept override;
125
+
126
+ void RemoveWebSocketHandler(int64_t id) noexcept override;
127
+
128
+ BlobCallbacks &Callbacks() noexcept override;
129
+
130
+ #pragma endregion IBlobResource
131
+ };
132
+
133
+ } // namespace Microsoft::React::Networking
@@ -0,0 +1,56 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ #include <IBlobPersistor.h>
7
+
8
+ // React Native Windows
9
+ #include <JSValue.h>
10
+
11
+ // Windows API
12
+ #include <winrt/Windows.Foundation.h>
13
+
14
+ // Standard Library
15
+ #include <functional>
16
+ #include <memory>
17
+ #include <string>
18
+
19
+ namespace Microsoft::React::Networking {
20
+
21
+ struct IBlobResource {
22
+ struct BlobCallbacks {
23
+ std::function<void(std::string &&errorText)> OnError;
24
+ };
25
+
26
+ struct BlobFieldNames {
27
+ const char *Blob;
28
+ const char *BlobId;
29
+ const char *Offset;
30
+ const char *Size;
31
+ const char *Type;
32
+ const char *Data;
33
+ };
34
+
35
+ static std::shared_ptr<IBlobResource> Make(winrt::Windows::Foundation::IInspectable const &inspectableProperties);
36
+
37
+ static const BlobFieldNames &FieldNames() noexcept;
38
+
39
+ virtual ~IBlobResource() noexcept {}
40
+
41
+ virtual void SendOverSocket(std::string &&blobId, int64_t offset, int64_t size, int64_t socketId) noexcept = 0;
42
+
43
+ virtual void CreateFromParts(winrt::Microsoft::ReactNative::JSValueArray &&parts, std::string &&blobId) noexcept = 0;
44
+
45
+ virtual void Release(std::string &&blobId) noexcept = 0;
46
+
47
+ virtual void AddNetworkingHandler() noexcept = 0;
48
+
49
+ virtual void AddWebSocketHandler(int64_t id) noexcept = 0;
50
+
51
+ virtual void RemoveWebSocketHandler(int64_t id) noexcept = 0;
52
+
53
+ virtual BlobCallbacks &Callbacks() noexcept = 0;
54
+ };
55
+
56
+ } // namespace Microsoft::React::Networking
@@ -3,8 +3,8 @@
3
3
 
4
4
  #pragma once
5
5
 
6
- // Folly
7
- #include <folly/dynamic.h>
6
+ // React Native Windows
7
+ #include <JSValue.h>
8
8
 
9
9
  // Windows API
10
10
  #include <winrt/Windows.Foundation.h>
@@ -20,7 +20,6 @@ namespace Microsoft::React::Networking {
20
20
  struct IHttpResource {
21
21
  typedef std::unordered_map<std::string, std::string> Headers;
22
22
 
23
- // TODO: Implement Form data
24
23
  struct BodyData {
25
24
  enum class Type : size_t { Empty, String, Base64, Uri, Form } Type = Type::Empty;
26
25
  std::string Data;
@@ -81,7 +80,7 @@ struct IHttpResource {
81
80
  std::string &&url,
82
81
  int64_t requestId,
83
82
  Headers &&headers,
84
- folly::dynamic &&data,
83
+ winrt::Microsoft::ReactNative::JSValueObject &&data,
85
84
  std::string &&responseType,
86
85
  bool useIncrementalUpdates,
87
86
  int64_t timeout,
@@ -146,7 +145,9 @@ struct IHttpResource {
146
145
  /// Structured response content payload (i.e. Blob data)
147
146
  /// </param>
148
147
  /// </param>
149
- virtual void SetOnData(std::function<void(int64_t requestId, folly::dynamic &&responseData)> &&handler) noexcept = 0;
148
+ virtual void SetOnData(
149
+ std::function<void(int64_t requestId, winrt::Microsoft::ReactNative::JSValueObject &&responseData)>
150
+ &&handler) noexcept = 0;
150
151
 
151
152
  /// <summary>
152
153
  /// Sets a function to be invoked when a response content increment has been received.