diff --git a/package-lock.json b/package-lock.json index 164863f..7b307c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ztimson/zim-utils", - "version": "0.4.8", + "version": "0.4.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ztimson/zim-utils", - "version": "0.4.8", + "version": "0.4.11", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -14,6 +14,7 @@ "adm-zip": "^0.5.18", "lzma1": "^0.3.0", "tar": "^7.4.3", + "undici": "^8.11.2", "zstd-codec": "^0.1.5" } }, @@ -106,6 +107,15 @@ "node": ">=18" } }, + "node_modules/undici": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.11.2.tgz", + "integrity": "sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, "node_modules/var-persist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/var-persist/-/var-persist-1.0.1.tgz", diff --git a/package.json b/package.json index 76d7b6c..ebd271c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/zim-utils", - "version": "0.4.11", + "version": "0.4.12", "description": "Native, dependency-light ZIM archive reader/searcher and Kiwix catalog downloader for Node.js", "author": "Zak Timson", "license": "MIT", @@ -16,9 +16,10 @@ }, "dependencies": { "@ztimson/utils": "^0.30.9", + "adm-zip": "^0.5.18", "lzma1": "^0.3.0", "tar": "^7.4.3", - "zstd-codec": "^0.1.5", - "adm-zip": "^0.5.18" + "undici": "^8.11.2", + "zstd-codec": "^0.1.5" } } diff --git a/src/manager.js b/src/manager.js index c8cdb73..9bf654f 100644 --- a/src/manager.js +++ b/src/manager.js @@ -5,6 +5,9 @@ import {Readable} from 'node:stream'; import {PromiseProgress} from '@ztimson/utils'; import {KiwixServer} from './server.js'; import {zimCatalog, zimCatalogInfo, CATALOG_URL} from './catalog.js'; +import {Agent} from 'undici'; + +const agent = new Agent({headersTimeout: 0, bodyTimeout: 0}); const VISIBLE_TIMEOUT = 5_000; const VISIBLE_POLL_INTERVAL = 200; @@ -65,13 +68,13 @@ export class ZimManager { /** Resolves a `.meta4` metalink URL down to the real mirror `.zim` download URL. */ async #resolveUrl(url) { - const head = await fetch(url); + const head = await fetch(url, {dispatcher: agent}); const ct = head.headers.get('content-type') || ''; if (!ct.includes('metalink') && !url.endsWith('.meta4')) return {res: head, url}; const meta = await head.text(); const m = meta.match(/]*>([^<]+\.zim)<\/url>/); if (!m) throw new Error('Could not resolve metalink mirror'); - const res = await fetch(m[1]); + const res = await fetch(m[1], {dispatcher: agent}); return {res, url: m[1]}; }