diff --git a/electron/pkc-rpc-options.js b/electron/pkc-rpc-options.js new file mode 100644 index 00000000..771b9e22 --- /dev/null +++ b/electron/pkc-rpc-options.js @@ -0,0 +1,35 @@ +import { BsoResolver } from '@bitsocial/bso-resolver'; + +export const DEFAULT_ETH_RPC_URL = 'https://ethereum-rpc.publicnode.com'; +export const DEFAULT_ETH_RPC_URLS = [ + DEFAULT_ETH_RPC_URL, + 'https://eth.drpc.org', + 'https://ethereum.publicnode.com', + 'https://rpc.mevblocker.io', + 'https://1rpc.io/eth', + 'https://eth-pokt.nodies.app', +]; + +const getProviderLabel = (provider) => { + try { + return new URL(provider).hostname; + } catch { + return provider; + } +}; + +export const createBsoNameResolvers = (providers = DEFAULT_ETH_RPC_URLS) => + providers.map( + (provider) => + new BsoResolver({ + key: `eth-${getProviderLabel(provider)}`, + provider, + }), + ); + +export const createDefaultPkcOptions = ({ dataPath }) => ({ + dataPath, + kuboRpcClientsOptions: [{ url: 'http://localhost:50019/api/v0' }], + httpRoutersOptions: ['https://routing.lol', 'https://peers.pleb.bot', 'https://peers.plebpubsub.xyz', 'https://peers.forumindex.com'], + nameResolvers: createBsoNameResolvers(), +}); diff --git a/electron/start-pkc-rpc-core.test.js b/electron/start-pkc-rpc-core.test.js index 53d216db..d943c1a0 100644 --- a/electron/start-pkc-rpc-core.test.js +++ b/electron/start-pkc-rpc-core.test.js @@ -1,6 +1,23 @@ import { describe, expect, it, vi } from 'vitest'; +import { createDefaultPkcOptions, DEFAULT_ETH_RPC_URLS } from './pkc-rpc-options.js'; import { startPkcRpcServer } from './start-pkc-rpc-core.js'; +describe('createDefaultPkcOptions', () => { + it('configures BSO name resolvers for the desktop RPC server', () => { + const options = createDefaultPkcOptions({ dataPath: '/tmp/5chan-pkc' }); + + expect(options.dataPath).toBe('/tmp/5chan-pkc'); + expect(options.kuboRpcClientsOptions).toEqual([{ url: 'http://localhost:50019/api/v0' }]); + expect(options.nameResolvers).toHaveLength(DEFAULT_ETH_RPC_URLS.length); + expect(options.nameResolvers.map((resolver) => resolver.provider)).toEqual(DEFAULT_ETH_RPC_URLS); + expect(options.nameResolvers[0]).toMatchObject({ + key: 'eth-ethereum-rpc.publicnode.com', + provider: DEFAULT_ETH_RPC_URLS[0], + }); + expect(options.nameResolvers[0].canResolve({ name: 'business-and-finance.bso' })).toBe(true); + }); +}); + describe('startPkcRpcServer', () => { it('passes the Electron data path through pkcOptions', async () => { const pkcOptions = { diff --git a/electron/start-pkc-rpc.js b/electron/start-pkc-rpc.js index 9a0c763a..3f2d635e 100644 --- a/electron/start-pkc-rpc.js +++ b/electron/start-pkc-rpc.js @@ -6,18 +6,17 @@ import path from 'path'; import { fileURLToPath } from 'url'; import isDev from 'electron-is-dev'; import { getPkcDataPath } from './pkc-paths.js'; +import { createDefaultPkcOptions } from './pkc-rpc-options.js'; import { startPkcRpcServer } from './start-pkc-rpc-core.js'; const dirname = path.join(path.dirname(fileURLToPath(import.meta.url))); const projectRoot = path.join(dirname, '..'); // Always run the local PKC RPC server on this port so all desktop clients can reuse it. const port = 9138; -const defaultPkcOptions = { +const defaultPkcOptions = createDefaultPkcOptions({ // find the user's OS data path dataPath: getPkcDataPath({ isDev, projectRoot }), - kuboRpcClientsOptions: [{ url: 'http://localhost:50019/api/v0' }], - httpRoutersOptions: ['https://routing.lol', 'https://peers.pleb.bot', 'https://peers.plebpubsub.xyz', 'https://peers.forumindex.com'], -}; +}); // Generate the local PKC RPC auth key if it does not exist yet. const pkcRpcAuthKeyPath = path.join(defaultPkcOptions.dataPath, 'auth-key'); diff --git a/package.json b/package.json index e66f0376..43fed29f 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "@bbob/parser": "4.3.1", "@bitsocial/bitsocial-react-hooks": "0.1.17", + "@bitsocial/bso-resolver": "0.0.8", "@capacitor/app": "7.0.1", "@capacitor/browser": "7.0.5", "@capacitor/status-bar": "7.0.1", diff --git a/yarn.lock b/yarn.lock index 7db16ba7..12295733 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,6 +11,7 @@ __metadata: dependencies: "@bbob/parser": "npm:4.3.1" "@bitsocial/bitsocial-react-hooks": "npm:0.1.17" + "@bitsocial/bso-resolver": "npm:0.0.8" "@capacitor/android": "npm:7.4.5" "@capacitor/app": "npm:7.0.1" "@capacitor/browser": "npm:7.0.5"