Add parser with pending message handling
This commit is contained in:
@@ -14,136 +14,4 @@ import KissMe
|
||||
//test_get_websocket_key_and_contact_price()
|
||||
//test_get_websocket_key_and_asking_price()
|
||||
//test_parse_contact_price_response()
|
||||
|
||||
|
||||
func test_parse_contact_price_response() {
|
||||
let str = "{\"header\":{\"tr_id\":\"H0STCNT0\",\"tr_key\":\"005930\",\"encrypt\":\"N\"},\"body\":{\"rt_cd\":\"0\",\"msg_cd\":\"OPSP0000\",\"msg1\":\"SUBSCRIBE SUCCESS\",\"output\":{\"iv\":\"dcc3c442acfb8b9a\",\"key\":\"vcvxscahuklwkiawiuxbsfcmsulqjejf\"}}}0|H0STCNT0|001|005930^134305^68100^2^1000^1.49^68305.67^68300^68700^67900^68100^68000^1^11393808^778261604700^32559^26679^-5880^79.02^6084367^4807987^1^0.43^119.32^090027^5^-200^091809^5^-600^113615^2^200^20230824^20^N^309354^354766^2143494^2041321^0.19^6698642^170.09^0^^68300{\"header\":{\"tr_id\":\"PINGPONG\",\"datetime\":\"20230824212922\"}}"
|
||||
|
||||
do {
|
||||
let dataArray = try Domestic.WebSocketResult.parse(str)
|
||||
for data in dataArray {
|
||||
switch data {
|
||||
case .json(let str):
|
||||
print("json: \(str)")
|
||||
case .contractPrice(let price):
|
||||
print("contractPrice: \(price)")
|
||||
case .askingPrice(let price):
|
||||
print("askingPrice: \(price)")
|
||||
case .contractNotice(let notice):
|
||||
print("contractNotice: \(notice)")
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key_and_asking_price() {
|
||||
let isMock = false
|
||||
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
Task {
|
||||
guard let (account, approvalKey) = await test_get_websocket_key(isMock: isMock) else {
|
||||
return
|
||||
}
|
||||
|
||||
let webSocketCredential = KissWebSocketCredential(isMock: isMock, accountNo: account.accountNo, approvalKey: approvalKey)
|
||||
|
||||
var socket = Domestic.AskingPriceWebSocket(credential: webSocketCredential, productCode: KissConsole.defaultProductNo)
|
||||
|
||||
do {
|
||||
try await socket.connect()
|
||||
let result = try await socket.subscribe()
|
||||
print(result)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
semaphore.signal()
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key_and_contact_price() {
|
||||
let isMock = false
|
||||
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
Task {
|
||||
guard let (account, approvalKey) = await test_get_websocket_key(isMock: isMock) else {
|
||||
return
|
||||
}
|
||||
|
||||
let webSocketCredential = KissWebSocketCredential(isMock: isMock, accountNo: account.accountNo, approvalKey: approvalKey)
|
||||
|
||||
var socket = Domestic.ContractPriceWebSocket(credential: webSocketCredential, productCode: KissConsole.defaultProductNo)
|
||||
|
||||
do {
|
||||
try await socket.connect()
|
||||
let result = try await socket.subscribe()
|
||||
print(result)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
semaphore.signal()
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key(isMock: Bool) async -> (KissAccount, String)? {
|
||||
let credential: Credential
|
||||
|
||||
do {
|
||||
credential = try KissCredential(isMock: isMock)
|
||||
} catch {
|
||||
print(error)
|
||||
return nil
|
||||
}
|
||||
|
||||
let account = KissAccount(credential: credential)
|
||||
do {
|
||||
/// Return existing valid key
|
||||
if let approvalKey = account.approvalKey {
|
||||
return (account, approvalKey)
|
||||
}
|
||||
|
||||
if try await account.login() {
|
||||
let approvalKey = try await account.getApprovalKey()
|
||||
print("approvalKey : \(approvalKey)")
|
||||
return (account, approvalKey)
|
||||
}
|
||||
} catch {
|
||||
print(error)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
test_websocket_dump_data()
|
||||
|
||||
197
KissMeConsole/Sources/test_websocket.swift
Normal file
197
KissMeConsole/Sources/test_websocket.swift
Normal file
@@ -0,0 +1,197 @@
|
||||
//
|
||||
// test_websocket.swift
|
||||
// KissMeConsole
|
||||
//
|
||||
// Created by ened-book-m1 on 2023/08/26.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import KissMe
|
||||
|
||||
|
||||
class DumpWebSocketData: NSObject {
|
||||
|
||||
}
|
||||
|
||||
|
||||
extension DumpWebSocketData: WebSocketDelegate {
|
||||
|
||||
func webSocket(_ webSocket: KissMe.WebSocket, didPingpong dateTime: String) {
|
||||
}
|
||||
|
||||
func webSocket(_ webSocket: WebSocket, didReceive data: Any) {
|
||||
guard let data = data as? Domestic.WebSocketData else { return }
|
||||
|
||||
switch data {
|
||||
case .contractPrice(let price):
|
||||
print("contractPrice \(price.shortCode)")
|
||||
case .askingPrice(let price):
|
||||
print("askingPrice \(price.shortCode)")
|
||||
case .contractNotice(let notice):
|
||||
print("askingPrice \(notice.shortCode)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func test_websocket_dump_data() {
|
||||
let isMock = false
|
||||
|
||||
let dumpData = DumpWebSocketData()
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
Task {
|
||||
guard let (account, approvalKey) = await test_get_websocket_key(isMock: isMock) else {
|
||||
return
|
||||
}
|
||||
|
||||
let webSocketCredential = KissWebSocketCredential(isMock: isMock, accountNo: account.accountNo, approvalKey: approvalKey)
|
||||
|
||||
var socket = Domestic.ContractPriceWebSocket(credential: webSocketCredential, productCode: KissConsole.defaultProductNo)
|
||||
socket.delegate = dumpData
|
||||
|
||||
do {
|
||||
try await socket.connect()
|
||||
let result = try await socket.subscribe()
|
||||
print(result)
|
||||
|
||||
try await Task.sleep(nanoseconds: 1_000_000_000 * 3)
|
||||
let result2 = try await socket.unsubscribe()
|
||||
print(result2)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
semaphore.signal()
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
|
||||
|
||||
func test_parse_contact_price_response() {
|
||||
let str = "{\"header\":{\"tr_id\":\"H0STCNT0\",\"tr_key\":\"005930\",\"encrypt\":\"N\"},\"body\":{\"rt_cd\":\"0\",\"msg_cd\":\"OPSP0000\",\"msg1\":\"SUBSCRIBE SUCCESS\",\"output\":{\"iv\":\"dcc3c442acfb8b9a\",\"key\":\"vcvxscahuklwkiawiuxbsfcmsulqjejf\"}}}0|H0STCNT0|001|005930^134305^68100^2^1000^1.49^68305.67^68300^68700^67900^68100^68000^1^11393808^778261604700^32559^26679^-5880^79.02^6084367^4807987^1^0.43^119.32^090027^5^-200^091809^5^-600^113615^2^200^20230824^20^N^309354^354766^2143494^2041321^0.19^6698642^170.09^0^^68300{\"header\":{\"tr_id\":\"PINGPONG\",\"datetime\":\"20230824212922\"}}"
|
||||
|
||||
do {
|
||||
let (dataArray, _) = try Domestic.WebSocketResult.parse(str)
|
||||
for data in dataArray {
|
||||
switch data {
|
||||
case .json(let str):
|
||||
print("json: \(str)")
|
||||
case .contractPrice(let price):
|
||||
print("contractPrice: \(price)")
|
||||
case .askingPrice(let price):
|
||||
print("askingPrice: \(price)")
|
||||
case .contractNotice(let notice):
|
||||
print("contractNotice: \(notice)")
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key_and_asking_price() {
|
||||
let isMock = false
|
||||
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
Task {
|
||||
guard let (account, approvalKey) = await test_get_websocket_key(isMock: isMock) else {
|
||||
return
|
||||
}
|
||||
|
||||
let webSocketCredential = KissWebSocketCredential(isMock: isMock, accountNo: account.accountNo, approvalKey: approvalKey)
|
||||
|
||||
var socket = Domestic.AskingPriceWebSocket(credential: webSocketCredential, productCode: KissConsole.defaultProductNo)
|
||||
|
||||
do {
|
||||
try await socket.connect()
|
||||
let result = try await socket.subscribe()
|
||||
print(result)
|
||||
|
||||
try await Task.sleep(nanoseconds: 1_000_000_000 * 3)
|
||||
let result2 = try await socket.unsubscribe()
|
||||
print(result2)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
semaphore.signal()
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key_and_contact_price() {
|
||||
let isMock = false
|
||||
|
||||
let semaphore = DispatchSemaphore(value: 0)
|
||||
Task {
|
||||
guard let (account, approvalKey) = await test_get_websocket_key(isMock: isMock) else {
|
||||
return
|
||||
}
|
||||
|
||||
let webSocketCredential = KissWebSocketCredential(isMock: isMock, accountNo: account.accountNo, approvalKey: approvalKey)
|
||||
|
||||
var socket = Domestic.ContractPriceWebSocket(credential: webSocketCredential, productCode: KissConsole.defaultProductNo)
|
||||
|
||||
do {
|
||||
try await socket.connect()
|
||||
let result = try await socket.subscribe()
|
||||
print(result)
|
||||
|
||||
try await Task.sleep(nanoseconds: 1_000_000_000 * 3)
|
||||
let result2 = try await socket.unsubscribe()
|
||||
print(result2)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
semaphore.signal()
|
||||
}
|
||||
semaphore.wait()
|
||||
}
|
||||
|
||||
|
||||
func test_get_websocket_key(isMock: Bool) async -> (KissAccount, String)? {
|
||||
let credential: Credential
|
||||
|
||||
do {
|
||||
credential = try KissCredential(isMock: isMock)
|
||||
} catch {
|
||||
print(error)
|
||||
return nil
|
||||
}
|
||||
|
||||
let account = KissAccount(credential: credential)
|
||||
do {
|
||||
/// Return existing valid key
|
||||
if let approvalKey = account.approvalKey {
|
||||
return (account, approvalKey)
|
||||
}
|
||||
|
||||
if try await account.login() {
|
||||
let approvalKey = try await account.getApprovalKey()
|
||||
print("approvalKey : \(approvalKey)")
|
||||
return (account, approvalKey)
|
||||
}
|
||||
} catch {
|
||||
print(error)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user