react-native-windows 0.72.19 → 0.72.20

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.
@@ -19,8 +19,8 @@
19
19
  <FollyVersion>2022.11.28.00</FollyVersion>
20
20
  <FollyCommitHash>6ed36117cdc4831f3a3951e013ae76b405e88e15</FollyCommitHash>
21
21
  <!-- When bumping the fmt version, be sure to bump the git hash of that version's commit and build fmt.vcxproj (to update its cgmanifest.json) too. -->
22
- <FmtVersion>8.0.0</FmtVersion>
23
- <FmtCommitHash>9e8b86fd2d9806672cc73133d21780dd182bfd24</FmtCommitHash>
22
+ <FmtVersion>10.1.0</FmtVersion>
23
+ <FmtCommitHash>ca2e3685b160617d3d95fcd9e789c4e06ca88</FmtCommitHash>
24
24
  <!-- Commit hash for https://github.com/microsoft/node-api-jsi code. -->
25
25
  <NodeApiJsiCommitHash>53b897b03c1c7e57c3372acc6234447a44e150d6</NodeApiJsiCommitHash>
26
26
  </PropertyGroup>
@@ -33,6 +33,12 @@ JSDispatcherWriter::JSDispatcherWriter(
33
33
  std::weak_ptr<LongLivedJsiRuntime> jsiRuntimeHolder) noexcept
34
34
  : m_jsDispatcher(jsDispatcher), m_jsiRuntimeHolder(std::move(jsiRuntimeHolder)) {}
35
35
 
36
+ JSDispatcherWriter::~JSDispatcherWriter() {
37
+ if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock()) {
38
+ jsiRuntimeHolder->allowRelease();
39
+ }
40
+ }
41
+
36
42
  void JSDispatcherWriter::WithResultArgs(
37
43
  Mso::Functor<void(facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t argCount)>
38
44
  handler) noexcept {
@@ -49,17 +55,18 @@ void JSDispatcherWriter::WithResultArgs(
49
55
  VerifyElseCrash(!m_jsiWriter);
50
56
  folly::dynamic dynValue = m_dynamicWriter->TakeValue();
51
57
  VerifyElseCrash(dynValue.isArray());
52
- m_jsDispatcher.Post([handler, dynValue = std::move(dynValue), weakJsiRuntimeHolder = m_jsiRuntimeHolder]() {
53
- if (auto jsiRuntimeHolder = weakJsiRuntimeHolder.lock()) {
54
- std::vector<facebook::jsi::Value> args;
55
- args.reserve(dynValue.size());
56
- auto &runtime = jsiRuntimeHolder->Runtime();
57
- for (auto const &item : dynValue) {
58
- args.emplace_back(facebook::jsi::valueFromDynamic(runtime, item));
59
- }
60
- handler(runtime, args.data(), args.size());
61
- }
62
- });
58
+ m_jsDispatcher.Post(
59
+ [handler, dynValue = std::move(dynValue), weakJsiRuntimeHolder = m_jsiRuntimeHolder, self = get_strong()]() {
60
+ if (auto jsiRuntimeHolder = weakJsiRuntimeHolder.lock()) {
61
+ std::vector<facebook::jsi::Value> args;
62
+ args.reserve(dynValue.size());
63
+ auto &runtime = jsiRuntimeHolder->Runtime();
64
+ for (auto const &item : dynValue) {
65
+ args.emplace_back(facebook::jsi::valueFromDynamic(runtime, item));
66
+ }
67
+ handler(runtime, args.data(), args.size());
68
+ }
69
+ });
63
70
  }
64
71
  }
65
72
 
