@metamask/permission-controller 3.1.0 → 3.2.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.
@@ -0,0 +1,109 @@
1
+ import type { Patch } from 'immer';
2
+ import { Json } from '@metamask/types';
3
+ import { BaseControllerV2, RestrictedControllerMessenger } from '@metamask/base-controller';
4
+ import { HasPermissions, PermissionSubjectMetadata } from './PermissionController';
5
+ declare const controllerName = "SubjectMetadataController";
6
+ declare type SubjectOrigin = string;
7
+ /**
8
+ * The different kinds of subjects that MetaMask may interact with, including
9
+ * third parties and itself (e.g., when the background communicated with the UI).
10
+ */
11
+ export declare enum SubjectType {
12
+ Extension = "extension",
13
+ Internal = "internal",
14
+ Unknown = "unknown",
15
+ Website = "website",
16
+ Snap = "snap"
17
+ }
18
+ export declare type SubjectMetadata = PermissionSubjectMetadata & {
19
+ [key: string]: Json;
20
+ name: string | null;
21
+ subjectType: SubjectType | null;
22
+ extensionId: string | null;
23
+ iconUrl: string | null;
24
+ };
25
+ declare type SubjectMetadataToAdd = PermissionSubjectMetadata & {
26
+ name?: string | null;
27
+ subjectType?: SubjectType | null;
28
+ extensionId?: string | null;
29
+ iconUrl?: string | null;
30
+ } & Record<string, Json>;
31
+ export declare type SubjectMetadataControllerState = {
32
+ subjectMetadata: Record<SubjectOrigin, SubjectMetadata>;
33
+ };
34
+ export declare type GetSubjectMetadataState = {
35
+ type: `${typeof controllerName}:getState`;
36
+ handler: () => SubjectMetadataControllerState;
37
+ };
38
+ export declare type GetSubjectMetadata = {
39
+ type: `${typeof controllerName}:getSubjectMetadata`;
40
+ handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;
41
+ };
42
+ export declare type SubjectMetadataControllerActions = GetSubjectMetadataState | GetSubjectMetadata;
43
+ export declare type SubjectMetadataStateChange = {
44
+ type: `${typeof controllerName}:stateChange`;
45
+ payload: [SubjectMetadataControllerState, Patch[]];
46
+ };
47
+ export declare type SubjectMetadataControllerEvents = SubjectMetadataStateChange;
48
+ declare type AllowedActions = HasPermissions;
49
+ export declare type SubjectMetadataControllerMessenger = RestrictedControllerMessenger<typeof controllerName, SubjectMetadataControllerActions | AllowedActions, SubjectMetadataControllerEvents, AllowedActions['type'], never>;
50
+ declare type SubjectMetadataControllerOptions = {
51
+ messenger: SubjectMetadataControllerMessenger;
52
+ subjectCacheLimit: number;
53
+ state?: Partial<SubjectMetadataControllerState>;
54
+ };
55
+ /**
56
+ * A controller for storing metadata associated with permission subjects. More
57
+ * or less, a cache.
58
+ */
59
+ export declare class SubjectMetadataController extends BaseControllerV2<typeof controllerName, SubjectMetadataControllerState, SubjectMetadataControllerMessenger> {
60
+ private subjectCacheLimit;
61
+ private subjectsWithoutPermissionsEncounteredSinceStartup;
62
+ private subjectHasPermissions;
63
+ constructor({ messenger, subjectCacheLimit, state, }: SubjectMetadataControllerOptions);
64
+ /**
65
+ * Clears the state of this controller. Also resets the cache of subjects
66
+ * encountered since startup, so as to not prematurely reach the cache limit.
67
+ */
68
+ clearState(): void;
69
+ /**
70
+ * Stores domain metadata for the given origin (subject). Deletes metadata for
71
+ * subjects without permissions in a FIFO manner once more than
72
+ * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have
73
+ * been added since boot.
74
+ *
75
+ * In order to prevent a degraded user experience,
76
+ * metadata is never deleted for subjects with permissions, since metadata
77
+ * cannot yet be requested on demand.
78
+ *
79
+ * @param metadata - The subject metadata to store.
80
+ */
81
+ addSubjectMetadata(metadata: SubjectMetadataToAdd): void;
82
+ /**
83
+ * Gets the subject metadata for the given origin, if any.
84
+ *
85
+ * @param origin - The origin for which to get the subject metadata.
86
+ * @returns The subject metadata, if any, or `undefined` otherwise.
87
+ */
88
+ getSubjectMetadata(origin: SubjectOrigin): SubjectMetadata | undefined;
89
+ /**
90
+ * Deletes all subjects without permissions from the controller's state.
91
+ */
92
+ trimMetadataState(): void;
93
+ /**
94
+ * Returns a new state object that only includes subjects with permissions.
95
+ * This method is static because we want to call it in the constructor, before
96
+ * the controller's state is initialized.
97
+ *
98
+ * @param state - The state object to trim.
99
+ * @param hasPermissions - A function that returns a boolean indicating
100
+ * whether a particular subject (identified by its origin) has any
101
+ * permissions.
102
+ * @returns The new state object. If the specified `state` object has no
103
+ * subject metadata, the returned object will be equivalent to the default
104
+ * state of this controller.
105
+ */
106
+ private static getTrimmedState;
107
+ }
108
+ export {};
109
+ //# sourceMappingURL=SubjectMetadataController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController.d.ts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubjectMetadataController = exports.SubjectType = void 0;
4
+ const base_controller_1 = require("@metamask/base-controller");
5
+ const controllerName = 'SubjectMetadataController';
6
+ /**
7
+ * The different kinds of subjects that MetaMask may interact with, including
8
+ * third parties and itself (e.g., when the background communicated with the UI).
9
+ */
10
+ var SubjectType;
11
+ (function (SubjectType) {
12
+ SubjectType["Extension"] = "extension";
13
+ SubjectType["Internal"] = "internal";
14
+ SubjectType["Unknown"] = "unknown";
15
+ SubjectType["Website"] = "website";
16
+ SubjectType["Snap"] = "snap";
17
+ })(SubjectType = exports.SubjectType || (exports.SubjectType = {}));
18
+ const stateMetadata = {
19
+ subjectMetadata: { persist: true, anonymous: false },
20
+ };
21
+ const defaultState = {
22
+ subjectMetadata: {},
23
+ };
24
+ /**
25
+ * A controller for storing metadata associated with permission subjects. More
26
+ * or less, a cache.
27
+ */
28
+ class SubjectMetadataController extends base_controller_1.BaseControllerV2 {
29
+ constructor({ messenger, subjectCacheLimit, state = {}, }) {
30
+ if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {
31
+ throw new Error(`subjectCacheLimit must be a positive integer. Received: "${subjectCacheLimit}"`);
32
+ }
33
+ const hasPermissions = (origin) => {
34
+ return messenger.call('PermissionController:hasPermissions', origin);
35
+ };
36
+ super({
37
+ name: controllerName,
38
+ metadata: stateMetadata,
39
+ messenger,
40
+ state: Object.assign({}, SubjectMetadataController.getTrimmedState(state, hasPermissions)),
41
+ });
42
+ this.subjectHasPermissions = hasPermissions;
43
+ this.subjectCacheLimit = subjectCacheLimit;
44
+ this.subjectsWithoutPermissionsEncounteredSinceStartup = new Set();
45
+ this.messagingSystem.registerActionHandler(`${this.name}:getSubjectMetadata`, this.getSubjectMetadata.bind(this));
46
+ }
47
+ /**
48
+ * Clears the state of this controller. Also resets the cache of subjects
49
+ * encountered since startup, so as to not prematurely reach the cache limit.
50
+ */
51
+ clearState() {
52
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.clear();
53
+ this.update((_draftState) => {
54
+ return Object.assign({}, defaultState);
55
+ });
56
+ }
57
+ /**
58
+ * Stores domain metadata for the given origin (subject). Deletes metadata for
59
+ * subjects without permissions in a FIFO manner once more than
60
+ * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have
61
+ * been added since boot.
62
+ *
63
+ * In order to prevent a degraded user experience,
64
+ * metadata is never deleted for subjects with permissions, since metadata
65
+ * cannot yet be requested on demand.
66
+ *
67
+ * @param metadata - The subject metadata to store.
68
+ */
69
+ addSubjectMetadata(metadata) {
70
+ const { origin } = metadata;
71
+ const newMetadata = Object.assign(Object.assign({}, metadata), { extensionId: metadata.extensionId || null, iconUrl: metadata.iconUrl || null, name: metadata.name || null, subjectType: metadata.subjectType || null });
72
+ let originToForget = null;
73
+ // We only delete the oldest encountered subject from the cache, again to
74
+ // ensure that the user's experience isn't degraded by missing icons etc.
75
+ if (this.subjectsWithoutPermissionsEncounteredSinceStartup.size >=
76
+ this.subjectCacheLimit) {
77
+ const cachedOrigin = this.subjectsWithoutPermissionsEncounteredSinceStartup
78
+ .values()
79
+ .next().value;
80
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.delete(cachedOrigin);
81
+ if (!this.subjectHasPermissions(cachedOrigin)) {
82
+ originToForget = cachedOrigin;
83
+ }
84
+ }
85
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);
86
+ this.update((draftState) => {
87
+ // Typecast: ts(2589)
88
+ draftState.subjectMetadata[origin] = newMetadata;
89
+ if (typeof originToForget === 'string') {
90
+ delete draftState.subjectMetadata[originToForget];
91
+ }
92
+ });
93
+ }
94
+ /**
95
+ * Gets the subject metadata for the given origin, if any.
96
+ *
97
+ * @param origin - The origin for which to get the subject metadata.
98
+ * @returns The subject metadata, if any, or `undefined` otherwise.
99
+ */
100
+ getSubjectMetadata(origin) {
101
+ return this.state.subjectMetadata[origin];
102
+ }
103
+ /**
104
+ * Deletes all subjects without permissions from the controller's state.
105
+ */
106
+ trimMetadataState() {
107
+ this.update((draftState) => {
108
+ return SubjectMetadataController.getTrimmedState(
109
+ // Typecast: ts(2589)
110
+ draftState, this.subjectHasPermissions);
111
+ });
112
+ }
113
+ /**
114
+ * Returns a new state object that only includes subjects with permissions.
115
+ * This method is static because we want to call it in the constructor, before
116
+ * the controller's state is initialized.
117
+ *
118
+ * @param state - The state object to trim.
119
+ * @param hasPermissions - A function that returns a boolean indicating
120
+ * whether a particular subject (identified by its origin) has any
121
+ * permissions.
122
+ * @returns The new state object. If the specified `state` object has no
123
+ * subject metadata, the returned object will be equivalent to the default
124
+ * state of this controller.
125
+ */
126
+ static getTrimmedState(state, hasPermissions) {
127
+ const { subjectMetadata = {} } = state;
128
+ return {
129
+ subjectMetadata: Object.keys(subjectMetadata).reduce((newSubjectMetadata, origin) => {
130
+ if (hasPermissions(origin)) {
131
+ newSubjectMetadata[origin] = subjectMetadata[origin];
132
+ }
133
+ return newSubjectMetadata;
134
+ }, {}),
135
+ };
136
+ }
137
+ }
138
+ exports.SubjectMetadataController = SubjectMetadataController;
139
+ //# sourceMappingURL=SubjectMetadataController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController.js","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":";;;AAEA,+DAGmC;AAOnC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAInD;;;GAGG;AACH,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,sCAAuB,CAAA;IACvB,oCAAqB,CAAA;IACrB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,4BAAa,CAAA;AACf,CAAC,EANW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAMtB;AAsBD,MAAM,aAAa,GAAG;IACpB,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;CACrD,CAAC;AAEF,MAAM,YAAY,GAAmC;IACnD,eAAe,EAAE,EAAE;CACpB,CAAC;AAuCF;;;GAGG;AACH,MAAa,yBAA0B,SAAQ,kCAI9C;IAOC,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,KAAK,GAAG,EAAE,GACuB;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,GAAG,CAAC,EAAE;YACjE,MAAM,IAAI,KAAK,CACb,4DAA4D,iBAAiB,GAAG,CACjF,CAAC;SACH;QAED,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;YACxC,OAAO,SAAS,CAAC,IAAI,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC,CAAC;QAEF,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,oBACA,yBAAyB,CAAC,eAAe,CAAC,KAAK,EAAE,cAAc,CAAC,CACpE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC;QAC5C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,iDAAiD,GAAG,IAAI,GAAG,EAAE,CAAC;QAEnE,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,IAAI,CAAC,IAAI,qBAAqB,EACjC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,CAAC,iDAAiD,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;YAC1B,yBAAY,YAAY,EAAG;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,QAA8B;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC5B,MAAM,WAAW,mCACZ,QAAQ,KACX,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI,EACzC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,EACjC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,EAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI,GAC1C,CAAC;QAEF,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,yEAAyE;QACzE,yEAAyE;QACzE,IACE,IAAI,CAAC,iDAAiD,CAAC,IAAI;YAC3D,IAAI,CAAC,iBAAiB,EACtB;YACA,MAAM,YAAY,GAChB,IAAI,CAAC,iDAAiD;iBACnD,MAAM,EAAE;iBACR,IAAI,EAAE,CAAC,KAAK,CAAC;YAElB,IAAI,CAAC,iDAAiD,CAAC,MAAM,CAC3D,YAAY,CACb,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE;gBAC7C,cAAc,GAAG,YAAY,CAAC;aAC/B;SACF;QAED,IAAI,CAAC,iDAAiD,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACzB,qBAAqB;YACrB,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,WAAkB,CAAC;YACxD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;gBACtC,OAAO,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;aACnD;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,MAAqB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACzB,OAAO,yBAAyB,CAAC,eAAe;YAC9C,qBAAqB;YACrB,UAAiB,EACjB,IAAI,CAAC,qBAAqB,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,MAAM,CAAC,eAAe,CAC5B,KAA8C,EAC9C,cAAkE;QAElE,MAAM,EAAE,eAAe,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;QAEvC,OAAO;YACL,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAElD,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;gBAC/B,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE;oBAC1B,kBAAkB,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;iBACtD;gBACD,OAAO,kBAAkB,CAAC;YAC5B,CAAC,EAAE,EAAE,CAAC;SACP,CAAC;IACJ,CAAC;CACF;AAnKD,8DAmKC","sourcesContent":["import type { Patch } from 'immer';\nimport { Json } from '@metamask/types';\nimport {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\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 // TODO:TS4.4 make optional\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: { persist: true, anonymous: false },\n};\n\nconst defaultState: SubjectMetadataControllerState = {\n subjectMetadata: {},\n};\n\nexport type GetSubjectMetadataState = {\n type: `${typeof controllerName}:getState`;\n handler: () => SubjectMetadataControllerState;\n};\n\nexport type GetSubjectMetadata = {\n type: `${typeof controllerName}:getSubjectMetadata`;\n handler: (origin: SubjectOrigin) => SubjectMetadata | undefined;\n};\n\nexport type SubjectMetadataControllerActions =\n | GetSubjectMetadataState\n | GetSubjectMetadata;\n\nexport type SubjectMetadataStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [SubjectMetadataControllerState, Patch[]];\n};\n\nexport type SubjectMetadataControllerEvents = SubjectMetadataStateChange;\n\ntype AllowedActions = HasPermissions;\n\nexport type SubjectMetadataControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SubjectMetadataControllerActions | AllowedActions,\n SubjectMetadataControllerEvents,\n AllowedActions['type'],\n never\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 BaseControllerV2<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n private subjectCacheLimit: number;\n\n private subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n private 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) => {\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.messagingSystem.registerActionHandler(\n `${this.name}:getSubjectMetadata`,\n this.getSubjectMetadata.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 // Typecast: ts(2589)\n draftState.subjectMetadata[origin] = newMetadata as any;\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((draftState) => {\n return SubjectMetadataController.getTrimmedState(\n // Typecast: ts(2589)\n draftState as any,\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 private static getTrimmedState(\n state: Partial<SubjectMetadataControllerState>,\n hasPermissions: SubjectMetadataController['subjectHasPermissions'],\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"]}
package/dist/errors.d.ts CHANGED
@@ -156,3 +156,4 @@ export declare class PermissionsRequestNotFoundError extends Error {
156
156
  constructor(id: string);
157
157
  }
