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
@@ -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
@@ -4,11 +4,16 @@
4
4
  #include "pch.h"
5
5
 
6
6
  #include <Modules/WebSocketModule.h>
7
+ #include <Modules/WebSocketTurboModule.h>
7
8
 
9
+ #include <CreateModules.h>
8
10
  #include <Modules/CxxModuleUtilities.h>
9
11
  #include <Modules/IWebSocketModuleContentHandler.h>
10
12
  #include <ReactPropertyBag.h>
11
13
 
14
+ // fmt
15
+ #include <fmt/format.h>
16
+
12
17
  // React Native
13
18
  #include <cxxreact/Instance.h>
14
19
  #include <cxxreact/JsArgumentHelpers.h>
@@ -19,6 +24,8 @@
19
24
  // Standard Libriary
20
25
  #include <iomanip>
21
26
 
27
+ namespace msrn = winrt::Microsoft::ReactNative;
28
+
22
29
  using namespace facebook::xplat;
23
30
 
24
31
  using facebook::react::Instance;
@@ -26,6 +33,7 @@ using folly::dynamic;
26
33
 
27
34
  using std::shared_ptr;
28
35
  using std::string;
36
+ using std::vector;
29
37
  using std::weak_ptr;
30
38
 
31
39
  using winrt::Microsoft::ReactNative::IReactPropertyBag;
@@ -42,7 +50,10 @@ using Microsoft::React::WebSocketModule;
42
50
  using Microsoft::React::Modules::SendEvent;
43
51
  using Microsoft::React::Networking::IWebSocketResource;
44
52
 
45
- constexpr char moduleName[] = "WebSocketModule";
53
+ constexpr char s_moduleName[] = "WebSocketModule";
54
+ constexpr wchar_t s_moduleNameW[] = L"WebSocketModule";
55
+
56
+ msrn::ReactModuleProvider s_moduleProvider = msrn::MakeTurboModuleProvider<Microsoft::React::WebSocketTurboModule>();
46
57
 
47
58
  static shared_ptr<IWebSocketResource>
48
59
  GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedState> weakState) {
@@ -105,7 +116,7 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
105
116
  if (!strongInstance)
106
117
  return;
107
118
 
108
- dynamic args = dynamic::object("id", id)("type", isBinary ? "binary" : "text");
119
+ auto args = msrn::JSValueObject{{"id", id}, {"type", isBinary ? "binary" : "text"}};
109
120
  shared_ptr<Microsoft::React::IWebSocketModuleContentHandler> contentHandler;
110
121
  auto propId = ReactPropertyId<ReactNonAbiValue<weak_ptr<Microsoft::React::IWebSocketModuleContentHandler>>>{
111
122
  L"BlobModule.ContentHandler"};
@@ -117,7 +128,7 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
117
128
  auto buffer = CryptographicBuffer::DecodeFromBase64String(winrt::to_hstring(message));
118
129
  winrt::com_array<uint8_t> arr;
119
130
  CryptographicBuffer::CopyToByteArray(buffer, arr);
120
- auto data = std::vector<uint8_t>(arr.begin(), arr.end());
131
+ auto data = vector<uint8_t>(arr.begin(), arr.end());
121
132
 
122
133
  contentHandler->ProcessMessage(std::move(data), args);
123
134
  } else {
@@ -127,7 +138,7 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
127
138
  args["data"] = message;
128
139
  }
129
140
 
130
- SendEvent(weakInstance, "websocketMessage", std::move(args));
141
+ SendEvent(weakInstance, "websocketMessage", Microsoft::React::Modules::ToDynamic(std::move(args)));
131
142
  });
