@nodefony/realtime 10.0.0-beta.1 → 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.
- package/README.md +2 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorateMetadata.js +1 -1
- package/dist/index.js +17 -10
- package/dist/nodefony/config/config.js +6 -3
- package/dist/nodefony/config/configSchema.js +19 -0
- package/dist/nodefony/config/defineModuleConfig.js +42 -15
- package/dist/nodefony/decorators/realtimeDecorators.js +68 -17
- package/dist/nodefony/src/backplane/RedisBackplane.js +21 -4
- package/dist/nodefony/src/backplane/bootNotices.js +43 -0
- package/dist/nodefony/src/backplane/publishQueue.js +1 -4
- package/dist/nodefony/src/cluster/ClusterProbeClient.js +15 -4
- package/dist/nodefony/src/guards.js +41 -0
- package/dist/nodefony/src/server/AnonymousRealtimeToken.js +1 -4
- package/dist/nodefony/src/server/RealtimeController.js +120 -50
- package/dist/nodefony/src/server/RealtimeHub.js +29 -51
- package/dist/nodefony/src/server/ServerRealtimeSocket.js +13 -5
- package/dist/nodefony/src/server/syslogUplink.js +4 -2
- package/dist/nodefony/src/service/RealtimeService.js +3 -2
- package/dist/nodefony/testing/index.js +41 -1
- package/dist/types/nodefony/config/configSchema.d.ts +12 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +29 -6
- package/dist/types/nodefony/decorators/realtimeDecorators.d.ts +19 -2
- package/dist/types/nodefony/interfaces/IRealtimeController.d.ts +1 -1
- package/dist/types/nodefony/interfaces/IRealtimeHandshake.d.ts +1 -1
- package/dist/types/nodefony/src/backplane/RedisBackplane.d.ts +7 -0
- package/dist/types/nodefony/src/backplane/bootNotices.d.ts +25 -0
- package/dist/types/nodefony/src/guards.d.ts +32 -0
- package/dist/types/nodefony/src/server/AnonymousRealtimeToken.d.ts +13 -0
- package/dist/types/nodefony/src/server/RealtimeController.d.ts +24 -4
- package/dist/types/nodefony/src/server/RealtimeHub.d.ts +22 -16
- package/dist/types/nodefony/src/service/RealtimeService.d.ts +1 -1
- package/dist/types/nodefony/testing/index.d.ts +2 -2
- package/docs/actions.md +124 -41
- package/docs/architecture.md +93 -91
- package/docs/cadence-et-contre-pression.md +634 -0
- package/docs/configuration.md +66 -56
- package/docs/cookbook-chat.md +39 -33
- package/docs/index.md +47 -31
- package/docs/observabilite.md +21 -18
- package/docs/protocole.md +79 -65
- package/docs/securite.md +69 -65
- package/docs/vocabulaire.md +80 -79
- package/package.json +16 -12
- package/docs/couverture-bancs.md +0 -139
package/docs/couverture-bancs.md
DELETED
|
@@ -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 ».
|