OpenCombine helpers for JavaScriptKit/WebAssembly APIs. Currently it provides:
- A
JSSchedulerclass that implements theSchedulerprotocol. This allows you to use time-dependent Combine operators such asmeasureInterval,debounce,throttle, andtimeoutin the browser environment. - A
TopLevelDecoderimplementation onJSValueDecoder. - A
publisherproperty onJSPromise, which converts your JavaScriptPromiseinstances 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)")
}
}
}This project adheres to the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to hello@swiftwasm.org.