@nodefony/realtime 10.0.0-beta.5 → 10.0.0-beta.6

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 (78) hide show
  1. package/README.md +50 -0
  2. package/dist/_virtual/{_@oxc-project_runtime@0.155.0 → _@oxc-project_runtime@0.157.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/index.js +79 -12
  4. package/dist/nodefony/config/config.js +7 -0
  5. package/dist/nodefony/decorators/realtimeDecorators.js +125 -19
  6. package/dist/nodefony/interfaces/IRealtimeConnection.js +1 -0
  7. package/dist/nodefony/src/backplane/ClusterBackplane.js +32 -4
  8. package/dist/nodefony/src/backplane/RedisBackplane.js +143 -31
  9. package/dist/nodefony/src/backplane/controlOrder.js +57 -0
  10. package/dist/nodefony/src/backplane/envelope.js +113 -12
  11. package/dist/nodefony/src/cluster/ClusterProbeClient.js +2 -0
  12. package/dist/nodefony/src/server/AnonymousRealtimeToken.js +23 -2
  13. package/dist/nodefony/src/server/ContractRealtimeController.js +75 -0
  14. package/dist/nodefony/src/server/RealtimeConnection.js +110 -0
  15. package/dist/nodefony/src/server/RealtimeController.js +340 -81
  16. package/dist/nodefony/src/server/RealtimeHub.js +604 -61
  17. package/dist/nodefony/src/server/ServerRealtimeSocket.js +2 -0
  18. package/dist/nodefony/src/server/admissionBudget.js +176 -0
  19. package/dist/nodefony/src/server/channelPolicyRegistry.js +73 -0
  20. package/dist/nodefony/src/server/connectionAdmission.js +242 -0
  21. package/dist/nodefony/src/server/contractRoutes.js +85 -0
  22. package/dist/nodefony/src/server/deniedDetail.js +10 -3
  23. package/dist/nodefony/src/server/frameAdmission.js +168 -0
  24. package/dist/nodefony/src/server/subscribedAck.js +10 -1
  25. package/dist/nodefony/src/server/syslogUplink.js +3 -4
  26. package/dist/nodefony/src/server/welcomeIdentity.js +37 -0
  27. package/dist/nodefony/src/service/RealtimeService.js +42 -1
  28. package/dist/nodefony/src/service/publicOrigin.js +40 -0
  29. package/dist/nodefony/src/transport/WsConnectionTransport.js +27 -4
  30. package/dist/nodefony/testing/backplaneConformance.js +271 -0
  31. package/dist/nodefony/testing/index.js +21 -4
  32. package/dist/types/index.d.ts +34 -7
  33. package/dist/types/nodefony/config/config.d.ts +9 -0
  34. package/dist/types/nodefony/decorators/realtimeDecorators.d.ts +86 -6
  35. package/dist/types/nodefony/interfaces/IBackplane.d.ts +34 -50
  36. package/dist/types/nodefony/interfaces/IChannelPolicy.d.ts +5 -25
  37. package/dist/types/nodefony/interfaces/IRealtimeConnection.d.ts +22 -0
  38. package/dist/types/nodefony/interfaces/IRealtimeConnectionState.d.ts +41 -2
  39. package/dist/types/nodefony/interfaces/IRealtimeController.d.ts +64 -3
  40. package/dist/types/nodefony/interfaces/IRealtimeProbe.d.ts +7 -166
  41. package/dist/types/nodefony/interfaces/IRealtimeToken.d.ts +21 -0
  42. package/dist/types/nodefony/interfaces/index.d.ts +2 -1
  43. package/dist/types/nodefony/src/backplane/ClusterBackplane.d.ts +22 -4
  44. package/dist/types/nodefony/src/backplane/RedisBackplane.d.ts +79 -16
  45. package/dist/types/nodefony/src/backplane/controlOrder.d.ts +52 -0
  46. package/dist/types/nodefony/src/backplane/envelope.d.ts +34 -0
  47. package/dist/types/nodefony/src/server/AnonymousRealtimeToken.d.ts +10 -0
  48. package/dist/types/nodefony/src/server/ContractRealtimeController.d.ts +138 -0
  49. package/dist/types/nodefony/src/server/RealtimeConnection.d.ts +17 -0
  50. package/dist/types/nodefony/src/server/RealtimeController.d.ts +91 -11
  51. package/dist/types/nodefony/src/server/RealtimeHub.d.ts +321 -24
  52. package/dist/types/nodefony/src/server/ServerRealtimeSocket.d.ts +1 -1
  53. package/dist/types/nodefony/src/server/admissionBudget.d.ts +71 -0
  54. package/dist/types/nodefony/src/server/channelPolicyRegistry.d.ts +34 -0
  55. package/dist/types/nodefony/src/server/connectionAdmission.d.ts +68 -0
  56. package/dist/types/nodefony/src/server/contractRoutes.d.ts +42 -0
  57. package/dist/types/nodefony/src/server/deniedDetail.d.ts +6 -0
  58. package/dist/types/nodefony/src/server/frameAdmission.d.ts +70 -0
  59. package/dist/types/nodefony/src/server/subscribedAck.d.ts +7 -0
  60. package/dist/types/nodefony/src/server/welcomeIdentity.d.ts +19 -0
  61. package/dist/types/nodefony/src/service/RealtimeService.d.ts +10 -2
  62. package/dist/types/nodefony/src/service/publicOrigin.d.ts +19 -0
  63. package/dist/types/nodefony/src/transport/WsConnectionTransport.d.ts +16 -30
  64. package/dist/types/nodefony/testing/backplaneConformance.d.ts +66 -0
  65. package/dist/types/nodefony/testing/index.d.ts +12 -1
  66. package/docs/actions.md +419 -18
  67. package/docs/architecture.md +83 -8
  68. package/docs/cadence-et-contre-pression.md +87 -11
  69. package/docs/canaux-a-membres.md +267 -0
  70. package/docs/cas-d-usage.md +1702 -0
  71. package/docs/configuration.md +137 -17
  72. package/docs/cookbook-chat.md +314 -85
  73. package/docs/index.md +11 -1
  74. package/docs/observabilite.md +71 -14
  75. package/docs/protocole.md +133 -24
  76. package/docs/securite.md +284 -32
  77. package/docs/vocabulaire.md +13 -12
  78. package/package.json +14 -11
@@ -0,0 +1,110 @@
1
+ // nodefony/src/server/RealtimeConnection.ts
2
+ /**
3
+ * Poignée d'une connexion temps réel servie par ce processus — implémente {@link IRealtimeConnection}.
4
+ *
5
+ * Créée paresseusement par le contrôleur, au premier abonnement ou à la
6
+ * première trame entrante de la connexion (jamais au welcome : une connexion
7
+ * qui ne fait ni l'un ni l'autre n'en paie aucune). Fermée au `onFinish` de la
8
+ * socket : les gestes du hub rendent alors `false`, et les abonnements imposés
9
+ * en attente se soldent par un refus.
10
+ *
11
+ * @internal Le type public est {@link IRealtimeConnection} ; seuls le hub et le
12
+ * contrôleur appellent les méthodes de cette classe.
13
+ */
14
+ var RealtimeConnection = class {
15
+ #host;
16
+ #identify;
17
+ #userId = null;
18
+ #open = true;
19
+ #imposing = null;
20
+ /**
21
+ * @param host - le contrôleur qui sert la connexion.
22
+ * @param identify - lit l'identifiant du compte, figé au handshake ; appelé
23
+ * au plus une fois.
24
+ */
25
+ constructor(host, identify) {
26
+ this.#host = host;
27
+ this.#identify = identify;
28
+ }
29
+ /** Identifiant du compte connecté ; `null` pour l'anonyme. */
30
+ get userId() {
31
+ const identify = this.#identify;
32
+ if (identify !== null) {
33
+ this.#identify = null;
34
+ this.#userId = identify();
35
+ }
36
+ return this.#userId;
37
+ }
38
+ /** `false` une fois la socket fermée. */
39
+ get open() {
40
+ return this.#open;
41
+ }
42
+ /**
43
+ * Impose l'abonnement à `channel` — même politique, même `allow` qu'un `subscribe` du client.
44
+ *
45
+ * @returns une promesse résolue à `true` une fois l'abonnement acquitté, à
46
+ * `false` s'il est refusé, si la connexion se ferme avant, ou si le client
47
+ * s'en désabonne pendant l'attente.
48
+ */
49
+ impose(channel) {
50
+ if (!this.#open) return Promise.resolve(false);
51
+ const imposing = this.#imposing ??= /* @__PURE__ */ new Map();
52
+ const pending = imposing.get(channel);
53
+ if (pending !== void 0) return new Promise((resolve) => {
54
+ pending.settle.push(resolve);
55
+ });
56
+ const entry = {
57
+ settle: [],
58
+ clientAsked: false
59
+ };
60
+ const verdict = new Promise((resolve) => {
61
+ entry.settle.push(resolve);
62
+ });
63
+ imposing.set(channel, entry);
64
+ this.#host.impose(channel);
65
+ return verdict;
66
+ }
67
+ /**
68
+ * Met fin à l'abonnement de cette connexion à `channel`.
69
+ *
70
+ * @returns `false` si la connexion est fermée ou n'est pas abonnée au canal.
71
+ */
72
+ end(channel, reason) {
73
+ return this.#open && this.#host.end(channel, reason);
74
+ }
75
+ /** Un abonnement imposé à `channel` attend-il son verdict ? */
76
+ isImposing(channel) {
77
+ return this.#imposing?.has(channel) === true;
78
+ }
79
+ /** Le client demande `channel` pendant l'attente de son imposition : un refus lui sera dû. */
80
+ markClientAsked(channel) {
81
+ const entry = this.#imposing?.get(channel);
82
+ if (entry !== void 0) entry.clientAsked = true;
83
+ }
84
+ /**
85
+ * Solde l'abonnement imposé à `channel`, s'il y en a un.
86
+ *
87
+ * @returns `true` si le refus doit AUSSI être rendu au client (il avait
88
+ * demandé ce canal) ou s'il n'y avait pas d'imposition en cours — dans les
89
+ * deux cas l'appelant suit son chemin habituel ; `false` si le refus
90
+ * n'appartient qu'à l'appelant serveur.
91
+ */
92
+ settleImposed(channel, subscribed) {
93
+ const imposing = this.#imposing;
94
+ const entry = imposing?.get(channel);
95
+ if (imposing === null || entry === void 0) return true;
96
+ imposing.delete(channel);
97
+ if (imposing.size === 0) this.#imposing = null;
98
+ for (const settle of entry.settle) settle(subscribed);
99
+ return entry.clientAsked;
100
+ }
101
+ /** Fermeture de la socket : la poignée ne désigne plus rien, les impositions en attente échouent. */
102
+ close() {
103
+ this.#open = false;
104
+ const imposing = this.#imposing;
105
+ if (imposing === null) return;
106
+ this.#imposing = null;
107
+ for (const entry of imposing.values()) for (const settle of entry.settle) settle(false);
108
+ }
109
+ };
110
+ export { RealtimeConnection };