react-native-windows 0.67.9 → 0.67.12

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 (72) hide show
  1. package/CHANGELOG.json +168 -0
  2. package/CHANGELOG.md +67 -6
  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/JsiApiContext.cpp +17 -5
  14. package/Microsoft.ReactNative.Cxx/JSI/JsiApiContext.h +36 -7
  15. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.cpp +17 -3
  16. package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.h +48 -0
  17. package/Microsoft.ReactNative.Cxx/JSValueWriter.h +1 -1
  18. package/Microsoft.ReactNative.Cxx/ReactPromise.cpp +21 -1
  19. package/Microsoft.ReactNative.Cxx/ReactPromise.h +27 -0
  20. package/Microsoft.ReactNative.Cxx/TurboModuleProvider.h +1 -1
  21. package/PropertySheets/Generated/PackageVersion.g.props +2 -2
  22. package/PropertySheets/JSEngine.props +1 -1
  23. package/ReactCommon/ReactCommon.vcxproj +0 -4
  24. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/CompactValue.h +204 -0
  25. package/Scripts/OfficeReact.Win32.nuspec +1 -1
  26. package/Shared/BaseScriptStoreImpl.cpp +1 -1
  27. package/Shared/CppRuntimeOptions.h +50 -0
  28. package/Shared/CreateModules.h +17 -2
  29. package/Shared/InspectorPackagerConnection.cpp +7 -5
  30. package/Shared/InspectorPackagerConnection.h +2 -2
  31. package/Shared/JSI/ChakraApi.cpp +0 -1
  32. package/Shared/JSI/ChakraRuntime.cpp +0 -1
  33. package/Shared/JSI/NapiJsiV8RuntimeHolder.cpp +72 -2
  34. package/Shared/JSI/NapiJsiV8RuntimeHolder.h +2 -0
  35. package/Shared/Modules/BlobModule.cpp +376 -0
  36. package/Shared/Modules/BlobModule.h +153 -0
  37. package/Shared/Modules/CxxModuleUtilities.cpp +19 -0
  38. package/Shared/Modules/CxxModuleUtilities.h +23 -0
  39. package/Shared/Modules/FileReaderModule.cpp +156 -0
  40. package/Shared/Modules/FileReaderModule.h +54 -0
  41. package/Shared/Modules/HttpModule.cpp +73 -70
  42. package/Shared/Modules/HttpModule.h +10 -3
  43. package/Shared/Modules/IBlobPersistor.h +30 -0
  44. package/Shared/Modules/IHttpModuleProxy.h +30 -0
  45. package/Shared/Modules/IRequestBodyHandler.h +52 -0
  46. package/Shared/Modules/IResponseHandler.h +27 -0
  47. package/Shared/Modules/IUriHandler.h +37 -0
  48. package/Shared/Modules/IWebSocketModuleContentHandler.h +26 -0
  49. package/Shared/Modules/IWebSocketModuleProxy.h +22 -0
  50. package/Shared/Modules/NetworkingModule.cpp +1 -1
  51. package/Shared/Modules/WebSocketModule.cpp +93 -23
  52. package/Shared/Modules/WebSocketModule.h +35 -6
  53. package/Shared/Networking/IHttpResource.h +101 -0
  54. package/Shared/{IWebSocketResource.h → Networking/IWebSocketResource.h} +2 -2
  55. package/Shared/Networking/OriginPolicy.h +15 -0
  56. package/Shared/Networking/OriginPolicyHttpFilter.cpp +747 -0
  57. package/Shared/Networking/OriginPolicyHttpFilter.h +112 -0
  58. package/Shared/Networking/WinRTHttpResource.cpp +465 -0
  59. package/Shared/{WinRTHttpResource.h → Networking/WinRTHttpResource.h} +35 -20
  60. package/Shared/Networking/WinRTTypes.h +33 -0
  61. package/Shared/{WinRTWebSocketResource.cpp → Networking/WinRTWebSocketResource.cpp} +2 -2
  62. package/Shared/{WinRTWebSocketResource.h → Networking/WinRTWebSocketResource.h} +3 -3
  63. package/Shared/OInstance.cpp +26 -6
  64. package/Shared/OInstance.h +8 -4
  65. package/Shared/RuntimeOptions.cpp +96 -15
  66. package/Shared/RuntimeOptions.h +32 -8
  67. package/Shared/Shared.vcxitems +24 -7
  68. package/Shared/Shared.vcxitems.filters +78 -21
  69. package/fmt/fmt.vcxproj +4 -5
  70. package/package.json +1 -1
  71. package/Shared/IHttpResource.h +0 -53
  72. package/Shared/WinRTHttpResource.cpp +0 -317
