npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

xcraft-core-bus

v5.5.0

Published

Xcraft bus

Readme

📘 xcraft-core-bus

Aperçu

Le module xcraft-core-bus est le cœur du système de communication du framework Xcraft. Il gère le cycle de vie et les opérations du bus de commandes et d'événements, permettant la communication entre tous les composants de l'écosystème Xcraft. Ce module orchestre le chargement dynamique des modules, la gestion des connexions réseau, et fournit l'infrastructure de base pour l'exécution des commandes et la diffusion d'événements.

Sommaire

Structure du module

Le module est organisé autour de trois composants principaux :

  • Bus (lib/index.js) : Orchestrateur principal qui coordonne le Commander et le Notifier
  • Commander (lib/commander.js) : Gestionnaire des commandes avec routage intelligent
  • Notifier (lib/notifier.js) : Gestionnaire de diffusion d'événements
  • Orcish (lib/orcish.js) : Générateur de noms et tokens pour l'identification des connexions

Le module expose également des commandes intégrées pour le chargement de modules et la collecte de métriques système.

Fonctionnement global

Architecture du bus

Le bus Xcraft fonctionne selon une architecture distribuée avec deux canaux principaux :

  1. Canal Commander (pull/push) : Gère l'exécution des commandes avec routage intelligent vers les instances appropriées
  2. Canal Notifier (pub/sub) : Diffuse les événements à tous les abonnés connectés

Cycle de vie

  1. Initialisation : Génération du token Great Hall, configuration des ports et options TLS
  2. Démarrage : Lancement simultané du Commander et du Notifier sur leurs ports respectifs
  3. Chargement : Découverte et enregistrement automatique des modules exposant xcraftCommands
  4. Fonctionnement : Routage des commandes et diffusion des événements
  5. Arrêt : Fermeture propre des connexions et notification de fin de session

Gestion des modules

Le registre des commandes est peuplé au démarrage par la découverte automatique des modules. Le système recherche la propriété xcraftCommands dans tous les fichiers JavaScript des modules spécifiés et enregistre les commandes exposées.

Routage intelligent

Le Commander intègre un système de routage intelligent qui :

  • Dirige les commandes vers l'instance locale si disponible
  • Redirige vers les instances distantes via le système Horde si nécessaire
  • Gère la distribution par tribu pour les environnements multi-instances
  • Applique les politiques de sécurité et de forwarding

Exemples d'utilisation

Chargement dynamique d'un module

// Chargement d'un module via la commande intégrée
await this.quest.cmd('bus.module.load', {
  moduleName: 'goblin-workshop',
});

Collecte de métriques système

// Récupération des métriques de performance
const metrics = await this.quest.cmd('bus.xcraftMetrics', {});
console.log('Métriques V8:', metrics.data);

Utilisation du bus dans un module

// Dans un module exposant des commandes
exports.xcraftCommands = function () {
  return {
    handlers: {
      create: function* (msg, resp) {
        // Logique de création
        resp.events.send('entity.create.finished', {id: msg.data.id});
      },
    },
    rc: {
      create: {
        parallel: true,
        desc: 'Créer une nouvelle entité',
      },
    },
  };
};

Interactions avec d'autres modules

Modules fondamentaux

Modules optionnels

Intégration avec l'écosystème

Le bus sert de colonne vertébrale pour tous les modules Xcraft :

  • Les modules xcraft-core-* exposent leurs services via le bus
  • Les acteurs goblin-* communiquent exclusivement via le bus
  • Les widgets reçoivent leurs données via les événements du bus

Configuration avancée

| Option | Description | Type | Valeur par défaut | | ----------------- | --------------------------------------------------------- | ------- | ------------------ | | host | Adresse IP ou nom d'hôte du serveur | string | 127.0.0.1 | | commanderHost | Adresse spécifique pour le Commander | string | (hérite de host) | | commanderPort | Port du service Commander | number | 35400 | | notifierHost | Adresse spécifique pour le Notifier | string | (hérite de host) | | notifierPort | Port du service Notifier | number | 35800 | | timeout | Timeout TCP en millisecondes | number | 0 | | serverKeepAlive | Keep-alive pour connexions serveur | number | 15000 | | clientKeepAlive | Keep-alive pour connexions client | number | 6000 | | noTLS | Désactiver le chiffrement TLS | boolean | false | | unixSocketId | Identifiant pour sockets Unix | string | (vide) | | acceptIncoming | Accepter immédiatement les nouvelles connexions | boolean | true | | shutdownRemotes | Arrêter les instances distantes | boolean | false | | keyPath | Chemin vers la clé privée du serveur | string | (vide) | | certPath | Chemin vers le certificat du serveur | string | (vide) | | policiesPath | Chemin vers les politiques de sécurité | string | (vide) | | tribes | Configuration des tribus pour déploiement multi-instances | array | [] |

