@metamask/providers
Version:
A JavaScript Ethereum provider that connects to the wallet over a stream
134 lines • 5.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CAIP294EventNames = void 0;
exports.announceWallet = announceWallet;
exports.requestWallet = requestWallet;
const utils_1 = require("@metamask/utils");
const utils_2 = require("./utils.cjs");
/**
* Describes the possible CAIP-294 event names
*/
var CAIP294EventNames;
(function (CAIP294EventNames) {
CAIP294EventNames["Announce"] = "caip294:wallet_announce";
CAIP294EventNames["Prompt"] = "caip294:wallet_prompt";
})(CAIP294EventNames || (exports.CAIP294EventNames = CAIP294EventNames = {}));
/**
* Validates an {@link CAIP294RequestWalletEvent} object.
*
* @param event - The {@link CAIP294RequestWalletEvent} to validate.
* @returns Whether the {@link CAIP294RequestWalletEvent} is valid.
*/
function isValidRequestWalletEvent(event) {
return (event instanceof CustomEvent &&
event.type === CAIP294EventNames.Prompt &&
(0, utils_1.isObject)(event.detail) &&
event.detail.method === 'wallet_prompt' &&
isValidWalletPromptParams(event.detail.params));
}
/**
* Validates a {@link CAIP294RequestWalletEvent} params field.
*
* @param params - The parameters to validate.
* @returns Whether the parameters are valid.
*/
function isValidWalletPromptParams(params) {
const isValidChains = params.chains === undefined ||
(Array.isArray(params.chains) &&
params.chains.every((chain) => typeof chain === 'string'));
const isValidAuthName = params.authName === undefined || typeof params.authName === 'string';
return isValidChains && isValidAuthName;
}
/**
* Validates an {@link CAIP294AnnounceWalletEvent} object.
*
* @param event - The {@link CAIP294AnnounceWalletEvent} to validate.
* @returns Whether the {@link CAIP294AnnounceWalletEvent} is valid.
*/
function isValidAnnounceWalletEvent(event) {
return (event instanceof CustomEvent &&
event.type === CAIP294EventNames.Announce &&
(0, utils_1.isObject)(event.detail) &&
event.detail.method === 'wallet_announce' &&
isValidWalletData(event.detail.params));
}
/**
* Validates an {@link CAIP294WalletData} object.
*
* @param data - The {@link CAIP294WalletData} to validate.
* @returns Whether the {@link CAIP294WalletData} is valid.
*/
function isValidWalletData(data) {
return ((0, utils_1.isObject)(data) &&
typeof data.uuid === 'string' &&
utils_2.UUID_V4_REGEX.test(data.uuid) &&
typeof data.name === 'string' &&
Boolean(data.name) &&
typeof data.icon === 'string' &&
data.icon.startsWith('data:image') &&
typeof data.rdns === 'string' &&
utils_2.FQDN_REGEX.test(data.rdns) &&
(data.extensionId === undefined ||
(typeof data.extensionId === 'string' && data.extensionId.length > 0)));
}
/**
* Intended to be used by a wallet. Announces a wallet by dispatching
* an {@link CAIP294AnnounceWalletEvent}, and listening for
* {@link CAIP294RequestWalletEvent} to re-announce.
*
* @throws If the {@link CAIP294WalletData} is invalid.
* @param walletData - The {@link CAIP294WalletData} to announce.
*/
function announceWallet(walletData) {
if (!isValidWalletData(walletData)) {
throwErrorCAIP294(`Invalid CAIP-294 WalletData object received from ${CAIP294EventNames.Prompt}.`);
}
const _announceWallet = () => window.dispatchEvent(new CustomEvent(CAIP294EventNames.Announce, {
detail: {
id: 1,
jsonrpc: '2.0',
method: 'wallet_announce',
params: walletData,
},
}));
_announceWallet();
window.addEventListener(CAIP294EventNames.Prompt, (event) => {
if (!isValidRequestWalletEvent(event)) {
throwErrorCAIP294(`Invalid CAIP-294 RequestWalletEvent object received from ${CAIP294EventNames.Prompt}.`);
}
_announceWallet();
});
}
/**
* Intended to be used by a dapp. Forwards announced wallet to the
* provided handler by listening for * {@link CAIP294AnnounceWalletEvent},
* and dispatches an {@link CAIP294RequestWalletEvent}.
*
* @param handleWallet - A function that handles an announced wallet.
*/
function requestWallet(handleWallet) {
window.addEventListener(CAIP294EventNames.Announce, (event) => {
if (!isValidAnnounceWalletEvent(event)) {
throwErrorCAIP294(`Invalid CAIP-294 WalletData object received from ${CAIP294EventNames.Announce}.`);
}
handleWallet(event.detail);
});
window.dispatchEvent(new CustomEvent(CAIP294EventNames.Prompt, {
detail: {
id: 1,
jsonrpc: '2.0',
method: 'wallet_prompt',
params: {},
},
}));
}
/**
* Throws an error with link to CAIP-294 specifications.
*
* @param message - The message to include.
* @throws a friendly error with a link to CAIP-294.
*/
function throwErrorCAIP294(message) {
throw new Error(`${message} See https://github.com/ChainAgnostic/CAIPs/blob/bc4942857a8e04593ed92f7dc66653577a1c4435/CAIPs/caip-294.md for requirements.`);
}
//# sourceMappingURL=CAIP294.cjs.map