@@ -14,6 +14,7 @@ namespace winrt::Microsoft::ReactNative {
14
14
  // In case if writing is done outside of JSDispatcher, it uses DynamicWriter to create
15
15
  // folly::dynamic which then is written to JsiWriter in JSDispatcher.
16
16
  struct JSDispatcherWriter : winrt::implements<JSDispatcherWriter, IJSValueWriter> {
17
+ ~JSDispatcherWriter();
17
18
  JSDispatcherWriter(
18
19
  IReactDispatcher const &jsDispatcher,
19
20
  std::weak_ptr<LongLivedJsiRuntime> jsiRuntimeHolder) noexcept;
@@ -221,11 +221,46 @@ class TurboModuleImpl : public facebook::react::TurboModule {
221
221
  VerifyElseCrash(argCount > 1);
222
222
  if (auto strongLongLivedObjectCollection = longLivedObjectCollection.lock()) {
223
223
  auto jsiRuntimeHolder = LongLivedJsiRuntime::CreateWeak(strongLongLivedObjectCollection, rt);
224
+ auto weakCallback1 = LongLivedJsiFunction::CreateWeak(
225
+ strongLongLivedObjectCollection, rt, args[argCount - 2].getObject(rt).getFunction(rt));
226
+ auto weakCallback2 = LongLivedJsiFunction::CreateWeak(
227
+ strongLongLivedObjectCollection, rt, args[argCount - 1].getObject(rt).getFunction(rt));
228
+
224
229
  method(
225
230
  winrt::make<JsiReader>(rt, args, argCount - 2),
226
231
  winrt::make<JSDispatcherWriter>(jsDispatcher, jsiRuntimeHolder),
227
- MakeCallback(rt, strongLongLivedObjectCollection, args[argCount - 2]),
228
- MakeCallback(rt, strongLongLivedObjectCollection, args[argCount - 1]));
232
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](const IJSValueWriter &writer) noexcept {
233
+ writer.as<JSDispatcherWriter>()->WithResultArgs(
234
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](
235
+ facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
236
+ if (auto callback1 = weakCallback1.lock()) {
237
+ callback1->Value().call(rt, args, count);
238
+ callback1->allowRelease();
239
+ }
240
+ if (auto callback2 = weakCallback2.lock()) {
241
+ callback2->allowRelease();
242
+ }
243
+ if (auto runtimeHolder = jsiRuntimeHolder.lock()) {
244
+ runtimeHolder->allowRelease();
245
+ }
246
+ });
247
+ },
248
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](const IJSValueWriter &writer) noexcept {
249
+ writer.as<JSDispatcherWriter>()->WithResultArgs(
250
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](
251
+ facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
252
+ if (auto callback2 = weakCallback2.lock()) {
253
+ callback2->Value().call(rt, args, count);
254
+ callback2->allowRelease();
255
+ }
256
+ if (auto callback1 = weakCallback1.lock()) {
257
+ callback1->allowRelease();
258
+ }
259
+ if (auto runtimeHolder = jsiRuntimeHolder.lock()) {
260
+ runtimeHolder->allowRelease();
261
+ }
262
+ });
263
+ });
229
264
  }
230
265
  return facebook::jsi::Value::undefined();
231
266
  });
