import Foundation import PromiseKit public class ProcessInfoBackgroundTaskRunner: HomeAssistantBackgroundTaskRunner { public func callAsFunction( withName name: String, wrapping: (TimeInterval?) -> Promise ) -> Promise { ProcessInfo.processInfo.backgroundTask(withName: name, wrapping: wrapping) } } private extension ProcessInfo { func backgroundTask( withName name: String, wrapping: (TimeInterval?) -> Promise ) -> Promise { let identifier = UUID() let semaphore = DispatchSemaphore(value: 0) return HomeAssistantBackgroundTask.execute( withName: name, beginBackgroundTask: { name, expirationHandler -> (UUID?, TimeInterval?) in performExpiringActivity(withReason: name) { expire in if expire { expirationHandler() } else { semaphore.wait() } } return (identifier, nil) }, endBackgroundTask: { _ in semaphore.signal() }, wrapping: wrapping ) } }