From 4397ad26f37099854a02006e318520269fb480fb Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Thu, 13 Nov 2025 11:07:51 +0100 Subject: [PATCH] add `raises` to close functions although these functions don't quite follow chronos 4 naming standards (`closeWait` for `async` waiting close, `close` for sync background close, `join` for `close` notification), they still shouldn't raise exceptions, ever, and should not allow themselves to be cancelled (to simplify reasoning about closing) --- json_rpc/client.nim | 2 +- json_rpc/clients/httpclient.nim | 2 +- json_rpc/clients/socketclient.nim | 2 +- json_rpc/clients/websocketclientimpl.nim | 8 ++++++-- json_rpc/rpcproxy.nim | 4 ++-- json_rpc/servers/httpserver.nim | 4 ++-- json_rpc/servers/socketserver.nim | 2 +- json_rpc/servers/websocketserver.nim | 4 +--- 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/json_rpc/client.nim b/json_rpc/client.nim index 99ccf9d..a198098 100644 --- a/json_rpc/client.nim +++ b/json_rpc/client.nim @@ -140,7 +140,7 @@ proc call*(client: RpcClient, name: string, {.async: (raw: true).} = client.call(name, params.paramsTx) -method close*(client: RpcClient): Future[void] {.base, async.} = +method close*(client: RpcClient): Future[void] {.base, async: (raises: []).} = raiseAssert("`RpcClient.close` not implemented") method callBatch*(client: RpcClient, diff --git a/json_rpc/clients/httpclient.nim b/json_rpc/clients/httpclient.nim index ac9bb73..3c73b6f 100644 --- a/json_rpc/clients/httpclient.nim +++ b/json_rpc/clients/httpclient.nim @@ -220,7 +220,7 @@ proc connect*(client: RpcHttpClient, address: string, port: Port, secure: bool) client.httpAddress = getAddress(client.httpSession, uri).valueOr: raise newException(RpcAddressUnresolvableError, error) -method close*(client: RpcHttpClient) {.async.} = +method close*(client: RpcHttpClient) {.async: (raises: []).} = if not client.httpSession.isNil: await client.httpSession.closeWait() diff --git a/json_rpc/clients/socketclient.nim b/json_rpc/clients/socketclient.nim index 292ea86..0017df4 100644 --- a/json_rpc/clients/socketclient.nim +++ b/json_rpc/clients/socketclient.nim @@ -135,7 +135,7 @@ proc connect*(client: RpcSocketClient, address: TransportAddress) {.async.} = client.address = address client.loop = processData(client) -method close*(client: RpcSocketClient) {.async.} = +method close*(client: RpcSocketClient) {.async: (raises: []).} = await client.loop.cancelAndWait() if not client.transport.isNil: client.transport.close() diff --git a/json_rpc/clients/websocketclientimpl.nim b/json_rpc/clients/websocketclientimpl.nim index 55bd0c5..1619ab0 100644 --- a/json_rpc/clients/websocketclientimpl.nim +++ b/json_rpc/clients/websocketclientimpl.nim @@ -151,8 +151,12 @@ proc connect*( client.uri = uri client.loop = processData(client) -method close*(client: RpcWebSocketClient) {.async.} = +method close*(client: RpcWebSocketClient) {.async: (raises: []).} = await client.loop.cancelAndWait() if not client.transport.isNil: - await client.transport.close() + try: + # TODO https://github.com/status-im/nim-websock/pull/178 + await noCancel client.transport.close() + except CatchableError as exc: + warn "Unexpected exception while closing transport", err = exc.msg client.transport = nil diff --git a/json_rpc/rpcproxy.nim b/json_rpc/rpcproxy.nim index 89e8918..6bab43a 100644 --- a/json_rpc/rpcproxy.nim +++ b/json_rpc/rpcproxy.nim @@ -120,11 +120,11 @@ proc registerProxyMethod*(proxy: var RpcProxy, methodName: string) = # Adding proc type to table gives invalid exception tracking, see Nim bug: https://github.com/nim-lang/Nim/issues/18376 raiseAssert err.msg -proc stop*(proxy: RpcProxy) {.async.} = +proc stop*(proxy: RpcProxy) {.async: (raises: []).} = await proxy.getClient().close() await proxy.rpcHttpServer.stop() -proc closeWait*(proxy: RpcProxy) {.async.} = +proc closeWait*(proxy: RpcProxy) {.async: (raises: []).} = await proxy.rpcHttpServer.closeWait() func localAddress*(proxy: RpcProxy): seq[TransportAddress] = diff --git a/json_rpc/servers/httpserver.nim b/json_rpc/servers/httpserver.nim index 94bb106..b4e8233 100644 --- a/json_rpc/servers/httpserver.nim +++ b/json_rpc/servers/httpserver.nim @@ -258,13 +258,13 @@ proc start*(server: RpcHttpServer) = info "Starting JSON-RPC HTTP server", url = item.baseUri item.start() -proc stop*(server: RpcHttpServer) {.async.} = +proc stop*(server: RpcHttpServer) {.async: (raises: []).} = ## Stop the RPC server. for item in server.httpServers: await item.stop() info "Stopped JSON-RPC HTTP server", url = item.baseUri -proc closeWait*(server: RpcHttpServer) {.async.} = +proc closeWait*(server: RpcHttpServer) {.async: (raises: []).} = ## Cleanup resources of RPC server. for item in server.httpServers: await item.closeWait() diff --git a/json_rpc/servers/socketserver.nim b/json_rpc/servers/socketserver.nim index 2bac2b8..337edb3 100644 --- a/json_rpc/servers/socketserver.nim +++ b/json_rpc/servers/socketserver.nim @@ -127,7 +127,7 @@ proc close*(server: RpcSocketServer) = for item in server.servers: item.close() -proc closeWait*(server: RpcSocketServer) {.async.} = +proc closeWait*(server: RpcSocketServer) {.async: (raises: []).} = ## Cleanup resources of RPC server. for item in server.servers: await item.closeWait() diff --git a/json_rpc/servers/websocketserver.nim b/json_rpc/servers/websocketserver.nim index 84fcd85..444cc41 100644 --- a/json_rpc/servers/websocketserver.nim +++ b/json_rpc/servers/websocketserver.nim @@ -12,9 +12,7 @@ import chronicles, chronos, websock/[websock, types], websock/extensions/compression/deflate, - stew/byteutils, json_serialization/std/net as jsnet, - ../[errors, server] export errors, server, jsnet @@ -246,7 +244,7 @@ proc close*(server: RpcWebSocketServer) = ## Cleanup resources of RPC server. server.server.close() -proc closeWait*(server: RpcWebSocketServer) {.async.} = +proc closeWait*(server: RpcWebSocketServer) {.async: (raises: []).} = ## Cleanup resources of RPC server. await server.server.closeWait()