@nodefony/realtime 10.0.0-beta.2 → 10.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +2 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.152.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.152.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorateMetadata.js +1 -1
  4. package/dist/index.js +17 -10
  5. package/dist/nodefony/config/config.js +6 -3
  6. package/dist/nodefony/config/configSchema.js +19 -0
  7. package/dist/nodefony/config/defineModuleConfig.js +42 -15
  8. package/dist/nodefony/decorators/realtimeDecorators.js +68 -17
  9. package/dist/nodefony/src/backplane/RedisBackplane.js +21 -4
  10. package/dist/nodefony/src/backplane/bootNotices.js +43 -0
  11. package/dist/nodefony/src/backplane/publishQueue.js +1 -4
  12. package/dist/nodefony/src/cluster/ClusterProbeClient.js +15 -4
  13. package/dist/nodefony/src/guards.js +41 -0
  14. package/dist/nodefony/src/server/AnonymousRealtimeToken.js +1 -4
  15. package/dist/nodefony/src/server/RealtimeController.js +120 -50
  16. package/dist/nodefony/src/server/RealtimeHub.js +29 -51
  17. package/dist/nodefony/src/server/ServerRealtimeSocket.js +13 -5
  18. package/dist/nodefony/src/server/syslogUplink.js +4 -2
  19. package/dist/nodefony/src/service/RealtimeService.js +3 -2
  20. package/dist/nodefony/testing/index.js +41 -1
  21. package/dist/types/nodefony/config/configSchema.d.ts +12 -0
  22. package/dist/types/nodefony/config/defineModuleConfig.d.ts +29 -6
  23. package/dist/types/nodefony/decorators/realtimeDecorators.d.ts +19 -2
  24. package/dist/types/nodefony/interfaces/IRealtimeController.d.ts +1 -1
  25. package/dist/types/nodefony/interfaces/IRealtimeHandshake.d.ts +1 -1
  26. package/dist/types/nodefony/src/backplane/RedisBackplane.d.ts +7 -0
  27. package/dist/types/nodefony/src/backplane/bootNotices.d.ts +25 -0
  28. package/dist/types/nodefony/src/guards.d.ts +32 -0
  29. package/dist/types/nodefony/src/server/AnonymousRealtimeToken.d.ts +13 -0
  30. package/dist/types/nodefony/src/server/RealtimeController.d.ts +24 -4
  31. package/dist/types/nodefony/src/server/RealtimeHub.d.ts +22 -16
  32. package/dist/types/nodefony/src/service/RealtimeService.d.ts +1 -1
  33. package/dist/types/nodefony/testing/index.d.ts +2 -2
  34. package/docs/actions.md +111 -28
  35. package/docs/architecture.md +77 -75
  36. package/docs/cadence-et-contre-pression.md +634 -0
  37. package/docs/configuration.md +39 -34
  38. package/docs/cookbook-chat.md +31 -27
  39. package/docs/index.md +35 -21
  40. package/docs/observabilite.md +17 -15
  41. package/docs/protocole.md +74 -63
  42. package/docs/securite.md +49 -49
  43. package/docs/vocabulaire.md +76 -75
  44. package/package.json +16 -12
  45. package/docs/couverture-bancs.md +0 -139
