AcaMate_iOS/AcaMate/5. Manager/WebSocketManager.swift

82 lines
2.3 KiB
Swift

//
// WebSocketManager.swift
// AcaMate
//
// Created by TAnine on 2/17/25.
//
import Foundation
import Combine
import Starscream
// SignalR \u{1E}
class WebSocketManager: ObservableObject ,WebSocketDelegate {
@Published var socket: WebSocket?
@Published var receivedMessage: [String] = []
init() {
guard let url = URL(string: "\(WS_URL)/chatHub?transport=webSockets") else { return }
var request = URLRequest(url: url)
request.timeoutInterval = 5
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Upgrade", forHTTPHeaderField: "Connection")
socket = WebSocket(request: request)
socket?.delegate = self
}
func connect() {
socket?.connect()
printLog("TRY CONNECT SOCKET")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
let handShakeMsg = """
{"protocol":"json","version":1}\u{1E}
"""
self.socket?.write(string: handShakeMsg)
}
}
func disconnect() {
socket?.disconnect()
socket?.delegate = nil // : delegate
socket = nil // ,
printLog("CLOSE SOCKET")
}
func sendMessage(_ message: String) {
let json = """
{
"type": 1,
"target":"SendMessage",
"arguments":["iOS", "\(message)"]
}\u{1E}
"""
socket?.write(string: json)
printLog("SEND THE MESSAGE: \(message)")
}
func didReceive(event: Starscream.WebSocketEvent, client: any Starscream.WebSocketClient) {
switch event {
case .connected(let header):
printLog("CONNECTED : \(header)")
case .disconnected(let reason, let code):
printLog("DISCONNECTED: [\(code)] - \(reason)")
case .text(let text):
receivedMessage.append(text)
printLog("SERVER SAID: \(text)")
case .binary(let binary):
printLog("BINARY?: \(binary)")
case .error(let error):
printLog("ERROR!: \(error)")
case .cancelled:
printLog("SOCKET CONNECTED CANCELLED!!!")
default:
break
}
}
}