2024-12-18 14:53:06 +01:00
|
|
|
import ../basics
|
|
|
|
|
import ./address
|
2024-12-19 17:16:17 +01:00
|
|
|
import ./connection
|
|
|
|
|
import ./error
|
2024-12-18 14:53:06 +01:00
|
|
|
|
2024-12-19 17:16:17 +01:00
|
|
|
type ConnectionQueue = AsyncQueue[NetworkConnection]
|
2024-12-18 14:53:06 +01:00
|
|
|
|
2024-12-19 17:16:17 +01:00
|
|
|
func new(_: type ConnectionQueue, maxSize: int): ConnectionQueue =
|
|
|
|
|
newAsyncQueue[NetworkConnection](maxSize)
|
|
|
|
|
|
|
|
|
|
func createStreamCallback(queue: ConnectionQueue): auto =
|
|
|
|
|
proc(_: StreamServer, stream: StreamTransport) {.async:(raises:[]).} =
|
|
|
|
|
try:
|
|
|
|
|
await queue.addLast(NetworkConnection(stream))
|
|
|
|
|
except CancelledError:
|
|
|
|
|
discard
|
|
|
|
|
|
|
|
|
|
type NetworkServer* = ref object
|
|
|
|
|
implementation: StreamServer
|
|
|
|
|
incoming: ConnectionQueue
|
|
|
|
|
|
|
|
|
|
proc open*(_: type NetworkServer): Future[NetworkServer] {.
|
|
|
|
|
async:(raises:[NetworkError])
|
|
|
|
|
.} =
|
|
|
|
|
convertNetworkErrors:
|
|
|
|
|
let incoming = ConnectionQueue.new(1)
|
|
|
|
|
let callback = incoming.createStreamCallback()
|
|
|
|
|
let server = createStreamServer(callback, Port(0))
|
|
|
|
|
server.start()
|
|
|
|
|
NetworkServer(
|
|
|
|
|
implementation: server,
|
|
|
|
|
incoming: incoming
|
|
|
|
|
)
|
2024-12-18 14:53:06 +01:00
|
|
|
|
|
|
|
|
proc address*(server: NetworkServer): ?!NetworkAddress =
|
2024-12-19 17:16:17 +01:00
|
|
|
catch NetworkAddress(server.implementation.localAddress())
|
|
|
|
|
|
|
|
|
|
proc accept*(server: NetworkServer): Future[NetworkConnection] {.
|
|
|
|
|
async:(raises:[CancelledError])
|
|
|
|
|
.} =
|
|
|
|
|
await server.incoming.popFirst()
|
2024-12-18 14:53:06 +01:00
|
|
|
|
2024-12-19 17:16:17 +01:00
|
|
|
proc close*(server: NetworkServer) {.async:(raises:[NetworkError]).} =
|
|
|
|
|
convertNetworkErrors:
|
|
|
|
|
server.implementation.stop()
|
|
|
|
|
await server.implementation.closeWait()
|