diff --git a/KissMe/Sources/Common/WebSocket.swift b/KissMe/Sources/Common/WebSocket.swift index cc1363f..81f8db4 100644 --- a/KissMe/Sources/Common/WebSocket.swift +++ b/KissMe/Sources/Common/WebSocket.swift @@ -17,6 +17,7 @@ public protocol WebSocket { var timeout: TimeInterval { get } var session: URLSession { get } var socket: URLSessionWebSocketTask? { get set } + var socketDelegate: URLSessionWebSocketDelegate? { get } var credential: WebSocketCredential { get } } @@ -35,36 +36,6 @@ extension WebSocket { } -extension WebSocket { - - var queryUrl: URL? { - URL(string: domain + url) - } - - /* - mutating func connect() async throws -> URLSessionWebSocketTask { - return try await withUnsafeThrowingContinuation { continuation in - guard let queryUrl = queryUrl else { - continuation.resume(throwing: QueryError.invalidUrl) - return - } - - let socket = session.webSocketTask(with: queryUrl) - socket.resume() - self.socket = socket - - continuation.resume(returning: socket) - } - } - - mutating func disconnect() { - socket?.cancel(with: .normalClosure, reason: nil) - socket = nil - } - */ -} - - public protocol AuthWebSocket: WebSocket { var credential: WebSocketCredential { get } var transactionId: String { get } @@ -74,9 +45,13 @@ public protocol AuthWebSocket: WebSocket { extension AuthWebSocket { + var queryUrl: URL? { + URL(string: domain + url) + } + // TODO: work later -// public var session: URLSession { -// } + //public var session: URLSession { + //} public var domain: String { credential.isMock ? @@ -92,6 +67,7 @@ extension AuthWebSocket { } let socket = session.webSocketTask(with: queryUrl) + socket.delegate = socketDelegate socket.resume() self.socket = socket @@ -154,6 +130,18 @@ extension AuthWebSocket { let r = try JSONDecoder().decode(T.self, from: data) return r } + + public func receive() async throws -> String? { + guard let socket = socket else { + throw GeneralError.invalidWebSocket + } + + let message = try await socket.receive() + let str = message.string + print(message) + + return str + } } @@ -188,4 +176,15 @@ extension URLSessionWebSocketTask.Message { return nil } } + + var string: String? { + switch self { + case .string(let str): + return str + case .data(let data): + return String(data: data, encoding: .utf8) + @unknown default: + return nil + } + } } diff --git a/KissMe/Sources/Domestic/Realtime/Domestic.AskingPriceWebSocket.swift b/KissMe/Sources/Domestic/Realtime/Domestic.AskingPriceWebSocket.swift index 803a595..9e1400e 100644 --- a/KissMe/Sources/Domestic/Realtime/Domestic.AskingPriceWebSocket.swift +++ b/KissMe/Sources/Domestic/Realtime/Domestic.AskingPriceWebSocket.swift @@ -23,6 +23,7 @@ extension Domestic { } public var socket: URLSessionWebSocketTask? + public var socketDelegate: URLSessionWebSocketDelegate? { event } public var credential: WebSocketCredential public let transactionKey: String var event: Event! diff --git a/KissMe/Sources/Domestic/Realtime/Domestic.ContractNoticeWebSocket.swift b/KissMe/Sources/Domestic/Realtime/Domestic.ContractNoticeWebSocket.swift index e0168b1..64789cb 100644 --- a/KissMe/Sources/Domestic/Realtime/Domestic.ContractNoticeWebSocket.swift +++ b/KissMe/Sources/Domestic/Realtime/Domestic.ContractNoticeWebSocket.swift @@ -23,6 +23,7 @@ extension Domestic { } public var socket: URLSessionWebSocketTask? + public var socketDelegate: URLSessionWebSocketDelegate? { event } public var credential: WebSocketCredential public let transactionKey: String var event: Event! diff --git a/KissMe/Sources/Domestic/Realtime/Domestic.ContractPriceWebSocket.swift b/KissMe/Sources/Domestic/Realtime/Domestic.ContractPriceWebSocket.swift index 15f3c36..583d11d 100644 --- a/KissMe/Sources/Domestic/Realtime/Domestic.ContractPriceWebSocket.swift +++ b/KissMe/Sources/Domestic/Realtime/Domestic.ContractPriceWebSocket.swift @@ -14,11 +14,6 @@ enum KissWebSocketSubscription: String, Codable { } -protocol KissWebSocketMessage { - -} - - // MARK: ContractPriceWebSocket extension Domestic { @@ -34,6 +29,7 @@ extension Domestic { } public var socket: URLSessionWebSocketTask? + public var socketDelegate: URLSessionWebSocketDelegate? { event } public var credential: WebSocketCredential public let transactionKey: String var event: Event! @@ -109,7 +105,7 @@ extension Domestic { let resultCode: String let messageCode: String let message: String - let output: OutputDetail? + let output: Output? private enum CodingKeys: String, CodingKey { case resultCode = "rt_cd" @@ -119,7 +115,7 @@ extension Domestic { } } - struct OutputDetail: Codable { + struct Output: Codable { let iv: String let key: String } diff --git a/KissMeConsole/Sources/main.swift b/KissMeConsole/Sources/main.swift index facae4f..90eaedd 100644 --- a/KissMeConsole/Sources/main.swift +++ b/KissMeConsole/Sources/main.swift @@ -35,6 +35,15 @@ func test_get_websocket_key_and_request_simple() { try await Task.sleep(nanoseconds: 1_000_000_000 * 3) let result2 = try await socket.unsubscribe() print(result2) + + if let message = try await socket.receive() { + print(message) + } + + try await Task.sleep(nanoseconds: 1_000_000_000 * 3) + socket.disconnect() + + try await Task.sleep(nanoseconds: 1_000_000_000 * 1) } catch { print(error) } @@ -42,10 +51,6 @@ func test_get_websocket_key_and_request_simple() { semaphore.signal() } semaphore.wait() - - - // 간단한 리퀘스트를 날려보자. - // 응답을 체크해서 정리해보자. }