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 CHANGED
@@ -1,10 +1,330 @@
1
- # xcraft-core-busclient
1
+ # 📘 Documentation du module xcraft-core-busclient
2
2
 
3
- Client for the Xcraft bus.
3
+ ## Aperçu
4
4
 
5
- This module provides the interfaces in order to connect to a server, send
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
- It provides the global busClient too. This handler must be used between the
9
- modules in order to have always the same connection everywhere. Otherwise
10
- you can connect to several servers by instancing a new busClient for each one.
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 fs = require('fs');
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
- appArgs.tls !== false &&
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 (fs.existsSync(resCaPath)) {
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 {appId, appArgs} = require('xcraft-core-host');
16
- const {tribe} = appArgs();
17
-
18
- this._routingKey = tribe ? `${appId}-${tribe}` : appId;
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 = xBus.getToken();
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(busClient, log, orcName, routing, msgContext) {
8
- this._log = log;
9
- this._busClient = 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._log.err('events.catchAll not available');
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._log.err('events.subscribe not available');
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._log.err('events.unsubscribe not available');
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._log.err('events.send not available');
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(busClient, log, orcName, msgContext) {
101
- this._log = log;
102
- this._busClient = 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._log.err('command.retry not available');
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._log.err('command.send not available');
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.log = require('xcraft-core-log')(moduleName, this);
176
- this.events = new Events(busClient, this.log, orcName, routing, msgContext);
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
- *connect(next) {
192
- yield this._busClient.connect('axon', null, next);
193
- }
194
-
195
- *stop(next) {
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.9.0",
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": "^9.1.0",
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",