Skip to content

Commit 4331990

Browse files
authored
add raises to close functions (#245)
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)
1 parent ecccba8 commit 4331990

File tree

8 files changed

+15
-13
lines changed

8 files changed

+15
-13
lines changed

json_rpc/client.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ proc call*(client: RpcClient, name: string,
140140
{.async: (raw: true).} =
141141
client.call(name, params.paramsTx)
142142

143-
method close*(client: RpcClient): Future[void] {.base, async.} =
143+
method close*(client: RpcClient): Future[void] {.base, async: (raises: []).} =
144144
raiseAssert("`RpcClient.close` not implemented")
145145

146146
method callBatch*(client: RpcClient,

json_rpc/clients/httpclient.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ proc connect*(client: RpcHttpClient, address: string, port: Port, secure: bool)
220220
client.httpAddress = getAddress(client.httpSession, uri).valueOr:
221221
raise newException(RpcAddressUnresolvableError, error)
222222

223-
method close*(client: RpcHttpClient) {.async.} =
223+
method close*(client: RpcHttpClient) {.async: (raises: []).} =
224224
if not client.httpSession.isNil:
225225
await client.httpSession.closeWait()
226226

json_rpc/clients/socketclient.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ proc connect*(client: RpcSocketClient, address: TransportAddress) {.async.} =
135135
client.address = address
136136
client.loop = processData(client)
137137

138-
method close*(client: RpcSocketClient) {.async.} =
138+
method close*(client: RpcSocketClient) {.async: (raises: []).} =
139139
await client.loop.cancelAndWait()
140140
if not client.transport.isNil:
141141
client.transport.close()

json_rpc/clients/websocketclientimpl.nim

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,12 @@ proc connect*(
151151
client.uri = uri
152152
client.loop = processData(client)
153153

154-
method close*(client: RpcWebSocketClient) {.async.} =
154+
method close*(client: RpcWebSocketClient) {.async: (raises: []).} =
155155
await client.loop.cancelAndWait()
156156
if not client.transport.isNil:
157-
await client.transport.close()
157+
try:
158+
# TODO https://github.com/status-im/nim-websock/pull/178
159+
await noCancel client.transport.close()
160+
except CatchableError as exc:
161+
warn "Unexpected exception while closing transport", err = exc.msg
158162
client.transport = nil

json_rpc/rpcproxy.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ proc registerProxyMethod*(proxy: var RpcProxy, methodName: string) =
120120
# Adding proc type to table gives invalid exception tracking, see Nim bug: https://github.com/nim-lang/Nim/issues/18376
121121
raiseAssert err.msg
122122

123-
proc stop*(proxy: RpcProxy) {.async.} =
123+
proc stop*(proxy: RpcProxy) {.async: (raises: []).} =
124124
await proxy.getClient().close()
125125
await proxy.rpcHttpServer.stop()
126126

127-
proc closeWait*(proxy: RpcProxy) {.async.} =
127+
proc closeWait*(proxy: RpcProxy) {.async: (raises: []).} =
128128
await proxy.rpcHttpServer.closeWait()
129129

130130
func localAddress*(proxy: RpcProxy): seq[TransportAddress] =

json_rpc/servers/httpserver.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,13 @@ proc start*(server: RpcHttpServer) =
258258
info "Starting JSON-RPC HTTP server", url = item.baseUri
259259
item.start()
260260

261-
proc stop*(server: RpcHttpServer) {.async.} =
261+
proc stop*(server: RpcHttpServer) {.async: (raises: []).} =
262262
## Stop the RPC server.
263263
for item in server.httpServers:
264264
await item.stop()
265265
info "Stopped JSON-RPC HTTP server", url = item.baseUri
266266

267-
proc closeWait*(server: RpcHttpServer) {.async.} =
267+
proc closeWait*(server: RpcHttpServer) {.async: (raises: []).} =
268268
## Cleanup resources of RPC server.
269269
for item in server.httpServers:
270270
await item.closeWait()

json_rpc/servers/socketserver.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ proc close*(server: RpcSocketServer) =
127127
for item in server.servers:
128128
item.close()
129129

130-
proc closeWait*(server: RpcSocketServer) {.async.} =
130+
proc closeWait*(server: RpcSocketServer) {.async: (raises: []).} =
131131
## Cleanup resources of RPC server.
132132
for item in server.servers:
133133
await item.closeWait()

json_rpc/servers/websocketserver.nim

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
import
1313
chronicles, chronos, websock/[websock, types],
1414
websock/extensions/compression/deflate,
15-
stew/byteutils,
1615
json_serialization/std/net as jsnet,
17-
1816
../[errors, server]
1917

2018
export errors, server, jsnet
@@ -246,7 +244,7 @@ proc close*(server: RpcWebSocketServer) =
246244
## Cleanup resources of RPC server.
247245
server.server.close()
248246

249-
proc closeWait*(server: RpcWebSocketServer) {.async.} =
247+
proc closeWait*(server: RpcWebSocketServer) {.async: (raises: []).} =
250248
## Cleanup resources of RPC server.
251249
await server.server.closeWait()
252250

0 commit comments

Comments
 (0)