package/CHANGELOG.json CHANGED
@@ -1,6 +1,174 @@
1
1
  {
2
2
  "name": "react-native-windows",
3
3
  "entries": [
4
+ {
5
+ "date": "Mon, 27 Jun 2022 15:07:38 GMT",
6
+ "tag": "react-native-windows_v0.67.12",
7
+ "version": "0.67.12",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "julio.rocha@microsoft.com",
12
+ "package": "react-native-windows",
13
+ "commit": "d5a8dff5f3fbb23b01338e22cbe313bc6f0fa2b8",
14
+ "comment": "Enable Blob module with runtime option"
15
+ },
16
+ {
17
+ "author": "hpratt@microsoft.com",
18
+ "package": "react-native-windows",
19
+ "commit": "d676dce0d3681fac1cdbd5e75a78be7667704193",
20
+ "comment": "Stop compiling yoga.cpp with /fp:strict. Doing so caused layout issues if Yoga code ran with the processor's rounding mode set to round down, due to NAN being defined in math.h as: ``` (float)(INFINITY * 0.0f) ``` Which macro-expands to: ``` (float)(((float)(1e+300 * 1e+300)) * 0.0f) ``` Which evaluates as follows: ``` (float)(((float)(inf.double)) * 0.0f) (float)(FLT_MAX * 0.0f) // Casting an infinite double to a float yields // FLT_MAX! (float)0.0f ```"
21
+ }
22
+ ]
23
+ }
24
+ },
25
+ {
26
+ "date": "Mon, 20 Jun 2022 15:08:18 GMT",
27
+ "tag": "react-native-windows_v0.67.11",
28
+ "version": "0.67.11",
29
+ "comments": {
30
+ "patch": [
31
+ {
32
+ "author": "vmorozov@microsoft.com",
33
+ "package": "react-native-windows",
34
+ "commit": "not available",
35
+ "comment": "Fix use of [[maybe_unused]] attribute"
36
+ },
37
+ {
38
+ "author": "vmorozov@microsoft.com",
39
+ "package": "react-native-windows",
40
+ "commit": "not available",
41
+ "comment": "Fix ExecuteJsi on instance shutdown"
42
+ }
43
+ ]
44
+ }
45
+ },
46
+ {
47
+ "date": "Mon, 20 Jun 2022 15:08:04 GMT",
48
+ "tag": "react-native-windows_v0.67.11",
49
+ "version": "0.67.11",
50
+ "comments": {
51
+ "patch": [
52
+ {
53
+ "author": "vmorozov@microsoft.com",
54
+ "package": "react-native-windows",
55
+ "commit": "247fa688a24a58c3b22411babbcd3b6396744895",
56
+ "comment": "Fix use of [[maybe_unused]] attribute"
57
+ },
58
+ {
59
+ "author": "vmorozov@microsoft.com",
60
+ "package": "react-native-windows",
61
+ "commit": "2b74c16a6d631ff7ba65ae28a81de5b26906bd40",
62
+ "comment": "Fix ExecuteJsi on instance shutdown"
63
+ }
64
+ ]
65
+ }
66
+ },
67
+ {
68
+ "date": "Mon, 30 May 2022 15:09:46 GMT",
69
+ "tag": "react-native-windows_v0.67.10",
70
+ "version": "0.67.10",
71
+ "comments": {
72
+ "patch": [
73
+ {
74
+ "author": "acoates@microsoft.com",
75
+ "package": "react-native-windows",
76
+ "commit": "not available",
77
+ "comment": "Expose LoadingState on ReactContext"
78
+ },
79
+ {
80
+ "author": "vmorozov@microsoft.com",
81
+ "package": "react-native-windows",
82
+ "commit": "not available",
83
+ "comment": "Support PreparedScriptStore for V8 Node-API."
84
+ },
85
+ {
86
+ "author": "julio@rochsquadron.net",
87
+ "package": "react-native-windows",
88
+ "commit": "not available",
89
+ "comment": "Implement Blob module (#9352)"
90
+ },
91
+ {
92
+ "author": "vmorozov@microsoft.com",
93
+ "package": "react-native-windows",
94
+ "commit": "not available",
95
+ "comment": "Fix RuntimeOptions for RNW Desktop"
96
+ },
97
+ {
98
+ "author": "jthysell@microsoft.com",
99
+ "package": "react-native-windows",
100
+ "commit": "not available",
101
+ "comment": "[0.67] Change CG registration for folly and fmt from `other` to `git`"
102
+ }
103
+ ]
104
+ }
105
+ },
106
+ {
107
+ "date": "Mon, 30 May 2022 15:09:33 GMT",
108
+ "tag": "react-native-windows_v0.67.10",
109
+ "version": "0.67.10",
110
+ "comments": {
111
+ "patch": [
112
+ {
113
+ "author": "acoates@microsoft.com",
114
+ "package": "react-native-windows",
115
+ "commit": "1d8934a3235695ce7ef5796976a2e5c0413d3ef8",
116
+ "comment": "Expose LoadingState on ReactContext"
117
+ },
118
+ {
119
+ "author": "vmorozov@microsoft.com",
120
+ "package": "react-native-windows",
121
+ "commit": "6d6015d5f24540e355160a5be62af1cc1a3903b0",
122
+ "comment": "Support PreparedScriptStore for V8 Node-API."
123
+ },
124
+ {
125
+ "author": "julio@rochsquadron.net",
126
+ "package": "react-native-windows",
127
+ "commit": "932c3b9e6732b83d60b608d3d44fed7f4cc6a6de",
128
+ "comment": "Implement Blob module (#9352)"
129
+ },
130
+ {
131
+ "author": "vmorozov@microsoft.com",
132
+ "package": "react-native-windows",
133
+ "commit": "13824a0805d2e9bd2eef44852029b193daf56664",
134
+ "comment": "Fix RuntimeOptions for RNW Desktop"
135
+ },
136
+ {
137
+ "author": "jthysell@microsoft.com",
138
+ "package": "react-native-windows",
139
+ "commit": "93498b92be5a6900b06b35b20c4e81ba18a10647",
140
+ "comment": "[0.67] Change CG registration for folly and fmt from `other` to `git`"
141
+ }
142
+ ]
143
+ }
144
+ },
145
+ {
146
+ "date": "Mon, 02 May 2022 15:10:57 GMT",
147
+ "tag": "react-native-windows_v0.67.9",
148
+ "version": "0.67.9",
149
+ "comments": {
150
+ "patch": [
151
+ {
152
+ "author": "53799235+ZihanChen-MSFT@users.noreply.github.com",
153
+ "package": "react-native-windows",
154
+ "commit": "not available",
155
+ "comment": "Fix clang-check errors in NativeModules.h"
156
+ },
157
+ {
158
+ "author": "vmorozov@microsoft.com",
159
+ "package": "react-native-windows",
160
+ "commit": "not available",
161
+ "comment": "Fix JSI for Node-API and update V8 to 0.65.11"
162
+ },
163
+ {
164
+ "author": "julio.rocha@microsoft.com",
165
+ "package": "react-native-windows",
166
+ "commit": "not available",
167
+ "comment": "Handle abrupt WebSocket connection interruption (#9829)"
168
+ }
169
+ ]
170
+ }
171
+ },
4
172
  {
5
173
  "date": "Mon, 02 May 2022 15:10:43 GMT",
6
174
  "tag": "react-native-windows_v0.67.9",
package/CHANGELOG.md CHANGED
@@ -1,19 +1,80 @@
1
1
  # Change Log - react-native-windows
2
2
 
3
- This log was last generated on Mon, 02 May 2022 15:10:43 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 27 Jun 2022 15:07:38 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.67.9
7
+ ## 0.67.12
8
8
 
9
- Mon, 02 May 2022 15:10:43 GMT
9
+ Mon, 27 Jun 2022 15:07:38 GMT
10
10
 
11
11
  ### Patches
12
12
 
13
- - Fix clang-check errors in NativeModules.h (53799235+ZihanChen-MSFT@users.noreply.github.com)
14
- - Fix JSI for Node-API and update V8 to 0.65.11 (vmorozov@microsoft.com)
15
- - Handle abrupt WebSocket connection interruption (#9829) (julio.rocha@microsoft.com)
13
+ - Enable Blob module with runtime option (julio.rocha@microsoft.com)
14
+ - Stop compiling yoga.cpp with /fp:strict. Doing so caused layout issues if Yoga code ran with the processor's rounding mode set to round down, due to NAN being defined in math.h as: ``` (float)(INFINITY * 0.0f) ``` Which macro-expands to: ``` (float)(((float)(1e+300 * 1e+300)) * 0.0f) ``` Which evaluates as follows: ``` (float)(((float)(inf.double)) * 0.0f) (float)(FLT_MAX * 0.0f) // Casting an infinite double to a float yields // FLT_MAX! (float)0.0f ``` (hpratt@microsoft.com)
16
15
 
16
+ ## 0.67.11
17
+
18
+ Mon, 20 Jun 2022 15:08:18 GMT
19
+
20
+ ### Patches
21
+
22
+ - Fix use of [[maybe_unused]] attribute (vmorozov@microsoft.com)
23
+ - Fix ExecuteJsi on instance shutdown (vmorozov@microsoft.com)
24
+
25
+ ## 0.67.11
26
+
27
+ Mon, 20 Jun 2022 15:08:04 GMT
28
+
29
+ ### Patches
30
+
31
+ - Fix use of [[maybe_unused]] attribute (vmorozov@microsoft.com)
32
+ - Fix ExecuteJsi on instance shutdown (vmorozov@microsoft.com)
33
+
34
+ ## 0.67.10
35
+
36
+ Mon, 30 May 2022 15:09:46 GMT
37
+
38
+ ### Patches
39
+
40
+ - Expose LoadingState on ReactContext (acoates@microsoft.com)
41
+ - Support PreparedScriptStore for V8 Node-API. (vmorozov@microsoft.com)
42
+ - Implement Blob module (#9352) (julio@rochsquadron.net)
43
+ - Fix RuntimeOptions for RNW Desktop (vmorozov@microsoft.com)
44
+ - [0.67] Change CG registration for folly and fmt from `other` to `git` (jthysell@microsoft.com)
45
+
46
+ ## 0.67.10
47
+
48
+ Mon, 30 May 2022 15:09:33 GMT
49
+
50
+ ### Patches
51
+
52
+ - Expose LoadingState on ReactContext (acoates@microsoft.com)
53
+ - Support PreparedScriptStore for V8 Node-API. (vmorozov@microsoft.com)
54
+ - Implement Blob module (#9352) (julio@rochsquadron.net)
55
+ - Fix RuntimeOptions for RNW Desktop (vmorozov@microsoft.com)
56
+ - [0.67] Change CG registration for folly and fmt from `other` to `git` (jthysell@microsoft.com)
57
+
58
+ ## 0.67.9
59
+
60
+ Mon, 02 May 2022 15:10:57 GMT
61
+
62
+ ### Patches
63
+
64
+ - Fix clang-check errors in NativeModules.h (53799235+ZihanChen-MSFT@users.noreply.github.com)
65
+ - Fix JSI for Node-API and update V8 to 0.65.11 (vmorozov@microsoft.com)
66
+ - Handle abrupt WebSocket connection interruption (#9829) (julio.rocha@microsoft.com)
67
+
68
+ ## 0.67.9
69
+
70
+ Mon, 02 May 2022 15:10:43 GMT
71
+
72
+ ### Patches
73
+
74
+ - Fix clang-check errors in NativeModules.h (53799235+ZihanChen-MSFT@users.noreply.github.com)
75
+ - Fix JSI for Node-API and update V8 to 0.65.11 (vmorozov@microsoft.com)
76
+ - Handle abrupt WebSocket connection interruption (#9829) (julio.rocha@microsoft.com)
77
+
17
78
  ## 0.67.8
18
79
 
19
80
  Mon, 25 Apr 2022 15:11:36 GMT
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "pch.h"
5
5
 
6
- #include <RuntimeOptions.h>
7
6
  #include "ChakraHelpers.h"
8
7
  #include "ChakraUtils.h"
9
8
  #include "ChakraValue.h"
@@ -18,8 +18,12 @@
18
18
  The PR (windows-vs-pr.yml) and CI (publish.yml() turn it back on.
19
19
  -->
20
20
  <EnableSourceLink Condition="'$(EnableSourceLink)' == ''">false</EnableSourceLink>
21
+ <!-- When bumping the Folly version, be sure to bump the git hash of that version's commit too. -->
21
22
  <FollyVersion>2021.06.28.00</FollyVersion>
23
+ <FollyCommitHash>f434460f8a98e85f3ddb75390ddd1cc330c8f658</FollyCommitHash>
24
+ <!-- When bumping the fmt version, be sure to bump the git hash of that version's commit too. -->
22
25
  <FmtVersion>7.1.3</FmtVersion>
26
+ <FmtCommitHash>7bdf0628b1276379886c7f6dda2cef2b3b374f0b</FmtCommitHash>
23
27
  </PropertyGroup>
24
28
 
25
29
  <PropertyGroup Label="Configuration">
@@ -299,11 +299,10 @@
299
299
  "Registrations": [
300
300
  {
301
301
  "Component": {
302
- "Type": "other",
303
- "Other": {
304
- "Name": "folly",
305
- "Version": "$(FollyVersion)",
306
- "DownloadUrl": "https://github.com/facebook/folly/archive/v$(FollyVersion).zip"
302
+ "Type": "git",
303
+ "Git": {
304
+ "RepositoryUrl": "https://github.com/facebook/folly",
305
+ "CommitHash": "$(FollyCommitHash)"
307
306
  }
308
307
  },
309
308
  "DevelopmentDependency": false
@@ -61,6 +61,11 @@ type RCTNetworkingEventDefinitions = $ReadOnly<{
61
61
  ],
62
62
  }>;
63
63
 
64
+ let _requestId = 1;
65
+ function generateRequestId(): number {
66
+ return _requestId++;
67
+ }
68
+
64
69
  const RCTNetworking = {
65
70
  addListener<K: $Keys<RCTNetworkingEventDefinitions>>(
66
71
  eventType: K,
@@ -82,11 +87,13 @@ const RCTNetworking = {
82
87
  callback: (requestId: number) => void,
83
88
  withCredentials: boolean,
84
89
  ) {
90
+ const requestId = generateRequestId();
85
91
  const body = convertRequestBody(data);
86
92
  RCTNetworkingNative.sendRequest(
87
93
  {
88
94
  method,
89
95
  url,
96
+ requestId,
90
97
  data: {...body, trackingName},
91
98
  headers,
92
99
  responseType,
@@ -49,7 +49,9 @@ std::vector<facebook::react::NativeModuleDescription> GetCoreModules(
49
49
  std::vector<facebook::react::NativeModuleDescription> modules;
50
50
 
51
51
  modules.emplace_back(
52
- "Networking", []() { return Microsoft::React::CreateHttpModule(); }, jsMessageQueue);
52
+ "Networking",
53
+ [props = context->Properties()]() { return Microsoft::React::CreateHttpModule(props); },
54
+ jsMessageQueue);
53
55
 
54
56
  modules.emplace_back(
55
57
  "Timing",
@@ -96,6 +96,23 @@ Windows::Foundation::IInspectable ReactContext::JSRuntime() noexcept {
96
96
  return m_context->JsiRuntime();
97
97
  }
98
98
 
99
+ LoadingState ReactContext::LoadingState() noexcept {
100
+ switch (m_context->State()) {
101
+ case Mso::React::ReactInstanceState::Loading:
102
+ case Mso::React::ReactInstanceState::WaitingForDebugger:
103
+ return LoadingState::Loading;
104
+ case Mso::React::ReactInstanceState::Loaded:
105
+ return LoadingState::Loaded;
106
+ case Mso::React::ReactInstanceState::HasError:
107
+ return LoadingState::HasError;
108
+ case Mso::React::ReactInstanceState::Unloaded:
109
+ return LoadingState::Unloaded;
110
+ default:
111
+ assert(false);
112
+ return LoadingState::HasError;
113
+ };
114
+ }
115
+
99
116
  #ifndef CORE_ABI
100
117
  // Deprecated: Use XamlUIService directly.
101
118
  void ReactContext::DispatchEvent(
@@ -42,6 +42,8 @@ struct ReactContext : winrt::implements<ReactContext, IReactContext> {
42
42
  IReactDispatcher UIDispatcher() noexcept;
43
43
  IReactDispatcher JSDispatcher() noexcept;
44
44
  IInspectable JSRuntime() noexcept;
45
+ LoadingState LoadingState() noexcept;
46
+
45
47
  #ifndef CORE_ABI
46
48
  void DispatchEvent(
47
49
  xaml::FrameworkElement const &view,
@@ -13,6 +13,29 @@ import "IReactPropertyBag.idl";
13
13
 
14
14
  namespace Microsoft.ReactNative
15
15
  {
16
+
17
+ DOC_STRING(
18
+ "Used to represent the state of the React Native JavaScript instance")
19
+ enum LoadingState
20
+ {
21
+ DOC_STRING(
22
+ "The instance is loading the JavaScript bundle and initial instance setup. Calls to run JavaScript functions will be queued to run once the instance is fully loaded."
23
+ )
24
+ Loading = 0,
25
+ DOC_STRING(
26
+ "The instance is in a ready state. Calls to run JavaScript functions will be run as soon as they are posted to the JavaScript instance."
27
+ )
28
+ Loaded = 1,
29
+ DOC_STRING(
30
+ "The instance has hit an error. Calls to run JavaScript functions will not be run."
31
+ )
32
+ HasError = 2,
33
+ DOC_STRING(
34
+ "The instance has successfully unloaded. Calls to run JavaScript functions will not be run."
35
+ )
36
+ Unloaded = 3
37
+ };
38
+
16
39
  [webhosthidden]
17
40
  DOC_STRING("An immutable snapshot of the @ReactInstanceSettings used to create the current React instance.")
18
41
  interface IReactSettingsSnapshot
@@ -167,5 +190,9 @@ namespace Microsoft.ReactNative
167
190
  "The `paramsArgWriter` is a @JSValueArgWriter delegate that receives @IJSValueWriter to serialize "
168
191
  "the event parameters.")
169
192
  void EmitJSEvent(String eventEmitterName, String eventName, JSValueArgWriter paramsArgWriter);
193
+
194
+ DOC_STRING(
195
+ "Gets the state of the ReactNative instance.")
196
+ LoadingState LoadingState { get; };
170
197
  }
171
198
  } // namespace Microsoft.ReactNative
@@ -2,10 +2,10 @@
2
2
  // Licensed under the MIT License.
3
3
 
4
4
  #include <CreateModules.h>
5
+ #include <Networking/WinRTWebSocketResource.h>
5
6
  #include <QuirkSettings.h>
6
7
  #include <React.h>
7
8
  #include <ReactPropertyBag.h>
8
- #include <WinRTWebSocketResource.h>
9
9
 
10
10
  // React Native
11
11
  #include <cxxreact/CxxModule.h>
@@ -17,11 +17,11 @@ using winrt::Microsoft::ReactNative::ReactPropertyBag;
17
17
  using winrt::Microsoft::ReactNative::ReactPropertyId;
18
18
  using winrt::Microsoft::ReactNative::implementation::QuirkSettings;
19
19
 
20
- namespace Microsoft::React {
20
+ namespace Microsoft::React::Networking {
21
21
 
22
22
  std::shared_ptr<IWebSocketResource> IWebSocketResource::Make() {
23
23
  std::vector<winrt::Windows::Security::Cryptography::Certificates::ChainValidationResult> certExceptions;
24
24
  return std::make_shared<WinRTWebSocketResource>(std::move(certExceptions));
25
25
  }
26
26
 
27
- } // namespace Microsoft::React
27
+ } // namespace Microsoft::React::Networking
@@ -8,5 +8,5 @@
8
8
  <package id="Microsoft.Windows.CppWinRT" version="2.0.210312.4" targetFramework="native" />
9
9
  <package id="Microsoft.WinUI" version="3.0.0-preview4.210210.4" targetFramework="native" />
10
10
  <package id="ReactNative.Hermes.Windows" version="0.10.0-ms.1" targetFramework="native" />
11
- <!-- package id="ReactNative.V8Jsi.Windows.UWP" version="0.65.11" targetFramework="native" / -->
11
+ <!-- package id="ReactNative.V8Jsi.Windows.UWP" version="0.65.15" targetFramework="native" / -->
12
12
  </packages>
@@ -10,16 +10,19 @@ extern "C" IMAGE_DOS_HEADER __ImageBase;
10
10
 
11
11
  namespace winrt::Microsoft::ReactNative {
12
12
 
13
- // Get JSI Runtime from the current JS dispatcher thread.
14
- // If it is not found, then create it and store it in the context.Properties().
15
- // Make sure that the JSI runtime holder is removed when the instance is unloaded.
16
- facebook::jsi::Runtime &GetOrCreateContextRuntime(ReactContext const &context) noexcept {
13
+ // Try to get JSI Runtime for the current JS dispatcher thread.
14
+ // If it is not found, then create it based on context JSI runtime and store it in the context.Properties().
15
+ // The function returns nullptr if the current context does not have JSI runtime.
16
+ // It makes sure that the JSI runtime holder is removed when the instance is unloaded.
17
+ facebook::jsi::Runtime *TryGetOrCreateContextRuntime(ReactContext const &context) noexcept {
17
18
  ReactDispatcher jsDispatcher = context.JSDispatcher();
18
19
  VerifyElseCrashSz(jsDispatcher.HasThreadAccess(), "Must be in JS thread");
19
20
 
20
21
  // The JSI runtime is not available if we do Web debugging when JS is running in web browser.
21
22
  JsiRuntime abiJsiRuntime = context.Handle().JSRuntime().as<JsiRuntime>();
22
- VerifyElseCrashSz(abiJsiRuntime, "JSI runtime is not available");
23
+ if (!abiJsiRuntime) {
24
+ return nullptr;
25
+ }
23
26
 
24
27
  // See if the JSI runtime was previously created.
25
28
  JsiAbiRuntime *runtime = JsiAbiRuntime::GetFromJsiRuntime(abiJsiRuntime);
@@ -51,6 +54,15 @@ facebook::jsi::Runtime &GetOrCreateContextRuntime(ReactContext const &context) n
51
54
  });
52
55
  }
53
56
 
57
+ return runtime;
58
+ }
59
+
60
+ // Calls TryGetOrCreateContextRuntime to get JSI runtime.
61
+ // It crashes when TryGetOrCreateContextRuntime returns null.
62
+ // Note: deprecated in favor of TryGetOrCreateContextRuntime.
63
+ [[deprecated]] facebook::jsi::Runtime &GetOrCreateContextRuntime(ReactContext const &context) noexcept {
64
+ facebook::jsi::Runtime *runtime = TryGetOrCreateContextRuntime(context);
65
+ VerifyElseCrashSz(runtime, "JSI runtime is not available");
54
66
  return *runtime;
55
67
  }
56
68
 
@@ -7,26 +7,55 @@
7
7
 
8
8
  #include "../ReactContext.h"
9
9
  #include "JsiAbiApi.h"
10
+ #include "ReactPromise.h"
10
11
 
11
12
  namespace winrt::Microsoft::ReactNative {
12
13
 
13
- // Get JSI Runtime from the current JS dispatcher thread.
14
- // If it is not found, then create it and store it in the context.Properties().
15
- // Make sure that the JSI runtime holder is removed when the instance is unloaded.
16
- facebook::jsi::Runtime &GetOrCreateContextRuntime(ReactContext const &context) noexcept;
14
+ // Try to get JSI Runtime for the current JS dispatcher thread.
15
+ // If it is not found, then create it based on context JSI runtime and store it in the context.Properties().
16
+ // The function returns nullptr if the current context does not have JSI runtime.
17
+ // It makes sure that the JSI runtime holder is removed when the instance is unloaded.
18
+ facebook::jsi::Runtime *TryGetOrCreateContextRuntime(ReactContext const &context) noexcept;
19
+
20
+ // Calls TryGetOrCreateContextRuntime to get JSI runtime.
21
+ // It crashes when TryGetOrCreateContextRuntime returns null.
22
+ // Note: deprecated in favor of TryGetOrCreateContextRuntime.
23
+ [[deprecated]] facebook::jsi::Runtime &GetOrCreateContextRuntime(ReactContext const &context) noexcept;
17
24
 
18
25
  // Call provided lambda with the facebook::jsi::Runtime& parameter.
19
26
  // For example: ExecuteJsi(context, [](facebook::jsi::Runtime& runtime){...})
20
27
  // The code is executed synchronously if it is already in JSDispatcher, or asynchronously otherwise.
21
28
  template <class TCodeWithRuntime>
22
- void ExecuteJsi(ReactContext const &context, TCodeWithRuntime const &code) {
29
+ void ExecuteJsi(ReactContext const &context, TCodeWithRuntime const &code, ReactPromise<void> *callStatus = nullptr) {
23
30
  ReactDispatcher jsDispatcher = context.JSDispatcher();
31
+ auto callCode = [](ReactContext const &context, TCodeWithRuntime const &code, ReactPromise<void> *callStatus) {
32
+ facebook::jsi::Runtime *runtime = TryGetOrCreateContextRuntime(context);
33
+ if (runtime) {
34
+ code(*runtime);
35
+ }
36
+
37
+ // Report status of the call
38
+ if (callStatus) {
39
+ if (runtime) {
40
+ callStatus->Resolve();
41
+ } else {
42
+ callStatus->Reject("No JSI runtime");
43
+ }
44
+ }
45
+ };
46
+
24
47
  if (jsDispatcher.HasThreadAccess()) {
25
48
  // Execute immediately if we are in JS thread.
26
- code(GetOrCreateContextRuntime(context));
49
+ callCode(context, code, callStatus);
27
50
  } else {
28
51
  // Otherwise, schedule work in JS thread.
29
- jsDispatcher.Post([context, code]() noexcept { code(GetOrCreateContextRuntime(context)); });
52
+ jsDispatcher.Post([callCode,
53
+ context,
54
+ code,
55
+ callStatus = callStatus ? std::make_unique<ReactPromise<void>>(*callStatus)
56
+ : std::unique_ptr<ReactPromise<void>>(nullptr)]() noexcept {
57
+ callCode(context, code, callStatus.get());
58
+ });
30
59
  }
31
60
  }
32
61
 
@@ -440,6 +440,7 @@ struct NapiJsiRuntime : facebook::jsi::Runtime {
440
440
 
441
441
  private: // Shared NAPI call helpers
442
442
  napi_value RunScript(napi_value script, const char *sourceUrl);
443
+ napi_value RunScriptBuffer(const std::shared_ptr<const facebook::jsi::Buffer> &buffer, const char *sourceUrl);
443
444
  std::vector<uint8_t> SerializeScript(napi_value script, const char *sourceUrl);
444
445
  napi_value RunSerializedScript(span<const uint8_t> serialized, napi_value source, const char *sourceUrl);
445
446
  napi_ext_ref CreateReference(napi_value value) const;
@@ -620,9 +621,7 @@ NapiJsiRuntime::NapiJsiRuntime(napi_env env) noexcept : m_env{env} {
620
621
 
621
622
  Value NapiJsiRuntime::evaluateJavaScript(const shared_ptr<const Buffer> &buffer, const string &sourceUrl) {
622
623
  EnvScope envScope{m_env};
623
- napi_value script = CreateStringUtf8(buffer->data(), buffer->size());
624
- napi_value result = RunScript(script, sourceUrl.c_str());
625
-
624
+ napi_value result = RunScriptBuffer(buffer, sourceUrl.c_str());
626
625
  return ToJsiValue(result);
627
626
  }
628
627
 
@@ -1406,6 +1405,21 @@ napi_value NapiJsiRuntime::RunScript(napi_value script, const char *sourceUrl) {
1406
1405
  return result;
1407
1406
  }
1408
1407
 
1408
+ napi_value NapiJsiRuntime::RunScriptBuffer(
1409
+ const std::shared_ptr<const facebook::jsi::Buffer> &buffer,
1410
+ const char *sourceUrl) {
1411
+ napi_ext_buffer napiBuffer{};
1412
+ napiBuffer.buffer_object = NativeObjectWrapper<std::shared_ptr<const facebook::jsi::Buffer>>::Wrap(
1413
+ std::shared_ptr<const facebook::jsi::Buffer>{buffer});
1414
+ napiBuffer.data = buffer->data();
1415
+ napiBuffer.byte_size = buffer->size();
1416
+
1417
+ napi_value result{};
1418
+ CHECK_NAPI(napi_ext_run_script_buffer(m_env, &napiBuffer, sourceUrl, &result));
1419
+
1420
+ return result;
1421
+ }
1422
+
1409
1423
  // Serializes script with the sourceUrl origin.
1410
1424
  vector<uint8_t> NapiJsiRuntime::SerializeScript(napi_value script, const char *sourceUrl) {
1411
1425
  vector<uint8_t> result;
@@ -20,6 +20,54 @@ namespace Microsoft::JSI {
20
20
  ///
21
21
  std::unique_ptr<facebook::jsi::Runtime> __cdecl MakeNodeApiJsiRuntime(napi_env env) noexcept;
22
22
 
23
+ template <typename T>
24
+ struct NativeObjectWrapper;
25
+
26
+ template <typename T>
27
+ struct NativeObjectWrapper<std::unique_ptr<T>> {
28
+ static napi_ext_native_data Wrap(std::unique_ptr<T> &&obj) noexcept {
29
+ napi_ext_native_data nativeData{};
30
+ nativeData.data = obj.release();
31
+ nativeData.finalize_cb = [](napi_env /*env*/, void *data, void * /*finalizeHint*/) {
32
+ std::unique_ptr<T> obj{reinterpret_cast<T *>(data)};
33
+ };
34
+ return nativeData;
35
+ }
36
+
37
+ static T *Unwrap(napi_ext_native_data &nativeData) noexcept {
38
+ return reinterpret_cast<T *>(nativeData.data);
39
+ }
40
+ };
41
+
42
+ template <typename T>
43
+ struct NativeObjectWrapper<std::shared_ptr<T>> {
44
+ static napi_ext_native_data Wrap(std::shared_ptr<T> &&obj) noexcept {
45
+ static_assert(
46
+ sizeof(SharedPtrHolder) == sizeof(std::shared_ptr<T>), "std::shared_ptr expected to have size of two pointers");
47
+ SharedPtrHolder ptrHolder;
48
+ new (std::addressof(ptrHolder)) std::shared_ptr(std::move(obj));
49
+ napi_ext_native_data nativeData{};
50
+ nativeData.data = ptrHolder.ptr1;
51
+ nativeData.finalize_hint = ptrHolder.ptr2;
52
+ nativeData.finalize_cb = [](napi_env /*env*/, void *data, void *finalizeHint) {
53
+ SharedPtrHolder ptrHolder{data, finalizeHint};
54
+ std::shared_ptr<T> obj(std::move(*reinterpret_cast<std::shared_ptr<T> *>(std::addressof(ptrHolder))));
55
+ };
56
+ return nativeData;
57
+ }
58
+
59
+ static std::shared_ptr<T> Unwrap(napi_ext_native_data &nativeData) noexcept {
60
+ SharedPtrHolder ptrHolder{nativeData.data, nativeData.finalize_hint};
61
+ return *reinterpret_cast<std::shared_ptr<T> *>(std::addressof(ptrHolder));
62
+ }
63
+
64
+ private:
65
+ struct SharedPtrHolder {
66
+ void *ptr1;
67
+ void *ptr2;
68
+ };
69
+ };
70
+
23
71
  } // namespace Microsoft::JSI
24
72
 
25
73
  #endif // MICROSOFT_REACTNATIVE_JSI_NODEAPIJSIRUNTIME
@@ -287,7 +287,7 @@ inline JSValueArgWriter MakeJSValueWriter(T &&argWriter) noexcept {
287
287
 
288
288
  template <class... TArgs>
289
289
  inline JSValueArgWriter MakeJSValueWriter(TArgs &&... args) noexcept {
290
- return [&args...](IJSValueWriter const &[[maybe_unused]] writer) noexcept { (WriteValue(writer, args), ...); };
290
+ return [&args...]([[maybe_unused]] IJSValueWriter const &writer) noexcept { (WriteValue(writer, args), ...); };
291
291
  }
292
292
 
293
293
  } // namespace winrt::Microsoft::ReactNative