- Verschifft
- 26. August 2026 um 05:40 UTC
- Autor
- kamo
- Ausschuss
- 2241a5c
useUserInfo hielt seine Sitzung in drei useState-Zellen. Es hat 187 Call-Sites und etwa 27 von Sie werden für die gesamte Session montiert - das Navi, jede Shell-Provider, das Launchpad. Die REQUEST war bereits vereint, so gab es immer nur einen /api/user-info Anruf, aber wenn es beaufte alle 27 Instanzen, die ihre eigenen setUserInfo mit den gleichen Daten genannt. Siebenundzwanzig unabhängige React-Updates mit identischem Zustand, auf jedem Tab-Fokus und alle fünf Minuten ticken. Der Zustand bewegt sich zu einem Modul-Shop hinter dem EinsatzSyncExternalStore, so eine Aktualisierung ist ein schreiben und eine Chargen-Render-Pass. Der Store ist app/lib/userInfoStore.ts und nicht ein Hook-Lokal-Modul aus einem bestimmten Grund: Nichts in diesem Repo kann eine Rechterückführung erwischen. Es gibt keine @testing-Bibliothek, keinen Test mountt eine Komponente, und app/hooks/** ist nicht in vitest's include list . ein Test platziert neben der Haken würde passieren, indem nie laufen. app/lib/** ist enthalten, so dass die Regeln, die Gate-Rechte über das Produkt hat jetzt 25 Tests, die jeden Schreibpfad abdecken. Drei Eigenschaften sind tragend und jede wird durch einen Test gepinnt: "Loting" startet TRUE und ist eine Einbahnstraße. Die Rechte Wachen fallen durch zu einem DENY, nicht zu eine Wartezeit, und checkRight öffnet mit "if (!userInfo) Rückgabe falsch", so ein Geschäft Berichterstattung Laden:Funde vor der Dateneinruf macht "keine Erlaubnis" zu einem Mitglied, das das Recht hält, und feuert die zwanzig "useEffect(..., [Laden])" umleitet, die die Leserechte auf der ersten non-loading render. Nichts stürzt ab und kein Test fällt aus. Ebenso darf es nie wieder zu der Wahrheit zurückkehren, oder jeder Wachmann in der App blinkt seinen Ladezustand alle fünf Minuten. Schreiber sind Browser-only durch Konstruktion. Auf dem Server dient ein Prozess jedem Parallelen Anfrage, so dass eine Modulvariable mit den Rechten eines Mitglieds ist eine mit jedem anderen geteilt der render. des Mitglieders veröffentlicht() weigert sich, ohne Fenster zu schreiben und getServerSnapshot gibt einen gefrorene Konstante, anstatt den veränderbaren Schnappschuss zu lesen. Diese Konstante ist auch obligatorisch: die authentifizierte Shell wird server-gerendert und dieser Hook wird während des Serverpasses von der Root-Layout-Client-Baum, wo React 19 wirft statt fallen zurück, ohne Grenze über AuthedChrome, um es zu fangen. Der Schnappschuss wird gehalten, nie wieder aufgebaut. loadUserInfoShared gibt jeweils ein frisch gepartes Objekt zurück Zeit, das ist genau, warum alle 27 Instanzen wieder ausgeschrieben; ein getSnapshot, der gebaut würde nicht nur wieder-Rand, sondern werfen. Äquivalente Nutzlasten veröffentlichen überhaupt nicht mehr, so dass die Verbraucher Abschaltdaten aus der BenutzerInfo-Identität - EinstellungenAppPinsContext Navi-Gate vor allem - Haltestelle Recomputing alle fünf Minuten für eine Nutzlast, die sich nicht geändert hat. Drei Entscheidungen, die es wert sind, benennt zu werden, weil jede eine vertretbare Alternative hatte: Die /logout-Navigation ist jetzt abgesperrt, da es ein Abonnent ist. Die alte isMountedRef Wache saß über dem Schalter, nicht auf einem setState, so übersprungen die Umleitung zu - eine Instanz, die unmounted Mitte des Fluges nicht navigieren. Löschen der ref geradezu, das ist die übliche Bewegung bei der Annahme eines Modul-Store, würde stillschweigend gefördert haben, dass Umleitung von bedingt zu bedingungslos. Nur die erste Ladung ist im Vordergrund; spätere Halterung aktualisieren sich im Hintergrund. Rechte bleiben so frisch auf der Navigation wie zuvor, aber ein transienter Fehler auf einer späten Halterung kann nicht mehr leeren userInfo für alle 27 Verbraucher, wenn es zuvor nur ausgeblendet die eine Instanz, die es getroffen. Die sieben externen loadUserInfoShared Anrufer veröffentlichen absichtlich nicht. Sie feuern auf websocket wieder zu beliebigen Zeiten verbinden, und fahren das Produkt Gating von einer Triggeroberfläche Niemand beobachtet ist schlimmer als die begrenzte Abgestandenheit nicht zu tun - sie lesen Skalar Identität, die sich innerhalb einer Sitzung nicht ändern kann. Die Accesser werden als einfache Pfeile absichtlich gelassen. Sie zu stabilisieren ist hier der natürliche Instinkt und geräuschlos neun Anrufseiten . Verwenden Sie HrOverview, verwenden SubscriptionPermissions, PlatformRightsContext und sechs andere, die von der heutigen instabilen Identität abhängen, um frisch zu bleiben, Rechen Sie einmal gegen einen Null-Schnappschuss statt. Die /logout erlaubenlist Eintrag in check-client-navigation.mjs folgt der Linie, für die es existiert. Verifiziert: tsc clean, alle 10 Wachen bestehen, 3286 Tests grün, Produktion Build-Kompilationen, und die Standalone-Server macht immer noch die authentifizierte Shell - 200, 16.238 Bytes von DOM über 153 Elemente, zwei Header, zehn Buttons, My Businesses / Mein Profil / Ausloggen. Will einen Menschen zu Klicken Sie sich durch rechts-gated nav, ein Limited-Rechte-Mitglied, und eine ablaufende Sitzung vor ihm Schiffe.