From 3c18de076c0f6128a9616cb643bfead8743c251a Mon Sep 17 00:00:00 2001 From: david0xd Date: Wed, 29 Jan 2025 16:58:11 +0100 Subject: [PATCH 1/2] Add getRunnableSnaps method to SnapController --- .../src/snaps/SnapController.test.tsx | 24 +++++++++++++++++++ .../src/snaps/SnapController.ts | 21 ++++++++++++++++ .../src/test-utils/controller.ts | 1 + 3 files changed, 46 insertions(+) diff --git a/packages/snaps-controllers/src/snaps/SnapController.test.tsx b/packages/snaps-controllers/src/snaps/SnapController.test.tsx index 9bc0b487ca..7cb99719cd 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.test.tsx +++ b/packages/snaps-controllers/src/snaps/SnapController.test.tsx @@ -10022,6 +10022,30 @@ describe('SnapController', () => { }); }); + describe('SnapController:getRunnableSnaps', () => { + it('calls SnapController.getRunnableSnaps()', () => { + const messenger = getSnapControllerMessenger(); + const mockSnap = getMockSnapData({ + id: MOCK_SNAP_ID, + origin: MOCK_ORIGIN, + }); + + const snapController = getSnapController( + getSnapControllerOptions({ + messenger, + state: { + snaps: getPersistedSnapsState(mockSnap.stateObject), + }, + }), + ); + + const result = messenger.call('SnapController:getRunnableSnaps'); + expect(result).toStrictEqual([getTruncatedSnap()]); + + snapController.destroy(); + }); + }); + describe('SnapController:install', () => { it('calls SnapController.installSnaps()', async () => { const messenger = getSnapControllerMessenger(); diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index f93d78d01c..4f9686d723 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -131,6 +131,7 @@ import type { Patch } from 'immer'; import { nanoid } from 'nanoid'; import semver from 'semver'; +import { getRunnableSnaps } from '..'; import { forceStrict, validateMachine } from '../fsm'; import type { CreateInterface, GetInterface } from '../interface'; import { log } from '../logging'; @@ -406,6 +407,11 @@ export type GetAllSnaps = { handler: SnapController['getAllSnaps']; }; +export type GetRunnableSnaps = { + type: `${typeof controllerName}:getRunnableSnaps`; + handler: SnapController['getRunnableSnaps']; +}; + export type StopAllSnaps = { type: `${typeof controllerName}:stopAllSnaps`; handler: SnapController['stopAllSnaps']; @@ -465,6 +471,7 @@ export type SnapControllerActions = | GetPermittedSnaps | InstallSnaps | GetAllSnaps + | GetRunnableSnaps | IncrementActiveReferences | DecrementActiveReferences | GetRegistryMetadata @@ -1150,6 +1157,11 @@ export class SnapController extends BaseController< (...args) => this.getAllSnaps(...args), ); + this.messagingSystem.registerActionHandler( + `${controllerName}:getRunnableSnaps`, + (...args) => this.getRunnableSnaps(...args), + ); + this.messagingSystem.registerActionHandler( `${controllerName}:incrementActiveReferences`, (...args) => this.incrementActiveReferences(...args), @@ -2387,6 +2399,15 @@ export class SnapController extends BaseController< return Object.values(this.state.snaps).map(truncateSnap); } + /** + * Gets all runnable snaps. + * + * @returns All runnable snaps. + */ + getRunnableSnaps(): TruncatedSnap[] { + return getRunnableSnaps(this.getAllSnaps()); + } + /** * Gets the serialized permitted snaps of the given origin, if any. * diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.ts index c4b33a9f8b..f71b8b072a 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.ts @@ -499,6 +499,7 @@ export const getSnapControllerMessenger = ( 'SnapController:disable', 'SnapController:remove', 'SnapController:getAll', + 'SnapController:getRunnableSnaps', 'SnapController:getPermitted', 'SnapController:install', 'SnapController:incrementActiveReferences', From 42b7a83aee281e126997f1be8fe86c0d7ff5bf05 Mon Sep 17 00:00:00 2001 From: david0xd Date: Thu, 30 Jan 2025 11:50:14 +0100 Subject: [PATCH 2/2] Fix import and update test --- packages/snaps-controllers/coverage.json | 2 +- .../src/snaps/SnapController.test.tsx | 10 +++++++++- packages/snaps-controllers/src/snaps/SnapController.ts | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/snaps-controllers/coverage.json b/packages/snaps-controllers/coverage.json index fffcd4a239..813ee1e36b 100644 --- a/packages/snaps-controllers/coverage.json +++ b/packages/snaps-controllers/coverage.json @@ -1,6 +1,6 @@ { "branches": 93.06, - "functions": 96.59, + "functions": 96.61, "lines": 98.08, "statements": 97.8 } diff --git a/packages/snaps-controllers/src/snaps/SnapController.test.tsx b/packages/snaps-controllers/src/snaps/SnapController.test.tsx index 7cb99719cd..7c31cf10f1 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.test.tsx +++ b/packages/snaps-controllers/src/snaps/SnapController.test.tsx @@ -10029,12 +10029,20 @@ describe('SnapController', () => { id: MOCK_SNAP_ID, origin: MOCK_ORIGIN, }); + const mockSnap2 = getMockSnapData({ + id: `${MOCK_SNAP_ID}2` as SnapId, + origin: MOCK_ORIGIN, + enabled: false, + }); const snapController = getSnapController( getSnapControllerOptions({ messenger, state: { - snaps: getPersistedSnapsState(mockSnap.stateObject), + snaps: getPersistedSnapsState( + mockSnap.stateObject, + mockSnap2.stateObject, + ), }, }), ); diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index 4f9686d723..cdc245de16 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -131,7 +131,6 @@ import type { Patch } from 'immer'; import { nanoid } from 'nanoid'; import semver from 'semver'; -import { getRunnableSnaps } from '..'; import { forceStrict, validateMachine } from '../fsm'; import type { CreateInterface, GetInterface } from '../interface'; import { log } from '../logging'; @@ -172,6 +171,7 @@ import type { } from './registry'; import { SnapsRegistryStatus } from './registry'; import { RequestQueue } from './RequestQueue'; +import { getRunnableSnaps } from './selectors'; import { Timer } from './Timer'; export const controllerName = 'SnapController';