Skip to content

Commit ffc1bbc

Browse files
committed
feat: add support for experimental provider query parameter configuration
1 parent b59b440 commit ffc1bbc

File tree

8 files changed

+45
-8
lines changed

8 files changed

+45
-8
lines changed

src/context/config-context.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { createContext, useCallback, useEffect, useState } from 'react'
2-
import { defaultDebug, defaultDnsJsonResolvers, defaultEnableGatewayProviders, defaultEnableRecursiveGateways, defaultEnableWebTransport, defaultEnableWss, defaultFetchTimeout, defaultGateways, defaultRouters, defaultSupportsSubdomains, getConfig, resetConfig } from '../lib/config-db.js'
2+
import { defaultDebug, defaultDnsJsonResolvers, defaultEnableGatewayProviders, defaultEnableProviderQueryParameter, defaultEnableRecursiveGateways, defaultEnableWebTransport, defaultEnableWss, defaultFetchTimeout, defaultGateways, defaultRouters, defaultSupportsSubdomains, getConfig, resetConfig } from '../lib/config-db.js'
33
import { getUiComponentLogger } from '../lib/logger.js'
44
import type { ConfigDb } from '../lib/config-db.js'
55
import type { ComponentLogger } from '@libp2p/logger'
@@ -23,6 +23,7 @@ export const ConfigContext = createContext<ConfigContextType>({
2323
enableWebTransport: defaultEnableWebTransport,
2424
enableGatewayProviders: defaultEnableGatewayProviders,
2525
enableRecursiveGateways: defaultEnableRecursiveGateways,
26+
enableProviderQueryParameter: defaultEnableProviderQueryParameter,
2627
debug: defaultDebug(),
2728
fetchTimeout: defaultFetchTimeout,
2829
_supportsSubdomains: defaultSupportsSubdomains,
@@ -38,6 +39,7 @@ export const ConfigProvider: React.FC<{ children: ReactElement[] | ReactElement,
3839
const [enableWebTransport, setEnableWebTransport] = useState(defaultEnableWebTransport)
3940
const [enableGatewayProviders, setEnableGatewayProviders] = useState(defaultEnableGatewayProviders)
4041
const [enableRecursiveGateways, setEnableRecursiveGateways] = useState(defaultEnableRecursiveGateways)
42+
const [enableProviderQueryParameter, setEnableProviderQueryParameter] = useState(defaultEnableProviderQueryParameter)
4143
const [debug, setDebug] = useState(defaultDebug())
4244
const [fetchTimeout, setFetchTimeout] = useState(defaultFetchTimeout)
4345
const [_supportsSubdomains, setSupportsSubdomains] = useState(defaultSupportsSubdomains)
@@ -53,6 +55,7 @@ export const ConfigProvider: React.FC<{ children: ReactElement[] | ReactElement,
5355
setEnableWebTransport(config.enableWebTransport)
5456
setEnableGatewayProviders(config.enableGatewayProviders)
5557
setEnableRecursiveGateways(config.enableRecursiveGateways)
58+
setEnableProviderQueryParameter(config.enableProviderQueryParameter)
5659
setDebug(config.debug)
5760
setFetchTimeout(config.fetchTimeout)
5861
}
@@ -93,6 +96,9 @@ export const ConfigProvider: React.FC<{ children: ReactElement[] | ReactElement,
9396
case 'enableRecursiveGateways':
9497
setEnableRecursiveGateways(value)
9598
break
99+
case 'enableProviderQueryParameter':
100+
setEnableProviderQueryParameter(value)
101+
break
96102
case 'debug':
97103
setDebug(value)
98104
break
@@ -123,6 +129,7 @@ export const ConfigProvider: React.FC<{ children: ReactElement[] | ReactElement,
123129
enableWebTransport,
124130
enableGatewayProviders,
125131
enableRecursiveGateways,
132+
enableProviderQueryParameter,
126133
fetchTimeout,
127134
debug,
128135
_supportsSubdomains,

src/lib/config-db.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface ConfigDbWithoutPrivateFields extends BaseDbConfig {
1111
enableWebTransport: boolean
1212
enableGatewayProviders: boolean
1313
enableRecursiveGateways: boolean
14+
enableProviderQueryParameter: boolean
1415
debug: string
1516

1617
/**
@@ -37,6 +38,7 @@ export const defaultEnableWss = true
3738
export const defaultEnableWebTransport = false
3839
export const defaultEnableGatewayProviders = true
3940
export const defaultSupportsSubdomains: null | boolean = null
41+
export const defaultEnableProviderQueryParameter = false
4042

4143
/**
4244
* The default fetch timeout for the gateway, in seconds.
@@ -61,6 +63,7 @@ export async function resetConfig (logger: ComponentLogger): Promise<void> {
6163
await configDb.put('enableWebTransport', defaultEnableWebTransport)
6264
await configDb.put('enableRecursiveGateways', defaultEnableRecursiveGateways)
6365
await configDb.put('enableGatewayProviders', defaultEnableGatewayProviders)
66+
await configDb.put('enableProviderQueryParameter', defaultEnableProviderQueryParameter)
6467
await configDb.put('debug', defaultDebug())
6568
await configDb.put('fetchTimeout', defaultFetchTimeout * 1000)
6669
// leave private/app-only fields as is
@@ -85,6 +88,7 @@ export async function setConfig (config: ConfigDbWithoutPrivateFields, logger: C
8588
await configDb.put('enableWss', config.enableWss)
8689
await configDb.put('enableWebTransport', config.enableWebTransport)
8790
await configDb.put('enableGatewayProviders', config.enableGatewayProviders)
91+
await configDb.put('enableProviderQueryParameter', config.enableProviderQueryParameter)
8892
await configDb.put('debug', config.debug ?? defaultDebug())
8993
await configDb.put('fetchTimeout', config.fetchTimeout ?? (defaultFetchTimeout * 1000))
9094
// ignore private/app-only fields
@@ -116,6 +120,7 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
116120
let enableWss
117121
let enableWebTransport
118122
let enableGatewayProviders
123+
let enableProviderQueryParameter
119124
let fetchTimeout
120125
let debug = ''
121126
let _supportsSubdomains = defaultSupportsSubdomains
@@ -139,6 +144,7 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
139144
enableWss = config.enableWss ?? defaultEnableWss
140145
enableWebTransport = config.enableWebTransport ?? defaultEnableWebTransport
141146
enableGatewayProviders = config.enableGatewayProviders ?? defaultEnableGatewayProviders
147+
enableProviderQueryParameter = config.enableProviderQueryParameter ?? defaultEnableProviderQueryParameter
142148
fetchTimeout = config.fetchTimeout ?? (defaultFetchTimeout * 1000)
143149
_supportsSubdomains ??= config._supportsSubdomains
144150
} catch (err) {
@@ -167,6 +173,7 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
167173
enableWss,
168174
enableWebTransport,
169175
enableGatewayProviders,
176+
enableProviderQueryParameter,
170177
debug,
171178
fetchTimeout,
172179
_supportsSubdomains

src/lib/get-verified-fetch.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ export async function getVerifiedFetch (config: ConfigDb, logger: ComponentLogge
8888
dns: dnsConfig
8989
})
9090
}
91-
9291
return createVerifiedFetch(helia, { withServerTiming: true, plugins: [dirIndexHtmlPluginFactory] })
9392
}
9493

src/pages/config.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export interface ConfigPageProps extends React.HTMLProps<HTMLElement> {
8585
// Config Page can be loaded either as a page or as a component in the landing helper-ui page
8686
const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
8787
const { gotoPage } = useContext(RouteContext)
88-
const { setConfig, resetConfig, gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, fetchTimeout, _supportsSubdomains, isLoading: isConfigDataLoading } = useContext(ConfigContext)
88+
const { setConfig, resetConfig, gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, enableProviderQueryParameter, fetchTimeout, _supportsSubdomains, isLoading: isConfigDataLoading } = useContext(ConfigContext)
8989
const [isSaving, setIsSaving] = useState(false)
9090
const [error, setError] = useState<Error | null>(null)
9191
const [resetKey, setResetKey] = useState(0)
@@ -98,7 +98,7 @@ const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
9898
}
9999
// we get the iframe origin from a query parameter called 'origin', if this is loaded in an iframe
100100
const targetOrigin = decodeURIComponent(window.location.hash.split('@origin=')[1])
101-
const config = { gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, fetchTimeout, _supportsSubdomains }
101+
const config = { gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, enableProviderQueryParameter, fetchTimeout, _supportsSubdomains }
102102
log.trace('config-page: postMessage config to origin ', JSON.stringify(config), targetOrigin)
103103
/**
104104
* The reload page in the parent window is listening for this message, and then it passes a RELOAD_CONFIG message to the service worker
@@ -107,7 +107,7 @@ const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
107107
targetOrigin
108108
})
109109
log.trace('config-page: RELOAD_CONFIG sent to parent window')
110-
}, [gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, fetchTimeout])
110+
}, [gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, enableProviderQueryParameter, fetchTimeout])
111111

112112
useEffect(() => {
113113
if (!isConfigDataLoading) {
@@ -120,7 +120,7 @@ const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
120120

121121
const saveConfig = useCallback(async () => {
122122
try {
123-
const config = { gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, fetchTimeout }
123+
const config = { gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, enableProviderQueryParameter, fetchTimeout }
124124
setIsSaving(true)
125125
await storeConfig(config, uiComponentLogger)
126126
log.trace('config-page: sending RELOAD_CONFIG to service worker')
@@ -139,7 +139,7 @@ const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
139139
} finally {
140140
setIsSaving(false)
141141
}
142-
}, [gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, fetchTimeout])
142+
}, [gateways, routers, dnsJsonResolvers, debug, enableGatewayProviders, enableRecursiveGateways, enableWss, enableWebTransport, enableProviderQueryParameter, fetchTimeout])
143143

144144
const doResetConfig = useCallback(async () => {
145145
// we need to clear out the localStorage items and make sure default values are set, and that all of our inputs are updated
@@ -183,6 +183,14 @@ const ConfigPage: FunctionComponent<ConfigPageProps> = () => {
183183
onChange={(value) => { setConfig('enableWebTransport', value) }}
184184
resetKey={resetKey}
185185
/>
186+
<InputToggle
187+
className='e2e-config-page-input e2e-config-page-input-enableProviderQueryParameter'
188+
label='Enable WebTransport Providers'
189+
description='Use WebTransport providers returned from delegated routers for direct retrieval.'
190+
value={enableProviderQueryParameter}
191+
onChange={(value) => { setConfig('enableProviderQueryParameter', value) }}
192+
resetKey={resetKey}
193+
/>
186194
<TextInput
187195
className='e2e-config-page-input e2e-config-page-input-routers'
188196
description='A newline delimited list of delegated IPFS router URLs.'

src/sw.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,8 @@ async function fetchHandler ({ path, request, event }: FetchHandlerArg): Promise
547547
* @see https://github.com/ipfs/service-worker-gateway/issues/674
548548
*/
549549

550+
// TODO: add config.enableProviderQueryParameter for allow
551+
// config.enableProviderQueryParameter
550552
const response = await verifiedFetch(event.request.url, {
551553
signal,
552554
headers,

test-e2e/config-loading.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ test.describe('ipfs-sw configuration', () => {
1515
enableWebTransport: true,
1616
enableRecursiveGateways: false,
1717
enableGatewayProviders: false,
18+
enableProviderQueryParameter: false,
1819
fetchTimeout: 29 * 1000
1920
}
2021
test.beforeAll(async () => {

test-e2e/fixtures/locators.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const getIframeLocator: GetFrameLocator = (page) => page.frameLocator('if
1919
export const getConfigEnableGatewayProviders: GetLocator = (page) => page.locator('.e2e-config-page-input-enableGatewayProviders')
2020
export const getConfigEnableWss: GetLocator = (page) => page.locator('.e2e-config-page-input-enableWss')
2121
export const getConfigEnableWebTransport: GetLocator = (page) => page.locator('.e2e-config-page-input-enableWebTransport')
22+
export const getConfigEnableProviderQueryParameter: GetLocator = (page) => page.locator('.e2e-config-page-input-enableProviderQueryParameter')
2223
export const getConfigRoutersInput: GetLocator = (page) => page.locator('.e2e-config-page-input-routers')
2324
export const getConfigEnableRecursiveGateways: GetLocator = (page) => page.locator('.e2e-config-page-input-enableRecursiveGateways')
2425
export const getConfigGatewaysInput: GetLocator = (page) => page.locator('.e2e-config-page-input-gateways')

test-e2e/fixtures/set-sw-config.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* Note that this was only tested and confirmed working for subdomain pages.
66
*/
7-
import { getConfigDebug, getConfigDnsJsonResolvers, getConfigEnableGatewayProviders, getConfigEnableRecursiveGateways, getConfigEnableWebTransport, getConfigEnableWss, getConfigFetchTimeout, getConfigGatewaysInput, getConfigGatewaysInputIframe, getConfigPage, getConfigPageSaveButton, getConfigPageSaveButtonIframe, getConfigRoutersInput, getConfigRoutersInputIframe } from './locators.js'
7+
import { getConfigDebug, getConfigDnsJsonResolvers, getConfigEnableGatewayProviders, getConfigEnableRecursiveGateways, getConfigEnableWebTransport, getConfigEnableWss, getConfigEnableProviderQueryParameter, getConfigFetchTimeout, getConfigGatewaysInput, getConfigGatewaysInputIframe, getConfigPage, getConfigPageSaveButton, getConfigPageSaveButtonIframe, getConfigRoutersInput, getConfigRoutersInputIframe } from './locators.js'
88
import { waitForServiceWorker } from './wait-for-service-worker.js'
99
import type { ConfigDb, ConfigDbWithoutPrivateFields } from '../../src/lib/config-db.js'
1010
import type { Page } from '@playwright/test'
@@ -23,6 +23,10 @@ export async function setConfigViaUiSubdomain ({ page, config, expectedSwScope }
2323
await getConfigEnableWss(page).locator('input').setChecked(config.enableWss)
2424
}
2525

26+
if (config.enableProviderQueryParameter != null) {
27+
await getConfigEnableProviderQueryParameter(page).locator('input').setChecked(config.enableProviderQueryParameter)
28+
}
29+
2630
if (config.enableWebTransport != null) {
2731
await getConfigEnableWebTransport(page).locator('input').setChecked(config.enableWebTransport)
2832
}
@@ -73,6 +77,11 @@ export async function setConfigViaUi ({ page, config, expectedSwScope }: { page:
7377
await getConfigEnableWss(page).locator('input').setChecked(config.enableWss)
7478
}
7579

80+
if (config.enableProviderQueryParameter != null) {
81+
await getConfigEnableProviderQueryParameter(page).scrollIntoViewIfNeeded()
82+
await getConfigEnableProviderQueryParameter(page).locator('input').setChecked(config.enableProviderQueryParameter)
83+
}
84+
7685
if (config.enableWebTransport != null) {
7786
await getConfigEnableWebTransport(page).scrollIntoViewIfNeeded()
7887
await getConfigEnableWebTransport(page).locator('input').setChecked(config.enableWebTransport)
@@ -115,6 +124,7 @@ export async function getConfigUi ({ page, expectedSwScope }: { page: Page, expe
115124

116125
const enableGatewayProviders = await getConfigEnableGatewayProviders(page).locator('input').isChecked()
117126
const enableWss = await getConfigEnableWss(page).locator('input').isChecked()
127+
const enableProviderQueryParameter = await getConfigEnableProviderQueryParameter(page).locator('input').isChecked()
118128
const enableWebTransport = await getConfigEnableWebTransport(page).locator('input').isChecked()
119129
const routers = (await getConfigRoutersInput(page).locator('textarea').inputValue()).split('\n')
120130
const enableRecursiveGateways = await getConfigEnableRecursiveGateways(page).locator('input').isChecked()
@@ -133,6 +143,7 @@ export async function getConfigUi ({ page, expectedSwScope }: { page: Page, expe
133143
enableGatewayProviders,
134144
enableWss,
135145
enableWebTransport,
146+
enableProviderQueryParameter,
136147
routers,
137148
enableRecursiveGateways,
138149
gateways,
@@ -215,6 +226,7 @@ export async function getConfig ({ page }: { page: Page }): Promise<ConfigDb> {
215226
routers: await get('routers'),
216227
dnsJsonResolvers: await get('dnsJsonResolvers'),
217228
enableWss: await get('enableWss'),
229+
enableProviderQueryParameter: await get('enableProviderQueryParameter'),
218230
enableWebTransport: await get('enableWebTransport'),
219231
enableRecursiveGateways: await get('enableRecursiveGateways'),
220232
enableGatewayProviders: await get('enableGatewayProviders'),

0 commit comments

Comments
 (0)