1- // 
2- //  Created by lucio on 4/8/25.
3- // 
4- 
51#ifndef  RPCLITE_CLIENT_H
62#define  RPCLITE_CLIENT_H 
73#include  " error.h" 
117
128class  RPCClient  {
139    RpcDecoder<>* decoder = nullptr ;
10+     int  _waiting_msg_id;
1411
1512public: 
1613    RpcError lastError;
1714
1815    RPCClient (ITransport& t) : decoder(&RpcDecoderManager<>::getDecoder(t)) {}
1916
20-     RPCClient (Stream& stream) {
21-         ITransport* transport = (ITransport*) new  SerialTransport (stream);
22-         decoder = &RpcDecoderManager<>::getDecoder (*transport);
23-     }
17+     //  This constructor was removed because it leads to decoder duplication
18+     //  RPCClient(Stream& stream) {
19+     //      ITransport* transport = (ITransport*) new SerialTransport(stream);
20+     //      decoder = &RpcDecoderManager<>::getDecoder(*transport);
21+     //  }
2422
2523    template <typename ... Args>
2624    void  notify (const  MsgPack::str_t  method, Args&&... args)  {
@@ -31,23 +29,44 @@ class RPCClient {
3129    template <typename  RType, typename ... Args>
3230    bool  call (const  MsgPack::str_t  method, RType& result, Args&&... args) {
3331
34-         int  msg_id;
35-         if  (!decoder->send_call (CALL_MSG, method, msg_id, std::forward<Args>(args)...)){
32+         if (!send_rpc (method, std::forward<Args>(args)...)) {
33+             lastError.code  = GENERIC_ERR;
34+             lastError.traceback  = " Failed to send RPC call" 
35+             return  false ;
3636        }
3737
38-         RpcError error;
3938        //  blocking call
40-         while  (!decoder->get_response (msg_id, result, error)){
41-             decoder->decode ();
39+         while  (!get_response (result)){
4240            // delay(1);
4341        }
4442
45-         lastError.code  = error.code ;
46-         lastError.traceback  = error.traceback ;
43+         return  (lastError.code  == NO_ERR);
44+ 
45+     }
46+ 
47+     template <typename ... Args>
48+     bool  send_rpc (const  MsgPack::str_t  method, Args&&... args) {
49+         int  msg_id;
50+         if  (decoder->send_call (CALL_MSG, method, msg_id, std::forward<Args>(args)...)) {
51+             _waiting_msg_id = msg_id;
52+             return  true ;
53+         }
54+         return  false ;
55+     }
4756
48-         return  (error.code  == NO_ERR);
57+     template <typename  RType>
58+     bool  get_response (RType& result) {
59+         RpcError tmp_error;
60+         decoder->decode ();
4961
62+         if  (decoder->get_response (_waiting_msg_id, result, tmp_error)) {
63+             lastError.code  = tmp_error.code ;
64+             lastError.traceback  = tmp_error.traceback ;
65+             return  true ;
66+         }
67+         return  false ;
5068    }
69+ 
5170};
5271
5372#endif  // RPCLITE_CLIENT_H
0 commit comments