158
158
  export {};
159
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,3 +4,5 @@ export * from './Permission';
4
4
  export * from './PermissionController';
5
5
  export * from './utils';
6
6
  export * as permissionRpcMethods from './rpc-methods';
7
+ export * from './SubjectMetadataController';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,oBAAoB,MAAM,eAAe,CAAC;AACtD,cAAc,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -33,4 +33,5 @@ __exportStar(require("./Permission"), exports);
33
33
  __exportStar(require("./PermissionController"), exports);
34
34
  __exportStar(require("./utils"), exports);
35
35
  exports.permissionRpcMethods = __importStar(require("./rpc-methods"));
36
+ __exportStar(require("./SubjectMetadataController"), exports);
36
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,+CAA6B;AAC7B,yDAAuC;AACvC,0CAAwB;AACxB,sEAAsD","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport * from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,+CAA6B;AAC7B,yDAAuC;AACvC,0CAAwB;AACxB,sEAAsD;AACtD,8DAA4C","sourcesContent":["export * from './Caveat';\nexport * from './errors';\nexport * from './Permission';\nexport * from './PermissionController';\nexport * from './utils';\nexport * as permissionRpcMethods from './rpc-methods';\nexport * from './SubjectMetadataController';\n"]}
@@ -30,3 +30,4 @@ declare type PermissionMiddlewareFactoryOptions = {
30
30
  */
31
31
  export declare function getPermissionMiddlewareFactory({ executeRestrictedMethod, getRestrictedMethod, isUnrestrictedMethod, }: PermissionMiddlewareFactoryOptions): (subject: PermissionSubjectMetadata) => JsonRpcMiddleware<RestrictedMethodParameters, Json>;
32
32
  export {};
33
+ //# sourceMappingURL=permission-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-middleware.d.ts","sourceRoot":"","sources":["../src/permission-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,iBAAiB,EAKlB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,GAAG,CAAC;AAEX,aAAK,kCAAkC,GAAG;IACxC,uBAAuB,EAAE,2BAA2B,CAAC,0BAA0B,CAAC,CAAC;IACjF,mBAAmB,EAAE,2BAA2B,CAAC,qBAAqB,CAAC,CAAC;IACxE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,8BAA8B,CAAC,EAC7C,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,kCAAkC,aAExB,yBAAyB,KACjC,kBAAkB,0BAA0B,EAAE,IAAI,CAAC,CA2CvD"}
@@ -5,3 +5,4 @@ export declare const getPermissionsHandler: PermittedHandlerExport<GetPermission
5
5
  export declare type GetPermissionsHooks = {
6
6
  getPermissionsForOrigin: () => SubjectPermissions<PermissionConstraint>;
7
7
  };
8
+ //# sourceMappingURL=getPermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPermissions.d.ts","sourceRoot":"","sources":["../../src/rpc-methods/getPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,eAAO,MAAM,qBAAqB,EAAE,sBAAsB,CACxD,mBAAmB,EACnB,IAAI,EACJ,oBAAoB,EAAE,CAOvB,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IAEhC,uBAAuB,EAAE,MAAM,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;CACzE,CAAC"}
@@ -2,3 +2,4 @@ import { RequestPermissionsHooks } from './requestPermissions';
2
2
  import { GetPermissionsHooks } from './getPermissions';
3
3
  export declare type PermittedRpcMethodHooks = RequestPermissionsHooks & GetPermissionsHooks;
4
4
  export declare const handlers: (import("@metamask/types").PermittedHandlerExport<RequestPermissionsHooks, [import("..").RequestedPermissions], import("..").PermissionConstraint[]> | import("@metamask/types").PermittedHandlerExport<GetPermissionsHooks, void, import("..").PermissionConstraint[]>)[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpc-methods/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAyB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,oBAAY,uBAAuB,GAAG,uBAAuB,GAC3D,mBAAmB,CAAC;AAEtB,eAAO,MAAM,QAAQ,4QAAqD,CAAC"}
@@ -14,3 +14,4 @@ export declare type RequestPermissionsHooks = {
14
14
  requestPermissionsForOrigin: RequestPermissions;
15
15
  };
16
16
  export {};
17
+ //# sourceMappingURL=requestPermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestPermissions.d.ts","sourceRoot":"","sources":["../../src/rpc-methods/requestPermissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEhF,eAAO,MAAM,yBAAyB,EAAE,sBAAsB,CAC5D,uBAAuB,EACvB;IAAC,oBAAoB;CAAC,EACtB,oBAAoB,EAAE,CAOvB,CAAC;AAEF,aAAK,kBAAkB,GAAG,CACxB,oBAAoB,EAAE,oBAAoB,EAC1C,EAAE,EAAE,MAAM,KACP,OAAO,CACV;IAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAAC,CACvE,CAAC;AAEF,oBAAY,uBAAuB,GAAG;IACpC,2BAA2B,EAAE,kBAAkB,CAAC;CACjD,CAAC"}
package/dist/utils.d.ts CHANGED
@@ -13,3 +13,4 @@ export declare enum MethodNames {
13
13
  * whose specification type union to extract.
14
14
  */
15
15
  export declare type ExtractSpecifications<SpecificationsMap extends CaveatSpecificationMap<CaveatSpecificationConstraint> | PermissionSpecificationMap<PermissionSpecificationConstraint>> = SpecificationsMap[keyof SpecificationsMap];
16
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAEtB,oBAAY,WAAW;IACrB,kBAAkB,8BAA8B;IAChD,cAAc,0BAA0B;CACzC;AAED;;;;;;;GAOG;AACH,oBAAY,qBAAqB,CAC/B,iBAAiB,SACb,sBAAsB,CAAC,6BAA6B,CAAC,GACrD,0BAA0B,CAAC,iCAAiC,CAAC,IAC/D,iBAAiB,CAAC,MAAM,iBAAiB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/permission-controller",
3
- "version": "3.1.0",
3
+ "version": "3.2.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",
@@ -29,29 +29,29 @@
29
29
  "test:watch": "jest --watch"
30
30
  },
31
31
  "dependencies": {
32
- "@metamask/approval-controller": "^2.0.0",
32
+ "@metamask/approval-controller": "^2.1.1",
33
33
  "@metamask/base-controller": "^2.0.0",
34
- "@metamask/controller-utils": "^3.1.0",
34
+ "@metamask/controller-utils": "^3.4.0",
35
35
  "@metamask/types": "^1.1.0",
36
36
  "@types/deep-freeze-strict": "^1.1.0",
37
37
  "deep-freeze-strict": "^1.1.1",
38
- "eth-rpc-errors": "^4.0.0",
38
+ "eth-rpc-errors": "^4.0.2",
39
39
  "immer": "^9.0.6",
40
40
  "json-rpc-engine": "^6.1.0",
41
41
  "nanoid": "^3.1.31"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@metamask/auto-changelog": "^3.1.0",
45
- "@types/jest": "^26.0.22",
45
+ "@types/jest": "^27.4.1",
46
46
  "deepmerge": "^4.2.2",
47
- "jest": "^26.4.2",
48
- "ts-jest": "^26.5.2",
47
+ "jest": "^27.5.1",
48
+ "ts-jest": "^27.1.4",
49
49
  "typedoc": "^0.22.15",
50
50
  "typedoc-plugin-missing-exports": "^0.22.6",
51
51
  "typescript": "~4.6.3"
52
52
  },
53
53
  "peerDependencies": {
54
- "@metamask/approval-controller": "^2.0.0"
54
+ "@metamask/approval-controller": "^2.1.1"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=14.0.0"