Skip to content

Commit f6e7251

Browse files
authored
Update JSPromise publisher for JSKit 0.10 (#4)
* Update `JSPromise` implementation for JSKit 0.10 * Update JavaScriptKit requirement in Package.swift * Update `README.md`
1 parent 064ddd2 commit f6e7251

File tree

5 files changed

+23
-35
lines changed

5 files changed

+23
-35
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ let package = Package(
1010
.package(
1111
name: "JavaScriptKit",
1212
url: "https://github.com/swiftwasm/JavaScriptKit.git",
13-
from: "0.9.0"
13+
from: "0.10.0"
1414
),
1515
.package(url: "https://github.com/TokamakUI/OpenCombine.git", from: "0.12.0-alpha3"),
1616
],

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import OpenCombine
2828
import OpenCombineJS
2929

3030
private let jsFetch = JSObject.global.fetch.function!
31-
func fetch(_ url: String) -> JSPromise<JSObject, JSError> {
31+
func fetch(_ url: String) -> JSPromise {
3232
JSPromise(jsFetch(url).object!)!
3333
}
3434

@@ -42,7 +42,7 @@ let timer = JSTimer(millisecondsDelay: 1000, isRepeating: true) {
4242
subscription = fetch("https://httpbin.org/uuid")
4343
.publisher
4444
.flatMap {
45-
JSPromise<JSValue, JSError>($0.json!().object!)!.publisher
45+
JSPromise($0.json().object!)!.publisher
4646
}
4747
.mapError { $0 as Error }
4848
.map { Result<String, Error>.success($0.uuid.string!) }

Sources/OpenCombineJS/JSPromise.swift

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,36 @@
1515
import JavaScriptKit
1616
import OpenCombine
1717

18-
public extension JSPromise where Success: ConstructibleFromJSValue, Failure: JSError {
18+
public extension JSPromise {
1919
final class PromisePublisher: Publisher {
20-
public typealias Output = Success
21-
22-
/// Reference to a parent promise instance to prevent early deallocation
23-
private var parent: JSPromise?
24-
25-
/// Reference to a `then` success callback promise instance to prevent early deallocation
26-
private var then: JSPromise<JSValue, Failure>?
20+
public typealias Output = JSValue
21+
public typealias Failure = JSValue
2722

2823
/// `Future` instance that handles subscriptions to this publisher.
29-
private var future: Future<Success, Failure>?
30-
31-
fileprivate init(parent: JSPromise) {
32-
future = .init { [weak self] resolver in
33-
let then = parent.then { value -> JSValue in
34-
resolver(.success(value))
35-
return .undefined
36-
}
37-
38-
then.catch {
24+
private var future: Future<JSValue, JSValue>
25+
26+
fileprivate init(promise: JSPromise) {
27+
future = .init { resolver in
28+
promise.then(success: {
29+
resolver(.success($0))
30+
return JSValue.undefined
31+
}, failure: {
3932
resolver(.failure($0))
40-
}
41-
self?.then = then
33+
return JSValue.undefined
34+
})
4235
}
43-
self.parent = parent
4436
}
4537

4638
public func receive<Downstream: Subscriber>(subscriber: Downstream)
47-
where Success == Downstream.Input, Failure == Downstream.Failure
39+
where Downstream.Input == JSValue, Downstream.Failure == JSValue
4840
{
49-
guard let parent = parent, let then = then, let future = future else { return }
50-
51-
future.receive(subscriber: WrappingSubscriber(inner: subscriber, parent: parent, then: then))
41+
future.receive(subscriber: WrappingSubscriber(inner: subscriber))
5242
}
5343
}
5444

5545
/// Creates a new publisher for this `JSPromise` instance.
5646
var publisher: PromisePublisher {
57-
.init(parent: self)
47+
.init(promise: self)
5848
}
5949

6050
/** Helper type that wraps a given `inner` subscriber and holds references to both stored promises
@@ -66,8 +56,6 @@ public extension JSPromise where Success: ConstructibleFromJSValue, Failure: JSE
6656
typealias Failure = Inner.Failure
6757

6858
let inner: Inner
69-
let parent: JSPromise
70-
let then: JSPromise<JSValue, Failure>
7159

7260
var combineIdentifier: CombineIdentifier { inner.combineIdentifier }
7361

Sources/OpenCombineJSExample/main.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import OpenCombine
33
import OpenCombineJS
44

55
private let jsFetch = JSObject.global.fetch.function!
6-
func fetch(_ url: String) -> JSPromise<JSObject, JSError> {
6+
func fetch(_ url: String) -> JSPromise {
77
JSPromise(jsFetch(url).object!)!
88
}
99

@@ -17,7 +17,7 @@ let timer = JSTimer(millisecondsDelay: 1000, isRepeating: true) {
1717
subscription = fetch("https://httpbin.org/uuid")
1818
.publisher
1919
.flatMap {
20-
JSPromise<JSValue, JSError>($0.json!().object!)!.publisher
20+
JSPromise($0.json().object!)!.publisher
2121
}
2222
.mapError { $0 as Error }
2323
.map { Result<String, Error>.success($0.uuid.string!) }

0 commit comments

Comments
 (0)