55// Created by Fernando Fernandes on 28.02.24.
66//
77
8+ import Combine
89import Foundation
910
1011/// Establishes a WebSocket connection using the given `websocketURL`.
1112/// Publishes received messages and errors.
12- @ Observable public final class ObservableWebSocketClient : Identifiable , Codable , Equatable {
13+ public final class ObservableWebSocketClient : Identifiable , Equatable , Codable , ObservableObject {
1314
1415 /// Publishes received messages after the connection is successfully established.
15- public var message : CodableWebSocketMessage ?
16+ @ Published public var codableMessage : CodableWebSocketMessage ? = nil
1617
1718 /// Publishes any error that may occur.
18- public var error : ObservableWebSocketClientError ?
19+ @Published public var error : ObservableWebSocketClientError ? = nil
20+
21+ #warning("TODO: isConnected logic")
22+ /// Publishes whether the WebSocket is still valid/alive.
23+ @Published public var isConnected : Bool = false
1924
2025 public var id : UUID
2126
2227 public let websocketURL : URL
2328
2429 private let service : ObservableWebSocketService
30+
31+ private var cancellables = Set < AnyCancellable > ( )
2532
2633 /// Creates an `ObservableWebSocketClient` instance.
2734 ///
@@ -40,8 +47,34 @@ import Foundation
4047 error: ObservableWebSocketClientError ? = nil ) {
4148 self . id = id
4249 self . websocketURL = websocketURL
43- self . message = message
50+ self . codableMessage = message
4451 self . error = error
4552 self . service = ObservableWebSocketService ( url: websocketURL)
53+ observeWebSocketConnection ( )
54+ }
55+ }
56+
57+ // MARK: - Observation
58+
59+ extension ObservableWebSocketClient {
60+ func observeWebSocketConnection( ) {
61+
62+ // MARK: Message
63+
64+ service. $message. sink { [ weak self] message in
65+ if let message {
66+ self ? . codableMessage = CodableWebSocketMessage ( message: message)
67+ }
68+ }
69+ . store ( in: & cancellables)
70+
71+ // MARK: Error
72+
73+ service. $error. sink { [ weak self] error in
74+ if let error {
75+ self ? . error = error
76+ }
77+ }
78+ . store ( in: & cancellables)
4679 }
4780}
0 commit comments