@@ -1,139 +0,0 @@
1
- ---
2
- title: "Ce que les bancs du temps réel n'éprouvent PAS"
3
- navTitle: Couverture des bancs
4
- lang: fr
5
- module: "@nodefony/realtime"
6
- topic: realtime
7
- coverageModule: realtime
8
- section: "Realtime"
9
- audience: [developer]
10
- tags: [realtime, tests, couverture, bancs, trous, e2e, charge]
11
- version: "doc"
12
- status: stable
13
- publish: false
14
- source: "src/packages/@nodefony/realtime/docs/couverture-bancs.md"
15
- ---
16
-
17
- # Ce que les bancs du temps réel n'éprouvent PAS
18
-
19
- Le temps réel est la clé de voûte du framework — HTTP et WebSocket dans le même
20
- contexte de contrôleur est ce qui distingue Nodefony. Sa couverture de bancs a des
21
- trous, et le vrai problème n'est pas qu'il en reste : c'est que **personne n'avait
22
- établi la liste**. Tant qu'elle n'existe pas, chaque défaut se découvre par
23
- accident — c'est arrivé deux fois en une semaine, dont une frame que le serveur
24
- émettait et que le client jetait en silence.
25
-
26
- Cette page est la liste. Elle se **remesure**, elle ne se relit pas de confiance.
27
-
28
- ## La mesure, et ce qu'elle vaut
29
-
30
- ```bash
31
- node scripts/realtime-coverage-map.mjs # le relevé lisible
32
- node scripts/realtime-coverage-map.mjs --json # pour un autre outil
33
- ```
34
-
35
- Le critère est mécanique : **un fichier de test ATTEINT-il ce module ?** —
36
- directement, ou à travers un module source lui-même testé. Il ne juge pas si le
37
- test l'exerce vraiment : un import peut ne servir qu'à un décor.
38
- Il balaie tout `src/`, plus les scripts de charge du skill `nodefony-load-test`,
39
- et range chaque banc par son CHEMIN (`/tests/integration/`, `.e2e.`,
40
- `/tests/websockets/` → jonction ; `.mjs` du skill → charge ; le reste → unitaire).
41
-
42
- **Sa limite, à connaître avant de croire un verdict : atteint n'est pas
43
- exercé.** Un module peut être importé pour un décor, ou traversé sans que sa
44
- logique propre soit éprouvée — cela ne se voit qu'en lisant le banc. La colonne
45
- « atteints à travers un module testé » est là pour ça : elle nomme le chemin,
46
- elle ne délivre pas un quitus.
47
-
48
- > ⚠️ Cet instrument a rendu **trois** verdicts faux avant d'être corrigé, et
49
- > chacun accusait le code au lieu de lui-même. Une première version ne balayait
50
- > que les tests du module `realtime` et accusait `BrowserWsTransport` : un
51
- > périmètre trop étroit ne rend pas un verdict incomplet, il rend un verdict
52
- > FAUX. La suivante ne voyait que l'import DIRECT et a déclaré `publishQueue`
53
- > « éprouvé par personne » alors qu'un banc portant son nom
54
- > (`backplanePublishQueue.test.ts`) l'exerce depuis des semaines à travers
55
- > `RedisBackplane` — le relevé l'avait sous les yeux, dans sa propre colonne.
56
- > Deux tickets ont été ouverts sur ces faux. Une carte de couverture se
57
- > contrôle comme le reste : par le terrain, pas par sa sortie.
58
-
59
- ## Les trous, et ce qu'ils coûtent
60
-
61
- ### Aucun test ne les atteint
62
-
63
- **Aucun.** Les trente modules source du temps réel sont atteints par au moins un
64
- banc. Ce n'est pas un quitus — voir la section suivante, puis celle des modules
65
- jamais éprouvés dans la jonction.
66
-
67
- ### Atteints seulement À TRAVERS un module testé
68
-
69
- | Module | Chemin d'atteinte |
70
- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
71
- | `publishQueue` | via `RedisBackplane` — `backplanePublishQueue.test.ts` (11 cas : saturation, anti-famine, drainage, échec du bus, hystérésis de l'annonce, ordre du jeté, contrôle négatif synchrone) et le banc de contre-pression RÉELLE de `RedisBackplane.test.ts` contre un vrai bus. |
72
- | `BrowserWsTransport` | via `RealtimeClient` — `client-isomorphe-e2e.test.ts` (`@nodefony/http`) monte un vrai serveur WSS et un vrai client. Sa logique propre (états, reconnexion, codes de fermeture) n'est éprouvée qu'à travers ce que le client en fait. |
73
-
74
- ### Éprouvés en unitaire, jamais dans la jonction
75
-
76
- Ces modules ont des cas unitaires, mais **aucun banc ne les fait travailler avec
77
- un serveur en face**. C'est la forme d'angle mort qui a laissé passer les deux
78
- défauts de la semaine : la logique était juste des deux côtés, c'est le fil entre
79
- les deux qui ne portait pas.
80
-
81
- | Module | Éprouvé par | Ce que la jonction prouverait en plus |
82
- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
83
- | `AdaptiveRate` | `AdaptiveRate.test.ts` | La cadence est calculée côté client ; rien ne montre qu'elle ARRIVE au hub et qu'il l'applique. Le fil peut être coupé sans qu'un cas tombe. |
84
- | `WsConnectionTransport` | `backpressureConfig.test.ts`, `WsConnectionTransport.test.ts` | Le seuil de consommateur lent est configuré et mesuré, jamais FRANCHI avec un vrai client au bout. |
85
- | `LoopbackBackplane` | `channelOwnership.test.ts`, `RealtimeHub.test.ts` | Le fond de panier mono-processus est le défaut de toute application : c'est le seul chemin que personne ne prouve de bout en bout. |
86
- | `originId` | `originId.test.ts`, `RealtimeHub.test.ts` | Deux pods qui se donnent le même identifiant d'origine (même nom d'hôte sous Kubernetes) laisseraient passer un double fan-out. |
87
- | `deniedDetail`, `welcomeEnv` | leurs cas unitaires | Tous deux décident ce qu'un visiteur APPREND selon le mode d'exécution. Leur jonction est désormais couverte pour le welcome (`realtimeChannelAuth.e2e.test.ts`), pas pour le refus. |
88
- | `notice`, `observe`, `localEvents`, `IRealtimeSocket` | cas unitaires du client | La surface que consomme une application (observables, avis) n'est jamais exercée contre un serveur réel. |
89
- | `backplaneRegistry`, `ClusterProbeClient`, `RealtimeAdminApi`, `ClusterBackplane`, `channelRate`, `AnonymousRealtimeToken` | cf le relevé | Voir la carte complète ci-dessous. |
90
-
91
- ## La carte complète
92
-
93
- | Module | Étages | Bancs (3 premiers) |
94
- | ------------------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------- |
95
- | `AdaptiveRate` | unit · charge | `AdaptiveRate.test.ts`, `aimd-demo.mjs` |
96
- | `AnonymousRealtimeToken` | unit | `RealtimeHubSecurity.test.ts`, `RealtimeController.test.ts`, `RealtimeService.test.ts` |
97
- | `backplaneRegistry` | unit | `healthBackplaneDrivers.test.ts`, `backplaneRegistry.test.ts` |
98
- | `channelRate` | unit | `platformChannels.test.ts`, `channelRate.test.ts` |
99
- | `ClusterBackplane` | unit · charge | `ClusterBackplane.test.ts`, `backplaneRegistry.test.ts`, `cluster-ipc.mjs` |
100
- | `ClusterProbeClient` | unit · charge | `ClusterProbeClient.test.ts`, `cluster-health-endpoint-e2e.mjs`, `cluster-orm-rich-e2e.mjs` |
101
- | `deniedDetail` | unit | `deniedDetail.test.ts` |
102
- | `envelope` | unit · e2e | `backplaneInjection.attack.test.ts`, `RedisBackplane.test.ts` |
103
- | `IRealtimeSocket` | unit | `RealtimeSocket.test.ts`, `AdaptiveRate.test.ts` |
104
- | `IRealtimeTransport` | unit · e2e | `clientAngular.test.ts`, `clientSvelte.test.ts`, `RealtimeSocket.test.ts` |
105
- | `JsonRpcPeer` | unit · e2e | `JsonRpcPeer.types.test.ts`, `JsonRpcPeer.test.ts`, `realtimeControllerPaths.e2e.test.ts` |
106
- | `localEvents` | unit | `clientObserve.test.ts` |
107
- | `LoopbackBackplane` | unit | `channelOwnership.test.ts`, `RealtimeHub.test.ts`, `backplaneRegistry.test.ts` |
108
- | `notice` | unit | `RealtimeNotice.test.ts`, `clientObserve.test.ts` |
109
- | `observe` | unit · charge | `clientObserve.test.ts`, `db-backend-cost.mjs`, `aimd-demo.mjs` |
110
- | `originId` | unit · charge | `originId.test.ts`, `RealtimeHub.test.ts`, `cluster-ipc.mjs` |
111
- | `platformChannels` | unit · e2e | `platformChannels.test.ts`, `clientSyslogUplink.test.ts`, `clientObserve.test.ts` |
112
- | `RealtimeAdminApi` | unit | `healthBackplaneDrivers.test.ts` |
113
- | `RealtimeClient` | unit · e2e | `NodefonyProvider.test.ts`, `clientAngular.test.ts`, `clientSvelte.test.ts` |
114
- | `RealtimeController` | unit · e2e | `realtimeChannelCap.attack.test.ts`, `realtimeUnknownChannel.test.ts`, `RealtimeController.test.ts` |
115
- | `RealtimeEventMap` | unit · e2e | `JsonRpcPeer.types.test.ts`, `RealtimeClient.types.test.ts`, `JsonRpcPeer.test.ts` |
116
- | `RealtimeHub` | unit · e2e · charge | `realtimeUnenforcedPolicy.attack.test.ts`, `realtimeRevocation.attack.test.ts`, `realtimeChannelCap.attack.test.ts` |
117
- | `RealtimeService` | unit · e2e | `RealtimeService.test.ts`, `realtimeFirewallWiring.e2e.test.ts` |
118
- | `RedisBackplane` | unit · e2e | `RedisBackplane.test.ts`, `backplaneInjection.attack.test.ts`, `backplanePublishQueue.test.ts` |
119
- | `ServerRealtimeSocket` | unit · e2e | `channelOwnership.test.ts`, `realtimeLoopback.e2e.test.ts` |
120
- | `syslogUplink` | unit · e2e | `syslogUplink.test.ts`, `syslogUplink.e2e.test.ts` |
121
- | `welcomeEnv` | unit | `welcomeEnv.test.ts` |
122
- | `WsConnectionTransport` | unit | `backpressureConfig.test.ts`, `WsConnectionTransport.test.ts` |
123
-
124
- ## Ce qui est éprouvé, et bien
125
-
126
- - **La jonction client ↔ serveur** : `realtimeLoopback.e2e.test.ts` relie un VRAI
127
- `RealtimeClient` à un VRAI `RealtimeController` par un câble en mémoire.
128
- - **L'autorisation, identité par identité** : `realtimeChannelAuth.e2e.test.ts` —
129
- matrice `identité × canal` pour `subscribe`, et désormais pour ce que le
130
- `realtime:welcome` ANNONCE.
131
- - **Le fond de panier Redis et l'IPC de cluster**, y compris cross-pod, derrière
132
- leurs variables d'infrastructure (`NF_REDIS_TEST_URL`, `NF_RUN_CLUSTER_E2E`) —
133
- **absentes, ces suites se sautent, et un banc sauté compte comme vert**.
134
-
135
- ## Ce que cette page ne couvre pas
136
-
137
- Les scripts de charge sont comptés par la MENTION du nom, pas par un import :
138
- ils parlent au serveur, ils ne l'importent pas. Leur colonne dit donc « un script
139
- de charge parle de ce mécanisme », jamais « il le mesure ».