react-native-windows 0.66.18 → 0.66.21

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 (63) hide show
  1. package/CHANGELOG.json +58 -1
  2. package/CHANGELOG.md +31 -5
  3. package/Chakra/ChakraHelpers.cpp +0 -1
  4. package/Directory.Build.props +4 -0
  5. package/Folly/Folly.vcxproj +4 -5
  6. package/Libraries/Network/RCTNetworkingWinShared.js +7 -0
  7. package/Microsoft.ReactNative/Base/CoreNativeModules.cpp +3 -1
  8. package/Microsoft.ReactNative/IReactContext.cpp +17 -0
  9. package/Microsoft.ReactNative/IReactContext.h +2 -0
  10. package/Microsoft.ReactNative/IReactContext.idl +27 -0
  11. package/Microsoft.ReactNative/Modules/CreateModules.cpp +3 -3
  12. package/Microsoft.ReactNative/packages.config +1 -1
  13. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.cpp +17 -3
  14. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.h +48 -0
  15. package/PropertySheets/JSEngine.props +1 -1
  16. package/Scripts/OfficeReact.Win32.nuspec +1 -1
  17. package/Shared/BaseScriptStoreImpl.cpp +1 -1
  18. package/Shared/CppRuntimeOptions.h +50 -0
  19. package/Shared/CreateModules.h +17 -2
  20. package/Shared/InspectorPackagerConnection.cpp +7 -5
  21. package/Shared/InspectorPackagerConnection.h +2 -2
  22. package/Shared/JSI/ChakraApi.cpp +0 -1
  23. package/Shared/JSI/ChakraRuntime.cpp +0 -1
  24. package/Shared/JSI/NapiJsiV8RuntimeHolder.cpp +72 -2
  25. package/Shared/JSI/NapiJsiV8RuntimeHolder.h +2 -0
  26. package/Shared/Modules/BlobModule.cpp +376 -0
  27. package/Shared/Modules/BlobModule.h +153 -0
  28. package/Shared/Modules/CxxModuleUtilities.cpp +19 -0
  29. package/Shared/Modules/CxxModuleUtilities.h +23 -0
  30. package/Shared/Modules/FileReaderModule.cpp +156 -0
  31. package/Shared/Modules/FileReaderModule.h +54 -0
  32. package/Shared/Modules/HttpModule.cpp +73 -70
  33. package/Shared/Modules/HttpModule.h +10 -3
  34. package/Shared/Modules/IBlobPersistor.h +30 -0
  35. package/Shared/Modules/IHttpModuleProxy.h +30 -0
  36. package/Shared/Modules/IRequestBodyHandler.h +52 -0
  37. package/Shared/Modules/IResponseHandler.h +27 -0
  38. package/Shared/Modules/IUriHandler.h +37 -0
  39. package/Shared/Modules/IWebSocketModuleContentHandler.h +26 -0
  40. package/Shared/Modules/IWebSocketModuleProxy.h +22 -0
  41. package/Shared/Modules/NetworkingModule.cpp +1 -1
  42. package/Shared/Modules/WebSocketModule.cpp +93 -23
  43. package/Shared/Modules/WebSocketModule.h +35 -6
  44. package/Shared/Networking/IHttpResource.h +101 -0
  45. package/Shared/{IWebSocketResource.h → Networking/IWebSocketResource.h} +2 -2
  46. package/Shared/Networking/OriginPolicy.h +15 -0
  47. package/Shared/Networking/OriginPolicyHttpFilter.cpp +747 -0
  48. package/Shared/Networking/OriginPolicyHttpFilter.h +112 -0
  49. package/Shared/Networking/WinRTHttpResource.cpp +465 -0
  50. package/Shared/{WinRTHttpResource.h → Networking/WinRTHttpResource.h} +35 -20
  51. package/Shared/Networking/WinRTTypes.h +33 -0
  52. package/Shared/{WinRTWebSocketResource.cpp → Networking/WinRTWebSocketResource.cpp} +2 -2
  53. package/Shared/{WinRTWebSocketResource.h → Networking/WinRTWebSocketResource.h} +3 -3
  54. package/Shared/OInstance.cpp +26 -6
  55. package/Shared/OInstance.h +8 -4
  56. package/Shared/RuntimeOptions.cpp +96 -15
  57. package/Shared/RuntimeOptions.h +32 -8
  58. package/Shared/Shared.vcxitems +24 -6
  59. package/Shared/Shared.vcxitems.filters +78 -18
  60. package/fmt/fmt.vcxproj +4 -5
  61. package/package.json +1 -1
  62. package/Shared/IHttpResource.h +0 -53
  63. package/Shared/WinRTHttpResource.cpp +0 -317
@@ -0,0 +1,22 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ // Standard Library
7
+ #include <memory>
8
+ #include <string>
9
+
10
+ namespace Microsoft::React {
11
+
12
+ /// <summary>
13
+ /// Provides partial access to WebSocketModule methods directly to other native modules
14
+ /// without switching to the JavaScript queue thread.
15
+ /// </summary>
16
+ struct IWebSocketModuleProxy {
17
+ virtual ~IWebSocketModuleProxy() noexcept {}
18
+
19
+ virtual void SendBinary(std::string &&base64String, int64_t id) noexcept = 0;
20
+ };
21
+
22
+ } // namespace Microsoft::React
@@ -261,7 +261,7 @@ void NetworkingModule::NetworkingHelper::SendRequest(
261
261
  int64_t requestId = ++s_lastRequestId;
262
262
 
263
263
  // Enforce supported args
264
- assert(responseType == "text" || responseType == "base64");
264
+ assert(responseType == "text" || responseType == "base64" || responseType == "blob");
265
265
 
266
266
  // Callback with the requestId
267
267
  cb({requestId});
@@ -5,10 +5,16 @@
5
5
 
6
6
  #include <Modules/WebSocketModule.h>
7
7
 
8
- #include <Utils.h>
8
+ #include <Modules/CxxModuleUtilities.h>
9
+ #include <Modules/IWebSocketModuleContentHandler.h>
10
+ #include <ReactPropertyBag.h>
11
+
12
+ // React Native
9
13
  #include <cxxreact/Instance.h>
10
14
  #include <cxxreact/JsArgumentHelpers.h>
11
- #include "Unicode.h"
15
+
16
+ // Windows API
17
+ #include <winrt/Windows.Security.Cryptography.h>
12
18
 
13
19
  // Standard Libriary
14
20
  #include <iomanip>
@@ -18,25 +24,26 @@ using namespace facebook::xplat;
18
24
  using facebook::react::Instance;
19
25
  using folly::dynamic;
20
26
 
21
- using Microsoft::Common::Unicode::Utf16ToUtf8;
22
- using Microsoft::Common::Unicode::Utf8ToUtf16;
23
-
24
27
  using std::shared_ptr;
25
28
  using std::string;
26
29
  using std::weak_ptr;
27
30
 
31
+ using winrt::Microsoft::ReactNative::IReactPropertyBag;
32
+ using winrt::Microsoft::ReactNative::ReactNonAbiValue;
33
+ using winrt::Microsoft::ReactNative::ReactPropertyBag;
34
+ using winrt::Microsoft::ReactNative::ReactPropertyId;
35
+
36
+ using winrt::Windows::Foundation::IInspectable;
37
+ using winrt::Windows::Security::Cryptography::CryptographicBuffer;
38
+
28
39
  namespace {
29
- using Microsoft::React::IWebSocketResource;
40
+ using Microsoft::React::IWebSocketModuleProxy;
30
41
  using Microsoft::React::WebSocketModule;
42
+ using Microsoft::React::Modules::SendEvent;
43
+ using Microsoft::React::Networking::IWebSocketResource;
31
44
 
32
45
  constexpr char moduleName[] = "WebSocketModule";
33
46
 
34
- static void SendEvent(weak_ptr<Instance> weakInstance, string &&eventName, dynamic &&args) {
35
- if (auto instance = weakInstance.lock()) {
36
- instance->callJSFunction("RCTDeviceEventEmitter", "emit", dynamic::array(std::move(eventName), std::move(args)));
37
- }
38
- }
39
-
40
47
  static shared_ptr<IWebSocketResource>
41
48
  GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedState> weakState) {
42
49
  auto state = weakState.lock();
@@ -91,14 +98,37 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
91
98
  auto args = dynamic::object("id", id);
92
99
  SendEvent(weakInstance, "websocketOpen", std::move(args));
93
100
  });
