diff --git a/packages/web3-providers/src/factories/ProvidersModuleFactory.js b/packages/web3-providers/src/factories/ProvidersModuleFactory.js
index 4bebec42b64..7be9334b95d 100644
--- a/packages/web3-providers/src/factories/ProvidersModuleFactory.js
+++ b/packages/web3-providers/src/factories/ProvidersModuleFactory.js
@@ -32,6 +32,7 @@ import BatchRequest from '../batch-request/BatchRequest';
import EthereumProvider from '../providers/EthereumProvider';
import MetamaskProvider from '../providers/MetamaskProvider';
import MistEthereumProvider from '../providers/MistEthereumProvider';
+import CustomProvider from '../providers/CustomProvider';
export default class ProvidersModuleFactory {
/**
@@ -203,4 +204,17 @@ export default class ProvidersModuleFactory {
createMistEthereumProvider(mistEthereumProvider) {
return new MistEthereumProvider(mistEthereumProvider);
}
+
+ /**
+ * Returns an CustomProvider object
+ *
+ * @method createCustomProvider
+ *
+ * @param {Object} connection
+ *
+ * @returns {CustomProvider}
+ */
+ createCustomProvider(connection) {
+ return new CustomProvider(connection);
+ }
}
diff --git a/packages/web3-providers/src/providers/CustomProvider.js b/packages/web3-providers/src/providers/CustomProvider.js
new file mode 100644
index 00000000000..47c7502c237
--- /dev/null
+++ b/packages/web3-providers/src/providers/CustomProvider.js
@@ -0,0 +1,138 @@
+/*
+ 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 .
+*/
+/**
+ * @file CustomProvider.js
+ * @author Samuel Furter
+ * @date 2019
+ */
+import JsonRpcMapper from '../mappers/JsonRpcMapper';
+import JsonRpcResponseValidator from '../validators/JsonRpcResponseValidator';
+
+export default class CustomProvider {
+ /**
+ * @param {Object} connection
+ *
+ * @constructor
+ */
+ constructor(connection) {
+ this.host = 'CustomProvider';
+ this.connection = connection;
+ this.checkConnectionMethods();
+ }
+
+ /**
+ * Checks if the given custom provider does have the required methods
+ *
+ * @method checkConnectionMethods
+ *
+ * @returns {Boolean}
+ */
+ checkConnectionMethods() {
+ if (this.connection.send || this.connection.sendAsync) {
+ return true;
+ }
+
+ throw new Error('Invalid provider injected!');
+ }
+
+ /**
+ * Added this method to have a better error message if someone is trying to create a subscription with this provider.
+ */
+ subscribe() {
+ throw new Error('Subscriptions are not supported with the CustomProvider.');
+ }
+
+ /**
+ * Added this method to have a better error message if someone is trying to unsubscribe with this provider.
+ */
+ unsubscribe() {
+ throw new Error('Subscriptions are not supported with the CustomProvider.');
+ }
+
+ /**
+ * Creates the JSON-RPC payload and sends it to the node.
+ *
+ * @method send
+ *
+ * @param {String} method
+ * @param {Array} parameters
+ *
+ * @returns {Promise}
+ */
+ send(method, parameters) {
+ return this.sendPayload(JsonRpcMapper.toPayload(method, parameters)).then((response) => {
+ const validationResult = JsonRpcResponseValidator.validate(response);
+
+ if (validationResult instanceof Error) {
+ throw validationResult;
+ }
+
+ return response.result;
+ });
+ }
+
+ /**
+ * Creates the JSON-RPC batch payload and sends it to the node.
+ *
+ * @method sendBatch
+ *
+ * @param {AbstractMethod[]} methods
+ * @param {AbstractWeb3Module} moduleInstance
+ *
+ * @returns Promise