fix(p2p): force browser mode on p2p subdomains

This commit is contained in:
Tommaso Casaburi
2026-05-11 17:18:16 +07:00
parent e38d888b74
commit a97b891c5f
6 changed files with 90 additions and 5 deletions
@@ -4,6 +4,7 @@ import {
configureP2PBrowserPkcOptions,
getPureP2PBrowserPreference,
isP2PBrowserHostname,
isPureP2PBrowserForced,
P2P_BROWSER_PKC_OPTIONS,
PURE_P2P_BROWSER_SETTING_KEY,
setPureP2PBrowserPreference,
@@ -40,6 +41,21 @@ describe('p2p-browser-config', () => {
});
});
it('forces browser PKC options on p2p subdomains', () => {
const targetWindow = {
location: { hostname: 'p2p.5chan.app' },
localStorage: createStorage({ [PURE_P2P_BROWSER_SETTING_KEY]: 'false' }),
defaultPkcOptions: {
ipfsGatewayUrls: ['https://gateway.example'],
},
};
expect(isPureP2PBrowserForced(targetWindow)).toBe(true);
expect(shouldUsePureP2PBrowser(targetWindow)).toBe(true);
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(true);
expect(targetWindow.defaultPkcOptions).toEqual(P2P_BROWSER_PKC_OPTIONS);
});
it('configures browser PKC options when pure p2p is enabled', () => {
const targetWindow = {
location: { hostname: '5chan.app' },
@@ -80,6 +96,7 @@ describe('p2p-browser-config', () => {
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(false);
expect(targetWindow.defaultPkcOptions).toBe(defaultPkcOptions);
expect(isPureP2PBrowserForced({ ...targetWindow, location: { hostname: 'p2p.5chan.app' } })).toBe(false);
});
it('persists and reads the browser pure p2p preference', () => {
+19
View File
@@ -10,6 +10,7 @@ import {
const browserWindow = {
electronApi: undefined,
isElectron: false,
location: { hostname: '5chan.app' },
localStorage: {
getItem: () => null,
setItem: () => undefined,
@@ -19,6 +20,17 @@ const browserWindow = {
const electronWindow = {
electronApi: { isElectron: true },
isElectron: true,
location: { hostname: 'localhost' },
} as unknown as Window;
const p2pBrowserWindow = {
electronApi: undefined,
isElectron: false,
location: { hostname: 'p2p.5chan.app' },
localStorage: {
getItem: () => 'false',
setItem: () => undefined,
},
} as unknown as Window;
describe('p2p-runtime', () => {
@@ -40,6 +52,13 @@ describe('p2p-runtime', () => {
expect(isBrowserPureP2PEnabled({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindow)).toBe(false);
});
it('forces browser p2p on p2p subdomains even with gateway account options', () => {
const gatewayAccount = { pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } };
expect(isBrowserPureP2PEnabled(gatewayAccount, p2pBrowserWindow)).toBe(true);
expect(shouldShowP2PSettingsSection(gatewayAccount, p2pBrowserWindow)).toBe(true);
});
it('builds browser p2p and gateway account options without a direct pkc-js import', () => {
const account = {
pkcOptions: {
+5 -1
View File
@@ -19,7 +19,7 @@ const GATEWAY_BROWSER_PKC_OPTIONS = {
};
type P2PBrowserConfigWindow = {
location: Pick<Location, 'hostname'>;
location?: Pick<Location, 'hostname'>;
defaultPkcOptions?: Record<string, unknown>;
electronApi?: { isElectron?: boolean };
isElectron?: boolean;
@@ -63,8 +63,12 @@ export const setPureP2PBrowserPreference = (enabled: boolean, targetWindow: P2PB
export const isElectronRuntime = (targetWindow: P2PBrowserConfigWindow = window) => targetWindow.electronApi?.isElectron === true || targetWindow.isElectron === true;
export const isPureP2PBrowserForced = (targetWindow: P2PBrowserConfigWindow = window) =>
!isElectronRuntime(targetWindow) && isP2PBrowserHostname(targetWindow.location?.hostname ?? '');
export const shouldUsePureP2PBrowser = (targetWindow: P2PBrowserConfigWindow = window) => {
if (isElectronRuntime(targetWindow)) return false;
if (isPureP2PBrowserForced(targetWindow)) return true;
const preference = getPureP2PBrowserPreference(targetWindow);
if (preference !== undefined) return preference;
+2 -1
View File
@@ -1,4 +1,4 @@
import { getBrowserGatewayPkcOptions, getBrowserPureP2PPkcOptions, isElectronRuntime, shouldUsePureP2PBrowser } from './p2p-browser-config';
import { getBrowserGatewayPkcOptions, getBrowserPureP2PPkcOptions, isElectronRuntime, isPureP2PBrowserForced, shouldUsePureP2PBrowser } from './p2p-browser-config';
export const P2P_STATS_SECTION_ID = 'p2p-stats-settings';
@@ -55,6 +55,7 @@ export const isBrowserPureP2PEnabled = (account?: unknown, targetWindow: Window
const accountShape = toAccountShape(account);
if (!canConfigureBrowserPureP2P(targetWindow)) return false;
if (getP2PRuntimeMode(account, targetWindow) === 'browser-libp2p') return true;
if (isPureP2PBrowserForced(targetWindow)) return true;
if (hasArrayItems(accountShape?.pkcOptions?.ipfsGatewayUrls) || hasArrayItems(accountShape?.pkcOptions?.pubsubKuboRpcClientsOptions)) return false;
return shouldUsePureP2PBrowser(targetWindow);
};