2024-12-19 17:16:17 +01:00

47 lines
1.3 KiB
Nim

import ../basics
import ./address
import ./connection
import ./error
type ConnectionQueue = AsyncQueue[NetworkConnection]
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
)
proc address*(server: NetworkServer): ?!NetworkAddress =
catch NetworkAddress(server.implementation.localAddress())
proc accept*(server: NetworkServer): Future[NetworkConnection] {.
async:(raises:[CancelledError])
.} =
await server.incoming.popFirst()
proc close*(server: NetworkServer) {.async:(raises:[NetworkError]).} =
convertNetworkErrors:
server.implementation.stop()
await server.implementation.closeWait()