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)
JavaScript 53.7%
Python 38.3%
CSS 4.6%
TypeScript 3.1%
-
Sun, Sep 6, 2026 2
-
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> -
stream: principal du middleware ratelimit, fin du repli permissif
…
stream/auth.py cherchait verify_api_key/resolve_api_key/authenticate_key dans accounts.security — aucune n'existe — puis acceptait toute chaîne hfmd_live_<32> avec un principal key:<sha256[:16]> : les lignes livrées étaient débitées à un compteur Redis orphelin et _tier_for_principal retombait sur free. * stream_ws lit ws.scope["state"] (principal, principal_kind, tier) posés par ratelimit.middleware._websocket ; keyless → JSON AUTH_REQUIRED + 4001 comme avant ; aucun contexte alors que HFMD_RATELIMIT est actif → refus 4401 sans handshake. * authenticate(key) = recherche api_keys.key_hash (sha256(sel+clé)) + statut compte, utilisée seulement quand le middleware est désactivé ; plus aucune acceptation par forme de clé. * Tests : principal = key:<id> (≠ hash), clé inconnue bien formée refusée, _resolve_principal sans contexte. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
-
-
Fri, Sep 4, 2026 2
-
fundamentals: tests unitaires, intégration, WebSocket et bulk + fixtures EDGAR réelles tronquées (Apple, Microsoft, Shake Shack), aucun accès réseau (respx)
…
- lac synthétique étendu (SHAK, GOOG, GOOGL) ; conftest : edgar_mock + fundamentals_data - 46 tests : mapping, calendrier fiscal (Apple Q2 FY2024 = 2024-03-30), priorités/unités, dérivation Q4, restatements/as_of, TTM, formules validées sur les chiffres réels d'Apple, grammaire de filtres, tous les endpoints json/csv/parquet, enveloppes 404/400, bulk 304, WebSocket (auth, abonnement, réception, resume, heartbeat, limite) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>