@@ -247,49 +282,65 @@ class TurboModuleImpl : public facebook::react::TurboModule {
247
282
  auto argWriter = winrt::make<JSDispatcherWriter>(jsDispatcher, jsiRuntimeHolder);
248
283
  return facebook::react::createPromiseAsJSIValue(
249
284
  rt,
250
- [method, argReader, argWriter, strongLongLivedObjectCollection](
285
+ [method, argReader, argWriter, strongLongLivedObjectCollection, jsiRuntimeHolder](
251
286
  facebook::jsi::Runtime &runtime, std::shared_ptr<facebook::react::Promise> promise) {
287
+ auto weakResolve = LongLivedJsiFunction::CreateWeak(
288
+ strongLongLivedObjectCollection, runtime, std::move(promise->resolve_));
289
+ auto weakReject = LongLivedJsiFunction::CreateWeak(
290
+ strongLongLivedObjectCollection, runtime, std::move(promise->reject_));
252
291
  method(
253
292
  argReader,
254
293
  argWriter,
255
- [weakResolve = LongLivedJsiFunction::CreateWeak(
256
- strongLongLivedObjectCollection, runtime, std::move(promise->resolve_))](
257
- const IJSValueWriter &writer) {
258
- writer.as<JSDispatcherWriter>()->WithResultArgs([weakResolve](
259
- facebook::jsi::Runtime &runtime,
260
- facebook::jsi::Value const *args,
261
- size_t argCount) {
262
- VerifyElseCrash(argCount == 1);
263
- if (auto resolveHolder = weakResolve.lock()) {
264
- resolveHolder->Value().call(runtime, args[0]);
265
- }
266
- });
294
+ [weakResolve, weakReject, jsiRuntimeHolder](const IJSValueWriter &writer) {
295
+ writer.as<JSDispatcherWriter>()->WithResultArgs(
296
+ [weakResolve, weakReject, jsiRuntimeHolder](
297
+ facebook::jsi::Runtime &runtime,
298
+ facebook::jsi::Value const *args,
299
+ size_t argCount) {
300
+ VerifyElseCrash(argCount == 1);
301
+ if (auto resolveHolder = weakResolve.lock()) {
302
+ resolveHolder->Value().call(runtime, args[0]);
303
+ resolveHolder->allowRelease();
304
+ }
305
+ if (auto rejectHolder = weakReject.lock()) {
306
+ rejectHolder->allowRelease();
307
+ }
308
+ if (auto runtimeHolder = jsiRuntimeHolder.lock()) {
309
+ runtimeHolder->allowRelease();
310
+ }
311
+ });
267
312
  },
268
- [weakReject = LongLivedJsiFunction::CreateWeak(
269
- strongLongLivedObjectCollection, runtime, std::move(promise->reject_))](
270
- const IJSValueWriter &writer) {
271
- writer.as<JSDispatcherWriter>()->WithResultArgs([weakReject](
272
- facebook::jsi::Runtime &runtime,
273
- facebook::jsi::Value const *args,
274
- size_t argCount) {
275
- VerifyElseCrash(argCount == 1);
276
- if (auto rejectHolder = weakReject.lock()) {
277
- // To match the Android and iOS TurboModule behavior we create the Error object for
278
- // the Promise rejection the same way as in updateErrorWithErrorData method.
279
- // See react-native/Libraries/BatchedBridge/NativeModules.js for details.
280
- auto error = runtime.global()
281
- .getPropertyAsFunction(runtime, "Error")
282
- .callAsConstructor(runtime, {});
283
- auto &errorData = args[0];
284
- if (errorData.isObject()) {
285
- runtime.global()
286
- .getPropertyAsObject(runtime, "Object")
287
- .getPropertyAsFunction(runtime, "assign")
288
- .call(runtime, error, errorData.getObject(runtime));
289
- }
290
- rejectHolder->Value().call(runtime, args[0]);
291
- }
292
- });
313
+ [weakResolve, weakReject, jsiRuntimeHolder](const IJSValueWriter &writer) {
314
+ writer.as<JSDispatcherWriter>()->WithResultArgs(
315
+ [weakResolve, weakReject, jsiRuntimeHolder](
316
+ facebook::jsi::Runtime &runtime,
317
+ facebook::jsi::Value const *args,
318
+ size_t argCount) {
319
+ VerifyElseCrash(argCount == 1);
320
+ if (auto rejectHolder = weakReject.lock()) {
321
+ // To match the Android and iOS TurboModule behavior we create the Error object
322
+ // for the Promise rejection the same way as in updateErrorWithErrorData method.
323
+ // See react-native/Libraries/BatchedBridge/NativeModules.js for details.
324
+ auto error = runtime.global()
325
+ .getPropertyAsFunction(runtime, "Error")
326
+ .callAsConstructor(runtime, {});
327
+ auto &errorData = args[0];
328
+ if (errorData.isObject()) {
329
+ runtime.global()
330
+ .getPropertyAsObject(runtime, "Object")
331
+ .getPropertyAsFunction(runtime, "assign")
332
+ .call(runtime, error, errorData.getObject(runtime));
333
+ }
334
+ rejectHolder->Value().call(runtime, args[0]);
335
+ rejectHolder->allowRelease();
336
+ }
337
+ if (auto resolveHolder = weakResolve.lock()) {
338
+ resolveHolder->allowRelease();
339
+ }
340
+ if (auto runtimeHolder = jsiRuntimeHolder.lock()) {
341
+ runtimeHolder->allowRelease();
342
+ }
343
+ });
293
344
  });
294
345
  });
295
346
  }
@@ -347,6 +398,7 @@ class TurboModuleImpl : public facebook::react::TurboModule {
347
398
  [weakCallback](facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
348
399
  if (auto callback = weakCallback.lock()) {
349
400
  callback->Value().call(rt, args, count);
401
+ callback->allowRelease();
350
402
  }
351
403
  });
352
404
  };
@@ -10,11 +10,11 @@
10
10
  -->
11
11
  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
12
12
  <PropertyGroup>
13
- <ReactNativeWindowsVersion>0.72.19</ReactNativeWindowsVersion>
13
+ <ReactNativeWindowsVersion>0.72.20</ReactNativeWindowsVersion>
14
14
  <ReactNativeWindowsMajor>0</ReactNativeWindowsMajor>
15
15
  <ReactNativeWindowsMinor>72</ReactNativeWindowsMinor>
16
- <ReactNativeWindowsPatch>19</ReactNativeWindowsPatch>
16
+ <ReactNativeWindowsPatch>20</ReactNativeWindowsPatch>
17
17
  <ReactNativeWindowsCanary>false</ReactNativeWindowsCanary>
18
- <ReactNativeWindowsCommitId>318d6227643ae6c9d080a1e3000c903104afa59b</ReactNativeWindowsCommitId>
18
+ <ReactNativeWindowsCommitId>aecc90b632a5bc36341543318bb178b2054ea1dd</ReactNativeWindowsCommitId>
19
19
  </PropertyGroup>
20
20
  </Project>
@@ -14,7 +14,7 @@
14
14
  <!-- Enabling this will (1) Include hermes glues in the Microsoft.ReactNative binaries AND (2) Make hermes the default engine -->
15
15
  <UseHermes Condition="'$(UseHermes)' == ''">false</UseHermes>
16
16
  <!-- This will be true if (1) the client want to use hermes by setting UseHermes to true OR (2) We are building for UWP where dynamic switching is enabled -->
17
- <HermesVersion Condition="'$(HermesVersion)' == ''">0.1.15</HermesVersion>
17
+ <HermesVersion Condition="'$(HermesVersion)' == ''">0.1.18</HermesVersion>
18
18
  <HermesPackage Condition="'$(HermesPackage)' == '' And Exists('$(PkgMicrosoft_JavaScript_Hermes)')">$(PkgMicrosoft_JavaScript_Hermes)</HermesPackage>
19
19
  <HermesPackage Condition="'$(HermesPackage)' == ''">$(NuGetPackageRoot)\Microsoft.JavaScript.Hermes\$(HermesVersion)</HermesPackage>
20
20
  <EnableHermesInspectorInReleaseFlavor Condition="'$(EnableHermesInspectorInReleaseFlavor)' == ''">false</EnableHermesInspectorInReleaseFlavor>
@@ -140,15 +140,19 @@ void DefaultBlobResource::Release(string &&blobId) noexcept /*override*/ {
140
140
  void DefaultBlobResource::AddNetworkingHandler() noexcept /*override*/ {
141
141
  auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IHttpModuleProxy>>>{L"HttpModule.Proxy"};
142
142
 
143
+ bool handlerAdded = false;
143
144
  if (auto prop = m_propertyBag.Get(propId)) {
144
145
  if (auto httpHandler = prop.Value().lock()) {
145
146
  httpHandler->AddRequestBodyHandler(m_requestBodyHandler);
146
147
  httpHandler->AddResponseHandler(m_responseHandler);
148
+ handlerAdded = true;
147
149
  }
148
- } else {
149
- // #11439 - The absence of HttpModule.Proxy may be caused by a module initialization race condition.
150
- // Best-effort approach to set up the request/response handlers by exposing this interface to dependents
151
- // (i.e. IHttpResource).
150
+ }
151
+
152
+ // #11439 - The absence of HttpModule.Proxy may be caused by a module initialization race condition.
153
+ // Best-effort approach to set up the request/response handlers by exposing this interface to dependents
154
+ // (i.e. IHttpResource).
155
+ if (!handlerAdded) {
152
156
  auto propId = msrn::ReactPropertyId<msrn::ReactNonAbiValue<weak_ptr<IBlobResource>>>{L"Blob.Resource"};
153
157
  m_propertyBag.Set(propId, weak_ptr<IBlobResource>(shared_from_this()));
154
158
  }
@@ -545,7 +545,7 @@ WinRTHttpResource::PerformSendRequest(HttpMethod &&method, Uri &&rtUri, IInspect
545
545
  if (self->m_onComplete) {
546
546
  self->m_onComplete(reqArgs->RequestId);
547
547
  }
548
- co_return;
548
+ co_return self->UntrackResponse(reqArgs->RequestId);
549
549
  }
550
550
  }
551
551
 
@@ -6,7 +6,7 @@
6
6
  "Type": "git",
7
7
  "Git": {
8
8
  "RepositoryUrl": "https://github.com/fmtlib/fmt",
9
- "CommitHash": "9e8b86fd2d9806672cc73133d21780dd182bfd24"
9
+ "CommitHash": "ca2e3685b160617d3d95fcd9e789c4e06ca88"
10
10
  }
11
11
  },
12
12
  "DevelopmentDependency": false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-windows",
3
- "version": "0.72.19",
3
+ "version": "0.72.20",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",