@metamask/snaps-rpc-methods
Version:
MetaMask Snaps JSON-RPC method implementations
65 lines • 3.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSnapRestrictedMethodSpecifications = exports.buildSnapEndowmentSpecifications = exports.processSnapPermissions = void 0;
const v2_1 = require("@metamask/json-rpc-engine/v2");
const permission_controller_1 = require("@metamask/permission-controller");
const utils_1 = require("@metamask/utils");
const endowments_1 = require("./endowments/index.cjs");
const restricted_1 = require("./restricted/index.cjs");
/**
* Map initial permissions as defined in a Snap manifest to something that can
* be processed by the PermissionsController. Each caveat mapping function
* should return a valid permission caveat value.
*
* This function does not validate the caveat values, since that is done by
* the PermissionsController itself, upon requesting the permissions.
*
* @param initialPermissions - The initial permissions to process.
* @returns The processed permissions.
*/
function processSnapPermissions(initialPermissions) {
return Object.fromEntries(Object.entries(initialPermissions).map(([initialPermission, value]) => {
if ((0, utils_1.hasProperty)(restricted_1.caveatMappers, initialPermission)) {
return [initialPermission, restricted_1.caveatMappers[initialPermission](value)];
}
else if ((0, utils_1.hasProperty)(endowments_1.endowmentCaveatMappers, initialPermission)) {
return [
initialPermission,
endowments_1.endowmentCaveatMappers[initialPermission](value),
];
}
// If we have no mapping, this may be a non-snap permission, return as-is
return [
initialPermission,
value,
];
}));
}
exports.processSnapPermissions = processSnapPermissions;
const buildSnapEndowmentSpecifications = (excludedEndowments) => Object.values(endowments_1.endowmentPermissionBuilders).reduce((allSpecifications, { targetName, specificationBuilder }) => {
if (!excludedEndowments.includes(targetName)) {
allSpecifications[targetName] = specificationBuilder({});
}
return allSpecifications;
}, {});
exports.buildSnapEndowmentSpecifications = buildSnapEndowmentSpecifications;
const buildSnapRestrictedMethodSpecifications = (excludedPermissions, hooks, messenger) => {
const permissionBuilders = Object.values(restricted_1.restrictedMethodPermissionBuilders).filter((builder) => !excludedPermissions.includes(builder.targetName));
const expectedHookNames = new Set(permissionBuilders.flatMap((builder) => builder.methodHooks
? Object.getOwnPropertyNames(builder.methodHooks)
: []));
(0, v2_1.assertExpectedHooks)(hooks, expectedHookNames);
return permissionBuilders.reduce((specifications, { targetName, specificationBuilder, methodHooks, actionNames }) => {
specifications[targetName] = specificationBuilder({
methodHooks: (0, v2_1.selectHooks)(hooks, methodHooks),
messenger: (0, permission_controller_1.createRestrictedMethodMessenger)({
namespace: targetName,
rootMessenger: messenger,
actionNames: actionNames,
}),
});
return specifications;
}, {});
};
exports.buildSnapRestrictedMethodSpecifications = buildSnapRestrictedMethodSpecifications;
//# sourceMappingURL=permissions.cjs.map