@metamask/snaps-controllers 9.4.0 → 9.5.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.
- package/CHANGELOG.md +11 -2
- package/dist/{chunk-OJBUUQ5D.js → chunk-2D5PGL7S.js} +7 -7
- package/dist/chunk-2D5PGL7S.js.map +1 -0
- package/dist/{chunk-6GMWL4JR.mjs → chunk-2SRKMEUV.mjs} +2 -2
- package/dist/chunk-2SRKMEUV.mjs.map +1 -0
- package/dist/{chunk-5O4O4BI5.js → chunk-36QDTCDZ.js} +1 -1
- package/dist/chunk-36QDTCDZ.js.map +1 -0
- package/dist/{chunk-POQSARDG.js → chunk-3WWZDKQL.js} +7 -7
- package/dist/{chunk-FKQTV3LO.js → chunk-6K4MATNG.js} +4 -4
- package/dist/chunk-6K4MATNG.js.map +1 -0
- package/dist/{chunk-LWBPKSU2.js → chunk-6Z4WDAVC.js} +3 -3
- package/dist/{chunk-WKQRCGUW.mjs → chunk-BAUQWPSP.mjs} +2 -2
- package/dist/chunk-BAUQWPSP.mjs.map +1 -0
- package/dist/{chunk-XFUP7RFI.js → chunk-DSOZPX7I.js} +1 -1
- package/dist/chunk-DSOZPX7I.js.map +1 -0
- package/dist/{chunk-UMVUXQ3B.mjs → chunk-F3ZMDQ52.mjs} +1 -1
- package/dist/chunk-F3ZMDQ52.mjs.map +1 -0
- package/dist/{chunk-3WEWHK2I.mjs → chunk-HULNFJMA.mjs} +7 -3
- package/dist/chunk-HULNFJMA.mjs.map +1 -0
- package/dist/{chunk-CPUUURMT.js → chunk-I25KLPIS.js} +2 -2
- package/dist/chunk-I25KLPIS.js.map +1 -0
- package/dist/{chunk-6M4XK4PN.mjs → chunk-I5V56NYO.mjs} +2 -2
- package/dist/chunk-I5V56NYO.mjs.map +1 -0
- package/dist/{chunk-XWDEGRM5.js → chunk-K3TNQEM5.js} +2 -2
- package/dist/chunk-K3TNQEM5.js.map +1 -0
- package/dist/{chunk-2MH7QYBP.mjs → chunk-QWN3UOMA.mjs} +3 -3
- package/dist/chunk-QWN3UOMA.mjs.map +1 -0
- package/dist/{chunk-EVKVZUYY.js → chunk-RZ2NHZXH.js} +7 -3
- package/dist/chunk-RZ2NHZXH.js.map +1 -0
- package/dist/{chunk-RDBT3ZJQ.js → chunk-TIURYSSR.js} +2 -2
- package/dist/{chunk-RDBT3ZJQ.js.map → chunk-TIURYSSR.js.map} +1 -1
- package/dist/{chunk-B3UTLNYS.mjs → chunk-UM4NFNEI.mjs} +2 -2
- package/dist/{chunk-33RRV7F4.mjs → chunk-Z4BUMSH3.mjs} +1 -1
- package/dist/chunk-Z4BUMSH3.mjs.map +1 -0
- package/dist/{chunk-CJY2LYEL.mjs → chunk-Z5QWRDUN.mjs} +2 -2
- package/dist/chunk-Z5QWRDUN.mjs.map +1 -0
- package/dist/{chunk-2AEM5R2M.mjs → chunk-ZKG6FRKN.mjs} +4 -4
- package/dist/cronjob/CronjobController.js +11 -11
- package/dist/cronjob/CronjobController.mjs +10 -10
- package/dist/cronjob/index.js +11 -11
- package/dist/cronjob/index.mjs +10 -10
- package/dist/index.js +11 -11
- package/dist/index.mjs +10 -10
- package/dist/insights/SnapInsightsController.js +8 -8
- package/dist/insights/SnapInsightsController.mjs +7 -7
- package/dist/insights/index.js +8 -8
- package/dist/insights/index.mjs +7 -7
- package/dist/interface/SnapInterfaceController.js +3 -3
- package/dist/interface/SnapInterfaceController.mjs +2 -2
- package/dist/interface/index.js +3 -3
- package/dist/interface/index.mjs +2 -2
- package/dist/interface/utils.js +2 -2
- package/dist/interface/utils.mjs +1 -1
- package/dist/node.js +11 -11
- package/dist/node.mjs +10 -10
- package/dist/react-native.js +11 -11
- package/dist/react-native.mjs +10 -10
- package/dist/snaps/SnapController.js +7 -7
- package/dist/snaps/SnapController.mjs +6 -6
- package/dist/snaps/index.js +7 -7
- package/dist/snaps/index.mjs +6 -6
- package/dist/snaps/location/http.js +2 -2
- package/dist/snaps/location/http.mjs +1 -1
- package/dist/snaps/location/index.js +5 -5
- package/dist/snaps/location/index.mjs +4 -4
- package/dist/snaps/location/local.js +3 -3
- package/dist/snaps/location/local.mjs +2 -2
- package/dist/snaps/location/location.js +5 -5
- package/dist/snaps/location/location.mjs +4 -4
- package/dist/snaps/location/npm.js +2 -2
- package/dist/snaps/location/npm.mjs +1 -1
- package/dist/snaps/registry/index.js +2 -2
- package/dist/snaps/registry/index.mjs +1 -1
- package/dist/snaps/registry/json.js +2 -2
- package/dist/snaps/registry/json.mjs +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/cronjob/CronjobController.d.ts +6 -4
- package/dist/types/insights/SnapInsightsController.d.ts +6 -3
- package/dist/types/interface/SnapInterfaceController.d.ts +6 -3
- package/dist/types/snaps/SnapController.d.ts +8 -3
- package/dist/types/snaps/registry/json.d.ts +5 -3
- package/dist/types/utils.d.ts +1 -1
- package/package.json +3 -3
- package/dist/chunk-2MH7QYBP.mjs.map +0 -1
- package/dist/chunk-33RRV7F4.mjs.map +0 -1
- package/dist/chunk-3WEWHK2I.mjs.map +0 -1
- package/dist/chunk-5O4O4BI5.js.map +0 -1
- package/dist/chunk-6GMWL4JR.mjs.map +0 -1
- package/dist/chunk-6M4XK4PN.mjs.map +0 -1
- package/dist/chunk-CJY2LYEL.mjs.map +0 -1
- package/dist/chunk-CPUUURMT.js.map +0 -1
- package/dist/chunk-EVKVZUYY.js.map +0 -1
- package/dist/chunk-FKQTV3LO.js.map +0 -1
- package/dist/chunk-OJBUUQ5D.js.map +0 -1
- package/dist/chunk-UMVUXQ3B.mjs.map +0 -1
- package/dist/chunk-WKQRCGUW.mjs.map +0 -1
- package/dist/chunk-XFUP7RFI.js.map +0 -1
- package/dist/chunk-XWDEGRM5.js.map +0 -1
- /package/dist/{chunk-POQSARDG.js.map → chunk-3WWZDKQL.js.map} +0 -0
- /package/dist/{chunk-LWBPKSU2.js.map → chunk-6Z4WDAVC.js.map} +0 -0
- /package/dist/{chunk-B3UTLNYS.mjs.map → chunk-UM4NFNEI.mjs.map} +0 -0
- /package/dist/{chunk-2AEM5R2M.mjs.map → chunk-ZKG6FRKN.mjs.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,9 +6,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [9.5.0]
|
|
10
|
+
### Added
|
|
11
|
+
- Add `Selector` component ([#2645](https://github.com/MetaMask/snaps/pull/2645))
|
|
12
|
+
- Add missing types for `getState` action & `stateChange` event ([#2655](https://github.com/MetaMask/snaps/pull/2655), [#2659](https://github.com/MetaMask/snaps/pull/2659))
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- Fix `fetch` binding under LavaMoat ([#2642](https://github.com/MetaMask/snaps/pull/2642))
|
|
16
|
+
|
|
9
17
|
## [9.4.0]
|
|
10
18
|
### Added
|
|
11
|
-
- Add `
|
|
19
|
+
- Add `RadioGroup` component ([#2592](https://github.com/MetaMask/snaps/pull/2592))
|
|
12
20
|
|
|
13
21
|
### Changed
|
|
14
22
|
- Persist `severity` property in `SnapInsightsController` ([#2612](https://github.com/MetaMask/snaps/pull/2612))
|
|
@@ -348,7 +356,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
348
356
|
- The version of the package no longer needs to match the version of all other
|
|
349
357
|
MetaMask Snaps packages.
|
|
350
358
|
|
|
351
|
-
[Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.
|
|
359
|
+
[Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.5.0...HEAD
|
|
360
|
+
[9.5.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.4.0...@metamask/snaps-controllers@9.5.0
|
|
352
361
|
[9.4.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.3.1...@metamask/snaps-controllers@9.4.0
|
|
353
362
|
[9.3.1]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.3.0...@metamask/snaps-controllers@9.3.1
|
|
354
363
|
[9.3.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-controllers@9.2.0...@metamask/snaps-controllers@9.3.0
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkRZ2NHZXHjs = require('./chunk-RZ2NHZXH.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
@@ -88,11 +88,11 @@ var SnapInterfaceController = class extends _basecontroller.BaseController {
|
|
|
88
88
|
* @returns The newly interface id.
|
|
89
89
|
*/
|
|
90
90
|
async createInterface(snapId, content, context) {
|
|
91
|
-
const element =
|
|
91
|
+
const element = _chunkRZ2NHZXHjs.getJsxInterface.call(void 0, content);
|
|
92
92
|
await _chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _validateContent, validateContent_fn).call(this, element);
|
|
93
|
-
|
|
93
|
+
_chunkRZ2NHZXHjs.validateInterfaceContext.call(void 0, context);
|
|
94
94
|
const id = _nanoid.nanoid.call(void 0, );
|
|
95
|
-
const componentState =
|
|
95
|
+
const componentState = _chunkRZ2NHZXHjs.constructState.call(void 0, {}, element);
|
|
96
96
|
this.update((draftState) => {
|
|
97
97
|
draftState.interfaces[id] = {
|
|
98
98
|
snapId,
|
|
@@ -123,10 +123,10 @@ var SnapInterfaceController = class extends _basecontroller.BaseController {
|
|
|
123
123
|
*/
|
|
124
124
|
async updateInterface(snapId, id, content) {
|
|
125
125
|
_chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _validateArgs, validateArgs_fn).call(this, snapId, id);
|
|
126
|
-
const element =
|
|
126
|
+
const element = _chunkRZ2NHZXHjs.getJsxInterface.call(void 0, content);
|
|
127
127
|
await _chunkEXN2TFDJjs.__privateMethod.call(void 0, this, _validateContent, validateContent_fn).call(this, element);
|
|
128
128
|
const oldState = this.state.interfaces[id].state;
|
|
129
|
-
const newState =
|
|
129
|
+
const newState = _chunkRZ2NHZXHjs.constructState.call(void 0, oldState, element);
|
|
130
130
|
this.update((draftState) => {
|
|
131
131
|
draftState.interfaces[id].state = newState;
|
|
132
132
|
draftState.interfaces[id].content = element;
|
|
@@ -250,4 +250,4 @@ validateContent_fn = async function(element) {
|
|
|
250
250
|
|
|
251
251
|
|
|
252
252
|
exports.SnapInterfaceController = SnapInterfaceController;
|
|
253
|
-
//# sourceMappingURL=chunk-
|
|
253
|
+
//# sourceMappingURL=chunk-2D5PGL7S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/interface/SnapInterfaceController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptRequest,\n HasApprovalRequest,\n} from '@metamask/approval-controller';\nimport type {\n RestrictedControllerMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n MaybeUpdateState,\n TestOrigin,\n} from '@metamask/phishing-controller';\nimport type {\n InterfaceState,\n SnapId,\n ComponentOrElement,\n InterfaceContext,\n} from '@metamask/snaps-sdk';\nimport type { JSXElement } from '@metamask/snaps-sdk/jsx';\nimport { getJsonSizeUnsafe, validateJsxLinks } from '@metamask/snaps-utils';\nimport type { Json } from '@metamask/utils';\nimport { assert } from '@metamask/utils';\nimport { nanoid } from 'nanoid';\n\nimport {\n constructState,\n getJsxInterface,\n validateInterfaceContext,\n} from './utils';\n\nconst MAX_UI_CONTENT_SIZE = 10_000_000; // 10 mb\n\nconst controllerName = 'SnapInterfaceController';\n\nexport type CreateInterface = {\n type: `${typeof controllerName}:createInterface`;\n handler: SnapInterfaceController['createInterface'];\n};\n\nexport type GetInterface = {\n type: `${typeof controllerName}:getInterface`;\n handler: SnapInterfaceController['getInterface'];\n};\n\nexport type UpdateInterface = {\n type: `${typeof controllerName}:updateInterface`;\n handler: SnapInterfaceController['updateInterface'];\n};\n\nexport type DeleteInterface = {\n type: `${typeof controllerName}:deleteInterface`;\n handler: SnapInterfaceController['deleteInterface'];\n};\n\nexport type UpdateInterfaceState = {\n type: `${typeof controllerName}:updateInterfaceState`;\n handler: SnapInterfaceController['updateInterfaceState'];\n};\n\nexport type ResolveInterface = {\n type: `${typeof controllerName}:resolveInterface`;\n handler: SnapInterfaceController['resolveInterface'];\n};\n\nexport type SnapInterfaceControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SnapInterfaceControllerState\n>;\n\nexport type SnapInterfaceControllerAllowedActions =\n | TestOrigin\n | MaybeUpdateState\n | HasApprovalRequest\n | AcceptRequest;\n\nexport type SnapInterfaceControllerActions =\n | CreateInterface\n | GetInterface\n | UpdateInterface\n | DeleteInterface\n | UpdateInterfaceState\n | ResolveInterface\n | SnapInterfaceControllerGetStateAction;\n\nexport type SnapInterfaceControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n SnapInterfaceControllerState\n >;\n\nexport type SnapInterfaceControllerEvents =\n SnapInterfaceControllerStateChangeEvent;\n\nexport type SnapInterfaceControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SnapInterfaceControllerActions | SnapInterfaceControllerAllowedActions,\n SnapInterfaceControllerEvents,\n SnapInterfaceControllerAllowedActions['type'],\n SnapInterfaceControllerEvents['type']\n>;\n\nexport type StoredInterface = {\n snapId: SnapId;\n content: JSXElement;\n state: InterfaceState;\n context: InterfaceContext | null;\n};\n\nexport type SnapInterfaceControllerState = {\n interfaces: Record<string, StoredInterface>;\n};\n\nexport type SnapInterfaceControllerArgs = {\n messenger: SnapInterfaceControllerMessenger;\n state?: SnapInterfaceControllerState;\n};\n\n/**\n * Use this controller to manage snaps UI interfaces using RPC method hooks.\n */\nexport class SnapInterfaceController extends BaseController<\n typeof controllerName,\n SnapInterfaceControllerState,\n SnapInterfaceControllerMessenger\n> {\n constructor({ messenger, state }: SnapInterfaceControllerArgs) {\n super({\n messenger,\n metadata: {\n interfaces: { persist: false, anonymous: false },\n },\n name: controllerName,\n state: { interfaces: {}, ...state },\n });\n\n this.#registerMessageHandlers();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:createInterface`,\n this.createInterface.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getInterface`,\n this.getInterface.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateInterface`,\n this.updateInterface.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:deleteInterface`,\n this.deleteInterface.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateInterfaceState`,\n this.updateInterfaceState.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:resolveInterface`,\n this.resolveInterface.bind(this),\n );\n }\n\n /**\n * Create an interface in the controller state with the associated data.\n *\n * @param snapId - The snap id that created the interface.\n * @param content - The interface content.\n * @param context - An optional interface context object.\n * @returns The newly interface id.\n */\n async createInterface(\n snapId: SnapId,\n content: ComponentOrElement,\n context?: InterfaceContext,\n ) {\n const element = getJsxInterface(content);\n await this.#validateContent(element);\n validateInterfaceContext(context);\n\n const id = nanoid();\n const componentState = constructState({}, element);\n\n this.update((draftState) => {\n // @ts-expect-error - TS2589: Type instantiation is excessively deep and\n // possibly infinite.\n draftState.interfaces[id] = {\n snapId,\n content: element,\n state: componentState,\n context: context ?? null,\n };\n });\n\n return id;\n }\n\n /**\n * Get the data of a given interface id.\n *\n * @param snapId - The snap id requesting the interface data.\n * @param id - The interface id.\n * @returns The interface state.\n */\n getInterface(snapId: SnapId, id: string) {\n this.#validateArgs(snapId, id);\n\n return this.state.interfaces[id];\n }\n\n /**\n * Update the interface with the given content.\n *\n * @param snapId - The snap id requesting the update.\n * @param id - The interface id.\n * @param content - The new content.\n */\n async updateInterface(\n snapId: SnapId,\n id: string,\n content: ComponentOrElement,\n ) {\n this.#validateArgs(snapId, id);\n const element = getJsxInterface(content);\n await this.#validateContent(element);\n\n const oldState = this.state.interfaces[id].state;\n const newState = constructState(oldState, element);\n\n this.update((draftState) => {\n draftState.interfaces[id].state = newState;\n draftState.interfaces[id].content = element;\n });\n }\n\n /**\n * Delete an interface from state.\n *\n * @param id - The interface id.\n */\n deleteInterface(id: string) {\n this.update((draftState) => {\n delete draftState.interfaces[id];\n });\n }\n\n /**\n * Update the interface state.\n *\n * @param id - The interface id.\n * @param state - The new state.\n */\n updateInterfaceState(id: string, state: InterfaceState) {\n this.update((draftState) => {\n draftState.interfaces[id].state = state;\n });\n }\n\n /**\n * Resolve the promise of a given interface approval request.\n * The approval needs to have the same ID as the interface.\n *\n * @param snapId - The snap id.\n * @param id - The interface id.\n * @param value - The value to resolve the promise with.\n */\n async resolveInterface(snapId: SnapId, id: string, value: Json) {\n this.#validateArgs(snapId, id);\n this.#validateApproval(id);\n\n await this.#acceptApprovalRequest(id, value);\n\n this.deleteInterface(id);\n }\n\n /**\n * Utility function to validate the args passed to the other methods.\n *\n * @param snapId - The snap id.\n * @param id - The interface id.\n */\n #validateArgs(snapId: SnapId, id: string) {\n const existingInterface = this.state.interfaces[id];\n\n assert(\n existingInterface !== undefined,\n `Interface with id '${id}' not found.`,\n );\n assert(\n existingInterface.snapId === snapId,\n `Interface not created by ${snapId}.`,\n );\n }\n\n /**\n * Utility function to validate that the approval request exists.\n *\n * @param id - The interface id.\n */\n #validateApproval(id: string) {\n assert(\n this.#hasApprovalRequest(id),\n `Approval request with id '${id}' not found.`,\n );\n }\n\n /**\n * Trigger a Phishing list update if needed.\n */\n async #triggerPhishingListUpdate() {\n await this.messagingSystem.call('PhishingController:maybeUpdateState');\n }\n\n /**\n * Check an origin against the phishing list.\n *\n * @param origin - The origin to check.\n * @returns True if the origin is on the phishing list, otherwise false.\n */\n #checkPhishingList(origin: string) {\n return this.messagingSystem.call('PhishingController:testOrigin', origin)\n .result;\n }\n\n /**\n * Check if an approval request exists for a given interface by looking up\n * if the ApprovalController has a request with the given interface ID.\n *\n * @param id - The interface id.\n * @returns True if an approval request exists, otherwise false.\n */\n #hasApprovalRequest(id: string) {\n return this.messagingSystem.call('ApprovalController:hasRequest', {\n id,\n });\n }\n\n /**\n * Accept an approval request for a given interface.\n *\n * @param id - The interface id.\n * @param value - The value to resolve the promise with.\n */\n async #acceptApprovalRequest(id: string, value: Json) {\n await this.messagingSystem.call(\n 'ApprovalController:acceptRequest',\n id,\n value,\n );\n }\n\n /**\n * Utility function to validate the components of an interface.\n * Throws if something is invalid.\n *\n * @param element - The JSX element to verify.\n */\n async #validateContent(element: JSXElement) {\n // We assume the validity of this JSON to be validated by the caller.\n // E.g., in the RPC method implementation.\n const size = getJsonSizeUnsafe(element);\n assert(\n size <= MAX_UI_CONTENT_SIZE,\n `A Snap UI may not be larger than ${MAX_UI_CONTENT_SIZE / 1000000} MB.`,\n );\n\n await this.#triggerPhishingListUpdate();\n validateJsxLinks(element, this.#checkPhishingList.bind(this));\n }\n}\n"]}
|
|
@@ -18,7 +18,7 @@ var HttpLocation = class {
|
|
|
18
18
|
// in most often case we'll only have one file contents in common case.
|
|
19
19
|
this.cache = /* @__PURE__ */ new Map();
|
|
20
20
|
assertStruct(url.toString(), HttpSnapIdStruct, "Invalid Snap Id: ");
|
|
21
|
-
this.fetchFn = opts.fetch ?? globalThis.fetch.bind(
|
|
21
|
+
this.fetchFn = opts.fetch ?? globalThis.fetch.bind(void 0);
|
|
22
22
|
this.fetchOptions = opts.fetchOptions;
|
|
23
23
|
this.url = url;
|
|
24
24
|
}
|
|
@@ -89,4 +89,4 @@ var HttpLocation = class {
|
|
|
89
89
|
export {
|
|
90
90
|
HttpLocation
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-2SRKMEUV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/snaps/location/http.ts"],"sourcesContent":["import type { SnapManifest } from '@metamask/snaps-utils';\nimport {\n VirtualFile,\n HttpSnapIdStruct,\n NpmSnapFileNames,\n createSnapManifest,\n normalizeRelative,\n parseJson,\n} from '@metamask/snaps-utils';\nimport { assert, assertStruct } from '@metamask/utils';\n\nimport type { SnapLocation } from './location';\n\nexport interface HttpOptions {\n /**\n * @default fetch\n */\n fetch?: typeof fetch;\n fetchOptions?: RequestInit;\n}\n\nexport class HttpLocation implements SnapLocation {\n // We keep contents separate because then we can use only one Blob in cache,\n // which we convert to Uint8Array when actually returning the file.\n //\n // That avoids deepCloning file contents.\n // I imagine ArrayBuffers are copy-on-write optimized, meaning\n // in most often case we'll only have one file contents in common case.\n private readonly cache = new Map<\n string,\n { file: VirtualFile; contents: Blob }\n >();\n\n private validatedManifest?: VirtualFile<SnapManifest>;\n\n private readonly url: URL;\n\n private readonly fetchFn: typeof fetch;\n\n private readonly fetchOptions?: RequestInit;\n\n constructor(url: URL, opts: HttpOptions = {}) {\n assertStruct(url.toString(), HttpSnapIdStruct, 'Invalid Snap Id: ');\n this.fetchFn = opts.fetch ?? globalThis.fetch.bind(undefined);\n this.fetchOptions = opts.fetchOptions;\n this.url = url;\n }\n\n async manifest(): Promise<VirtualFile<SnapManifest>> {\n if (this.validatedManifest) {\n return this.validatedManifest.clone();\n }\n\n // jest-fetch-mock doesn't handle new URL(), we need to convert .toString()\n const canonicalPath = new URL(\n NpmSnapFileNames.Manifest,\n this.url,\n ).toString();\n\n const response = await this.fetchFn(canonicalPath, this.fetchOptions);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch \"${canonicalPath}\". Status code: ${response.status}.`,\n );\n }\n const contents = await response.text();\n const manifest = parseJson(contents);\n const vfile = new VirtualFile<SnapManifest>({\n value: contents,\n result: createSnapManifest(manifest),\n path: NpmSnapFileNames.Manifest,\n data: { canonicalPath },\n });\n this.validatedManifest = vfile;\n\n return this.manifest();\n }\n\n async fetch(path: string): Promise<VirtualFile> {\n const relativePath = normalizeRelative(path);\n const cached = this.cache.get(relativePath);\n if (cached !== undefined) {\n const { file, contents } = cached;\n const value = new Uint8Array(await contents.arrayBuffer());\n const vfile = file.clone();\n vfile.value = value;\n return vfile;\n }\n\n const canonicalPath = this.toCanonical(relativePath).toString();\n const response = await this.fetchFn(canonicalPath, this.fetchOptions);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch \"${canonicalPath}\". Status code: ${response.status}.`,\n );\n }\n const vfile = new VirtualFile({\n value: '',\n path: relativePath,\n data: { canonicalPath },\n });\n const blob = await response.blob();\n assert(\n !this.cache.has(relativePath),\n 'Corrupted cache, multiple files with same path.',\n );\n this.cache.set(relativePath, { file: vfile, contents: blob });\n\n return this.fetch(relativePath);\n }\n\n get root(): URL {\n return new URL(this.url);\n }\n\n private toCanonical(path: string): URL {\n assert(!path.startsWith('/'), 'Tried to parse absolute path.');\n return new URL(path, this.url);\n }\n}\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,QAAQ,oBAAoB;AAY9B,IAAM,eAAN,MAA2C;AAAA,EAoBhD,YAAY,KAAU,OAAoB,CAAC,GAAG;AAb9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAiB,QAAQ,oBAAI,IAG3B;AAWA,iBAAa,IAAI,SAAS,GAAG,kBAAkB,mBAAmB;AAClE,SAAK,UAAU,KAAK,SAAS,WAAW,MAAM,KAAK,MAAS;AAC5D,SAAK,eAAe,KAAK;AACzB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,MAAM,WAA+C;AACnD,QAAI,KAAK,mBAAmB;AAC1B,aAAO,KAAK,kBAAkB,MAAM;AAAA,IACtC;AAGA,UAAM,gBAAgB,IAAI;AAAA,MACxB,iBAAiB;AAAA,MACjB,KAAK;AAAA,IACP,EAAE,SAAS;AAEX,UAAM,WAAW,MAAM,KAAK,QAAQ,eAAe,KAAK,YAAY;AACpE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,oBAAoB,aAAa,mBAAmB,SAAS,MAAM;AAAA,MACrE;AAAA,IACF;AACA,UAAM,WAAW,MAAM,SAAS,KAAK;AACrC,UAAM,WAAW,UAAU,QAAQ;AACnC,UAAM,QAAQ,IAAI,YAA0B;AAAA,MAC1C,OAAO;AAAA,MACP,QAAQ,mBAAmB,QAAQ;AAAA,MACnC,MAAM,iBAAiB;AAAA,MACvB,MAAM,EAAE,cAAc;AAAA,IACxB,CAAC;AACD,SAAK,oBAAoB;AAEzB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,MAAM,MAAM,MAAoC;AAC9C,UAAM,eAAe,kBAAkB,IAAI;AAC3C,UAAM,SAAS,KAAK,MAAM,IAAI,YAAY;AAC1C,QAAI,WAAW,QAAW;AACxB,YAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,YAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AACzD,YAAMA,SAAQ,KAAK,MAAM;AACzB,MAAAA,OAAM,QAAQ;AACd,aAAOA;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,YAAY,YAAY,EAAE,SAAS;AAC9D,UAAM,WAAW,MAAM,KAAK,QAAQ,eAAe,KAAK,YAAY;AACpE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,oBAAoB,aAAa,mBAAmB,SAAS,MAAM;AAAA,MACrE;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,YAAY;AAAA,MAC5B,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM,EAAE,cAAc;AAAA,IACxB,CAAC;AACD,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC;AAAA,MACE,CAAC,KAAK,MAAM,IAAI,YAAY;AAAA,MAC5B;AAAA,IACF;AACA,SAAK,MAAM,IAAI,cAAc,EAAE,MAAM,OAAO,UAAU,KAAK,CAAC;AAE5D,WAAO,KAAK,MAAM,YAAY;AAAA,EAChC;AAAA,EAEA,IAAI,OAAY;AACd,WAAO,IAAI,IAAI,KAAK,GAAG;AAAA,EACzB;AAAA,EAEQ,YAAY,MAAmB;AACrC,WAAO,CAAC,KAAK,WAAW,GAAG,GAAG,+BAA+B;AAC7D,WAAO,IAAI,IAAI,MAAM,KAAK,GAAG;AAAA,EAC/B;AACF;","names":["vfile"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/insights/SnapInsightsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RestrictedControllerMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n Caveat,\n GetPermissions,\n ValidPermission,\n} from '@metamask/permission-controller';\nimport {\n getSignatureOriginCaveat,\n getTransactionOriginCaveat,\n SnapEndowments,\n} from '@metamask/snaps-rpc-methods';\nimport type { Json, SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport { hasProperty } from '@metamask/utils';\n\nimport type { DeleteInterface } from '../interface';\nimport type { GetAllSnaps, HandleSnapRequest } from '../snaps';\nimport { getRunnableSnaps } from '../snaps';\nimport type {\n TransactionControllerUnapprovedTransactionAddedEvent,\n TransactionMeta,\n SignatureStateChange,\n SignatureControllerState,\n StateSignature,\n TransactionControllerTransactionStatusUpdatedEvent,\n} from '../types';\n\nconst controllerName = 'SnapInsightsController';\n\nexport type SnapInsightsControllerAllowedActions =\n | HandleSnapRequest\n | GetAllSnaps\n | GetPermissions\n | DeleteInterface;\n\nexport type SnapInsightsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n SnapInsightsControllerState\n>;\n\nexport type SnapInsightsControllerActions =\n SnapInsightsControllerGetStateAction;\n\nexport type SnapInsightControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n SnapInsightsControllerState\n>;\n\nexport type SnapInsightControllerEvents = SnapInsightControllerStateChangeEvent;\n\nexport type SnapInsightsControllerAllowedEvents =\n | TransactionControllerUnapprovedTransactionAddedEvent\n | TransactionControllerTransactionStatusUpdatedEvent\n | SignatureStateChange;\n\nexport type SnapInsightsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SnapInsightsControllerActions | SnapInsightsControllerAllowedActions,\n SnapInsightControllerEvents | SnapInsightsControllerAllowedEvents,\n SnapInsightsControllerAllowedActions['type'],\n SnapInsightsControllerAllowedEvents['type']\n>;\n\nexport type SnapInsight = {\n snapId: SnapId;\n interfaceId?: string | null;\n error?: string;\n loading: boolean;\n severity?: string;\n};\n\nexport type SnapInsightsControllerState = {\n insights: Record<string, Record<SnapId, SnapInsight>>;\n};\n\nexport type SnapInsightsControllerArgs = {\n messenger: SnapInsightsControllerMessenger;\n state?: SnapInsightsControllerState;\n};\n\ntype SnapWithPermission = {\n snapId: SnapId;\n permission: ValidPermission<string, Caveat<string, Json>>;\n};\n\n/**\n * Controller for monitoring for new transactions and signatures to provide insight for.\n */\nexport class SnapInsightsController extends BaseController<\n typeof controllerName,\n SnapInsightsControllerState,\n SnapInsightsControllerMessenger\n> {\n constructor({ messenger, state }: SnapInsightsControllerArgs) {\n super({\n messenger,\n metadata: {\n insights: { persist: false, anonymous: false },\n },\n name: controllerName,\n state: { insights: {}, ...state },\n });\n\n this.messagingSystem.subscribe(\n 'TransactionController:unapprovedTransactionAdded',\n this.#handleTransaction.bind(this),\n );\n\n this.messagingSystem.subscribe(\n 'TransactionController:transactionStatusUpdated',\n this.#handleTransactionStatusUpdate.bind(this),\n );\n\n this.messagingSystem.subscribe(\n 'SignatureController:stateChange',\n this.#handleSignatureStateChange.bind(this),\n );\n }\n\n /**\n * Check if an insight already exists for a given ID.\n *\n * @param id - The ID.\n * @returns True if the insight already exists, otherwise false.\n */\n #hasInsight(id: string) {\n return hasProperty(this.state.insights, id);\n }\n\n /**\n * Get a list of runnable Snaps that have a given permission.\n * Also includes the permission object itself.\n *\n * @param permissionName - The permission name.\n * @returns A list of objects containing Snap IDs and the permission object.\n */\n #getSnapsWithPermission(permissionName: string) {\n const allSnaps = this.messagingSystem.call('SnapController:getAll');\n const filteredSnaps = getRunnableSnaps(allSnaps);\n\n return filteredSnaps.reduce<SnapWithPermission[]>((accumulator, snap) => {\n const permissions = this.messagingSystem.call(\n 'PermissionController:getPermissions',\n snap.id,\n );\n if (permissions && hasProperty(permissions, permissionName)) {\n accumulator.push({\n snapId: snap.id,\n permission: permissions[permissionName],\n });\n }\n\n return accumulator;\n }, []);\n }\n\n /**\n * Handle a newly added unapproved transaction.\n * This function fetches insights from all available Snaps\n * and populates the insights state blob with the responses.\n *\n * @param transaction - The transaction object.\n */\n #handleTransaction(transaction: TransactionMeta) {\n const { id, txParams, chainId, origin } = transaction;\n\n // This assumes that the transactions are EVM-compatible for now.\n const caipChainId = `eip155:${parseInt(chainId, 16)}`;\n\n const snaps = this.#getSnapsWithPermission(\n SnapEndowments.TransactionInsight,\n );\n\n snaps.forEach(({ snapId, permission }) => {\n const hasTransactionOriginCaveat = getTransactionOriginCaveat(permission);\n const transactionOrigin =\n hasTransactionOriginCaveat && origin ? origin : null;\n\n this.update((state) => {\n state.insights[id] ??= {};\n state.insights[id][snapId] = { snapId, loading: true };\n });\n\n this.#handleSnapRequest({\n snapId,\n handler: HandlerType.OnTransaction,\n params: {\n transaction: txParams,\n chainId: caipChainId,\n transactionOrigin,\n },\n })\n .then((response) =>\n this.#handleSnapResponse({\n id,\n snapId,\n response: response as Record<string, Json>,\n }),\n )\n .catch((error) => this.#handleSnapResponse({ id, snapId, error }));\n });\n }\n\n /**\n * Handle the stateChange event emitted by the SignatureController.\n * This function will remove existing insights from the state when applicable, as well as\n * trigger insight fetching for newly added signatures.\n *\n * @param state - The SignatureController state blob.\n */\n #handleSignatureStateChange(state: SignatureControllerState) {\n // If any IDs have disappeared since the last state update, the insight may be cleaned up.\n for (const id of Object.keys(this.state.insights)) {\n if (\n !hasProperty(state.unapprovedTypedMessages, id) &&\n !hasProperty(state.unapprovedPersonalMsgs, id)\n ) {\n this.#handleInsightCleanup(id);\n }\n }\n\n if (\n state.unapprovedPersonalMsgCount > 0 ||\n state.unapprovedTypedMessagesCount > 0\n ) {\n const snaps = this.#getSnapsWithPermission(\n SnapEndowments.SignatureInsight,\n );\n\n // This isn't very efficient, but SignatureController doesn't expose a better event for us to use yet.\n for (const personalSignature of Object.values(\n state.unapprovedPersonalMsgs,\n )) {\n this.#handleSignature(snaps, personalSignature);\n }\n\n for (const typedMessage of Object.values(state.unapprovedTypedMessages)) {\n this.#handleSignature(snaps, typedMessage);\n }\n }\n }\n\n /**\n * Handle a newly added unapproved signature.\n * This function fetches insights from all available Snaps\n * and populates the insights state blob with the responses.\n *\n * @param snaps - A list of Snaps to invoke.\n * @param signature - The signature object.\n */\n #handleSignature(snaps: SnapWithPermission[], signature: StateSignature) {\n const { id, msgParams } = signature;\n\n if (this.#hasInsight(id)) {\n return;\n }\n\n const { from, data, signatureMethod, origin } = msgParams;\n\n /**\n * Both eth_signTypedData_v3 and eth_signTypedData_v4 methods\n * need to be parsed because their data is stringified. All other\n * signature methods do not, so they are ignored.\n */\n const shouldParse =\n signatureMethod === 'eth_signTypedData_v3' ||\n signatureMethod === 'eth_signTypedData_v4';\n\n const payload = {\n from,\n data: shouldParse ? JSON.parse(data as string) : data,\n signatureMethod,\n };\n\n snaps.forEach(({ snapId, permission }) => {\n const hasSignatureOriginCaveat = getSignatureOriginCaveat(permission);\n const signatureOrigin =\n origin && hasSignatureOriginCaveat ? origin : null;\n\n this.update((state) => {\n state.insights[id] ??= {};\n state.insights[id][snapId] = { snapId, loading: true };\n });\n\n this.#handleSnapRequest({\n snapId,\n handler: HandlerType.OnSignature,\n params: { signature: payload, signatureOrigin },\n })\n .then((response) =>\n this.#handleSnapResponse({\n id,\n snapId,\n response: response as Record<string, Json>,\n }),\n )\n .catch((error) => this.#handleSnapResponse({ id, snapId, error }));\n });\n }\n\n /**\n * Handle the transactionStatusUpdated event emitted by the TransactionController.\n * This function will remove insights for the transaction in question\n * once the transaction status has changed from unapproved.\n *\n * @param args - An options bag.\n * @param args.transactionMeta - The transaction.\n */\n #handleTransactionStatusUpdate({\n transactionMeta,\n }: {\n transactionMeta: TransactionMeta;\n }) {\n if (transactionMeta.status !== 'unapproved') {\n this.#handleInsightCleanup(transactionMeta.id);\n }\n }\n\n #handleInsightCleanup(id: string) {\n if (!this.#hasInsight(id)) {\n return;\n }\n\n // Delete interfaces from interface controller.\n Object.values(this.state.insights[id])\n .filter((insight) => insight.interfaceId)\n .forEach((insight) => {\n this.messagingSystem.call(\n 'SnapInterfaceController:deleteInterface',\n insight.interfaceId as string,\n );\n });\n\n this.update((state) => {\n delete state.insights[id];\n });\n }\n\n /**\n * Handle sending a request to a given Snap with a given payload.\n *\n * @param args - An options bag.\n * @param args.snapId - The Snap ID.\n * @param args.handler - The handler to invoke.\n * @param args.params - The JSON-RPC params to send.\n * @returns The response from the Snap.\n */\n async #handleSnapRequest({\n snapId,\n handler,\n params,\n }: {\n snapId: SnapId;\n handler: HandlerType.OnTransaction | HandlerType.OnSignature;\n params: Record<string, Json>;\n }) {\n return this.messagingSystem.call('SnapController:handleRequest', {\n snapId,\n origin: '',\n handler,\n request: {\n method: '',\n params,\n },\n });\n }\n\n /**\n * Handle response from a given Snap by persisting the response or error in state.\n *\n * @param args - An options bag.\n * @param args.id - The transaction or signature ID.\n * @param args.snapId - The Snap ID.\n * @param args.response - An optional response object returned by the Snap.\n * @param args.error - An optional error returned by the Snap.\n */\n #handleSnapResponse({\n id,\n snapId,\n response,\n error,\n }: {\n id: string;\n snapId: SnapId;\n response?: Record<string, Json>;\n error?: Error;\n }) {\n this.update((state) => {\n state.insights[id][snapId].loading = false;\n state.insights[id][snapId].interfaceId = response?.id as string;\n state.insights[id][snapId].severity = response?.severity as string;\n state.insights[id][snapId].error = error?.message;\n });\n }\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk6Z4WDAVCjs = require('./chunk-6Z4WDAVC.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkTIURYSSRjs = require('./chunk-TIURYSSR.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkK3TNQEM5js = require('./chunk-K3TNQEM5.js');
|
|
10
10
|
|
|
11
11
|
// src/snaps/location/location.ts
|
|
12
12
|
var _utils = require('@metamask/utils');
|
|
@@ -16,17 +16,17 @@ function detectSnapLocation(location, opts) {
|
|
|
16
16
|
const root = new URL(location);
|
|
17
17
|
switch (root.protocol) {
|
|
18
18
|
case "npm:":
|
|
19
|
-
return new (0,
|
|
19
|
+
return new (0, _chunkK3TNQEM5js.NpmLocation)(root, opts);
|
|
20
20
|
case "local:":
|
|
21
21
|
_utils.assert.call(void 0, allowLocal, new TypeError("Fetching local snaps is disabled."));
|
|
22
|
-
return new (0,
|
|
22
|
+
return new (0, _chunk6Z4WDAVCjs.LocalLocation)(root, opts);
|
|
23
23
|
case "http:":
|
|
24
24
|
case "https:":
|
|
25
25
|
_utils.assert.call(void 0,
|
|
26
26
|
allowHttp,
|
|
27
27
|
new TypeError("Fetching snaps through http/https is disabled.")
|
|
28
28
|
);
|
|
29
|
-
return new (0,
|
|
29
|
+
return new (0, _chunkTIURYSSRjs.HttpLocation)(root, opts);
|
|
30
30
|
default:
|
|
31
31
|
throw new TypeError(
|
|
32
32
|
`Unrecognized "${root.protocol}" snap location protocol.`
|
|
@@ -37,4 +37,4 @@ function detectSnapLocation(location, opts) {
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
exports.detectSnapLocation = detectSnapLocation;
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-3WWZDKQL.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk3WWZDKQLjs = require('./chunk-3WWZDKQL.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkAP7CJ6DAjs = require('./chunk-AP7CJ6DA.js');
|
|
@@ -131,9 +131,9 @@ var SnapController = class extends _basecontroller.BaseController {
|
|
|
131
131
|
idleTimeCheckInterval = _utils.inMilliseconds.call(void 0, 5, _utils.Duration.Second),
|
|
132
132
|
maxIdleTime = _utils.inMilliseconds.call(void 0, 30, _utils.Duration.Second),
|
|
133
133
|
maxRequestTime = _utils.inMilliseconds.call(void 0, 60, _utils.Duration.Second),
|
|
134
|
-
fetchFunction = globalThis.fetch.bind(
|
|
134
|
+
fetchFunction = globalThis.fetch.bind(void 0),
|
|
135
135
|
featureFlags = {},
|
|
136
|
-
detectSnapLocation: detectSnapLocationFunction =
|
|
136
|
+
detectSnapLocation: detectSnapLocationFunction = _chunk3WWZDKQLjs.detectSnapLocation,
|
|
137
137
|
preinstalledSnaps = null,
|
|
138
138
|
encryptor,
|
|
139
139
|
getMnemonic,
|
|
@@ -2545,4 +2545,4 @@ callLifecycleHook_fn = async function(origin, snapId, handler) {
|
|
|
2545
2545
|
|
|
2546
2546
|
|
|
2547
2547
|
exports.controllerName = controllerName; exports.SNAP_APPROVAL_INSTALL = SNAP_APPROVAL_INSTALL; exports.SNAP_APPROVAL_UPDATE = SNAP_APPROVAL_UPDATE; exports.SNAP_APPROVAL_RESULT = SNAP_APPROVAL_RESULT; exports.SnapController = SnapController;
|
|
2548
|
-
//# sourceMappingURL=chunk-
|
|
2548
|
+
//# sourceMappingURL=chunk-6K4MATNG.js.map
|