@metamask/permission-controller 11.0.0 → 11.0.2

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 (185) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/dist/Caveat.cjs +48 -0
  3. package/dist/Caveat.cjs.map +1 -0
  4. package/dist/{types/Caveat.d.ts → Caveat.d.cts} +3 -3
  5. package/dist/Caveat.d.cts.map +1 -0
  6. package/dist/Caveat.d.mts +210 -0
  7. package/dist/Caveat.d.mts.map +1 -0
  8. package/dist/Caveat.mjs +42 -11
  9. package/dist/Caveat.mjs.map +1 -1
  10. package/dist/Permission.cjs +65 -0
  11. package/dist/Permission.cjs.map +1 -0
  12. package/dist/{types/Permission.d.ts → Permission.d.cts} +7 -7
  13. package/dist/Permission.d.cts.map +1 -0
  14. package/dist/Permission.d.mts +417 -0
  15. package/dist/Permission.d.mts.map +1 -0
  16. package/dist/Permission.mjs +58 -13
  17. package/dist/Permission.mjs.map +1 -1
  18. package/dist/PermissionController.cjs +1481 -0
  19. package/dist/{chunk-COGJLF22.mjs.map → PermissionController.cjs.map} +1 -1
  20. package/dist/{types/PermissionController.d.ts → PermissionController.d.cts} +10 -10
  21. package/dist/PermissionController.d.cts.map +1 -0
  22. package/dist/PermissionController.d.mts +986 -0
  23. package/dist/PermissionController.d.mts.map +1 -0
  24. package/dist/PermissionController.mjs +1479 -13
  25. package/dist/PermissionController.mjs.map +1 -1
  26. package/dist/SubjectMetadataController.cjs +152 -0
  27. package/dist/SubjectMetadataController.cjs.map +1 -0
  28. package/dist/{types/SubjectMetadataController.d.ts → SubjectMetadataController.d.cts} +5 -5
  29. package/dist/SubjectMetadataController.d.cts.map +1 -0
  30. package/dist/SubjectMetadataController.d.mts +107 -0
  31. package/dist/SubjectMetadataController.d.mts.map +1 -0
  32. package/dist/SubjectMetadataController.mjs +146 -8
  33. package/dist/SubjectMetadataController.mjs.map +1 -1
  34. package/dist/errors.cjs +217 -0
  35. package/dist/errors.cjs.map +1 -0
  36. package/dist/{types/errors.d.ts → errors.d.cts} +6 -6
  37. package/dist/errors.d.cts.map +1 -0
  38. package/dist/errors.d.mts +185 -0
  39. package/dist/errors.d.mts.map +1 -0
  40. package/dist/errors.mjs +187 -57
  41. package/dist/errors.mjs.map +1 -1
  42. package/dist/index.cjs +38 -0
  43. package/dist/index.cjs.map +1 -0
  44. package/dist/index.d.cts +9 -0
  45. package/dist/index.d.cts.map +1 -0
  46. package/dist/index.d.mts +9 -0
  47. package/dist/index.d.mts.map +1 -0
  48. package/dist/index.mjs +7 -97
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/permission-middleware.cjs +55 -0
  51. package/dist/permission-middleware.cjs.map +1 -0
  52. package/dist/{types/permission-middleware.d.ts → permission-middleware.d.cts} +4 -4
  53. package/dist/permission-middleware.d.cts.map +1 -0
  54. package/dist/permission-middleware.d.mts +33 -0
  55. package/dist/permission-middleware.d.mts.map +1 -0
  56. package/dist/permission-middleware.mjs +50 -8
  57. package/dist/permission-middleware.mjs.map +1 -1
  58. package/dist/rpc-methods/getPermissions.cjs +27 -0
  59. package/dist/rpc-methods/getPermissions.cjs.map +1 -0
  60. package/dist/rpc-methods/getPermissions.d.cts +9 -0
  61. package/dist/rpc-methods/getPermissions.d.cts.map +1 -0
  62. package/dist/rpc-methods/getPermissions.d.mts +9 -0
  63. package/dist/rpc-methods/getPermissions.d.mts.map +1 -0
  64. package/dist/rpc-methods/getPermissions.mjs +22 -7
  65. package/dist/rpc-methods/getPermissions.mjs.map +1 -1
  66. package/dist/rpc-methods/index.cjs +12 -0
  67. package/dist/rpc-methods/index.cjs.map +1 -0
  68. package/dist/rpc-methods/index.d.cts +6 -0
  69. package/dist/rpc-methods/index.d.cts.map +1 -0
  70. package/dist/rpc-methods/index.d.mts +6 -0
  71. package/dist/rpc-methods/index.d.mts.map +1 -0
  72. package/dist/rpc-methods/index.mjs +8 -12
  73. package/dist/rpc-methods/index.mjs.map +1 -1
  74. package/dist/rpc-methods/requestPermissions.cjs +36 -0
  75. package/dist/rpc-methods/requestPermissions.cjs.map +1 -0
  76. package/dist/{types/rpc-methods/requestPermissions.d.ts → rpc-methods/requestPermissions.d.cts} +3 -3
  77. package/dist/rpc-methods/requestPermissions.d.cts.map +1 -0
  78. package/dist/rpc-methods/requestPermissions.d.mts +17 -0
  79. package/dist/rpc-methods/requestPermissions.d.mts.map +1 -0
  80. package/dist/rpc-methods/requestPermissions.mjs +31 -8
  81. package/dist/rpc-methods/requestPermissions.mjs.map +1 -1
  82. package/dist/rpc-methods/revokePermissions.cjs +41 -0
  83. package/dist/rpc-methods/revokePermissions.cjs.map +1 -0
  84. package/dist/{types/rpc-methods/revokePermissions.d.ts → rpc-methods/revokePermissions.d.cts} +4 -4
  85. package/dist/rpc-methods/revokePermissions.d.cts.map +1 -0
  86. package/dist/rpc-methods/revokePermissions.d.mts +11 -0
  87. package/dist/rpc-methods/revokePermissions.d.mts.map +1 -0
  88. package/dist/rpc-methods/revokePermissions.mjs +36 -8
  89. package/dist/rpc-methods/revokePermissions.mjs.map +1 -1
  90. package/dist/utils.cjs +44 -0
  91. package/dist/utils.cjs.map +1 -0
  92. package/dist/{types/utils.d.ts → utils.d.cts} +5 -5
  93. package/dist/utils.d.cts.map +1 -0
  94. package/dist/utils.d.mts +57 -0
  95. package/dist/utils.d.mts.map +1 -0
  96. package/dist/utils.mjs +39 -9
  97. package/dist/utils.mjs.map +1 -1
  98. package/package.json +18 -12
  99. package/dist/Caveat.js +0 -12
  100. package/dist/Caveat.js.map +0 -1
  101. package/dist/Permission.js +0 -14
  102. package/dist/Permission.js.map +0 -1
  103. package/dist/PermissionController.js +0 -15
  104. package/dist/PermissionController.js.map +0 -1
  105. package/dist/SubjectMetadataController.js +0 -10
  106. package/dist/SubjectMetadataController.js.map +0 -1
  107. package/dist/chunk-2L4QPE5A.mjs +0 -25
  108. package/dist/chunk-2L4QPE5A.mjs.map +0 -1
  109. package/dist/chunk-3WWJKO7P.mjs +0 -37
  110. package/dist/chunk-3WWJKO7P.mjs.map +0 -1
  111. package/dist/chunk-3YOPLPVY.js +0 -37
  112. package/dist/chunk-3YOPLPVY.js.map +0 -1
  113. package/dist/chunk-42QSJHWO.mjs +0 -155
  114. package/dist/chunk-42QSJHWO.mjs.map +0 -1
  115. package/dist/chunk-4FMYQC3Y.mjs +0 -29
  116. package/dist/chunk-4FMYQC3Y.mjs.map +0 -1
  117. package/dist/chunk-4NAVRO44.mjs +0 -35
  118. package/dist/chunk-4NAVRO44.mjs.map +0 -1
  119. package/dist/chunk-5RFW5THA.mjs +0 -17
  120. package/dist/chunk-5RFW5THA.mjs.map +0 -1
  121. package/dist/chunk-6PXDVUYM.js +0 -29
  122. package/dist/chunk-6PXDVUYM.js.map +0 -1
  123. package/dist/chunk-74H4CVH7.mjs +0 -34
  124. package/dist/chunk-74H4CVH7.mjs.map +0 -1
  125. package/dist/chunk-7A3VYLCK.js +0 -30
  126. package/dist/chunk-7A3VYLCK.js.map +0 -1
  127. package/dist/chunk-B6PDRQ7N.js +0 -1679
  128. package/dist/chunk-B6PDRQ7N.js.map +0 -1
  129. package/dist/chunk-COGJLF22.mjs +0 -1679
  130. package/dist/chunk-F5TBMVWC.js +0 -46
  131. package/dist/chunk-F5TBMVWC.js.map +0 -1
  132. package/dist/chunk-FYADAA2G.js +0 -220
  133. package/dist/chunk-FYADAA2G.js.map +0 -1
  134. package/dist/chunk-G4BWJ7EA.mjs +0 -220
  135. package/dist/chunk-G4BWJ7EA.mjs.map +0 -1
  136. package/dist/chunk-HYMS7IGB.mjs +0 -31
  137. package/dist/chunk-HYMS7IGB.mjs.map +0 -1
  138. package/dist/chunk-I62TTXZ6.mjs +0 -46
  139. package/dist/chunk-I62TTXZ6.mjs.map +0 -1
  140. package/dist/chunk-OCLNDUYO.mjs +0 -30
  141. package/dist/chunk-OCLNDUYO.mjs.map +0 -1
  142. package/dist/chunk-VBIZGGQL.js +0 -17
  143. package/dist/chunk-VBIZGGQL.js.map +0 -1
  144. package/dist/chunk-VQPP5PWS.js +0 -35
  145. package/dist/chunk-VQPP5PWS.js.map +0 -1
  146. package/dist/chunk-VSDHL2GQ.js +0 -155
  147. package/dist/chunk-VSDHL2GQ.js.map +0 -1
  148. package/dist/chunk-X4ZAW4QR.js +0 -34
  149. package/dist/chunk-X4ZAW4QR.js.map +0 -1
  150. package/dist/chunk-Z2XKIXLS.js +0 -25
  151. package/dist/chunk-Z2XKIXLS.js.map +0 -1
  152. package/dist/chunk-ZH4MLSXX.js +0 -31
  153. package/dist/chunk-ZH4MLSXX.js.map +0 -1
  154. package/dist/errors.js +0 -58
  155. package/dist/errors.js.map +0 -1
  156. package/dist/index.js +0 -98
  157. package/dist/index.js.map +0 -1
  158. package/dist/permission-middleware.js +0 -9
  159. package/dist/permission-middleware.js.map +0 -1
  160. package/dist/rpc-methods/getPermissions.js +0 -9
  161. package/dist/rpc-methods/getPermissions.js.map +0 -1
  162. package/dist/rpc-methods/index.js +0 -13
  163. package/dist/rpc-methods/index.js.map +0 -1
  164. package/dist/rpc-methods/requestPermissions.js +0 -10
  165. package/dist/rpc-methods/requestPermissions.js.map +0 -1
  166. package/dist/rpc-methods/revokePermissions.js +0 -10
  167. package/dist/rpc-methods/revokePermissions.js.map +0 -1
  168. package/dist/tsconfig.build.tsbuildinfo +0 -1
  169. package/dist/types/Caveat.d.ts.map +0 -1
  170. package/dist/types/Permission.d.ts.map +0 -1
  171. package/dist/types/PermissionController.d.ts.map +0 -1
  172. package/dist/types/SubjectMetadataController.d.ts.map +0 -1
  173. package/dist/types/errors.d.ts.map +0 -1
  174. package/dist/types/index.d.ts +0 -9
  175. package/dist/types/index.d.ts.map +0 -1
  176. package/dist/types/permission-middleware.d.ts.map +0 -1
  177. package/dist/types/rpc-methods/getPermissions.d.ts +0 -9
  178. package/dist/types/rpc-methods/getPermissions.d.ts.map +0 -1
  179. package/dist/types/rpc-methods/index.d.ts +0 -6
  180. package/dist/types/rpc-methods/index.d.ts.map +0 -1
  181. package/dist/types/rpc-methods/requestPermissions.d.ts.map +0 -1
  182. package/dist/types/rpc-methods/revokePermissions.d.ts.map +0 -1
  183. package/dist/types/utils.d.ts.map +0 -1
  184. package/dist/utils.js +0 -10
  185. package/dist/utils.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectMetadataController.d.mts","sourceRoot":"","sources":["../src/SubjectMetadataController.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,148 @@