94
- ws->SetOnMessage([id, weakInstance](size_t length, const string &message, bool isBinary) {
95
- auto strongInstance = weakInstance.lock();
96
- if (!strongInstance)
97
- return;
101
+ ws->SetOnMessage(
102
+ [id, weakInstance, propBag = ReactPropertyBag{state->InspectableProps.try_as<IReactPropertyBag>()}](
103
+ size_t length, const string &message, bool isBinary) {
104
+ auto strongInstance = weakInstance.lock();
105
+ if (!strongInstance)
106
+ return;
107
+
108
+ dynamic args = dynamic::object("id", id)("type", isBinary ? "binary" : "text");
109
+ shared_ptr<Microsoft::React::IWebSocketModuleContentHandler> contentHandler;
110
+ auto propId = ReactPropertyId<ReactNonAbiValue<weak_ptr<Microsoft::React::IWebSocketModuleContentHandler>>>{
111
+ L"BlobModule.ContentHandler"};
112
+ if (auto prop = propBag.Get(propId))
113
+ contentHandler = prop.Value().lock();
114
+
115
+ if (contentHandler) {
116
+ if (isBinary) {
117
+ auto buffer = CryptographicBuffer::DecodeFromBase64String(winrt::to_hstring(message));
118
+ winrt::com_array<uint8_t> arr;
119
+ CryptographicBuffer::CopyToByteArray(buffer, arr);
120
+ auto data = std::vector<uint8_t>(arr.begin(), arr.end());
121
+
122
+ contentHandler->ProcessMessage(std::move(data), args);
123
+ } else {
124
+ contentHandler->ProcessMessage(string{message}, args);
125
+ }
126
+ } else {
127
+ args["data"] = message;
128
+ }
98
129
 
99
- auto args = dynamic::object("id", id)("data", message)("type", isBinary ? "binary" : "text");
100
- SendEvent(weakInstance, "websocketMessage", std::move(args));
101
- });
130
+ SendEvent(weakInstance, "websocketMessage", std::move(args));
131
+ });
102
132
  ws->SetOnClose([id, weakInstance](IWebSocketResource::CloseCode code, const string &reason) {
103
133
  auto strongInstance = weakInstance.lock();
104
134
  if (!strongInstance)
@@ -119,9 +149,24 @@ GetOrCreateWebSocket(int64_t id, string &&url, weak_ptr<WebSocketModule::SharedS
119
149
 
120
150
  namespace Microsoft::React {
121
151
 
122
- WebSocketModule::WebSocketModule() : m_sharedState{std::make_shared<SharedState>()} {
152
+ #pragma region WebSocketModule
153
+
154
+ WebSocketModule::WebSocketModule(winrt::Windows::Foundation::IInspectable const &inspectableProperties)
155
+ : m_sharedState{std::make_shared<SharedState>()},
156
+ m_proxy{std::make_shared<WebSocketModuleProxy>(inspectableProperties)} {
123
157
  m_sharedState->ResourceFactory = [](string &&url) { return IWebSocketResource::Make(); };
124
158
  m_sharedState->Module = this;
159
+ m_sharedState->InspectableProps = inspectableProperties;
160
+
161
+ auto propBag = ReactPropertyBag{m_sharedState->InspectableProps.try_as<IReactPropertyBag>()};
162
+
163
+ auto proxyPropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<IWebSocketModuleProxy>>>{L"WebSocketModule.Proxy"};
164
+ auto proxy = weak_ptr<IWebSocketModuleProxy>{m_proxy};
165
+ propBag.Set(proxyPropId, std::move(proxy));
166
+
167
+ auto statePropId = ReactPropertyId<ReactNonAbiValue<weak_ptr<SharedState>>>{L"WebSocketModule.SharedState"};
168
+ auto state = weak_ptr<SharedState>{m_sharedState};
169
+ propBag.Set(statePropId, std::move(state));
125
170
  }
126
171
 
127
172
  WebSocketModule::~WebSocketModule() noexcept /*override*/ {
@@ -167,7 +212,7 @@ std::vector<facebook::xplat::module::CxxModule::Method> WebSocketModule::getMeth
167
212
  const auto& headersDynamic = optionsDynamic["headers"];
168
213
  for (const auto& header : headersDynamic.items())
169
214
  {
170
- options.emplace(Utf8ToUtf16(header.first.getString()), header.second.getString());
215
+ options.emplace(winrt::to_hstring(header.first.getString()), header.second.getString());
171
216
  }
172
217
  }
173
218
 
@@ -246,12 +291,37 @@ std::vector<facebook::xplat::module::CxxModule::Method> WebSocketModule::getMeth
246
291
  } // getMethods
247
292
  // clang-format on
248
293
 
294
+ #pragma endregion WebSocketModule
295
+
296
+ #pragma region WebSocketModuleProxy
297
+
298
+ WebSocketModuleProxy::WebSocketModuleProxy(IInspectable const &inspectableProperties) noexcept
299
+ : m_inspectableProps{inspectableProperties} {}
300
+
301
+ void WebSocketModuleProxy::SendBinary(std::string &&base64String, int64_t id) noexcept /*override*/ {
302
+ auto propBag = ReactPropertyBag{m_inspectableProps.try_as<IReactPropertyBag>()};
303
+ auto sharedPropId =
304
+ ReactPropertyId<ReactNonAbiValue<weak_ptr<WebSocketModule::SharedState>>>{L"WebSocketModule.SharedState"};
305
+ auto state = propBag.Get(sharedPropId).Value();
306
+
307
+ weak_ptr weakWs = GetOrCreateWebSocket(id, {}, std::move(state));
308
+ if (auto sharedWs = weakWs.lock()) {
309
+ sharedWs->SendBinary(std::move(base64String));
310
+ }
311
+ }
312
+
313
+ #pragma endregion WebSocketModuleProxy
314
+
249
315
  /*extern*/ const char *GetWebSocketModuleName() noexcept {
250
316
  return moduleName;
251
317
  }
252
318
 
253
- /*extern*/ std::unique_ptr<facebook::xplat::module::CxxModule> CreateWebSocketModule() noexcept {
254
- return std::make_unique<WebSocketModule>();
319
+ /*extern*/ std::unique_ptr<facebook::xplat::module::CxxModule> CreateWebSocketModule(
320
+ IInspectable const &inspectableProperties) noexcept {
321
+ if (auto properties = inspectableProperties.try_as<IReactPropertyBag>())
322
+ return std::make_unique<WebSocketModule>(properties);
323
+
324
+ return nullptr;
255
325
  }
256
326
 
257
327
  } // namespace Microsoft::React
@@ -3,11 +3,31 @@
3
3
 
4
4
  #pragma once
5
5
 
6
+ #include <Modules/IWebSocketModuleProxy.h>
7
+ #include <Networking/IWebSocketResource.h>
8
+
9
+ // React Native
6
10
  #include <cxxreact/CxxModule.h>
7
- #include "IWebSocketResource.h"
11
+
12
+ // Windows API
13
+ #include <winrt/Windows.Foundation.h>
8
14
 
9
15
  namespace Microsoft::React {
10
16
 
17
+ class WebSocketModuleProxy final : public IWebSocketModuleProxy {
18
+ // Property bag high level reference.
19
+ winrt::Windows::Foundation::IInspectable m_inspectableProps;
20
+
21
+ public:
22
+ WebSocketModuleProxy(winrt::Windows::Foundation::IInspectable const &inspectableProperties) noexcept;
23
+
24
+ #pragma region IWebSocketModuleProxy
25
+
26
+ void SendBinary(std::string &&base64String, int64_t id) noexcept override;
27
+
28
+ #pragma endregion
29
+ };
30
+
11
31
  ///
12
32
  /// Realizes <c>NativeModules</c> projection.
13
33
  /// <remarks>See react-native/Libraries/WebSocket/WebSocket.js</remarks>
@@ -16,7 +36,7 @@ class WebSocketModule : public facebook::xplat::module::CxxModule {
16
36
  public:
17
37
  enum MethodId { Connect = 0, Close = 1, Send = 2, SendBinary = 3, Ping = 4, SIZE = 5 };
18
38
 
19
- WebSocketModule();
39
+ WebSocketModule(winrt::Windows::Foundation::IInspectable const &inspectableProperties);
20
40
 
21
41
  ~WebSocketModule() noexcept override;
22
42
 
@@ -25,17 +45,20 @@ class WebSocketModule : public facebook::xplat::module::CxxModule {
25
45
  /// Keeps <c>IWebSocketResource</c> instances identified by <c>id</c>.
26
46
  /// As defined in WebSocket.js.
27
47
  /// </summary>
28
- std::map<int64_t, std::shared_ptr<IWebSocketResource>> ResourceMap{};
48
+ std::map<int64_t, std::shared_ptr<Networking::IWebSocketResource>> ResourceMap{};
29
49
 
30
50
  /// <summary>
31
51
  /// Generates IWebSocketResource instances, defaulting to IWebSocketResource::Make.
32
52
  /// </summary>
33
- std::function<std::shared_ptr<IWebSocketResource>(std::string &&)> ResourceFactory;
53
+ std::function<std::shared_ptr<Networking::IWebSocketResource>(std::string &&)> ResourceFactory;
34
54
 
35
55
  /// <summary>
36
56
  /// Keeps a raw reference to the module object to lazily retrieve the React Instance as needed.
37
57
  /// </summary>
38
58
  CxxModule *Module{nullptr};
59
+
60
+ // Property bag high level reference.
61
+ winrt::Windows::Foundation::IInspectable InspectableProps;
39
62
  };
40
63
 
41
64
  #pragma region CxxModule overrides
@@ -58,19 +81,25 @@ class WebSocketModule : public facebook::xplat::module::CxxModule {
58
81
 
59
82
  #pragma endregion CxxModule overrides
60
83
 
61
- void SetResourceFactory(std::function<std::shared_ptr<IWebSocketResource>(const std::string &)> &&resourceFactory);
84
+ void SetResourceFactory(
85
+ std::function<std::shared_ptr<Networking::IWebSocketResource>(const std::string &)> &&resourceFactory);
62
86
 
63
87
  private:
64
88
  /// <summary>
65
89
  /// Keeps <c>IWebSocketResource</c> instances identified by <c>id</c>.
66
90
  /// As defined in WebSocket.js.
67
91
  /// </summary>
68
- std::map<int64_t, std::shared_ptr<IWebSocketResource>> m_webSockets;
92
+ std::map<int64_t, std::shared_ptr<Networking::IWebSocketResource>> m_webSockets;
69
93
 
70
94
  /// <summary>
71
95
  /// Keeps members that can be accessed threads other than this module's owner accessible.
72
96
  /// </summary>
73
97
  std::shared_ptr<SharedState> m_sharedState;
98
+
99
+ /// <summary>
100
+ /// Exposes a subset of the module's methods.
101
+ /// </summary>
102
+ std::shared_ptr<IWebSocketModuleProxy> m_proxy;
74
103
  };
75
104
 
76
105
  } // namespace Microsoft::React
@@ -0,0 +1,101 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ // Folly
7
+ #include <folly/dynamic.h>
8
+
9
+ // Windows API
10
+ #include <winrt/Windows.Foundation.h>
11
+
12
+ // Standard Library
13
+ #include <functional>
14
+ #include <memory>
15
+ #include <string>
16
+ #include <unordered_map>
17
+
18
+ namespace Microsoft::React::Networking {
19
+
20
+ struct IHttpResource {
21
+ typedef std::unordered_map<std::string, std::string> Headers;
22
+
23
+ // TODO: Implement Form data
24
+ struct BodyData {
25
+ enum class Type : size_t { Empty, String, Base64, Uri, Form } Type = Type::Empty;
26
+ std::string Data;
27
+ };
28
+
29
+ struct Response {
30
+ int64_t StatusCode;
31
+ std::string Url;
32
+ Headers Headers;
33
+ };
34
+
35
+ static std::shared_ptr<IHttpResource> Make() noexcept;
36
+
37
+ static std::shared_ptr<IHttpResource> Make(
38
+ winrt::Windows::Foundation::IInspectable const &inspectableProperties) noexcept;
39
+
40
+ virtual ~IHttpResource() noexcept {}
41
+
42
+ /// <summary>
43
+ /// Initiates an HTTP request.
44
+ /// </summary>
45
+ /// <param name="method">
46
+ /// HTTP verb to send in de request.
47
+ /// GET | POST | PUT | DELETE | OPTIONS
48
+ /// </param>
49
+ /// <param name="url">
50
+ /// Server/service remote endpoint to send the request to.
51
+ /// </param>
52
+ /// <param name="requestId">
53
+ /// Request unique identifier.
54
+ /// </param>
55
+ /// <param name="headers">
56
+ /// HTTP request header map.
57
+ /// </param>
58
+ /// <param name="data">
59
+ /// Dynamic map containing request payload.
60
+ /// The payload may be an empty request body or one of the following:
61
+ /// "string" - UTF-8 string payload
62
+ /// "base64" - Base64-encoded data string
63
+ /// "uri" - URI data reference
64
+ /// "form" - Form-encoded data
65
+ /// </param>
66
+ /// <param name="responseType">
67
+ /// text | binary | blob
68
+ /// </param>
69
+ /// <param name="useIncrementalUpdates">
70
+ /// Response body to be retrieved in several iterations.
71
+ /// </param>
72
+ /// <param name="timeout">
73
+ /// Request timeout in miliseconds.
74
+ /// </param>
75
+ /// <param name="withCredentials">
76
+ /// Allow including credentials in request.
77
+ /// </param>
78
+ virtual void SendRequest(
79
+ std::string &&method,
80
+ std::string &&url,
81
+ int64_t requestId,
82
+ Headers &&headers,
83
+ folly::dynamic &&data,
84
+ std::string &&responseType,
85
+ bool useIncrementalUpdates,
86
+ int64_t timeout,
87
+ bool withCredentials,
88
+ std::function<void(int64_t)> &&callback) noexcept = 0;
89
+ virtual void AbortRequest(int64_t requestId) noexcept = 0;
90
+
91
+ virtual void ClearCookies() noexcept = 0;
92
+
93
+ virtual void SetOnRequestSuccess(std::function<void(int64_t requestId)> &&handler) noexcept = 0;
94
+ virtual void SetOnResponse(std::function<void(int64_t requestId, Response &&response)> &&handler) noexcept = 0;
95
+ virtual void SetOnData(std::function<void(int64_t requestId, std::string &&responseData)> &&handler) noexcept = 0;
96
+ virtual void SetOnData(std::function<void(int64_t requestId, folly::dynamic &&responseData)> &&handler) noexcept = 0;
97
+ virtual void SetOnError(
98
+ std::function<void(int64_t requestId, std::string &&errorMessage /*, bool isTimeout*/)> &&handler) noexcept = 0;
99
+ };
100
+
101
+ } // namespace Microsoft::React::Networking
@@ -8,7 +8,7 @@
8
8
  #include <string>
9
9
  #include <vector>
10
10
 
11
- namespace Microsoft::React {
11
+ namespace Microsoft::React::Networking {
12
12
 
13
13
  /// <summary>
14
14
  /// Defines the core functionality for a native WebSocket client resource.
@@ -181,4 +181,4 @@ struct IWebSocketResource {
181
181
  virtual void SetOnError(std::function<void(Error &&)> &&handler) noexcept = 0;
182
182
  };
183
183
 
184
- } // namespace Microsoft::React
184
+ } // namespace Microsoft::React::Networking
@@ -0,0 +1,15 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ #pragma once
5
+
6
+ namespace Microsoft::React::Networking {
7
+
8
+ enum class OriginPolicy : size_t {
9
+ None = 0,
10
+ SameOrigin = 1,
11
+ SimpleCrossOriginResourceSharing = 2,
12
+ CrossOriginResourceSharing = 3, // TODO: Rename as FullCrossOriginResourceSharing?
13
+ };
14
+
15
+ } // namespace Microsoft::React::Networking