11import { base64 } from 'ethers/lib/utils'
2- import { DEFAULT_METADATA } from 'src/config'
2+ import { DEFAULT_METADATA , DEFAULT_RPC_TIMEOUT_MS } from 'src/config'
33import { InitResponse , RPCMessages } from 'src/proto/api'
44import { IAttestorClient , IAttestorClientCreateOpts , RPCEvent , RPCRequestData , RPCResponseData , RPCType } from 'src/types'
5- import { AttestorError , getRpcRequestType , logger as LOGGER , packRpcMessages } from 'src/utils'
5+ import { AttestorError , generateRpcMessageId , getRpcRequestType , logger as LOGGER , packRpcMessages } from 'src/utils'
66import { AttestorSocket } from 'src/utils/socket-base'
77import { makeWebSocket as defaultMakeWebSocket } from 'src/utils/ws'
88
@@ -40,7 +40,7 @@ export class AttestorClient extends AttestorSocket implements IAttestorClient {
4040
4141 const initReqId = msg . messages [ 0 ] . id
4242 this . waitForInitPromise = this
43- . waitForResponse < 'init' > ( initReqId )
43+ . waitForResponse < 'init' > ( initReqId , DEFAULT_RPC_TIMEOUT_MS )
4444 . then ( res => {
4545 logger . info ( 'client initialised' )
4646 this . isInitialised = true
@@ -58,15 +58,15 @@ export class AttestorClient extends AttestorSocket implements IAttestorClient {
5858
5959 async rpc < T extends RPCType > (
6060 type : T ,
61- request : Partial < RPCRequestData < T > >
61+ request : Partial < RPCRequestData < T > > ,
62+ timeoutMs : number = DEFAULT_RPC_TIMEOUT_MS
6263 ) {
6364 this . logger . debug ( { type } , 'sending rpc request' )
6465 const now = Date . now ( )
6566 try {
66- const {
67- messages : [ { id } ]
68- } = await this . sendMessage ( { [ getRpcRequestType ( type ) ] : request } )
69- const rslt = await this . waitForResponse < T > ( id )
67+ const msgId = generateRpcMessageId ( )
68+ const rslt = await this . waitForResponse < T > ( msgId , timeoutMs )
69+ await this . sendMessage ( { id : msgId , [ getRpcRequestType ( type ) ] : request } )
7070
7171 return rslt
7272 } finally {
@@ -75,7 +75,10 @@ export class AttestorClient extends AttestorSocket implements IAttestorClient {
7575 }
7676 }
7777
78- waitForResponse < T extends RPCType > ( id : number ) {
78+ waitForResponse < T extends RPCType > (
79+ id : number ,
80+ timeoutMs : number = DEFAULT_RPC_TIMEOUT_MS
81+ ) {
7982 if ( this . isClosed ) {
8083 throw new AttestorError (
8184 'ERROR_NETWORK_ERROR' ,
@@ -118,7 +121,19 @@ export class AttestorClient extends AttestorSocket implements IAttestorClient {
118121 reject ( event . data )
119122 }
120123
124+ const timeout = setTimeout ( ( ) => {
125+ removeHandlers ( )
126+ reject (
127+ new AttestorError (
128+ 'ERROR_TIMEOUT' ,
129+ `RPC request timed out after ${ timeoutMs } ms` ,
130+ { id }
131+ )
132+ )
133+ } , timeoutMs )
134+
121135 const removeHandlers = ( ) => {
136+ clearTimeout ( timeout )
122137 this . removeEventListener ( 'rpc-response' , handler )
123138 this . removeEventListener ( 'connection-terminated' , terminateHandler )
124139 }
0 commit comments