Skip to content

Commit 411ae2b

Browse files
committed
Rename exports to be more generic
1 parent 5991ddd commit 411ae2b

File tree

9 files changed

+265
-262
lines changed

9 files changed

+265
-262
lines changed

README.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,48 @@ or
1717
## Usage
1818

1919
```js
20-
import { ethErrors } from '@metamask/rpc-errors';
20+
import { rpcErrors, providerErrors } from '@metamask/rpc-errors';
2121

22-
throw ethErrors.provider.unauthorized();
22+
throw rpcErrors.invalidRequest();
2323
// or
24-
throw ethErrors.provider.unauthorized('my custom message');
24+
throw providerErrors.unauthorized('my custom message');
2525
```
2626

2727
## Supported Errors
2828

29+
- Generic JSON RPC 2.0 errors
30+
- Per [JSON RPC 2.0 spec](https://www.jsonrpc.org/specification#error_object)
2931
- Ethereum JSON RPC
3032
- Per [EIP-1474](https://eips.ethereum.org/EIPS/eip-1474#error-codes)
31-
- This includes all
32-
[JSON RPC 2.0 errors](https://www.jsonrpc.org/specification#error_object)
3333
- Ethereum Provider errors
3434
- Per [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193#provider-errors)
3535
- Does **not** yet support [`CloseEvent` errors or status codes](https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes).
3636

3737
## API
3838

3939
```js
40-
import { ethErrors } from '@metamask/rpc-errors';
40+
import { rpcErrors, providerErrors } from '@metamask/rpc-errors';
4141

42-
// Ethereum RPC errors are namespaced under "ethErrors.rpc"
43-
response.error = ethErrors.rpc.methodNotFound({
42+
// JSON-RPC errors are namespaced under "rpcErrors"
43+
response.error = rpcErrors.methodNotFound({
4444
message: optionalCustomMessage,
4545
data: optionalData,
4646
});
4747

48-
// Provider errors namespaced under ethErrors.provider
49-
response.error = ethErrors.provider.unauthorized({
48+
// Provider errors namespaced under providerErrors
49+
response.error = providerErrors.unauthorized({
5050
message: optionalCustomMessage,
5151
data: optionalData,
5252
});
5353

5454
// each error getter takes a single "opts" argument
5555
// for most errors, this can be replaced with a single string, which becomes
5656
// the error message
57-
response.error = ethErrors.provider.unauthorized(customMessage);
57+
response.error = providerErrors.unauthorized(customMessage);
5858

5959
// if an error getter accepts a single string, all arguments can be omitted
60-
response.error = ethErrors.provider.unauthorized();
61-
response.error = ethErrors.provider.unauthorized({});
60+
response.error = providerErrors.unauthorized();
61+
response.error = providerErrors.unauthorized({});
6262

6363
// omitting the message will produce an error with a default message per
6464
// the relevant spec
@@ -67,13 +67,13 @@ response.error = ethErrors.provider.unauthorized({});
6767
// "data" property
6868

6969
// the JSON RPC 2.0 server error requires a valid code
70-
response.error = ethErrors.rpc.server({
70+
response.error = rpcErrors.server({
7171
code: -32031,
7272
});
7373

7474
// custom Ethereum Provider errors require a valid code and message
7575
// valid codes are integers i such that: 1000 <= i <= 4999
76-
response.error = ethErrors.provider.custom({
76+
response.error = providerErrors.custom({
7777
code: 1001,
7878
message: 'foo',
7979
});
@@ -109,7 +109,7 @@ response.error = serializeError(maybeAnError, fallbackError)
109109
/**
110110
* Classes
111111
*/
112-
import { EthereumRpcError, EthereumProviderError } from '@metamask/rpc-errors';
112+
import { JsonRpcError, EthereumProviderError } from '@metamask/rpc-errors';
113113

114114
/**
115115
* getMessageFromCode and errorCodes
@@ -126,11 +126,11 @@ const message2 = getMessageFromCode(someCode, myFallback);
126126
const message3 = getMessageFromCode(someCode, null);
127127

128128
// {
129-
// rpc: { [errorName]: code, ... },
130-
// provider: { [errorName]: code, ... },
129+
// rpcErrors: { [errorName]: code, ... },
130+
// providerErrors: { [errorName]: code, ... },
131131
// }
132-
const code1 = errorCodes.rpc.parse;
133-
const code2 = errorCodes.provider.userRejectedRequest;
132+
const code1 = rpcErrors.parse;
133+
const code2 = providerErrors.userRejectedRequest;
134134

135135
// all codes in errorCodes have default messages
136136
const message4 = getMessageFromCode(code1);

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
"errors",
99
"utility"
1010
],
11-
"homepage": "https://github.com/MetaMask/eth-rpc-errors#readme",
11+
"homepage": "https://github.com/MetaMask/rpc-errors#readme",
1212
"bugs": {
13-
"url": "https://github.com/MetaMask/eth-rpc-errors/issues"
13+
"url": "https://github.com/MetaMask/rpc-errors/issues"
1414
},
1515
"repository": {
1616
"type": "git",
17-
"url": "https://github.com/MetaMask/eth-rpc-errors.git"
17+
"url": "https://github.com/MetaMask/rpc-errors.git"
1818
},
1919
"license": "MIT",
2020
"author": "Erik Marks <[email protected]>",

src/__fixtures__/errors.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ethErrors } from '..';
1+
import { rpcErrors } from '..';
22

33
export const dummyData = { foo: 'bar' };
44
export const dummyMessage = 'baz';
@@ -26,11 +26,11 @@ export const validError1 = {
2626
message: dummyMessage,
2727
data: Object.assign({}, dummyData),
2828
};
29-
export const validError2 = ethErrors.rpc.parse();
29+
export const validError2 = rpcErrors.parse();
3030
delete validError2.stack;
31-
export const validError3 = ethErrors.rpc.parse(dummyMessage);
31+
export const validError3 = rpcErrors.parse(dummyMessage);
3232
delete validError3.stack;
33-
export const validError4 = ethErrors.rpc.parse({
33+
export const validError4 = rpcErrors.parse({
3434
message: dummyMessage,
3535
data: Object.assign({}, dummyData),
3636
});

src/classes.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import safeStringify from 'fast-safe-stringify';
2-
import { Json, JsonRpcError } from '@metamask/utils';
2+
import { Json, JsonRpcError as SerializedJsonRpcError } from '@metamask/utils';
33

4-
export { JsonRpcError };
4+
export { SerializedJsonRpcError };
55

66
/**
77
* Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors
88
* per EIP-1474.
99
*
1010
* Permits any integer error code.
1111
*/
12-
export class EthereumRpcError<T extends Json> extends Error {
12+
export class JsonRpcError<T extends Json> extends Error {
1313
public code: number;
1414

1515
public data?: T;
@@ -20,7 +20,7 @@ export class EthereumRpcError<T extends Json> extends Error {
2020
}
2121

2222
if (!message || typeof message !== 'string') {
23-
throw new Error('"message" must be a nonempty string.');
23+
throw new Error('"message" must be a non-empty string.');
2424
}
2525

2626
super(message);
@@ -35,8 +35,8 @@ export class EthereumRpcError<T extends Json> extends Error {
3535
*
3636
* @returns A plain object with all public class properties.
3737
*/
38-
serialize(): JsonRpcError {
39-
const serialized: JsonRpcError = {
38+
serialize(): SerializedJsonRpcError {
39+
const serialized: SerializedJsonRpcError = {
4040
code: this.code,
4141
message: this.message,
4242
};
@@ -65,7 +65,7 @@ export class EthereumRpcError<T extends Json> extends Error {
6565
* Error subclass implementing Ethereum Provider errors per EIP-1193.
6666
* Permits integer error codes in the [ 1000 <= 4999 ] range.
6767
*/
68-
export class EthereumProviderError<T extends Json> extends EthereumRpcError<T> {
68+
export class EthereumProviderError<T extends Json> extends JsonRpcError<T> {
6969
/**
7070
* Create an Ethereum Provider JSON-RPC error.
7171
*

src/errors.test.ts

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@ import {
55
SERVER_ERROR_CODE,
66
CUSTOM_ERROR_CODE,
77
} from './__fixtures__';
8-
import { ethErrors, errorCodes } from '.';
8+
import { providerErrors } from './errors';
9+
import { rpcErrors, errorCodes } from '.';
910

10-
describe('ethErrors.rpc.invalidInput', () => {
11+
describe('rpcErrors.invalidInput', () => {
1112
it('accepts a single string argument where appropriate', () => {
12-
const err = ethErrors.rpc.invalidInput(CUSTOM_ERROR_MESSAGE);
13+
const err = rpcErrors.invalidInput(CUSTOM_ERROR_MESSAGE);
1314
expect(err.code).toBe(errorCodes.rpc.invalidInput);
1415
expect(err.message).toBe(CUSTOM_ERROR_MESSAGE);
1516
});
1617
});
1718

18-
describe('ethErrors.provider.unauthorized', () => {
19+
describe('providerErrors.unauthorized', () => {
1920
it('accepts a single string argument where appropriate', () => {
20-
const err = ethErrors.provider.unauthorized(CUSTOM_ERROR_MESSAGE);
21+
const err = providerErrors.unauthorized(CUSTOM_ERROR_MESSAGE);
2122
expect(err.code).toBe(errorCodes.provider.unauthorized);
2223
expect(err.message).toBe(CUSTOM_ERROR_MESSAGE);
2324
});
@@ -27,7 +28,7 @@ describe('custom provider error options', () => {
2728
it('throws if the value is not an options object', () => {
2829
expect(() => {
2930
// @ts-expect-error Invalid input
30-
ethErrors.provider.custom('bar');
31+
providerErrors.custom('bar');
3132
}).toThrow(
3233
'Ethereum Provider custom errors must provide single object argument.',
3334
);
@@ -36,11 +37,11 @@ describe('custom provider error options', () => {
3637
it('throws if the value is invalid', () => {
3738
expect(() => {
3839
// @ts-expect-error Invalid input
39-
ethErrors.provider.custom({ code: 4009, message: 2 });
40+
providerErrors.custom({ code: 4009, message: 2 });
4041
}).toThrow('"message" must be a nonempty string');
4142

4243
expect(() => {
43-
ethErrors.provider.custom({ code: 4009, message: '' });
44+
providerErrors.custom({ code: 4009, message: '' });
4445
}).toThrow('"message" must be a nonempty string');
4546
});
4647
});
@@ -49,24 +50,24 @@ describe('ethError.rpc.server', () => {
4950
it('throws on invalid input', () => {
5051
expect(() => {
5152
// @ts-expect-error Invalid input
52-
ethErrors.rpc.server('bar');
53+
rpcErrors.server('bar');
5354
}).toThrow(
5455
'Ethereum RPC Server errors must provide single object argument.',
5556
);
5657

5758
expect(() => {
5859
// @ts-expect-error Invalid input
59-
ethErrors.rpc.server({ code: 'bar' });
60+
rpcErrors.server({ code: 'bar' });
6061
}).toThrow('"code" must be an integer such that: -32099 <= code <= -32005');
6162

6263
expect(() => {
63-
ethErrors.rpc.server({ code: 1 });
64+
rpcErrors.server({ code: 1 });
6465
}).toThrow('"code" must be an integer such that: -32099 <= code <= -32005');
6566
});
6667
});
6768

68-
describe('ethError.rpc', () => {
69-
it.each(Object.entries(ethErrors.rpc).filter(([key]) => key !== 'server'))(
69+
describe('rpcErrors', () => {
70+
it.each(Object.entries(rpcErrors).filter(([key]) => key !== 'server'))(
7071
'%s returns appropriate value',
7172
(key, value) => {
7273
const createError = value as any;
@@ -86,7 +87,7 @@ describe('ethError.rpc', () => {
8687
);
8788

8889
it('server returns appropriate value', () => {
89-
const error = ethErrors.rpc.server({
90+
const error = rpcErrors.server({
9091
code: SERVER_ERROR_CODE,
9192
data: Object.assign({}, dummyData),
9293
});
@@ -96,24 +97,25 @@ describe('ethError.rpc', () => {
9697
});
9798
});
9899

99-
describe('ethError.provider', () => {
100-
it.each(
101-
Object.entries(ethErrors.provider).filter(([key]) => key !== 'custom'),
102-
)('%s returns appropriate value', (key, value) => {
103-
const createError = value as any;
104-
const error = createError({
105-
message: null,
106-
data: Object.assign({}, dummyData),
107-
});
108-
// @ts-expect-error TypeScript does not like indexing into this with the key
109-
const providerCode = errorCodes.provider[key];
110-
expect(error.code >= 1000 && error.code < 5000).toBe(true);
111-
expect(error.code).toBe(providerCode);
112-
expect(error.message).toBe(getMessageFromCode(providerCode));
113-
});
100+
describe('providerErrors', () => {
101+
it.each(Object.entries(providerErrors).filter(([key]) => key !== 'custom'))(
102+
'%s returns appropriate value',
103+
(key, value) => {
104+
const createError = value as any;
105+
const error = createError({
106+
message: null,
107+
data: Object.assign({}, dummyData),
108+
});
109+
// @ts-expect-error TypeScript does not like indexing into this with the key
110+
const providerCode = errorCodes.provider[key];
111+
expect(error.code >= 1000 && error.code < 5000).toBe(true);
112+
expect(error.code).toBe(providerCode);
113+
expect(error.message).toBe(getMessageFromCode(providerCode));
114+
},
115+
);
114116

115117
it('custom returns appropriate value', () => {
116-
const error = ethErrors.provider.custom({
118+
const error = providerErrors.custom({
117119
code: CUSTOM_ERROR_CODE,
118120
message: CUSTOM_ERROR_MESSAGE,
119121
data: Object.assign({}, dummyData),

0 commit comments

Comments
 (0)