@emircansahin/ghostfetch 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,16 +6,11 @@ Built for backend developers who need to fetch data from sites that aggressively
6
6
 
7
7
  ## Features
8
8
 
9
- - **CycleTLS** — TLS fingerprint spoofing (bypasses Cloudflare and similar WAFs)
10
- - **Proxy rotation** — random proxy selection per request with automatic health check
11
- - **Smart error classification** — proxy vs server vs ambiguous errors
12
- - **Proxy banning** — auto-ban failing proxies with configurable TTL
13
- - **Custom interceptors** — per-site response handling (`retry`, `ban`, `skip`)
14
- - **Default status handling** — 429/503 auto-retry, 407 proxy ban
9
+ - **CycleTLS** — TLS fingerprint spoofing (JA3, JA4R, HTTP/2, QUIC)
10
+ - **Proxy rotation** — random proxy selection with health check, banning, and country filtering
11
+ - **Smart retry** — auto-retry on 429/503, custom interceptors for per-site logic
15
12
  - **Cloudflare detection** — JS challenge detection with descriptive errors
16
- - **Country-based proxy selection** — auto-resolved via ipinfo.io
17
- - **forceProxy mode** — wait for available proxy instead of proceeding without one
18
- - **Health check on init** — dead proxies are discarded before any request
13
+ - **Protocol control** — force HTTP/1.1 or HTTP/3, disable redirects, header ordering
19
14
 
20
15
  ## Install
21
16
 
@@ -36,164 +31,169 @@ const client = new GhostFetch({
36
31
  'http://user:pass@host:8002',
37
32
  ],
38
33
  timeout: 30000,
39
- retry: { delays: [5000, 15000, 30000] }, // 3 retries: wait 5s, 15s, 30s
34
+ retry: { delays: [5000, 15000, 30000] },
40
35
  ban: { maxFailures: 3, duration: 60 * 60 * 1000 },
41
36
  // ban: false — disable proxy banning entirely
42
37
  });
43
38
 
44
- // Wait for health check to complete
45
39
  const health = await client.ready();
46
- console.log(health);
47
40
  // { total: 2, healthy: 2, dead: 0, countries: { US: 1, DE: 1 }, proxies: { ... } }
48
41
 
49
- // Make requests
50
42
  const res = await client.get('https://api.example.com/data');
51
43
  console.log(res.status, res.body);
52
44
  ```
53
45
 
54
- ## Custom Interceptors
46
+ ## TLS Fingerprinting & Advanced Options
55
47
 
56
- Interceptors let you define per-site response handling. You can add them at the instance level (applies to all matching requests) or at the request level (applies to that single request only).
48
+ All fingerprint options are **config-level only** they define the client identity and apply to every request. Other options can be set at config level (default) and overridden per-request.
57
49
 
58
- ### Instance-level interceptor
50
+ **Getting your fingerprint:** Open your browser and visit [`https://tls.peet.ws/api/all`](https://tls.peet.ws/api/all). The JSON response contains everything you need:
59
51
 
60
- Matches requests by URL. First matching interceptor takes full ownership — default status handling (429, 503, etc.) is bypassed.
52
+ | peet.ws field | GhostFetch option |
53
+ |---|---|
54
+ | `tls.ja3` | `ja3` |
55
+ | `tls.ja4_r` | `ja4r` |
56
+ | `http2.akamai_fingerprint` | `http2Fingerprint` |
57
+ | `user_agent` | `userAgent` |
58
+ | `http2.sent_frames[2].headers` | `headerOrder` (exclude pseudo-headers like `:method`, `:path`) |
61
59
 
