{"_id":"node-wreq","_rev":"16-15e8a30a5bd2273177d412f2756798ee","name":"node-wreq","dist-tags":{"rc":"1.0.0-rc2","latest":"3.2.1"},"versions":{"0.1.0":{"name":"node-wreq","version":"0.1.0","keywords":["browser","fingerprint","bypass","anti-bot","tls","http2","impersonation","web-scraping"],"author":{"name":"will-work-for-meal"},"license":"MIT","_id":"node-wreq@0.1.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/will-work-for-meal/node-wreq#readme","bugs":{"url":"https://github.com/will-work-for-meal/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"fa5b6dce882f95521de38545394e7df2325cbd3d","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-0.1.0.tgz","fileCount":19,"integrity":"sha512-1dvJSjcKrY6n6g486EQmP98eyFEAvJZBed64ef2WSYMjG07IA2hQTLfzodhf/D8syRjjq6/luOSFWnL+Cj4Mng==","signatures":[{"sig":"MEQCIDKdjK47w7qjJiKknTG6O31Fh5urKFu3t01Uju8fy03QAiBQM1cCWbcnyjbT+JdU/YKzn4wIngtVH45Px1Vau63p5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":25960135},"main":"dist/node-wreq.js","napi":{"name":"node-wreq","triples":{"defaults":true,"additional":["x86_64-apple-darwin","aarch64-apple-darwin","x86_64-unknown-linux-gnu","x86_64-pc-windows-msvc"]}},"types":"dist/node-wreq.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d33c53827a48f1d8d7611be67ba864995a5d59b6","scripts":{"test":"npm run build && node --test dist/test/node-wreq.spec.js","build":"npm run build:rust && npm run build:ts","clean":"rm -rf dist rust/target rust/*.node","format":"prettier --write \"src/**/*.{ts,js,json,md}\"","build:ts":"tsc","artifacts":"napi artifacts","build:rust":"napi build --platform --release --cargo-cwd rust rust","format:check":"prettier --check \"src/**/*.{ts,js,json,md}\""},"_npmUser":{"name":"zhepa","email":"mxstr73@gmail.com"},"repository":{"url":"git+https://github.com/will-work-for-meal/node-wreq.git","type":"git"},"_npmVersion":"10.8.2","description":"Browser fingerprint bypass library using Rust for TLS/HTTP2 impersonation","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.2.5","typescript":"^5.0.0","@types/node":"^20.0.0","@napi-rs/cli":"^2.18.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_0.1.0_1760227057761_0.23317507186021746","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"node-wreq","version":"0.1.2","keywords":["browser","fingerprint","bypass","anti-bot","tls","http2","impersonation","web-scraping"],"author":{"name":"will-work-for-meal"},"license":"MIT","_id":"node-wreq@0.1.2","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/will-work-for-meal/node-wreq#readme","bugs":{"url":"https://github.com/will-work-for-meal/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"b2d19b8669c0f26e42210b5f8bbc169f4fa02120","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-0.1.2.tgz","fileCount":19,"integrity":"sha512-XQ9r8/7m7j+Jo3apO+rSmmR1kOXmbOKKQ3QtQ5ubDr1x2SyJLmIYCjZKYKKYRRZ6h6bX9B1SF/Eqd1PO2qKBGQ==","signatures":[{"sig":"MEYCIQDtfjqAUl/E7lZBSR467iI0ikZm7Uueb1j65zwQctZqOAIhAPHvd8BiKiJE9LEMexlOgBveJZje3/LI8LqAuBZyW7US","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26852678},"main":"dist/node-wreq.js","napi":{"name":"node-wreq","triples":{"defaults":true,"additional":["x86_64-apple-darwin","aarch64-apple-darwin","x86_64-unknown-linux-gnu","x86_64-pc-windows-msvc"]}},"types":"dist/node-wreq.d.ts","engines":{"node":">=18.0.0"},"gitHead":"aad00e83d7bd0984dfe6a1aef6c550848029b7b3","scripts":{"test":"npm run build && node --test dist/test/node-wreq.spec.js","build":"npm run build:rust && npm run build:ts","clean":"rm -rf dist rust/target rust/*.node","format":"prettier --write \"src/**/*.{ts,js,json,md}\"","build:ts":"tsc","artifacts":"napi artifacts","build:rust":"napi build --platform --release --cargo-cwd rust rust","format:check":"prettier --check \"src/**/*.{ts,js,json,md}\""},"_npmUser":{"name":"zhepa","email":"mxstr73@gmail.com"},"repository":{"url":"git+https://github.com/will-work-for-meal/node-wreq.git","type":"git"},"_npmVersion":"10.8.2","description":"Browser fingerprint bypass library using Rust for TLS/HTTP2 impersonation","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.2.5","typescript":"^5.0.0","@types/node":"^20.0.0","@napi-rs/cli":"^2.18.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_0.1.2_1760275472165_0.6540432846752351","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"node-wreq","version":"0.2.0","keywords":["browser","fingerprint","bypass","anti-bot","tls","http2","impersonation","web-scraping","crawler","web-scraper","wreq","ja3","tls-fingerprint","ja4","browser-fingerprint-bypass"],"author":{"name":"will-work-for-meal"},"license":"MIT","_id":"node-wreq@0.2.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/will-work-for-meal/node-wreq#readme","bugs":{"url":"https://github.com/will-work-for-meal/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"0fbaa5237b96487c565ad8870c4754f8431a3bcf","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-0.2.0.tgz","fileCount":23,"integrity":"sha512-l+ZgOaMeeLDBTIC6/1w9hOai6tqwRMIWm2+QZVCD7X1Ut89GbiNttZ5K8pUX8rUe0Fta5W+beQ8W/245wEipUg==","signatures":[{"sig":"MEUCIQCpat41E+Zz7oD2CYQo/ci5K9Ifn5xfqFhbxWonI3Ve8QIgWW0cRU3WCrq7vPeSD13/Fh0r+PIuadxP8yy1vpRsE5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":28110885},"main":"dist/node-wreq.js","napi":{"name":"node-wreq","triples":{"defaults":true,"additional":["x86_64-apple-darwin","aarch64-apple-darwin","x86_64-unknown-linux-gnu","x86_64-pc-windows-msvc"]}},"types":"dist/node-wreq.d.ts","engines":{"node":">=20.0.0"},"gitHead":"010c72db3ce654ffbc4e9648bc96762022524042","scripts":{"test":"npm run build && node --test dist/test/*.spec.js","build":"npm run build:rust && npm run build:ts","clean":"rimraf dist rust/target rust/*.node","format":"prettier --write \"src/**/*.{ts,js,json,md}\"","build:ts":"npm run clean:dist && tsc","artifacts":"napi artifacts","build:rust":"napi build --platform --release --cargo-cwd rust rust","clean:dist":"rimraf dist","format:check":"prettier --check \"src/**/*.{ts,js,json,md}\""},"_npmUser":{"name":"zhepa","email":"mxstr73@gmail.com"},"repository":{"url":"git+https://github.com/will-work-for-meal/node-wreq.git","type":"git"},"_npmVersion":"10.8.2","description":"Browser fingerprint bypass library using Rust for TLS/HTTP2 impersonation","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","prettier":"^3.2.5","typescript":"^5.0.0","@types/node":"^20.0.0","@napi-rs/cli":"^2.18.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_0.2.0_1760301163080_0.026894587818957927","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-rc2":{"name":"node-wreq","version":"1.0.0-rc2","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@1.0.0-rc2","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"9178b42a9fea1e00e910efea32d68bc10361b902","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-1.0.0-rc2.tgz","fileCount":167,"integrity":"sha512-8+exrA52JMVWgPqiyP2DmvgJ3VQJNe/Ds6Wz4lRsO0oMirooUmsD05wwyjnlY4wfiCXLrS9cTeeGsH1+KUuNXw==","signatures":[{"sig":"MEQCICROMa3MOli1R1KBRCezNLOffPiSOerbnfd7DmKmyKMPAiA999myQYnVaMRd5f7qrmnJeybUO8FYmtl+9jaNqSVKcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@1.0.0-rc2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":274073},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"da906b1f8afd571fca008b7756bba60ffb9490aa","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"readmeFilename":"README.md","optionalDependencies":{"@node-wreq/darwin-x64":"1.0.0-rc2","@node-wreq/darwin-arm64":"1.0.0-rc2","@node-wreq/linux-x64-gnu":"1.0.0-rc2","@node-wreq/linux-x64-musl":"1.0.0-rc2","@node-wreq/win32-x64-msvc":"1.0.0-rc2","@node-wreq/linux-arm64-gnu":"1.0.0-rc2"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_1.0.0-rc2_1776026232721_0.642197521731428","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"node-wreq","version":"1.0.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@1.0.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"95434f3348017bb0361c638704b2747716298915","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-1.0.0.tgz","fileCount":167,"integrity":"sha512-DOh9AnMgXyA7BlmN8IHagC7RWMtT/DoDQX8PbyiefQLUYiIu9pIL4Xpr8yzW48yTJhZA4NC66IokK0HP1Tzvxw==","signatures":[{"sig":"MEUCIAUHniqclKKSgfauZwpyICV9jotZFeQYPJsa5n1u+OjUAiEAk2lEKeoMboBRwbRvc1KQ7a/dlbNSTMMvxLGWIrKGLMo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":274045},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"ff902471787eee09f1590a4e0bc2fa7f264c59ef","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"1.0.0","@node-wreq/darwin-arm64":"1.0.0","@node-wreq/linux-x64-gnu":"1.0.0","@node-wreq/linux-x64-musl":"1.0.0","@node-wreq/win32-x64-msvc":"1.0.0","@node-wreq/linux-arm64-gnu":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_1.0.0_1776026996091_0.6195582908373556","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"node-wreq","version":"2.0.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.0.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"0a5ed9515c1713d4cab4b5c4355aa4fb3663c188","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.0.0.tgz","fileCount":175,"integrity":"sha512-/VfGoxrWMG9/O6RbE/iBkRlnZQxxIl/93bvfCR01A2VcYIz6NP26vBm1yK3JkVPflRzV9q2OnogSw/9nEI33yg==","signatures":[{"sig":"MEQCIC5iA2S57Xt4bMs+aEwQQrqapl4SBs7+uC9QpSl6cYr7AiBEMxzIxNQRoMmIPGL6Lx1sZUR22KMAFL4OEky7FYU/AQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":297925},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"8ddc4c5678ee8348bc800b361684e19ed59c32f3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.0.0","@node-wreq/darwin-arm64":"2.0.0","@node-wreq/linux-x64-gnu":"2.0.0","@node-wreq/linux-x64-musl":"2.0.0","@node-wreq/win32-x64-msvc":"2.0.0","@node-wreq/linux-arm64-gnu":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.0.0_1776278858140_0.5827279495475322","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"node-wreq","version":"2.1.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.1.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"412f342a166355b2ca1f1ddd5edbad4e2eb4a66e","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.1.0.tgz","fileCount":175,"integrity":"sha512-CTXzLbLsYdKQbm9j+ZvhoIYJisQ4EqK79ciosaeSUMG+8zAOJd2ejIumvaDVX1qW9BczQrsFEyfWoAy/rwR1qQ==","signatures":[{"sig":"MEQCIHKqmIHg5fuRH40o5i/NvtHtlPzEtNEufTgaXGtHniM6AiBxI3OEFIkUbwNxvpoF58IV/xxGJsoV+eY3CQemCZul/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":302047},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"7893417257a0cdfbd5f24cb3a8743dbc1eacff40","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.1.0","@node-wreq/darwin-arm64":"2.1.0","@node-wreq/linux-x64-gnu":"2.1.0","@node-wreq/linux-x64-musl":"2.1.0","@node-wreq/win32-x64-msvc":"2.1.0","@node-wreq/linux-arm64-gnu":"2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.1.0_1776284717869_0.7563990195901074","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"node-wreq","version":"2.2.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.2.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"2bb158a9ce33d940f95b896e457f3ecb959843de","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.2.0.tgz","fileCount":175,"integrity":"sha512-l6zPg00VAGFJM/AcPkp7rBRXIk44tQDYnpeGlJH60SS9jFkpJyQTCXbbRPwIbT6TlAjuL6QBS3+6OpI5xP51Yg==","signatures":[{"sig":"MEUCIFxghe6w/ESyrrIhcuo3viHV4u8vsr9kDxv96s5JybY4AiEA5HILn4XvBafORWBI6R5GWGfKYJ0ORE65qmt3WM/ppVQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":325354},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"e8f4ff87a91487229b0f3720f1bae072ab6ce1ac","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.2.0","@node-wreq/darwin-arm64":"2.2.0","@node-wreq/linux-x64-gnu":"2.2.0","@node-wreq/linux-x64-musl":"2.2.0","@node-wreq/win32-x64-msvc":"2.2.0","@node-wreq/linux-arm64-gnu":"2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.2.0_1776294959658_0.6561085053168338","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"node-wreq","version":"2.2.1","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.2.1","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"2da7a74cd41615e9191dcc0c1cd66aa7b1b6f00a","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.2.1.tgz","fileCount":175,"integrity":"sha512-wVbAfkMWPhfP0bVp0TJWaiSqf0Fh6sdG+KTd8LhrhRMrSoDnvTR2tOjWg45EM0ViOMfjgWsnj9TasUmx5BUAiw==","signatures":[{"sig":"MEYCIQC/wsMnYxVf2sq8kjPMZylhbnF2ZkMLDmesuurf1OmTzgIhAL7ernXo8Vuy7kd1f+19CtF8zbEVi87SCDFLm10tKxwj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":367345},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"d176a94a5df342457fd3fdba21defc9c94e805b4","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.11.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.2.1","@node-wreq/darwin-arm64":"2.2.1","@node-wreq/linux-x64-gnu":"2.2.1","@node-wreq/linux-x64-musl":"2.2.1","@node-wreq/win32-x64-msvc":"2.2.1","@node-wreq/linux-arm64-gnu":"2.2.1"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.2.1_1776353976184_0.5912453973186049","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"node-wreq","version":"2.3.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.3.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"26382157bff3006fc011ade91512c5f6f0bd6c27","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.3.0.tgz","fileCount":175,"integrity":"sha512-KsXlRtP5GmW6T6Sq7ZDA7t+YlF9rRx+qDzD6PQJew4SseQrXPAje9Et+2EwMYzciWeO2+PdOUBhVYnlAIqrjHQ==","signatures":[{"sig":"MEUCIQCKYxy59qFm38jvh/5hVRKtx5JkNVMaGz8kD2OKwHW4FwIgTnVh49KeyvBsnv57bLFJz4ATTV0TUvwkUzjlelc3inY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":368258},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"024b56f7cf852eb098e8d2604b92fdb6e8033631","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.12.1","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.3.0","@node-wreq/darwin-arm64":"2.3.0","@node-wreq/linux-x64-gnu":"2.3.0","@node-wreq/linux-x64-musl":"2.3.0","@node-wreq/win32-x64-msvc":"2.3.0","@node-wreq/linux-arm64-gnu":"2.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.3.0_1779707005217_0.17764807531787286","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"node-wreq","version":"2.4.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.4.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"586c364b647ab3db38be9dd8c9fc2da24592f3d1","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.4.0.tgz","fileCount":175,"integrity":"sha512-jLbtJDtY7ZzZ/ZHcHJOLk8AdAI1u3lm6jORHbfu00nPhKI+nhsZ6fbM9k2yB/c4TA0r1qjTq8J6rHLFgqf6UhQ==","signatures":[{"sig":"MEQCIDd3rEblUXaVrnzmThw528gY5SEZl5N+ONW+qCbEKD5OAiBoJozKFj7V4HFxBMA8wyD/T5xNdsmHruK9qPXOM/7IPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":371762},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"64d0cd14fde355ef0f7a00c4ce962b29b2eb56a0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.13.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.4.0","@node-wreq/darwin-arm64":"2.4.0","@node-wreq/linux-x64-gnu":"2.4.0","@node-wreq/linux-x64-musl":"2.4.0","@node-wreq/win32-x64-msvc":"2.4.0","@node-wreq/linux-arm64-gnu":"2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.4.0_1779983060969_0.665960146358793","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"node-wreq","version":"2.4.1","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@2.4.1","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"10a4718f2618e25e57e1f5f9c7b2ec05732d25d9","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-2.4.1.tgz","fileCount":175,"integrity":"sha512-J3T1T9OXOmCneBQWJQObE1dxNEhQbs7z91x078RBs+hF3REPPAMlJEp2I+F7hfZm++lANLfZ64FB1lRKZwXpMg==","signatures":[{"sig":"MEQCID7DBsx0RCWz3eoMaywsAG7yecnF2RT8lZEuXLnQtDnAAiBZv+5/NPKxZkTq92wJoWvvAaA0N+yEwXOUCqQ89752VQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@2.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":372190},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"9f081372440a0e99ec48ef2e40b5d4449135d9b5","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.13.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"2.4.1","@node-wreq/darwin-arm64":"2.4.1","@node-wreq/linux-x64-gnu":"2.4.1","@node-wreq/linux-x64-musl":"2.4.1","@node-wreq/win32-x64-msvc":"2.4.1","@node-wreq/linux-arm64-gnu":"2.4.1"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_2.4.1_1780059953178_0.17537874592580138","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"node-wreq","version":"3.0.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@3.0.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"012fe4c26c329d1a1bc3fb41307ce3a0b11059a7","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-3.0.0.tgz","fileCount":179,"integrity":"sha512-pn8sd8IsopoJ2G1qSja9Q3sFGbM4Uk5bayZj+nJPv7+GOpYPSvihn8H5ENZAsroL7DXadPzwc70BUV28ZmpVQg==","signatures":[{"sig":"MEYCIQDnXposc2qsZEYEryHRRoybcRvznqWYXo6lC18YnboySwIhAIUw8XCL35v212aICJFfEYbrfrJf86UgPybZj12nTAMb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":427730},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"5cc4582f0d9567a38b4bf1464a260e82ff3330df","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.16.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"3.0.0","@node-wreq/darwin-arm64":"3.0.0","@node-wreq/linux-x64-gnu":"3.0.0","@node-wreq/linux-x64-musl":"3.0.0","@node-wreq/win32-x64-msvc":"3.0.0","@node-wreq/linux-arm64-gnu":"3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_3.0.0_1785540110053_0.6019847339249926","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"node-wreq","version":"3.1.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@3.1.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"e2a8be336449107daab35bd44fb7548a74d4c60a","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-3.1.0.tgz","fileCount":179,"integrity":"sha512-L6YO9fbPty1M/wyRIdClzhEy3PM7ga4y7M9899N09dLzXx0kiDWsWZQIOu1fxSdzbA4VbWDU/BlrSdSTvz1pSQ==","signatures":[{"sig":"MEUCIDgV66DOezvlueRb1hj4/JYNsKLxsThhSGdKxM87OffSAiEAgfp4oSMv0ZS4mttqtXRnH9cBQZE30VQBchwzx2bPOSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":478962},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"d9205714af4338676958f2a029f4b8191a3baa5c","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.16.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"3.1.0","@node-wreq/darwin-arm64":"3.1.0","@node-wreq/linux-x64-gnu":"3.1.0","@node-wreq/linux-x64-musl":"3.1.0","@node-wreq/win32-x64-msvc":"3.1.0","@node-wreq/linux-arm64-gnu":"3.1.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_3.1.0_1785762117260_0.1433801085269899","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"node-wreq","version":"3.2.0","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","_id":"node-wreq@3.2.0","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"dist":{"shasum":"8b9cb39ca86ee5bc7aef07ff48dc20d681232873","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-3.2.0.tgz","fileCount":179,"integrity":"sha512-EKRdD829jingGJcvPduVDO6URkW5P/NRhBu2YEzSpJERABMDrr3Nt+BQ0tE5NfOWPuqWgn9pJ0QNU082bQActw==","signatures":[{"sig":"MEYCIQCKRxzpD33E9/kCcqW9jwUq7syY76VC1OIqok5541HymAIhAN4zw5du2ku4LUEzU3PalNiV/Z8GxzBb9FSAE6P62TDj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":492306},"main":"./dist/node-wreq.js","types":"dist/node-wreq.d.ts","module":"./dist/node-wreq.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/node-wreq.d.ts","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js","require":"./dist/node-wreq.js"},"./package.json":"./package.json"},"gitHead":"1bf7dec15cd3e298e809db4d40b9660abbf75f4f","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"repository":{"url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git","type":"git"},"_npmVersion":"11.17.0","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"optionalDependencies":{"@node-wreq/darwin-x64":"3.2.0","@node-wreq/darwin-arm64":"3.2.0","@node-wreq/linux-x64-gnu":"3.2.0","@node-wreq/linux-x64-musl":"3.2.0","@node-wreq/win32-x64-msvc":"3.2.0","@node-wreq/linux-arm64-gnu":"3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/node-wreq_3.2.0_1787754764941_0.4705287624246903","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"node-wreq","version":"3.2.1","description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","main":"./dist/node-wreq.js","module":"./dist/node-wreq.mjs","types":"dist/node-wreq.d.ts","exports":{".":{"types":"./dist/node-wreq.d.ts","require":"./dist/node-wreq.js","import":"./dist/node-wreq.mjs","default":"./dist/node-wreq.js"},"./package.json":"./package.json"},"keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"author":{"name":"StopMakingThatBigFace"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git"},"bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","engines":{"node":">=20.0.0"},"os":["darwin","linux","win32"],"cpu":["x64","arm64"],"optionalDependencies":{"@node-wreq/darwin-x64":"3.2.1","@node-wreq/darwin-arm64":"3.2.1","@node-wreq/linux-x64-gnu":"3.2.1","@node-wreq/linux-arm64-gnu":"3.2.1","@node-wreq/linux-x64-musl":"3.2.1","@node-wreq/win32-x64-msvc":"3.2.1"},"gitHead":"b93e0ff525d90fe665bb838c4781443b6166ab79","_id":"node-wreq@3.2.1","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-JrbBKiAViePPX2lWqmAU9kEhnZOC3IT/kzE9HZdyBxUdUYqKVmn3uiu6Adf00/YTyyKKX+ytcH6zbdG8uTL3nQ==","shasum":"4147a9e5e05e310198822bc5ba6d1eac70af7da4","tarball":"https://registry.npmjs.org/node-wreq/-/node-wreq-3.2.1.tgz","fileCount":179,"unpackedSize":492306,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-wreq@3.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC/RdueqkLSsMgwFikeew5JU9GKJ+nkaPRJc+EUsYYyIgIhAOmdgfyWOiZVEIENS6WCve7FhiJ1yGb3D2HvGjyD8B1e"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:72061d53-0749-4589-85f4-6655cd1b4242"}},"directories":{},"maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-wreq_3.2.1_1788719074263_0.7634525286888663"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-11T23:57:37.662Z","modified":"2026-09-06T18:24:34.748Z","0.1.0":"2025-10-11T23:57:38.122Z","0.1.2":"2025-10-12T13:24:32.548Z","0.2.0":"2025-10-12T20:32:43.435Z","1.0.0-rc2":"2026-04-12T20:37:12.872Z","1.0.0":"2026-04-12T20:49:56.224Z","2.0.0":"2026-04-15T18:47:38.315Z","2.1.0":"2026-04-15T20:25:18.038Z","2.2.0":"2026-04-15T23:15:59.818Z","2.2.1":"2026-04-16T15:39:36.337Z","2.3.0":"2026-05-25T11:03:25.365Z","2.4.0":"2026-05-28T15:44:21.125Z","2.4.1":"2026-05-29T13:05:53.332Z","3.0.0":"2026-07-31T23:21:50.183Z","3.1.0":"2026-08-03T13:01:57.434Z","3.2.0":"2026-08-26T14:32:45.105Z","3.2.1":"2026-09-06T18:24:34.463Z"},"bugs":{"url":"https://github.com/StopMakingThatBigFace/node-wreq/issues"},"author":{"name":"StopMakingThatBigFace"},"license":"MIT","homepage":"https://github.com/StopMakingThatBigFace/node-wreq#readme","keywords":["anti-bot","bypass","browser","browser-fingerprint-bypass","browseer-impersonation","browser-emulation","crawler","cloudflare","cloudflare-bypass","curl-impersonate","scrapper","fingerprint","tls","tls-fingerprint","http2","fetch","websocket","impersonation","web-scraping","web-scraper","wreq","ja3","ja4"],"repository":{"type":"git","url":"git+https://github.com/StopMakingThatBigFace/node-wreq.git"},"description":"HTTP client with native TLS, HTTP2, JA3, JA4 browser impersonation backed by wreq's Rust core","maintainers":[{"name":"zhepa","email":"mxstr73@gmail.com"}],"readme":"# node-wreq\n\n[![NPM Version](https://img.shields.io/npm/v/node-wreq)](https://npmjs.com/package/node-wreq)\n![ESM](https://img.shields.io/badge/ESM-supported-brightgreen)\n![CJS](https://img.shields.io/badge/CJS-supported-brightgreen)\n![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20MacOS%20%7C%20Windows-lightgrey)\n\n`node-wreq` is a thin Node.js wrapper around 0x676e67's [`wreq`](https://github.com/0x676e67/wreq) — \na Rust HTTP client exposing its full power to JavaScript.\n\nUse it when you need low-level control over the network layer: TLS configuration, \ntransport fingerprinting, browser impersonation, or fine-grained HTTP/WebSocket \nbehavior that standard Node.js clients simply don't expose.\n\n> [!TIP]\n> ### why does this exist?\n>\n> Node.js ships with a built-in `https` module, and the ecosystem offers popular clients like `axios`, `got`, and `node-fetch` — but all of them are built on top of OpenSSL via Node's `tls` module, which exposes **no control over low-level TLS handshake parameters**. This makes it fundamentally impossible to emulate real browser network behavior from pure JavaScript.\n>\n> - **HTTP/1 over TLS**\n>\n>   Node.js HTTP clients normalize headers to lowercase internally, which is compliant with HTTP/2 semantics but breaks compatibility with some **WAFs** that enforce case-sensitive header validation on **HTTP/1** requests. This wrapper preserves header case exactly as specified, preventing requests from being silently rejected.\n>\n> - **HTTP/2 over TLS**\n>\n>   Fingerprints like **JA3**, **JA4**, and **Akamai HTTP/2** are derived from the specifics of the TLS handshake and HTTP/2 SETTINGS frames — cipher suite ordering, TLS extensions, ALPN values, HPACK header compression parameters, and more. Node.js exposes none of these through its `tls` or `http2` APIs. You simply cannot spoof them from JS land, no matter the library. This package solves that at the native layer, giving you fine-grained control over TLS and HTTP/2 extensions to precisely match real browser behavior.\n>\n> - **Device Emulation**\n>\n>   Because TLS and HTTP/2 fingerprints evolve slowly relative to browser release cycles, a single fingerprint profile often covers many browser versions. **100+ pre-built browser device profiles** are bundled, so you don't have to figure out the right combination of settings yourself.\n\nTLS and HTTP/2 fingerprinting is actively used by major bot protection and WAF providers — including **Cloudflare** Bot Management, **AWS WAF** (Bot Control + CloudFront JA3 headers), **Google Cloud Armor**, **Akamai** (which maintains its own HTTP/2 fingerprint format on top of JA3/JA4), **ServicePipe** (a Russian DDoS protection and WAF provider), and various specialized anti-bot services like **DataDome** and **PerimeterX**. Correctly emulating a browser's TLS handshake and HTTP/2 SETTINGS frames is a hard requirement to get past these layers undetected.\n\n<img src=\"https://engineering.salesforce.com/wp-content/uploads/2022/05/salesforce-icon.png?w=32\" width=\"16\"/> [**TLS Fingerprinting with JA3 and JA3S**](https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/)\n\n<img src=\"https://developers.cloudflare.com/favicon.png\" width=\"16\"/> [**JA3/JA4 Fingerprint — Cloudflare Bot Solutions**](https://developers.cloudflare.com/bots/additional-configurations/ja3-ja4-fingerprint/)\n\n<img src=\"https://www.browserless.io/favicon.ico\" width=\"16\"/> [**TLS Fingerprinting: How It Works & How to Bypass It**](https://www.browserless.io/blog/tls-fingerprinting-explanation-detection-and-bypassing-it-in-playwright-and-puppeteer)\n\n> [!NOTE]\n> This only covers the transport layer. It does not help bypass JavaScript-based challenges (Cloudflare Turnstile, Akamai sensor data, Kasada, etc.), CAPTCHA, or behavioral analysis — those require a different approach entirely\n\n## install\n\n```bash\nnpm install node-wreq\n```\n\nNode.js 20+ is required.\n\n## contents\n\n#### ⚡   **[quick start](#quick-start)**\n#### 🌐   **[fetch](#fetch)**\n#### 🧩   **[client](#client)** — shared defaults, reusable config.\n#### 🎭   **[browser profiles](#browser-profiles)**\n#### 🪝   **[hooks](#hooks)** — request lifecycle, dynamic auth, retries, etc.\n#### 🍪   **[cookies and sessions](#cookies)**\n#### 🔁   **[redirects and retries](#redirects-and-retries)**\n#### 📊   **[observability](#observability)**\n#### 🚨   **[error handling](#errors)**\n#### 🔌   **[websockets](#websockets)**\n#### 🧪   **[networking / transport knobs](#networking)** — TLS, HTTP/1, HTTP/2 options; header ordering, mTLS and custom CAs; DNS controls.\n\n## ⚡ <a id=\"quick-start\"></a>quick start\n\n```ts\nimport { fetch } from 'node-wreq';\n\nconst response = await fetch('https://httpbin.org/get', {\n  browser: 'chrome_137',\n});\n\nconsole.log(response.status);\nconsole.log(await response.json());\n```\n\nIf you keep repeating config, move to a client:\n\n```ts\nimport { createClient } from 'node-wreq';\n\nconst client = createClient({\n  baseURL: 'https://httpbin.org',\n  browser: 'chrome_137',\n  headers: {\n    'x-client': 'node-wreq',\n  },\n  retry: 2,\n});\n\nconst response = await client.fetch('/anything', {\n  query: { from: 'client' },\n});\n\nconsole.log(response.status);\nconsole.log(await response.json());\n```\n\n## 🌐 <a id=\"fetch\"></a>fetch   ·   [↑](#contents)\n\n### simple GET\n\n```ts\nimport { fetch } from 'node-wreq';\n\nconst response = await fetch('https://httpbin.org/get', {\n  browser: {\n    profile: 'firefox_151',\n    platform: 'linux',\n    http2: true,\n    headers: true,\n  },\n  query: {\n    source: 'node-wreq',\n    debug: true,\n  },\n  timeout: 15_000,\n});\n\nconst body = await response.json();\n\nconsole.log(response.ok);\nconsole.log(body.args);\n```\n\n### JSON POST\n\n```ts\nimport { fetch } from 'node-wreq';\n\nconst response = await fetch('https://api.example.com/items', {\n  method: 'POST',\n  browser: 'chrome_137',\n  headers: {\n    'content-type': 'application/json',\n  },\n  body: JSON.stringify({\n    name: 'example',\n    enabled: true,\n  }),\n  throwHttpErrors: true,\n});\n\nconsole.log(await response.json());\n```\n\n### upload `FormData`\n\n`FormData` request bodies work like `fetch`. By default, `node-wreq` generates a\n`----WebKitFormBoundary...` boundary so the multipart envelope matches browser traffic as well as\nthe TLS and HTTP fingerprints do. File parts are encoded by native `wreq` multipart support and\nstreamed with backpressure instead of buffering the complete form in memory.\n\n```ts\nconst formData = new FormData();\n\nformData.append('alpha', '1');\nformData.append('upload', new File(['hello'], 'hello.txt', { type: 'text/plain' }));\n\nconst response = await fetch('https://api.example.com/upload', {\n  method: 'POST',\n  body: formData,\n  // Optional: multipartBoundary: '----my-explicit-boundary',\n});\n\nconsole.log(await response.json());\n```\n\n### build a `Request` first\n\n```ts\nimport { Request, fetch } from 'node-wreq';\n\nconst request = new Request('https://httpbin.org/post', {\n  method: 'POST',\n  headers: {\n    'content-type': 'application/json',\n  },\n  body: JSON.stringify({ via: 'Request' }),\n});\n\nconst response = await fetch(request, {\n  browser: 'chrome_137',\n});\n\nconsole.log(await response.json());\n```\n\n### read extra metadata\n\n`fetch()` returns a fetch-style `Response`, plus extra metadata under `response.wreq`.\n\n```ts\nconst response = await fetch('https://example.com', {\n  browser: 'chrome_137',\n});\n\nconsole.log(response.status);\nconsole.log(response.headers.get('content-type'));\n\nconsole.log(response.wreq.cookies);\nconsole.log(response.wreq.setCookies);\nconsole.log(response.wreq.timings);\nconsole.log(response.wreq.redirectChain);\n```\n\nIf you need a Node stream instead of a WHATWG stream:\n\n```ts\nconst readable = response.wreq.readable();\n\nreadable.pipe(process.stdout);\n```\n\n## 🧩 <a id=\"client\"></a>client   ·   [↑](#contents)\n\nUse `createClient(...)` when requests share defaults. A client also owns reusable native connection\nand TLS-session pools; it is not just a JavaScript defaults wrapper.\n\n- `baseURL`\n- browser profile\n- headers\n- proxy\n- timeout\n- hooks\n- retry policy\n- cookie jar\n\n### shared defaults\n\n```ts\nimport { createClient } from 'node-wreq';\n\nconst client = createClient({\n  baseURL: 'https://api.example.com',\n  browser: 'chrome_137',\n  timeout: 10_000,\n  headers: {\n    authorization: `Bearer ${process.env.API_TOKEN}`,\n  },\n  retry: {\n    limit: 2,\n    statusCodes: [429, 503],\n  },\n});\n\nconst users = await client.get('/users');\n\nconsole.log(await users.json());\n\nconst created = await client.post(\n  '/users',\n  JSON.stringify({ email: 'user@example.com' }),\n  {\n    headers: {\n      'content-type': 'application/json',\n    },\n  }\n);\n\nconsole.log(created.status);\n\n// Optional for long-lived processes; pooled resources are also released after GC.\nclient.close();\n```\n\n### extend a client\n\n```ts\nconst base = createClient({\n  baseURL: 'https://api.example.com',\n  browser: 'chrome_137',\n});\n\nconst admin = base.extend({\n  headers: {\n    authorization: `Bearer ${process.env.ADMIN_TOKEN}`,\n  },\n});\n\nawait base.get('/health');\nawait admin.get('/admin/stats');\n```\n\n## 🎭 <a id=\"browser-profiles\"></a>browser profiles   ·   [↑](#contents)\n\nInspect the available profiles at runtime:\n\n```ts\nimport { getProfiles } from 'node-wreq';\n\nconsole.log(getProfiles());\n```\n\nThere is also `BROWSER_PROFILES` if you want the generated list directly.\n\nTypical profiles include browser families like:\n\n- Chrome\n- Edge\n- Firefox\n- Safari\n- Opera\n- OkHttp\n\nThe current upstream snapshot includes the newest profiles through `chrome_149`, `edge_148`,\n`firefox_151`, `opera_131`, and `safari_26_4`. When `browser` is omitted, `chrome_149` is used.\n\nYou can also select a platform explicitly or ask upstream to choose a profile automatically:\n\n```ts\nawait fetch('https://example.com', {\n  browser: {\n    profile: 'chrome_149',\n    platform: 'windows',\n    // Optional component switches from upstream's Emulation builder:\n    http2: true,\n    headers: true,\n  },\n});\n\nawait fetch('https://example.com', {\n  browser: { mode: 'random' },\n});\n\nawait fetch('https://example.com', {\n  // Uses current browser-market-share weights and valid browser/platform pairings.\n  browser: { mode: 'weighted-random' },\n});\n```\n\nSet `browser.http2` to `false` when you want the selected TLS/profile identity without its\nHTTP/2 fingerprint settings. Set `browser.headers` to `false` to omit the profile's default\nheaders and header ordering; the top-level `disableDefaultHeaders` option remains a convenient\nrequest-wide equivalent for the latter.\n\n## 🪝 <a id=\"hooks\"></a>hooks   ·   [↑](#contents)\n\nHooks are the request pipeline.\n\nAvailable phases:\n\n- `init`\n- `beforeRequest`\n- `afterResponse`\n- `beforeRetry`\n- `beforeError`\n- `beforeRedirect`\n\n### common pattern: auth, tracing, proxy rotation\n\n```ts\nimport { createClient } from 'node-wreq';\n\nconst client = createClient({\n  baseURL: 'https://example.com',\n  retry: {\n    limit: 2,\n    statusCodes: [429, 503],\n    backoff: ({ attempt }) => attempt * 250,\n  },\n  hooks: {\n    init: [\n      ({ options, state }) => {\n        options.query = { ...options.query, source: 'hook-init' };\n\n        state.startedAt = Date.now();\n      },\n    ],\n    beforeRequest: [\n      ({ request, options, state }) => {\n        request.headers.set('x-trace-id', crypto.randomUUID());\n        request.headers.set('authorization', `Bearer ${getAccessToken()}`);\n\n        options.proxy = pickProxy();\n\n        state.lastProxy = options.proxy;\n      },\n    ],\n    beforeRetry: [\n      ({ options, attempt, error, state }) => {\n        options.proxy = pickProxy(attempt);\n\n        console.log('retrying', {\n          attempt,\n          proxy: options.proxy,\n          previousProxy: state.lastProxy,\n          error,\n        });\n      },\n    ],\n    beforeError: [\n      ({ error, state }) => {\n        error.message = `[trace=${String(state.startedAt)}] ${error.message}`;\n\n        return error;\n      },\n    ],\n  },\n});\n```\n\n### replace a response in `afterResponse`\n\n```ts\nimport { Response, fetch } from 'node-wreq';\n\nconst response = await fetch('https://example.com/account', {\n  hooks: {\n    afterResponse: [\n      async ({ response }) => {\n        if (response.status === 401) {\n          return new Response(JSON.stringify({ guest: true }), {\n            status: 200,\n            headers: {\n              'content-type': 'application/json',\n            },\n            url: response.url,\n          });\n        }\n      },\n    ],\n  },\n});\n\nconsole.log(await response.json());\n```\n\n### mutate redirect hops\n\n```ts\nawait fetch('https://example.com/login', {\n  hooks: {\n    beforeRedirect: [\n      ({ request, nextUrl, redirectCount }) => {\n        request.headers.set('x-redirect-hop', String(redirectCount));\n        request.headers.set('x-next-url', nextUrl);\n      },\n    ],\n  },\n});\n```\n\nRule of thumb:\n\n- use hooks for dynamic behavior\n- use client defaults for static behavior\n\n## 🍪 <a id=\"cookies\"></a>cookies and sessions   ·   [↑](#contents)\n\n`node-wreq` does not force a built-in cookie store.\n\nYou provide a `cookieJar` with two methods:\n\n- `getCookies(url)`\n- `setCookie(cookie, url)`\n\nThat jar can be:\n\n- in-memory\n- `tough-cookie`\n- Redis-backed\n- DB-backed\n- anything else that matches the interface\n\n### tiny in-memory jar\n\n```ts\nimport { fetch, websocket } from 'node-wreq';\n\nconst jarStore = new Map<string, string>();\n\nconst cookieJar = {\n  getCookies() {\n    return [...jarStore.entries()].map(([name, value]) => ({\n      name,\n      value,\n    }));\n  },\n  setCookie(cookie: string) {\n    const [pair] = cookie.split(';');\n    const [name, value = ''] = pair.split('=');\n\n    jarStore.set(name, value);\n  },\n};\n\nawait fetch('https://example.com/login', { cookieJar });\nawait fetch('https://example.com/profile', { cookieJar });\nawait websocket('wss://example.com/ws', { cookieJar });\n```\n\n### `tough-cookie`\n\n```bash\nnpm install tough-cookie\n```\n\n```ts\nimport { CookieJar as ToughCookieJar } from 'tough-cookie';\nimport { createClient } from 'node-wreq';\n\nconst toughJar = new ToughCookieJar();\n\nconst cookieJar = {\n  async getCookies(url: string) {\n    const cookies = await toughJar.getCookies(url);\n\n    return cookies.map((cookie) => ({\n      name: cookie.key,\n      value: cookie.value,\n    }));\n  },\n  async setCookie(cookie: string, url: string) {\n    await toughJar.setCookie(cookie, url);\n  },\n};\n\nconst client = createClient({\n  browser: 'chrome_137',\n  cookieJar,\n});\n\nawait client.fetch('https://example.com/login');\nawait client.fetch('https://example.com/profile');\n```\n\n### inspect cookies on a response\n\n```ts\nimport { fetch } from 'node-wreq';\n\nconst response = await fetch('https://example.com/login', { cookieJar });\n\nconsole.log(response.wreq.setCookies);\nconsole.log(response.wreq.cookies);\n```\n\n## 🔁 <a id=\"redirects-and-retries\"></a>redirects and retries   ·   [↑](#contents)\n\nBoth are opt-in controls on top of the normal request pipeline.\n\n### manual redirects\n\n```ts\nconst response = await fetch('https://example.com/login', {\n  redirect: 'manual',\n});\n\nconsole.log(response.status);\nconsole.log(response.headers.get('location'));\nconsole.log(response.redirected);\n```\n\nModes:\n\n- `follow` - default redirect following\n- `manual` - return the redirect response as-is\n- `error` - throw on the first redirect\n\nUseful redirect facts:\n\n- `response.wreq.redirectChain` records followed hops\n- `301` / `302` rewrite `POST` to `GET`\n- `303` rewrites to `GET` unless current method is `HEAD`\n- `307` / `308` preserve method and body\n\n### simple retries\n\n```ts\nconst response = await fetch('https://example.com', {\n  retry: 2,\n});\n```\n\n### explicit retry policy\n\n```ts\nconst response = await fetch('https://example.com', {\n  retry: {\n    limit: 3,\n    statusCodes: [429, 503],\n    backoff: ({ attempt }) => attempt * 500,\n  },\n});\n```\n\n### custom retry decision\n\n```ts\nimport { TimeoutError, fetch } from 'node-wreq';\n\nconst response = await fetch('https://example.com', {\n  retry: {\n    limit: 5,\n    shouldRetry: ({ error, response }) => {\n      if (response?.status === 429) {\n        return true;\n      }\n\n      return error instanceof TimeoutError;\n    },\n  },\n});\n```\n\nDefaults:\n\n- retry is off unless you enable it\n- default retry methods are `GET` and `HEAD`\n- default status codes include `408`, `425`, `429`, `500`, `502`, `503`, `504`\n- default error codes include `ECONNRESET`, `ECONNREFUSED`, `ETIMEDOUT`, `ERR_TIMEOUT`\n\n## 📊 <a id=\"observability\"></a>observability   ·   [↑](#contents)\n\nTwo main surfaces:\n\n- `response.wreq.timings`\n- `onStats(stats)`\n\n### per-request stats callback\n\n```ts\nawait fetch('https://example.com', {\n  onStats: ({ attempt, timings, response, error }) => {\n    console.log({\n      attempt,\n      wait: timings.wait,\n      total: timings.total,\n      status: response?.status,\n      error,\n    });\n  },\n});\n```\n\n### read timings from the final response\n\n```ts\nconst response = await fetch('https://example.com', {\n  browser: 'chrome_137',\n});\n\nconsole.log(response.wreq.timings);\n```\n\nCurrent timings are wrapper-level timings that are still useful in practice:\n\n- request start\n- response available\n- total time when body consumption is known\n\n## 🚨 <a id=\"errors\"></a>error handling   ·   [↑](#contents)\n\nMain error classes:\n\n- `RequestError`\n- `HTTPError`\n- `TimeoutError`\n- `AbortError`\n- `WebSocketError`\n- `ERR_DNS`\n\nTypical patterns:\n\n```ts\nimport { HTTPError, TimeoutError, fetch } from 'node-wreq';\n\ntry {\n  await fetch('https://example.com', {\n    timeout: 1_000,\n    throwHttpErrors: true,\n  });\n} catch (error) {\n  if (error instanceof TimeoutError) {\n    console.error('request timed out');\n  } else if (error instanceof HTTPError) {\n    console.error('bad status', error.statusCode);\n  } else {\n    console.error(error);\n  }\n}\n```\n\n## 🔌 <a id=\"websockets\"></a>websockets   ·   [↑](#contents)\n\nYou can use either:\n\n- `await websocket(url, init?)`\n- `new WebSocket(url, init?)`\n\n### simple helper\n\n```ts\nimport { websocket } from 'node-wreq';\n\nconst socket = await websocket('wss://echo.websocket.events', {\n  browser: 'chrome_137',\n  protocols: ['chat'],\n});\n\nsocket.addEventListener('message', (event) => {\n  console.log('message:', event.data);\n});\n\nsocket.send('hello');\n```\n\n### WHATWG-like constructor\n\n```ts\nimport { WebSocket } from 'node-wreq';\n\nconst socket = new WebSocket('wss://example.com/ws', {\n  binaryType: 'arraybuffer',\n});\n\nawait socket.opened;\n\nsocket.onmessage = (event) => {\n  if (event.data instanceof ArrayBuffer) {\n    console.log(new Uint8Array(event.data));\n  }\n};\n\nsocket.send(new Uint8Array([1, 2, 3]));\nsocket.close(1000, 'done');\n```\n\n### websocket from a client\n\nUseful when you want shared defaults like browser, proxy, or cookies:\n\n```ts\nconst client = createClient({\n  browser: 'chrome_137',\n  cookieJar: yourCookieJar,\n});\n\nconst socket = await client.websocket('wss://example.com/ws');\n```\n\nNotes:\n\n- cookies from `cookieJar` are sent during handshake\n- duplicate subprotocols are rejected\n- `httpVersion: '1.1' | '2'` explicitly selects the handshake HTTP version\n\n## 🧪 <a id=\"networking\"></a>networking / transport knobs   ·   [↑](#contents)\n\nThis is the \"transport nerd\" section.\n\nEverything else here is for debugging request shape, fingerprint-sensitive targets, or testing transport hypotheses.\n\n### browser profile + proxy + timeout\n\n```ts\nconst response = await fetch('https://httpbin.org/anything', {\n  browser: 'chrome_137',\n  proxy: 'http://username:password@proxy.example.com:8080',\n  timeout: 10_000,\n});\n```\n\nIf you want to bypass env/system proxy detection for a specific request, use `proxy: false`:\n\n```ts\nawait fetch('https://example.com', {\n  proxy: false,\n});\n```\n\n### disable default browser-like headers\n\nBy default, `node-wreq` may apply profile-appropriate default headers.\n\n`disableDefaultHeaders: true` disables those browser/profile preset headers only.\n\nThat means it turns off headers injected by the selected browser emulation, such as:\n\n- `user-agent`\n- `accept`\n- `accept-language`\n- `sec-ch-ua`\n- `sec-ch-ua-mobile`\n- `sec-ch-ua-platform`\n- `sec-fetch-dest`\n- `sec-fetch-mode`\n- `sec-fetch-site`\n- `priority`\n\nThe exact set varies by profile.\n\nIt does **not** disable protocol or transport-level headers that may still appear automatically, such as:\n\n- `host`\n- `accept-encoding` when `compress` is enabled\n- `content-length` when the request body requires it\n- `content-type` generated by the runtime for bodies like `FormData`\n\nIt also does not remove headers you set explicitly yourself.\n\nIf you want full manual control:\n\n```ts\nawait fetch('https://example.com', {\n  disableDefaultHeaders: true,\n  headers: {\n    accept: '*/*',\n    'user-agent': 'custom-client',\n  },\n});\n```\n\nFor example, with `browser: 'chrome_137'`, the default request would normally include Chrome-like `sec-ch-*`, `sec-fetch-*`, `user-agent`, `accept`, and `accept-language` headers. With `disableDefaultHeaders: true`, those browser preset headers are skipped, while transport headers like `host` and `accept-encoding` may still be present.\n\n### exact header order\n\nUse tuples when header order matters.\n\nTuple headers also preserve the original header names exactly as you wrote them on the wire:\n\n```ts\nawait fetch('https://example.com', {\n  headers: [\n    ['x-lower', 'one'],\n    ['X-Mixed', 'two'],\n  ],\n});\n```\n\nFor example, this will preserve both the tuple order and the exact `x-lower` / `X-Mixed` casing you passed.\n\n### lower-level transport tuning\n\nIf a browser preset gets you close but not all the way there:\n\n```ts\nawait fetch('https://example.com', {\n  browser: 'chrome_137',\n  tlsOptions: {\n    greaseEnabled: true,\n    keyShares: ['X25519_MLKEM768', 'X25519', 'P256'],\n  },\n  http1Options: {\n    writev: true,\n  },\n  http2Options: {\n    adaptiveWindow: false,\n    maxConcurrentStreams: 64,\n  },\n});\n```\n\nUse these only when:\n\n- a target is still picky after choosing a browser profile\n- you are comparing transport behavior\n- you want to debug fingerprint mismatches\n\nCustom TLS/HTTP1/HTTP2 options are overlaid on the selected browser profile. Unspecified profile\nsettings remain intact.\n\n### native connection and TLS-session pools\n\n`createClient()` reuses the underlying native `wreq::Client`, including HTTP keep-alive connections\nand TLS sessions. Builder-affecting per-request overrides automatically get an isolated client\nvariant so a proxy, DNS, TLS, or browser change cannot reuse an incompatible pool.\n\n```ts\nconst client = createClient({\n  baseURL: 'https://api.example.com',\n  poolIdleTimeout: 90_000,\n  poolMaxIdlePerHost: 8,\n  poolMaxSize: 128,\n  tlsSessionCacheCapacity: 8,\n  tcpLinger: 5_000,\n});\n\nawait client.get('/account', {\n  // Requests in different groups never share pooled connections.\n  connectionGroup: 'account-session',\n});\n\nconst response = await client.get('/health', {\n  // Static form: discard this request's connection after the response.\n  forbidConnectionReuse: true,\n});\n\n// Conditional form: call before consuming the body.\nresponse.wreq.forbidConnectionReuse();\n\nclient.close();\n```\n\nSet `poolIdleTimeout: false` to disable idle expiry. `connectionGroup` accepts a string or a\nnon-negative integer. `tcpLinger` configures `SO_LINGER` in milliseconds; `0` requests an abortive\nclose with TCP `RST`, while omitting the option keeps the operating-system default.\n\n### mTLS and custom CAs\n\nUse `tlsIdentity` for client certificate authentication and `ca` for a custom trust store:\n\n```ts\nimport { fetch } from 'node-wreq';\nimport { readFileSync } from 'node:fs';\n\nawait fetch('https://mtls.example.com', {\n  tlsIdentity: {\n    cert: readFileSync('./client-cert.pem'),\n    key: readFileSync('./client-key.pem'),\n  },\n  ca: {\n    cert: readFileSync('./ca.pem'),\n    includeDefaultRoots: false,\n  },\n});\n```\n\nPKCS#12 / PFX identities are also supported:\n\n```ts\nawait fetch('https://mtls.example.com', {\n  tlsIdentity: {\n    pfx: readFileSync('./client-identity.p12'),\n    passphrase: 'secret',\n  },\n  ca: {\n    cert: readFileSync('./ca.pem'),\n    includeDefaultRoots: false,\n  },\n});\n```\n\nFor TLS diagnostics, you can ask for peer certificate metadata on the response or write TLS session keys to a file for tools like Wireshark:\n\n```ts\nconst response = await fetch('https://mtls.example.com', {\n  tlsDebug: {\n    peerCertificates: true,\n    keylog: {\n      path: '/tmp/node-wreq.keys',\n    },\n  },\n});\n\nconsole.log(response.wreq.tls?.peerCertificate);\nconsole.log(response.wreq.tls?.peerCertificateChain);\n```\n\nUnsafe TLS overrides are separate and explicit:\n\n```ts\nawait fetch('https://staging.internal.example', {\n  tlsDanger: {\n    certVerification: false,\n    verifyHostname: false,\n    sni: false,\n  },\n});\n```\n\n### compression\n\nCompression is enabled by default.\n\nThat includes `gzip`, `br`, `deflate`, and `zstd` response decoding when the server supports them.\n\nDisable it if you need stricter control over response handling:\n\n```ts\nawait fetch('https://example.com/archive', {\n  compress: false,\n});\n```\n\n### DNS controls\n\nUse `dns.hosts` to pin hostnames to specific IPs, or `dns.servers` to send lookups through specific nameservers:\n\n```ts\nawait fetch('https://api.internal.test/health', {\n  dns: {\n    servers: ['1.1.1.1', '8.8.8.8'],\n    hosts: {\n      'api.internal.test': ['127.0.0.1'],\n    },\n  },\n});\n```\n\nUse `dns.doh` to resolve request hostnames through DNS-over-HTTPS:\n\n```ts\nawait fetch('https://example.com', {\n  dns: {\n    doh: 'https://cloudflare-dns.com/dns-query',\n  },\n});\n```\n\nUse `dns.dot` to resolve request hostnames through DNS-over-TLS:\n\n```ts\nawait fetch('https://example.com', {\n  dns: {\n    dot: 'tls://one.one.one.one',\n  },\n});\n```\n\n`dns.doh` and `dns.dot` are mutually exclusive. When either encrypted DNS mode is set,\n`dns.servers` are used only to resolve the encrypted DNS endpoint hostname. If `dns.servers`\nare omitted, the endpoint is resolved with the system DNS settings.\n\n```ts\nawait fetch('https://example.com', {\n  dns: {\n    doh: 'https://cloudflare-dns.com/dns-query',\n    servers: ['9.9.9.9'],\n  },\n});\n```\n","readmeFilename":"README.md"}