-
Notifications
You must be signed in to change notification settings - Fork 147
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(rpc): register rpc request handlers
- Loading branch information
1 parent
6e753a5
commit 8e4169a
Showing
20 changed files
with
1,794 additions
and
1,412 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,155 +1,86 @@ | ||
import { | ||
type LeatherRpcMethodMap, | ||
RpcErrorCode, | ||
type RpcRequests, | ||
createRpcErrorResponse, | ||
getAddresses, | ||
open, | ||
openSwap, | ||
sendTransfer, | ||
signMessage, | ||
signPsbt, | ||
stxCallContract, | ||
stxDeployContract, | ||
stxGetAddresses, | ||
stxSignMessage, | ||
stxSignStructuredMessage, | ||
stxSignTransaction, | ||
stxTransferSip9Nft, | ||
stxTransferSip10Ft, | ||
stxTransferStx, | ||
supportedMethods, | ||
} from '@leather.io/rpc'; | ||
|
||
import { queueAnalyticsRequest } from '@background/background-analytics'; | ||
import { rpcSwap } from '@background/messaging/rpc-methods/open-swap'; | ||
import { rpcStxSignTransaction } from '@background/messaging/rpc-methods/stx-sign-transaction'; | ||
|
||
import { getTabIdFromPort, listenForOriginTabClose } from './messaging-utils'; | ||
import { rpcGetAddresses } from './rpc-methods/get-addresses'; | ||
import { rpcOpen } from './rpc-methods/open'; | ||
import { rpcSendTransfer } from './rpc-methods/send-transfer'; | ||
import { rpcSignMessage } from './rpc-methods/sign-message'; | ||
import { rpcSignPsbt } from './rpc-methods/sign-psbt'; | ||
import { getAddressesHandler, stxGetAddressesHandler } from './rpc-methods/get-addresses'; | ||
import { openHandler } from './rpc-methods/open'; | ||
import { openSwapHandler } from './rpc-methods/open-swap'; | ||
import { sendTransferHandler } from './rpc-methods/send-transfer'; | ||
import { signMessageHandler } from './rpc-methods/sign-message'; | ||
import { signPsbtHandler } from './rpc-methods/sign-psbt'; | ||
import { | ||
rpcSignStacksMessage, | ||
rpcSignStacksStructuredMessage, | ||
stxSignMessageHandler, | ||
stxSignStructuredMessageHandler, | ||
} from './rpc-methods/sign-stacks-message'; | ||
import { rpcStxCallContract } from './rpc-methods/stx-call-contract'; | ||
import { rpcStxDeployContract } from './rpc-methods/stx-deploy-contract'; | ||
import { rpcStxGetAddresses } from './rpc-methods/stx-get-addresses'; | ||
import { rpcStxTransferSip9Nft } from './rpc-methods/stx-transfer-sip9-nft'; | ||
import { rpcStxTransferSip10Ft } from './rpc-methods/stx-transfer-sip10-ft'; | ||
import { rpcStxTransferStx } from './rpc-methods/stx-transfer-stx'; | ||
import { rpcSupportedMethods } from './rpc-methods/supported-methods'; | ||
|
||
export async function rpcMessageHandler(message: RpcRequests, port: chrome.runtime.Port) { | ||
listenForOriginTabClose({ tabId: port.sender?.tab?.id }); | ||
|
||
switch (message.method) { | ||
case open.method: { | ||
await rpcOpen(message, port); | ||
break; | ||
} | ||
case openSwap.method: { | ||
await rpcSwap(message, port); | ||
break; | ||
} | ||
case getAddresses.method: { | ||
await rpcGetAddresses(message, port); | ||
break; | ||
} | ||
|
||
case signMessage.method: { | ||
await rpcSignMessage(message, port); | ||
break; | ||
} | ||
|
||
case sendTransfer.method: { | ||
await rpcSendTransfer(message, port); | ||
break; | ||
} | ||
|
||
case signPsbt.method: { | ||
await rpcSignPsbt(message, port); | ||
break; | ||
} | ||
|
||
case stxCallContract.method: { | ||
await rpcStxCallContract(message, port); | ||
break; | ||
} | ||
|
||
case stxDeployContract.method: { | ||
await rpcStxDeployContract(message, port); | ||
break; | ||
} | ||
|
||
case stxSignTransaction.method: { | ||
await rpcStxSignTransaction(message, port); | ||
break; | ||
} | ||
|
||
case supportedMethods.method: { | ||
rpcSupportedMethods(message, port); | ||
break; | ||
} | ||
|
||
case stxSignMessage.method: { | ||
await rpcSignStacksMessage(message, port); | ||
break; | ||
} | ||
|
||
case stxSignStructuredMessage.method: { | ||
await rpcSignStacksStructuredMessage(message, port); | ||
break; | ||
} | ||
|
||
case stxGetAddresses.method: { | ||
await rpcStxGetAddresses(message, port); | ||
break; | ||
} | ||
|
||
case stxTransferStx.method: { | ||
await rpcStxTransferStx(message, port); | ||
break; | ||
} | ||
|
||
case stxTransferSip10Ft.method: { | ||
await rpcStxTransferSip10Ft(message, port); | ||
break; | ||
} | ||
|
||
case stxTransferSip9Nft.method: { | ||
await rpcStxTransferSip9Nft(message, port); | ||
break; | ||
} | ||
|
||
default: | ||
chrome.tabs.sendMessage( | ||
getTabIdFromPort(port), | ||
createRpcErrorResponse(message.method, { | ||
id: message.id, | ||
error: { | ||
code: RpcErrorCode.METHOD_NOT_FOUND, | ||
message: `"${message.method}" is not supported. Try running \`.request('supportedMethods')\` to see what Leather can do, or check out our developer documentation at https://leather.gitbook.io/developers/home/welcome`, | ||
}, | ||
}) | ||
); | ||
break; | ||
} | ||
import { stxCallContractHandler } from './rpc-methods/stx-call-contract'; | ||
import { stxDeployContractHandler } from './rpc-methods/stx-deploy-contract'; | ||
import { stxSignTransactionHandler } from './rpc-methods/stx-sign-transaction'; | ||
import { stxTransferSip9NftHandler } from './rpc-methods/stx-transfer-sip9-nft'; | ||
import { stxTransferSip10FtHandler } from './rpc-methods/stx-transfer-sip10-ft'; | ||
import { stxTransferStxHandler } from './rpc-methods/stx-transfer-stx'; | ||
import { supportedMethodsHandler } from './rpc-methods/supported-methods'; | ||
|
||
type RpcHandler<T> = (request: T, port: chrome.runtime.Port) => Promise<void> | void; | ||
|
||
type RpcHandlers = { | ||
[Method in keyof LeatherRpcMethodMap]: RpcHandler<LeatherRpcMethodMap[Method]['request']>; | ||
}; | ||
|
||
const rpcHandlers: Partial<RpcHandlers> = {}; | ||
|
||
function registerRpcRequestHandler<M extends RpcRequests['method']>( | ||
method: M, | ||
handler: RpcHandler<LeatherRpcMethodMap[M]['request']> | ||
) { | ||
rpcHandlers[method] = handler; | ||
} | ||
|
||
interface TrackRpcRequestSuccess { | ||
endpoint: RpcRequests['method']; | ||
} | ||
export async function trackRpcRequestSuccess(args: TrackRpcRequestSuccess) { | ||
return queueAnalyticsRequest('rpc_request_successful', { ...args }); | ||
export function defineRpcRequestHandler<M extends RpcRequests['method']>( | ||
method: M, | ||
handler: RpcHandler<LeatherRpcMethodMap[M]['request']> | ||
) { | ||
return [method, handler] as const; | ||
} | ||
|
||
interface TrackRpcRequestError { | ||
endpoint: RpcRequests['method']; | ||
error: string; | ||
} | ||
export async function trackRpcRequestError(args: TrackRpcRequestError) { | ||
return queueAnalyticsRequest('rpc_request_error', { ...args }); | ||
export async function rpcMessageHandler(request: RpcRequests, port: chrome.runtime.Port) { | ||
listenForOriginTabClose({ tabId: port.sender?.tab?.id }); | ||
|
||
// This typecast safely bypasses the compiler since it cannot infer or narrow | ||
// the type to know the `request` being passed to `handler` is the correct | ||
// one. Type safety is guaranteed by `registerRpcRequestHandler` | ||
const handler = rpcHandlers[request.method] as RpcHandler<any>; | ||
|
||
if (handler) return await handler(request, port); | ||
|
||
chrome.tabs.sendMessage( | ||
getTabIdFromPort(port), | ||
createRpcErrorResponse(request.method, { | ||
id: request.id, | ||
error: { | ||
code: RpcErrorCode.METHOD_NOT_FOUND, | ||
message: `"${request.method}" is not supported. Try running \`.request('supportedMethods')\` to see what Leather can do, or check out our developer documentation at https://leather.gitbook.io/developers/home/welcome`, | ||
}, | ||
}) | ||
); | ||
} | ||
|
||
registerRpcRequestHandler(...getAddressesHandler); | ||
registerRpcRequestHandler(...openHandler); | ||
registerRpcRequestHandler(...openSwapHandler); | ||
registerRpcRequestHandler(...sendTransferHandler); | ||
registerRpcRequestHandler(...signMessageHandler); | ||
registerRpcRequestHandler(...signPsbtHandler); | ||
registerRpcRequestHandler(...stxCallContractHandler); | ||
registerRpcRequestHandler(...stxDeployContractHandler); | ||
registerRpcRequestHandler(...stxGetAddressesHandler); | ||
registerRpcRequestHandler(...stxSignMessageHandler); | ||
registerRpcRequestHandler(...stxSignStructuredMessageHandler); | ||
registerRpcRequestHandler(...stxSignTransactionHandler); | ||
registerRpcRequestHandler(...stxTransferSip10FtHandler); | ||
registerRpcRequestHandler(...stxTransferSip9NftHandler); | ||
registerRpcRequestHandler(...stxTransferStxHandler); | ||
registerRpcRequestHandler(...supportedMethodsHandler); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.