react-native-windows 0.72.0 → 0.72.2

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 (55) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/Libraries/Network/RCTNetworking.windows.js +10 -16
  3. package/Microsoft.ReactNative/Fabric/ImageRequest.cpp +11 -14
  4. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +1 -1
  5. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -3
  6. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -7
  7. package/Microsoft.ReactNative/Modules/LinkingManagerModule.cpp +1 -1
  8. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +11 -10
  9. package/Microsoft.ReactNative.Managed/packages.lock.json +2 -71
  10. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  11. package/PropertySheets/React.Cpp.props +2 -3
  12. package/Shared/BaseFileReaderResource.cpp +95 -0
  13. package/Shared/BaseFileReaderResource.h +41 -0
  14. package/Shared/CreateModules.h +27 -5
  15. package/Shared/IFileReaderResource.h +36 -0
  16. package/Shared/Modules/BlobModule.cpp +93 -297
  17. package/Shared/Modules/BlobModule.h +25 -87
  18. package/Shared/Modules/CxxModuleUtilities.cpp +32 -0
  19. package/Shared/Modules/CxxModuleUtilities.h +17 -0
  20. package/Shared/Modules/FileReaderModule.cpp +118 -51
  21. package/Shared/Modules/FileReaderModule.h +27 -1
  22. package/Shared/Modules/HttpModule.cpp +133 -9
  23. package/Shared/Modules/HttpModule.h +33 -0
  24. package/Shared/Modules/IRequestBodyHandler.h +6 -4
  25. package/Shared/Modules/IResponseHandler.h +3 -3
  26. package/Shared/Modules/IUriHandler.h +3 -3
  27. package/Shared/Modules/IWebSocketModuleContentHandler.h +6 -4
  28. package/Shared/Modules/WebSocketModule.cpp +190 -7
  29. package/Shared/Modules/WebSocketTurboModule.h +52 -0
  30. package/Shared/Networking/DefaultBlobResource.cpp +323 -0
  31. package/Shared/Networking/DefaultBlobResource.h +133 -0
  32. package/Shared/Networking/IBlobResource.h +56 -0
  33. package/Shared/Networking/IHttpResource.h +6 -5
  34. package/Shared/Networking/WinRTHttpResource.cpp +40 -32
  35. package/Shared/Networking/WinRTHttpResource.h +4 -3
  36. package/Shared/Networking/WinRTTypes.h +3 -3
  37. package/Shared/Shared.vcxitems +8 -1
  38. package/Shared/Shared.vcxitems.filters +24 -3
  39. package/package.json +11 -11
  40. package/types/experimental.d.ts +101 -0
  41. package/types/index.d.ts +216 -0
  42. package/types/modules/BatchedBridge.d.ts +32 -0
  43. package/types/modules/Codegen.d.ts +74 -0
  44. package/types/modules/Devtools.d.ts +31 -0
  45. package/types/modules/LaunchScreen.d.ts +18 -0
  46. package/types/modules/globals.d.ts +579 -0
  47. package/types/private/TimerMixin.d.ts +19 -0
  48. package/types/private/Utilities.d.ts +10 -0
  49. package/types/public/DeprecatedPropertiesAlias.d.ts +185 -0
  50. package/types/public/Insets.d.ts +15 -0
  51. package/types/public/ReactNativeRenderer.d.ts +144 -0
  52. package/types/public/ReactNativeTypes.d.ts +143 -0
  53. package/Microsoft.ReactNative/Base/CoreNativeModules.cpp +0 -44
  54. package/Microsoft.ReactNative/Base/CoreNativeModules.h +0 -30
  55. /package/Shared/{Modules/IBlobPersistor.h → IBlobPersistor.h} +0 -0
@@ -9,6 +9,9 @@
9
9
  // React Native
10
10
  #include <cxxreact/Instance.h>
11
11
 
12
+ // React Native Windows
13
+ #include <ReactContext.h>
14
+
12
15
  // Standard Library
13
16
  #include <memory>
14
17
  #include <string>
@@ -20,4 +23,18 @@ void SendEvent(
20
23
  std::string &&eventName,
21
24
  folly::dynamic &&args);
22
25
 