62
60
  ```ts
61
+ const client = new GhostFetch({
62
+ // Copy these from tls.peet.ws (use the same browser for all values)
63
+ ja3: '771,4865-4866-4867-...',
64
+ ja4r: 't13d1516h2_002f,0035,...',
65
+ http2Fingerprint: '1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p',
66
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
67
+ headerOrder: ['upgrade-insecure-requests', 'user-agent', 'accept', 'accept-encoding', 'accept-language'],
68
+
69
+ // Protocol & behavior (config default, overridable per-request)
70
+ disableRedirect: false,
71
+ insecureSkipVerify: false,
72
+ cookies: { session: 'abc123' },
73
+ });
74
+
75
+ // Per-request override
76
+ await client.get('https://example.com', {
77
+ disableRedirect: true,
78
+ cookies: [{ name: 'token', value: 'xyz', domain: '.example.com' }],
79
+ serverName: 'cdn.example.com',
80
+ });
81
+ ```
82
+
83
+ > **Important:** All fingerprint values (`ja3`, `ja4r`, `http2Fingerprint`, `userAgent`) must come from the same browser. Mixing Chrome JA3 with Firefox User-Agent is a common detection vector.
84
+
85
+ | Option | Config | Per-request | Default | What it does |
86
+ |--------|:------:|:-----------:|---------|-------------|
87
+ | `ja3` / `ja4r` | yes | — | auto | TLS ClientHello fingerprint |
88
+ | `http2Fingerprint` | yes | — | auto | HTTP/2 SETTINGS frame fingerprint |
89
+ | `quicFingerprint` | yes | — | auto | QUIC transport parameters fingerprint |
90
+ | `disableGrease` | yes | — | `false` | Disable random GREASE values |
91
+ | `headerOrder` | yes | yes | auto | Control header send order |
92
+ | `orderAsProvided` | yes | yes | `false` | Send headers in provided order |
93
+ | `forceHTTP1` / `forceHTTP3` | yes | yes | `false` | Force protocol version |
94
+ | `disableRedirect` | yes | yes | `false` | Return 3xx instead of following |
95
+ | `insecureSkipVerify` | yes | yes | `false` | Skip TLS cert validation |
96
+ | `serverName` | yes | yes | from URL | Override TLS SNI hostname |
97
+ | `cookies` | yes | yes | none | Send cookies (per-request replaces config) |
98
+
99
+ ## Request Body
100
+
101
+ ```ts
102
+ // JSON — auto content-type: application/json
103
+ await client.post(url, { body: { key: 'value' } });
104
+
105
+ // Form — auto content-type: application/x-www-form-urlencoded
106
+ await client.post(url, { body: new URLSearchParams({ user: 'foo', pass: 'bar' }) });
107
+
108
+ // Raw string — set content-type yourself
109
+ await client.post(url, { body: '<xml/>', headers: { 'content-type': 'application/xml' } });
110
+ ```
111
+
112
+ ## Custom Interceptors
113
+
114
+ Define per-site response handling. Instance-level interceptors match by URL; request-level interceptors apply to that single request and take priority.
115
+
116
+ ```ts
117
+ // Instance-level
63
118
  client.addInterceptor({
64
119
  name: 'example-api',
65
120
  match: (url) => url.includes('example.com'),
66
121
  check: (res) => {
67
- if (res.status === 401) return 'skip'; // don't retry auth errors
68
- if (res.body.includes('rate limit')) return 'retry'; // retry with different proxy
69
- if (res.body.includes('blocked')) return 'ban'; // ban this proxy + retry
70
- return null; // use default behavior
122
+ if (res.status === 401) return 'skip'; // don't retry
123
+ if (res.body.includes('rate limit')) return 'retry'; // retry, proxy is fine
124
+ if (res.body.includes('blocked')) return 'ban'; // retry + penalize proxy
125
+ return null; // default behavior
71
126
  },
72
127
  });
73
- ```
74
-
75
- ### Request-level interceptor
76
-
77
- No `match` needed — it applies to this specific request. Takes priority over instance-level interceptors.
78
128
 
79
- ```ts
80
- const res = await client.get('https://special-api.com/data', {
129
+ // Request-level (no match needed, takes priority)
130
+ await client.get('https://special-api.com/data', {
81
131
  interceptor: {
82
- check: (res) => {
83
- if (res.status === 401) return 'skip';
84
- if (res.status === 200 && res.body.includes('error')) return 'retry';
85
- return null;
86
- },
132
+ check: (res) => res.status === 401 ? 'skip' : null,
87
133
  },
88
134
  });
89
135
  ```
90
136
 
91
- ### Interceptor priority
92
-
93
- 1. **Request-level interceptor** checked first, if it returns non-null action, it wins
94
- 2. **Instance-level interceptors** checked next, first `match` takes ownership
95
- 3. **Default status handling** only runs if no interceptor claimed the response
96
-
97
- ### Actions
137
+ | Action | Proxy effect | Retry? |
138
+ |--------|-------------|--------|
139
+ | `'retry'` | not penalized | yes |
140
+ | `'ban'` | fail count +1 | yes |
141
+ | `'skip'` | not penalized | no, returns response |
142
+ | `null` | — | falls through to defaults |
98
143
 
