/* This file is part of web3.js. web3.js is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. web3.js is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ import fetch from 'cross-fetch'; import { EthExecutionAPI, JsonRpcResponseWithResult, Web3APIMethod, Web3APIPayload, Web3APIReturnType, Web3APISpec, Web3BaseProvider, Web3ProviderStatus, } from 'web3-types'; import { InvalidClientError, MethodNotImplementedError, ResponseError } from 'web3-errors'; import { HttpProviderOptions } from './types.js'; export { HttpProviderOptions } from './types.js'; export default class HttpProvider< API extends Web3APISpec = EthExecutionAPI, > extends Web3BaseProvider { private readonly clientUrl: string; private readonly httpProviderOptions: HttpProviderOptions | undefined; public constructor(clientUrl: string, httpProviderOptions?: HttpProviderOptions) { super(); if (!HttpProvider.validateClientUrl(clientUrl)) throw new InvalidClientError(clientUrl); this.clientUrl = clientUrl; this.httpProviderOptions = httpProviderOptions; } private static validateClientUrl(clientUrl: string): boolean { return typeof clientUrl === 'string' ? /^http(s)?:\/\//i.test(clientUrl) : false; } /* eslint-disable class-methods-use-this */ public getStatus(): Web3ProviderStatus { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public supportsSubscriptions() { return false; } public async request< Method extends Web3APIMethod, ResultType = Web3APIReturnType, >( payload: Web3APIPayload, requestOptions?: RequestInit, ): Promise> { const providerOptionsCombined = { ...this.httpProviderOptions?.providerOptions, ...requestOptions, }; const response = await fetch(this.clientUrl, { ...providerOptionsCombined, method: 'POST', headers: { ...providerOptionsCombined.headers, 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); // eslint-disable-next-line @typescript-eslint/no-unsafe-argument if (!response.ok) throw new ResponseError(await response.json()); return (await response.json()) as JsonRpcResponseWithResult; } /* eslint-disable class-methods-use-this */ public on() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public removeListener() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public once() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public removeAllListeners() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public connect() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public disconnect() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public reset() { throw new MethodNotImplementedError(); } /* eslint-disable class-methods-use-this */ public reconnect() { throw new MethodNotImplementedError(); } } export { HttpProvider };