1
- import {
2
- SubjectMetadataController,
3
- SubjectType
4
- } from "./chunk-42QSJHWO.mjs";
5
- import "./chunk-2L4QPE5A.mjs";
6
- export {
7
- SubjectMetadataController,
8
- SubjectType
1
+ import { BaseController } from "@metamask/base-controller";
2
+ const controllerName = 'SubjectMetadataController';
3
+ /**
4
+ * The different kinds of subjects that MetaMask may interact with, including
5
+ * third parties and itself (e.g., when the background communicated with the UI).
6
+ */
7
+ export var SubjectType;
8
+ (function (SubjectType) {
9
+ SubjectType["Extension"] = "extension";
10
+ SubjectType["Internal"] = "internal";
11
+ SubjectType["Unknown"] = "unknown";
12
+ SubjectType["Website"] = "website";
13
+ SubjectType["Snap"] = "snap";
14
+ })(SubjectType || (SubjectType = {}));
15
+ const stateMetadata = {
16
+ subjectMetadata: { persist: true, anonymous: false },
9
17
  };
18
+ const defaultState = {
19
+ subjectMetadata: {},
20
+ };
21
+ /**
22
+ * A controller for storing metadata associated with permission subjects. More
23
+ * or less, a cache.
24
+ */
25
+ export class SubjectMetadataController extends BaseController {
26
+ constructor({ messenger, subjectCacheLimit, state = {}, }) {
27
+ if (!Number.isInteger(subjectCacheLimit) || subjectCacheLimit < 1) {
28
+ throw new Error(`subjectCacheLimit must be a positive integer. Received: "${subjectCacheLimit}"`);
29
+ }
30
+ const hasPermissions = (origin) => {
31
+ return messenger.call('PermissionController:hasPermissions', origin);
32
+ };
33
+ super({
34
+ name: controllerName,
35
+ metadata: stateMetadata,
36
+ messenger,
37
+ state: {
38
+ ...SubjectMetadataController.getTrimmedState(state, hasPermissions),
39
+ },
40
+ });
41
+ this.subjectHasPermissions = hasPermissions;
42
+ this.subjectCacheLimit = subjectCacheLimit;
43
+ this.subjectsWithoutPermissionsEncounteredSinceStartup = new Set();
44
+ this.messagingSystem.registerActionHandler(
45
+ // ESLint is confused by the string literal type.
46
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
47
+ `${this.name}:getSubjectMetadata`, this.getSubjectMetadata.bind(this));
48
+ this.messagingSystem.registerActionHandler(
49
+ // ESLint is confused by the string literal type.
50
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
51
+ `${this.name}:addSubjectMetadata`, this.addSubjectMetadata.bind(this));
52
+ }
53
+ /**
54
+ * Clears the state of this controller. Also resets the cache of subjects
55
+ * encountered since startup, so as to not prematurely reach the cache limit.
56
+ */
57
+ clearState() {
58
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.clear();
59
+ this.update((_draftState) => {
60
+ return { ...defaultState };
61
+ });
62
+ }
63
+ /**
64
+ * Stores domain metadata for the given origin (subject). Deletes metadata for
65
+ * subjects without permissions in a FIFO manner once more than
66
+ * {@link SubjectMetadataController.subjectCacheLimit} distinct origins have
67
+ * been added since boot.
68
+ *
69
+ * In order to prevent a degraded user experience,
70
+ * metadata is never deleted for subjects with permissions, since metadata
71
+ * cannot yet be requested on demand.
72
+ *
73
+ * @param metadata - The subject metadata to store.
74
+ */
75
+ addSubjectMetadata(metadata) {
76
+ const { origin } = metadata;
77
+ const newMetadata = {
78
+ ...metadata,
79
+ extensionId: metadata.extensionId || null,
80
+ iconUrl: metadata.iconUrl || null,
81
+ name: metadata.name || null,
82
+ subjectType: metadata.subjectType || null,
83
+ };
84
+ let originToForget = null;
85
+ // We only delete the oldest encountered subject from the cache, again to
86
+ // ensure that the user's experience isn't degraded by missing icons etc.
87
+ if (this.subjectsWithoutPermissionsEncounteredSinceStartup.size >=
88
+ this.subjectCacheLimit) {
89
+ const cachedOrigin = this.subjectsWithoutPermissionsEncounteredSinceStartup
90
+ .values()
91
+ .next().value;
92
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.delete(cachedOrigin);
93
+ if (!this.subjectHasPermissions(cachedOrigin)) {
94
+ originToForget = cachedOrigin;
95
+ }
96
+ }
97
+ this.subjectsWithoutPermissionsEncounteredSinceStartup.add(origin);
98
+ this.update((draftState) => {
99
+ draftState.subjectMetadata[origin] = newMetadata;
100
+ if (typeof originToForget === 'string') {
101
+ delete draftState.subjectMetadata[originToForget];
102
+ }
103
+ });
104
+ }
105
+ /**
106
+ * Gets the subject metadata for the given origin, if any.
107
+ *
108
+ * @param origin - The origin for which to get the subject metadata.
109
+ * @returns The subject metadata, if any, or `undefined` otherwise.
110
+ */
111
+ getSubjectMetadata(origin) {
112
+ return this.state.subjectMetadata[origin];
113
+ }
114
+ /**
115
+ * Deletes all subjects without permissions from the controller's state.
116
+ */
117
+ trimMetadataState() {
118
+ this.update((draftState) => {
119
+ // @ts-expect-error ts(2589)
120
+ return SubjectMetadataController.getTrimmedState(draftState, this.subjectHasPermissions);
121
+ });
122
+ }
123
+ /**
124
+ * Returns a new state object that only includes subjects with permissions.
125
+ * This method is static because we want to call it in the constructor, before
126
+ * the controller's state is initialized.
127
+ *
128
+ * @param state - The state object to trim.
129
+ * @param hasPermissions - A function that returns a boolean indicating
130
+ * whether a particular subject (identified by its origin) has any
131
+ * permissions.
132
+ * @returns The new state object. If the specified `state` object has no
133
+ * subject metadata, the returned object will be equivalent to the default
134
+ * state of this controller.
135
+ */
136
+ static getTrimmedState(state, hasPermissions) {
137
+ const { subjectMetadata = {} } = state;
138
+ return {
139
+ subjectMetadata: Object.keys(subjectMetadata).reduce((newSubjectMetadata, origin) => {
140
+ if (hasPermissions(origin)) {
141
+ newSubjectMetadata[origin] = subjectMetadata[origin];
142
+ }
143
+ return newSubjectMetadata;
144
+ }, {}),
145
+ };
146
+ }
147
+ }
10
148
  //# sourceMappingURL=SubjectMetadataController.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
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 RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\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: { persist: true, anonymous: false },\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 = 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 BaseController<\n typeof controllerName,\n SubjectMetadataControllerState,\n SubjectMetadataControllerMessenger\n> {\n private readonly subjectCacheLimit: number;\n\n private readonly subjectsWithoutPermissionsEncounteredSinceStartup: Set<string>;\n\n private 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) => {\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 // ESLint is confused by the string literal type.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `${this.name}:getSubjectMetadata`,\n this.getSubjectMetadata.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n // ESLint is confused by the string literal type.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\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 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((draftState) => {\n // @ts-expect-error ts(2589)\n return SubjectMetadataController.getTrimmedState(\n draftState,\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"]}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PermissionsRequestNotFoundError = exports.CaveatSpecificationMismatchError = exports.CaveatMergeTypeMismatchError = exports.DuplicateCaveatError = exports.ForbiddenCaveatError = exports.InvalidCaveatFieldsError = exports.CaveatInvalidJsonError = exports.CaveatMissingValueError = exports.InvalidCaveatTypeError = exports.InvalidCaveatError = exports.CaveatAlreadyExistsError = exports.CaveatDoesNotExistError = exports.InvalidCaveatsPropertyError = exports.UnrecognizedCaveatTypeError = exports.EndowmentPermissionDoesNotExistError = exports.PermissionDoesNotExistError = exports.InvalidApprovedPermissionError = exports.InvalidMergedPermissionsError = exports.CaveatMergerDoesNotExistError = exports.UnrecognizedSubjectError = exports.InvalidSubjectIdentifierError = exports.internalError = exports.userRejectedRequest = exports.invalidParams = exports.methodNotFound = exports.unauthorized = void 0;
4
+ const rpc_errors_1 = require("@metamask/rpc-errors");
5
+ /**
6
+ * Utility function for building an "unauthorized" error.
7
+ *
8
+ * @param opts - Optional arguments that add extra context
9
+ * @returns The built error
10
+ */
11
+ function unauthorized(opts) {
12
+ return rpc_errors_1.providerErrors.unauthorized({
13
+ message: 'Unauthorized to perform action. Try requesting the required permission(s) first. For more information, see: https://docs.metamask.io/guide/rpc-api.html#permissions',
14
+ data: opts.data,
15
+ });
16
+ }
17
+ exports.unauthorized = unauthorized;
18
+ /**
19
+ * Utility function for building a "method not found" error.
20
+ *
21
+ * @param method - The method in question.
22
+ * @param data - Optional data for context.
23
+ * @returns The built error
24
+ */
25
+ function methodNotFound(method, data) {
26
+ const message = `The method "${method}" does not exist / is not available.`;
27
+ const opts = { message };
28
+ if (data !== undefined) {
29
+ opts.data = data;
30
+ }
31
+ return rpc_errors_1.rpcErrors.methodNotFound(opts);
32
+ }
33
+ exports.methodNotFound = methodNotFound;
34
+ /**
35
+ * Utility function for building an "invalid params" error.
36
+ *
37
+ * @param opts - Optional arguments that add extra context
38
+ * @returns The built error
39
+ */
40
+ function invalidParams(opts) {
41
+ return rpc_errors_1.rpcErrors.invalidParams({
42
+ data: opts.data,
43
+ message: opts.message,
44
+ });
45
+ }
46
+ exports.invalidParams = invalidParams;
47
+ /**
48
+ * Utility function for building an "user rejected request" error.
49
+ *
50
+ * @param data - Optional data to add extra context
51
+ * @returns The built error
52
+ */
53
+ function userRejectedRequest(data) {
54
+ return rpc_errors_1.providerErrors.userRejectedRequest({ data });
55
+ }
56
+ exports.userRejectedRequest = userRejectedRequest;
57
+ /**
58
+ * Utility function for building an internal error.
59
+ *
60
+ * @param message - The error message
61
+ * @param data - Optional data to add extra context
62
+ * @returns The built error
63
+ */
64
+ function internalError(message, data) {
65
+ return rpc_errors_1.rpcErrors.internal({ message, data });
66
+ }
67
+ exports.internalError = internalError;
68
+ class InvalidSubjectIdentifierError extends Error {
69
+ constructor(origin) {
70
+ super(`Invalid subject identifier: "${typeof origin === 'string' ? origin : typeof origin}"`);
71
+ }
72
+ }
73
+ exports.InvalidSubjectIdentifierError = InvalidSubjectIdentifierError;
74
+ class UnrecognizedSubjectError extends Error {
75
+ constructor(origin) {
76
+ super(`Unrecognized subject: "${origin}" has no permissions.`);
77
+ }
78
+ }
79
+ exports.UnrecognizedSubjectError = UnrecognizedSubjectError;
80
+ class CaveatMergerDoesNotExistError extends Error {
81
+ constructor(caveatType) {
82
+ super(`Caveat value merger does not exist for type: "${caveatType}"`);
83
+ }
84
+ }
85
+ exports.CaveatMergerDoesNotExistError = CaveatMergerDoesNotExistError;
86
+ class InvalidMergedPermissionsError extends Error {
87
+ constructor(origin, cause, diff) {
88
+ super(`Invalid merged permissions for subject "${origin}":\n${cause.message}`);
89
+ this.cause = cause;
90
+ this.data = { diff };
91
+ }
92
+ }
93
+ exports.InvalidMergedPermissionsError = InvalidMergedPermissionsError;
94
+ class InvalidApprovedPermissionError extends Error {
95
+ constructor(origin, target, approvedPermission) {
96
+ super(`Invalid approved permission for origin "${origin}" and target "${target}".`);
97
+ this.data = { origin, target, approvedPermission };
98
+ }
99
+ }
100
+ exports.InvalidApprovedPermissionError = InvalidApprovedPermissionError;
101
+ class PermissionDoesNotExistError extends Error {
102
+ constructor(origin, target) {
103
+ super(`Subject "${origin}" has no permission for "${target}".`);
104
+ }
105
+ }
106
+ exports.PermissionDoesNotExistError = PermissionDoesNotExistError;
107
+ class EndowmentPermissionDoesNotExistError extends Error {
108
+ constructor(target, origin) {
109
+ super(`${origin ? `Subject "${origin}"` : 'Unknown subject'} has no permission for "${target}".`);
110
+ if (origin) {
111
+ this.data = { origin };
112
+ }
113
+ }
114
+ }
115
+ exports.EndowmentPermissionDoesNotExistError = EndowmentPermissionDoesNotExistError;
116
+ class UnrecognizedCaveatTypeError extends Error {
117
+ constructor(caveatType, origin, target) {
118
+ super(`Unrecognized caveat type: "${caveatType}"`);
119
+ this.data = { caveatType };
120
+ if (origin !== undefined) {
121
+ this.data.origin = origin;
122
+ }
123
+ if (target !== undefined) {
124
+ this.data.target = target;
125
+ }
126
+ }
127
+ }
128
+ exports.UnrecognizedCaveatTypeError = UnrecognizedCaveatTypeError;
129
+ class InvalidCaveatsPropertyError extends Error {
130
+ constructor(origin, target, caveatsProperty) {
131
+ super(`The "caveats" property of permission for "${target}" of subject "${origin}" is invalid. It must be a non-empty array if specified.`);
132
+ this.data = { origin, target, caveatsProperty };
133
+ }
134
+ }
135
+ exports.InvalidCaveatsPropertyError = InvalidCaveatsPropertyError;
136
+ class CaveatDoesNotExistError extends Error {
137
+ constructor(origin, target, caveatType) {
138
+ super(`Permission for "${target}" of subject "${origin}" has no caveat of type "${caveatType}".`);
139
+ }
140
+ }
141
+ exports.CaveatDoesNotExistError = CaveatDoesNotExistError;
142
+ class CaveatAlreadyExistsError extends Error {
143
+ constructor(origin, target, caveatType) {
144
+ super(`Permission for "${target}" of subject "${origin}" already has a caveat of type "${caveatType}".`);
145
+ }
146
+ }
147
+ exports.CaveatAlreadyExistsError = CaveatAlreadyExistsError;
148
+ class InvalidCaveatError extends rpc_errors_1.JsonRpcError {
149
+ constructor(receivedCaveat, origin, target) {
150
+ super(rpc_errors_1.errorCodes.rpc.invalidParams, `Invalid caveat. Caveats must be plain objects.`, { receivedCaveat });
151
+ this.data = { origin, target };
152
+ }
153
+ }
154
+ exports.InvalidCaveatError = InvalidCaveatError;
155
+ class InvalidCaveatTypeError extends Error {
156
+ constructor(caveat, origin, target) {
157
+ super(`Caveat types must be strings. Received: "${typeof caveat.type}"`);
158
+ this.data = { caveat, origin, target };
159
+ }
160
+ }
161
+ exports.InvalidCaveatTypeError = InvalidCaveatTypeError;
162
+ class CaveatMissingValueError extends Error {
163
+ constructor(caveat, origin, target) {
164
+ super(`Caveat is missing "value" field.`);
165
+ this.data = { caveat, origin, target };
166
+ }
167
+ }
168
+ exports.CaveatMissingValueError = CaveatMissingValueError;
169
+ class CaveatInvalidJsonError extends Error {
170
+ constructor(caveat, origin, target) {
171
+ super(`Caveat "value" is invalid JSON.`);
172
+ this.data = { caveat, origin, target };
173
+ }
174
+ }
175
+ exports.CaveatInvalidJsonError = CaveatInvalidJsonError;
176
+ class InvalidCaveatFieldsError extends Error {
177
+ constructor(caveat, origin, target) {
178
+ super(`Caveat has unexpected number of fields: "${Object.keys(caveat).length}"`);
179
+ this.data = { caveat, origin, target };
180
+ }
181
+ }
182
+ exports.InvalidCaveatFieldsError = InvalidCaveatFieldsError;
183
+ class ForbiddenCaveatError extends Error {
184
+ constructor(caveatType, origin, targetName) {
185
+ super(`Permissions for target "${targetName}" may not have caveats of type "${caveatType}".`);
186
+ this.data = { caveatType, origin, target: targetName };
187
+ }
188
+ }
189
+ exports.ForbiddenCaveatError = ForbiddenCaveatError;
190
+ class DuplicateCaveatError extends Error {
191
+ constructor(caveatType, origin, targetName) {
192
+ super(`Permissions for target "${targetName}" contains multiple caveats of type "${caveatType}".`);
193
+ this.data = { caveatType, origin, target: targetName };
194
+ }
195
+ }
196
+ exports.DuplicateCaveatError = DuplicateCaveatError;
197
+ class CaveatMergeTypeMismatchError extends Error {
198
+ constructor(leftCaveatType, rightCaveatType) {
199
+ super(`Cannot merge caveats of different types: "${leftCaveatType}" and "${rightCaveatType}".`);
200
+ this.data = { leftCaveatType, rightCaveatType };
201
+ }
202
+ }
203
+ exports.CaveatMergeTypeMismatchError = CaveatMergeTypeMismatchError;
204
+ class CaveatSpecificationMismatchError extends Error {
205
+ constructor(caveatSpec, permissionType) {
206
+ super(`Caveat specification uses a mismatched type. Expected caveats for ${permissionType}`);
207
+ this.data = { caveatSpec, permissionType };
208
+ }
209
+ }
210
+ exports.CaveatSpecificationMismatchError = CaveatSpecificationMismatchError;
211
+ class PermissionsRequestNotFoundError extends Error {
212
+ constructor(id) {
213
+ super(`Permissions request with id "${id}" not found.`);
214
+ }
215
+ }
216
+ exports.PermissionsRequestNotFoundError = PermissionsRequestNotFoundError;
217
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataWithOptionalCause } from '@metamask/rpc-errors';\nimport {\n errorCodes,\n providerErrors,\n rpcErrors,\n JsonRpcError,\n} from '@metamask/rpc-errors';\n\nimport type { CaveatConstraint } from './Caveat';\nimport type { PermissionType } from './Permission';\nimport type { PermissionDiffMap } from './PermissionController';\n\ntype UnauthorizedArg = {\n data?: Record<string, unknown>;\n message?: string;\n};\n\n/**\n * Utility function for building an \"unauthorized\" error.\n *\n * @param opts - Optional arguments that add extra context\n * @returns The built error\n */\nexport function unauthorized(opts: UnauthorizedArg) {\n return providerErrors.unauthorized({\n message:\n 'Unauthorized to perform action. Try requesting the required permission(s) first. For more information, see: https://docs.metamask.io/guide/rpc-api.html#permissions',\n data: opts.data,\n });\n}\n\n/**\n * Utility function for building a \"method not found\" error.\n *\n * @param method - The method in question.\n * @param data - Optional data for context.\n * @returns The built error\n */\nexport function methodNotFound(method: string, data?: DataWithOptionalCause) {\n const message = `The method \"${method}\" does not exist / is not available.`;\n\n const opts: Parameters<typeof rpcErrors.methodNotFound>[0] = { message };\n if (data !== undefined) {\n opts.data = data;\n }\n return rpcErrors.methodNotFound(opts);\n}\n\ntype InvalidParamsArg = {\n message?: string;\n data?: DataWithOptionalCause;\n};\n\n/**\n * Utility function for building an \"invalid params\" error.\n *\n * @param opts - Optional arguments that add extra context\n * @returns The built error\n */\nexport function invalidParams(opts: InvalidParamsArg) {\n return rpcErrors.invalidParams({\n data: opts.data,\n message: opts.message,\n });\n}\n\n/**\n * Utility function for building an \"user rejected request\" error.\n *\n * @param data - Optional data to add extra context\n * @returns The built error\n */\nexport function userRejectedRequest<Data extends Record<string, unknown>>(\n data?: Data,\n): JsonRpcError<Data> {\n return providerErrors.userRejectedRequest({ data });\n}\n\n/**\n * Utility function for building an internal error.\n *\n * @param message - The error message\n * @param data - Optional data to add extra context\n * @returns The built error\n */\nexport function internalError<Data extends Record<string, unknown>>(\n message: string,\n data?: Data,\n): JsonRpcError<Data> {\n return rpcErrors.internal({ message, data });\n}\n\nexport class InvalidSubjectIdentifierError extends Error {\n constructor(origin: unknown) {\n super(\n `Invalid subject identifier: \"${\n typeof origin === 'string' ? origin : typeof origin\n }\"`,\n );\n }\n}\n\nexport class UnrecognizedSubjectError extends Error {\n constructor(origin: string) {\n super(`Unrecognized subject: \"${origin}\" has no permissions.`);\n }\n}\n\nexport class CaveatMergerDoesNotExistError extends Error {\n constructor(caveatType: string) {\n super(`Caveat value merger does not exist for type: \"${caveatType}\"`);\n }\n}\n\nexport class InvalidMergedPermissionsError extends Error {\n public cause: Error;\n\n public data: {\n diff: PermissionDiffMap<string, CaveatConstraint>;\n };\n\n constructor(\n origin: string,\n cause: Error,\n diff: PermissionDiffMap<string, CaveatConstraint>,\n ) {\n super(\n `Invalid merged permissions for subject \"${origin}\":\\n${cause.message}`,\n );\n this.cause = cause;\n this.data = { diff };\n }\n}\n\nexport class InvalidApprovedPermissionError extends Error {\n public data: {\n origin: string;\n target: string;\n approvedPermission: Record<string, unknown>;\n };\n\n constructor(\n origin: string,\n target: string,\n approvedPermission: Record<string, unknown>,\n ) {\n super(\n `Invalid approved permission for origin \"${origin}\" and target \"${target}\".`,\n );\n this.data = { origin, target, approvedPermission };\n }\n}\nexport class PermissionDoesNotExistError extends Error {\n constructor(origin: string, target: string) {\n super(`Subject \"${origin}\" has no permission for \"${target}\".`);\n }\n}\n\nexport class EndowmentPermissionDoesNotExistError extends Error {\n public data?: { origin: string };\n\n constructor(target: string, origin?: string) {\n super(\n `${\n origin ? `Subject \"${origin}\"` : 'Unknown subject'\n } has no permission for \"${target}\".`,\n );\n if (origin) {\n this.data = { origin };\n }\n }\n}\n\nexport class UnrecognizedCaveatTypeError extends Error {\n public data: {\n caveatType: string;\n origin?: string;\n target?: string;\n };\n\n constructor(caveatType: string);\n\n constructor(caveatType: string, origin: string, target: string);\n\n constructor(caveatType: string, origin?: string, target?: string) {\n super(`Unrecognized caveat type: \"${caveatType}\"`);\n this.data = { caveatType };\n if (origin !== undefined) {\n this.data.origin = origin;\n }\n\n if (target !== undefined) {\n this.data.target = target;\n }\n }\n}\n\nexport class InvalidCaveatsPropertyError extends Error {\n public data: { origin: string; target: string; caveatsProperty: unknown };\n\n constructor(origin: string, target: string, caveatsProperty: unknown) {\n super(\n `The \"caveats\" property of permission for \"${target}\" of subject \"${origin}\" is invalid. It must be a non-empty array if specified.`,\n );\n this.data = { origin, target, caveatsProperty };\n }\n}\n\nexport class CaveatDoesNotExistError extends Error {\n constructor(origin: string, target: string, caveatType: string) {\n super(\n `Permission for \"${target}\" of subject \"${origin}\" has no caveat of type \"${caveatType}\".`,\n );\n }\n}\n\nexport class CaveatAlreadyExistsError extends Error {\n constructor(origin: string, target: string, caveatType: string) {\n super(\n `Permission for \"${target}\" of subject \"${origin}\" already has a caveat of type \"${caveatType}\".`,\n );\n }\n}\n\nexport class InvalidCaveatError extends JsonRpcError<\n DataWithOptionalCause | undefined\n> {\n public override data: { origin: string; target: string };\n\n constructor(receivedCaveat: unknown, origin: string, target: string) {\n super(\n errorCodes.rpc.invalidParams,\n `Invalid caveat. Caveats must be plain objects.`,\n { receivedCaveat },\n );\n this.data = { origin, target };\n }\n}\n\nexport class InvalidCaveatTypeError extends Error {\n public data: {\n caveat: Record<string, unknown>;\n origin: string;\n target: string;\n };\n\n constructor(caveat: Record<string, unknown>, origin: string, target: string) {\n super(`Caveat types must be strings. Received: \"${typeof caveat.type}\"`);\n this.data = { caveat, origin, target };\n }\n}\n\nexport class CaveatMissingValueError extends Error {\n public data: {\n caveat: Record<string, unknown>;\n origin: string;\n target: string;\n };\n\n constructor(caveat: Record<string, unknown>, origin: string, target: string) {\n super(`Caveat is missing \"value\" field.`);\n this.data = { caveat, origin, target };\n }\n}\n\nexport class CaveatInvalidJsonError extends Error {\n public data: {\n caveat: Record<string, unknown>;\n origin: string;\n target: string;\n };\n\n constructor(caveat: Record<string, unknown>, origin: string, target: string) {\n super(`Caveat \"value\" is invalid JSON.`);\n this.data = { caveat, origin, target };\n }\n}\n\nexport class InvalidCaveatFieldsError extends Error {\n public data: {\n caveat: Record<string, unknown>;\n origin: string;\n target: string;\n };\n\n constructor(caveat: Record<string, unknown>, origin: string, target: string) {\n super(\n `Caveat has unexpected number of fields: \"${Object.keys(caveat).length}\"`,\n );\n this.data = { caveat, origin, target };\n }\n}\n\nexport class ForbiddenCaveatError extends Error {\n public data: {\n caveatType: string;\n origin: string;\n target: string;\n };\n\n constructor(caveatType: string, origin: string, targetName: string) {\n super(\n `Permissions for target \"${targetName}\" may not have caveats of type \"${caveatType}\".`,\n );\n this.data = { caveatType, origin, target: targetName };\n }\n}\n\nexport class DuplicateCaveatError extends Error {\n public data: {\n caveatType: string;\n origin: string;\n target: string;\n };\n\n constructor(caveatType: string, origin: string, targetName: string) {\n super(\n `Permissions for target \"${targetName}\" contains multiple caveats of type \"${caveatType}\".`,\n );\n this.data = { caveatType, origin, target: targetName };\n }\n}\n\nexport class CaveatMergeTypeMismatchError extends Error {\n public data: {\n leftCaveatType: string;\n rightCaveatType: string;\n };\n\n constructor(leftCaveatType: string, rightCaveatType: string) {\n super(\n `Cannot merge caveats of different types: \"${leftCaveatType}\" and \"${rightCaveatType}\".`,\n );\n this.data = { leftCaveatType, rightCaveatType };\n }\n}\n\nexport class CaveatSpecificationMismatchError extends Error {\n public data: {\n caveatSpec: Record<string, unknown>;\n permissionType: PermissionType;\n };\n\n constructor(\n caveatSpec: Record<string, unknown>,\n permissionType: PermissionType,\n ) {\n super(\n `Caveat specification uses a mismatched type. Expected caveats for ${permissionType}`,\n );\n this.data = { caveatSpec, permissionType };\n }\n}\n\nexport class PermissionsRequestNotFoundError extends Error {\n constructor(id: string) {\n super(`Permissions request with id \"${id}\" not found.`);\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
- import type { DataWithOptionalCause } from '@metamask/rpc-errors';
2
- import { JsonRpcError } from '@metamask/rpc-errors';
3
- import type { CaveatConstraint } from './Caveat';
4
- import type { PermissionType } from './Permission';
5
- import type { PermissionDiffMap } from './PermissionController';
1
+ import type { DataWithOptionalCause } from "@metamask/rpc-errors";
2
+ import { JsonRpcError } from "@metamask/rpc-errors";
3
+ import type { CaveatConstraint } from "./Caveat.cjs";
4
+ import type { PermissionType } from "./Permission.cjs";
5
+ import type { PermissionDiffMap } from "./PermissionController.cjs";
6
6
  type UnauthorizedArg = {
7
7
  data?: Record<string, unknown>;
8
8
  message?: string;
@@ -182,4 +182,4 @@ export declare class PermissionsRequestNotFoundError extends Error {
182
182
  constructor(id: string);
183
183
  }
184
184
  export {};
185
- //# sourceMappingURL=errors.d.ts.map
185
+ //# sourceMappingURL=errors.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.cts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import type { DataWithOptionalCause } from "@metamask/rpc-errors";
2
+ import { JsonRpcError } from "@metamask/rpc-errors";
3
+ import type { CaveatConstraint } from "./Caveat.mjs";
4
+ import type { PermissionType } from "./Permission.mjs";
5
+ import type { PermissionDiffMap } from "./PermissionController.mjs";
6
+ type UnauthorizedArg = {
7
+ data?: Record<string, unknown>;
8
+ message?: string;
9
+ };
10
+ /**
11
+ * Utility function for building an "unauthorized" error.
12
+ *
13
+ * @param opts - Optional arguments that add extra context
14
+ * @returns The built error
15
+ */
16
+ export declare function unauthorized(opts: UnauthorizedArg): import("@metamask/rpc-errors").EthereumProviderError<Record<string, unknown>>;
17
+ /**
18
+ * Utility function for building a "method not found" error.
19
+ *
20
+ * @param method - The method in question.
21
+ * @param data - Optional data for context.
22
+ * @returns The built error
23
+ */
24
+ export declare function methodNotFound(method: string, data?: DataWithOptionalCause): JsonRpcError<import("@metamask/rpc-errors").OptionalDataWithOptionalCause>;
25
+ type InvalidParamsArg = {
26
+ message?: string;
27
+ data?: DataWithOptionalCause;
28
+ };
29
+ /**
30
+ * Utility function for building an "invalid params" error.
31
+ *
32
+ * @param opts - Optional arguments that add extra context
33
+ * @returns The built error
34
+ */
35
+ export declare function invalidParams(opts: InvalidParamsArg): JsonRpcError<string | number | boolean | import("@metamask/utils").Json[] | {
36
+ [prop: string]: import("@metamask/utils").Json;
37
+ } | {
38
+ [key: string]: unknown;
39
+ cause?: unknown;
40
+ } | null>;
41
+ /**
42
+ * Utility function for building an "user rejected request" error.
43
+ *
44
+ * @param data - Optional data to add extra context
45
+ * @returns The built error
46
+ */
47
+ export declare function userRejectedRequest<Data extends Record<string, unknown>>(data?: Data): JsonRpcError<Data>;
48
+ /**
49
+ * Utility function for building an internal error.
50
+ *
51
+ * @param message - The error message
52
+ * @param data - Optional data to add extra context
53
+ * @returns The built error
54
+ */
55
+ export declare function internalError<Data extends Record<string, unknown>>(message: string, data?: Data): JsonRpcError<Data>;
56
+ export declare class InvalidSubjectIdentifierError extends Error {
57
+ constructor(origin: unknown);
58
+ }
59
+ export declare class UnrecognizedSubjectError extends Error {
60
+ constructor(origin: string);
61
+ }
62
+ export declare class CaveatMergerDoesNotExistError extends Error {
63
+ constructor(caveatType: string);
64
+ }
65
+ export declare class InvalidMergedPermissionsError extends Error {
66
+ cause: Error;
67
+ data: {
68
+ diff: PermissionDiffMap<string, CaveatConstraint>;
69
+ };
70
+ constructor(origin: string, cause: Error, diff: PermissionDiffMap<string, CaveatConstraint>);
71
+ }
72
+ export declare class InvalidApprovedPermissionError extends Error {
73
+ data: {
74
+ origin: string;
75
+ target: string;
76
+ approvedPermission: Record<string, unknown>;
77
+ };
78
+ constructor(origin: string, target: string, approvedPermission: Record<string, unknown>);
79
+ }
80
+ export declare class PermissionDoesNotExistError extends Error {
81
+ constructor(origin: string, target: string);
82
+ }
83
+ export declare class EndowmentPermissionDoesNotExistError extends Error {
84
+ data?: {
85
+ origin: string;
86
+ };
87
+ constructor(target: string, origin?: string);
88
+ }
89
+ export declare class UnrecognizedCaveatTypeError extends Error {
90
+ data: {
91
+ caveatType: string;
92
+ origin?: string;
93
+ target?: string;
94
+ };
95
+ constructor(caveatType: string);
96
+ constructor(caveatType: string, origin: string, target: string);
97
+ }
98
+ export declare class InvalidCaveatsPropertyError extends Error {
99
+ data: {
100
+ origin: string;
101
+ target: string;
102
+ caveatsProperty: unknown;
103
+ };
104
+ constructor(origin: string, target: string, caveatsProperty: unknown);
105
+ }
106
+ export declare class CaveatDoesNotExistError extends Error {
107
+ constructor(origin: string, target: string, caveatType: string);
108
+ }
109
+ export declare class CaveatAlreadyExistsError extends Error {
110
+ constructor(origin: string, target: string, caveatType: string);
111
+ }
112
+ export declare class InvalidCaveatError extends JsonRpcError<DataWithOptionalCause | undefined> {
113
+ data: {
114
+ origin: string;
115
+ target: string;
116
+ };
117
+ constructor(receivedCaveat: unknown, origin: string, target: string);
118
+ }
119
+ export declare class InvalidCaveatTypeError extends Error {
120
+ data: {
121
+ caveat: Record<string, unknown>;
122
+ origin: string;
123
+ target: string;
124
+ };
125
+ constructor(caveat: Record<string, unknown>, origin: string, target: string);
126
+ }
127
+ export declare class CaveatMissingValueError extends Error {
128
+ data: {
129
+ caveat: Record<string, unknown>;
130
+ origin: string;
131
+ target: string;
132
+ };
133
+ constructor(caveat: Record<string, unknown>, origin: string, target: string);
134
+ }
135
+ export declare class CaveatInvalidJsonError extends Error {
136
+ data: {
137
+ caveat: Record<string, unknown>;
138
+ origin: string;
139
+ target: string;
140
+ };
141
+ constructor(caveat: Record<string, unknown>, origin: string, target: string);
142
+ }
143
+ export declare class InvalidCaveatFieldsError extends Error {
144
+ data: {
145
+ caveat: Record<string, unknown>;
146
+ origin: string;
147
+ target: string;
148
+ };
149
+ constructor(caveat: Record<string, unknown>, origin: string, target: string);
150
+ }
151
+ export declare class ForbiddenCaveatError extends Error {
152
+ data: {
153
+ caveatType: string;
154
+ origin: string;
155
+ target: string;
156
+ };
157
+ constructor(caveatType: string, origin: string, targetName: string);
158
+ }
159
+ export declare class DuplicateCaveatError extends Error {
160
+ data: {
161
+ caveatType: string;
162
+ origin: string;
163
+ target: string;
164
+ };
165
+ constructor(caveatType: string, origin: string, targetName: string);
166
+ }
167
+ export declare class CaveatMergeTypeMismatchError extends Error {
168
+ data: {
169
+ leftCaveatType: string;
170
+ rightCaveatType: string;
171
+ };
172
+ constructor(leftCaveatType: string, rightCaveatType: string);
173
+ }
174
+ export declare class CaveatSpecificationMismatchError extends Error {
175
+ data: {
176
+ caveatSpec: Record<string, unknown>;
177
+ permissionType: PermissionType;
178
+ };
179
+ constructor(caveatSpec: Record<string, unknown>, permissionType: PermissionType);
180
+ }
181
+ export declare class PermissionsRequestNotFoundError extends Error {
182
+ constructor(id: string);
183
+ }
184
+ export {};
185
+ //# sourceMappingURL=errors.d.mts.map