@metamask/permission-controller 12.2.1 → 12.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/dist/PermissionController-method-action-types.cjs +7 -0
  3. package/dist/PermissionController-method-action-types.cjs.map +1 -0
  4. package/dist/PermissionController-method-action-types.d.cts +259 -0
  5. package/dist/PermissionController-method-action-types.d.cts.map +1 -0
  6. package/dist/PermissionController-method-action-types.d.mts +259 -0
  7. package/dist/PermissionController-method-action-types.d.mts.map +1 -0
  8. package/dist/PermissionController-method-action-types.mjs +6 -0
  9. package/dist/PermissionController-method-action-types.mjs.map +1 -0
  10. package/dist/PermissionController.cjs +19 -20
  11. package/dist/PermissionController.cjs.map +1 -1
  12. package/dist/PermissionController.d.cts +50 -11
  13. package/dist/PermissionController.d.cts.map +1 -1
  14. package/dist/PermissionController.d.mts +50 -11
  15. package/dist/PermissionController.d.mts.map +1 -1
  16. package/dist/PermissionController.mjs +19 -20
  17. package/dist/PermissionController.mjs.map +1 -1
  18. package/dist/SubjectMetadataController-method-action-types.cjs +7 -0
  19. package/dist/SubjectMetadataController-method-action-types.cjs.map +1 -0
  20. package/dist/SubjectMetadataController-method-action-types.d.cts +51 -0
  21. package/dist/SubjectMetadataController-method-action-types.d.cts.map +1 -0
  22. package/dist/SubjectMetadataController-method-action-types.d.mts +51 -0
  23. package/dist/SubjectMetadataController-method-action-types.d.mts.map +1 -0
  24. package/dist/SubjectMetadataController-method-action-types.mjs +6 -0
  25. package/dist/SubjectMetadataController-method-action-types.mjs.map +1 -0
  26. package/dist/SubjectMetadataController.cjs +7 -2
  27. package/dist/SubjectMetadataController.cjs.map +1 -1
  28. package/dist/SubjectMetadataController.d.cts +16 -4
  29. package/dist/SubjectMetadataController.d.cts.map +1 -1
  30. package/dist/SubjectMetadataController.d.mts +16 -4
  31. package/dist/SubjectMetadataController.d.mts.map +1 -1
  32. package/dist/SubjectMetadataController.mjs +7 -2
  33. package/dist/SubjectMetadataController.mjs.map +1 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +2 -0
  36. package/dist/index.d.cts.map +1 -1
  37. package/dist/index.d.mts +2 -0
  38. package/dist/index.d.mts.map +1 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/package.json +7 -5
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * This file is auto generated.
4
+ * Do not edit manually.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=SubjectMetadataController-method-action-types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController-method-action-types.cjs","sourceRoot":"","sources":["../src/SubjectMetadataController-method-action-types.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { SubjectMetadataController } from './SubjectMetadataController';\n\n/**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\nexport type SubjectMetadataControllerClearStateAction = {\n type: `SubjectMetadataController:clearState`;\n handler: SubjectMetadataController['clearState'];\n};\n\n/**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\nexport type SubjectMetadataControllerAddSubjectMetadataAction = {\n type: `SubjectMetadataController:addSubjectMetadata`;\n handler: SubjectMetadataController['addSubjectMetadata'];\n};\n\n/**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\nexport type SubjectMetadataControllerGetSubjectMetadataAction = {\n type: `SubjectMetadataController:getSubjectMetadata`;\n handler: SubjectMetadataController['getSubjectMetadata'];\n};\n\n/**\n * Deletes all subjects without permissions from the controller's state.\n */\nexport type SubjectMetadataControllerTrimMetadataStateAction = {\n type: `SubjectMetadataController:trimMetadataState`;\n handler: SubjectMetadataController['trimMetadataState'];\n};\n\n/**\n * Union of all SubjectMetadataController action types.\n */\nexport type SubjectMetadataControllerMethodActions =\n | SubjectMetadataControllerClearStateAction\n | SubjectMetadataControllerAddSubjectMetadataAction\n | SubjectMetadataControllerGetSubjectMetadataAction\n | SubjectMetadataControllerTrimMetadataStateAction;\n"]}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * This file is auto generated.
3
+ * Do not edit manually.
4
+ */
5
+ import type { SubjectMetadataController } from "./SubjectMetadataController.cjs";
6
+ /**
7
+ * Clears the state of this controller. Also resets the cache of subjects
8
+ * encountered since startup, so as to not prematurely reach the cache limit.
9
+ */
10
+ export type SubjectMetadataControllerClearStateAction = {
11
+ type: `SubjectMetadataController:clearState`;
12
+ handler: SubjectMetadataController['clearState'];
13
+ };
14
+ /**
15
+ * Stores domain metadata for the given origin (subject). Deletes metadata for
16
+ * subjects without permissions in a FIFO manner once more than
17
+ * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have
18
+ * been added since boot.
19
+ *
20
+ * In order to prevent a degraded user experience,
21
+ * metadata is never deleted for subjects with permissions, since metadata
22
+ * cannot yet be requested on demand.
23
+ *
24
+ * @param metadata - The subject metadata to store.
25
+ */
26
+ export type SubjectMetadataControllerAddSubjectMetadataAction = {
27
+ type: `SubjectMetadataController:addSubjectMetadata`;
28
+ handler: SubjectMetadataController['addSubjectMetadata'];
29
+ };
30
+ /**
31
+ * Gets the subject metadata for the given origin, if any.
32
+ *
33
+ * @param origin - The origin for which to get the subject metadata.
34
+ * @returns The subject metadata, if any, or `undefined` otherwise.
35
+ */
36
+ export type SubjectMetadataControllerGetSubjectMetadataAction = {
37
+ type: `SubjectMetadataController:getSubjectMetadata`;
38
+ handler: SubjectMetadataController['getSubjectMetadata'];
39
+ };
40
+ /**
41
+ * Deletes all subjects without permissions from the controller's state.
42
+ */
43
+ export type SubjectMetadataControllerTrimMetadataStateAction = {
44
+ type: `SubjectMetadataController:trimMetadataState`;
45
+ handler: SubjectMetadataController['trimMetadataState'];
46
+ };
47
+ /**
48
+ * Union of all SubjectMetadataController action types.
49
+ */
50
+ export type SubjectMetadataControllerMethodActions = SubjectMetadataControllerClearStateAction | SubjectMetadataControllerAddSubjectMetadataAction | SubjectMetadataControllerGetSubjectMetadataAction | SubjectMetadataControllerTrimMetadataStateAction;
51
+ //# sourceMappingURL=SubjectMetadataController-method-action-types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController-method-action-types.d.cts","sourceRoot":"","sources":["../src/SubjectMetadataController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAE7E;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GAAG;IACtD,IAAI,EAAE,sCAAsC,CAAC;IAC7C,OAAO,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;CAClD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iDAAiD,GAAG;IAC9D,IAAI,EAAE,8CAA8C,CAAC;IACrD,OAAO,EAAE,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;CAC1D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,iDAAiD,GAAG;IAC9D,IAAI,EAAE,8CAA8C,CAAC;IACrD,OAAO,EAAE,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;CAC1D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gDAAgD,GAAG;IAC7D,IAAI,EAAE,6CAA6C,CAAC;IACpD,OAAO,EAAE,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;CACzD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAC9C,yCAAyC,GACzC,iDAAiD,GACjD,iDAAiD,GACjD,gDAAgD,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * This file is auto generated.
3
+ * Do not edit manually.
4
+ */
5
+ import type { SubjectMetadataController } from "./SubjectMetadataController.mjs";
6
+ /**
7
+ * Clears the state of this controller. Also resets the cache of subjects
8
+ * encountered since startup, so as to not prematurely reach the cache limit.
9
+ */
10
+ export type SubjectMetadataControllerClearStateAction = {
11
+ type: `SubjectMetadataController:clearState`;
12
+ handler: SubjectMetadataController['clearState'];
13
+ };
14
+ /**
15
+ * Stores domain metadata for the given origin (subject). Deletes metadata for
16
+ * subjects without permissions in a FIFO manner once more than
17
+ * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have
18
+ * been added since boot.
19
+ *
20
+ * In order to prevent a degraded user experience,
21
+ * metadata is never deleted for subjects with permissions, since metadata
22
+ * cannot yet be requested on demand.
23
+ *
24
+ * @param metadata - The subject metadata to store.
25
+ */
26
+ export type SubjectMetadataControllerAddSubjectMetadataAction = {
27
+ type: `SubjectMetadataController:addSubjectMetadata`;
28
+ handler: SubjectMetadataController['addSubjectMetadata'];
29
+ };
30
+ /**
31
+ * Gets the subject metadata for the given origin, if any.
32
+ *
33
+ * @param origin - The origin for which to get the subject metadata.
34
+ * @returns The subject metadata, if any, or `undefined` otherwise.
35
+ */
36
+ export type SubjectMetadataControllerGetSubjectMetadataAction = {
37
+ type: `SubjectMetadataController:getSubjectMetadata`;
38
+ handler: SubjectMetadataController['getSubjectMetadata'];
39
+ };
40
+ /**
41
+ * Deletes all subjects without permissions from the controller's state.
42
+ */
43
+ export type SubjectMetadataControllerTrimMetadataStateAction = {
44
+ type: `SubjectMetadataController:trimMetadataState`;
45
+ handler: SubjectMetadataController['trimMetadataState'];
46
+ };
47
+ /**
48
+ * Union of all SubjectMetadataController action types.
49
+ */
50
+ export type SubjectMetadataControllerMethodActions = SubjectMetadataControllerClearStateAction | SubjectMetadataControllerAddSubjectMetadataAction | SubjectMetadataControllerGetSubjectMetadataAction | SubjectMetadataControllerTrimMetadataStateAction;
51
+ //# sourceMappingURL=SubjectMetadataController-method-action-types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController-method-action-types.d.mts","sourceRoot":"","sources":["../src/SubjectMetadataController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAE7E;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GAAG;IACtD,IAAI,EAAE,sCAAsC,CAAC;IAC7C,OAAO,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;CAClD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iDAAiD,GAAG;IAC9D,IAAI,EAAE,8CAA8C,CAAC;IACrD,OAAO,EAAE,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;CAC1D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,iDAAiD,GAAG;IAC9D,IAAI,EAAE,8CAA8C,CAAC;IACrD,OAAO,EAAE,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;CAC1D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gDAAgD,GAAG;IAC7D,IAAI,EAAE,6CAA6C,CAAC;IACpD,OAAO,EAAE,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;CACzD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAC9C,yCAAyC,GACzC,iDAAiD,GACjD,iDAAiD,GACjD,gDAAgD,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This file is auto generated.
3
+ * Do not edit manually.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=SubjectMetadataController-method-action-types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController-method-action-types.mjs","sourceRoot":"","sources":["../src/SubjectMetadataController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { SubjectMetadataController } from './SubjectMetadataController';\n\n/**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\nexport type SubjectMetadataControllerClearStateAction = {\n type: `SubjectMetadataController:clearState`;\n handler: SubjectMetadataController['clearState'];\n};\n\n/**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\nexport type SubjectMetadataControllerAddSubjectMetadataAction = {\n type: `SubjectMetadataController:addSubjectMetadata`;\n handler: SubjectMetadataController['addSubjectMetadata'];\n};\n\n/**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\nexport type SubjectMetadataControllerGetSubjectMetadataAction = {\n type: `SubjectMetadataController:getSubjectMetadata`;\n handler: SubjectMetadataController['getSubjectMetadata'];\n};\n\n/**\n * Deletes all subjects without permissions from the controller's state.\n */\nexport type SubjectMetadataControllerTrimMetadataStateAction = {\n type: `SubjectMetadataController:trimMetadataState`;\n handler: SubjectMetadataController['trimMetadataState'];\n};\n\n/**\n * Union of all SubjectMetadataController action types.\n */\nexport type SubjectMetadataControllerMethodActions =\n | SubjectMetadataControllerClearStateAction\n | SubjectMetadataControllerAddSubjectMetadataAction\n | SubjectMetadataControllerGetSubjectMetadataAction\n | SubjectMetadataControllerTrimMetadataStateAction;\n"]}
@@ -15,6 +15,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SubjectMetadataController = exports.SubjectType = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
17
17
  const controllerName = 'SubjectMetadataController';
