Skip to content

Commit 2ae750b

Browse files
Merge pull request #378 from amirhossein7/fix-websocket
fixed: websocket delegate issue (new)
2 parents c68eb0f + e5e339b commit 2ae750b

File tree

3 files changed

+119
-29
lines changed

3 files changed

+119
-29
lines changed

Sources/web3swift/Web3/Web3+InfuraProviders.swift

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public final class InfuraWebsocketProvider: WebsocketProvider {
4444
private var subscriptionIDforUnsubscribing: String? = nil
4545
private var filterTimer: Timer?
4646

47+
/// if set debugMode True then show websocket events logs in the console
48+
public var debugMode: Bool = false
49+
4750
public init?(_ network: Networks,
4851
delegate: Web3SocketDelegate,
4952
projectId: String? = nil,
@@ -242,7 +245,48 @@ public final class InfuraWebsocketProvider: WebsocketProvider {
242245
try writeMessage(method: method, params: params)
243246
}
244247

245-
override public func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
248+
/// override WebsocketDelegate
249+
override public func didReceive(event: WebSocketEvent, client: WebSocket) {
250+
switch event {
251+
case .connected(let headers):
252+
debugMode ? print("websocket is connected, headers:\n \(headers)") : nil
253+
websocketConnected = true
254+
delegate.socketConnected(headers)
255+
case .disconnected(let reason, let code):
256+
debugMode ? print("websocket is disconnected: \(reason) with code: \(code)") : nil
257+
websocketConnected = false
258+
delegate.gotError(error: Web3Error.connectionError)
259+
case .text(let string):
260+
debugMode ? print("received text: \(string)") : nil
261+
websocketDidReceiveMessage(text: string)
262+
break
263+
case .binary(let data):
264+
debugMode ? print("received text: \(String(data: data, encoding: .utf8) ?? "empty")") : nil
265+
delegate.received(message: data)
266+
case .ping(_):
267+
debugMode ? print("ping") : nil
268+
break
269+
case .pong(_):
270+
debugMode ? print("pong") : nil
271+
break
272+
case .viabilityChanged(_):
273+
debugMode ? print("viabilityChanged") : nil
274+
break
275+
case .reconnectSuggested(_):
276+
debugMode ? print("reconnectSuggested") : nil
277+
break
278+
case .cancelled:
279+
debugMode ? print("cancelled") : nil
280+
websocketConnected = false
281+
delegate.gotError(error: Web3Error.nodeError(desc: "socket cancelled"))
282+
case .error(let error):
283+
debugMode ? print("error: \(String(describing: error))") : nil
284+
websocketConnected = false
285+
delegate.gotError(error: error!)
286+
}
287+
}
288+
289+
private func websocketDidReceiveMessage(text: String) {
246290
if let data = text.data(using: String.Encoding.utf8),
247291
let dictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
248292
if filterID == nil,

Sources/web3swift/Web3/Web3+WebsocketProvider.swift

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,14 @@ public struct InfuraWebsocketRequest: Encodable {
8686
}
8787

8888
public protocol Web3SocketDelegate {
89+
func socketConnected(_ headers: [String:String])
8990
func received(message: Any)
9091
func gotError(error: Error)
9192
}
9293

9394
/// The default websocket provider.
9495
public class WebsocketProvider: Web3Provider, IWebsocketProvider, WebSocketDelegate {
95-
96-
public func didReceive(event: WebSocketEvent, client: WebSocket) {
97-
98-
}
99-
96+
10097
public func sendAsync(_ request: JSONRPCrequest, queue: DispatchQueue) -> Promise<JSONRPCresponse> {
10198
return Promise(error: Web3Error.inputError(desc: "Sending is unsupported for Websocket provider. Please, use \'sendMessage\'"))
10299
}
@@ -116,8 +113,9 @@ public class WebsocketProvider: Web3Provider, IWebsocketProvider, WebSocketDeleg
116113

117114
public var socket: WebSocket
118115
public var delegate: Web3SocketDelegate
116+
/// A flag that is true if socket connected or false if socket doesn't connected.
117+
public var websocketConnected: Bool = false
119118

120-
private var websocketConnected: Bool = false
121119
private var writeTimer: Timer? = nil
122120
private var messagesStringToWrite: [String] = []
123121
private var messagesDataToWrite: [Data] = []
@@ -219,6 +217,10 @@ public class WebsocketProvider: Web3Provider, IWebsocketProvider, WebSocketDeleg
219217
socket.disconnect()
220218
}
221219

220+
public func isConnect() -> Bool {
221+
return websocketConnected
222+
}
223+
222224
public class func connectToSocket(_ endpoint: String,
223225
delegate: Web3SocketDelegate,
224226
projectId: String? = nil,
@@ -281,27 +283,34 @@ public class WebsocketProvider: Web3Provider, IWebsocketProvider, WebSocketDeleg
281283
}
282284
}
283285

284-
public func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
285-
print("got some text: \(text)")
286-
delegate.received(message: text)
287-
}
288-
289-
public func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
290-
print("got some data: \(data.count)")
291-
delegate.received(message: data)
292-
}
293-
294-
public func websocketDidConnect(socket: WebSocketClient) {
295-
print("websocket is connected")
296-
websocketConnected = true
297-
}
298-
299-
public func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
300-
print("websocket is disconnected with \(error?.localizedDescription ?? "no error")")
301-
websocketConnected = false
302-
}
303-
304-
public func websocketDidReceivePong(socket: WebSocketClient, data: Data?) {
305-
print("Got pong! Maybe some data: \(String(describing: data?.count))")
286+
public func didReceive(event: WebSocketEvent, client: WebSocket) {
287+
switch event {
288+
case .connected(let headers):
289+
websocketConnected = true
290+
delegate.socketConnected(headers)
291+
case .disconnected(let reason, let code):
292+
print("socket disconnected: \(reason) , code: \(code)")
293+
websocketConnected = false
294+
delegate.gotError(error: Web3Error.connectionError)
295+
case .text(let string):
296+
delegate.received(message: string)
297+
break
298+
case .binary(let data):
299+
delegate.received(message: data)
300+
case .ping(_):
301+
break
302+
case .pong(_):
303+
break
304+
case .viabilityChanged(_):
305+
break
306+
case .reconnectSuggested(_):
307+
break
308+
case .cancelled:
309+
websocketConnected = false
310+
delegate.gotError(error: Web3Error.nodeError(desc: "socket cancelled"))
311+
case .error(let error):
312+
websocketConnected = false
313+
delegate.gotError(error: error!)
314+
}
306315
}
307316
}

