diff --git a/ios/react-native/MPCKeyService.swift b/ios/react-native/MPCKeyService.swift index 0069ce3..0ff5e9d 100644 --- a/ios/react-native/MPCKeyService.swift +++ b/ios/react-native/MPCKeyService.swift @@ -22,6 +22,10 @@ class MPCKeyService: NSObject { return false; } + + @objc static func requiresMainQueueSetup() -> Bool { + return true + } /** Initializes the MPCKeyService with the given parameters. diff --git a/ios/react-native/MPCSdk.swift b/ios/react-native/MPCSdk.swift index a117d29..1b16f22 100644 --- a/ios/react-native/MPCSdk.swift +++ b/ios/react-native/MPCSdk.swift @@ -24,6 +24,10 @@ class MPCSdk: NSObject { return false } + @objc static func requiresMainQueueSetup() -> Bool { + return true + } + /** Initializes the MPCSdk with the given parameters. Resolves with the string "success" on success; rejects with an error otherwise. diff --git a/ios/react-native/MPCWalletService.swift b/ios/react-native/MPCWalletService.swift index c01c8a9..ac09395 100644 --- a/ios/react-native/MPCWalletService.swift +++ b/ios/react-native/MPCWalletService.swift @@ -32,6 +32,10 @@ class MPCWalletService: NSObject { reject(walletsErr, error.localizedDescription, nil) } } + + @objc static func requiresMainQueueSetup() -> Bool { + return true + } /** Creates an MPCWallet with the given parameters. Resolves with the response on success; rejects with an error diff --git a/ios/react-native/PoolService.swift b/ios/react-native/PoolService.swift index 251174c..a80c8f7 100644 --- a/ios/react-native/PoolService.swift +++ b/ios/react-native/PoolService.swift @@ -24,6 +24,10 @@ class PoolService: NSObject { reject(poolsErr, error.localizedDescription, nil) } } + + @objc static func requiresMainQueueSetup() -> Bool { + return true + } /** Creates a Pool with the given parameters. Resolves with the created Pool object on success; rejects with an error diff --git a/ios/swift/Job.swift b/ios/swift/Job.swift new file mode 100644 index 0000000..5a8ad02 --- /dev/null +++ b/ios/swift/Job.swift @@ -0,0 +1,26 @@ +import Foundation + +/** + This class manages different .qos options for the dispatch queues Waas uses, to make it easier to + support user-configurable QOS in the future. + */ +class Job { + /** + Return a dispatch queue for running on a background thread. + */ + class func background() -> DispatchQueue { + return DispatchQueue.global(qos: .background) + } + + class func backgroundHighPri() -> DispatchQueue { + return DispatchQueue.global(qos: .userInteractive) + } + + /** + Return a dispatch queue for running on the main/UI thread. + */ + class func main() -> DispatchQueue { + DispatchQueue.main + } +} + diff --git a/ios/swift/WaasSdk/MPCKeyService.swift b/ios/swift/WaasSdk/MPCKeyService.swift index d955428..e2ae09c 100644 --- a/ios/swift/WaasSdk/MPCKeyService.swift +++ b/ios/swift/WaasSdk/MPCKeyService.swift @@ -41,7 +41,7 @@ public class MPCKeyService: NSObject { */ public func registerDevice() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let device = try self.keyClient?.registerDevice() promise(Result.success(device!)) @@ -60,7 +60,7 @@ public class MPCKeyService: NSObject { */ public func pollForPendingDeviceGroup(_ deviceGroup: NSString, pollInterval: NSNumber) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pendingDeviceGroupData = try self.keyClient?.pollPendingDeviceGroup( deviceGroup as String, @@ -82,7 +82,7 @@ public class MPCKeyService: NSObject { */ public func stopPollingForPendingDeviceGroup() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.stopPollingPendingDeviceBackups(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -94,7 +94,7 @@ public class MPCKeyService: NSObject { */ public func createSignatureFromTx(_ parent: NSString, transaction: NSDictionary) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let serializedTx = try JSONSerialization.data(withJSONObject: transaction) self.keyClient?.createTxSignature(parent as String, tx: serializedTx, receiver: goReturnsString(promise: promise, wrapAsError: self.wrapError)) @@ -113,7 +113,7 @@ public class MPCKeyService: NSObject { */ public func pollForPendingSignatures(_ deviceGroup: NSString, pollInterval: NSNumber) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pendingSignaturesData = try self.keyClient?.pollPendingSignatures( deviceGroup as String, @@ -135,7 +135,7 @@ public class MPCKeyService: NSObject { */ public func stopPollingForPendingSignatures() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.stopPollingPendingSignatures(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -147,7 +147,7 @@ public class MPCKeyService: NSObject { */ public func waitPendingSignature(_ operation: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { var signature: V1Signature? do { signature = try self.keyClient?.waitPendingSignature(operation as String) @@ -164,7 +164,7 @@ public class MPCKeyService: NSObject { */ public func getSignedTransaction(_ transaction: NSDictionary, signature: NSDictionary) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let serializedTx = try JSONSerialization.data(withJSONObject: transaction) let goSignature = V1Signature() @@ -188,7 +188,7 @@ public class MPCKeyService: NSObject { */ public func getDeviceGroup(_ name: NSString) -> Future{ return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let deviceGroupRes = try self.keyClient?.getDeviceGroup(name as String) promise(Result.success(deviceGroupRes!)) @@ -205,7 +205,7 @@ public class MPCKeyService: NSObject { */ public func prepareDeviceArchive(_ deviceGroup: NSString, device: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.prepareDeviceArchive( deviceGroup as String, device: device as String, receiver: goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) @@ -220,7 +220,7 @@ public class MPCKeyService: NSObject { */ public func pollForPendingDeviceArchives(_ deviceGroup: NSString, pollInterval: NSNumber) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pendingDeviceArchiveData = try self.keyClient?.pollPendingDeviceArchives( deviceGroup as String, @@ -241,7 +241,7 @@ public class MPCKeyService: NSObject { */ public func stopPollingForPendingDeviceArchives() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.stopPollingPendingDeviceArchives(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -253,7 +253,7 @@ public class MPCKeyService: NSObject { */ public func prepareDeviceBackup(_ deviceGroup: NSString, device: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.prepareDeviceBackup( deviceGroup as String, device: device as String, receiver: goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) @@ -268,7 +268,7 @@ public class MPCKeyService: NSObject { */ public func pollForPendingDeviceBackups(_ deviceGroup: NSString, pollInterval: NSNumber) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pendingDeviceBackupData = try self.keyClient?.pollPendingDeviceBackups( deviceGroup as String, @@ -291,7 +291,7 @@ public class MPCKeyService: NSObject { */ public func stopPollingForPendingDeviceBackups() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.stopPollingPendingDeviceBackups(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -303,7 +303,7 @@ public class MPCKeyService: NSObject { */ public func addDevice(_ deviceGroup: NSString, device: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.addDevice( deviceGroup as String, device: device as String, receiver: goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) @@ -318,7 +318,7 @@ public class MPCKeyService: NSObject { */ public func pollForPendingDevices(_ deviceGroup: NSString, pollInterval: NSNumber) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pendingDeviceData = try self.keyClient?.pollPendingDevices( deviceGroup as String, @@ -341,7 +341,7 @@ public class MPCKeyService: NSObject { */ public func stopPollingForPendingDevices() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { self.keyClient?.stopPollingPendingDevices(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } diff --git a/ios/swift/WaasSdk/MPCSdk.swift b/ios/swift/WaasSdk/MPCSdk.swift index c0c610f..c39be49 100644 --- a/ios/swift/WaasSdk/MPCSdk.swift +++ b/ios/swift/WaasSdk/MPCSdk.swift @@ -43,7 +43,7 @@ public class MPCSdk: NSObject { */ public func bootstrapDevice(_ passcode: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.main().async(execute: { self.sdk.bootstrapDevice(passcode as String, receiver: goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -58,7 +58,7 @@ public class MPCSdk: NSObject { */ public func resetPasscode(_ newPasscode: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.main().async(execute: { do { try self.sdk.resetPasscode(newPasscode as String) promise(Result.success(())) @@ -75,7 +75,7 @@ public class MPCSdk: NSObject { */ public func getRegistrationData() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.main().async(execute: { self.sdk.getRegistrationData(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } @@ -88,7 +88,7 @@ public class MPCSdk: NSObject { */ public func computeMPCOperation(_ mpcData: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { try self.sdk.computeMPCOperation(mpcData as String) promise(Result.success(())) @@ -105,7 +105,7 @@ public class MPCSdk: NSObject { */ public func computePrepareDeviceArchiveMPCOperation(_ mpcData: NSString, passcode: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { try self.sdk.computePrepareDeviceArchiveMPCOperation(mpcData as String, passcode: passcode as String) promise(Result.success(())) @@ -122,7 +122,7 @@ public class MPCSdk: NSObject { */ public func computePrepareDeviceBackupMPCOperation(_ mpcData: NSString, passcode: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { try self.sdk.computePrepareDeviceBackupMPCOperation(mpcData as String, passcode: passcode as String) promise(Result.success(())) @@ -139,7 +139,7 @@ public class MPCSdk: NSObject { */ public func computeAddDeviceMPCOperation(_ mpcData: NSString, passcode: NSString, deviceBackup: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { try self.sdk.computeAddDeviceMPCOperation( mpcData as String, @@ -161,7 +161,7 @@ public class MPCSdk: NSObject { */ public func exportPrivateKeys(_ mpcKeyExportMetadata: NSString, passcode: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { let response = try self.sdk.exportPrivateKeys( mpcKeyExportMetadata as String, @@ -183,7 +183,7 @@ public class MPCSdk: NSObject { */ public func exportDeviceBackup() -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { self.sdk.exportDeviceBackup(goReturnsString(promise: promise, wrapAsError: self.wrapError)) }) } diff --git a/ios/swift/WaasSdk/MPCWalletService.swift b/ios/swift/WaasSdk/MPCWalletService.swift index df6c609..b8eb8b8 100644 --- a/ios/swift/WaasSdk/MPCWalletService.swift +++ b/ios/swift/WaasSdk/MPCWalletService.swift @@ -41,7 +41,7 @@ public class MPCWalletService: NSObject { */ public func createMPCWallet(parent: NSString, device: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { let response = try self.walletsClient.createMPCWallet(parent as String, device: device as String) promise(Result.success(response)) @@ -58,7 +58,7 @@ public class MPCWalletService: NSObject { */ public func waitPendingMPCWallet(operation: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let mpcWallet = try self.walletsClient.waitPendingMPCWallet(operation as String) promise(Result.success(mpcWallet)) @@ -75,7 +75,7 @@ public class MPCWalletService: NSObject { */ public func generateAddress(_ mpcWallet: NSString, network: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.backgroundHighPri().async(execute: { do { let addressData = try self.walletsClient.generateAddress(mpcWallet as String, network: network as String) let res = try JSONSerialization.jsonObject(with: addressData) as? NSDictionary @@ -92,7 +92,7 @@ public class MPCWalletService: NSObject { */ public func getAddress(name: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let addressData = try self.walletsClient.getAddress(name as String) let res = try JSONSerialization.jsonObject(with: addressData) as? NSDictionary diff --git a/ios/swift/WaasSdk/PoolService.swift b/ios/swift/WaasSdk/PoolService.swift index e8565ba..9608908 100644 --- a/ios/swift/WaasSdk/PoolService.swift +++ b/ios/swift/WaasSdk/PoolService.swift @@ -29,7 +29,7 @@ public class PoolService: NSObject { */ public func createPool(displayName: NSString, poolID: NSString) -> Future { return Future() { promise in - DispatchQueue.main.async(execute: { + Job.background().async(execute: { do { let pool = try self.poolsClient.createPool(displayName as String, poolID: poolID as String) promise(Result.success(pool))