79 Commits
Author SHA1 Message Date
germondai f08f5a2b44 chore(release): prepare v1.2.0 2026-07-26 16:18:47 +02:00
germondai 748d89dfc5 refactor(proxy): normalize proxy pool fallbacks 2026-07-25 08:34:12 +02:00
germondai 1d752aee92 feat(proxy): add transparent header sanitization 2026-07-24 18:19:44 +02:00
germondai fa2bcbb64f refactor(solvers): simplify optional results 2026-07-24 16:51:07 +02:00
germondai d1ebbddf38 feat(tiers): preserve raw response payloads 2026-07-24 14:26:31 +02:00
germondai defade4324 refactor(browser): simplify optional pool state 2026-07-24 12:08:55 +02:00
germondai 3e26a7e990 feat(browser): add persistent context cache 2026-07-24 10:43:18 +02:00
germondai a62019cd55 refactor(types): add raw response metadata 2026-07-24 09:17:42 +02:00
germondai 90fc9b59dd chore(tiers): export isChallengeWall + SolveResult type from public API 2026-07-22 23:15:09 +02:00
germondai 2840af1d13 chore(release): bump all packages to v1.1.0 2026-07-22 23:13:17 +02:00
germondai 000b48d2e7 feat(tiers): extract isChallengeWall as universal challenge predicate 2026-07-22 23:08:05 +02:00
germondai 6223a4e593 perf: release v1.0.1 - slimmer image, faster boot, firefox telemetry/dead-feature prefs 2026-07-21 18:31:26 +02:00
germondai 6f96285544 chore(release): bump to 1.0.0 and backfill versioned changelog history
Splits the single [Unreleased] CHANGELOG block into dated 0.1.0-1.0.0
sections matching the milestone commits being tagged for issue #24
(numeric release tags), and bumps every package.json to 1.0.0.
2026-07-10 21:11:04 +02:00
germondai 040c7352fb chore(deps): bump typescript to v7 and update workspace dependencies 2026-07-10 19:19:35 +02:00
germondai 7a36a6c2c9 refactor(tiers): split into tiers/ and utils/, dedupe cookie and network-failure helpers 2026-07-09 03:23:30 +02:00
germondai 25fe9d739a feat(types): centralize BrowserHandle, BrowserFingerprint, SupportedMethod 2026-07-08 20:06:24 +02:00
germondai 4dfe5be680 fix(tiers): escalate JS-shell challenge pages from Tier 1 to browser 2026-07-08 19:40:38 +02:00
germondai 16499ce2fc feat(tiers): add audio STT fallback to hCaptcha solver 2026-07-08 19:40:24 +02:00
germondai 973505b7f3 chore(browser): suppress noExplicitAny lint in pool.ts 2026-07-08 03:49:12 +02:00
Erik Dasque 7d3204351c fix(tiers): recognize more block/error page variants, add Tier 4 captcha parity, surface proxy/timing info
Found while running trawl against a large batch of real-world URLs: several
cases where the API returned 200 with content that was actually a blocked
page, an empty challenge stub, or Firefox's own error page. Each was a
detection gap where a tier didn't recognize the failure and reported it as a
successful scrape.

- Recognize Firefox's about:neterror/about:certerror page (browser never
  reached a server), Cloudflare's static "you have been blocked" WAF-deny
  page, and a lean CF challenge stub (blank title/body, just the bootstrap
  script) — the stub check is gated on page size since the same script
  snippet also appears on ordinary, fully-loaded CF pages as bot-management
  telemetry.
- Wire the existing isBlocked() status-code check (403/429/202) into Tiers 2
  and 3 — previously only Tier 1 checked status code, so a generic non-CF WAF
  deny that escalated to a browser tier was reported as a success.
- Bring Tier 4 up to parity with Tier 3: captcha solving and the same block
  detection. Sites that need Tier 4 for IP reputation can just as easily have
  an in-page captcha widget.
- Add proxyUsed: boolean to the response, set from the actual proxy used by
  the winning tier — previously the only signal was inferring from tier === 4,
  which doesn't distinguish "no proxy" from Tier 3's datacenter proxy.
- Attach the per-tier timings array to thrown errors via a new ScrapeError,
  and return it in /scrape's error response. The array was already being
  built in memory; it just never survived the throw, so failed requests gave
  a flat error string with no way to see which tier failed or why.
