fix(pubsub): restore browser pure p2p publishing

This commit is contained in:
Tommaso Casaburi
2026-06-17 23:09:39 +07:00
parent d3772786ff
commit 1278cf42c0
19 changed files with 467 additions and 703 deletions
+34 -24
View File
@@ -2,8 +2,8 @@ import { describe, expect, it } from 'vitest';
import {
configureP2PBrowserPkcOptions,
getBrowserGatewayPkcOptions,
getPureP2PBrowserPreference,
P2P_BROWSER_PKC_OPTIONS,
PURE_P2P_BROWSER_SETTING_KEY,
setPureP2PBrowserPreference,
shouldUsePureP2PBrowser,
@@ -17,36 +17,54 @@ const createStorage = (values: Record<string, string | undefined> = {}) => ({
});
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', () => {
const chainProviders = {
eth: { urls: ['https://eth.example'], chainId: 1 },
};
const targetWindow = {
location: { hostname: '5chan.app' },
localStorage: createStorage(),
defaultPkcOptions: {
chainProviders,
ipfsGatewayUrls: ['https://gateway.example'],
},
};
expect(shouldUsePureP2PBrowser(targetWindow)).toBe(true);
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(true);
expect(targetWindow.defaultPkcOptions).toEqual(P2P_BROWSER_PKC_OPTIONS);
expect(targetWindow.defaultPkcOptions).toMatchObject({
chainProviders,
httpRoutersOptions: defaultHttpRouters,
ipfsGatewayUrls: undefined,
libp2pJsClientsOptions: [{ key: 'libp2pjs' }],
pubsubKuboRpcClientsOptions: undefined,
});
});
it('respects disabled pure p2p preference on p2p subdomains', () => {
const defaultPkcOptions = {
ipfsGatewayUrls: ['https://gateway.example'],
it('configures browser PKC options for gateway mode when pure p2p is explicitly disabled', () => {
const chainProviders = {
eth: { urls: ['https://eth.example'], chainId: 1 },
};
const targetWindow = {
location: { hostname: 'p2p.5chan.app' },
location: { hostname: '5chan.app' },
localStorage: createStorage({ [PURE_P2P_BROWSER_SETTING_KEY]: 'false' }),
defaultPkcOptions,
defaultPkcOptions: {
chainProviders,
ipfsGatewayUrls: ['https://gateway.example'],
},
};
expect(shouldUsePureP2PBrowser(targetWindow)).toBe(false);
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(false);
expect(targetWindow.defaultPkcOptions).toBe(defaultPkcOptions);
expect(targetWindow.defaultPkcOptions).toEqual({
chainProviders,
...getBrowserGatewayPkcOptions(),
});
});
it('configures browser PKC options when pure p2p is enabled', () => {
it('configures browser PKC options when pure p2p is explicitly enabled', () => {
const targetWindow = {
location: { hostname: '5chan.app' },
localStorage: createStorage({ [PURE_P2P_BROWSER_SETTING_KEY]: 'true' }),
@@ -55,22 +73,14 @@ describe('p2p-browser-config', () => {
},
};
expect(shouldUsePureP2PBrowser(targetWindow)).toBe(true);
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(true);
expect(targetWindow.defaultPkcOptions).toEqual(P2P_BROWSER_PKC_OPTIONS);
});
it('leaves browser PKC options untouched when pure p2p is disabled', () => {
const defaultPkcOptions = {
ipfsGatewayUrls: ['https://gateway.example'],
};
const targetWindow = {
location: { hostname: '5chan.app' },
localStorage: createStorage({ [PURE_P2P_BROWSER_SETTING_KEY]: 'false' }),
defaultPkcOptions,
};
expect(configureP2PBrowserPkcOptions(targetWindow)).toBe(false);
expect(targetWindow.defaultPkcOptions).toBe(defaultPkcOptions);
expect(targetWindow.defaultPkcOptions).toMatchObject({
httpRoutersOptions: defaultHttpRouters,
ipfsGatewayUrls: undefined,
libp2pJsClientsOptions: [{ key: 'libp2pjs' }],
pubsubKuboRpcClientsOptions: undefined,
});
});
it('leaves electron defaults untouched', () => {
+19 -3
View File
@@ -27,6 +27,16 @@ const browserWindowWithDisabledPureP2P = {
},
} as unknown as Window;
const browserWindowWithEnabledPureP2P = {
electronApi: undefined,
isElectron: false,
location: { hostname: '5chan.app' },
localStorage: {
getItem: () => 'true',
setItem: () => undefined,
},
} as unknown as Window;
const electronWindow = {
electronApi: { isElectron: true },
isElectron: true,
@@ -56,10 +66,14 @@ describe('p2p-runtime', () => {
expect(getP2PRuntimeMode(account, browserWindow)).toBe('full-node-rpc');
});
it('shows p2p settings in browsers when pure p2p is enabled by default', () => {
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);
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);
expect(isBrowserPureP2PEnabled({ pkcOptions: { ipfsGatewayUrls: ['https://gateway.example'] } }, browserWindowWithEnabledPureP2P)).toBe(true);
});
it('allows browser gateway mode when pure p2p is disabled', () => {
@@ -88,13 +102,15 @@ describe('p2p-runtime', () => {
expect(getBrowserPureP2PAccountOptions(account)).toMatchObject({
libp2pJsClientsOptions: [{ key: 'libp2pjs' }],
ipfsGatewayUrls: [],
ipfsGatewayUrls: undefined,
pkcRpcClientsOptions: undefined,
});
expect(getBrowserGatewayAccountOptions(account)).toMatchObject({
ipfsGatewayUrls: ['https://ipfsgateway.xyz', 'https://gateway.plebpubsub.xyz', 'https://gateway.forumindex.com'],
httpRoutersOptions: ['https://custom-router.example'],
ipfsGatewayUrls: ['https://gateway.example'],
libp2pJsClientsOptions: undefined,
pkcRpcClientsOptions: undefined,
pubsubKuboRpcClientsOptions: ['https://pubsubprovider.xyz/api/v0', 'https://plebpubsub.xyz/api/v0', 'https://rannithepleb.com/api/v0'],
});
});
});