Skip to content
This repository has been archived by the owner on Oct 7, 2024. It is now read-only.

refactor: rename RPC handling functions #16

Merged
merged 5 commits into from
Jun 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 26 additions & 24 deletions src/keyring-rpc-dispatcher.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import type { Json, JsonRpcRequest } from '@metamask/utils';

import {
MethodNotSupportedError,
chainHandlers,
keyringRpcDispatcher,
buildHandlersChain,
handleKeyringRequest,
} from './keyring-rpc-dispatcher';

describe('buildHandlersChain', () => {
Expand All @@ -23,7 +23,7 @@ describe('buildHandlersChain', () => {
it('should call the first handler and return its result', async () => {
handler1.mockResolvedValue('Handler 1 result');

const result = await chainHandlers(
const result = await buildHandlersChain(
handler1,
handler2,
handler3,
Expand All @@ -42,7 +42,7 @@ describe('buildHandlersChain', () => {
handler1.mockRejectedValue(new MethodNotSupportedError('test_method'));
handler2.mockResolvedValue('Handler 2 result');

const result = await chainHandlers(
const result = await buildHandlersChain(
handler1,
handler2,
handler3,
Expand All @@ -62,7 +62,7 @@ describe('buildHandlersChain', () => {
handler2.mockRejectedValue(new MethodNotSupportedError('test_method'));
handler3.mockResolvedValue('Handler 3 result');

const result = await chainHandlers(
const result = await buildHandlersChain(
handler1,
handler2,
handler3,
Expand All @@ -83,7 +83,7 @@ describe('buildHandlersChain', () => {
handler3.mockRejectedValue(new MethodNotSupportedError('test_method'));

await expect(
chainHandlers(handler1, handler2, handler3)({ origin, request }),
buildHandlersChain(handler1, handler2, handler3)({ origin, request }),
).rejects.toThrow(MethodNotSupportedError);
expect(handler1).toHaveBeenCalledWith({ origin, request });
expect(handler2).toHaveBeenCalledWith({ origin, request });
Expand All @@ -95,7 +95,7 @@ describe('buildHandlersChain', () => {
handler1.mockRejectedValue(error);

await expect(
chainHandlers(handler1, handler2, handler3)({ origin, request }),
buildHandlersChain(handler1, handler2, handler3)({ origin, request }),
).rejects.toThrow(error);
expect(handler1).toHaveBeenCalledWith({ origin, request });
expect(handler2).not.toHaveBeenCalled();
Expand Down Expand Up @@ -130,7 +130,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.listAccounts.mockResolvedValue('ListAccounts result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.listAccounts).toHaveBeenCalled();
expect(result).toBe('ListAccounts result');
Expand All @@ -143,7 +143,9 @@ describe('keyringRpcDispatcher', () => {
// Missing method name.
};

await expect(keyringRpcDispatcher(keyring, request)).rejects.toThrow(
await expect(
handleKeyringRequest(keyring, request as unknown as JsonRpcRequest),
).rejects.toThrow(
'At path: method -- Expected a string, but received: undefined',
);
});
Expand All @@ -157,7 +159,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.getAccount.mockResolvedValue('GetAccount result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.getAccount).toHaveBeenCalledWith(
'4f983fa2-4f53-4c63-a7c2-f9a5ed750041',
Expand All @@ -166,26 +168,26 @@ describe('keyringRpcDispatcher', () => {
});

it('should fail to call keyring_getAccount without the account ID', async () => {
const request = {
const request: JsonRpcRequest = {
jsonrpc: '2.0',
id: '7c507ff0-365f-4de0-8cd5-eb83c30ebda4',
method: 'keyring_getAccount',
params: {}, // Missing account ID.
};

await expect(keyringRpcDispatcher(keyring, request)).rejects.toThrow(
await expect(handleKeyringRequest(keyring, request)).rejects.toThrow(
'At path: params.id -- Expected a string, but received: undefined',
);
});

it('should fail to call keyring_getAccount without params', async () => {
const request = {
const request: JsonRpcRequest = {
jsonrpc: '2.0',
id: '7c507ff0-365f-4de0-8cd5-eb83c30ebda4',
method: 'keyring_getAccount',
};

await expect(keyringRpcDispatcher(keyring, request)).rejects.toThrow(
await expect(handleKeyringRequest(keyring, request)).rejects.toThrow(
'At path: params -- Expected an object, but received: undefined',
);
});
Expand All @@ -199,7 +201,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.createAccount.mockResolvedValue('CreateAccount result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.createAccount).toHaveBeenCalledWith('account_name', {});
expect(result).toBe('CreateAccount result');
Expand All @@ -219,7 +221,7 @@ describe('keyringRpcDispatcher', () => {
keyring.filterAccountChains.mockResolvedValue(
'FilterSupportedChains result',
);
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.filterAccountChains).toHaveBeenCalledWith(
'4f983fa2-4f53-4c63-a7c2-f9a5ed750041',
Expand All @@ -246,7 +248,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.updateAccount.mockResolvedValue('UpdateAccount result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.updateAccount).toHaveBeenCalledWith({
id: '4f983fa2-4f53-4c63-a7c2-f9a5ed750041',
Expand All @@ -268,7 +270,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.deleteAccount.mockResolvedValue('DeleteAccount result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.deleteAccount).toHaveBeenCalledWith(
'4f983fa2-4f53-4c63-a7c2-f9a5ed750041',
Expand All @@ -284,7 +286,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.listRequests.mockResolvedValue('ListRequests result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.listRequests).toHaveBeenCalled();
expect(result).toBe('ListRequests result');
Expand All @@ -299,7 +301,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.getRequest.mockResolvedValue('GetRequest result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.getRequest).toHaveBeenCalledWith('request_id');
expect(result).toBe('GetRequest result');
Expand All @@ -325,7 +327,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.submitRequest.mockResolvedValue('SubmitRequest result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.submitRequest).toHaveBeenCalledWith(dappRequest);
expect(result).toBe('SubmitRequest result');
Expand All @@ -340,7 +342,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.approveRequest.mockResolvedValue('ApproveRequest result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.approveRequest).toHaveBeenCalledWith('request_id');
expect(result).toBe('ApproveRequest result');
Expand All @@ -355,7 +357,7 @@ describe('keyringRpcDispatcher', () => {
};

keyring.rejectRequest.mockResolvedValue('RejectRequest result');
const result = await keyringRpcDispatcher(keyring, request);
const result = await handleKeyringRequest(keyring, request);

expect(keyring.rejectRequest).toHaveBeenCalledWith('request_id');
expect(result).toBe('RejectRequest result');
Expand All @@ -368,7 +370,7 @@ describe('keyringRpcDispatcher', () => {
method: 'unknown_method',
};

await expect(keyringRpcDispatcher(keyring, request)).rejects.toThrow(
await expect(handleKeyringRequest(keyring, request)).rejects.toThrow(
MethodNotSupportedError,
);
});
Expand Down
15 changes: 10 additions & 5 deletions src/keyring-rpc-dispatcher.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import type { OnRpcRequestHandler } from '@metamask/snaps-utils';
import { JsonRpcRequestStruct, type Json } from '@metamask/utils';
import {
JsonRpcRequestStruct,
type Json,
JsonRpcRequest,
} from '@metamask/utils';
import { assert } from 'superstruct';

import type { Keyring } from './keyring-api';
Expand Down Expand Up @@ -38,7 +42,7 @@ export class MethodNotSupportedError extends Error {
* @param handlers - Handlers to chain.
* @returns A handler that chains the given handlers.
*/
export function chainHandlers(
export function buildHandlersChain(
...handlers: OnRpcRequestHandler[]
): OnRpcRequestHandler {
return async ({ origin, request }) => {
Expand All @@ -64,9 +68,9 @@ export function chainHandlers(
* @param request - Keyring JSON-RPC request.
* @returns A promise that resolves to the keyring response.
*/
export async function keyringRpcDispatcher(
export async function handleKeyringRequest(
keyring: Keyring,
request: unknown,
request: JsonRpcRequest,
): Promise<Json | void> {
// We first have to make sure that the request is a valid JSON-RPC request so
// we can check its method name.
Expand Down Expand Up @@ -133,7 +137,8 @@ export async function keyringRpcDispatcher(
return await keyring.rejectRequest(request.params.id);
}

default:
default: {
throw new MethodNotSupportedError(request.method);
}
}
}