- Add process-level uncaughtException/unhandledRejection handlers. One target
  site's page threw a JS error that Camoufox/Firefox reports in a shape
  playwright-core's dispatcher doesn't expect, which crashed the entire
  process and dropped every in-flight request across all clients.
- Update the native API docs for the new response fields and error shape.

All additive — no existing fields changed shape. Full existing test suite
passes (58/58), and this is rebuilt/smoke-tested against latest dev.
2026-07-07 15:58:54 +00:00
germondai d7476274a2 feat(browser): randomize OS/screen/window per browser and match HTTP UA to platform 2026-07-07 02:32:12 +02:00
germondai e42582e6b6 ci: use native bun test instead of npm-script wrapper in CI 2026-07-06 20:52:59 +02:00
germondai bb062c6bd8 test(browser): cover recycle-on-blocked and contentProcesses options 2026-07-06 20:10:19 +02:00
germondai 7b57cd4f80 refactor(tiers): add normalizeSameSite helper for cookie sameSite 2026-07-06 20:10:13 +02:00
germondai a307fe835d feat(browser): cap Firefox content processes via dom.ipc.processCount 2026-07-06 20:08:56 +02:00
germondai 1c90df92d0 feat(tiers): recycle browser only when tier returns blocked 2026-07-06 20:08:32 +02:00
GermondandGitHub 47fc0fa647 Merge pull request #14 from CoolDotty/codex/fix-browser-process-leak
Recycle browser pool after temporary contexts
2026-07-06 19:41:42 +02:00
germondai 1e5acb7975 test(tiers): cover normalizeProxy for string and object inputs 2026-07-06 13:55:25 +02:00
germondai 4adf1e0347 feat(tiers): add normalizeProxy helper for proxy field normalization 2026-07-06 13:55:02 +02:00
germondai ff1804bcb7 fix(types): accept Prowlarr object form for FlareSolverrRequest.proxy 2026-07-06 13:53:53 +02:00
CoolDotty 68ad2e0f1a Recycle browsers after temporary contexts 2026-07-06 00:47:32 -07:00
germondai 2520345c48 feat(tiers): rotate proxy pool on blocked in tier 3 and 4 2026-07-06 02:29:31 +02:00
germondai 4057d7bdac refactor(tiers): consolidate ProxyPool export and drop dead re-exports 2026-07-06 02:29:09 +02:00
GermondandGitHub 8d69e660c3 Merge branch 'main' into fix/pr-8-hardening 2026-07-06 01:33:13 +02:00
germondai ad7764eeb6 test(tiers): cover header sanitiser and tier1 post support 2026-07-06 01:12:30 +02:00
germondai 06783038e4 feat(tiers): thread method and body through all tiers 2026-07-06 01:12:11 +02:00
germondai abee1e5063 feat(tiers): add header sanitisation and request validation 2026-07-06 01:12:06 +02:00
germondai 7c87dc0b1a feat(types): support full HTTP method set and rename postData to body 2026-07-06 01:12:06 +02:00
germondai 756f5aeba9 test(tiers): add proxy pool unit tests 2026-07-05 16:40:48 +02:00
germondai 08b595af6a feat(tiers): route proxy pool selection through orchestrator 2026-07-05 16:40:42 +02:00
germondai cd5b674c34 feat(types): add per-request proxy override field 2026-07-05 16:40:42 +02:00
germondai a9f18cf382 feat(tiers): rework proxy rotator into sticky failure-aware pool 2026-07-05 16:40:36 +02:00
germondai 2d8769b4f5 feat(tiers): solve imperva challenges in tier3 and tier4 2026-07-05 16:40:17 +02:00
germondai 15cae0ff30 feat(tiers): add imperva sensor cookie wait resolver 2026-07-05 16:40:11 +02:00
germondai 56e9c2cfe3 feat(tiers): detect imperva/incapsula waf challenges 2026-07-05 16:40:11 +02:00
germondai 3711e2e041 fix(tiers): actually thread proxy url into tier3 browser context 2026-07-05 16:39:53 +02:00
germondai df1cf47d08 fix(browser): support per-context proxy override in fresh contexts 2026-07-05 16:39:18 +02:00
whoshoe 5fde497e3a feat: add post method with postData parameter 2026-07-03 22:28:42 +08:00
germondai efaf0c96a0 feat(browser): make acquire timeout configurable, default 15s 2026-06-29 23:59:05 +02:00
germondai 9cd79fe01e style: biome lint, format, and check pass 2026-06-29 23:10:28 +02:00