kshitijk4poor
fa6ef8ba6d
refactor(free-tier): one per-profile challenge record behind one lock
...
_pending (dict-of-dicts keyed "payload"/"deadline"/"outcome"),
_work_locks and _gave_up_until were three per-profile module globals,
two of them mutated outside the lock. They become one _ProfileChallenge
dataclass in a single _profiles map behind _state_lock; the record holds
the BrowserChallenge itself, so lookups are attribute reads and
as_payload() runs only when a status read asks for it. _set_pending
becomes _record(challenge, new_attempt=...). The test-only _presenter
seam goes: tests patch present() itself. _sleep stays, same idiom as
free_tier_bootstrap.
One edge differs, for the better: an EXPIRED same-URL record is now
treated as a new ticket (fresh deadline) instead of re-recorded with
min(new, old-expired) deadline, i.e. born expired.
2026-10-06 23:14:10 +05:30
..
2026-10-06 10:11:33 -04:00
2026-10-06 23:14:10 +05:30
2026-10-06 04:36:02 -07:00
2026-10-06 23:14:10 +05:30
2026-10-06 12:28:55 -04:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 11:17:11 -04:00
2026-10-06 11:10:45 -04:00
2026-10-06 11:14:34 -04:00
2026-10-06 11:14:42 -04:00
2026-10-06 11:17:11 -04:00
2026-10-06 03:44:49 -07:00
2026-10-06 05:44:21 -07:00
2026-10-06 05:50:08 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 05:44:21 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 12:28:00 -04:00
2026-10-06 12:27:41 -04:00
2026-10-06 13:23:15 -04:00
2026-10-06 13:23:15 -04:00
2026-10-06 04:36:02 -07:00
2026-10-06 23:14:10 +05:30
2026-10-06 12:46:06 -04:00
2026-10-06 10:11:33 -04:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 03:44:49 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 04:36:02 -07:00
2026-10-06 02:53:56 -07:00
2026-10-06 11:19:16 -04:00
2026-10-06 05:17:45 -07:00
2026-10-06 11:15:27 -04:00
2026-10-06 11:15:20 -04:00
2026-10-06 12:27:22 -04:00
2026-10-06 12:30:01 -04:00
2026-10-06 12:28:55 -04:00
2026-10-06 12:28:06 -04:00
2026-10-06 12:27:29 -04:00
2026-10-06 12:03:11 -04:00
2026-10-06 12:00:47 -04:00
2026-10-06 03:44:49 -07:00
2026-10-06 12:28:55 -04:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00
2026-10-06 06:18:39 -07:00