From 6cc4f1fb8d32b6c86924ede567d72529a8a3584a Mon Sep 17 00:00:00 2001 From: Hugo Dias Date: Fri, 14 Jun 2024 13:48:37 +0100 Subject: [PATCH] fix: improve connection logic to not force install --- packages/adapter/src/index.ts | 4 +- packages/adapter/src/snap.ts | 26 +------- .../src/{get-request-provider.ts => utils.ts} | 61 ++++++++++++++++++- 3 files changed, 65 insertions(+), 26 deletions(-) rename packages/adapter/src/{get-request-provider.ts => utils.ts} (50%) diff --git a/packages/adapter/src/index.ts b/packages/adapter/src/index.ts index 47dd7d52..473cba88 100644 --- a/packages/adapter/src/index.ts +++ b/packages/adapter/src/index.ts @@ -3,5 +3,5 @@ export { FilsnapAdapter } from './snap' export { filForwarderMetadata } from 'filsnap/filforwarder' export type { SnapConfig, AccountInfo } from 'filsnap' -export { getRequestProvider } from './get-request-provider' -export type { Provider } from './get-request-provider' +export { getRequestProvider } from './utils' +export type { Provider } from './utils' diff --git a/packages/adapter/src/snap.ts b/packages/adapter/src/snap.ts index 4c6894f3..8be2dce0 100644 --- a/packages/adapter/src/snap.ts +++ b/packages/adapter/src/snap.ts @@ -1,7 +1,7 @@ import type { FilSnapMethods, Network, SnapConfig } from 'filsnap' import { RPC } from 'iso-filecoin/rpc' -import type { Provider } from './get-request-provider' -import { getRequestProvider } from './get-request-provider' +import type { Provider } from './utils' +import { getRequestProvider, getSnap } from './utils' export class FilsnapAdapter { readonly snapId: string @@ -94,28 +94,8 @@ export class FilsnapAdapter { } const provider = await FilsnapAdapter.getProvider() - const snaps = await provider.request({ - method: 'wallet_requestSnaps', - params: { - [snapId]: { - version: snapVersion, - }, - }, - }) - const snap = snaps[snapId] - - if (snap == null) { - throw new Error(`Failed to connect to snap ${snapId} ${snapVersion}`) - } - - if ('error' in snap) { - throw new Error( - `Failed to connect to snap ${snapId} ${snapVersion} with error ${snap.error.message}` - ) - } - + const snap = await getSnap(provider, snapId, snapVersion) const adapter = new FilsnapAdapter(snapId, snap.version) - const result = await adapter.configure(config) if (result.error) { diff --git a/packages/adapter/src/get-request-provider.ts b/packages/adapter/src/utils.ts similarity index 50% rename from packages/adapter/src/get-request-provider.ts rename to packages/adapter/src/utils.ts index 0cc82bfe..0f3d79fe 100644 --- a/packages/adapter/src/get-request-provider.ts +++ b/packages/adapter/src/utils.ts @@ -1,4 +1,4 @@ -import type { RequestWithFilSnap } from 'filsnap' +import type { RequestWithFilSnap, Snap } from 'filsnap' export interface Provider { isMetaMask: boolean @@ -58,3 +58,62 @@ export async function getRequestProvider(timeout = 1000): Promise { }, timeout) }) } + +export async function getSnap( + provider: Provider, + snapId = 'npm:filsnap', + snapVersion = '*' +): Promise { + const snaps = await provider.request({ method: 'wallet_getSnaps' }) + const snap = snaps[snapId] + + // try to install the snap + if (snap == null) { + try { + const snaps = await provider.request({ + method: 'wallet_requestSnaps', + params: { + [snapId]: { + version: snapVersion, + }, + }, + }) + const snap = snaps[snapId] + if (snap == null) { + throw new Error(`Failed to install to snap ${snapId} ${snapVersion}`) + } + + if ('error' in snap) { + throw new Error( + `Failed to install to snap ${snapId} ${snapVersion} with error ${snap.error.message}` + ) + } + return snap + } catch (error) { + const err = error as Error + throw new Error( + `Failed to install to snap ${snapId} ${snapVersion} with error ${err.message}` + ) + } + } + + if ('error' in snap) { + throw new Error( + `Failed to connect to snap ${snapId} ${snapVersion} with error ${snap.error.message}` + ) + } + + if (snap.blocked === true) { + throw new Error(`Snap ${snapId} ${snapVersion} is blocked`) + } + + if (snap.enabled === false) { + throw new Error(`Snap ${snapId} ${snapVersion} is not enabled`) + } + + // if (snapVersion !== '*' && snap.version !== snapVersion) { + // throw new Error(`Snap ${snapId} ${snapVersion} is not the correct version`) + // } + + return snap +}