99
- | Action | Proxy effect | Retry | Default bypass |
100
- |--------|-------------|-------|----------------|
101
- | `'retry'` | not penalized | yes | yes |
102
- | `'ban'` | fail count +1 | yes | yes |
103
- | `'skip'` | not penalized | no, return response | yes |
104
- | `null` | — | — | no, defaults apply |
144
+ ## Proxy Options
105
145
 
106
- ## Country-Based Proxy Selection
146
+ ### Country selection
107
147
 
108
- All proxies are automatically resolved via ipinfo.io on init. This gives you country-level control over which proxy handles which request — useful when certain APIs only accept traffic from specific regions.
148
+ Proxies are auto-resolved via ipinfo.io on init. Request a specific country:
109
149
 
110
150
  ```ts
111
- // Only use a German proxy for this request
112
- const res = await client.get('https://eu-only-api.com/data', {
113
- country: 'DE',
114
- });
151
+ const res = await client.get('https://eu-only-api.com/data', { country: 'DE' });
115
152
  ```
116
153
 
117
- ## Force Proxy Mode
154
+ ### Force proxy mode
118
155
 
119
- By default, if all proxies are banned or unavailable, requests proceed without a proxy. Enable `forceProxy` to make the request wait until a proxy becomes available (ban expires or proxy list is refreshed). This is useful for cron jobs where requests without a proxy are pointless.
156
+ By default, if all proxies are banned, requests proceed without one. Set `forceProxy: true` to wait until a proxy becomes available.
120
157
 
121
- **What happens when `forceProxy: true` and no proxy is available?**
158
+ ```ts
159
+ const client = new GhostFetch({ proxies: [...], forceProxy: true });
122
160
 
123
- | Scenario | Behavior |
124
- |----------|----------|
125
- | Proxy list is empty (none configured) | Throws `NoProxyAvailableError` immediately — nothing to wait for |
126
- | Proxies exist but all banned | Waits until a ban expires or `onProxyRefresh` provides fresh proxies |
161
+ // Override per-request
162
+ await client.get('https://public-api.com', { forceProxy: false });
163
+ ```
127
164
 
128
- You can set it as the instance default or override per-request:
165
+ ### Proxy refresh
129
166
 
130
167
  ```ts
131
- // Instance default: all requests wait for proxy
132
168
  const client = new GhostFetch({
133
169
  proxies: [...],
134
- forceProxy: true,
135
- });
136
-
137
- // Override per-request: this specific endpoint works without proxy
138
- const publicData = await client.get('https://public-api.com/data', {
139
- forceProxy: false,
170
+ proxyRefreshInterval: 60 * 60 * 1000,
171
+ onProxyRefresh: async () => ['http://user:pass@newhost:8001'],
140
172
  });
141
173
 
142
- // Or the other way: instance default is false, but this request needs a proxy
143
- const protectedData = await client.get('https://protected-api.com/data', {
144
- forceProxy: true,
145
- });
174
+ // Or manual: await client.refreshProxies()
146
175
  ```
147
176
 
148
- ## Disable Proxy Banning
177
+ ### Get available proxies
149
178
 
150
- If your proxy provider handles rotation internally (e.g. BrightData, Oxylabs residential) or you have a small proxy pool you don't want to lose, you can disable banning entirely:
179
+ Retrieve all non-banned proxy URLs. Useful for sharing the proxy pool with other tools (e.g. Puppeteer) while respecting ghostfetch's ban state.
151
180
 
152
181
  ```ts
153
- const client = new GhostFetch({
154
- proxies: [...],
155
- ban: false, // no proxy will ever be banned
156
- });
157
- ```
158
-
159
- With `ban: false`, failed proxies are never penalized — they stay in rotation regardless of errors. Retry still works, just without proxy exclusion logic.
160
-
161
- ## Proxy Refresh
182
+ // All healthy proxies
183
+ const proxies = client.getAvailableProxies();
162
184
 
163
- Provide an `onProxyRefresh` callback to fetch a fresh proxy list from your provider. When triggered, all existing bans are cleared and the new proxies go through health check before entering the pool.
185
+ // Only US proxies
186
+ const usProxies = client.getAvailableProxies({ country: 'US' });
187
+ ```
164
188
 
165
- | Config | Behavior |
166
- |--------|----------|
167
- | `onProxyRefresh` only | No automatic refresh — call `client.refreshProxies()` manually |
168
- | `onProxyRefresh` + `proxyRefreshInterval` | Auto-refresh at the given interval |
169
- | Neither | No refresh capability — initial proxy list is used for the lifetime |
189
+ ### Disable banning
170
190
 
171
191
  ```ts