26
+ void SendEvent(
27
+ winrt::Microsoft::ReactNative::ReactContext const &reactContext,
28
+ std::wstring_view &&eventName,
29
+ winrt::Microsoft::ReactNative::JSValueObject &&args) noexcept;
30
+
31
+ void SendEvent(
32
+ winrt::Microsoft::ReactNative::ReactContext const &reactContext,
33
+ std::wstring_view &&eventName,
34
+ winrt::Microsoft::ReactNative::JSValueArray &&args) noexcept;
35
+
36
+ winrt::Microsoft::ReactNative::JSValue ToJSValue(folly::dynamic &value) noexcept;
37
+
38
+ folly::dynamic ToDynamic(const winrt::Microsoft::ReactNative::JSValue &value) noexcept;
39
+
23
40
  } // namespace Microsoft::React::Modules
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "FileReaderModule.h"
5
5
 
6
+ #include <CreateModules.h>
6
7
  #include <ReactPropertyBag.h>
7
8
  #include <sstream>
8
9
 
@@ -19,17 +20,18 @@
19
20
 
20
21
  using namespace facebook::xplat;
21
22
 
23
+ namespace msrn = winrt::Microsoft::ReactNative;
24
+
22
25
  using folly::dynamic;
23
26
  using std::string;
24
27
  using std::weak_ptr;
25
- using winrt::Microsoft::ReactNative::IReactPropertyBag;
26
- using winrt::Microsoft::ReactNative::ReactNonAbiValue;
27
- using winrt::Microsoft::ReactNative::ReactPropertyBag;
28
- using winrt::Microsoft::ReactNative::ReactPropertyId;
29
28
  using winrt::Windows::Foundation::IInspectable;
30
29
 
31
30
  namespace {
32
- constexpr char moduleName[] = "FileReaderModule";
31
+ constexpr char s_moduleName[] = "FileReaderModule";
32
+ constexpr wchar_t s_moduleNameW[] = L"FileReaderModule";
33
+
34
+ msrn::ReactModuleProvider s_moduleProvider = msrn::MakeTurboModuleProvider<Microsoft::React::FileReaderTurboModule>();
33
35
  } // namespace
34
36
 
