From 23d71464258f1c89a154a2450f4013de71f2c755 Mon Sep 17 00:00:00 2001 From: Victoria Zotova Date: Thu, 25 Jul 2024 15:07:19 -0400 Subject: [PATCH] Get default porter uris from github links --- examples/pre/nextjs/src/app/page.tsx | 2 +- examples/pre/nodejs/src/index.ts | 2 +- examples/pre/react/src/App.tsx | 2 +- examples/pre/webpack-5/src/index.ts | 2 +- examples/taco/webpack-5/src/index.ts | 1 - packages/shared/src/porter.ts | 29 +++++++++++++++++++++++++--- packages/shared/test/porter.test.ts | 20 +++++++++++++++++++ packages/taco/README.md | 2 +- packages/taco/src/taco.ts | 4 ++-- 9 files changed, 53 insertions(+), 11 deletions(-) diff --git a/examples/pre/nextjs/src/app/page.tsx b/examples/pre/nextjs/src/app/page.tsx index 6ca463030..eb3b4e4bc 100644 --- a/examples/pre/nextjs/src/app/page.tsx +++ b/examples/pre/nextjs/src/app/page.tsx @@ -109,7 +109,7 @@ function App() { provider, provider.getSigner(), domains.TESTNET, - getPorterUri(domains.TESTNET), + await getPorterUri(domains.TESTNET), policyParams, ); diff --git a/examples/pre/nodejs/src/index.ts b/examples/pre/nodejs/src/index.ts index 2a629e373..3bd080bf1 100644 --- a/examples/pre/nodejs/src/index.ts +++ b/examples/pre/nodejs/src/index.ts @@ -73,7 +73,7 @@ const runExample = async () => { provider, signer, domains.TESTNET, - getPorterUri(domains.TESTNET), + await getPorterUri(domains.TESTNET), policyParams, ); diff --git a/examples/pre/react/src/App.tsx b/examples/pre/react/src/App.tsx index 0afa5e7fe..62bf4b6b7 100644 --- a/examples/pre/react/src/App.tsx +++ b/examples/pre/react/src/App.tsx @@ -105,7 +105,7 @@ function App() { provider, provider.getSigner(), domains.TESTNET, - getPorterUri(domains.TESTNET), + await getPorterUri(domains.TESTNET), policyParams, ); diff --git a/examples/pre/webpack-5/src/index.ts b/examples/pre/webpack-5/src/index.ts index 532b27b57..b1a3b1a3b 100644 --- a/examples/pre/webpack-5/src/index.ts +++ b/examples/pre/webpack-5/src/index.ts @@ -82,7 +82,7 @@ const runExample = async () => { provider, provider.getSigner(), domains.TESTNET, - getPorterUri(domains.TESTNET), + await getPorterUri(domains.TESTNET), policyParams, ); diff --git a/examples/taco/webpack-5/src/index.ts b/examples/taco/webpack-5/src/index.ts index e372053ab..3879dd04f 100644 --- a/examples/taco/webpack-5/src/index.ts +++ b/examples/taco/webpack-5/src/index.ts @@ -5,7 +5,6 @@ import { EIP4361AuthProvider, encrypt, fromBytes, - getPorterUris, initialize, toBytes, } from '@nucypher/taco'; diff --git a/packages/shared/src/porter.ts b/packages/shared/src/porter.ts index c89afe043..44633b1e5 100644 --- a/packages/shared/src/porter.ts +++ b/packages/shared/src/porter.ts @@ -23,6 +23,12 @@ const defaultPorterUri: Record = { lynx: 'https://porter-lynx.nucypher.community', }; +const porterUriSource: Record = { + mainnet: 'https://raw.githubusercontent.com/nucypher/nucypher-porter/main/pytest.ini', + tapir: 'https://raw.githubusercontent.com/nucypher/nucypher-porter/main/pytest.ini', + lynx: 'https://raw.githubusercontent.com/nucypher/nucypher-porter/main/pytest.ini', +}; + export type Domain = keyof typeof defaultPorterUri; export const domains: Record = { @@ -31,20 +37,37 @@ export const domains: Record = { MAINNET: 'mainnet', }; -export const getPorterUri = (domain: Domain): string => { - return getPorterUris(domain)[0]; +export const getPorterUri = async (domain: Domain): Promise => { + return (await getPorterUris(domain))[0]; }; -export const getPorterUris = (domain: Domain, porterUris: string[] = []): string[] => { +export const getPorterUris = async (domain: Domain, porterUris: string[] = []): Promise => { const fullList = [...porterUris]; const uri = defaultPorterUri[domain]; if (!uri) { throw new Error(`No default Porter URI found for domain: ${domain}`); } fullList.push(uri); + const urisFromSource = await getPorterUrisFromSource(domain); + fullList.push(...urisFromSource); return fullList; }; +export const getPorterUrisFromSource = async (domain: Domain): Promise => { + const source = porterUriSource[domain]; + if (!source) { + return []; + } + try { + const resp = await axios.get(source, { + responseType: 'blob', + }); + return resp.data.split(/\r?\n/).filter(Boolean); + } catch (e) { + return []; + } +}; + // /get_ursulas export type Ursula = { diff --git a/packages/shared/test/porter.test.ts b/packages/shared/test/porter.test.ts index a5c92d437..5692709e3 100644 --- a/packages/shared/test/porter.test.ts +++ b/packages/shared/test/porter.test.ts @@ -4,6 +4,9 @@ import { PorterClient, toHexString, Ursula, + getPorterUrisFromSource, + getPorterUris, + domains } from '../src'; import { fakeUrsulas } from '@nucypher/test-utils'; import { beforeAll, describe, expect, SpyInstance, it, vi } from 'vitest'; @@ -41,6 +44,23 @@ const mockGetUrsulas = ( }); }; +describe('getPorterUris', () => { + beforeAll(async () => { + await initialize(); + }); + + it('Get URIs from source', async () => { + for (const domain of Object.values(domains)) { + const uris = await getPorterUrisFromSource(domain); + expect(uris.length).toBeGreaterThan(0); + const fullList = await getPorterUris(domain); + expect(fullList).toEqual( + expect.arrayContaining(uris) + ); + } + }); +}); + describe('PorterClient', () => { beforeAll(async () => { await initialize(); diff --git a/packages/taco/README.md b/packages/taco/README.md index bd94816f4..05c6d97ad 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -60,7 +60,7 @@ const decryptedMessage = await decrypt( web3Provider, domains.TESTNET, messageKit, - getPorterUri(domains.TESTNET), + await getPorterUri(domains.TESTNET), web3Provider.getSigner(), ); ``` diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index ce6572bf1..62b0f344a 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -130,7 +130,7 @@ export const encryptWithPublicKey = async ( * Must match the `ritualId`. * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted * @param authProvider - The authentication provider that will be used to provide the authorization - * @param {string} [porterUri] - The URI(s) for the Porter service. If not provided, a value will be obtained + * @param {string[]} [porterUri] - The URI(s) for the Porter service. If not provided, a value will be obtained * from the Domain * @param {Record} [customParameters] - Optional custom parameters that may be required * depending on the condition used @@ -148,7 +148,7 @@ export const decrypt = async ( porterUris: string[] = [], customParameters?: Record, ): Promise => { - const porterUrisFull: string[] = getPorterUris(domain, porterUris); + const porterUrisFull: string[] = await getPorterUris(domain, porterUris); const ritualId = await DkgCoordinatorAgent.getRitualIdFromPublicKey( provider,