~/dlab.zone (main) $ cat projects/pirateswap/README.md
pirateswap.com
Zdecentralizowana giełda i marketplace dla użytkowników Steama — ceny i handel w czasie rzeczywistym, a frontend musi nadążyć.
kontekst
Użytkownicy Steama handlują między sobą przedmiotami z gier — ceny, salda i stany zleceń zmieniają się co sekundę, a każda zmiana musi pojawić się bez odświeżania strony.
co zrobiłem
- 0a4b7d1init: zaprojektowałem frontend od zera
- f3e019bstate: React Query dla stanu z serwera, XState dla procesów
- c0d93b8realtime: dane rynkowe i handel na żywo przez websockety
- 7e51f02perf: płynność dla tysięcy użytkowników dziennie
- 41ac7e3lead: code review, planowanie, współpraca z product ownerem
architektura
┌───────────────┐ ws ┌───────────────┐ ┌──────────────┐
│ market feed │ ──────▶ │ query cache │ ─────▶ │ React UI │
└───────────────┘ └───────┬───────┘ └──────┬───────┘
│ invalidate │ events
┌───────▼───────┐ ┌──────▼───────┐
│ REST / API │ ◀───── │ XState │
└───────────────┘ └──────────────┘
trade · deposit · withdrawdecyzje
- Stan z serwera w React Query, procesy w XState — nigdy razem.Cache odpowiada na pytanie „co jest prawdą teraz”, maszyny — „co użytkownik może zrobić dalej”. Każde z nich zostaje małe i testowalne.
- Zdarzenia z websocketów trafiają do cache.Każdy widok czyta z jednego źródła prawdy, więc zmiana ceny aktualizuje listę, szczegóły i okno handlu jednocześnie.
- Procesy jako jawne stany.Handel ma wiele stanów pośrednich (oczekuje, potwierdzanie, błąd, ponowienie). Zamiana flag na stany usunęła całą klasę „niemożliwych” błędów w UI.
wyniki
tysiąceużytkowników dziennie, płynnie przy danych na żywo
dev → leadod pierwszego commita do prowadzenia frontendu