Détails des sources

lib/index.js

Classe principale Bus qui orchestre l'ensemble du système. Elle hérite d'EventEmitter et coordonne le démarrage, l'arrêt et le chargement des modules. La classe gère également la génération des tokens de sécurité et la configuration des connexions réseau.

Méthodes publiques

  • boot(commandHandlers, next) — Démarre le bus avec la liste des gestionnaires de commandes, configure les ports et lance les services.
  • stop() — Arrête proprement tous les services, ferme les connexions et notifie la fin de session.
  • loadModule(resp, files, root, info, next) — Charge dynamiquement un module en analysant ses fichiers et en enregistrant ses commandes.
  • acceptIncoming() — Active l'acceptation de nouvelles connexions sur le Commander et le Notifier.
  • getToken() — Retourne le token de sécurité actuel du bus.
  • generateOrcName() — Génère un nom unique pour identifier une connexion client.
  • getCommander() — Retourne l'instance du Commander pour accès direct.
  • getNotifier() — Retourne l'instance du Notifier pour accès direct.
  • getRegistry() — Retourne le registre des commandes du Commander.
  • getBusTokenFromId(cmd, id) — Détermine le token du bus approprié pour une commande et un ID donnés.
  • runningModuleNames(onlyHot) — Retourne la liste des noms de modules en cours d'exécution.
  • runningModuleLocations(onlyHot) — Retourne la liste des emplacements des modules en cours d'exécution.
  • getModuleInfo(name, userModulePath) — Retourne les informations d'un module (chemin et pattern de fichiers).

lib/commander.js

Classe Commander qui gère l'exécution des commandes avec un système de routage intelligent. Elle hérite de Router et implémente la logique de distribution des commandes vers les instances appropriées.

Fonctionnalités principales

  • Routage automatique vers les instances locales ou distantes
  • Gestion des activités et du parallélisme
  • Support du système de tribus pour la distribution
  • Gestion des erreurs et des commandes non disponibles

Méthodes publiques

  • getRoutingKeyFromId(cmd, id, isRPC) — Détermine la clé de routage pour une commande donnée en fonction de l'ID cible.
  • registerCommandHandler(name, location, info, rc, handler) — Enregistre un gestionnaire de commande dans le registre.
  • isCommandRegistered(cmd) — Vérifie si une commande est enregistrée dans le registre.
  • isModuleRegistered(name) — Vérifie si un module est déjà enregistré.
  • getRegistry() — Retourne le registre local des commandes.
  • getFullRegistry() — Retourne le registre complet incluant les commandes des instances distantes.
  • getModuleInfo(name) — Retourne les informations d'un module spécifique.
  • registerErrorHandler(handler) — Enregistre le gestionnaire d'erreurs intégré.
  • registerAutoconnectHandler(handler) — Enregistre le gestionnaire de connexion automatique.
  • registerDisconnectHandler(handler) — Enregistre le gestionnaire de déconnexion.
  • registerShutdownHandler(handler) — Enregistre le gestionnaire d'arrêt du serveur.
  • registerMotdHandler(handler) — Enregistre le gestionnaire de message du jour.
  • registerBroadcastHandler(handler) — Enregistre le gestionnaire de diffusion.

lib/notifier.js

Classe Notifier simple qui hérite de Router et gère la diffusion d'événements en mode publication/souscription. Elle utilise le pattern pub/sub pour distribuer les événements à tous les clients connectés.

lib/orcish.js

Module utilitaire pour la génération de noms et tokens basé sur une liste de noms d'orcs fantastiques :

Méthodes publiques

  • generateGreatHall() — Génère un token cryptographique sécurisé pour identifier le bus principal.
  • generateOrcName(token) — Génère un nom unique basé sur une liste de noms d'orcs fantastiques pour identifier les connexions.

bus.js

Fichier exposant les commandes intégrées du bus via xcraftCommands :

Commandes disponibles

  • module.load — Charge dynamiquement un module spécifié par son nom.
  • xcraftMetrics — Collecte les métriques de performance du processus Node.js actuel (V8, mémoire, CPU, système).
  • ${cmdNamespace}.xcraftMetrics — Agrège les métriques de toutes les instances connectées.

Les métriques collectées incluent :

  • Statistiques V8 : heap total/utilisé, contextes natifs/détachés, métadonnées de code
  • Utilisation processus : CPU (user/system), mémoire RSS/heap/externe, buffers
  • Ressources système : RSS max, mémoire partagée, fautes de page, I/O fichiers, IPC
  • Métriques OS : priorité processus, mémoire totale système, uptime

Ce document a été mis à jour pour refléter l'état actuel du code source.