132
143
  ws->SetOnClose([id, weakInstance](IWebSocketResource::CloseCode code, const string &reason) {
133
144
  auto strongInstance = weakInstance.lock();
@@ -179,7 +190,7 @@ void WebSocketModule::SetResourceFactory(
179
190
  }
180
191
 
181
192
  string WebSocketModule::getName() {
182
- return moduleName;
193
+ return s_moduleName;
183
194
  }
184
195
 
185
196
  std::map<string, dynamic> WebSocketModule::getConstants() {
@@ -187,7 +198,7 @@ std::map<string, dynamic> WebSocketModule::getConstants() {
187
198
  }
188
199
 
189
200
  // clang-format off
190
- std::vector<facebook::xplat::module::CxxModule::Method> WebSocketModule::getMethods()
201
+ vector<facebook::xplat::module::CxxModule::Method> WebSocketModule::getMethods()
191
202
  {
192
203
  return
193
204
  {
@@ -312,8 +323,172 @@ void WebSocketModuleProxy::SendBinary(std::string &&base64String, int64_t id) no
312
323
 
313
324
  #pragma endregion WebSocketModuleProxy
314
325
 
326
+ #pragma region WebSocketTurboModule
327
+
328
+ shared_ptr<IWebSocketResource> WebSocketTurboModule::CreateResource(int64_t id, string &&url) noexcept {
329
+ shared_ptr<IWebSocketResource> rc;
330
+ try {
331
+ rc = IWebSocketResource::Make();
332
+ } catch (const winrt::hresult_error &e) {
333
+ auto error = fmt::format("[0x{:0>8x}] {}", static_cast<uint32_t>(e.code()), winrt::to_string(e.message()));
334
+ SendEvent(m_context, L"webSocketFailed", {{"id", id}, {"message", std::move(error)}});
335
+
336
+ return nullptr;
337
+ } catch (const std::exception &e) {
338
+ SendEvent(m_context, L"webSocketFailed", {{"id", id}, {"message", e.what()}});
339
+
340
+ return nullptr;
341
+ } catch (...) {
342
+ SendEvent(
343
+ m_context, L"webSocketFailed", {{"id", id}, {"message", "Unidentified error creating IWebSocketResource"}});
344
+
345
+ return nullptr;
346
+ }
347
+
348
+ // Set up resource
349
+ rc->SetOnConnect([id, context = m_context]() {
350
+ SendEvent(context, L"websocketOpen", msrn::JSValueObject{{"id", id}});
351
+ });
352
+
353
+ rc->SetOnMessage([id, context = m_context](size_t length, const string &message, bool isBinary) {
354
+ auto args = msrn::JSValueObject{{"id", id}, {"type", isBinary ? "binary" : "text"}};
355
+ shared_ptr<IWebSocketModuleContentHandler> contentHandler;
356
+ auto propId =
357
+ ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleContentHandler>>>{L"BlobModule.ContentHandler"};
358
+ auto propBag = context.Properties();
359
+ if (auto prop = propBag.Get(propId))
360
+ contentHandler = prop.Value().lock();
361
+
362
+ if (contentHandler) {
363
+ if (isBinary) {
364
+ auto buffer = CryptographicBuffer::DecodeFromBase64String(winrt::to_hstring(message));
365
+ winrt::com_array<uint8_t> arr;
366
+ CryptographicBuffer::CopyToByteArray(buffer, arr);
367
+ auto data = vector<uint8_t>(arr.begin(), arr.end());
368
+
369
+ contentHandler->ProcessMessage(std::move(data), args);
370
+ } else {
371
+ contentHandler->ProcessMessage(string{message}, args);
372
+ }
373
+ } else {
374
+ args["data"] = message;
375
+ }
376
+
377
+ SendEvent(context, L"websocketMessage", std::move(args));
378
+ });
379
+
380
+ rc->SetOnClose([id, context = m_context](IWebSocketResource::CloseCode code, const string &reason) {
381
+ auto args = msrn::JSValueObject{{"id", id}, {"code", static_cast<uint16_t>(code)}, {"reason", reason}};
382
+
383
+ SendEvent(context, L"websocketClosed", std::move(args));
384
+ });
385
+
386
+ rc->SetOnError([id, context = m_context](const IWebSocketResource::Error &err) {
387
+ auto errorObj = msrn::JSValueObject{{"id", id}, {"message", err.Message}};
388
+
389
+ SendEvent(context, L"websocketFailed", std::move(errorObj));
390
+ });
391
+
392
+ m_resourceMap.emplace(static_cast<double>(id), rc);
393
+
394
+ return rc;
395
+ }
396
+
397
+ void WebSocketTurboModule::Initialize(msrn::ReactContext const &reactContext) noexcept {
398
+ m_context = reactContext.Handle();
399
+ }
400
+
401
+ void WebSocketTurboModule::Connect(
402
+ string &&url,
403
+ std::optional<vector<string>> protocols,
404
+ ReactNativeSpecs::WebSocketModuleSpec_connect_options &&options,
405
+ double socketID) noexcept {
406
+ IWebSocketResource::Protocols rcProtocols;
407
+ for (const auto &protocol : protocols.value_or(vector<string>{})) {
408
+ rcProtocols.push_back(protocol);
409
+ }
410
+
411
+ IWebSocketResource::Options rcOptions;
412
+ auto &optHeaders = options.headers;
413
+ if (optHeaders.has_value()) {
414
+ auto &headersVal = optHeaders.value();
415
+ for (const auto &headerVal : headersVal.AsArray()) {
416
+ // Each header JSValueObject should only contain one key-value pair
417
+ const auto &entry = *headerVal.AsObject().cbegin();
418
+ rcOptions.emplace(winrt::to_hstring(entry.first), entry.second.AsString());
419
+ }
420
+ }
421
+
422
+ weak_ptr<IWebSocketResource> weakRc;
423
+ auto rcItr = m_resourceMap.find(socketID);
424
+ if (rcItr != m_resourceMap.cend()) {
425
+ weakRc = (*rcItr).second;
426
+ } else {
427
+ weakRc = CreateResource(static_cast<int64_t>(socketID), string{url});
428
+ }
429
+
430
+ if (auto rc = weakRc.lock()) {
431
+ rc->Connect(std::move(url), rcProtocols, rcOptions);
432
+ }
433
+ }
434
+
435
+ void WebSocketTurboModule::Close(double code, string &&reason, double socketID) noexcept {
436
+ auto rcItr = m_resourceMap.find(socketID);
437
+ if (rcItr == m_resourceMap.cend()) {
438
+ return; // TODO: Send error instead?
439
+ }
440
+
441
+ weak_ptr<IWebSocketResource> weakRc = (*rcItr).second;
442
+ if (auto rc = weakRc.lock()) {
443
+ rc->Close(static_cast<IWebSocketResource::CloseCode>(code), std::move(reason));
444
+ }
445
+ }
446
+
447
+ void WebSocketTurboModule::Send(string &&message, double forSocketID) noexcept {
448
+ auto rcItr = m_resourceMap.find(forSocketID);
449
+ if (rcItr == m_resourceMap.cend()) {
450
+ return; // TODO: Send error instead?
451
+ }
452
+
453
+ weak_ptr<IWebSocketResource> weakRc = (*rcItr).second;
454
+ if (auto rc = weakRc.lock()) {
455
+ rc->Send(std::move(message));
456
+ }
457
+ }
458
+
459
+ void WebSocketTurboModule::SendBinary(string &&base64String, double forSocketID) noexcept {
460
+ auto rcItr = m_resourceMap.find(forSocketID);
461
+ if (rcItr == m_resourceMap.cend()) {
462
+ return; // TODO: Send error instead?
463
+ }
464
+
465
+ weak_ptr<IWebSocketResource> weakRc = (*rcItr).second;
466
+ if (auto rc = weakRc.lock()) {
467
+ rc->SendBinary(std::move(base64String));
468
+ }
469
+ }
470
+
471
+ void WebSocketTurboModule::Ping(double socketID) noexcept {
472
+ auto rcItr = m_resourceMap.find(socketID);
473
+ if (rcItr == m_resourceMap.cend()) {
474
+ return; // TODO: Send error instead?
475
+ }
476
+
477
+ weak_ptr<IWebSocketResource> weakRc = (*rcItr).second;
478
+ if (auto rc = weakRc.lock()) {
479
+ rc->Ping();
480
+ }
481
+ }
482
+
483
+ // See react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java
484
+ void WebSocketTurboModule::AddListener(string && /*eventName*/) noexcept {}
485
+
486
+ void WebSocketTurboModule::RemoveListeners(double /*count*/) noexcept {}
487
+
488
+ #pragma endregion WebSocketTurboModule
489
+
315
490
  /*extern*/ const char *GetWebSocketModuleName() noexcept {
316
- return moduleName;
491
+ return s_moduleName;
317
492
  }
318
493
 
319
494
  /*extern*/ std::unique_ptr<facebook::xplat::module::CxxModule> CreateWebSocketModule(
@@ -324,4 +499,12 @@ void WebSocketModuleProxy::SendBinary(std::string &&base64String, int64_t id) no
324
499
  return nullptr;
325
500
  }
326
501
 
502
+ /*extern*/ const wchar_t *GetWebSocketTurboModuleName() noexcept {
503
+ return s_moduleNameW;
504
+ }
505
+
506
+ /*extern*/ const msrn::ReactModuleProvider &GetWebSocketModuleProvider() noexcept {
507
+ return s_moduleProvider;
508
+ }
509
+
327
510
  } // namespace Microsoft::React
@@ -0,0 +1,52 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ #include <NativeWebSocketModuleSpec.g.h>
7
+ #include <Modules/IWebSocketModuleProxy.h>
8
+ #include <NativeModules.h>
9
+ #include <Networking/IWebSocketResource.h>
10
+
11
+ namespace Microsoft::React {
12
+
13
+ REACT_MODULE(WebSocketTurboModule, L"WebSocketModule")
14
+ struct WebSocketTurboModule {
15
+ using ModuleSpec = ReactNativeSpecs::WebSocketModuleSpec;
16
+
17
+ REACT_INIT(Initialize)
18
+ void Initialize(winrt::Microsoft::ReactNative::ReactContext const &reactContext) noexcept;
19
+
20
+ REACT_METHOD(Connect, L"connect")
21
+ void Connect(
22
+ std::string &&url,
23
+ std::optional<std::vector<std::string>> protocols,
24
+ ReactNativeSpecs::WebSocketModuleSpec_connect_options &&options,
25
+ double socketID) noexcept;
26
+
27
+ REACT_METHOD(Close, L"close")
28
+ void Close(double code, std::string &&reason, double socketID) noexcept;
29
+
30
+ REACT_METHOD(Send, L"send")
31
+ void Send(std::string &&message, double forSocketID) noexcept;
32
+
33
+ REACT_METHOD(SendBinary, L"sendBinary")
34
+ void SendBinary(std::string &&base64String, double forSocketID) noexcept;
35
+
36
+ REACT_METHOD(Ping, L"ping")
37
+ void Ping(double socketID) noexcept;
38
+
39
+ REACT_METHOD(AddListener, L"addListener")
40
+ void AddListener(std::string &&eventName) noexcept;
41
+
42
+ REACT_METHOD(RemoveListeners, L"removeListeners")
43
+ void RemoveListeners(double count) noexcept;
44
+
45
+ private:
46
+ std::shared_ptr<Networking::IWebSocketResource> CreateResource(int64_t id, std::string &&url) noexcept;
47
+
48
+ winrt::Microsoft::ReactNative::ReactContext m_context;
49
+ std::unordered_map<double, std::shared_ptr<Networking::IWebSocketResource>> m_resourceMap;
50
+ };
51
+
52
+ } // namespace Microsoft::React