UNPKG

@solana/web3.js

Version:
76 lines (73 loc) 2.1 kB
import { CommonClient, ICommonWebSocket, IWSClientAdditionalOptions, NodeWebSocketType, NodeWebSocketTypeOptions, WebSocket as createRpc, } from 'rpc-websockets'; interface IHasReadyState { readyState: WebSocket['readyState']; } export default class RpcWebSocketClient extends CommonClient { private underlyingSocket: IHasReadyState | undefined; constructor( address?: string, options?: IWSClientAdditionalOptions & NodeWebSocketTypeOptions, generate_request_id?: ( method: string, params: object | Array<any>, ) => number, ) { const webSocketFactory = (url: string) => { const rpc = createRpc(url, { autoconnect: true, max_reconnects: 5, reconnect: true, reconnect_interval: 1000, ...options, }); if ('socket' in rpc) { this.underlyingSocket = rpc.socket as ReturnType<typeof createRpc>; } else { this.underlyingSocket = rpc as NodeWebSocketType; } return rpc as ICommonWebSocket; }; super(webSocketFactory, address, options, generate_request_id); } call( ...args: Parameters<CommonClient['call']> ): ReturnType<CommonClient['call']> { const readyState = this.underlyingSocket?.readyState; if (readyState === 1 /* WebSocket.OPEN */) { return super.call(...args); } return Promise.reject( new Error( 'Tried to call a JSON-RPC method `' + args[0] + '` but the socket was not `CONNECTING` or `OPEN` (`readyState` was ' + readyState + ')', ), ); } notify( ...args: Parameters<CommonClient['notify']> ): ReturnType<CommonClient['notify']> { const readyState = this.underlyingSocket?.readyState; if (readyState === 1 /* WebSocket.OPEN */) { return super.notify(...args); } return Promise.reject( new Error( 'Tried to send a JSON-RPC notification `' + args[0] + '` but the socket was not `CONNECTING` or `OPEN` (`readyState` was ' + readyState + ')', ), ); } }