172
- // Auto-refresh every hour
173
- const client = new GhostFetch({
174
- proxies: [...],
175
- proxyRefreshInterval: 60 * 60 * 1000,
176
- onProxyRefresh: async () => {
177
- return ['http://user:pass@newhost:8001', ...];
178
- },
179
- });
180
-
181
- // Or manual-only: no interval, call when you need it
182
- const client2 = new GhostFetch({
183
- proxies: [...],
184
- onProxyRefresh: async () => fetchFromProvider(),
185
- });
186
- await client2.refreshProxies(); // triggers onProxyRefresh → health check → pool updated
192
+ const client = new GhostFetch({ proxies: [...], ban: false });
187
193
  ```
188
194
 
189
195
  ## Error Handling
190
196
 
191
- ghostfetch throws specific error classes so you can handle each scenario precisely:
192
-
193
- - **`CloudflareJSChallengeError`** — the target site requires a browser-level JS challenge that CycleTLS can't solve. You'll need puppeteer-extra with stealth plugin for this.
194
- - **`NoProxyAvailableError`** — all proxies are banned and `forceProxy` is not enabled, or the proxy list is empty.
195
- - **`MaxRetriesExceededError`** — all retry attempts failed. Contains `.attempts` count and `.lastError` with the final error details.
196
-
197
197
  ```ts
