Skip to content

Commit 5495199

Browse files
authored
fix: config loading (#547)
* Revert "deps: bump the react-deps group across 1 directory with 3 updates (#518)" This reverts commit 66e0857. * fix: config page recognition is more robust * chore: trying to get video test passing again.... * fix: video auto-play test * Revert "Revert "deps: bump the react-deps group across 1 directory with 3 updates (#518)"" This reverts commit 5816d84. * chore: apply self PR suggestions
1 parent e2c187c commit 5495199

File tree

5 files changed

+49
-10
lines changed

5 files changed

+49
-10
lines changed

src/lib/is-config-page.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
*/
77
export function isConfigPage (hash: string): boolean {
88
const isConfigHashPath = hash.startsWith('#/ipfs-sw-config') // needed for _redirects and IPFS hosted sw gateways
9-
return isConfigHashPath
9+
return isConfigHashPath && hash.endsWith('/ipfs-sw-config')
1010
}

src/sw.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,14 @@ let verifiedFetch: VerifiedFetch
103103
const timeoutAbortEventType = 'verified-fetch-timeout'
104104
const ONE_HOUR_IN_SECONDS = 3600
105105
const urlInterceptRegex = [new RegExp(`${self.location.origin}/ip(n|f)s/`)]
106+
let config: ConfigDb
107+
108+
const updateConfig = async (): Promise<void> => {
109+
config = await getConfig(swLogger)
110+
}
106111
const updateVerifiedFetch = async (): Promise<void> => {
107-
const config = await getConfig(swLogger)
112+
await updateConfig()
113+
108114
verifiedFetch = await getVerifiedFetch(config, swLogger)
109115
}
110116
let swIdb: GenericIDB<LocalSwConfig>
@@ -197,6 +203,17 @@ async function requestRouting (event: FetchEvent, url: URL): Promise<boolean> {
197203
log.error('sw-config reload request, error updating verifiedFetch', err)
198204
}))
199205
return false
206+
} else if (isSwConfigGETRequest(event)) {
207+
log.trace('sw-config GET request')
208+
event.waitUntil(new Promise<void>((resolve) => {
209+
event.respondWith(new Response(JSON.stringify(config), {
210+
headers: {
211+
'Content-Type': 'application/json'
212+
}
213+
}))
214+
resolve()
215+
}))
216+
return false
200217
} else if (isSwAssetRequest(event)) {
201218
log.trace('sw-asset request, returning cached response ', event.request.url)
202219
/**
@@ -280,6 +297,10 @@ function isSwConfigReloadRequest (event: FetchEvent): boolean {
280297
return event.request.url.includes('/#/ipfs-sw-config-reload')
281298
}
282299

300+
function isSwConfigGETRequest (event: FetchEvent): boolean {
301+
return event.request.url.includes('/#/ipfs-sw-config-get')
302+
}
303+
283304
function isSwAssetRequest (event: FetchEvent): boolean {
284305
const isActualSwAsset = /^.+\/(?:ipfs-sw-).+$/.test(event.request.url)
285306
// if path is not set, then it's a request for index.html which we should consider a sw asset
@@ -427,7 +448,9 @@ async function fetchHandler ({ path, request, event }: FetchHandlerArg): Promise
427448
*
428449
* @see https://developer.chrome.com/docs/extensions/develop/concepts/service-workers/lifecycle
429450
*/
430-
verifiedFetch = verifiedFetch ?? await getVerifiedFetch(await getConfig(swLogger), swLogger)
451+
if (verifiedFetch == null) {
452+
await updateVerifiedFetch()
453+
}
431454

432455
/**
433456
* Note that there are existing bugs regarding service worker signal handling:

test-e2e/config-loading.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { testSubdomainRouting as test, expect } from './fixtures/config-test-fixtures.js'
1+
import { test, expect } from './fixtures/config-test-fixtures.js'
22
import { getConfig, setConfig } from './fixtures/set-sw-config.js'
33
import { waitForServiceWorker } from './fixtures/wait-for-service-worker.js'
44
import type { ConfigDbWithoutPrivateFields } from '../src/lib/config-db.js'
@@ -52,5 +52,13 @@ test.describe('ipfs-sw configuration', () => {
5252
// ensure it equals the root config
5353
expect(subdomainConfig).toEqual(rootConfig)
5454
expect(subdomainConfig).toMatchObject(testConfig)
55+
56+
// now we know the subdomain has the right config, but does the serviceworker?
57+
const serviceWorkerConfigJson = await page.evaluate(async () => {
58+
const response = await fetch('/#/ipfs-sw-config-get')
59+
return response.json()
60+
})
61+
62+
expect(serviceWorkerConfigJson).toMatchObject(testConfig)
5563
})
5664
})
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
1+
import { logger } from '@libp2p/logger'
12
import { createNode, type KuboNode } from 'ipfsd-ctl'
23
import { path as kuboPath } from 'kubo'
34
import { create } from 'kubo-rpc-client'
45
import { kuboRepoDir } from './load-kubo-fixtures.js'
5-
66
export async function createKuboNode (): Promise<KuboNode> {
7-
return createNode({
7+
const node = await createNode({
88
type: 'kubo',
99
bin: kuboPath(),
1010
rpc: create,
1111
test: true,
1212
repo: kuboRepoDir,
1313
args: []
1414
})
15+
const log = logger('kubo-node')
16+
17+
// log the gateway info
18+
const info = await node.info()
19+
log('node info %O', info)
20+
21+
return node
1522
}

test-e2e/video.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { waitForServiceWorker } from './fixtures/wait-for-service-worker'
44
import type { ConfigDbWithoutPrivateFields } from '../src/lib/config-db.js'
55

66
const cid = 'bafybeie4vcqkutumw7s26ob2bwqwqi44m6lrssjmiirlhrzhs2akdqmkw4' // big buck bunny webm trimmed to 15 seconds with `ffmpeg -i bigbuckbunny.webm -ss 00:00 -t 00:15 -c:a copy -c:v copy bigbuckbunny-mini.webm`
7+
78
test.describe('video', () => {
89
const testConfig: Partial<ConfigDbWithoutPrivateFields> = {
910
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -14,20 +15,20 @@ test.describe('video', () => {
1415
enableWss: true,
1516
enableWebTransport: false,
1617
enableRecursiveGateways: true,
17-
enableGatewayProviders: false
18+
enableGatewayProviders: true
1819
}
1920

2021
/**
2122
* We want to load the video fixture and ensure it starts playing.
2223
*/
23-
test('starts playing automatically', async ({ page, protocol, rootDomain }) => {
24-
await page.goto(`${protocol}//${rootDomain}`)
24+
test('starts playing automatically', async ({ page }) => {
2525
await setConfig({ page, config: testConfig })
2626
await waitForServiceWorker(page)
27-
const response = await page.goto(`${protocol}//${rootDomain}/ipfs/${cid}`, { waitUntil: 'commit' })
27+
const response = await page.goto(`http://127.0.0.1:3333/ipfs/${cid}`, { waitUntil: 'commit' })
2828
const start = performance.now()
2929

3030
expect(response?.status()).toBe(200)
31+
await waitForServiceWorker(page)
3132

3233
// expect a video player
3334
await page.waitForSelector('video')

0 commit comments

Comments
 (0)