35
37
  namespace Microsoft::React {
@@ -37,7 +39,7 @@ namespace Microsoft::React {
37
39
  #pragma region FileReaderModule
38
40
 
39
41
  FileReaderModule::FileReaderModule(weak_ptr<IBlobPersistor> weakBlobPersistor) noexcept
40
- : m_weakBlobPersistor{weakBlobPersistor} {}
42
+ : m_resource{IFileReaderResource::Make(weakBlobPersistor)} {}
41
43
 
42
44
  FileReaderModule::~FileReaderModule() noexcept /*override*/
43
45
  {}
@@ -45,7 +47,7 @@ FileReaderModule::~FileReaderModule() noexcept /*override*/
45
47
  #pragma region CxxModule
46
48
 
47
49
  string FileReaderModule::getName() {
48
- return moduleName;
50
+ return s_moduleName;
49
51
  }
50
52
 
51
53
  std::map<string, dynamic> FileReaderModule::getConstants() {
@@ -61,41 +63,28 @@ std::vector<module::CxxModule::Method> FileReaderModule::getMethods() {
61
63
  /// </param>
62
64
  ///
63
65
  "readAsDataURL",
64
- [blobPersistor = m_weakBlobPersistor.lock()](dynamic args, Callback resolve, Callback reject) {
65
- if (!blobPersistor) {
66
- return reject({"Could not find Blob persistor"});
67
- }
68
-
66
+ [resource = m_resource](dynamic args, Callback resolve, Callback reject) {
69
67
  auto blob = jsArgAsObject(args, 0);
70
68
 
71
69
  auto blobId = blob["blobId"].asString();
72
70
  auto offset = blob["offset"].asInt();
73
71
  auto size = blob["size"].asInt();
74
72
 
75
- winrt::array_view<uint8_t const> bytes;
76
- try {
77
- bytes = blobPersistor->ResolveMessage(std::move(blobId), offset, size);
78
- } catch (const std::exception &e) {
79
- return reject({e.what()});
80
- }
81
-
82
- auto result = string{"data:"};
83
73
  auto typeItr = blob.find("type");
74
+ string type{};
84
75
  if (typeItr == blob.items().end()) {
85
- result += "application/octet-stream";
76
+ type = "application/octet-stream";
86
77
  } else {
87
- result += (*typeItr).second.asString();
78
+ type = (*typeItr).second.asString();
88
79
  }
89
- result += ";base64,";
90
-
91
- // https://www.boost.org/doc/libs/1_76_0/libs/serialization/doc/dataflow.html
92
- using namespace boost::archive::iterators;
93
- typedef base64_from_binary<transform_width<const char *, 6, 8>> encode_base64;
94
- std::ostringstream oss;
95
- std::copy(encode_base64(bytes.cbegin()), encode_base64(bytes.cend()), ostream_iterator<char>(oss));
96
- result += oss.str();
97
80
 
98
- resolve({std::move(result)});
81
+ resource->ReadAsDataUrl(
82
+ std::move(blobId),
83
+ offset,
84
+ size,
85
+ std::move(type),
86
+ [&resolve](string &&message) { resolve({std::move(message)}); },
87
+ [&reject](string &&message) { reject({std::move(message)}); });
99
88
  }},
100
89
  {///
101
90
  /// <param name="args">
@@ -105,11 +94,7 @@ std::vector<module::CxxModule::Method> FileReaderModule::getMethods() {
105
94
  /// </param>
106
95
  ///
107
96
  "readAsText",
108
- [blobPersistor = m_weakBlobPersistor.lock()](dynamic args, Callback resolve, Callback reject) {
109
- if (!blobPersistor) {
110
- return reject({"Could not find Blob persistor"});
111
- }
112
-
97
+ [resource = m_resource](dynamic args, Callback resolve, Callback reject) {
113
98
  auto blob = jsArgAsObject(args, 0);
114
99
  auto encoding = jsArgAsString(args, 1); // Default: "UTF-8"
115
100
 
@@ -117,18 +102,13 @@ std::vector<module::CxxModule::Method> FileReaderModule::getMethods() {
117
102
  auto offset = blob["offset"].asInt();
118
103
  auto size = blob["size"].asInt();
119
104
 
120
- winrt::array_view<uint8_t const> bytes;
121
- try {
122
- bytes = blobPersistor->ResolveMessage(std::move(blobId), offset, size);
123
- } catch (const std::exception &e) {
124
- return reject({e.what()});
125
- }
126
-
127
- // #9982 - Handle non-UTF8 encodings
128
- // See https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/charset/Charset.html
129
- auto result = string{bytes.cbegin(), bytes.cend()};
130
-
131
- resolve({std::move(result)});
105
+ resource->ReadAsText(
106
+ std::move(blobId),
107
+ offset,
108
+ size,
109
+ std::move(encoding),
110
+ [&resolve](string &&message) { resolve({std::move(message)}); },
111
+ [&reject](string &&message) { reject({std::move(message)}); });
132
112
  }}};
133
113
  }
134
114
 
@@ -136,14 +116,93 @@ std::vector<module::CxxModule::Method> FileReaderModule::getMethods() {
136
116
 
137
117
  #pragma endregion FileReaderModule
138
118
 
119
+ #pragma region FileReaderTurboModule
120
+
121
+ void FileReaderTurboModule::Initialize(msrn::ReactContext const &reactContext) noexcept {
122
+ auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IBlobPersistor>>>{L"Blob.Persistor"};
123
+ auto props = reactContext.Properties();
124
+ auto prop = props.Get(propId);
125
+ m_resource = IFileReaderResource::Make(prop.Value());
126
+ }
127
+
128
+ ///
129
+ /// <param name="data">
130
+ /// Blob object with the following fields:
131
+ /// - blobId
132
+ /// - offset
133
+ /// - size
134
+ /// - type (optional)
135
+ /// </param>
136
+ /// <param name="result">
137
+ /// Either resolves or rejects the current method with a given text message.
138
+ /// </param>
139
+ ///
140
+ void FileReaderTurboModule::ReadAsDataUrl(msrn::JSValue &&data, msrn::ReactPromise<string> &&result) noexcept {
141
+ auto &blob = data.AsObject();
142
+ auto blobId = blob["blobId"].AsString();
143
+ auto offset = blob["offset"].AsInt64();
144
+ auto size = blob["size"].AsInt64();
145
+
146
+ auto typeItr = blob.find("type");
147
+ string type{};
148
+ if (typeItr == blob.end()) {
149
+ type = "application/octet-stream";
150
+ } else {
151
+ type = (*typeItr).second.AsString();
152
+ }
153
+
154
+ m_resource->ReadAsDataUrl(
155
+ std::move(blobId),
156
+ offset,
157
+ size,
158
+ std::move(type),
159
+ [&result](string &&message) { result.Resolve(std::move(message)); },
160
+ [&result](string &&message) { result.Reject(winrt::to_hstring(std::move(message)).c_str()); });
161
+ }
162
+
163
+ ///
164
+ /// <param name="data">
165
+ /// Blob object with the following fields:
166
+ /// - blobId
167
+ /// - offset
168
+ /// - size
169
+ /// - type (optional)
170
+ /// </param>
171
+ /// <param name="encoding">
172
+ /// Text encoding to proces data with.
173
+ /// </param>
174
+ /// <param name="result">
175
+ /// Either resolves or rejects the current method with a given text message.
176
+ /// </param>
177
+ ///
178
+ void FileReaderTurboModule::ReadAsText(
179
+ msrn::JSValue &&data,
180
+ string &&encoding,
181
+ msrn::ReactPromise<string> &&result) noexcept {
182
+ auto &blob = data.AsObject();
183
+ auto blobId = blob["blobId"].AsString();
184
+ auto offset = blob["offset"].AsInt64();
185
+ auto size = blob["size"].AsInt64();
186
+
187
+ m_resource->ReadAsText(
188
+ std::move(blobId),
189
+ offset,
190
+ size,
191
+ std::move(encoding),
192
+ [&result](string &&message) { result.Resolve(std::move(message)); },
193
+ [&result](string &&message) { result.Reject(winrt::to_hstring(std::move(message)).c_str()); });
194
+ }
195
+
196
+ #pragma endregion FileReaderTurboModule
197
+
139
198
  /*extern*/ const char *GetFileReaderModuleName() noexcept {
140
- return moduleName;
199
+ return s_moduleName;
141
200
  }
142
201
 
143
202
  /*extern*/ std::unique_ptr<module::CxxModule> CreateFileReaderModule(
144
203
  IInspectable const &inspectableProperties) noexcept {
145
- auto propId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IBlobPersistor>>>{L"Blob.Persistor"};
146
- auto propBag = ReactPropertyBag{inspectableProperties.try_as<IReactPropertyBag>()};
204
+ auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IBlobPersistor>>>{L"Blob.Persistor"};
205
+ auto propBag = msrn::ReactPropertyBag{inspectableProperties.try_as<msrn::IReactPropertyBag>()};
147
206
 
148
207
  if (auto prop = propBag.Get(propId)) {
149
208
  auto weakBlobPersistor = prop.Value();
@@ -154,4 +213,12 @@ std::vector<module::CxxModule::Method> FileReaderModule::getMethods() {
154
213
  return nullptr;
155
214
  }
156
215
 
216
+ /*extern*/ const wchar_t *GetFileReaderTurboModuleName() noexcept {
217
+ return s_moduleNameW;
218
+ }
219
+
220
+ /*extern*/ const msrn::ReactModuleProvider &GetFileReaderModuleProvider() noexcept {
221
+ return s_moduleProvider;
222
+ }
223
+
157
224
  } // namespace Microsoft::React
@@ -3,6 +3,10 @@
3
3
 
4
4
  #pragma once
5
5
 
6
+ #include <NativeFileReaderModuleSpec.g.h>
7
+
8
+ #include <IFileReaderResource.h>
9
+ #include <NativeModules.h>
6
10
  #include "IBlobPersistor.h"
7
11
 
8
12
  // React Native
@@ -48,7 +52,29 @@ class FileReaderModule : public facebook::xplat::module::CxxModule {
48
52
  #pragma endregion CxxModule
49
53
 
50
54
  private:
51
- std::weak_ptr<IBlobPersistor> m_weakBlobPersistor;
55
+ std::shared_ptr<IFileReaderResource> m_resource;
56
+ };
57
+
58
+ REACT_MODULE(FileReaderTurboModule, L"FileReaderModule")
59
+ struct FileReaderTurboModule {
60
+ using ModuleSpec = ReactNativeSpecs::FileReaderModuleSpec;
61
+
62
+ REACT_INIT(Initialize)
63
+ void Initialize(winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;
64
+
65
+ REACT_METHOD(ReadAsDataUrl, L"readAsDataURL")
66
+ void ReadAsDataUrl(
67
+ winrt::Microsoft::ReactNative::JSValue &&data,
68
+ winrt::Microsoft::ReactNative::ReactPromise<std::string> &&result) noexcept;
69
+
70
+ REACT_METHOD(ReadAsText, L"readAsText")
71
+ void ReadAsText(
72
+ winrt::Microsoft::ReactNative::JSValue &&data,
73
+ std::string &&encoding,
74
+ winrt::Microsoft::ReactNative::ReactPromise<std::string> &&result) noexcept;
75
+
76
+ private:
77
+ std::shared_ptr<IFileReaderResource> m_resource;
52
78
  };
53
79
 
54
80
  } // namespace Microsoft::React
@@ -5,6 +5,7 @@
5
5
 
6
6
  #include "HttpModule.h"
7
7
 
8
+ #include <CreateModules.h>
8
9
  #include <Modules/CxxModuleUtilities.h>
9
10
  #include <ReactPropertyBag.h>
10
11
 
@@ -14,6 +15,7 @@
14
15
 
15
16
  using facebook::react::Instance;
16
17
  using folly::dynamic;
18
+ using std::function;
17
19
  using std::shared_ptr;
18
20
  using std::string;
19
21
  using std::weak_ptr;
@@ -23,12 +25,15 @@ using winrt::Microsoft::ReactNative::ReactPropertyBag;
23
25
  using winrt::Microsoft::ReactNative::ReactPropertyId;
24
26
  using winrt::Windows::Foundation::IInspectable;
25
27
 
28
+ namespace msrn = winrt::Microsoft::ReactNative;
29
+
26
30
  namespace {
27
31
 
28
32
  using Microsoft::React::Modules::SendEvent;
29
33
  using Microsoft::React::Networking::IHttpResource;
30
34
 
31
- constexpr char moduleName[] = "Networking";
35
+ constexpr char s_moduleName[] = "Networking";
36
+ constexpr wchar_t s_moduleNameW[] = L"Networking";
32
37
 
33
38
  // React event names
34
39
  constexpr char completedResponse[] = "didCompleteNetworkResponse";
@@ -38,6 +43,15 @@ constexpr char receivedIncrementalData[] = "didReceiveNetworkIncrementalData";
38
43
  constexpr char receivedDataProgress[] = "didReceiveNetworkDataProgress";
39
44
  constexpr char receivedData[] = "didReceiveNetworkData";
40
45
 
46
+ constexpr wchar_t completedResponseW[] = L"didCompleteNetworkResponse";
47
+ constexpr wchar_t receivedResponseW[] = L"didReceiveNetworkResponse";
48
+ constexpr wchar_t sentDataW[] = L"didSendNetworkData";
49
+ constexpr wchar_t receivedIncrementalDataW[] = L"didReceiveNetworkIncrementalData";
50
+ constexpr wchar_t receivedDataProgressW[] = L"didReceiveNetworkDataProgress";
51
+ constexpr wchar_t receivedDataW[] = L"didReceiveNetworkData";
52
+
53
+ msrn::ReactModuleProvider s_moduleProvider = msrn::MakeTurboModuleProvider<Microsoft::React::HttpTurboModule>();
54
+
41
55
  static void SetUpHttpResource(
42
56
  shared_ptr<IHttpResource> resource,
43
57
  weak_ptr<Instance> weakReactInstance,
@@ -65,10 +79,11 @@ static void SetUpHttpResource(
65
79
  });
66
80
 
67
81
  // Explicitly declaring function type to avoid type inference ambiguity.
68
- std::function<void(int64_t, dynamic &&)> onDataDynamic = [weakReactInstance](
69
- int64_t requestId, dynamic &&responseData) {
70
- SendEvent(weakReactInstance, receivedData, dynamic::array(requestId, std::move(responseData)));
71
- };
82
+ function<void(int64_t, msrn::JSValueObject &&)> onDataDynamic =
83
+ [weakReactInstance](int64_t requestId, msrn::JSValueObject &&responseData) {
84
+ auto responseDynamic = Microsoft::React::Modules::ToDynamic(msrn::JSValue{std::move(responseData)});
85
+ SendEvent(weakReactInstance, receivedData, dynamic::array(requestId, std::move(responseDynamic)));
86
+ };
72
87
  resource->SetOnData(std::move(onDataDynamic));
73
88
 
74
89
  resource->SetOnIncrementalData(
@@ -101,6 +116,104 @@ static void SetUpHttpResource(
101
116
 
102
117
  namespace Microsoft::React {
103
118
 
119
+ #pragma region HttpTurboModule
120
+
121
+ void HttpTurboModule::Initialize(msrn::ReactContext const &reactContext) noexcept {
122
+ m_context = reactContext;
123
+ m_resource = IHttpResource::Make(m_context.Properties().Handle());
124
+
125
+ m_resource->SetOnRequestSuccess([context = m_context](int64_t requestId) {
126
+ SendEvent(context, completedResponseW, msrn::JSValueArray{requestId});
127
+ });
128
+
129
+ m_resource->SetOnResponse([context = m_context](int64_t requestId, IHttpResource::Response &&response) {
130
+ auto headers = msrn::JSValueObject{};
131
+ for (auto &header : response.Headers) {
132
+ headers[header.first] = header.second;
133
+ }
134
+
135
+ // TODO: Test response content?
136
+ auto args = msrn::JSValueArray{requestId, response.StatusCode, std::move(headers), response.Url};
137
+
138
+ SendEvent(context, receivedResponseW, std::move(args));
139
+ });
140
+
141
+ m_resource->SetOnData([context = m_context](int64_t requestId, string &&responseData) {
142
+ SendEvent(context, receivedDataW, msrn::JSValueArray{requestId, std::move(responseData)});
143
+ });
144
+
145
+ // Explicitly declaring function type to avoid type inference ambiguity.
146
+ function<void(int64_t, msrn::JSValueObject &&)> onDataObject =
147
+ [context = m_context](int64_t requestId, msrn::JSValueObject &&responseData) {
148
+ SendEvent(context, receivedDataW, msrn::JSValueArray{requestId, std::move(responseData)});
149
+ };
150
+ m_resource->SetOnData(std::move(onDataObject));
151
+
152
+ m_resource->SetOnIncrementalData(
153
+ [context = m_context](int64_t requestId, string &&responseData, int64_t progress, int64_t total) {
154
+ SendEvent(
155
+ context, receivedIncrementalDataW, msrn::JSValueArray{requestId, std::move(responseData), progress, total});
156
+ });
157
+
158
+ m_resource->SetOnDataProgress([context = m_context](int64_t requestId, int64_t progress, int64_t total) {
159
+ SendEvent(context, receivedDataProgressW, msrn::JSValueArray{requestId, progress, total});
160
+ });
161
+
162
+ m_resource->SetOnResponseComplete([context = m_context](int64_t requestId) {
163
+ SendEvent(context, completedResponseW, msrn::JSValueArray{requestId});
164
+ });
165
+
166
+ m_resource->SetOnError([context = m_context](int64_t requestId, string &&message, bool isTimeout) {
167
+ auto args = msrn::JSValueArray{requestId, std::move(message)};
168
+ if (isTimeout) {
169
+ args.push_back(true);
170
+ }
171
+
172
+ SendEvent(context, completedResponseW, std::move(args));
173
+ });
174
+ }
175
+
176
+ void HttpTurboModule::SendRequest(
177
+ ReactNativeSpecs::NetworkingIOSSpec_sendRequest_query &&query,
178
+ function<void(double)> const &callback) noexcept {
179
+ m_requestId++;
180
+ auto &headersObj = query.headers.AsObject();
181
+ IHttpResource::Headers headers;
182
+ for (auto &entry : headersObj) {
183
+ headers.emplace(entry.first, entry.second.AsString());
184
+ }
185
+
186
+ m_resource->SendRequest(
187
+ std::move(query.method),
188
+ std::move(query.url),
189
+ m_requestId,
190
+ std::move(headers),
191
+ query.data.MoveObject(),
192
+ std::move(query.responseType),
193
+ query.incrementalUpdates,
194
+ static_cast<int64_t>(query.timeout),
195
+ query.withCredentials,
196
+ [&callback](int64_t requestId) { callback({static_cast<double>(requestId)}); });
197
+ }
198
+
199
+ void HttpTurboModule::AbortRequest(double requestId) noexcept {
200
+ m_resource->AbortRequest(static_cast<int64_t>(requestId));
201
+ }
202
+
203
+ void HttpTurboModule::ClearCookies(function<void(bool)> const &callback) noexcept {
204
+ m_resource->ClearCookies();
205
+ }
206
+
207
+ void HttpTurboModule::AddListener(string &&eventName) noexcept { /*NOOP*/
208
+ }
209
+
210
+ void HttpTurboModule::RemoveListeners(double count) noexcept { /*NOOP*/
211
+ }
212
+
213
+ #pragma endregion HttpTurboModule
214
+
215
+ #pragma region HttpModule
216
+
104
217
  HttpModule::HttpModule(IInspectable const &inspectableProperties) noexcept
105
218
  : m_holder{std::make_shared<ModuleHolder>()},
106
219
  m_inspectableProperties{inspectableProperties},
@@ -115,7 +228,7 @@ HttpModule::~HttpModule() noexcept /*override*/ {
115
228
  #pragma region CxxModule
116
229
 
117
230
  string HttpModule::getName() /*override*/ {
118
- return moduleName;
231
+ return s_moduleName;
119
232
  }
120
233
 
121
234
  std::map<string, dynamic> HttpModule::getConstants() {
@@ -142,6 +255,7 @@ std::vector<facebook::xplat::module::CxxModule::Method> HttpModule::getMethods()
142
255
  SetUpHttpResource(resource, holder->Module->getInstance(), holder->Module->m_inspectableProperties);
143
256
  holder->Module->m_isResourceSetup = true;
144
257
  }
258
+ holder->Module->m_requestId++;
145
259
 
146
260
  auto params = facebook::xplat::jsArgAsObject(args, 0);
147
261
  IHttpResource::Headers headers;
@@ -152,9 +266,9 @@ std::vector<facebook::xplat::module::CxxModule::Method> HttpModule::getMethods()
152
266
  resource->SendRequest(
153
267
  params["method"].asString(),
154
268
  params["url"].asString(),
155
- params["requestId"].asInt(),
269
+ holder->Module->m_requestId,
156
270
  std::move(headers),
157
- std::move(params["data"]),
271
+ Modules::ToJSValue(params["data"]).MoveObject(),
158
272
  params["responseType"].asString(),
159
273
  params["incrementalUpdates"].asBool(),
160
274
  static_cast<int64_t>(params["timeout"].asDouble()),
@@ -211,8 +325,18 @@ std::vector<facebook::xplat::module::CxxModule::Method> HttpModule::getMethods()
211
325
 
212
326
  #pragma endregion CxxModule
213
327
 
328
+ #pragma endregion HttpModule
329
+
214
330
  /*extern*/ const char *GetHttpModuleName() noexcept {
215
- return moduleName;
331
+ return s_moduleName;
332
+ }
333
+
334
+ /*extern*/ const wchar_t *GetHttpTurboModuleName() noexcept {
335
+ return s_moduleNameW;
336
+ }
337
+
338
+ /*extern*/ const msrn::ReactModuleProvider &GetHttpModuleProvider() noexcept {
339
+ return s_moduleProvider;
216
340
  }
217
341
 
218
342
  } // namespace Microsoft::React
@@ -3,6 +3,8 @@
3
3
 
4
4
  #pragma once
5
5
 
6
+ #include <NativeNetworkingIOSSpec.g.h>
7
+ #include <NativeModules.h>
6
8
  #include <Networking/IHttpResource.h>
7
9
 
8
10
  // React Native
@@ -13,6 +15,36 @@
13
15
 
14
16
  namespace Microsoft::React {
15
17
 
18
+ REACT_MODULE(HttpTurboModule, L"Networking")
19
+ struct HttpTurboModule {
20
+ using ModuleSpec = ReactNativeSpecs::NetworkingIOSSpec;
21
+
22
+ REACT_INIT(Initialize)
23
+ void Initialize(winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;
24
+
25
+ REACT_METHOD(SendRequest, L"sendRequest")
26
+ void SendRequest(
27
+ ReactNativeSpecs::NetworkingIOSSpec_sendRequest_query &&query,
28
+ std::function<void(double)> const &callback) noexcept;
29
+
30
+ REACT_METHOD(AbortRequest, L"abortRequest")
31
+ void AbortRequest(double requestId) noexcept;
32
+
33
+ REACT_METHOD(ClearCookies, L"clearCookies")
34
+ void ClearCookies(std::function<void(bool)> const &callback) noexcept;
35
+
36
+ REACT_METHOD(AddListener, L"addListener")
37
+ void AddListener(std::string &&eventName) noexcept;
38
+
39
+ REACT_METHOD(RemoveListeners, L"removeListeners")
40
+ void RemoveListeners(double count) noexcept;
41
+
42
+ private:
43
+ std::shared_ptr<Networking::IHttpResource> m_resource;
44
+ winrt::Microsoft::ReactNative::ReactContext m_context;
45
+ int64_t m_requestId{0};
46
+ };
47
+
16
48
  ///
17
49
  /// Realizes <c>NativeModules</c> projection.
18
50
  /// <remarks>See src\Libraries\Network\RCTNetworking.windows.js</remarks>
@@ -53,6 +85,7 @@ class HttpModule : public facebook::xplat::module::CxxModule {
53
85
  std::shared_ptr<Networking::IHttpResource> m_resource;
54
86
  std::shared_ptr<ModuleHolder> m_holder;
55
87
  bool m_isResourceSetup{false};
88
+ int64_t m_requestId{0};
56
89
 
57
90
  // Property bag high level reference.
58
91
  winrt::Windows::Foundation::IInspectable m_inspectableProperties;
@@ -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
  // Standard Library
10
10
  #include <string>
@@ -26,7 +26,7 @@ struct IRequestBodyHandler {
26
26
  /// true - <paramref name="data" /> contains a blob reference.
27
27
  /// false - <paramref name="data" /> does not contain a blob reference.
28
28
  /// </returns>
29
- virtual bool Supports(folly::dynamic &data) = 0;
29
+ virtual bool Supports(winrt::Microsoft::ReactNative::JSValueObject &data) = 0;
30
30
 
31
31
  /// <summary>
32
32
  /// Returns the {@link RequestBody} for the JS body payload.
@@ -46,7 +46,9 @@ struct IRequestBodyHandler {
46
46
  /// "bytes" - Raw body content
47
47
  /// NOTE: This is an arbitrary key. Pending non-folly structured object to model request body.
48
48
  /// </returns>
49
- virtual folly::dynamic ToRequestBody(folly::dynamic &data, std::string &contentType) = 0;
49
+ virtual winrt::Microsoft::ReactNative::JSValueObject ToRequestBody(
50
+ winrt::Microsoft::ReactNative::JSValueObject &data,
51
+ std::string &contentType) = 0;
50
52
  };
51
53
 
52
54
  } // namespace Microsoft::React
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
- // Folly
4
- #include <folly/dynamic.h>
3
+ // React Native Windows
4
+ #include <JSValue.h>
5
5
 
6
6
  // Standard Library
7
7
  #include <string>
@@ -21,7 +21,7 @@ struct IResponseHandler {
21
21
  /// <summary>
22
22
  /// Returns the JS body payload for the {@link ResponseBody}.
23
23
  /// </summary>
24
- virtual folly::dynamic ToResponseData(std::vector<uint8_t> &&content) = 0;
24
+ virtual winrt::Microsoft::ReactNative::JSValueObject ToResponseData(std::vector<uint8_t> &&content) = 0;
25
25
  };
26
26
 
27
27
  } // namespace Microsoft::React
@@ -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
  // Standard Library
10
10
  #include <string>
@@ -31,7 +31,7 @@ struct IUriHandler {
31
31
  /// "size" - Number of bytes fetched from blob
32
32
  /// "name" - File name obtained from the URI
33
33
  /// "lastModified - Last write to local file in milliseconds
34
- virtual folly::dynamic Fetch(std::string &uri) = 0;
34
+ virtual winrt::Microsoft::ReactNative::JSValueObject Fetch(std::string &uri) = 0;
35
35
  };
36
36
 
37
37
  } // namespace Microsoft::React
@@ -3,8 +3,8 @@
3
3
 
4
4
  #pragma once
5
5
 
6
- // React Native
7
- #include <folly/dynamic.h>
6
+ // React Native Windows
7
+ #include <JSValue.h>
8
8
 
9
9
  // Standard Library
10
10
  #include <string>
@@ -18,9 +18,11 @@ namespace Microsoft::React {
18
18
  struct IWebSocketModuleContentHandler {
19
19
  virtual ~IWebSocketModuleContentHandler() noexcept {}
20
20
 
21
- virtual void ProcessMessage(std::string &&message, folly::dynamic &params) = 0;
21
+ virtual void ProcessMessage(std::string &&message, winrt::Microsoft::ReactNative::JSValueObject &params) noexcept = 0;
22
22
 
23
- virtual void ProcessMessage(std::vector<uint8_t> &&message, folly::dynamic &params) = 0;
23
+ virtual void ProcessMessage(
24
+ std::vector<uint8_t> &&message,
25
+ winrt::Microsoft::ReactNative::JSValueObject &params) noexcept = 0;
24
26
  };
25
27
 
26
28
  } // namespace Microsoft::React