OpenCombine helpers for JavaScriptKit/WebAssembly APIs. Currently it provides:
- A
JSScheduler
class that implements theScheduler
protocol. This allows you to use time-dependent Combine operators such asmeasureInterval
,debounce
,throttle
, andtimeout
in a browser environment. - A
TopLevelDecoder
implementation onJSValueDecoder
. - A
publisher
property onJSPromise
, which converts your JavaScriptPromise
instances to Combine publishers.
Here's an example of a timer that fetches a UUID from a remote server every second, parses it
with JSValueDecoder
, and then displays the result as text:
import JavaScriptKit
import OpenCombine
import OpenCombineJS
private let jsFetch = JSObject.global.fetch.function!
func fetch(_ url: String) -> JSPromise {
JSPromise(jsFetch(url).object!)!
}
let document = JSObject.global.document
var p = document.createElement("p")
_ = document.body.appendChild(p)
var subscription: AnyCancellable?
let timer = JSTimer(millisecondsDelay: 1000, isRepeating: true) {
subscription = fetch("https://httpbin.org/uuid")
.publisher
.flatMap {
JSPromise($0.json().object!)!.publisher
}
.mapError { $0 as Error }
.map { Result<String, Error>.success($0.uuid.string!) }
.catch { Just(.failure($0)) }
.sink {
let time = JSDate().toLocaleTimeString()
switch $0 {
case let .success(uuid):
p.innerText = .string("At \(time) received uuid \(uuid)")
case let .failure(error):
p.innerText = .string("At \(time) received error \(error)")
}
}
}