198
198
  import {
199
199
  CloudflareJSChallengeError,
@@ -207,9 +207,6 @@ try {
207
207
  if (err instanceof CloudflareJSChallengeError) {
208
208
  // Needs headless browser (puppeteer-extra with stealth plugin)
209
209
  }
210
- if (err instanceof NoProxyAvailableError) {
211
- // All proxies banned or list empty
212
- }
213
210
  if (err instanceof MaxRetriesExceededError) {
214
211
  console.log(err.attempts, err.lastError);
215
212
  }
@@ -103,6 +103,13 @@ class GhostFetch {
103
103
  bannedProxies: this.proxyManager.banned,
104
104
  };
105
105
  }
106
+ /** Get all non-banned proxy URLs, optionally filtered by country. */
107
+ getAvailableProxies(opts) {
108
+ const proxies = this.proxyManager.getAvailableProxies();
109
+ if (!opts?.country)
110
+ return proxies;
111
+ return proxies.filter((p) => this.proxyManager.getCountry(p) === opts.country.toUpperCase());
112
+ }
106
113
  // --- HTTP methods ---
107
114
  async get(url, options) {
108
115
  return this.request('GET', url, options);
@@ -303,22 +310,60 @@ class GhostFetch {
303
310
  const cycleTLSOptions = {
304
311
  headers,
305
312
  timeout,
306
- disableRedirect: false,
313
+ disableRedirect: options?.disableRedirect ?? this.config.disableRedirect ?? false,
307
314
  };
308
315
  if (proxy) {
309
316
  cycleTLSOptions.proxy = proxy;
310
317
  }
311
- if (this.config.ja3) {
318
+ // Client identity fingerprints (config-only)
319
+ if (this.config.ja3)
312
320
  cycleTLSOptions.ja3 = this.config.ja3;
313
- }
314
- if (this.config.userAgent) {
321
+ if (this.config.userAgent)
315
322
  cycleTLSOptions.userAgent = this.config.userAgent;
316
- }
323
+ if (this.config.ja4r)
324
+ cycleTLSOptions.ja4r = this.config.ja4r;
325
+ if (this.config.http2Fingerprint)
326
+ cycleTLSOptions.http2Fingerprint = this.config.http2Fingerprint;
327
+ if (this.config.quicFingerprint)
328
+ cycleTLSOptions.quicFingerprint = this.config.quicFingerprint;
329
+ if (this.config.disableGrease != null)
330
+ cycleTLSOptions.disableGrease = this.config.disableGrease;
331
+ // Per-request overrides (request > config)
332
+ const headerOrder = options?.headerOrder ?? this.config.headerOrder;
333
+ if (headerOrder)
334
+ cycleTLSOptions.headerOrder = headerOrder;
335
+ const orderAsProvided = options?.orderAsProvided ?? this.config.orderAsProvided;
336
+ if (orderAsProvided != null)
337
+ cycleTLSOptions.orderAsProvided = orderAsProvided;
338
+ const insecureSkipVerify = options?.insecureSkipVerify ?? this.config.insecureSkipVerify;
339
+ if (insecureSkipVerify != null)
340
+ cycleTLSOptions.insecureSkipVerify = insecureSkipVerify;
341
+ const forceHTTP1 = options?.forceHTTP1 ?? this.config.forceHTTP1;
342
+ if (forceHTTP1 != null)
343
+ cycleTLSOptions.forceHTTP1 = forceHTTP1;
344
+ const forceHTTP3 = options?.forceHTTP3 ?? this.config.forceHTTP3;
345
+ if (forceHTTP3 != null)
346
+ cycleTLSOptions.forceHTTP3 = forceHTTP3;
347
+ const serverName = options?.serverName ?? this.config.serverName;
348
+ if (serverName)
349
+ cycleTLSOptions.serverName = serverName;
350
+ const cookies = options?.cookies ?? this.config.cookies;
351
+ if (cookies)
352
+ cycleTLSOptions.cookies = cookies;
353
+ // Body handling
317
354
  if (options?.body) {
318
- cycleTLSOptions.body = typeof options.body === 'string'
319
- ? options.body
320
- : JSON.stringify(options.body);
321
- if (typeof options.body !== 'string') {
355
+ if (options.body instanceof URLSearchParams) {
356
+ cycleTLSOptions.body = options.body;
357
+ const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === 'content-type');
358
+ if (!hasContentType) {
359
+ headers['content-type'] = 'application/x-www-form-urlencoded';
360
+ }
361
+ }
362
+ else if (typeof options.body === 'string') {
363
+ cycleTLSOptions.body = options.body;
364
+ }
365
+ else {
366
+ cycleTLSOptions.body = JSON.stringify(options.body);
322
367
  const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === 'content-type');
323
368
  if (!hasContentType) {
324
369
  headers['content-type'] = 'application/json';
@@ -326,7 +371,7 @@ class GhostFetch {
326
371
  }
327
372
  }
328
373
  const response = await client(url, cycleTLSOptions, method.toLowerCase());
329
- const body = response.body == null ? '' : typeof response.body === 'string' ? response.body : JSON.stringify(response.body);
374
+ const body = decodeResponseData(response.data);
330
375
  return {
331
376
  status: response.status,
332
377
  headers: (response.headers ?? {}),
@@ -357,7 +402,8 @@ class GhostFetch {
357
402
  }
358
403
  try {
359
404
  const res = await client('https://ipinfo.io/json', { proxy, timeout: 10000, headers: {} }, 'get');
360
- const data = typeof res.body === 'string' ? JSON.parse(res.body) : res.body;
405
+ const decoded = decodeResponseData(res.data);
406
+ const data = decoded ? JSON.parse(decoded) : {};
361
407
  const country = data.country ?? null;
362
408
  if (country) {
363
409
  countryEntries.push([proxy, country]);
@@ -410,4 +456,15 @@ exports.GhostFetch = GhostFetch;
410
456
  function sleep(ms) {
411
457
  return new Promise((resolve) => setTimeout(resolve, ms));
412
458
  }
459
+ /** Decode CycleTLS v2 response data — v2 returns native Buffer objects. */
460
+ function decodeResponseData(data) {
461
+ if (data == null)
462
+ return '';
463
+ if (Buffer.isBuffer(data)) {
464
+ return data.length === 0 ? '' : data.toString('utf-8');
465
+ }
466
+ if (typeof data === 'string')
467
+ return data;
468
+ return JSON.stringify(data);
469
+ }
413
470
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -97,6 +97,13 @@ export class GhostFetch {
97
97
  bannedProxies: this.proxyManager.banned,
98
98
  };
99
99
  }
100
+ /** Get all non-banned proxy URLs, optionally filtered by country. */
101
+ getAvailableProxies(opts) {
102
+ const proxies = this.proxyManager.getAvailableProxies();
103
+ if (!opts?.country)
104
+ return proxies;
105
+ return proxies.filter((p) => this.proxyManager.getCountry(p) === opts.country.toUpperCase());
106
+ }
100
107
  // --- HTTP methods ---
101
108
  async get(url, options) {
102
109
  return this.request('GET', url, options);
@@ -297,22 +304,60 @@ export class GhostFetch {
297
304
  const cycleTLSOptions = {
298
305
  headers,
299
306
  timeout,
300
- disableRedirect: false,
307
+ disableRedirect: options?.disableRedirect ?? this.config.disableRedirect ?? false,
301
308
  };
302
309
  if (proxy) {
303
310
  cycleTLSOptions.proxy = proxy;
304
311
  }
305
- if (this.config.ja3) {
312
+ // Client identity fingerprints (config-only)
313
+ if (this.config.ja3)
306
314
  cycleTLSOptions.ja3 = this.config.ja3;
307
- }
308
- if (this.config.userAgent) {
315
+ if (this.config.userAgent)
309
316
  cycleTLSOptions.userAgent = this.config.userAgent;
310
- }
317
+ if (this.config.ja4r)
318
+ cycleTLSOptions.ja4r = this.config.ja4r;
319
+ if (this.config.http2Fingerprint)
320
+ cycleTLSOptions.http2Fingerprint = this.config.http2Fingerprint;
321
+ if (this.config.quicFingerprint)
322
+ cycleTLSOptions.quicFingerprint = this.config.quicFingerprint;
323
+ if (this.config.disableGrease != null)
324
+ cycleTLSOptions.disableGrease = this.config.disableGrease;
325
+ // Per-request overrides (request > config)
326
+ const headerOrder = options?.headerOrder ?? this.config.headerOrder;
327
+ if (headerOrder)
328
+ cycleTLSOptions.headerOrder = headerOrder;
329
+ const orderAsProvided = options?.orderAsProvided ?? this.config.orderAsProvided;
330
+ if (orderAsProvided != null)
331
+ cycleTLSOptions.orderAsProvided = orderAsProvided;
332
+ const insecureSkipVerify = options?.insecureSkipVerify ?? this.config.insecureSkipVerify;
333
+ if (insecureSkipVerify != null)
334
+ cycleTLSOptions.insecureSkipVerify = insecureSkipVerify;
335
+ const forceHTTP1 = options?.forceHTTP1 ?? this.config.forceHTTP1;
336
+ if (forceHTTP1 != null)
337
+ cycleTLSOptions.forceHTTP1 = forceHTTP1;
338
+ const forceHTTP3 = options?.forceHTTP3 ?? this.config.forceHTTP3;
339
+ if (forceHTTP3 != null)
340
+ cycleTLSOptions.forceHTTP3 = forceHTTP3;
341
+ const serverName = options?.serverName ?? this.config.serverName;
342
+ if (serverName)
343
+ cycleTLSOptions.serverName = serverName;
344
+ const cookies = options?.cookies ?? this.config.cookies;
345
+ if (cookies)
346
+ cycleTLSOptions.cookies = cookies;
347
+ // Body handling
311
348
  if (options?.body) {
312
- cycleTLSOptions.body = typeof options.body === 'string'
313
- ? options.body
314
- : JSON.stringify(options.body);
315
- if (typeof options.body !== 'string') {
349
+ if (options.body instanceof URLSearchParams) {
350
+ cycleTLSOptions.body = options.body;
351
+ const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === 'content-type');
352
+ if (!hasContentType) {
353
+ headers['content-type'] = 'application/x-www-form-urlencoded';
354
+ }
355
+ }
356
+ else if (typeof options.body === 'string') {
357
+ cycleTLSOptions.body = options.body;
358
+ }
359
+ else {
360
+ cycleTLSOptions.body = JSON.stringify(options.body);
316
361
  const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === 'content-type');
317
362
  if (!hasContentType) {
318
363
  headers['content-type'] = 'application/json';
@@ -320,7 +365,7 @@ export class GhostFetch {
320
365
  }
321
366
  }
322
367
  const response = await client(url, cycleTLSOptions, method.toLowerCase());
323
- const body = response.body == null ? '' : typeof response.body === 'string' ? response.body : JSON.stringify(response.body);
368
+ const body = decodeResponseData(response.data);
324
369
  return {
325
370
  status: response.status,
326
371
  headers: (response.headers ?? {}),
@@ -351,7 +396,8 @@ export class GhostFetch {
351
396
  }
352
397
  try {
353
398
  const res = await client('https://ipinfo.io/json', { proxy, timeout: 10000, headers: {} }, 'get');
354
- const data = typeof res.body === 'string' ? JSON.parse(res.body) : res.body;
399
+ const decoded = decodeResponseData(res.data);
400
+ const data = decoded ? JSON.parse(decoded) : {};
355
401
  const country = data.country ?? null;
356
402
  if (country) {
357
403
  countryEntries.push([proxy, country]);
@@ -403,3 +449,14 @@ export class GhostFetch {
403
449
  function sleep(ms) {
404
450
  return new Promise((resolve) => setTimeout(resolve, ms));
405
451
  }
452
+ /** Decode CycleTLS v2 response data — v2 returns native Buffer objects. */
453
+ function decodeResponseData(data) {
454
+ if (data == null)
455
+ return '';
456
+ if (Buffer.isBuffer(data)) {
457
+ return data.length === 0 ? '' : data.toString('utf-8');
458
+ }
459
+ if (typeof data === 'string')
460
+ return data;
461
+ return JSON.stringify(data);
462
+ }
@@ -39,6 +39,10 @@ export declare class GhostFetch {
39
39
  availableProxies: number;
40
40
  bannedProxies: number;
41
41
  };
42
+ /** Get all non-banned proxy URLs, optionally filtered by country. */
43
+ getAvailableProxies(opts?: {
44
+ country?: string;
45
+ }): string[];
42
46
  get(url: string, options?: RequestOptions): Promise<GhostFetchResponse>;
43
47
  post(url: string, options?: RequestOptions): Promise<GhostFetchResponse>;
44
48
  put(url: string, options?: RequestOptions): Promise<GhostFetchResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,cAAc,EAEd,UAAU,EACX,MAAM,SAAS,CAAC;AAQjB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAA2C;gBAEzD,MAAM,GAAE,gBAAqB;IAoBzC;;;;;;;;;;;;;OAaG;IACG,KAAK,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKzC,yCAAyC;YAC3B,YAAY;IAa1B,iEAAiE;IACjE,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C,qCAAqC;IACrC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC,uEAAuE;IACjE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC,+BAA+B;IAC/B,IAAI,KAAK;;;;MAMR;IAIK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIxE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIzE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMxE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoHrG;;;;OAIG;YACW,SAAS;IA+BvB,6HAA6H;IAC7H,OAAO,CAAC,uBAAuB;YAqCjB,cAAc;IA4D5B;;;;;OAKG;YACW,kBAAkB;IA6DhC,mEAAmE;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,cAAc,EAEd,UAAU,EACX,MAAM,SAAS,CAAC;AAQjB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAA2C;gBAEzD,MAAM,GAAE,gBAAqB;IAoBzC;;;;;;;;;;;;;OAaG;IACG,KAAK,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKzC,yCAAyC;YAC3B,YAAY;IAa1B,iEAAiE;IACjE,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C,qCAAqC;IACrC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC,uEAAuE;IACjE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC,+BAA+B;IAC/B,IAAI,KAAK;;;;MAMR;IAED,qEAAqE;IACrE,mBAAmB,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IAUpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIxE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIvE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIzE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMxE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoHrG;;;;OAIG;YACW,SAAS;IA+BvB,6HAA6H;IAC7H,OAAO,CAAC,uBAAuB;YAqCjB,cAAc;IA0F5B;;;;;OAKG;YACW,kBAAkB;IA8DhC,mEAAmE;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B"}
@@ -1,5 +1,5 @@
1
1
  export { GhostFetch } from './client';
2
2
  export { ProxyManager } from './proxy-manager';
3
3
  export { GhostFetchRequestError, CloudflareJSChallengeError, NoProxyAvailableError, MaxRetriesExceededError, } from './errors';
4
- export type { GhostFetchConfig, GhostFetchResponse, GhostFetchError, HealthCheckResult, Interceptor, InterceptorAction, RequestInterceptor, RequestOptions, RetryConfig, BanConfig, ErrorType, HttpMethod, } from './types';
4
+ export type { Cookie, GhostFetchConfig, GhostFetchResponse, GhostFetchError, HealthCheckResult, Interceptor, InterceptorAction, RequestInterceptor, RequestOptions, RetryConfig, BanConfig, ErrorType, HttpMethod, } from './types';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC"}
@@ -1,3 +1,15 @@
1
+ export interface Cookie {
2
+ name: string;
3
+ value: string;
4
+ path?: string;
5
+ domain?: string;
6
+ expires?: string;
7
+ rawExpires?: string;
8
+ maxAge?: number;
9
+ secure?: boolean;
10
+ httpOnly?: boolean;
11
+ sameSite?: string;
12
+ }
1
13
  export interface GhostFetchConfig {
2
14
  /** List of proxy URLs in format http://user:pass@host:port */
3
15
  proxies?: string[];
@@ -26,6 +38,30 @@ export interface GhostFetchConfig {
26
38
  ja3?: string;
27
39
  /** User-Agent string (optional — CycleTLS picks a realistic default) */
28
40
  userAgent?: string;
41
+ /** JA4R fingerprint string (client identity — applied to all requests) */
42
+ ja4r?: string;
43
+ /** HTTP/2 frame settings fingerprint (client identity — applied to all requests) */
44
+ http2Fingerprint?: string;
45
+ /** QUIC fingerprint (client identity — applied to all requests) */
46
+ quicFingerprint?: string;
47
+ /** Disable GREASE (applied to all requests) */
48
+ disableGrease?: boolean;
49
+ /** Default header order for all requests */
50
+ headerOrder?: string[];
51
+ /** Send headers in the order they are provided */
52
+ orderAsProvided?: boolean;
53
+ /** Disable following redirects (default: false) */
54
+ disableRedirect?: boolean;
55
+ /** Skip TLS certificate verification */
56
+ insecureSkipVerify?: boolean;
57
+ /** Force HTTP/1.1 for all requests */
58
+ forceHTTP1?: boolean;
59
+ /** Force HTTP/3 (QUIC) for all requests */
60
+ forceHTTP3?: boolean;
61
+ /** Override TLS SNI server name */
62
+ serverName?: string;
63
+ /** Default cookies for all requests */
64
+ cookies?: Cookie[] | Record<string, string>;
29
65
  }
30
66
  export interface RetryConfig {
31
67
  /**
@@ -106,7 +142,7 @@ export interface RequestOptions {
106
142
  /** Override timeout for this request */
107
143
  timeout?: number;
108
144
  /** Request body (for POST, PUT, PATCH) */
109
- body?: string | Record<string, unknown>;
145
+ body?: string | Record<string, unknown> | URLSearchParams;
110
146
  /** Force a specific proxy for this request */
111
147
  proxy?: string;
112
148
  /** Override retry config for this request */
@@ -126,6 +162,22 @@ export interface RequestOptions {
126
162
  * Require a proxy from this country (ISO 3166-1 alpha-2, e.g. 'US', 'DE').
127
163
  */
128
164
  country?: string;
165
+ /** Override header order for this request */
166
+ headerOrder?: string[];
167
+ /** Send headers in the order they are provided */
168
+ orderAsProvided?: boolean;
169
+ /** Disable following redirects for this request */
170
+ disableRedirect?: boolean;
171
+ /** Skip TLS certificate verification for this request */
172
+ insecureSkipVerify?: boolean;
173
+ /** Force HTTP/1.1 for this request */
174
+ forceHTTP1?: boolean;
175
+ /** Force HTTP/3 (QUIC) for this request */
176
+ forceHTTP3?: boolean;
177
+ /** Override TLS SNI server name for this request */
178
+ serverName?: string;
179
+ /** Cookies for this request (replaces config-level cookies) */
180
+ cookies?: Cookie[] | Record<string, string>;
129
181
  }
130
182
  export interface HealthCheckResult {
131
183
  /** Total proxies that were tested */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emircansahin/ghostfetch",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "Resilient HTTP client with CycleTLS, proxy rotation, smart error classification, and per-site interceptors",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -16,13 +16,6 @@
16
16
  "dist",
17
17
  "README.md"
18
18
  ],
19
- "scripts": {
20
- "build": "tsc -p tsconfig.esm.json && echo '{\"type\":\"module\"}' > dist/esm/package.json && tsc -p tsconfig.cjs.json",
21
- "build:esm": "tsc -p tsconfig.esm.json",
22
- "build:cjs": "tsc -p tsconfig.cjs.json",
23
- "test": "vitest run",
24
- "test:watch": "vitest"
25
- },
26
19
  "keywords": [
27
20
  "fetch",
28
21
  "proxy",
@@ -44,12 +37,19 @@
44
37
  "author": "Emircan Sahin",
45
38
  "license": "MIT",
46
39
  "dependencies": {
47
- "cycletls": "^1.0.26",
40
+ "cycletls": "^2.0.5",
48
41
  "form-data": "^4.0.5"
49
42
  },
50
43
  "devDependencies": {
51
44
  "@types/node": "^22.0.0",
52
45
  "typescript": "^5.5.0",
53
46
  "vitest": "^2.0.0"
47
+ },
48
+ "scripts": {
49
+ "build": "tsc -p tsconfig.esm.json && echo '{\"type\":\"module\"}' > dist/esm/package.json && tsc -p tsconfig.cjs.json",
50
+ "build:esm": "tsc -p tsconfig.esm.json",
51
+ "build:cjs": "tsc -p tsconfig.cjs.json",
52
+ "test": "vitest run",
53
+ "test:watch": "vitest"
54
54
  }
55
- }
55
+ }