47 lines
1.3 KiB
Nim
Raw Permalink Normal View History

2024-12-18 14:53:06 +01:00
import ../basics
import ./address
import ./connection
import ./error
2024-12-18 14:53:06 +01:00
type ConnectionQueue = AsyncQueue[NetworkConnection]
2024-12-18 14:53:06 +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 =
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
proc close*(server: NetworkServer) {.async:(raises:[NetworkError]).} =
convertNetworkErrors:
server.implementation.stop()
await server.implementation.closeWait()