Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/4.x' into 5892-4x-signtransactio…
Browse files Browse the repository at this point in the history
…ns-argument-is-not-typed-in-web3-types
  • Loading branch information
Muhammad-Altabba committed Apr 11, 2023
2 parents 1b779ec + e75582e commit 137542a
Show file tree
Hide file tree
Showing 56 changed files with 264 additions and 274 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,17 @@ import * as net from 'net';
const ipcProvider = new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', new net.Server());
```

In 4.x, it accepts a second parameter called `socketOptions`. And, its type is `SocketConstructorOpts`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_net_d_._net_.socketconstructoropts.html) for full details. And here is its interface:
In 4.x, it's no longer installed by default as its nodejs modules are impacting web3.js browser usage.
You can use it by installing `web3-providers-ipc` and creating a new instance. Since it's compatible with Eip1193Provider,
you can pass it on to the Web3 instance.

```ts
import IpcProvider from 'web3-providers-ipc';

const ipcProvider = new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc');
```

It accepts a second parameter called `socketOptions`. And, its type is `SocketConstructorOpts`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_net_d_._net_.socketconstructoropts.html) for full details. And here is its interface:

```ts
interface SocketConstructorOpts {
Expand Down
2 changes: 1 addition & 1 deletion docs/docs/guides/web3_providers_guide/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Actually, the provider could be any of the following:
- An instance of [HttpProvider](/api/web3-providers-http/class/HttpProvider)
- An instance of [WebSocketProvider](/api/web3-providers-ws/class/WebSocketProvider)
- An instance of [IpcProvider](/api/web3-providers-ipc/class/IpcProvider)
- A string containing string url for `http`/`https`, `ws`/`wss`, or `ipc` protocol. And when a string is passed, an instance of the compatible class above will be created accordingly. ex. WebSocketProvider instance will be created for string containing `ws` or `ws`. And you access this instance by calling `web3.provider` to read the provider and possibly register an event listener.
- A string containing string url for `http`/`https` or `ws`/`wss` protocol. And when a string is passed, an instance of the compatible class above will be created accordingly. ex. WebSocketProvider instance will be created for string containing `ws` or `ws`. And you access this instance by calling `web3.provider` to read the provider and possibly register an event listener.
- Any provider object that adhere to [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193). And it has been tested with Ganache provider, Hardhat provider, and Incubed (IN3) as a provider.

For both [WebSocketProvider](/api/web3-providers-ws/class/WebSocketProvider) and [IpcProvider](/api/web3-providers-ipc/class/IpcProvider) the user can listen to emitted events. More on this is at [Providers Events Listening](events_listening).
Expand Down
5 changes: 5 additions & 0 deletions packages/web3-core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Breaking Changes

- removed IPC provider dependency, IPC path is no longer viable provider. If you wanna use IPC, please install `web3-providers-ipc` and instantiate provider yourself

### Added

- Added hybrid build (ESM and CJS) of library (#5904)
Expand All @@ -94,6 +98,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- If a transaction object with a `data` property is passed to `txInputOptionsFormatter`, it will now be replaced with `input` (#5915)
- The types `TransactionTypeParser` and `TransactionBuilder` are now utilizing the type `Transaction` for the transaction object. (#5993)
- no need for polyfilling nodejs `net` and `fs` modules

### Removed

Expand Down
4 changes: 3 additions & 1 deletion packages/web3-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,14 @@
"web3-errors": "^1.0.0-rc.0",
"web3-eth-iban": "^4.0.1-rc.0",
"web3-providers-http": "^4.0.1-rc.0",
"web3-providers-ipc": "^4.0.1-rc.0",
"web3-providers-ws": "^4.0.1-rc.0",
"web3-types": "^1.0.0-rc.0",
"web3-utils": "^4.0.1-rc.0",
"web3-validator": "^1.0.0-rc.0"
},
"optionalDependencies": {
"web3-providers-ipc": "^4.0.1-rc.0"
},
"devDependencies": {
"@types/jest": "^28.1.6",
"@types/jest-when": "^3.5.2",
Expand Down
1 change: 0 additions & 1 deletion packages/web3-core/src/web3_context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ export class Web3Context<
requestManager ??
new Web3RequestManager<API>(
provider,
undefined,
config?.enableExperimentalFeatures?.useSubscriptionWhenCheckingBlockTimeout,
);

Expand Down
21 changes: 6 additions & 15 deletions packages/web3-core/src/web3_request_manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/

import { Socket } from 'net';

import {
ContractExecutionError,
InvalidResponseError,
Expand All @@ -26,7 +24,6 @@ import {
RpcError,
} from 'web3-errors';
import HttpProvider from 'web3-providers-http';
import IpcProvider from 'web3-providers-ipc';
import WSProvider from 'web3-providers-ws';
import {
EthExecutionAPI,
Expand Down Expand Up @@ -61,10 +58,12 @@ export enum Web3RequestManagerEvent {
BEFORE_PROVIDER_CHANGE = 'BEFORE_PROVIDER_CHANGE',
}

const availableProviders = {
const availableProviders: {
HttpProvider: Web3BaseProviderConstructor;
WebsocketProvider: Web3BaseProviderConstructor;
} = {
HttpProvider: HttpProvider as Web3BaseProviderConstructor,
WebsocketProvider: WSProvider as Web3BaseProviderConstructor,
IpcProvider: IpcProvider as Web3BaseProviderConstructor,
};

export class Web3RequestManager<
Expand All @@ -76,13 +75,12 @@ export class Web3RequestManager<
private readonly useRpcCallSpecification?: boolean;
public constructor(
provider?: SupportedProviders<API> | string,
net?: Socket,
useRpcCallSpecification?: boolean,
) {
super();

if (!isNullish(provider)) {
this.setProvider(provider, net);
this.setProvider(provider);
}
this.useRpcCallSpecification = useRpcCallSpecification;
}
Expand Down Expand Up @@ -113,11 +111,10 @@ export class Web3RequestManager<

/**
* Use to set provider. Provider can be a provider instance or a string.
* To set IPC provider as a string please use the IPC socket file which name ends with .ipc
*
* @param provider - The provider to set
*/
public setProvider(provider?: SupportedProviders<API> | string, net?: Socket): boolean {
public setProvider(provider?: SupportedProviders<API> | string): boolean {
let newProvider: SupportedProviders<API> | undefined;

// autodetect provider
Expand All @@ -129,12 +126,6 @@ export class Web3RequestManager<
// WS
} else if (/^ws(s)?:\/\//i.test(provider)) {
newProvider = new this.providers.WebsocketProvider<API>(provider);

// IPC
} else if (typeof net === 'object' && typeof net.connect === 'function') {
newProvider = new this.providers.IpcProvider<API>(provider, net);
} else if (provider.toLowerCase().endsWith('.ipc')) {
newProvider = new this.providers.IpcProvider<API>(provider);
} else {
throw new ProviderError(`Can't autodetect provider for "${provider}"`);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ Object {
},
"providers": Object {
"HttpProvider": [Function],
"IpcProvider": [Function],
"WebsocketProvider": [Function],
},
"registeredSubscriptions": Object {},
Expand Down
88 changes: 16 additions & 72 deletions packages/web3-core/test/unit/web3_request_manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ import {
} from 'web3-errors';
import HttpProvider from 'web3-providers-http';
import WSProvider from 'web3-providers-ws';
import IpcProvider from 'web3-providers-ipc';
import { Web3RequestManager, Web3RequestManagerEvent } from '../../src/web3_request_manager';
import * as utils from '../../src/utils';

Expand All @@ -62,7 +61,7 @@ describe('Web3RequestManager', () => {
const manager = new Web3RequestManager(provider);

expect(manager.setProvider).toHaveBeenCalledTimes(1);
expect(manager.setProvider).toHaveBeenCalledWith(provider, undefined);
expect(manager.setProvider).toHaveBeenCalledWith(provider);
expect(manager).toBeInstanceOf(Web3RequestManager);
});
});
Expand All @@ -71,17 +70,12 @@ describe('Web3RequestManager', () => {
it('should return providers on instance', () => {
const manager = new Web3RequestManager();

expect(Object.keys(manager.providers)).toEqual([
'HttpProvider',
'WebsocketProvider',
'IpcProvider',
]);
expect(Object.keys(manager.providers)).toEqual(['HttpProvider', 'WebsocketProvider']);
});

it('should return providers of particular instances', () => {
expect(Web3RequestManager.providers.HttpProvider).toBe(HttpProvider);
expect(Web3RequestManager.providers.WebsocketProvider).toBe(WSProvider);
expect(Web3RequestManager.providers.IpcProvider).toBe(IpcProvider);
});
});

Expand Down Expand Up @@ -205,56 +199,6 @@ describe('Web3RequestManager', () => {
});
});

describe('ipc provider', () => {
beforeEach(() => {
jest.spyOn(Web3RequestManager.prototype, 'providers', 'get').mockReturnValue({
...Web3RequestManager.prototype.providers,
IpcProvider: jest.fn().mockImplementation(() => myProvider),
});
});

it('should detect and set ipc provider', () => {
const providerString = 'ipc://mydomain.com';
const socket = { connect: () => jest.fn() } as any;

const manager = new Web3RequestManager();
manager.setProvider(providerString, socket);

expect(manager.providers.IpcProvider).toHaveBeenCalledTimes(1);
expect(manager.providers.IpcProvider).toHaveBeenCalledWith(providerString, socket);
expect(manager.provider).toEqual(myProvider);
});

it('should detect and set ipc provider as a string', () => {
const providerString = './some/file.ipc';

const manager = new Web3RequestManager();
manager.setProvider(providerString);

expect(manager.providers.IpcProvider).toHaveBeenCalledTimes(1);
expect(manager.providers.IpcProvider).toHaveBeenCalledWith(providerString);
expect(manager.provider).toEqual(myProvider);
});

it('should emit events before changing the provider', () => {
const providerString = 'ipc://mydomain.com';
const socket = { connect: () => jest.fn() } as any;

const manager = new Web3RequestManager();
manager.setProvider(providerString, socket);

expect(emitSpy).toHaveBeenCalledTimes(2);
expect(emitSpy).toHaveBeenCalledWith(
Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE,
undefined,
);
expect(emitSpy).toHaveBeenCalledWith(
Web3RequestManagerEvent.PROVIDER_CHANGED,
myProvider,
);
});
});

it('should throw error if can not detect the provider', () => {
const providerString = 'pc://mydomain.com';
const manager = new Web3RequestManager();
Expand Down Expand Up @@ -325,7 +269,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32700, message: 'Parse error' },
};
const manager = new Web3RequestManager(undefined, undefined, false);
const manager = new Web3RequestManager(undefined, false);
const myProvider = {
request: jest
.fn()
Expand All @@ -349,7 +293,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32700, message: 'Parse error' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -373,7 +317,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32600, message: 'Invalid request' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -398,7 +342,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32601, message: 'Method not found' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -423,7 +367,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32602, message: 'Invalid params' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -447,7 +391,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32603, message: 'Internal error' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -471,7 +415,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32000, message: 'Invalid input' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -495,7 +439,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32001, message: 'Resource not found' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -519,7 +463,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32002, message: 'Resource unavailable' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -543,7 +487,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32003, message: 'Transaction rejected' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -567,7 +511,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32004, message: 'Method not supported' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -591,7 +535,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32005, message: 'Limit exceeded' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -615,7 +559,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32006, message: 'JSON-RPC version not supported' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand All @@ -639,7 +583,7 @@ describe('Web3RequestManager', () => {
jsonrpc: '2.0' as JsonRpcIdentifier,
error: { code: -32015, message: 'Custom rpc error' },
};
const manager = new Web3RequestManager(undefined, undefined, true);
const manager = new Web3RequestManager(undefined, true);
const myProvider = {
request: jest
.fn()
Expand Down
1 change: 1 addition & 0 deletions packages/web3-eth-accounts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"test:integration": "jest --config=./test/integration/jest.config.js"
},
"devDependencies": {
"web3-providers-ipc": "^4.0.1-rc.0",
"@types/jest": "^28.1.6",
"@typescript-eslint/eslint-plugin": "^5.30.7",
"@typescript-eslint/parser": "^5.30.7",
Expand Down
Loading

0 comments on commit 137542a

Please sign in to comment.