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.
- package/Directory.Build.props +2 -2
- package/Microsoft.ReactNative/JSDispatcherWriter.cpp +18 -11
- package/Microsoft.ReactNative/JSDispatcherWriter.h +1 -0
- package/Microsoft.ReactNative/TurboModulesProvider.cpp +92 -40
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/Shared/Networking/DefaultBlobResource.cpp +8 -4
- package/Shared/Networking/WinRTHttpResource.cpp +1 -1
- package/fmt/cgmanifest.json +1 -1
- package/package.json +1 -1
package/Directory.Build.props
CHANGED
|
@@ -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>
|
|
23
|
-
<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(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
228
|
-
|
|
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
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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.
|
|
13
|
+
<ReactNativeWindowsVersion>0.72.20</ReactNativeWindowsVersion>
|
|
14
14
|
<ReactNativeWindowsMajor>0</ReactNativeWindowsMajor>
|
|
15
15
|
<ReactNativeWindowsMinor>72</ReactNativeWindowsMinor>
|
|
16
|
-
<ReactNativeWindowsPatch>
|
|
16
|
+
<ReactNativeWindowsPatch>20</ReactNativeWindowsPatch>
|
|
17
17
|
<ReactNativeWindowsCanary>false</ReactNativeWindowsCanary>
|
|
18
|
-
<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.
|
|
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
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
}
|
package/fmt/cgmanifest.json
CHANGED