diff --git a/Package.resolved b/Package.resolved index c251fef..312f9f5 100644 --- a/Package.resolved +++ b/Package.resolved @@ -15,8 +15,8 @@ "repositoryURL": "https://github.com/daltoniam/Starscream", "state": { "branch": null, - "revision": "a063fda2b8145a231953c20e7a646be254365396", - "version": "3.1.2" + "revision": "c6bfd1af48efcc9a9ad203665db12375ba6b145a", + "version": "4.0.8" } } ] diff --git a/Package.swift b/Package.swift index 3185128..1ef9e26 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,7 @@ let package = Package( ], dependencies: [ .package(name: "BigInt", url: "https://github.com/attaswift/BigInt.git", from: "5.2.1"), - .package(name: "Starscream", url: "https://github.com/daltoniam/Starscream", from: "3.1.1") + .package(name: "Starscream", url: "https://github.com/daltoniam/Starscream", from: "4.0.8") ], targets: [ .target( diff --git a/Sources/Models/FlowId.swift b/Sources/Models/FlowId.swift index 95f88a8..2de0597 100644 --- a/Sources/Models/FlowId.swift +++ b/Sources/Models/FlowId.swift @@ -98,9 +98,7 @@ public extension Flow.ID { let result = try await awaitPublisher( ws.subscribeToTransactionStatus(txId: self) - .filter{ $0.payload?.transactionResult.status ?? .unknown > status } - .first() - .eraseToAnyPublisher() + .filter{ $0.payload?.transactionResult.status ?? .unknown >= status } , timeout: timeout ) diff --git a/Sources/Network/Websocket/Websocket.swift b/Sources/Network/Websocket/Websocket.swift index d66243e..7c89a18 100644 --- a/Sources/Network/Websocket/Websocket.swift +++ b/Sources/Network/Websocket/Websocket.swift @@ -56,7 +56,10 @@ public extension Flow { isConnecting = true var request = URLRequest(url: url) request.timeoutInterval = timeoutInterval - socket = WebSocket(request: request) + + let pinner = FoundationSecurity(allowSelfSigned: true) // do not validate SSL certificates + socket = WebSocket(request: request, certPinner: pinner) + socket?.delegate = self socket?.connect() } @@ -179,7 +182,7 @@ public extension Flow { } public func unsubscribe(subscriptionId: String) { - let request = SubscribeRequest(id: subscriptionId, action: .unsubscribe, topic: .blocks, arguments: nil) + let request = SubscribeRequest(id: subscriptionId, action: .unsubscribe, topic: nil, arguments: nil) do { let data = try encoder.encode(request) socket?.write(data: data) @@ -213,25 +216,35 @@ public extension Flow { // MARK: - WebSocketDelegate extension Flow.Websocket: WebSocketDelegate { - public func websocketDidConnect(socket: any Starscream.WebSocketClient) { - isConnected = true - isConnecting = false - connectionSubject.send(()) - Flow.Publisher.shared.publishConnectionStatus(isConnected: true) - } - - public func websocketDidDisconnect(socket: any Starscream.WebSocketClient, error: (any Error)?) { - isConnected = false - isConnecting = false - Flow.Publisher.shared.publishConnectionStatus(isConnected: false) - } - - public func websocketDidReceiveMessage(socket: any Starscream.WebSocketClient, text: String) { - handleTextMessage(text) - } - public func websocketDidReceiveData(socket: any Starscream.WebSocketClient, data: Data) { - handleBinaryMessage(data) + public func didReceive(event: WebSocketEvent, client: any Starscream.WebSocketClient) { + switch event { + case .connected: + isConnected = true + isConnecting = false + connectionSubject.send(()) + Flow.Publisher.shared.publishConnectionStatus(isConnected: true) + + case .disconnected(_, _): + isConnected = false + isConnecting = false + Flow.Publisher.shared.publishConnectionStatus(isConnected: false) + + case .text(let string): + handleTextMessage(string) + + case .binary(let data): + handleBinaryMessage(data) + + case .error(let error): + print("WebSocket error: \(String(describing: error))") + let wsError = WebSocketError.serverError(SocketError(code: -1, message: error?.localizedDescription ?? "Unknown error")) + subscriptions.values.forEach { $0.subject.send(completion: .failure(wsError)) } + Flow.Publisher.shared.publishError(wsError) + + default: + break + } } private func handleTextMessage(_ text: String) { diff --git a/Tests/FlowAccessAPIOnTestnetTests.swift b/Tests/FlowAccessAPIOnTestnetTests.swift index 47f02cd..3fe6744 100644 --- a/Tests/FlowAccessAPIOnTestnetTests.swift +++ b/Tests/FlowAccessAPIOnTestnetTests.swift @@ -145,7 +145,7 @@ final class FlowAccessAPIOnTestnetTests: XCTestCase { print("txid --> \(txId.hex)") XCTAssertNotNil(txId) - let result = try await txId.onceExecuted() + let result = try await txId.onceSealed() let address = result.getCreatedAddress()! print("address --> \(address)") XCTAssertNotNil(address)