Skip to content

Commit 2bfa7a5

Browse files
maciejmakowski2003Maciej Makowski
andauthored
fix: fixed jsi promise (#296)
Co-authored-by: Maciej Makowski <maciej.makowski2608@gmail.com>
1 parent 2b16355 commit 2bfa7a5

File tree

3 files changed

+22
-30
lines changed

3 files changed

+22
-30
lines changed

packages/react-native-audio-api/common/cpp/HostObjects/BaseAudioContextHostObject.h

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,16 @@ class BaseAudioContextHostObject : public JsiHostObject {
143143
JSI_HOST_FUNCTION(decodeAudioDataSource) {
144144
auto sourcePath = args[0].getString(runtime).utf8(runtime);
145145

146-
auto promise = promiseVendor_->createPromise(
147-
[this, &runtime, sourcePath](std::shared_ptr<Promise> promise) {
148-
std::thread([this,
149-
&runtime,
150-
sourcePath,
151-
promise = std::move(promise)]() {
152-
auto results = context_->decodeAudioDataSource(sourcePath);
153-
auto audioBufferHostObject =
154-
std::make_shared<AudioBufferHostObject>(results);
155-
156-
promise->resolve(jsi::Object::createFromHostObject(
157-
runtime, audioBufferHostObject));
158-
}).detach();
146+
auto promise = promiseVendor_->createPromise([this, sourcePath](std::shared_ptr<Promise> promise) {
147+
std::thread([this, sourcePath, promise = std::move(promise)]() {
148+
auto results = context_->decodeAudioDataSource(sourcePath);
149+
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(results);
150+
151+
promise->resolve([audioBufferHostObject = std::move(audioBufferHostObject)](jsi::Runtime &runtime) {
152+
return jsi::Object::createFromHostObject(runtime, audioBufferHostObject);
159153
});
154+
}).detach();
155+
});
160156

161157
return promise;
162158
}

packages/react-native-audio-api/common/cpp/jsi/JsiPromise.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ jsi::Value PromiseVendor::createPromise(
3636
auto reject = std::make_shared<jsi::Function>(std::move(rejectLocal));
3737

3838
auto resolveWrapper =
39-
[resolve, &runtime, callInvoker](jsi::Value value) -> void {
40-
auto valueShared = std::make_shared<jsi::Value>(std::move(value));
41-
callInvoker->invokeAsync([resolve, &runtime, valueShared]() -> void {
39+
[resolve, &runtime, callInvoker](
40+
const std::function<jsi::Value(jsi::Runtime &)> resolver)
41+
-> void {
42+
callInvoker->invokeAsync([resolve, &runtime, resolver]() -> void {
43+
auto valueShared = std::make_shared<jsi::Value>(resolver(runtime));
44+
4245
resolve->call(runtime, *valueShared);
4346
});
4447
};

packages/react-native-audio-api/common/cpp/jsi/JsiPromise.h

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,26 @@ using namespace facebook;
1313

1414
class Promise {
1515
public:
16-
Promise(
17-
std::function<void(jsi::Value)> resolve,
18-
std::function<void(const std::string &)> reject)
19-
: resolve_(std::move(resolve)), reject_(std::move(reject)) {}
16+
Promise(std::function<void(const std::function<jsi::Value(jsi::Runtime&)>)> resolve, std::function<void(const std::string &)> reject) : resolve_(std::move(resolve)), reject_(std::move(reject)) {}
2017

21-
void resolve(jsi::Value &&value) {
22-
resolve_(std::forward<jsi::Value>(value));
18+
void resolve(const std::function<jsi::Value(jsi::Runtime&)> &resolver) {
19+
resolve_(std::forward<const std::function<jsi::Value(jsi::Runtime&)>>(resolver));
2320
}
21+
2422
void reject(const std::string &errorMessage) {
2523
reject_(errorMessage);
2624
}
2725

2826
private:
29-
std::function<void(jsi::Value)> resolve_;
27+
std::function<void(const std::function<jsi::Value(jsi::Runtime&)>)> resolve_;
3028
std::function<void(const std::string &)> reject_;
3129
};
3230

3331
class PromiseVendor {
3432
public:
35-
PromiseVendor(
36-
jsi::Runtime *runtime,
37-
const std::shared_ptr<react::CallInvoker> &callInvoker)
38-
: runtime_(runtime), callInvoker_(callInvoker) {}
33+
PromiseVendor(jsi::Runtime *runtime, const std::shared_ptr<react::CallInvoker> &callInvoker): runtime_(runtime), callInvoker_(callInvoker) {}
3934

40-
public:
41-
jsi::Value createPromise(
42-
const std::function<void(std::shared_ptr<Promise>)> &function);
35+
jsi::Value createPromise(const std::function<void(std::shared_ptr<Promise>)> &function);
4336

4437
private:
4538
jsi::Runtime *runtime_;

0 commit comments

Comments
 (0)