{"_id":"148tls-fetch","_rev":"2-1f902f5c9ffe50e34a0574e371ab8037","name":"148tls-fetch","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"148tls-fetch","version":"0.1.0","keywords":["tls","fingerprint","ja3","ja4","chrome","impersonate","curl-cffi","http2","boringssl"],"license":"MIT","_id":"148tls-fetch@0.1.0","maintainers":[{"name":"higuchan123","email":"qingshaonayan26@gmail.com"}],"os":["win32"],"cpu":["x64"],"dist":{"shasum":"800b5b5255b53b26d37a0997942e4aaef149eb92","tarball":"https://registry.npmjs.org/148tls-fetch/-/148tls-fetch-0.1.0.tgz","fileCount":8,"integrity":"sha512-uXBMr2HEXjdLHY41Dvt5E1ljxkOCCScE1LA/a/E8Mg9NkYXZ/aVGSXdnKmz+sviCEGe73qzK9Sf2aJRv6hnG2g==","signatures":[{"sig":"MEYCIQDvbTdjcHeWssSf+1c+bJZZPElBbI5Nj69ajrk34ZYbMwIhALLZSp3ZfaPMl2GG8KUFjVK73V9aCwxEsfZu20a00GuB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7345410},"main":"tls_fetch.js","types":"tls_fetch.d.ts","engines":{"node":">=18"},"_npmUser":{"name":"higuchan123","email":"qingshaonayan26@gmail.com"},"_npmVersion":"11.12.1","description":"curl_cffi-like HTTP client with a real Chrome 148 TLS + HTTP/2 fingerprint (Rust/BoringSSL via napi-rs). Windows x64.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/148tls-fetch_0.1.0_1779544571398_0.008172398450645435","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"148tls-fetch","version":"0.1.1","description":"curl_cffi-like HTTP client with a real Chrome 148 TLS + HTTP/2 fingerprint (Rust/BoringSSL via napi-rs). Windows x64.","main":"tls_fetch.js","types":"tls_fetch.d.ts","os":["win32"],"cpu":["x64"],"engines":{"node":">=18"},"keywords":["tls","fingerprint","ja3","ja4","chrome","impersonate","curl-cffi","http2","boringssl"],"license":"MIT","_id":"148tls-fetch@0.1.1","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-cOA3sfEfDW0kh1cGLl4d6Wz4EF5dnIgarZFOOIQuPgxNGncwLhq7FUJroirxDVegOilbJlzzsZJijswbKsSdtA==","shasum":"c967e35b29fe06fd9d7952c3661ef54fb0051f66","tarball":"https://registry.npmjs.org/148tls-fetch/-/148tls-fetch-0.1.1.tgz","fileCount":8,"unpackedSize":7346436,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGtPhHQ2j7yJQyQQVTI81HpeRQuOqM6c4xZUSGegubA9AiEA8dLBIZVnH6F4HHUtrWub8Tz2PeB06vCwWLGSAuyWqOU="}]},"_npmUser":{"name":"higuchan123","email":"qingshaonayan26@gmail.com"},"directories":{},"maintainers":[{"name":"higuchan123","email":"qingshaonayan26@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/148tls-fetch_0.1.1_1779545742978_0.8321206156818604"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-23T13:56:11.333Z","modified":"2026-05-23T14:15:43.333Z","0.1.0":"2026-05-23T13:56:11.656Z","0.1.1":"2026-05-23T14:15:43.225Z"},"license":"MIT","keywords":["tls","fingerprint","ja3","ja4","chrome","impersonate","curl-cffi","http2","boringssl"],"description":"curl_cffi-like HTTP client with a real Chrome 148 TLS + HTTP/2 fingerprint (Rust/BoringSSL via napi-rs). Windows x64.","maintainers":[{"name":"higuchan123","email":"qingshaonayan26@gmail.com"}],"readme":"# 148tls-fetch\n\ncurl_cffi-like HTTP client emitting a **real Chrome 148** TLS ClientHello + HTTP/2 fingerprint.\nEngine: Rust (`wreq` / BoringSSL) compiled to a native Node addon via napi-rs.\n\n**Platform: Windows x64 only.** (`os: win32`, `cpu: x64`)\n\n## Install\n\n```sh\nnpm install 148tls-fetch\n```\n\n## Usage\n\n```js\nconst { CurlSession, Curl, CurlOpt, CurlInfo } = require(\"148tls-fetch\");\n\nconst s = new CurlSession({ impersonate: \"chrome148\", proxy: \"http://user:pass@host:port\" });\n\nconst r = await s.get(\"https://x.com/\", {\n  headers: { \"User-Agent\": \"Mozilla/5.0 ... Chrome/148.0.0.0 Safari/537.36\" },\n  timeout: 20000,\n});\nconsole.log(r.status, r.text.length);\n// r = { status, url, text, data, dataRaw(Buffer), headers, headersList }\n\n// cookies persist in s.jar across requests automatically\ns.jar.setCookieSync(\"auth_token=...; Domain=.x.com; Path=/; Secure\", \"https://x.com/\");\n\nconst post = await s.post(\"https://api.example.com/x\", JSON.stringify({ a: 1 }), {\n  headers: { \"Content-Type\": \"application/json\" },\n});\n```\n\n### Low-level handle (curl-cffi `Curl` style)\n\n```js\nconst c = new Curl();\nc.impersonate(\"chrome148\", false);\nc.setOption(CurlOpt.Url, \"https://example.com/\");\nc.setOption(CurlOpt.HttpGet, true);\nc.setHeadersRaw([\"User-Agent: ...\", \"Accept: application/json\"]);\nawait c.perform();\nc.status();                                  // HTTP status\nc.getRespBody();                             // Buffer\nc.getInfoString(CurlInfo.EffectiveUrl);      // final URL after redirects\nc.close();\n```\n\n## Fingerprint\n\nMatches real Chrome 148 on JA4, HTTP/2 Akamai, cipher list, supported groups, and extension set.\n(JA3 hash intentionally varies — Chrome 110+ randomizes TLS extension order each handshake; JA4 is the stable identifier.)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}