react-native-vision-camera/ios/React Utils/Promise.swift
Marc Rousavy 71730a73ef
fix: Fix AVAudioSession not allowing background music playback (#155)
* Set category always if different

* rename org

* Fix video format sorting

* fix format filtering

* Update AVAudioSession+setCategoryIfNotSet.swift

* upgrade all dependencies

* Also run dependabot for JS codebase

* Update MediaPage.tsx

* Use typescript 4.2.4

* Also run TS in check-all

* Downgrade typescript to 4.2.3

* f

* recreate lockfiles

* docs: Revert package.json changes

* revert all package.json changes

* Update Podfile.lock

* bump all dependencies, pin typescript to 4.2.4

* Downgrade react-native-navigation for now

* upgrade to later snapshot

* Update yarn.lock

* remove yeet
2021-06-01 13:07:57 +02:00

70 lines
1.8 KiB
Swift

//
// Promise.swift
// Cuvent
//
// Created by Marc Rousavy on 14.01.21.
// Copyright © 2021 mrousavy. All rights reserved.
//
import Foundation
// MARK: - Promise
/**
* Represents a JavaScript Promise instance. `reject()` and `resolve()` should only be called once.
*/
class Promise {
init(resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
self.resolver = resolver
self.rejecter = rejecter
}
func reject(error: CameraError, cause: NSError?) {
rejecter(error.code, error.message, cause)
}
func reject(error: CameraError) {
reject(error: error, cause: nil)
}
func resolve(_ value: Any?) {
resolver(value)
}
func resolve() {
resolve(nil)
}
// MARK: Private
private let resolver: RCTPromiseResolveBlock
private let rejecter: RCTPromiseRejectBlock
}
/**
* Wrap a block with an automatic promise resolver and rejecter.
*
* The value returned by the `block` must be serializable by the React Native bridge, or `nil`.
* The error thrown by the `block` should be a `CameraError`
*/
func withPromise(_ promise: Promise, _ block: () throws -> Any?) {
do {
let result = try block()
promise.resolve(result)
} catch let error as CameraError {
promise.reject(error: error)
} catch let error as NSError {
promise.reject(error: CameraError.unknown(message: error.description), cause: error)
}
}
/**
* Wrap a block with an automatic promise resolver and rejecter.
*
* The value returned by the `block` must be serializable by the React Native bridge, or `nil`.
* The error thrown by the `block` should be a `CameraError`
*/
func withPromise(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock, _ block: () throws -> Any?) {
return withPromise(Promise(resolver: resolve, rejecter: reject), block)
}