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.