From a6297754bd29f21a07726bac5a6a784f89645656 Mon Sep 17 00:00:00 2001 From: hulkoba Date: Mon, 23 Mar 2026 13:15:03 +0100 Subject: [PATCH 1/7] refactor(pouch-fetch): deprecate node-fetch --- package-lock.json | 34 +++++-------------- package.json | 1 - .../pouchdb-abstract-mapreduce/src/index.js | 1 - .../pouchdb-adapter-http/src/index.js | 21 ++++-------- .../pouchdb-fetch/src/fetch-browser.js | 3 +- .../node_modules/pouchdb-fetch/src/fetch.js | 7 ++-- .../node_modules/pouchdb-fetch/src/index.js | 2 +- .../pouchdb-find/src/adapters/http/index.js | 1 - tests/integration/utils.js | 12 +++++-- 9 files changed, 30 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index 429ef0a423..d0dc2af51c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "localstorage-down": "0.6.7", "ltgt": "2.2.1", "memdown": "1.4.1", - "node-fetch": "2.6.9", "readable-stream": "1.1.14", "spark-md5": "3.0.2", "through2": "3.0.2", @@ -3377,7 +3376,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "devOptional": true, + "dev": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -3400,7 +3399,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4308,6 +4307,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", + "license": "Unlicense", "dependencies": { "set-cookie-parser": "^2.4.8", "tough-cookie": "^4.0.0" @@ -7311,25 +7311,6 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-gyp-build": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", @@ -9717,7 +9698,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "dev": true }, "node_modules/sanitize-filename": { "version": "1.6.3", @@ -10863,7 +10844,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", @@ -11392,12 +11374,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index e8eed0f0a3..c699fbc525 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "localstorage-down": "0.6.7", "ltgt": "2.2.1", "memdown": "1.4.1", - "node-fetch": "2.6.9", "readable-stream": "1.1.14", "spark-md5": "3.0.2", "through2": "3.0.2", diff --git a/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js b/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js index 0ec19ed37e..ac5ecce982 100644 --- a/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js +++ b/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js @@ -16,7 +16,6 @@ import { } from 'pouchdb-collate'; import { generateErrorFromResponse } from 'pouchdb-errors'; -import { Headers } from 'pouchdb-fetch'; import TaskQueue from './taskqueue'; import createView from './createView'; import { diff --git a/packages/node_modules/pouchdb-adapter-http/src/index.js b/packages/node_modules/pouchdb-adapter-http/src/index.js index b19f2b4122..c36b6a253d 100644 --- a/packages/node_modules/pouchdb-adapter-http/src/index.js +++ b/packages/node_modules/pouchdb-adapter-http/src/index.js @@ -2,7 +2,7 @@ import pool from './promise-pool'; -import { fetch, Headers } from 'pouchdb-fetch'; +import { fetch } from 'pouchdb-fetch'; import { createError, @@ -514,13 +514,8 @@ function HttpPouch(opts, callback) { const response = await ourFetch(genDBUrl(host, path)); - let blob; - if ('buffer' in response) { - blob = await response.buffer(); - } else { - /* istanbul ignore next */ - blob = await response.blob(); - } + const arrayBuffer = await response.arrayBuffer(); + const blob = Buffer.from(arrayBuffer); let data; if (opts.binary) { @@ -635,13 +630,9 @@ function HttpPouch(opts, callback) { } contentType = response.headers.get('content-type'); - let blob; - if (typeof process !== 'undefined' && !process.browser && typeof response.buffer === 'function') { - blob = await response.buffer(); - } else { - /* istanbul ignore next */ - blob = await response.blob(); - } + + const arrayBuffer = await response.arrayBuffer(); + const blob = Buffer.from(arrayBuffer); // TODO: also remove if (typeof process !== 'undefined' && !process.browser) { diff --git a/packages/node_modules/pouchdb-fetch/src/fetch-browser.js b/packages/node_modules/pouchdb-fetch/src/fetch-browser.js index ffc924dc1e..a5bc1c1f47 100644 --- a/packages/node_modules/pouchdb-fetch/src/fetch-browser.js +++ b/packages/node_modules/pouchdb-fetch/src/fetch-browser.js @@ -1,6 +1,5 @@ 'use strict'; var f = fetch; -var h = Headers; -export { f as fetch, h as Headers }; +export { f as fetch }; diff --git a/packages/node_modules/pouchdb-fetch/src/fetch.js b/packages/node_modules/pouchdb-fetch/src/fetch.js index f1b95b4d80..8c5843516b 100644 --- a/packages/node_modules/pouchdb-fetch/src/fetch.js +++ b/packages/node_modules/pouchdb-fetch/src/fetch.js @@ -1,8 +1,7 @@ 'use strict'; -import nodeFetch, {Headers} from 'node-fetch'; -import fetchCookie from 'fetch-cookie'; +import makeFetchCookie from 'fetch-cookie'; -var fetch = fetchCookie(nodeFetch); +const fetchWithCookie = makeFetchCookie(fetch); -export { fetch, Headers }; +export { fetchWithCookie as fetch }; diff --git a/packages/node_modules/pouchdb-fetch/src/index.js b/packages/node_modules/pouchdb-fetch/src/index.js index 70e6512182..396f29a110 100644 --- a/packages/node_modules/pouchdb-fetch/src/index.js +++ b/packages/node_modules/pouchdb-fetch/src/index.js @@ -1 +1 @@ -export { fetch, Headers } from './fetch'; +export { fetch } from './fetch'; diff --git a/packages/node_modules/pouchdb-find/src/adapters/http/index.js b/packages/node_modules/pouchdb-find/src/adapters/http/index.js index 2efb3767f7..d39147c598 100644 --- a/packages/node_modules/pouchdb-find/src/adapters/http/index.js +++ b/packages/node_modules/pouchdb-find/src/adapters/http/index.js @@ -1,5 +1,4 @@ import { createError, generateErrorFromResponse } from 'pouchdb-errors'; -import { Headers } from 'pouchdb-fetch'; import massageCreateIndexRequest from '../../massageCreateIndexRequest'; import validateSelector from '../../validateSelector'; diff --git a/tests/integration/utils.js b/tests/integration/utils.js index 4d81fc187f..4fc12474ec 100644 --- a/tests/integration/utils.js +++ b/tests/integration/utils.js @@ -32,7 +32,11 @@ testUtils.adapterType = function () { testUtils.readBlob = function (blob, callback) { if (testUtils.isNode()) { - callback(blob.toString('binary')); + if (blob.text) { + blob.text().then(text => callback(text)); + } else { + callback(blob.toString('binary')); + } } else { var reader = new FileReader(); reader.onloadend = function () { @@ -59,7 +63,11 @@ testUtils.readBlobPromise = function (blob) { testUtils.base64Blob = function (blob, callback) { if (testUtils.isNode()) { - callback(blob.toString('base64')); + if (blob.text) { + blob.text().then(text => callback(text)); + } else { + callback(blob.toString('base64')); + } } else { testUtils.readBlob(blob, function (binary) { callback(testUtils.btoa(binary)); From cb4911a81cb604f8337f1eb4f756adfc0f430f55 Mon Sep 17 00:00:00 2001 From: hulkoba Date: Mon, 23 Mar 2026 13:18:05 +0100 Subject: [PATCH 2/7] chore(pkg): update cookie-fetch to the latest version --- package-lock.json | 113 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0dc2af51c..75c7f1e6ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@neighbourhoodie/websql": "2.0.4", "double-ended-queue": "2.1.0-0", - "fetch-cookie": "2.2.0", + "fetch-cookie": "3.2.0", "level": "6.0.1", "level-codec": "9.0.2", "level-write-stream": "1.0.0", @@ -402,9 +402,9 @@ "license": "MIT" }, "node_modules/@11ty/eleventy/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -4304,13 +4304,25 @@ } }, "node_modules/fetch-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", - "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.2.0.tgz", + "integrity": "sha512-n61pQIxP25C6DRhcJxn7BDzgHP/+S56Urowb5WFxtcRMpU6drqXD90xjyAsVQYsNSNNVbaCcYY1DuHsdkZLuiA==", "license": "Unlicense", "dependencies": { "set-cookie-parser": "^2.4.8", - "tough-cookie": "^4.0.0" + "tough-cookie": "^6.0.0" + } + }, + "node_modules/fetch-cookie/node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" } }, "node_modules/file-entry-cache": { @@ -4448,9 +4460,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -4458,7 +4470,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4531,20 +4542,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6469,9 +6466,9 @@ } }, "node_modules/liquidjs": { - "version": "10.25.5", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.25.5.tgz", - "integrity": "sha512-GKiKeZjJDdVoQAu+S9rzkYsYnYhcep5W3WwZXgb5f+yq484P/k9JqamBbGYu+LBEixcUAXZr2jogdAIjB3ki1w==", + "version": "10.25.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.25.0.tgz", + "integrity": "sha512-XpO7AiGULTG4xcTlwkcTI5JreFG7b6esLCLp+aUSh7YuQErJZEoUXre9u9rbdb0057pfWG4l0VursvLd5Q/eAw==", "dev": true, "license": "MIT", "dependencies": { @@ -7880,11 +7877,10 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -7935,20 +7931,6 @@ "node": ">=18" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -8983,7 +8965,8 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -9069,7 +9052,8 @@ "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -9491,7 +9475,8 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true }, "node_modules/resolve": { "version": "1.22.3", @@ -10762,9 +10747,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10774,6 +10759,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tldts": { + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", + "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.28" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", + "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", + "license": "MIT" + }, "node_modules/to-buffer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", @@ -10823,6 +10826,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -10837,6 +10841,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -11145,6 +11150,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -11246,6 +11252,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" diff --git a/package.json b/package.json index c699fbc525..58f2b9e1a9 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "double-ended-queue": "2.1.0-0", - "fetch-cookie": "2.2.0", + "fetch-cookie": "3.2.0", "level": "6.0.1", "level-codec": "9.0.2", "level-write-stream": "1.0.0", From cc33f89f12d0f888e3304270360270f526dd665d Mon Sep 17 00:00:00 2001 From: Alex Feyerke Date: Fri, 10 Apr 2026 10:49:21 +0200 Subject: [PATCH 3/7] fix: add an arrayBufferToBlobOrBuffer helper instead of relying on Buffer.from for attachment fetching. This also removes the somewhat complicated setting of the `type` on the blob/buffer attribute by the calling functions, and puts that in the helper instead. The old TODO comment suggests this appoach was meant to be temporary anyway. --- .../pouchdb-adapter-http/src/index.js | 16 +++------------- .../src/arrayBufferToBlobOrBuffer.js | 16 ++++++++++++++++ .../pouchdb-binary-utils/src/index.js | 2 ++ 3 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js diff --git a/packages/node_modules/pouchdb-adapter-http/src/index.js b/packages/node_modules/pouchdb-adapter-http/src/index.js index c36b6a253d..d02bac03b8 100644 --- a/packages/node_modules/pouchdb-adapter-http/src/index.js +++ b/packages/node_modules/pouchdb-adapter-http/src/index.js @@ -23,6 +23,7 @@ import { import { atob, btoa, + arrayBufferToBlobOrBuffer, binaryStringToBlobOrBuffer as binStringToBluffer, base64StringToBlobOrBuffer as b64StringToBluffer, blobOrBufferToBase64 as blufferToBase64 @@ -515,14 +516,10 @@ function HttpPouch(opts, callback) { const response = await ourFetch(genDBUrl(host, path)); const arrayBuffer = await response.arrayBuffer(); - const blob = Buffer.from(arrayBuffer); + const blob = arrayBufferToBlobOrBuffer(arrayBuffer, att.content_type); let data; if (opts.binary) { - const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type'); - if (!typeFieldDescriptor || typeFieldDescriptor.set) { - blob.type = att.content_type; - } data = blob; } else { data = await new Promise(function (resolve) { @@ -632,15 +629,8 @@ function HttpPouch(opts, callback) { contentType = response.headers.get('content-type'); const arrayBuffer = await response.arrayBuffer(); - const blob = Buffer.from(arrayBuffer); + const blob = arrayBufferToBlobOrBuffer(arrayBuffer, contentType); - // TODO: also remove - if (typeof process !== 'undefined' && !process.browser) { - const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type'); - if (!typeFieldDescriptor || typeFieldDescriptor.set) { - blob.type = contentType; - } - } callback(null, blob); } catch (err) { callback(err); diff --git a/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js new file mode 100644 index 0000000000..f84745b61a --- /dev/null +++ b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js @@ -0,0 +1,16 @@ +import blob from './blob'; + +function arrayBufferToBlobOrBuffer(arrayBuffer, type) { + // In the browser, create a Blob + if (typeof process === 'undefined' || process.browser) { + return blob([arrayBuffer], { type }); + } + // In Node.js, create a Buffer + const buffer = Buffer.from(arrayBuffer); + /* PouchDB uses `type` in various places, see `packages/node_modules/pouchdb-binary-utils/src/typedBuffer.js` + */ + buffer.type = type; + return buffer; +} + +export default arrayBufferToBlobOrBuffer; diff --git a/packages/node_modules/pouchdb-binary-utils/src/index.js b/packages/node_modules/pouchdb-binary-utils/src/index.js index bf6245347d..48dc7c0502 100644 --- a/packages/node_modules/pouchdb-binary-utils/src/index.js +++ b/packages/node_modules/pouchdb-binary-utils/src/index.js @@ -1,4 +1,5 @@ import {atob, btoa} from './base64'; +import arrayBufferToBlobOrBuffer from './arrayBufferToBlobOrBuffer'; import base64StringToBlobOrBuffer from './base64StringToBlobOrBuffer'; import binaryStringToArrayBuffer from './binaryStringToArrayBuffer'; import binaryStringToBlobOrBuffer from './binaryStringToBlobOrBuffer'; @@ -12,6 +13,7 @@ import typedBuffer from './typedBuffer'; export { atob, btoa, + arrayBufferToBlobOrBuffer, base64StringToBlobOrBuffer, binaryStringToArrayBuffer, binaryStringToBlobOrBuffer, From 51ff8281923885819d2d8c63f554d819a11aa536 Mon Sep 17 00:00:00 2001 From: Alex Feyerke Date: Fri, 10 Apr 2026 13:06:42 +0200 Subject: [PATCH 4/7] tests: port 6000 is blocked in native fetch, use different port for ajax tests --- tests/component/test.ajax.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/component/test.ajax.js b/tests/component/test.ajax.js index 541650e48d..5f36d86f7f 100644 --- a/tests/component/test.ajax.js +++ b/tests/component/test.ajax.js @@ -15,9 +15,9 @@ describe('test.ajax.js', function () { res.end(JSON.stringify({ok: req.headers.cookie === 'Test=test'})); } }); - server.listen(6000, function () { - PouchDB.fetch('http://127.0.0.1:6000/install-cookie').then(function () { - return PouchDB.fetch('http://127.0.0.1:6000/check-cookie'); + server.listen(6100, function () { + PouchDB.fetch('http://127.0.0.1:6100/install-cookie').then(function () { + return PouchDB.fetch('http://127.0.0.1:6100/check-cookie'); }).then(function (response) { return response.json(); }).then(function (res) { @@ -32,8 +32,8 @@ describe('test.ajax.js', function () { var server = http.createServer(function (req, res) { res.end(JSON.stringify({ok: req.url === '/testdb/path'})); }); - server.listen(6000, function () { - var db = new PouchDB('http://127.0.0.1:6000/testdb', { skip_setup: true }); + server.listen(6100, function () { + var db = new PouchDB('http://127.0.0.1:6100/testdb', { skip_setup: true }); db.fetch('path').then(function (response) { return response.json(); }).then(function (res) { @@ -48,8 +48,8 @@ describe('test.ajax.js', function () { var server = http.createServer(function (req, res) { res.end(JSON.stringify({ok: req.url === '/root-path'})); }); - server.listen(6000, function () { - var db = new PouchDB('http://127.0.0.1:6000/testdb', { skip_setup: true }); + server.listen(6100, function () { + var db = new PouchDB('http://127.0.0.1:6100/testdb', { skip_setup: true }); db.fetch('/root-path').then(function (response) { return response.json(); }).then(function (res) { From 43363da26b5807bc25b2aba9625a8127d0e5004a Mon Sep 17 00:00:00 2001 From: Alex Feyerke Date: Fri, 10 Apr 2026 13:10:08 +0200 Subject: [PATCH 5/7] tests: increase after hook timeout for perf regression test --- tests/component/test.replication_perf_regression.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/component/test.replication_perf_regression.js b/tests/component/test.replication_perf_regression.js index 84595cdd3b..6d9b6c7162 100644 --- a/tests/component/test.replication_perf_regression.js +++ b/tests/component/test.replication_perf_regression.js @@ -35,10 +35,12 @@ describe('test.replication_perf_regression.js', function () { }); after(function (done) { + // server.close takes surprisingly long + this.timeout(10000); server.close(done); }); - it('#5199 fix excessively long replication loop', function () { + it.only('#5199 fix excessively long replication loop', function () { this.timeout(5000); // mocha timeout increased for this test var numDocs = 59; // uneven number...using smaller number for faster test From f5346f37edcbfbeb72dbef04a732c87ea7b5f6bc Mon Sep 17 00:00:00 2001 From: Alex Feyerke Date: Mon, 13 Apr 2026 10:40:43 +0200 Subject: [PATCH 6/7] test: remove errant only --- tests/component/test.replication_perf_regression.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/component/test.replication_perf_regression.js b/tests/component/test.replication_perf_regression.js index 6d9b6c7162..495bccc280 100644 --- a/tests/component/test.replication_perf_regression.js +++ b/tests/component/test.replication_perf_regression.js @@ -40,7 +40,7 @@ describe('test.replication_perf_regression.js', function () { server.close(done); }); - it.only('#5199 fix excessively long replication loop', function () { + it('#5199 fix excessively long replication loop', function () { this.timeout(5000); // mocha timeout increased for this test var numDocs = 59; // uneven number...using smaller number for faster test From 2915ed129a8db9c431a37cea4b15ee48ef45a0db Mon Sep 17 00:00:00 2001 From: Alex Feyerke Date: Mon, 13 Apr 2026 13:34:25 +0200 Subject: [PATCH 7/7] fix: separate arrayBufferToBlobOrBuffer helpers per env, so rollup can avoid adding a superfluous Buffer polyfill in the build. --- packages/node_modules/pouchdb-binary-utils/package.json | 3 ++- .../src/arrayBufferToBlobOrBuffer-browser.js | 8 ++++++++ .../pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js | 6 ------ 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer-browser.js diff --git a/packages/node_modules/pouchdb-binary-utils/package.json b/packages/node_modules/pouchdb-binary-utils/package.json index 4a19310e7e..9d094c377c 100644 --- a/packages/node_modules/pouchdb-binary-utils/package.json +++ b/packages/node_modules/pouchdb-binary-utils/package.json @@ -20,6 +20,7 @@ "./src/binaryStringToBlobOrBuffer.js": "./src/binaryStringToBlobOrBuffer-browser.js", "./src/blobOrBufferToBase64.js": "./src/blobOrBufferToBase64-browser.js", "./src/blobOrBufferToBinaryString.js": "./src/blobOrBufferToBinaryString-browser.js", - "./src/typedBuffer.js": "./src/typedBuffer-browser.js" + "./src/typedBuffer.js": "./src/typedBuffer-browser.js", + "./src/arrayBufferToBlobOrBuffer.js": "./src/arrayBufferToBlobOrBuffer-browser.js" } } diff --git a/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer-browser.js b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer-browser.js new file mode 100644 index 0000000000..56c2c54187 --- /dev/null +++ b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer-browser.js @@ -0,0 +1,8 @@ +import blob from 'pouchdb-binary-utils/src/blob'; + +function arrayBufferToBlobOrBuffer(arrayBuffer, type) { + // In the browser, create a Blob + return blob([arrayBuffer], { type }); +} + +export default arrayBufferToBlobOrBuffer; diff --git a/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js index f84745b61a..57cba80301 100644 --- a/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js +++ b/packages/node_modules/pouchdb-binary-utils/src/arrayBufferToBlobOrBuffer.js @@ -1,10 +1,4 @@ -import blob from './blob'; - function arrayBufferToBlobOrBuffer(arrayBuffer, type) { - // In the browser, create a Blob - if (typeof process === 'undefined' || process.browser) { - return blob([arrayBuffer], { type }); - } // In Node.js, create a Buffer const buffer = Buffer.from(arrayBuffer); /* PouchDB uses `type` in various places, see `packages/node_modules/pouchdb-binary-utils/src/typedBuffer.js`