diff --git a/src/core.mjs b/src/core.mjs index abe3c91..927d540 100644 --- a/src/core.mjs +++ b/src/core.mjs @@ -168,24 +168,31 @@ export const updateStaticPageSriHashes = async ( } if (src) { - /** @type {string | ArrayBuffer | Buffer} */ - let resourceContent - if (src.startsWith('/')) { - const resourcePath = resolve(distDir, `.${src}`) - resourceContent = await readFile(resourcePath) - } else if (src.startsWith('http')) { - setCrossorigin = true - const resourceResponse = await fetch(src, { method: 'GET' }) - resourceContent = await resourceResponse.arrayBuffer() + const cachedHash = h.perResourceSriHashes[t2].get(src) + if (cachedHash) { + sriHash = cachedHash + h[`ext${t}Hashes`].add(sriHash) + pageHashes[t2].add(sriHash) } else { - logger.warn(`Unable to process external resource: "${src}"`) - continue - } + /** @type {string | ArrayBuffer | Buffer} */ + let resourceContent + if (src.startsWith('/')) { + const resourcePath = resolve(distDir, `.${src}`) + resourceContent = await readFile(resourcePath) + } else if (src.startsWith('http')) { + setCrossorigin = true + const resourceResponse = await fetch(src, { method: 'GET' }) + resourceContent = await resourceResponse.arrayBuffer() + } else { + logger.warn(`Unable to process external resource: "${src}"`) + continue + } - sriHash = generateSRIHash(resourceContent) - h[`ext${t}Hashes`].add(sriHash) - pageHashes[t2].add(sriHash) - h.perResourceSriHashes[t2].set(src, sriHash) + sriHash = generateSRIHash(resourceContent) + h[`ext${t}Hashes`].add(sriHash) + pageHashes[t2].add(sriHash) + h.perResourceSriHashes[t2].set(src, sriHash) + } } } diff --git a/tests/core.test.mts b/tests/core.test.mts index 80e4c38..4f07243 100644 --- a/tests/core.test.mts +++ b/tests/core.test.mts @@ -362,7 +362,7 @@ describe('updateStaticPageSriHashes', () => { My Test Page - + ` @@ -379,7 +379,7 @@ describe('updateStaticPageSriHashes', () => { expect(h.extScriptHashes.size).toBe(1) expect( h.extScriptHashes.has( - 'sha256-mBEQGpYqqmUThJOhZ7SIAP3agaHSLAyV/38of2lYhnI=', + 'sha256-etOR/kKV9aCSESe7t5JeBixVQA1DjUU2Zxk13wsPU8M=', ), ).toBe(true) expect(h.inlineScriptHashes.size).toBe(0)