Tests/web3swiftTests/infura_tests/web3swift_Websockets_Tests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ class SpyDelegate: Web3SocketDelegate {
2121
var asyncExpectation: XCTestExpectation?
2222
var fulfilled = false
2323

24+
func socketConnected(_ headers: [String:String]) {
25+
somethingWithDelegateResult = headers
26+
guard let expectation = asyncExpectation else {
27+
XCTFail("SpyDelegate was not setup correctly. Missing XCTExpectation reference")
28+
return
29+
}
30+
print("socket connected, headers: \(headers)")
31+
32+
if !fulfilled {
33+
print("fullfilled")
34+
fulfilled = true
35+
expectation.fulfill()
36+
}
37+
}
38+
2439
func received(message: Any) {
2540
somethingWithDelegateResult = message
2641
guard let expectation = asyncExpectation else {
@@ -46,6 +61,28 @@ class web3swift_websocket_Tests: XCTestCase {
4661
let spyDelegate = SpyDelegate()
4762
var socketProvider: InfuraWebsocketProvider?
4863

64+
func testSocketConnection(){
65+
guard let socketProvider = InfuraWebsocketProvider.connectToInfuraSocket(.Mainnet, delegate: spyDelegate) else {
66+
return XCTFail()
67+
}
68+
self.socketProvider = socketProvider
69+
70+
spyDelegate.asyncExpectation = expectation(description: "Delegate called")
71+
72+
waitForExpectations(timeout: 1000) { error in
73+
if let error = error {
74+
XCTFail("waitForExpectationsWithTimeout errored: \(error)")
75+
}
76+
77+
guard self.spyDelegate.somethingWithDelegateResult != nil else {
78+
XCTFail("Expected delegate to be called")
79+
return
80+
}
81+
82+
XCTAssert(true)
83+
}
84+
}
85+
4986
func testSubscribeOnPendingTXs() {
5087
guard let socketProvider = InfuraWebsocketProvider.connectToInfuraSocket(.Mainnet, delegate: spyDelegate) else {
5188
return XCTFail()

0 commit comments

Comments
 (0)