Skip to content

refactor(cf): Queue-based CFEvents + property tests#135

Merged
DivMode merged 2 commits intomainfrom
feat/cf-event-queue
Mar 14, 2026
Merged

refactor(cf): Queue-based CFEvents + property tests#135
DivMode merged 2 commits intomainfrom
feat/cf-event-queue

Conversation

@DivMode
Copy link
Copy Markdown
Owner

@DivMode DivMode commented Mar 14, 2026

Summary

  • Replace createCFEvents() frozen closure with Queue.unbounded<CFEvent>() pipeline
  • CFEvent TaggedEnum (6 variants: Detected, Progress, Solved, Failed, Marker, StandaloneAutoSolved)
  • Single FIFO consumer with Match.exhaustive for compile-time variant coverage
  • Queue.offerUnsafe for synchronous publishing from Resolution callbacks, scope finalizers, and crash handlers
  • Add 12 property-based tests for CF detection schemas (CloudflareInfo, CloudflareResult, CloudflareSnapshot)
  • Delete createCFEvents, CFEvents type, and _setRealEmit closure hack

Changes

File Change
src/session/cf/cf-event-types.ts NEW — CFEvent TaggedEnum
src/session/cf/cf-event-queue.ts NEW — makeCFEventPipeline + Stream consumer
src/shared/cloudflare-schema.property.test.ts NEW — 12 property tests
src/session/cf/cloudflare-event-emitter.ts Delete createCFEvents + CFEvents (-100 lines)
src/session/cloudflare-solver.ts Wire queue, update Layer, fork consumer
src/session/cf/cloudflare-detector.ts events.*cfPublish(CFEvent.*) (20 sites)
src/session/cf/cloudflare-state-tracker.ts events.*cfPublish(CFEvent.*) (11 sites)
src/session/cf/cf-session-state.ts eventscfPublish in constructor

ZERO changes: solver.effect.ts, cf-phase-checkbox.ts, cf-phase-oopif.ts, solve-strategies.ts (45 consumer call sites unchanged)

Test plan

  • npx tsc --noEmit — zero type errors
  • npx vitest run — 293/293 tests pass (16 files)
  • Integration: 6/6 CF sites pass (nopecha, 2captcha, peet-managed/nonint/invisible, ahrefs-fast)
  • grep -r 'createCFEvents\|CFEvents' src/ — zero code references (comments only)
  • grep -r '\.events\.(emit|marker)' src/session/ — zero references

DivMode added 2 commits March 13, 2026 17:43
12 fast-check property tests using Schema.toArbitrary for
CloudflareInfo, CloudflareResult, and CloudflareSnapshot.
Validates round-trip encode/decode, type constraints
(finite, integer), required fields, and JSON serialization.
…ipeline

Replace the createCFEvents frozen closure in cloudflare-event-emitter.ts
with a Queue.unbounded<CFEvent>() pipeline. The old closure mixed three
concerns (tracker mutation, CDP event emission, replay marker injection)
and used a _setRealEmit closure hack for late-binding.

New architecture:
- CFEvent TaggedEnum (6 variants) in cf-event-types.ts
- makeCFEventPipeline() in cf-event-queue.ts with Stream consumer
- Queue.offerUnsafe for synchronous publishing from any context
- Match.exhaustive consumer with compile-time variant coverage

Call site changes: 34 sites across 3 files (detector: 20, state-tracker: 11,
solver crash handler: 1, solver layer: 5). SolverEvents consumers (45 call
sites across 4 files) required ZERO changes — interface unchanged.

Deleted: createCFEvents function, CFEvents type, _setRealEmit hack.
@DivMode DivMode merged commit 9d6fa0c into main Mar 14, 2026
@DivMode DivMode deleted the feat/cf-event-queue branch March 14, 2026 05:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant