diff --git a/packages/permission-controller/package.json b/packages/permission-controller/package.json index d054126192..3f193ccd00 100644 --- a/packages/permission-controller/package.json +++ b/packages/permission-controller/package.json @@ -32,7 +32,6 @@ "@metamask/approval-controller": "workspace:^", "@metamask/base-controller": "workspace:^", "@metamask/controller-utils": "workspace:^", - "@metamask/types": "^1.1.0", "@metamask/utils": "^5.0.2", "@types/deep-freeze-strict": "^1.1.0", "deep-freeze-strict": "^1.1.1", diff --git a/packages/permission-controller/src/PermissionController.ts b/packages/permission-controller/src/PermissionController.ts index 894969952b..6b959f1fc8 100644 --- a/packages/permission-controller/src/PermissionController.ts +++ b/packages/permission-controller/src/PermissionController.ts @@ -1,10 +1,9 @@ /* eslint-enable @typescript-eslint/no-unused-vars */ -import { Mutable } from '@metamask/types'; import deepFreeze from 'deep-freeze-strict'; import { castDraft, Draft, Patch } from 'immer'; import { nanoid } from 'nanoid'; import { EthereumRpcError } from 'eth-rpc-errors'; -import { hasProperty, Json } from '@metamask/utils'; +import { hasProperty, Json, Mutable } from '@metamask/utils'; import { AcceptRequest as AcceptApprovalRequest, AddApprovalRequest, diff --git a/packages/permission-controller/src/rpc-methods/getPermissions.ts b/packages/permission-controller/src/rpc-methods/getPermissions.ts index d234c67bc6..5c1b2d3aef 100644 --- a/packages/permission-controller/src/rpc-methods/getPermissions.ts +++ b/packages/permission-controller/src/rpc-methods/getPermissions.ts @@ -1,8 +1,6 @@ -import type { - JsonRpcEngineEndCallback, - PendingJsonRpcResponse, - PermittedHandlerExport, -} from '@metamask/types'; +import type { PendingJsonRpcResponse } from '@metamask/utils'; +import type { JsonRpcEngineEndCallback } from 'json-rpc-engine'; +import type { PermittedHandlerExport } from '../utils'; import { MethodNames } from '../utils'; import type { PermissionConstraint } from '../Permission'; @@ -10,7 +8,7 @@ import type { SubjectPermissions } from '../PermissionController'; export const getPermissionsHandler: PermittedHandlerExport< GetPermissionsHooks, - void, + undefined, PermissionConstraint[] > = { methodNames: [MethodNames.getPermissions], diff --git a/packages/permission-controller/src/rpc-methods/requestPermissions.ts b/packages/permission-controller/src/rpc-methods/requestPermissions.ts index 5509d1ebfb..8a6a851a62 100644 --- a/packages/permission-controller/src/rpc-methods/requestPermissions.ts +++ b/packages/permission-controller/src/rpc-methods/requestPermissions.ts @@ -1,11 +1,8 @@ import { ethErrors } from 'eth-rpc-errors'; -import type { - JsonRpcEngineEndCallback, - JsonRpcRequest, - PendingJsonRpcResponse, - PermittedHandlerExport, -} from '@metamask/types'; +import type { JsonRpcEngineEndCallback } from 'json-rpc-engine'; +import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils'; import { isPlainObject } from '@metamask/controller-utils'; +import type { PermittedHandlerExport } from '../utils'; import { MethodNames } from '../utils'; import { invalidParams } from '../errors'; import type { PermissionConstraint, RequestedPermissions } from '../Permission'; diff --git a/packages/permission-controller/src/utils.ts b/packages/permission-controller/src/utils.ts index 8441d2d260..3e80eb9af3 100644 --- a/packages/permission-controller/src/utils.ts +++ b/packages/permission-controller/src/utils.ts @@ -1,3 +1,13 @@ +import type { + Json, + JsonRpcParams, + JsonRpcRequest, + PendingJsonRpcResponse, +} from '@metamask/utils'; +import type { + JsonRpcEngineEndCallback, + JsonRpcEngineNextCallback, +} from 'json-rpc-engine'; import { CaveatSpecificationConstraint, CaveatSpecificationMap, @@ -25,3 +35,41 @@ export type ExtractSpecifications< | CaveatSpecificationMap | PermissionSpecificationMap, > = SpecificationsMap[keyof SpecificationsMap]; + +/** + * A middleware function for handling a permitted method. + */ +export type HandlerMiddlewareFunction< + T, + U extends JsonRpcParams, + V extends Json, +> = ( + req: JsonRpcRequest, + res: PendingJsonRpcResponse, + next: JsonRpcEngineNextCallback, + end: JsonRpcEngineEndCallback, + hooks: T, +) => void | Promise; + +/** + * We use a mapped object type in order to create a type that requires the + * presence of the names of all hooks for the given handler. + * This can then be used to select only the necessary hooks whenever a method + * is called for purposes of POLA. + */ +export type HookNames = { + [Property in keyof T]: true; +}; + +/** + * A handler for a permitted method. + */ +export type PermittedHandlerExport< + T, + U extends JsonRpcParams, + V extends Json, +> = { + implementation: HandlerMiddlewareFunction; + hookNames: HookNames; + methodNames: string[]; +}; diff --git a/yarn.lock b/yarn.lock index ab33c2ded8..56dad60ed8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1835,7 +1835,6 @@ __metadata: "@metamask/auto-changelog": ^3.1.0 "@metamask/base-controller": "workspace:^" "@metamask/controller-utils": "workspace:^" - "@metamask/types": ^1.1.0 "@metamask/utils": ^5.0.2 "@types/deep-freeze-strict": ^1.1.0 "@types/jest": ^27.4.1 @@ -1998,13 +1997,6 @@ __metadata: languageName: unknown linkType: soft -"@metamask/types@npm:^1.1.0": - version: 1.1.0 - resolution: "@metamask/types@npm:1.1.0" - checksum: 500e8c076a2b0a6d688c8c465101256f090547d99c9a5585efe3d1db7a494b6b2712b127043fb316912caffc4fff78976b9a7780780abb68305e8a3bf812689c - languageName: node - linkType: hard - "@metamask/utils@npm:^3.0.1, @metamask/utils@npm:^3.0.3, @metamask/utils@npm:^3.4.1": version: 3.6.0 resolution: "@metamask/utils@npm:3.6.0"