mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-13 19:10:39 +00:00
44 lines
1.5 KiB
Swift
44 lines
1.5 KiB
Swift
import Foundation
|
|
import Network
|
|
import os
|
|
|
|
enum TCPProbe {
|
|
static func probe(host: String, port: Int, timeoutSeconds: Double, queueLabel: String) async -> Bool {
|
|
guard port >= 1, port <= 65535 else { return false }
|
|
guard let nwPort = NWEndpoint.Port(rawValue: UInt16(port)) else { return false }
|
|
|
|
let endpointHost = NWEndpoint.Host(host)
|
|
let connection = NWConnection(host: endpointHost, port: nwPort, using: .tcp)
|
|
|
|
return await withCheckedContinuation { cont in
|
|
let queue = DispatchQueue(label: queueLabel)
|
|
let finished = OSAllocatedUnfairLock(initialState: false)
|
|
let finish: @Sendable (Bool) -> Void = { ok in
|
|
let shouldResume = finished.withLock { flag -> Bool in
|
|
if flag { return false }
|
|
flag = true
|
|
return true
|
|
}
|
|
guard shouldResume else { return }
|
|
connection.cancel()
|
|
cont.resume(returning: ok)
|
|
}
|
|
|
|
connection.stateUpdateHandler = { state in
|
|
switch state {
|
|
case .ready:
|
|
finish(true)
|
|
case .failed, .cancelled:
|
|
finish(false)
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
connection.start(queue: queue)
|
|
queue.asyncAfter(deadline: .now() + timeoutSeconds) { finish(false) }
|
|
}
|
|
}
|
|
}
|
|
|