18
+ const MESSENGER_EXPOSED_METHODS = [
19
+ 'clearState',
20
+ 'addSubjectMetadata',
21
+ 'getSubjectMetadata',
22
+ 'trimMetadataState',
23
+ ];
18
24
  /**
19
25
  * The different kinds of subjects that MetaMask may interact with, including
20
26
  * third parties and itself (e.g., when the background communicated with the UI).
@@ -64,8 +70,7 @@ class SubjectMetadataController extends base_controller_1.BaseController {
64
70
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectHasPermissions, hasPermissions, "f");
65
71
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectCacheLimit, subjectCacheLimit, "f");
66
72
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectsWithoutPermissionsEncounteredSinceStartup, new Set(), "f");
67
- this.messenger.registerActionHandler(`${this.name}:getSubjectMetadata`, this.getSubjectMetadata.bind(this));
68
- this.messenger.registerActionHandler(`${this.name}:addSubjectMetadata`, this.addSubjectMetadata.bind(this));
73
+ this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
69
74
  }
70
75
  /**
71
76
  * Clears the state of this controller. Also resets the cache of subjects
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectMetadataController.cjs","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\n\nimport type {\n GenericPermissionController,\n HasPermissions,\n PermissionSubjectMetadata,\n} from './PermissionController';\n\nconst controllerName = 'SubjectMetadataController';\n\ntype SubjectOrigin = string;\n\n/**\n * The different kinds of subjects that MetaMask may interact with, including\n * third parties and itself (e.g., when the background communicated with the UI).\n */\nexport enum SubjectType {\n Extension = 'extension',\n Internal = 'internal',\n Unknown = 'unknown',\n Website = 'website',\n Snap = 'snap',\n}\n\nexport type SubjectMetadata = PermissionSubjectMetadata & {\n [key: string]: Json;\n name: string | null;\n subjectType: SubjectType | null;\n extensionId: string | null;\n iconUrl: string | null;\n};\n\ntype SubjectMetadataToAdd = PermissionSubjectMetadata & {\n name?: string | null;\n subjectType?: SubjectType | null;\n extensionId?: string | null;\n iconUrl?: string | null;\n} & Record<string, Json>;\n\nexport type SubjectMetadataControllerState = {\n subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;\n};\n\nconst stateMetadata = {\n subjectMetadata: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: SubjectMetadataControllerState = {\n subjectMetadata: {},\n};\n\nexport type GetSubjectMetadataState = ControllerGetStateAction<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type GetSubjectMetadata = {\n type: `${typeof controllerName}:getSubjectMetadata`;\n handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;\n};\n\nexport type AddSubjectMetadata = {\n type: `${typeof controllerName}:addSubjectMetadata`;\n handler: (metadata: SubjectMetadataToAdd) => void;\n};\n\nexport type SubjectMetadataControllerActions =\n | GetSubjectMetadataState\n | GetSubjectMetadata\n | AddSubjectMetadata;\n\nexport type SubjectMetadataStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type SubjectMetadataControllerEvents = SubjectMetadataStateChange;\n\ntype AllowedActions = HasPermissions;\n\nexport type SubjectMetadataControllerMessenger = Messenger<\n typeof controllerName,\n SubjectMetadataControllerActions | AllowedActions,\n SubjectMetadataControllerEvents\n>;\n\ntype SubjectMetadataControllerOptions = {\n messenger: SubjectMetadataControllerMessenger;\n subjectCacheLimit: number;\n state?: Partial<SubjectMetadataControllerState>;\n};\n\n/**\n * A controller for storing metadata associated with permission subjects. More\n * or less, a cache.\n */\nexport class SubjectMetadataController extends BaseController<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n readonly #subjectCacheLimit: number;\n\n readonly #subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n readonly #subjectHasPermissions: GenericPermissionController['hasPermissions'];\n\n constructor({\n messenger,\n subjectCacheLimit,\n state = {},\n }: SubjectMetadataControllerOptions) {\n if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {\n throw new Error(\n `subjectCacheLimit must be a positive integer. Received: \"${subjectCacheLimit}\"`,\n );\n }\n\n const hasPermissions = (origin: string): boolean => {\n return messenger.call('PermissionController:hasPermissions', origin);\n };\n\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n ...SubjectMetadataController.#getTrimmedState(state, hasPermissions),\n },\n });\n\n this.#subjectHasPermissions = hasPermissions;\n this.#subjectCacheLimit = subjectCacheLimit;\n this.#subjectsWithoutPermissionsEncounteredSinceStartup = new Set();\n\n this.messenger.registerActionHandler(\n `${this.name}:getSubjectMetadata`,\n this.getSubjectMetadata.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${this.name}:addSubjectMetadata`,\n this.addSubjectMetadata.bind(this),\n );\n }\n\n /**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\n clearState(): void {\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.clear();\n this.update((_draftState) => {\n return { ...defaultState };\n });\n }\n\n /**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\n addSubjectMetadata(metadata: SubjectMetadataToAdd): void {\n const { origin } = metadata;\n const newMetadata: SubjectMetadata = {\n ...metadata,\n extensionId: metadata.extensionId ?? null,\n iconUrl: metadata.iconUrl ?? null,\n name: metadata.name ?? null,\n subjectType: metadata.subjectType ?? null,\n };\n\n let originToForget: string | null = null;\n // We only delete the oldest encountered subject from the cache, again to\n // ensure that the user's experience isn't degraded by missing icons etc.\n if (\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.size >=\n this.#subjectCacheLimit\n ) {\n const cachedOrigin =\n this.#subjectsWithoutPermissionsEncounteredSinceStartup\n .values()\n .next().value;\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.delete(\n cachedOrigin,\n );\n\n if (!this.#subjectHasPermissions(cachedOrigin)) {\n originToForget = cachedOrigin;\n }\n }\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);\n\n this.update((draftState) => {\n // @ts-expect-error TS2589: Type instantiation is excessively deep and possibly infinite\n draftState.subjectMetadata[origin] = newMetadata;\n if (typeof originToForget === 'string') {\n delete draftState.subjectMetadata[originToForget];\n }\n });\n }\n\n /**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\n getSubjectMetadata(origin: SubjectOrigin): SubjectMetadata | undefined {\n return this.state.subjectMetadata[origin];\n }\n\n /**\n * Deletes all subjects without permissions from the controller's state.\n */\n trimMetadataState(): void {\n this.update(() => {\n return SubjectMetadataController.#getTrimmedState(\n this.state,\n this.#subjectHasPermissions,\n );\n });\n }\n\n /**\n * Returns a new state object that only includes subjects with permissions.\n * This method is static because we want to call it in the constructor, before\n * the controller's state is initialized.\n *\n * @param state - The state object to trim.\n * @param hasPermissions - A function that returns a boolean indicating\n * whether a particular subject (identified by its origin) has any\n * permissions.\n * @returns The new state object. If the specified `state` object has no\n * subject metadata, the returned object will be equivalent to the default\n * state of this controller.\n */\n static #getTrimmedState(\n state: Partial<SubjectMetadataControllerState>,\n hasPermissions: GenericPermissionController['hasPermissions'],\n ): SubjectMetadataControllerState {\n const { subjectMetadata = {} } = state;\n\n return {\n subjectMetadata: Object.keys(subjectMetadata).reduce<\n Record<SubjectOrigin, SubjectMetadata>\n >((newSubjectMetadata, origin) => {\n if (hasPermissions(origin)) {\n newSubjectMetadata[origin] = subjectMetadata[origin];\n }\n return newSubjectMetadata;\n }, {}),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"SubjectMetadataController.cjs","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\n\nimport type {\n GenericPermissionController,\n PermissionSubjectMetadata,\n} from './PermissionController';\nimport type { PermissionControllerHasPermissionsAction } from './PermissionController-method-action-types';\nimport type { SubjectMetadataControllerMethodActions } from './SubjectMetadataController-method-action-types';\n\nconst controllerName = 'SubjectMetadataController';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'clearState',\n 'addSubjectMetadata',\n 'getSubjectMetadata',\n 'trimMetadataState',\n] as const;\n\ntype SubjectOrigin = string;\n\n/**\n * The different kinds of subjects that MetaMask may interact with, including\n * third parties and itself (e.g., when the background communicated with the UI).\n */\nexport enum SubjectType {\n Extension = 'extension',\n Internal = 'internal',\n Unknown = 'unknown',\n Website = 'website',\n Snap = 'snap',\n}\n\nexport type SubjectMetadata = PermissionSubjectMetadata & {\n [key: string]: Json;\n name: string | null;\n subjectType: SubjectType | null;\n extensionId: string | null;\n iconUrl: string | null;\n};\n\ntype SubjectMetadataToAdd = PermissionSubjectMetadata & {\n name?: string | null;\n subjectType?: SubjectType | null;\n extensionId?: string | null;\n iconUrl?: string | null;\n} & Record<string, Json>;\n\nexport type SubjectMetadataControllerState = {\n subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;\n};\n\nconst stateMetadata = {\n subjectMetadata: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: SubjectMetadataControllerState = {\n subjectMetadata: {},\n};\n\nexport type SubjectMetadataControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\n/**\n * @deprecated Use `SubjectMetadataControllerGetStateAction` instead.\n */\nexport type GetSubjectMetadataState = SubjectMetadataControllerGetStateAction;\n\n/**\n * @deprecated Use `SubjectMetadataControllerGetSubjectMetadataAction` instead.\n */\nexport type GetSubjectMetadata = {\n type: `${typeof controllerName}:getSubjectMetadata`;\n handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;\n};\n\n/**\n * @deprecated Use `SubjectMetadataControllerAddSubjectMetadataAction` instead.\n */\nexport type AddSubjectMetadata = {\n type: `${typeof controllerName}:addSubjectMetadata`;\n handler: (metadata: SubjectMetadataToAdd) => void;\n};\n\nexport type SubjectMetadataControllerActions =\n | SubjectMetadataControllerGetStateAction\n | SubjectMetadataControllerMethodActions;\n\nexport type SubjectMetadataStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type SubjectMetadataControllerEvents = SubjectMetadataStateChange;\n\ntype AllowedActions = PermissionControllerHasPermissionsAction;\n\nexport type SubjectMetadataControllerMessenger = Messenger<\n typeof controllerName,\n SubjectMetadataControllerActions | AllowedActions,\n SubjectMetadataControllerEvents\n>;\n\ntype SubjectMetadataControllerOptions = {\n messenger: SubjectMetadataControllerMessenger;\n subjectCacheLimit: number;\n state?: Partial<SubjectMetadataControllerState>;\n};\n\n/**\n * A controller for storing metadata associated with permission subjects. More\n * or less, a cache.\n */\nexport class SubjectMetadataController extends BaseController<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n readonly #subjectCacheLimit: number;\n\n readonly #subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n readonly #subjectHasPermissions: GenericPermissionController['hasPermissions'];\n\n constructor({\n messenger,\n subjectCacheLimit,\n state = {},\n }: SubjectMetadataControllerOptions) {\n if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {\n throw new Error(\n `subjectCacheLimit must be a positive integer. Received: \"${subjectCacheLimit}\"`,\n );\n }\n\n const hasPermissions = (origin: string): boolean => {\n return messenger.call('PermissionController:hasPermissions', origin);\n };\n\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n ...SubjectMetadataController.#getTrimmedState(state, hasPermissions),\n },\n });\n\n this.#subjectHasPermissions = hasPermissions;\n this.#subjectCacheLimit = subjectCacheLimit;\n this.#subjectsWithoutPermissionsEncounteredSinceStartup = new Set();\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\n clearState(): void {\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.clear();\n this.update((_draftState) => {\n return { ...defaultState };\n });\n }\n\n /**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\n addSubjectMetadata(metadata: SubjectMetadataToAdd): void {\n const { origin } = metadata;\n const newMetadata: SubjectMetadata = {\n ...metadata,\n extensionId: metadata.extensionId ?? null,\n iconUrl: metadata.iconUrl ?? null,\n name: metadata.name ?? null,\n subjectType: metadata.subjectType ?? null,\n };\n\n let originToForget: string | null = null;\n // We only delete the oldest encountered subject from the cache, again to\n // ensure that the user's experience isn't degraded by missing icons etc.\n if (\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.size >=\n this.#subjectCacheLimit\n ) {\n const cachedOrigin =\n this.#subjectsWithoutPermissionsEncounteredSinceStartup\n .values()\n .next().value;\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.delete(\n cachedOrigin,\n );\n\n if (!this.#subjectHasPermissions(cachedOrigin)) {\n originToForget = cachedOrigin;\n }\n }\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);\n\n this.update((draftState) => {\n // @ts-expect-error TS2589: Type instantiation is excessively deep and possibly infinite\n draftState.subjectMetadata[origin] = newMetadata;\n if (typeof originToForget === 'string') {\n delete draftState.subjectMetadata[originToForget];\n }\n });\n }\n\n /**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\n getSubjectMetadata(origin: SubjectOrigin): SubjectMetadata | undefined {\n return this.state.subjectMetadata[origin];\n }\n\n /**\n * Deletes all subjects without permissions from the controller's state.\n */\n trimMetadataState(): void {\n this.update(() => {\n return SubjectMetadataController.#getTrimmedState(\n this.state,\n this.#subjectHasPermissions,\n );\n });\n }\n\n /**\n * Returns a new state object that only includes subjects with permissions.\n * This method is static because we want to call it in the constructor, before\n * the controller's state is initialized.\n *\n * @param state - The state object to trim.\n * @param hasPermissions - A function that returns a boolean indicating\n * whether a particular subject (identified by its origin) has any\n * permissions.\n * @returns The new state object. If the specified `state` object has no\n * subject metadata, the returned object will be equivalent to the default\n * state of this controller.\n */\n static #getTrimmedState(\n state: Partial<SubjectMetadataControllerState>,\n hasPermissions: GenericPermissionController['hasPermissions'],\n ): SubjectMetadataControllerState {\n const { subjectMetadata = {} } = state;\n\n return {\n subjectMetadata: Object.keys(subjectMetadata).reduce<\n Record<SubjectOrigin, SubjectMetadata>\n >((newSubjectMetadata, origin) => {\n if (hasPermissions(origin)) {\n newSubjectMetadata[origin] = subjectMetadata[origin];\n }\n return newSubjectMetadata;\n }, {}),\n };\n }\n}\n"]}
@@ -2,7 +2,9 @@ import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@meta
2
2
  import { BaseController } from "@metamask/base-controller";
3
3
  import type { Messenger } from "@metamask/messenger";
4
4
  import type { Json } from "@metamask/utils";
5
- import type { HasPermissions, PermissionSubjectMetadata } from "./PermissionController.cjs";
5
+ import type { PermissionSubjectMetadata } from "./PermissionController.cjs";
6
+ import type { PermissionControllerHasPermissionsAction } from "./PermissionController-method-action-types.cjs";
7
+ import type { SubjectMetadataControllerMethodActions } from "./SubjectMetadataController-method-action-types.cjs";
6
8
  declare const controllerName = "SubjectMetadataController";
7
9
  type SubjectOrigin = string;
8
10
  /**
@@ -32,19 +34,29 @@ type SubjectMetadataToAdd = PermissionSubjectMetadata & {
32
34
  export type SubjectMetadataControllerState = {
33
35
  subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;
34
36
  };
35
- export type GetSubjectMetadataState = ControllerGetStateAction<typeof controllerName, SubjectMetadataControllerState>;
37
+ export type SubjectMetadataControllerGetStateAction = ControllerGetStateAction<typeof controllerName, SubjectMetadataControllerState>;
38
+ /**
39
+ * @deprecated Use `SubjectMetadataControllerGetStateAction` instead.
40
+ */
41
+ export type GetSubjectMetadataState = SubjectMetadataControllerGetStateAction;
42
+ /**
43
+ * @deprecated Use `SubjectMetadataControllerGetSubjectMetadataAction` instead.
44
+ */
36
45
  export type GetSubjectMetadata = {
37
46
  type: `${typeof controllerName}:getSubjectMetadata`;
38
47
  handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;
39
48
  };
49
+ /**
50
+ * @deprecated Use `SubjectMetadataControllerAddSubjectMetadataAction` instead.
51
+ */
40
52
  export type AddSubjectMetadata = {
41
53
  type: `${typeof controllerName}:addSubjectMetadata`;
42
54
  handler: (metadata: SubjectMetadataToAdd) => void;
43
55
  };
44
- export type SubjectMetadataControllerActions = GetSubjectMetadataState | GetSubjectMetadata | AddSubjectMetadata;
56
+ export type SubjectMetadataControllerActions = SubjectMetadataControllerGetStateAction | SubjectMetadataControllerMethodActions;
45
57
  export type SubjectMetadataStateChange = ControllerStateChangeEvent<typeof controllerName, SubjectMetadataControllerState>;
46
58
  export type SubjectMetadataControllerEvents = SubjectMetadataStateChange;
47
- type AllowedActions = HasPermissions;
59
+ type AllowedActions = PermissionControllerHasPermissionsAction;
48
60
  export type SubjectMetadataControllerMessenger = Messenger<typeof controllerName, SubjectMetadataControllerActions | AllowedActions, SubjectMetadataControllerEvents>;
49
61
  type SubjectMetadataControllerOptions = {
50
62
  messenger: SubjectMetadataControllerMessenger;
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectMetadataController.d.cts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubjectMetadataController.d.cts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@ import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@meta
2
2
  import { BaseController } from "@metamask/base-controller";
3
3
  import type { Messenger } from "@metamask/messenger";
4
4
  import type { Json } from "@metamask/utils";
5
- import type { HasPermissions, PermissionSubjectMetadata } from "./PermissionController.mjs";
5
+ import type { PermissionSubjectMetadata } from "./PermissionController.mjs";
6
+ import type { PermissionControllerHasPermissionsAction } from "./PermissionController-method-action-types.mjs";
7
+ import type { SubjectMetadataControllerMethodActions } from "./SubjectMetadataController-method-action-types.mjs";
6
8
  declare const controllerName = "SubjectMetadataController";
7
9
  type SubjectOrigin = string;
8
10
  /**
@@ -32,19 +34,29 @@ type SubjectMetadataToAdd = PermissionSubjectMetadata & {
32
34
  export type SubjectMetadataControllerState = {
33
35
  subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;
34
36
  };
35
- export type GetSubjectMetadataState = ControllerGetStateAction<typeof controllerName, SubjectMetadataControllerState>;
37
+ export type SubjectMetadataControllerGetStateAction = ControllerGetStateAction<typeof controllerName, SubjectMetadataControllerState>;
38
+ /**
39
+ * @deprecated Use `SubjectMetadataControllerGetStateAction` instead.
40
+ */
41
+ export type GetSubjectMetadataState = SubjectMetadataControllerGetStateAction;
42
+ /**
43
+ * @deprecated Use `SubjectMetadataControllerGetSubjectMetadataAction` instead.
44
+ */
36
45
  export type GetSubjectMetadata = {
37
46
  type: `${typeof controllerName}:getSubjectMetadata`;
38
47
  handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;
39
48
  };
49
+ /**
50
+ * @deprecated Use `SubjectMetadataControllerAddSubjectMetadataAction` instead.
51
+ */
40
52
  export type AddSubjectMetadata = {
41
53
  type: `${typeof controllerName}:addSubjectMetadata`;
42
54
  handler: (metadata: SubjectMetadataToAdd) => void;
43
55
  };
44
- export type SubjectMetadataControllerActions = GetSubjectMetadataState | GetSubjectMetadata | AddSubjectMetadata;
56
+ export type SubjectMetadataControllerActions = SubjectMetadataControllerGetStateAction | SubjectMetadataControllerMethodActions;
45
57
  export type SubjectMetadataStateChange = ControllerStateChangeEvent<typeof controllerName, SubjectMetadataControllerState>;
46
58
  export type SubjectMetadataControllerEvents = SubjectMetadataStateChange;
47
- type AllowedActions = HasPermissions;
59
+ type AllowedActions = PermissionControllerHasPermissionsAction;
48
60
  export type SubjectMetadataControllerMessenger = Messenger<typeof controllerName, SubjectMetadataControllerActions | AllowedActions, SubjectMetadataControllerEvents>;
49
61
  type SubjectMetadataControllerOptions = {
50
62
  messenger: SubjectMetadataControllerMessenger;
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectMetadataController.d.mts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SubjectMetadataController.d.mts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,12 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
12
12
  var _a, _SubjectMetadataController_subjectCacheLimit, _SubjectMetadataController_subjectsWithoutPermissionsEncounteredSinceStartup, _SubjectMetadataController_subjectHasPermissions, _SubjectMetadataController_getTrimmedState;
13
13
  import { BaseController } from "@metamask/base-controller";
14
14
  const controllerName = 'SubjectMetadataController';
15
+ const MESSENGER_EXPOSED_METHODS = [
16
+ 'clearState',
17
+ 'addSubjectMetadata',
18
+ 'getSubjectMetadata',
19
+ 'trimMetadataState',
20
+ ];
15
21
  /**
16
22
  * The different kinds of subjects that MetaMask may interact with, including
17
23
  * third parties and itself (e.g., when the background communicated with the UI).
@@ -61,8 +67,7 @@ export class SubjectMetadataController extends BaseController {
61
67
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectHasPermissions, hasPermissions, "f");
62
68
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectCacheLimit, subjectCacheLimit, "f");
63
69
  __classPrivateFieldSet(this, _SubjectMetadataController_subjectsWithoutPermissionsEncounteredSinceStartup, new Set(), "f");
64
- this.messenger.registerActionHandler(`${this.name}:getSubjectMetadata`, this.getSubjectMetadata.bind(this));
65
- this.messenger.registerActionHandler(`${this.name}:addSubjectMetadata`, this.addSubjectMetadata.bind(this));
70
+ this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
66
71
  }
67
72
  /**
68
73
  * Clears the state of this controller. Also resets the cache of subjects
@@ -1 +1 @@
1
- {"version":3,"file":"SubjectMetadataController.mjs","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\n\nimport type {\n GenericPermissionController,\n HasPermissions,\n PermissionSubjectMetadata,\n} from './PermissionController';\n\nconst controllerName = 'SubjectMetadataController';\n\ntype SubjectOrigin = string;\n\n/**\n * The different kinds of subjects that MetaMask may interact with, including\n * third parties and itself (e.g., when the background communicated with the UI).\n */\nexport enum SubjectType {\n Extension = 'extension',\n Internal = 'internal',\n Unknown = 'unknown',\n Website = 'website',\n Snap = 'snap',\n}\n\nexport type SubjectMetadata = PermissionSubjectMetadata & {\n [key: string]: Json;\n name: string | null;\n subjectType: SubjectType | null;\n extensionId: string | null;\n iconUrl: string | null;\n};\n\ntype SubjectMetadataToAdd = PermissionSubjectMetadata & {\n name?: string | null;\n subjectType?: SubjectType | null;\n extensionId?: string | null;\n iconUrl?: string | null;\n} & Record<string, Json>;\n\nexport type SubjectMetadataControllerState = {\n subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;\n};\n\nconst stateMetadata = {\n subjectMetadata: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: SubjectMetadataControllerState = {\n subjectMetadata: {},\n};\n\nexport type GetSubjectMetadataState = ControllerGetStateAction<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type GetSubjectMetadata = {\n type: `${typeof controllerName}:getSubjectMetadata`;\n handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;\n};\n\nexport type AddSubjectMetadata = {\n type: `${typeof controllerName}:addSubjectMetadata`;\n handler: (metadata: SubjectMetadataToAdd) => void;\n};\n\nexport type SubjectMetadataControllerActions =\n | GetSubjectMetadataState\n | GetSubjectMetadata\n | AddSubjectMetadata;\n\nexport type SubjectMetadataStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type SubjectMetadataControllerEvents = SubjectMetadataStateChange;\n\ntype AllowedActions = HasPermissions;\n\nexport type SubjectMetadataControllerMessenger = Messenger<\n typeof controllerName,\n SubjectMetadataControllerActions | AllowedActions,\n SubjectMetadataControllerEvents\n>;\n\ntype SubjectMetadataControllerOptions = {\n messenger: SubjectMetadataControllerMessenger;\n subjectCacheLimit: number;\n state?: Partial<SubjectMetadataControllerState>;\n};\n\n/**\n * A controller for storing metadata associated with permission subjects. More\n * or less, a cache.\n */\nexport class SubjectMetadataController extends BaseController<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n readonly #subjectCacheLimit: number;\n\n readonly #subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n readonly #subjectHasPermissions: GenericPermissionController['hasPermissions'];\n\n constructor({\n messenger,\n subjectCacheLimit,\n state = {},\n }: SubjectMetadataControllerOptions) {\n if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {\n throw new Error(\n `subjectCacheLimit must be a positive integer. Received: \"${subjectCacheLimit}\"`,\n );\n }\n\n const hasPermissions = (origin: string): boolean => {\n return messenger.call('PermissionController:hasPermissions', origin);\n };\n\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n ...SubjectMetadataController.#getTrimmedState(state, hasPermissions),\n },\n });\n\n this.#subjectHasPermissions = hasPermissions;\n this.#subjectCacheLimit = subjectCacheLimit;\n this.#subjectsWithoutPermissionsEncounteredSinceStartup = new Set();\n\n this.messenger.registerActionHandler(\n `${this.name}:getSubjectMetadata`,\n this.getSubjectMetadata.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${this.name}:addSubjectMetadata`,\n this.addSubjectMetadata.bind(this),\n );\n }\n\n /**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\n clearState(): void {\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.clear();\n this.update((_draftState) => {\n return { ...defaultState };\n });\n }\n\n /**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\n addSubjectMetadata(metadata: SubjectMetadataToAdd): void {\n const { origin } = metadata;\n const newMetadata: SubjectMetadata = {\n ...metadata,\n extensionId: metadata.extensionId ?? null,\n iconUrl: metadata.iconUrl ?? null,\n name: metadata.name ?? null,\n subjectType: metadata.subjectType ?? null,\n };\n\n let originToForget: string | null = null;\n // We only delete the oldest encountered subject from the cache, again to\n // ensure that the user's experience isn't degraded by missing icons etc.\n if (\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.size >=\n this.#subjectCacheLimit\n ) {\n const cachedOrigin =\n this.#subjectsWithoutPermissionsEncounteredSinceStartup\n .values()\n .next().value;\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.delete(\n cachedOrigin,\n );\n\n if (!this.#subjectHasPermissions(cachedOrigin)) {\n originToForget = cachedOrigin;\n }\n }\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);\n\n this.update((draftState) => {\n // @ts-expect-error TS2589: Type instantiation is excessively deep and possibly infinite\n draftState.subjectMetadata[origin] = newMetadata;\n if (typeof originToForget === 'string') {\n delete draftState.subjectMetadata[originToForget];\n }\n });\n }\n\n /**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\n getSubjectMetadata(origin: SubjectOrigin): SubjectMetadata | undefined {\n return this.state.subjectMetadata[origin];\n }\n\n /**\n * Deletes all subjects without permissions from the controller's state.\n */\n trimMetadataState(): void {\n this.update(() => {\n return SubjectMetadataController.#getTrimmedState(\n this.state,\n this.#subjectHasPermissions,\n );\n });\n }\n\n /**\n * Returns a new state object that only includes subjects with permissions.\n * This method is static because we want to call it in the constructor, before\n * the controller's state is initialized.\n *\n * @param state - The state object to trim.\n * @param hasPermissions - A function that returns a boolean indicating\n * whether a particular subject (identified by its origin) has any\n * permissions.\n * @returns The new state object. If the specified `state` object has no\n * subject metadata, the returned object will be equivalent to the default\n * state of this controller.\n */\n static #getTrimmedState(\n state: Partial<SubjectMetadataControllerState>,\n hasPermissions: GenericPermissionController['hasPermissions'],\n ): SubjectMetadataControllerState {\n const { subjectMetadata = {} } = state;\n\n return {\n subjectMetadata: Object.keys(subjectMetadata).reduce<\n Record<SubjectOrigin, SubjectMetadata>\n >((newSubjectMetadata, origin) => {\n if (hasPermissions(origin)) {\n newSubjectMetadata[origin] = subjectMetadata[origin];\n }\n return newSubjectMetadata;\n }, {}),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"SubjectMetadataController.mjs","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\n\nimport type {\n GenericPermissionController,\n PermissionSubjectMetadata,\n} from './PermissionController';\nimport type { PermissionControllerHasPermissionsAction } from './PermissionController-method-action-types';\nimport type { SubjectMetadataControllerMethodActions } from './SubjectMetadataController-method-action-types';\n\nconst controllerName = 'SubjectMetadataController';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'clearState',\n 'addSubjectMetadata',\n 'getSubjectMetadata',\n 'trimMetadataState',\n] as const;\n\ntype SubjectOrigin = string;\n\n/**\n * The different kinds of subjects that MetaMask may interact with, including\n * third parties and itself (e.g., when the background communicated with the UI).\n */\nexport enum SubjectType {\n Extension = 'extension',\n Internal = 'internal',\n Unknown = 'unknown',\n Website = 'website',\n Snap = 'snap',\n}\n\nexport type SubjectMetadata = PermissionSubjectMetadata & {\n [key: string]: Json;\n name: string | null;\n subjectType: SubjectType | null;\n extensionId: string | null;\n iconUrl: string | null;\n};\n\ntype SubjectMetadataToAdd = PermissionSubjectMetadata & {\n name?: string | null;\n subjectType?: SubjectType | null;\n extensionId?: string | null;\n iconUrl?: string | null;\n} & Record<string, Json>;\n\nexport type SubjectMetadataControllerState = {\n subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;\n};\n\nconst stateMetadata = {\n subjectMetadata: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: SubjectMetadataControllerState = {\n subjectMetadata: {},\n};\n\nexport type SubjectMetadataControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\n/**\n * @deprecated Use `SubjectMetadataControllerGetStateAction` instead.\n */\nexport type GetSubjectMetadataState = SubjectMetadataControllerGetStateAction;\n\n/**\n * @deprecated Use `SubjectMetadataControllerGetSubjectMetadataAction` instead.\n */\nexport type GetSubjectMetadata = {\n type: `${typeof controllerName}:getSubjectMetadata`;\n handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;\n};\n\n/**\n * @deprecated Use `SubjectMetadataControllerAddSubjectMetadataAction` instead.\n */\nexport type AddSubjectMetadata = {\n type: `${typeof controllerName}:addSubjectMetadata`;\n handler: (metadata: SubjectMetadataToAdd) => void;\n};\n\nexport type SubjectMetadataControllerActions =\n | SubjectMetadataControllerGetStateAction\n | SubjectMetadataControllerMethodActions;\n\nexport type SubjectMetadataStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n SubjectMetadataControllerState\n>;\n\nexport type SubjectMetadataControllerEvents = SubjectMetadataStateChange;\n\ntype AllowedActions = PermissionControllerHasPermissionsAction;\n\nexport type SubjectMetadataControllerMessenger = Messenger<\n typeof controllerName,\n SubjectMetadataControllerActions | AllowedActions,\n SubjectMetadataControllerEvents\n>;\n\ntype SubjectMetadataControllerOptions = {\n messenger: SubjectMetadataControllerMessenger;\n subjectCacheLimit: number;\n state?: Partial<SubjectMetadataControllerState>;\n};\n\n/**\n * A controller for storing metadata associated with permission subjects. More\n * or less, a cache.\n */\nexport class SubjectMetadataController extends BaseController<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n readonly #subjectCacheLimit: number;\n\n readonly #subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n readonly #subjectHasPermissions: GenericPermissionController['hasPermissions'];\n\n constructor({\n messenger,\n subjectCacheLimit,\n state = {},\n }: SubjectMetadataControllerOptions) {\n if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {\n throw new Error(\n `subjectCacheLimit must be a positive integer. Received: \"${subjectCacheLimit}\"`,\n );\n }\n\n const hasPermissions = (origin: string): boolean => {\n return messenger.call('PermissionController:hasPermissions', origin);\n };\n\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n ...SubjectMetadataController.#getTrimmedState(state, hasPermissions),\n },\n });\n\n this.#subjectHasPermissions = hasPermissions;\n this.#subjectCacheLimit = subjectCacheLimit;\n this.#subjectsWithoutPermissionsEncounteredSinceStartup = new Set();\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Clears the state of this controller. Also resets the cache of subjects\n * encountered since startup, so as to not prematurely reach the cache limit.\n */\n clearState(): void {\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.clear();\n this.update((_draftState) => {\n return { ...defaultState };\n });\n }\n\n /**\n * Stores domain metadata for the given origin (subject). Deletes metadata for\n * subjects without permissions in a FIFO manner once more than\n * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have\n * been added since boot.\n *\n * In order to prevent a degraded user experience,\n * metadata is never deleted for subjects with permissions, since metadata\n * cannot yet be requested on demand.\n *\n * @param metadata - The subject metadata to store.\n */\n addSubjectMetadata(metadata: SubjectMetadataToAdd): void {\n const { origin } = metadata;\n const newMetadata: SubjectMetadata = {\n ...metadata,\n extensionId: metadata.extensionId ?? null,\n iconUrl: metadata.iconUrl ?? null,\n name: metadata.name ?? null,\n subjectType: metadata.subjectType ?? null,\n };\n\n let originToForget: string | null = null;\n // We only delete the oldest encountered subject from the cache, again to\n // ensure that the user's experience isn't degraded by missing icons etc.\n if (\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.size >=\n this.#subjectCacheLimit\n ) {\n const cachedOrigin =\n this.#subjectsWithoutPermissionsEncounteredSinceStartup\n .values()\n .next().value;\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.delete(\n cachedOrigin,\n );\n\n if (!this.#subjectHasPermissions(cachedOrigin)) {\n originToForget = cachedOrigin;\n }\n }\n\n this.#subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);\n\n this.update((draftState) => {\n // @ts-expect-error TS2589: Type instantiation is excessively deep and possibly infinite\n draftState.subjectMetadata[origin] = newMetadata;\n if (typeof originToForget === 'string') {\n delete draftState.subjectMetadata[originToForget];\n }\n });\n }\n\n /**\n * Gets the subject metadata for the given origin, if any.\n *\n * @param origin - The origin for which to get the subject metadata.\n * @returns The subject metadata, if any, or `undefined` otherwise.\n */\n getSubjectMetadata(origin: SubjectOrigin): SubjectMetadata | undefined {\n return this.state.subjectMetadata[origin];\n }\n\n /**\n * Deletes all subjects without permissions from the controller's state.\n */\n trimMetadataState(): void {\n this.update(() => {\n return SubjectMetadataController.#getTrimmedState(\n this.state,\n this.#subjectHasPermissions,\n );\n });\n }\n\n /**\n * Returns a new state object that only includes subjects with permissions.\n * This method is static because we want to call it in the constructor, before\n * the controller's state is initialized.\n *\n * @param state - The state object to trim.\n * @param hasPermissions - A function that returns a boolean indicating\n * whether a particular subject (identified by its origin) has any\n * permissions.\n * @returns The new state object. If the specified `state` object has no\n * subject metadata, the returned object will be equivalent to the default\n * state of this controller.\n */\n static #getTrimmedState(\n state: Partial<SubjectMetadataControllerState>,\n hasPermissions: GenericPermissionController['hasPermissions'],\n ): SubjectMetadataControllerState {\n const { subjectMetadata = {} } = state;\n\n return {\n subjectMetadata: Object.keys(subjectMetadata).reduce<\n Record<SubjectOrigin, SubjectMetadata>\n >((newSubjectMetadata, origin) => {\n if (hasPermissions(origin)) {\n newSubjectMetadata[origin] = subjectMetadata[origin];\n }\n return newSubjectMetadata;\n }, {}),\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAyB;AACzB,+CAAyB;AACzB,mDAA6B;AAC7B,6DAAuC;AAOvC,qCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,gFAAsD;AACtD,kEAA4C","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport type {\n ExtractSpecifications,\n HandlerMiddlewareFunction,\n HookNames,\n PermittedHandlerExport,\n} from './utils';\nexport { MethodNames } from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\nexport * from './SubjectMetadataController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAyB;AACzB,+CAAyB;AACzB,mDAA6B;AAC7B,6DAAuC;AAwBvC,qCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,gFAAsD;AACtD,kEAA4C","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport type {\n PermissionControllerClearStateAction,\n PermissionControllerGetSubjectNamesAction,\n PermissionControllerGetPermissionsAction,\n PermissionControllerHasPermissionAction,\n PermissionControllerHasPermissionsAction,\n PermissionControllerRevokeAllPermissionsAction,\n PermissionControllerRevokePermissionsAction,\n PermissionControllerRevokePermissionForAllSubjectsAction,\n PermissionControllerGetCaveatAction,\n PermissionControllerUpdateCaveatAction,\n PermissionControllerGrantPermissionsAction,\n PermissionControllerGrantPermissionsIncrementalAction,\n PermissionControllerRequestPermissionsAction,\n PermissionControllerRequestPermissionsIncrementalAction,\n PermissionControllerGetEndowmentsAction,\n} from './PermissionController-method-action-types';\nexport type {\n ExtractSpecifications,\n HandlerMiddlewareFunction,\n HookNames,\n PermittedHandlerExport,\n} from './utils';\nexport { MethodNames } from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\nexport * from './SubjectMetadataController';\nexport type {\n SubjectMetadataControllerClearStateAction,\n SubjectMetadataControllerAddSubjectMetadataAction,\n SubjectMetadataControllerGetSubjectMetadataAction,\n SubjectMetadataControllerTrimMetadataStateAction,\n} from './SubjectMetadataController-method-action-types';\n"]}
package/dist/index.d.cts CHANGED
@@ -2,8 +2,10 @@ export * from "./Caveat.cjs";
2
2
  export * from "./errors.cjs";
3
3
  export * from "./Permission.cjs";
4
4
  export * from "./PermissionController.cjs";
5
+ export type { PermissionControllerClearStateAction, PermissionControllerGetSubjectNamesAction, PermissionControllerGetPermissionsAction, PermissionControllerHasPermissionAction, PermissionControllerHasPermissionsAction, PermissionControllerRevokeAllPermissionsAction, PermissionControllerRevokePermissionsAction, PermissionControllerRevokePermissionForAllSubjectsAction, PermissionControllerGetCaveatAction, PermissionControllerUpdateCaveatAction, PermissionControllerGrantPermissionsAction, PermissionControllerGrantPermissionsIncrementalAction, PermissionControllerRequestPermissionsAction, PermissionControllerRequestPermissionsIncrementalAction, PermissionControllerGetEndowmentsAction, } from "./PermissionController-method-action-types.cjs";
5
6
  export type { ExtractSpecifications, HandlerMiddlewareFunction, HookNames, PermittedHandlerExport, } from "./utils.cjs";
6
7
  export { MethodNames } from "./utils.cjs";
7
8
  export * as permissionRpcMethods from "./rpc-methods/index.cjs";
8
9
  export * from "./SubjectMetadataController.cjs";
10
+ export type { SubjectMetadataControllerClearStateAction, SubjectMetadataControllerAddSubjectMetadataAction, SubjectMetadataControllerGetSubjectMetadataAction, SubjectMetadataControllerTrimMetadataStateAction, } from "./SubjectMetadataController-method-action-types.cjs";
9
11
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AACvC,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,sBAAsB,GACvB,oBAAgB;AACjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AACvC,YAAY,EACV,oCAAoC,EACpC,yCAAyC,EACzC,wCAAwC,EACxC,uCAAuC,EACvC,wCAAwC,EACxC,8CAA8C,EAC9C,2CAA2C,EAC3C,wDAAwD,EACxD,mCAAmC,EACnC,sCAAsC,EACtC,0CAA0C,EAC1C,qDAAqD,EACrD,4CAA4C,EAC5C,uDAAuD,EACvD,uCAAuC,GACxC,uDAAmD;AACpD,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,sBAAsB,GACvB,oBAAgB;AACjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C;AAC5C,YAAY,EACV,yCAAyC,EACzC,iDAAiD,EACjD,iDAAiD,EACjD,gDAAgD,GACjD,4DAAwD"}
package/dist/index.d.mts CHANGED
@@ -2,8 +2,10 @@ export * from "./Caveat.mjs";
2
2
  export * from "./errors.mjs";
3
3
  export * from "./Permission.mjs";
4
4
  export * from "./PermissionController.mjs";
5
+ export type { PermissionControllerClearStateAction, PermissionControllerGetSubjectNamesAction, PermissionControllerGetPermissionsAction, PermissionControllerHasPermissionAction, PermissionControllerHasPermissionsAction, PermissionControllerRevokeAllPermissionsAction, PermissionControllerRevokePermissionsAction, PermissionControllerRevokePermissionForAllSubjectsAction, PermissionControllerGetCaveatAction, PermissionControllerUpdateCaveatAction, PermissionControllerGrantPermissionsAction, PermissionControllerGrantPermissionsIncrementalAction, PermissionControllerRequestPermissionsAction, PermissionControllerRequestPermissionsIncrementalAction, PermissionControllerGetEndowmentsAction, } from "./PermissionController-method-action-types.mjs";
5
6
  export type { ExtractSpecifications, HandlerMiddlewareFunction, HookNames, PermittedHandlerExport, } from "./utils.mjs";
6
7
  export { MethodNames } from "./utils.mjs";
7
8
  export * as permissionRpcMethods from "./rpc-methods/index.mjs";
8
9
  export * from "./SubjectMetadataController.mjs";
10
+ export type { SubjectMetadataControllerClearStateAction, SubjectMetadataControllerAddSubjectMetadataAction, SubjectMetadataControllerGetSubjectMetadataAction, SubjectMetadataControllerTrimMetadataStateAction, } from "./SubjectMetadataController-method-action-types.mjs";
9
11
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AACvC,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,sBAAsB,GACvB,oBAAgB;AACjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AACvC,YAAY,EACV,oCAAoC,EACpC,yCAAyC,EACzC,wCAAwC,EACxC,uCAAuC,EACvC,wCAAwC,EACxC,8CAA8C,EAC9C,2CAA2C,EAC3C,wDAAwD,EACxD,mCAAmC,EACnC,sCAAsC,EACtC,0CAA0C,EAC1C,qDAAqD,EACrD,4CAA4C,EAC5C,uDAAuD,EACvD,uCAAuC,GACxC,uDAAmD;AACpD,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,sBAAsB,GACvB,oBAAgB;AACjB,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C;AAC5C,YAAY,EACV,yCAAyC,EACzC,iDAAiD,EACjD,iDAAiD,EACjD,gDAAgD,GACjD,4DAAwD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AAOvC,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport type {\n ExtractSpecifications,\n HandlerMiddlewareFunction,\n HookNames,\n PermittedHandlerExport,\n} from './utils';\nexport { MethodNames } from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\nexport * from './SubjectMetadataController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAAyB;AACzB,6BAAyB;AACzB,iCAA6B;AAC7B,2CAAuC;AAwBvC,OAAO,EAAE,WAAW,EAAE,oBAAgB;AACtC,OAAO,KAAK,oBAAoB,gCAAsB;AACtD,gDAA4C","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport type {\n PermissionControllerClearStateAction,\n PermissionControllerGetSubjectNamesAction,\n PermissionControllerGetPermissionsAction,\n PermissionControllerHasPermissionAction,\n PermissionControllerHasPermissionsAction,\n PermissionControllerRevokeAllPermissionsAction,\n PermissionControllerRevokePermissionsAction,\n PermissionControllerRevokePermissionForAllSubjectsAction,\n PermissionControllerGetCaveatAction,\n PermissionControllerUpdateCaveatAction,\n PermissionControllerGrantPermissionsAction,\n PermissionControllerGrantPermissionsIncrementalAction,\n PermissionControllerRequestPermissionsAction,\n PermissionControllerRequestPermissionsIncrementalAction,\n PermissionControllerGetEndowmentsAction,\n} from './PermissionController-method-action-types';\nexport type {\n ExtractSpecifications,\n HandlerMiddlewareFunction,\n HookNames,\n PermittedHandlerExport,\n} from './utils';\nexport { MethodNames } from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\nexport * from './SubjectMetadataController';\nexport type {\n SubjectMetadataControllerClearStateAction,\n SubjectMetadataControllerAddSubjectMetadataAction,\n SubjectMetadataControllerGetSubjectMetadataAction,\n SubjectMetadataControllerTrimMetadataStateAction,\n} from './SubjectMetadataController-method-action-types';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/permission-controller",
3
- "version": "12.2.1",
3
+ "version": "12.3.0",
4
4
  "description": "Mediates access to JSON-RPC methods, used to interact with pieces of the MetaMask stack, via middleware for json-rpc-engine",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -40,6 +40,7 @@
40
40
  "build:docs": "typedoc",
41
41
  "changelog:update": "../../scripts/update-changelog.sh @metamask/permission-controller",
42
42
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/permission-controller",
43
+ "generate-method-action-types": "tsx ../../scripts/generate-method-action-types.ts",
43
44
  "since-latest-release": "../../scripts/since-latest-release.sh",
44
45
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
45
46
  "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
@@ -47,11 +48,11 @@
47
48
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
48
49
  },
49
50
  "dependencies": {
50
- "@metamask/approval-controller": "^9.0.0",
51
- "@metamask/base-controller": "^9.0.0",
51
+ "@metamask/approval-controller": "^9.0.1",
52
+ "@metamask/base-controller": "^9.0.1",
52
53
  "@metamask/controller-utils": "^11.19.0",
53
- "@metamask/json-rpc-engine": "^10.2.3",
54
- "@metamask/messenger": "^0.3.0",
54
+ "@metamask/json-rpc-engine": "^10.2.4",
55
+ "@metamask/messenger": "^1.0.0",
55
56
  "@metamask/rpc-errors": "^7.0.2",
56
57
  "@metamask/utils": "^11.9.0",
57
58
  "@types/deep-freeze-strict": "^1.1.0",
@@ -66,6 +67,7 @@
66
67
  "deepmerge": "^4.2.2",
67
68
  "jest": "^29.7.0",
68
69
  "ts-jest": "^29.2.5",
70
+ "tsx": "^4.20.5",
69
71
  "typedoc": "^0.25.13",
70
72
  "typedoc-plugin-missing-exports": "^2.0.0",
71
73
  "typescript": "~5.3.3"