spb/hfmarketdata
Public
Open high-frequency market data platform — FirstRate full-history downloader, DuckDB/Parquet lake, open REST API and React docs platform (www.hfmarketdata.io)
- 129commits
- 1branches
- 0releases
- 24.7 MBon disk
- maindefault branch
- 1 mo agolast push
-
Mon, Sep 7, 2026 19
-
web: charts — couche data « zéro limite » : en-tête X-HFMD-Client sur tous les appels, fenêtres initiales 10 000–20 000 barres, pagination arrière chaînée (prefetch < 1 000 barres) pour la série et les comparaisons, plus de /v1/limits ni de clé API, erreurs 429/5xx génériques ; état multi-charts (layout=, s2=) et templates localStorage ; fixtures e2e sans en-têtes X-RateLimit
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
ratelimit: principal `site` — les requêtes de données du site (/charts) sont hors quota (3 critères cumulés X-HFMD-Client + Sec-Fetch-Site + Origin), max_rows 200 000, garde anti-abus 1 200 req/min/IP, stats sous `site`
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
-
Sun, Sep 6, 2026 21
-
web: refonte design — étape 1 (tokens, composants unifiés, home, docs, playground, status, légal, 404, prerender, e2e)
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
web: e2e — mocks réécrits d'après les vraies formes de réponse (enveloppes, /v1/me, clés, usage, limits, admin), vérification CSRF sur chaque mutation, specs auth/dashboard/admin mises à jour
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
tests: comptes et ratelimit — sessions cookie, Bearer lecture seule, CSRF, anti-pré-hijack, verrouillage, session_version, compte, clés, usage/limits, XFF, throttles, cache, fail-closed, alertes quota, seed JSON
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
accounts: cli — seed depuis un fichier JSON ou HFMD_SEED_USERS, plus aucune adresse tierce en dur
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
ratelimit: IP client = dernier hop de confiance de X-Forwarded-For (HFMD_TRUSTED_PROXY_HOPS), cache clés LRU borné + génération Redis keys:version, throttle auth par endpoint fail-closed, throttle des recherches de clés inconnues, clés expirées refusées, séries usage étendues (429/bytes/parquet), export CSV, alertes quota quotidiennes
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
accounts: routes — POST /v1/auth/verify (GET redirige sans consommer), reset avec revoke_keys, throttle forgot par e-mail, /v1/me/{limits,usage?key_id,usage.csv,password,email,sessions/revoke-all,DELETE}, PATCH clés, admin session obligatoire + suppression + filtres audit + usage 7 j + admins_active
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
accounts: service — signup sans pré-hijack et uniforme, verrouillage progressif (423), révocation des sessions au reset, garde dernier admin, changement mdp/e-mail, suppression douce, clés avec expiration/note/scopes, audit enrichi ; Bearer lecture seule (require_session)
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
accounts: modèles — colonnes de sécurité (session_version, verrouillage, alertes quota, suppression douce, expiration/note/scopes des clés, usage_minute étendu) + migration idempotente ALTER TABLE ; codes ACCOUNT_LOCKED / SESSION_REQUIRED / LAST_ADMIN ; HFMD_TRUSTED_PROXY_HOPS
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
docs: fundamentals — clé (cik, accn), garde-fous du poller, dictionnaire de couverture, stream ZSET/XREAD et principal du middleware
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
stream: registre de connexions ZSET et livraison par XREAD bloquant
…
* stream:conns:{principal} : ZSET (membre = id de connexion, score = dernier heartbeat) au lieu d'un compteur INCR/DECR qui restait gonflé 1 h quand un worker mourait sans DECR (4029 injustifiés). Les membres muets depuis 90 s sont élagués à chaque comptage ; le score est rafraîchi toutes les 30 s ; ZREM à la déconnexion. * Fan-out : un XREAD BLOCK (1 s) par socket abonnée sur filings:stream, via le client redis.asyncio, au lieu d'un XRANGE toutes les 250 ms par connexion. Le lecteur a sa propre connexion Redis fermée avec lui (une lecture bloquante annulée peut laisser une réponse tardive sur la connexion — doublons à la ré-abonnement) + événement d'arrêt. * Plus aucun appel Redis synchrone dans la coroutine : ZSET/hello via le client async, accounting.charge (compteur sync) via asyncio.to_thread. * Tests : élagage des connexions fantômes, rafraîchissement du score au heartbeat, livraison bloquante + unsubscribe/resume sans doublon. conftest.make_user : e-mail unique par uuid (id(counter) provoquait des collisions EMAIL_TAKEN). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> -
ops: run.sh — --no-access-log, --proxy-headers, keep-alive/graceful, variables HFMD_DUCK_*/HFMD_THREADPOOL
…
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>