xcraft-core-busclient 5.9.0 → 5.11.0
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 +327 -7
- package/index.js +13 -10
- package/lib/command.js +10 -6
- package/lib/events.js +2 -1
- package/lib/resp.js +23 -24
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -1,10 +1,330 @@
|
|
|
1
|
-
# xcraft-core-busclient
|
|
1
|
+
# 📘 Documentation du module xcraft-core-busclient
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Aperçu
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
commands and send or subscribe to events.
|
|
5
|
+
Le module `xcraft-core-busclient` est le client principal pour le bus de communication Xcraft. Il fournit les interfaces nécessaires pour se connecter à un serveur Xcraft, envoyer des commandes et gérer les événements (publication et souscription). Ce module constitue la couche de communication fondamentale entre les différents composants de l'écosystème Xcraft.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
## Sommaire
|
|
8
|
+
|
|
9
|
+
- [Structure du module](#structure-du-module)
|
|
10
|
+
- [Fonctionnement global](#fonctionnement-global)
|
|
11
|
+
- [Exemples d'utilisation](#exemples-dutilisation)
|
|
12
|
+
- [Interactions avec d'autres modules](#interactions-avec-dautres-modules)
|
|
13
|
+
- [Configuration avancée](#configuration-avancée)
|
|
14
|
+
- [Détails des sources](#détails-des-sources)
|
|
15
|
+
|
|
16
|
+
## Structure du module
|
|
17
|
+
|
|
18
|
+
Le module s'articule autour de plusieurs composants principaux :
|
|
19
|
+
|
|
20
|
+
- **BusClient** : Classe principale gérant la connexion au bus Xcraft
|
|
21
|
+
- **Command** : Gestionnaire pour l'envoi de commandes
|
|
22
|
+
- **Events** : Gestionnaire pour la publication et souscription d'événements
|
|
23
|
+
- **Resp** : Interface de réponse unifiée combinant commandes et événements
|
|
24
|
+
- **Instance globale** : Client partagé entre tous les modules
|
|
25
|
+
|
|
26
|
+
## Fonctionnement global
|
|
27
|
+
|
|
28
|
+
### Architecture de communication
|
|
29
|
+
|
|
30
|
+
Le `BusClient` utilise deux sockets distincts basés sur le module [xcraft-core-transport] :
|
|
31
|
+
|
|
32
|
+
- **Socket SUB** : Pour recevoir les événements et notifications
|
|
33
|
+
- **Socket PUSH** : Pour envoyer les commandes
|
|
34
|
+
|
|
35
|
+
### Mécanisme d'autoconnexion
|
|
36
|
+
|
|
37
|
+
Le client peut fonctionner en deux modes :
|
|
38
|
+
|
|
39
|
+
1. **Mode serveur** : Connexion directe avec un token fourni
|
|
40
|
+
2. **Mode client** : Autoconnexion automatique via le mécanisme de heartbeat
|
|
41
|
+
|
|
42
|
+
Le processus d'autoconnexion :
|
|
43
|
+
|
|
44
|
+
1. Le client s'abonne aux événements `greathall::*`
|
|
45
|
+
2. Il attend le heartbeat du serveur (`greathall::heartbeat`)
|
|
46
|
+
3. Il envoie une commande `autoconnect` avec un token temporaire
|
|
47
|
+
4. Le serveur répond avec le token définitif et les informations de configuration
|
|
48
|
+
|
|
49
|
+
### Gestion des reconnexions
|
|
50
|
+
|
|
51
|
+
Le système détecte automatiquement les déconnexions et tente de se reconnecter :
|
|
52
|
+
|
|
53
|
+
- Détection des pertes de connexion sur les deux sockets
|
|
54
|
+
- Mécanisme de reconnexion automatique avec gestion des timeouts
|
|
55
|
+
- Émission d'événements pour notifier les changements d'état
|
|
56
|
+
- Protection spéciale pour les nœuds internes (localhost) qui provoquent un arrêt complet en cas de perte
|
|
57
|
+
|
|
58
|
+
### Sécurité et authentification
|
|
59
|
+
|
|
60
|
+
Le module supporte plusieurs mécanismes de sécurité :
|
|
61
|
+
|
|
62
|
+
- **TLS** : Chiffrement des communications avec certificats
|
|
63
|
+
- **Tokens** : Authentification par tokens dynamiques
|
|
64
|
+
- **Certificats clients** : Authentification mutuelle pour les hordes
|
|
65
|
+
- **Gatekeeper** : Système de contrôle d'accès avancé
|
|
66
|
+
|
|
67
|
+
## Exemples d'utilisation
|
|
68
|
+
|
|
69
|
+
### Utilisation du client global
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
const xBusClient = require('xcraft-core-busclient');
|
|
73
|
+
|
|
74
|
+
// Initialisation du client global
|
|
75
|
+
const globalClient = xBusClient.initGlobal();
|
|
76
|
+
|
|
77
|
+
// Connexion au serveur
|
|
78
|
+
globalClient.connect('ee', null, (err) => {
|
|
79
|
+
if (err) {
|
|
80
|
+
console.error('Erreur de connexion:', err);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
console.log('Connecté au bus Xcraft');
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Envoi de commandes
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
const resp = xBusClient.newResponse('mon-module', 'greathall');
|
|
91
|
+
|
|
92
|
+
// Envoi d'une commande avec callback
|
|
93
|
+
resp.command.send('warehouse.get', {path: 'app.name'}, (err, result) => {
|
|
94
|
+
if (err) {
|
|
95
|
+
console.error('Erreur:', err);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log('Résultat:', result.data);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Envoi asynchrone
|
|
102
|
+
const result = await resp.command.sendAsync('warehouse.get', {
|
|
103
|
+
path: 'app.name',
|
|
104
|
+
});
|
|
105
|
+
console.log('Résultat:', result);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Gestion des événements
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
// Souscription à un événement
|
|
112
|
+
const unsubscribe = resp.events.subscribe('warehouse::changed', (msg) => {
|
|
113
|
+
console.log('Warehouse modifié:', msg.data);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Publication d'un événement (côté serveur uniquement)
|
|
117
|
+
resp.events.send('mon-module::status.changed', {status: 'ready'});
|
|
118
|
+
|
|
119
|
+
// Désabonnement
|
|
120
|
+
unsubscribe();
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Instance personnalisée avec TLS
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
const {BusClient} = require('xcraft-core-busclient');
|
|
127
|
+
|
|
128
|
+
// Configuration personnalisée avec TLS
|
|
129
|
+
const customConfig = {
|
|
130
|
+
host: 'remote-server.com',
|
|
131
|
+
commanderPort: 3001,
|
|
132
|
+
notifierPort: 3002,
|
|
133
|
+
caPath: '/path/to/server-cert.pem',
|
|
134
|
+
keyPath: '/path/to/client-key.pem',
|
|
135
|
+
certPath: '/path/to/client-cert.pem',
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const customClient = new BusClient(customConfig);
|
|
139
|
+
customClient.connect('axon', null, (err) => {
|
|
140
|
+
// Gestion de la connexion
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Gestion des reconnexions
|
|
145
|
+
|
|
146
|
+
```javascript
|
|
147
|
+
const resp = xBusClient.newResponse('mon-module', 'greathall');
|
|
148
|
+
|
|
149
|
+
// Écoute des événements de reconnexion
|
|
150
|
+
const unsubReconnect = resp.onReconnect((status) => {
|
|
151
|
+
if (status === 'attempt') {
|
|
152
|
+
console.log('Tentative de reconnexion...');
|
|
153
|
+
} else if (status === 'done') {
|
|
154
|
+
console.log('Reconnexion réussie');
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Écoute des changements de token
|
|
159
|
+
const unsubToken = resp.onTokenChanged((busConfig) => {
|
|
160
|
+
console.log('Token changé, nouvelle configuration:', busConfig);
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Interactions avec d'autres modules
|
|
165
|
+
|
|
166
|
+
### Modules de transport
|
|
167
|
+
|
|
168
|
+
- **[xcraft-core-transport]** : Fournit les sockets Router pour la communication
|
|
169
|
+
- **[xcraft-core-bus]** : Interface serveur complémentaire
|
|
170
|
+
|
|
171
|
+
### Modules de configuration
|
|
172
|
+
|
|
173
|
+
- **[xcraft-core-etc]** : Gestion de la configuration du bus
|
|
174
|
+
- **[xcraft-core-host]** : Informations sur l'environnement d'exécution
|
|
175
|
+
|
|
176
|
+
### Modules utilitaires
|
|
177
|
+
|
|
178
|
+
- **[xcraft-core-log]** : Système de logging
|
|
179
|
+
- **[xcraft-core-utils]** : Utilitaires pour la cryptographie et les expressions régulières
|
|
180
|
+
- **fs-extra** : Opérations sur le système de fichiers
|
|
181
|
+
- **uuid** : Génération d'identifiants uniques
|
|
182
|
+
|
|
183
|
+
## Configuration avancée
|
|
184
|
+
|
|
185
|
+
| Option | Description | Type | Valeur par défaut |
|
|
186
|
+
| -------- | ---------------------------------------------- | -------- | ----------------- |
|
|
187
|
+
| `caPath` | Chemin vers le certificat serveur (format PEM) | `string` | `''` |
|
|
188
|
+
|
|
189
|
+
### Variables d'environnement
|
|
190
|
+
|
|
191
|
+
Le module utilise les variables d'environnement via la configuration du bus (`xcraft-core-bus`) :
|
|
192
|
+
|
|
193
|
+
| Variable | Description | Exemple | Valeur par défaut |
|
|
194
|
+
| ------------ | -------------------- | ------- | ----------------- |
|
|
195
|
+
| `XCRAFT_TLS` | Active/désactive TLS | `false` | `true` |
|
|
196
|
+
|
|
197
|
+
## Détails des sources
|
|
198
|
+
|
|
199
|
+
### `index.js`
|
|
200
|
+
|
|
201
|
+
Fichier principal exportant la classe `BusClient` et les fonctions utilitaires. La classe `BusClient` hérite d'`EventEmitter` et gère :
|
|
202
|
+
|
|
203
|
+
- **Connexion** : Établissement et maintien de la connexion au serveur
|
|
204
|
+
- **Autoconnexion** : Mécanisme automatique de connexion via heartbeat
|
|
205
|
+
- **Registre des commandes** : Cache des commandes disponibles sur le serveur
|
|
206
|
+
- **Gestion des tokens** : Authentification et autorisation
|
|
207
|
+
- **Reconnexion** : Détection et récupération des déconnexions
|
|
208
|
+
- **Sécurité TLS** : Gestion des certificats et chiffrement
|
|
209
|
+
- **Gestion des certificats clients** : Support pour l'authentification mutuelle
|
|
210
|
+
|
|
211
|
+
#### Méthodes publiques
|
|
212
|
+
|
|
213
|
+
- **`connect(backend, busToken, callback)`** — Établit la connexion au serveur avec le backend spécifié (ee ou axon)
|
|
214
|
+
- **`stop(callback)`** — Ferme proprement les connexions au bus
|
|
215
|
+
- **`newMessage(topic, which)`** — Crée un nouveau message formaté pour les commandes
|
|
216
|
+
- **`patchMessage(msg)`** — Modifie un message pour le retransmettre à un autre serveur
|
|
217
|
+
- **`registerEvents(topic, handler)`** — Enregistre un gestionnaire d'événements avec support des expressions régulières
|
|
218
|
+
- **`unregisterEvents(topic)`** — Supprime un gestionnaire d'événements
|
|
219
|
+
- **`isConnected()`** — Retourne l'état de connexion
|
|
220
|
+
- **`getToken()`** — Retourne le token d'authentification actuel
|
|
221
|
+
- **`getOrcName()`** — Retourne le nom de l'orc (identifiant du client)
|
|
222
|
+
- **`getCommandsRegistry()`** — Retourne le registre des commandes disponibles
|
|
223
|
+
- **`getCommandsRegistryTime()`** — Retourne l'horodatage du dernier registre de commandes
|
|
224
|
+
- **`getCommandsNames()`** — Retourne la liste des noms de commandes avec leurs prédictions de ranking
|
|
225
|
+
- **`isServerSide()`** — Indique si le client fonctionne côté serveur
|
|
226
|
+
- **`getNice()`** — Retourne la valeur de priorité (nice) du client
|
|
227
|
+
- **`destroyPushSocket()`** — Détruit le socket de commandes
|
|
228
|
+
- **`lastErrorReason`** — Propriété getter retournant la dernière raison d'erreur
|
|
229
|
+
|
|
230
|
+
### `lib/command.js`
|
|
231
|
+
|
|
232
|
+
Gestionnaire pour l'envoi de commandes sur le bus. Cette classe encapsule la logique d'envoi de commandes avec :
|
|
233
|
+
|
|
234
|
+
- **Gestion des callbacks** : Souscription automatique aux événements de fin de commande
|
|
235
|
+
- **Support RPC** : Mécanisme d'appel de procédure distante avec gestion des timeouts
|
|
236
|
+
- **Routage** : Gestion du routage des messages entre différents nœuds
|
|
237
|
+
- **Gestion d'erreurs** : Traitement des erreurs et exceptions avec stack traces
|
|
238
|
+
- **Annulation de commandes** : Mécanisme d'annulation pour les commandes RPC
|
|
239
|
+
- **Gestion des déconnexions** : Annulation automatique des commandes en cours lors de déconnexions
|
|
240
|
+
|
|
241
|
+
#### Méthodes publiques
|
|
242
|
+
|
|
243
|
+
- **`send(cmd, data, which, finishHandler, options, msgContext)`** — Envoie une commande sur le bus avec gestion optionnelle des callbacks
|
|
244
|
+
- **`retry(msg)`** — Retente l'envoi d'un message précédemment échoué
|
|
245
|
+
- **`newMessage(cmd, which)`** — Crée un nouveau message de commande
|
|
246
|
+
- **`connectedWith()`** — Retourne les informations de connexion du socket
|
|
247
|
+
|
|
248
|
+
#### Méthodes statiques
|
|
249
|
+
|
|
250
|
+
- **`abort(commandId)`** — Annule une commande RPC spécifique
|
|
251
|
+
- **`abortAll(err)`** — Annule toutes les commandes RPC en cours
|
|
252
|
+
|
|
253
|
+
### `lib/events.js`
|
|
254
|
+
|
|
255
|
+
Gestionnaire pour la publication et souscription d'événements. Cette classe fournit :
|
|
256
|
+
|
|
257
|
+
- **Souscription multiple** : Support de plusieurs handlers par topic avec gestion fine des désabonnements
|
|
258
|
+
- **Sérialisation** : Sérialisation/désérialisation automatique des objets complexes incluant les fonctions
|
|
259
|
+
- **Filtrage** : Support des expressions régulières pour les topics
|
|
260
|
+
- **Performance** : Optimisations pour réduire le bruit des logs
|
|
261
|
+
- **Gestion des activités** : Support pour les événements d'activité
|
|
262
|
+
|
|
263
|
+
#### Méthodes publiques
|
|
264
|
+
|
|
265
|
+
- **`subscribe(topic, handler, backend, orcName, options)`** — S'abonne à un événement avec un gestionnaire spécifique
|
|
266
|
+
- **`unsubscribeAll(topic, backend, orcName)`** — Se désabonne complètement d'un topic
|
|
267
|
+
- **`send(topic, data, serialize, routing, msgContext)`** — Publie un événement (côté serveur uniquement)
|
|
268
|
+
- **`catchAll(handler, proxy)`** — Capture tous les événements avec un gestionnaire global
|
|
269
|
+
- **`heartbeat()`** — Envoie un heartbeat (côté serveur uniquement)
|
|
270
|
+
- **`lastPerf()`** — Retourne les dernières métriques de performance
|
|
271
|
+
- **`connectedWith()`** — Retourne les informations de connexion du socket
|
|
272
|
+
|
|
273
|
+
#### Propriétés
|
|
274
|
+
|
|
275
|
+
- **`status`** — Énumération des statuts d'événements (succeeded: 1, failed: 2, canceled: 3)
|
|
276
|
+
|
|
277
|
+
### `lib/resp.js`
|
|
278
|
+
|
|
279
|
+
Interface unifiée combinant les fonctionnalités de commandes et d'événements. Cette classe encapsule :
|
|
280
|
+
|
|
281
|
+
- **Interface simplifiée** : API unifiée pour commandes et événements
|
|
282
|
+
- **Gestion du contexte** : Propagation automatique du contexte des messages
|
|
283
|
+
- **Logging intégré** : Système de logs contextualisé par module
|
|
284
|
+
- **Callbacks de lifecycle** : Notifications des changements d'état de connexion
|
|
285
|
+
- **Support des tokens spéciaux** : Gestion du token 'token' pour les communications serveur
|
|
286
|
+
|
|
287
|
+
#### Classes internes
|
|
288
|
+
|
|
289
|
+
**Events** (dans resp.js) :
|
|
290
|
+
|
|
291
|
+
- **`subscribe(topic, handler)`** — Souscription simplifiée avec préfixage automatique du namespace
|
|
292
|
+
- **`send(topic, data, serialize, forwarding, context)`** — Publication avec support du forwarding
|
|
293
|
+
- **`catchAll(handler)`** — Capture globale des événements
|
|
294
|
+
- **`unsubscribeAll(topic)`** — Désabonnement simplifié
|
|
295
|
+
|
|
296
|
+
**Command** (dans resp.js) :
|
|
297
|
+
|
|
298
|
+
- **`sendAsync(cmd, data)`** — Version asynchrone moderne de l'envoi de commandes
|
|
299
|
+
- **`send(cmd, data, finishHandler)`** — Version legacy avec callback (dépréciée)
|
|
300
|
+
- **`nestedSend(cmd, data, finishHandler)`** — Version legacy pour commandes imbriquées (dépréciée)
|
|
301
|
+
- **`retry(msg)`** — Nouvelle tentative d'envoi
|
|
302
|
+
|
|
303
|
+
#### Méthodes publiques de Resp
|
|
304
|
+
|
|
305
|
+
- **`onTokenChanged(callback)`** — Écoute les changements de token d'authentification
|
|
306
|
+
- **`onOrcnameChanged(callback)`** — Écoute les changements de nom d'orc
|
|
307
|
+
- **`onReconnect(callback)`** — Écoute les tentatives et succès de reconnexion
|
|
308
|
+
- **`onCommandsRegistry(callback, data)`** — Écoute les mises à jour du registre de commandes
|
|
309
|
+
- **`hasCommand(cmdName)`** — Vérifie la disponibilité d'une commande
|
|
310
|
+
- **`getCommandsRegistry()`** — Retourne le registre des commandes disponibles
|
|
311
|
+
- **`getCommandsRegistryTime()`** — Retourne l'horodatage du registre
|
|
312
|
+
- **`getCommandsNames()`** — Retourne les noms de commandes avec métadonnées
|
|
313
|
+
- **`isConnected()`** — Retourne l'état de connexion
|
|
314
|
+
|
|
315
|
+
#### Propriétés
|
|
316
|
+
|
|
317
|
+
- **`orcName`** — Nom de l'orc associé à cette instance de Resp
|
|
318
|
+
- **`log`** — Logger contextualisé pour le module
|
|
319
|
+
- **`msgContext`** — Contexte de message (setter)
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
_Ce document a été mis à jour pour refléter la structure et les fonctionnalités actuelles du module._
|
|
324
|
+
|
|
325
|
+
[xcraft-core-transport]: https://github.com/Xcraft-Inc/xcraft-core-transport
|
|
326
|
+
[xcraft-core-bus]: https://github.com/Xcraft-Inc/xcraft-core-bus
|
|
327
|
+
[xcraft-core-etc]: https://github.com/Xcraft-Inc/xcraft-core-etc
|
|
328
|
+
[xcraft-core-host]: https://github.com/Xcraft-Inc/xcraft-core-host
|
|
329
|
+
[xcraft-core-log]: https://github.com/Xcraft-Inc/xcraft-core-log
|
|
330
|
+
[xcraft-core-utils]: https://github.com/Xcraft-Inc/xcraft-core-utils
|
package/index.js
CHANGED
|
@@ -429,13 +429,10 @@ class BusClient extends EventEmitter {
|
|
|
429
429
|
* @param {Function} callback - Callback.
|
|
430
430
|
*/
|
|
431
431
|
connect(backend, busToken, callback) {
|
|
432
|
-
const
|
|
433
|
-
const path = require('path');
|
|
432
|
+
const fse = require('fs-extra');
|
|
433
|
+
const path = require('node:path');
|
|
434
434
|
const xEtc = require('xcraft-core-etc')();
|
|
435
|
-
const xHost = require('xcraft-core-host');
|
|
436
|
-
|
|
437
|
-
const {resourcesPath} = xHost;
|
|
438
|
-
const appArgs = xHost.appArgs();
|
|
435
|
+
const xHost = xEtc ? require('xcraft-core-host') : null;
|
|
439
436
|
|
|
440
437
|
xLog.verb('Connecting...');
|
|
441
438
|
|
|
@@ -466,6 +463,7 @@ class BusClient extends EventEmitter {
|
|
|
466
463
|
if (!busConfig) {
|
|
467
464
|
busConfig = xEtc.load('xcraft-core-bus');
|
|
468
465
|
} else if (
|
|
466
|
+
xEtc &&
|
|
469
467
|
!Object.prototype.hasOwnProperty.call(busConfig, 'clientKeepAlive')
|
|
470
468
|
) {
|
|
471
469
|
const {clientKeepAlive} = xEtc.load('xcraft-core-bus');
|
|
@@ -474,13 +472,15 @@ class BusClient extends EventEmitter {
|
|
|
474
472
|
|
|
475
473
|
/* The TLS certificate is ignored in case of unix socket use */
|
|
476
474
|
if (
|
|
477
|
-
|
|
475
|
+
xHost &&
|
|
476
|
+
xHost.resourcesPath &&
|
|
477
|
+
xHost.appArgs().tls !== false &&
|
|
478
478
|
!busConfig.noTLS &&
|
|
479
479
|
!busConfig.unixSocketId &&
|
|
480
480
|
!busConfig.caPath
|
|
481
481
|
) {
|
|
482
|
-
const resCaPath = path.join(resourcesPath, 'server-cert.pem');
|
|
483
|
-
if (
|
|
482
|
+
const resCaPath = path.join(xHost.resourcesPath, 'server-cert.pem');
|
|
483
|
+
if (fse.existsSync(resCaPath)) {
|
|
484
484
|
busConfig.caPath = resCaPath;
|
|
485
485
|
xEtc.saveRun('xcraft-core-busclient', busConfig);
|
|
486
486
|
}
|
|
@@ -496,6 +496,7 @@ class BusClient extends EventEmitter {
|
|
|
496
496
|
};
|
|
497
497
|
|
|
498
498
|
if (
|
|
499
|
+
xHost &&
|
|
499
500
|
busConfig.gatekeeper &&
|
|
500
501
|
busConfig.hordeId &&
|
|
501
502
|
!busConfig.keyPath &&
|
|
@@ -518,10 +519,12 @@ class BusClient extends EventEmitter {
|
|
|
518
519
|
.filter((key) => busConfig[key])
|
|
519
520
|
.forEach((key) => {
|
|
520
521
|
if (
|
|
522
|
+
xHost &&
|
|
523
|
+
xHost.resourcesPath &&
|
|
521
524
|
!busConfig[key].startsWith('base64:') &&
|
|
522
525
|
!path.isAbsolute(busConfig[key])
|
|
523
526
|
) {
|
|
524
|
-
options[key] = path.join(resourcesPath, busConfig[key]);
|
|
527
|
+
options[key] = path.join(xHost.resourcesPath, busConfig[key]);
|
|
525
528
|
} else {
|
|
526
529
|
options[key] = busConfig[key];
|
|
527
530
|
}
|
package/lib/command.js
CHANGED
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
const moduleName = 'busclient/command';
|
|
4
4
|
|
|
5
|
-
const xBus = require('xcraft-core-bus');
|
|
6
5
|
const xLog = require('xcraft-core-log')(moduleName, null);
|
|
7
6
|
|
|
8
7
|
class Command {
|
|
9
8
|
static #unsubList = new Map(); /* Only for _xcraftRPC messages */
|
|
9
|
+
_routingKey;
|
|
10
10
|
|
|
11
11
|
constructor(busClient, pushSocket) {
|
|
12
12
|
this._busClient = busClient;
|
|
13
13
|
this._push = pushSocket;
|
|
14
14
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const xEtc = require('xcraft-core-etc')();
|
|
16
|
+
if (xEtc) {
|
|
17
|
+
const {appId, appArgs} = require('xcraft-core-host');
|
|
18
|
+
const {tribe} = appArgs();
|
|
19
|
+
this._routingKey = tribe ? `${appId}-${tribe}` : appId;
|
|
20
|
+
}
|
|
19
21
|
|
|
20
22
|
this._push
|
|
21
23
|
.on('close', (err) => this.#onNetworkChange(err))
|
|
@@ -102,7 +104,9 @@ class Command {
|
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
if (!busMessage.arp) {
|
|
105
|
-
let token =
|
|
107
|
+
let token = require('xcraft-core-etc')()
|
|
108
|
+
? require('xcraft-core-bus').getToken()
|
|
109
|
+
: null;
|
|
106
110
|
let nodeName = this._routingKey;
|
|
107
111
|
let {orcName} = busMessage;
|
|
108
112
|
let nice = 0;
|
package/lib/events.js
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
const moduleName = 'busclient/events';
|
|
4
4
|
|
|
5
5
|
const xLog = require('xcraft-core-log')(moduleName, null);
|
|
6
|
-
const xBus = require('xcraft-core-bus');
|
|
7
6
|
|
|
8
7
|
class Events {
|
|
9
8
|
constructor(busClient, subSocket) {
|
|
@@ -140,6 +139,7 @@ class Events {
|
|
|
140
139
|
}
|
|
141
140
|
|
|
142
141
|
const topic = 'greathall::heartbeat';
|
|
142
|
+
const xBus = require('xcraft-core-bus');
|
|
143
143
|
const notifier = xBus.getNotifier();
|
|
144
144
|
|
|
145
145
|
notifier.send(topic);
|
|
@@ -172,6 +172,7 @@ class Events {
|
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
const which = topic.split('::', 1)[0];
|
|
175
|
+
const xBus = require('xcraft-core-bus');
|
|
175
176
|
const notifier = xBus.getNotifier();
|
|
176
177
|
|
|
177
178
|
let busMessage = data;
|
package/lib/resp.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const {promisify} = require('node:util');
|
|
4
|
-
const watt = require('gigawatts');
|
|
5
4
|
|
|
6
5
|
class Events {
|
|
7
|
-
constructor(
|
|
8
|
-
this.
|
|
9
|
-
this._busClient =
|
|
6
|
+
constructor(resp, orcName, routing, msgContext) {
|
|
7
|
+
this._resp = resp;
|
|
8
|
+
this._busClient = resp._busClient;
|
|
10
9
|
this._orcName = orcName;
|
|
11
10
|
this._routing = routing;
|
|
12
11
|
this._msgContext = msgContext;
|
|
@@ -28,7 +27,7 @@ class Events {
|
|
|
28
27
|
|
|
29
28
|
catchAll(handler) {
|
|
30
29
|
if (!this._busClient) {
|
|
31
|
-
this.
|
|
30
|
+
this._resp.log.err('events.catchAll not available');
|
|
32
31
|
return;
|
|
33
32
|
}
|
|
34
33
|
this._busClient.events.catchAll(handler);
|
|
@@ -36,7 +35,7 @@ class Events {
|
|
|
36
35
|
|
|
37
36
|
subscribe(topic, handler) {
|
|
38
37
|
if (!this._busClient) {
|
|
39
|
-
this.
|
|
38
|
+
this._resp.log.err('events.subscribe not available');
|
|
40
39
|
return;
|
|
41
40
|
}
|
|
42
41
|
|
|
@@ -50,7 +49,7 @@ class Events {
|
|
|
50
49
|
|
|
51
50
|
unsubscribeAll(topic) {
|
|
52
51
|
if (!this._busClient) {
|
|
53
|
-
this.
|
|
52
|
+
this._resp.log.err('events.unsubscribe not available');
|
|
54
53
|
return;
|
|
55
54
|
}
|
|
56
55
|
|
|
@@ -59,7 +58,7 @@ class Events {
|
|
|
59
58
|
|
|
60
59
|
send(topic, data, serialize, forwarding = null, context = null) {
|
|
61
60
|
if (!this._busClient) {
|
|
62
|
-
this.
|
|
61
|
+
this._resp.log.err('events.send not available');
|
|
63
62
|
return;
|
|
64
63
|
}
|
|
65
64
|
|
|
@@ -97,9 +96,9 @@ class Events {
|
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
class Command {
|
|
100
|
-
constructor(
|
|
101
|
-
this.
|
|
102
|
-
this._busClient =
|
|
99
|
+
constructor(resp, orcName, msgContext) {
|
|
100
|
+
this._resp = resp;
|
|
101
|
+
this._busClient = resp._busClient;
|
|
103
102
|
this._orcName = orcName;
|
|
104
103
|
this._msgContext = msgContext;
|
|
105
104
|
this._sendAsync = promisify(this._send).bind(this);
|
|
@@ -111,7 +110,7 @@ class Command {
|
|
|
111
110
|
|
|
112
111
|
retry(msg) {
|
|
113
112
|
if (!this._busClient) {
|
|
114
|
-
this.
|
|
113
|
+
this._resp.log.err('command.retry not available');
|
|
115
114
|
return;
|
|
116
115
|
}
|
|
117
116
|
|
|
@@ -120,7 +119,7 @@ class Command {
|
|
|
120
119
|
|
|
121
120
|
_send(cmd, data, options, finishHandler) {
|
|
122
121
|
if (!this._busClient) {
|
|
123
|
-
this.
|
|
122
|
+
this._resp.log.err('command.send not available');
|
|
124
123
|
return;
|
|
125
124
|
}
|
|
126
125
|
|
|
@@ -152,6 +151,9 @@ class Command {
|
|
|
152
151
|
}
|
|
153
152
|
|
|
154
153
|
class Resp {
|
|
154
|
+
#moduleName;
|
|
155
|
+
#log;
|
|
156
|
+
|
|
155
157
|
constructor(
|
|
156
158
|
busClient,
|
|
157
159
|
moduleName,
|
|
@@ -159,6 +161,7 @@ class Resp {
|
|
|
159
161
|
routing = null,
|
|
160
162
|
msgContext = null
|
|
161
163
|
) {
|
|
164
|
+
this.#moduleName = moduleName;
|
|
162
165
|
this._busClient = busClient;
|
|
163
166
|
this._orcName = orcName;
|
|
164
167
|
/* Add a way for sending with the token server instead of an orcName */
|
|
@@ -172,11 +175,8 @@ class Resp {
|
|
|
172
175
|
orcName = 'greathall@' + token;
|
|
173
176
|
}
|
|
174
177
|
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
177
|
-
this.command = new Command(busClient, this.log, orcName, msgContext);
|
|
178
|
-
|
|
179
|
-
watt.wrapAll(this, 'connect', 'stop');
|
|
178
|
+
this.events = new Events(this, orcName, routing, msgContext);
|
|
179
|
+
this.command = new Command(this, orcName, msgContext);
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
set msgContext(value) {
|
|
@@ -188,12 +188,11 @@ class Resp {
|
|
|
188
188
|
return this._orcName;
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
yield this._busClient.stop(next);
|
|
191
|
+
get log() {
|
|
192
|
+
if (!this.#log) {
|
|
193
|
+
this.#log = require('xcraft-core-log')(this.#moduleName, this);
|
|
194
|
+
}
|
|
195
|
+
return this.#log;
|
|
197
196
|
}
|
|
198
197
|
|
|
199
198
|
isConnected() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xcraft-core-busclient",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.11.0",
|
|
4
4
|
"description": "Xcraft bus client",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"engines": {
|
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
"url": "git+https://github.com/Xcraft-Inc/xcraft-core-busclient.git"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"fs-extra": "^
|
|
23
|
-
"gigawatts": "^4.0.1",
|
|
22
|
+
"fs-extra": "^11.3.0",
|
|
24
23
|
"uuid": "^8.3.2",
|
|
25
24
|
"xcraft-core-bus": "^5.0.0",
|
|
26
25
|
"xcraft-core-host": "^3.0.0",
|