From ce1c14fa01f0b9dafb1d7b0118c475556d54dd7d Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Tue, 19 Aug 2025 14:07:06 +0200 Subject: [PATCH 1/3] re-export `json_serialization/pkg/chronos` where needed ...and prepare for https://github.com/status-im/nim-json-serialization/pull/128 --- json_rpc/clients/httpclient.nim | 12 +++++++++--- json_rpc/clients/socketclient.nim | 8 +++++++- json_rpc/private/jrpc_sys.nim | 6 ++---- json_rpc/private/utils.nim | 10 ++++++++++ json_rpc/servers/httpserver.nim | 6 ++++++ json_rpc/servers/socketserver.nim | 7 ++++++- json_rpc/servers/websocketserver.nim | 16 +++++++++++----- 7 files changed, 51 insertions(+), 14 deletions(-) diff --git a/json_rpc/clients/httpclient.nim b/json_rpc/clients/httpclient.nim index 52b5300..3b014f3 100644 --- a/json_rpc/clients/httpclient.nim +++ b/json_rpc/clients/httpclient.nim @@ -13,11 +13,17 @@ import std/[tables, uri], stew/byteutils, results, - chronos/apps/http/httpclient as chronosHttpClient, - chronicles, httputils, json_serialization/std/net, + chronos/apps/http/httpclient, + chronicles, httputils, ../client, ../errors, - ../private/jrpc_sys + ../private/[jrpc_sys, utils] + +when tryImport json_serialization/pkg/chronos as jschronos: + export jschronos +else: + import json_serialization/std/net as jsnet + export jsnet export client, errors, HttpClientFlag, HttpClientFlags diff --git a/json_rpc/clients/socketclient.nim b/json_rpc/clients/socketclient.nim index 1f83c31..d3a4cf6 100644 --- a/json_rpc/clients/socketclient.nim +++ b/json_rpc/clients/socketclient.nim @@ -16,7 +16,13 @@ import chronos, ../client, ../errors, - ../private/jrpc_sys + ../private/[jrpc_sys, utils] + +when tryImport json_serialization/pkg/chronos as jschronos: + export jschronos +else: + import json_serialization/std/net as jsnet + export jsnet export client, errors diff --git a/json_rpc/private/jrpc_sys.nim b/json_rpc/private/jrpc_sys.nim index cc76dd3..1bd4d42 100644 --- a/json_rpc/private/jrpc_sys.nim +++ b/json_rpc/private/jrpc_sys.nim @@ -13,11 +13,9 @@ import std/hashes, results, json_serialization, - json_serialization/pkg/results as jser_results + json_serialization/pkg/results as jsresults -export - results, - json_serialization +export results, json_serialization, jsresults # This module implements JSON-RPC 2.0 Specification # https://www.jsonrpc.org/specification diff --git a/json_rpc/private/utils.nim b/json_rpc/private/utils.nim index d6b8f19..7198f7d 100644 --- a/json_rpc/private/utils.nim +++ b/json_rpc/private/utils.nim @@ -1,5 +1,15 @@ import chronos, ../errors +template tryImport*(v: untyped): bool = + # TODO https://github.com/nim-lang/Nim/issues/25108 + template importTest = + import v + when compiles(importTest): + importTest + true + else: + false + from std/net import IPv6_any, IPv4_any template processResolvedAddresses(what: string) = diff --git a/json_rpc/servers/httpserver.nim b/json_rpc/servers/httpserver.nim index 68acc90..441feb2 100644 --- a/json_rpc/servers/httpserver.nim +++ b/json_rpc/servers/httpserver.nim @@ -17,6 +17,12 @@ import ../errors, ../server +when tryImport json_serialization/pkg/chronos as jschronos: + export jschronos +else: + import json_serialization/std/net as jsnet + export jsnet + export server, shttpserver diff --git a/json_rpc/servers/socketserver.nim b/json_rpc/servers/socketserver.nim index b218fee..bc5ade8 100644 --- a/json_rpc/servers/socketserver.nim +++ b/json_rpc/servers/socketserver.nim @@ -12,11 +12,16 @@ import std/sequtils, chronicles, - json_serialization/std/net, ../private/utils, ../errors, ../server +when tryImport json_serialization/pkg/chronos as jschronos: + export jschronos +else: + import json_serialization/std/net as jsnet + export jsnet + export errors, server type diff --git a/json_rpc/servers/websocketserver.nim b/json_rpc/servers/websocketserver.nim index 2530283..44ceec6 100644 --- a/json_rpc/servers/websocketserver.nim +++ b/json_rpc/servers/websocketserver.nim @@ -12,10 +12,17 @@ import chronicles, chronos, websock/[websock, types], websock/extensions/compression/deflate, - stew/byteutils, json_serialization/std/net, - ".."/[errors, server] + stew/byteutils, + ../[errors, server], + ../private/utils -export errors, server, net +when tryImport json_serialization/pkg/chronos as jschronos: + export jschronos +else: + import json_serialization/std/net as jsnet + export jsnet + +export errors, server logScope: topics = "JSONRPC-WS-SERVER" @@ -84,8 +91,7 @@ proc serveHTTP*(rpc: RpcWebSocketHandler, request: HttpRequest) proc handleRequest(rpc: RpcWebSocketServer, request: HttpRequest) {.async: (raises: [CancelledError]).} = - trace "Handling request:", uri = request.uri.path - trace "Initiating web socket connection." + trace "Handling request:", uri = $request.uri # if hook result is false, # it means we should return immediately From 2053e1fd75ea453e93f561cd460eef447ec5958a Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 27 Aug 2025 11:49:43 +0200 Subject: [PATCH 2/3] rely on backwards compat for easier upgrade path --- json_rpc/clients/httpclient.nim | 33 ++++++++++------------------ json_rpc/clients/socketclient.nim | 11 +++------- json_rpc/private/utils.nim | 10 --------- json_rpc/servers/httpserver.nim | 9 ++------ json_rpc/servers/socketserver.nim | 9 ++------ json_rpc/servers/websocketserver.nim | 11 +++------- 6 files changed, 22 insertions(+), 61 deletions(-) diff --git a/json_rpc/clients/httpclient.nim b/json_rpc/clients/httpclient.nim index 3b014f3..29b2fbb 100644 --- a/json_rpc/clients/httpclient.nim +++ b/json_rpc/clients/httpclient.nim @@ -15,18 +15,13 @@ import results, chronos/apps/http/httpclient, chronicles, httputils, + json_serialization/std/net as jsnet, ../client, ../errors, - ../private/[jrpc_sys, utils] - -when tryImport json_serialization/pkg/chronos as jschronos: - export jschronos -else: - import json_serialization/std/net as jsnet - export jsnet + ../private/jrpc_sys export - client, errors, HttpClientFlag, HttpClientFlags + client, errors, jsnet, HttpClientFlag, HttpClientFlags logScope: topics = "JSONRPC-HTTP-CLIENT" @@ -37,7 +32,7 @@ type RpcHttpClient* = ref object of RpcClient httpSession: HttpSessionRef - httpAddress: HttpResult[HttpAddress] + httpAddress: HttpAddress maxBodySize: int getHeaders: GetJsonRpcRequestHeaders @@ -82,8 +77,9 @@ template closeRefs(req, res: untyped) = proc callImpl(client: RpcHttpClient, reqBody: string): Future[string] {.async.} = doAssert client.httpSession != nil - if client.httpAddress.isErr: - raise newException(RpcAddressUnresolvableError, client.httpAddress.error) + if client.httpAddress.addresses.len == 0: + raise newException(RpcPostError, "Not connected") + var headers = if not isNil(client.getHeaders): @@ -96,7 +92,7 @@ proc callImpl(client: RpcHttpClient, reqBody: string): Future[string] {.async.} var res: HttpClientResponseRef req = HttpClientRequestRef.post(client.httpSession, - client.httpAddress.get, + client.httpAddress, body = reqBody.toOpenArrayByte(0, reqBody.len - 1), headers = headers) res = @@ -146,13 +142,12 @@ proc newRpcHttpClient*( method call*(client: RpcHttpClient, name: string, params: RequestParamsTx): Future[JsonString] {.async.} = - let id = client.getNextId() reqBody = requestTxEncode(name, params, id) debug "Sending JSON-RPC request", - address = client.httpAddress, len = len(reqBody), name, id + address = $client.httpAddress, len = len(reqBody), name, id trace "Message", msg = reqBody let resText = await client.callImpl(reqBody) @@ -213,20 +208,16 @@ method callBatch*(client: RpcHttpClient, raise newException(InvalidResponse, "Invalid response") proc connect*(client: RpcHttpClient, url: string) {.async.} = - client.httpAddress = client.httpSession.getAddress(url) - if client.httpAddress.isErr: + client.httpAddress = client.httpSession.getAddress(url).valueOr: raise newException(RpcAddressUnresolvableError, client.httpAddress.error) proc connect*(client: RpcHttpClient, address: string, port: Port, secure: bool) {.async.} = - var uri = Uri( + let uri = Uri( scheme: if secure: "https" else: "http", hostname: address, port: $port) - let res = getAddress(client.httpSession, uri) - if res.isOk: - client.httpAddress = res - else: + client.httpAddress = getAddress(client.httpSession, uri).valueOr: raise newException(RpcAddressUnresolvableError, res.error) method close*(client: RpcHttpClient) {.async.} = diff --git a/json_rpc/clients/socketclient.nim b/json_rpc/clients/socketclient.nim index d3a4cf6..292ea86 100644 --- a/json_rpc/clients/socketclient.nim +++ b/json_rpc/clients/socketclient.nim @@ -14,17 +14,12 @@ import chronicles, results, chronos, + json_serialization/std/net as jsnet, ../client, ../errors, - ../private/[jrpc_sys, utils] + ../private/jrpc_sys -when tryImport json_serialization/pkg/chronos as jschronos: - export jschronos -else: - import json_serialization/std/net as jsnet - export jsnet - -export client, errors +export client, errors, jsnet logScope: topics = "JSONRPC-SOCKET-CLIENT" diff --git a/json_rpc/private/utils.nim b/json_rpc/private/utils.nim index 7198f7d..d6b8f19 100644 --- a/json_rpc/private/utils.nim +++ b/json_rpc/private/utils.nim @@ -1,15 +1,5 @@ import chronos, ../errors -template tryImport*(v: untyped): bool = - # TODO https://github.com/nim-lang/Nim/issues/25108 - template importTest = - import v - when compiles(importTest): - importTest - true - else: - false - from std/net import IPv6_any, IPv4_any template processResolvedAddresses(what: string) = diff --git a/json_rpc/servers/httpserver.nim b/json_rpc/servers/httpserver.nim index 441feb2..94bb106 100644 --- a/json_rpc/servers/httpserver.nim +++ b/json_rpc/servers/httpserver.nim @@ -13,18 +13,13 @@ import std/sequtils, chronicles, httputils, chronos, chronos/apps/http/[httpserver, shttpserver], + json_serialization/std/net as jsnet, ../private/utils, ../errors, ../server -when tryImport json_serialization/pkg/chronos as jschronos: - export jschronos -else: - import json_serialization/std/net as jsnet - export jsnet - export - server, shttpserver + server, shttpserver, jsnet logScope: topics = "JSONRPC-HTTP-SERVER" diff --git a/json_rpc/servers/socketserver.nim b/json_rpc/servers/socketserver.nim index bc5ade8..2bac2b8 100644 --- a/json_rpc/servers/socketserver.nim +++ b/json_rpc/servers/socketserver.nim @@ -12,17 +12,12 @@ import std/sequtils, chronicles, + json_serialization/std/net as jsnet, ../private/utils, ../errors, ../server -when tryImport json_serialization/pkg/chronos as jschronos: - export jschronos -else: - import json_serialization/std/net as jsnet - export jsnet - -export errors, server +export errors, server, jsnet type RpcSocketServer* = ref object of RpcServer diff --git a/json_rpc/servers/websocketserver.nim b/json_rpc/servers/websocketserver.nim index 44ceec6..84fcd85 100644 --- a/json_rpc/servers/websocketserver.nim +++ b/json_rpc/servers/websocketserver.nim @@ -13,16 +13,11 @@ import chronicles, chronos, websock/[websock, types], websock/extensions/compression/deflate, stew/byteutils, - ../[errors, server], - ../private/utils + json_serialization/std/net as jsnet, -when tryImport json_serialization/pkg/chronos as jschronos: - export jschronos -else: - import json_serialization/std/net as jsnet - export jsnet + ../[errors, server] -export errors, server +export errors, server, jsnet logScope: topics = "JSONRPC-WS-SERVER" From c0f5e87594fbaad0f409f3d1c33a1ae8916f0b37 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 27 Aug 2025 11:51:59 +0200 Subject: [PATCH 3/3] oops --- json_rpc/clients/httpclient.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/json_rpc/clients/httpclient.nim b/json_rpc/clients/httpclient.nim index 29b2fbb..ac9bb73 100644 --- a/json_rpc/clients/httpclient.nim +++ b/json_rpc/clients/httpclient.nim @@ -209,7 +209,7 @@ method callBatch*(client: RpcHttpClient, proc connect*(client: RpcHttpClient, url: string) {.async.} = client.httpAddress = client.httpSession.getAddress(url).valueOr: - raise newException(RpcAddressUnresolvableError, client.httpAddress.error) + raise newException(RpcAddressUnresolvableError, error) proc connect*(client: RpcHttpClient, address: string, port: Port, secure: bool) {.async.} = let uri = Uri( @@ -218,7 +218,7 @@ proc connect*(client: RpcHttpClient, address: string, port: Port, secure: bool) port: $port) client.httpAddress = getAddress(client.httpSession, uri).valueOr: - raise newException(RpcAddressUnresolvableError, res.error) + raise newException(RpcAddressUnresolvableError, error) method close*(client: RpcHttpClient) {.async.} = if not client.httpSession.isNil: