From 1c140035b46d7477272234169017e03e182aabb2 Mon Sep 17 00:00:00 2001 From: Tommaso Casaburi Date: Thu, 18 Jun 2026 18:53:33 +0700 Subject: [PATCH] fix(p2p): disable browser pure P2P by default New browser sessions use IPFS gateway mode unless the user explicitly enables pure P2P in advanced settings. --- .../__tests__/advanced-settings.test.tsx | 8 +++---- ...-browser-pure-p2p-account-upgrade.test.tsx | 21 ++++++++++++++++++- src/lib/__tests__/p2p-browser-config.test.ts | 15 ++++++------- src/lib/__tests__/p2p-runtime.test.ts | 11 +++++----- src/lib/p2p-browser-config.ts | 2 +- 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/components/settings-modal/advanced-settings/__tests__/advanced-settings.test.tsx b/src/components/settings-modal/advanced-settings/__tests__/advanced-settings.test.tsx index d99e5182..fca95941 100644 --- a/src/components/settings-modal/advanced-settings/__tests__/advanced-settings.test.tsx +++ b/src/components/settings-modal/advanced-settings/__tests__/advanced-settings.test.tsx @@ -204,15 +204,15 @@ describe('AdvancedSettings', () => { expect(textInputs[2]?.value).toBe('/tmp/connected-node'); }); - it('shows pure p2p browser mode checked by default', async () => { + it('shows pure p2p browser mode unchecked by default', async () => { await renderSettings(false); - expect(container.textContent).not.toContain('advanced_ipfs_gateways'); - expect(container.textContent).not.toContain('advanced_pubsub_providers'); + expect(container.textContent).toContain('advanced_ipfs_gateways'); + expect(container.textContent).toContain('advanced_pubsub_providers'); expect(container.textContent).toContain('advanced_http_routers'); expect(container.textContent).toContain('advanced_full_node_websocket_rpc'); const checkbox = container.querySelector('input[type="checkbox"]'); - expect(checkbox?.checked).toBe(true); + expect(checkbox?.checked).toBe(false); const nodeRpcInput = Array.from(container.querySelectorAll('input[type="text"]')).find( (input) => input.placeholder === 'advanced_p2p_rpc_placeholder', diff --git a/src/hooks/__tests__/use-browser-pure-p2p-account-upgrade.test.tsx b/src/hooks/__tests__/use-browser-pure-p2p-account-upgrade.test.tsx index 23391f98..5f33c079 100644 --- a/src/hooks/__tests__/use-browser-pure-p2p-account-upgrade.test.tsx +++ b/src/hooks/__tests__/use-browser-pure-p2p-account-upgrade.test.tsx @@ -81,7 +81,26 @@ describe('useBrowserPureP2PAccountUpgrade', () => { window.isElectron = false; }); - it('upgrades stale gateway browser accounts and reloads after saving', async () => { + it('does not upgrade stale gateway browser accounts when pure p2p is disabled by default', async () => { + testState.account = { + id: 'account-1', + name: 'Account 1', + pkcOptions: { + httpRoutersOptions: ['https://router.old.example'], + ipfsGatewayUrls: ['https://gateway.old.example'], + pubsubKuboRpcClientsOptions: ['https://pubsub.old.example/api/v0'], + }, + }; + testState.accounts = [testState.account]; + + await renderHook(); + + expect(testState.setAccountMock).not.toHaveBeenCalled(); + expect(reloadMock).not.toHaveBeenCalled(); + }); + + it('upgrades stale gateway browser accounts when pure p2p is enabled and reloads after saving', async () => { + localStorage.setItem('5chan:pure-p2p-browser-enabled', 'true'); testState.account = { id: 'account-1', name: 'Account 1', diff --git a/src/lib/__tests__/p2p-browser-config.test.ts b/src/lib/__tests__/p2p-browser-config.test.ts index e0dd7cbf..59324f31 100644 --- a/src/lib/__tests__/p2p-browser-config.test.ts +++ b/src/lib/__tests__/p2p-browser-config.test.ts @@ -19,7 +19,7 @@ const createStorage = (values: Record = {}) => ({ describe('p2p-browser-config', () => { const defaultHttpRouters = ['https://peers.plebpubsub.xyz', 'https://routing.lol', 'https://peers.pleb.bot']; - it('configures browser PKC options for pure p2p by default', () => { + it('configures browser PKC options for gateway mode by default', () => { const chainProviders = { eth: { urls: ['https://eth.example'], chainId: 1 }, }; @@ -32,14 +32,11 @@ describe('p2p-browser-config', () => { }, }; - expect(shouldUsePureP2PBrowser(targetWindow)).toBe(true); - expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(true); - expect(targetWindow.defaultPkcOptions).toMatchObject({ + expect(shouldUsePureP2PBrowser(targetWindow)).toBe(false); + expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(false); + expect(targetWindow.defaultPkcOptions).toEqual({ chainProviders, - httpRoutersOptions: defaultHttpRouters, - ipfsGatewayUrls: undefined, - libp2pJsClientsOptions: [{ key: 'libp2pjs' }], - pubsubKuboRpcClientsOptions: undefined, + ...getBrowserGatewayPkcOptions(), }); }); @@ -105,7 +102,7 @@ describe('p2p-browser-config', () => { }; expect(getPureP2PBrowserPreference(targetWindow)).toBeUndefined(); - expect(shouldUsePureP2PBrowser(targetWindow)).toBe(true); + expect(shouldUsePureP2PBrowser(targetWindow)).toBe(false); setPureP2PBrowserPreference(false, targetWindow); expect(getPureP2PBrowserPreference(targetWindow)).toBe(false); diff --git a/src/lib/__tests__/p2p-runtime.test.ts b/src/lib/__tests__/p2p-runtime.test.ts index c6cede5b..88b30de1 100644 --- a/src/lib/__tests__/p2p-runtime.test.ts +++ b/src/lib/__tests__/p2p-runtime.test.ts @@ -67,10 +67,10 @@ describe('p2p-runtime', () => { expect(getP2PRuntimeMode(account, browserWindow)).toBe('full-node-rpc'); }); - it('keeps browser pure p2p on by default while allowing gateway mode when configured', () => { - expect(shouldShowP2PSettingsSection(undefined, browserWindow)).toBe(true); - expect(shouldShowP2PSettingsSection({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindow)).toBe(true); - expect(isBrowserPureP2PEnabled({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindow)).toBe(true); + it('keeps browser pure p2p off by default while honoring explicit preference and active libp2p accounts', () => { + expect(shouldShowP2PSettingsSection(undefined, browserWindow)).toBe(false); + expect(shouldShowP2PSettingsSection({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindow)).toBe(false); + expect(isBrowserPureP2PEnabled({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindow)).toBe(false); expect(shouldShowP2PSettingsSection({ pkcOptions: { libp2pJsClientsOptions: [{ key: 'libp2pjs' }] } }, browserWindow)).toBe(true); expect(isBrowserPureP2PEnabled({ pkcOptions: { libp2pJsClientsOptions: [{ key: 'libp2pjs' }] } }, browserWindow)).toBe(true); expect(shouldShowP2PSettingsSection({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindowWithEnabledPureP2P)).toBe(true); @@ -98,7 +98,8 @@ describe('p2p-runtime', () => { const mixedBrowserAccount = { pkcOptions: { libp2pJsClientsOptions: [{ key: 'libp2pjs' }], pubsubKuboRpcClientsOptions: ['https://pubsub.example/api/v0'] } }; const fullNodeAccount = { pkcOptions: { pkcRpcClientsOptions: ['ws://node.example'] } }; - expect(shouldUpgradeBrowserPureP2PAccount(gatewayAccount, browserWindow)).toBe(true); + expect(shouldUpgradeBrowserPureP2PAccount(gatewayAccount, browserWindow)).toBe(false); + expect(shouldUpgradeBrowserPureP2PAccount(gatewayAccount, browserWindowWithEnabledPureP2P)).toBe(true); expect(shouldUpgradeBrowserPureP2PAccount(browserAccount, browserWindow)).toBe(false); expect(shouldUpgradeBrowserPureP2PAccount(mixedBrowserAccount, browserWindow)).toBe(true); expect(shouldUpgradeBrowserPureP2PAccount(fullNodeAccount, browserWindow)).toBe(false); diff --git a/src/lib/p2p-browser-config.ts b/src/lib/p2p-browser-config.ts index 6322816b..618348df 100644 --- a/src/lib/p2p-browser-config.ts +++ b/src/lib/p2p-browser-config.ts @@ -1,5 +1,5 @@ export const PURE_P2P_BROWSER_SETTING_KEY = '5chan:pure-p2p-browser-enabled'; -export const BROWSER_PURE_P2P_DEFAULT_ENABLED = true; +export const BROWSER_PURE_P2P_DEFAULT_ENABLED = false; const BROWSER_PUBSUB_KUBO_RPC_CLIENTS_OPTIONS = ['https://pubsubprovider.xyz/api/v0', 'https://plebpubsub.xyz/api/v0', 'https://rannithepleb.com/api/v0'];