xcraft-core-utils
Version:
409 lines (258 loc) âą 15.5 kB
Markdown
# đ xcraft-core-utils
## Aperçu
Le module `xcraft-core-utils` est une bibliothÚque utilitaire centrale du framework Xcraft qui fournit un ensemble complet d'outils et de classes pour diverses opérations courantes. Il regroupe des utilitaires pour la manipulation de données, la cryptographie, la gestion de fichiers, les opérations asynchrones, la mise en cache, et bien plus encore.
## Sommaire
- [Structure du module](#structure-du-module)
- [Fonctionnement global](#fonctionnement-global)
- [Exemples d'utilisation](#exemples-dutilisation)
- [Interactions avec d'autres modules](#interactions-avec-dautres-modules)
- [Variables d'environnement](#variables-denvironnement)
- [Détails des sources](#détails-des-sources)
## Structure du module
Le module expose une collection d'utilitaires organisés par domaine fonctionnel :
- **Collecteurs et agrégateurs** : `ArrayCollector`, `MapAggregator`, `EventDebouncer`
- **Traitement par lots** : `batch`, `Batcher`, `JobQueue`
- **Cryptographie et hachage** : `crypto`, `fileCrypto`, `hash`
- **Manipulation de fichiers** : `files`, `json`, `yaml`, `zippy`
- **Utilitaires systĂšme** : `os`, `modules`, `whereIs`
- **Programmation** : `js`, `reflect`, `propTypes`
- **Réseau** : `RestAPI`
- **Concurrence** : `locks`, `CursorPump`
- **Cache et performance** : `RankedCache`
- **Manipulation de chaĂźnes** : `string`, `regex`
- **Logging** : `log`
- **Opérations asynchrones** : `async`
## Fonctionnement global
Ce module agit comme une boĂźte Ă outils centralisĂ©e pour l'Ă©cosystĂšme Xcraft. Chaque utilitaire est conçu pour ĂȘtre autonome tout en s'intĂ©grant parfaitement avec les autres composants du framework. Les utilitaires supportent les patterns asynchrones avec `gigawatts` et sont optimisĂ©s pour les performances dans un environnement distribuĂ©.
## Exemples d'utilisation
### Collecte de données avec ArrayCollector
```javascript
const {ArrayCollector} = require('xcraft-core-utils');
const collector = new ArrayCollector(resp, 100, (entries, resp) => {
// Traitement des données collectées
console.log('Données collectées:', entries);
});
// Ajout de données
collector.grab('key1', ['data1', 'data2']);
collector.grab('key2', ['data3']);
```
### Gestion de files d'attente avec JobQueue
```javascript
const {JobQueue} = require('xcraft-core-utils');
const runner = function* (job, next) {
console.log(`Traitement du job ${job.id}`);
yield setTimeout(next, 1000);
};
const queue = new JobQueue('processing', runner, 3);
queue.push({id: 1, data: 'example'});
```
### Cryptographie et hachage
```javascript
const {crypto, hash} = require('xcraft-core-utils');
// Génération de mots de passe
const password = crypto.randomPassword(16);
// Hachage d'objets
const objectHash = hash.computeHash({user: 'john', role: 'admin'});
```
### API REST
```javascript
const {RestAPI} = require('xcraft-core-utils');
const api = new RestAPI(30000);
const data = await api._get('https://api.example.com/users');
```
### Synchronisation avec locks
```javascript
const {locks} = require('xcraft-core-utils');
const mutex = new locks.Mutex();
await mutex.lock();
try {
// Section critique
} finally {
mutex.unlock();
}
```
### Opérations asynchrones avec mapReduce
```javascript
const {async} = require('xcraft-core-utils');
const data = ['item1', 'item2', 'item3'];
const result = yield async.mapReduce(
item => item.id,
item => processItem(item),
data
);
```
## Interactions avec d'autres modules
- **[xcraft-core-log]** : Utilisé pour le logging avancé dans plusieurs utilitaires
- **[xcraft-core-fs]** : Intégré pour les opérations sur le systÚme de fichiers
- **[xcraft-core-busclient]** : Utilisé par JobQueue pour les notifications d'événements
- **[xcraft-traverse]** : Utilisé pour la traversée d'objets complexes
- **[gigawatts]** : Support des générateurs et fonctions asynchrones
### Variables d'environnement
| Variable | Description | Exemple | Valeur par défaut |
| --------- | ------------------------------------------------------------------- | ------------------------------- | ----------------- |
| `PATH` | Chemin systÚme utilisé par `whereIs` pour localiser les exécutables | `/usr/bin:/bin` | Variable systÚme |
| `APPDATA` | Répertoire de données d'application sur Windows | `C:\Users\User\AppData\Roaming` | Variable systÚme |
## Détails des sources
### `arrayCollector.js`
Classe pour collecter des données par clés avec un mécanisme de throttling. Permet d'accumuler des données et de les traiter par lots à intervalles réguliers. Supporte les modes synchrone et asynchrone.
#### Méthodes publiques
- **`grab(key, data)`** â Ajoute des donnĂ©es Ă la collection sous une clĂ© spĂ©cifique et dĂ©clenche le traitement si nĂ©cessaire.
- **`cancel()`** â Annule le traitement en attente.
### `async.js`
Classe utilitaire pour les opérations asynchrones avancées qui évitent de bloquer la boucle d'événements principale.
#### Méthodes publiques
- **`mapReduce(keyFunc, valueFunc, list)`** â RĂ©duit un tableau en map avec itĂ©ration asynchrone pour Ă©viter de bloquer la boucle d'Ă©vĂ©nements sur de gros volumes de donnĂ©es.
### `batch.js`
Fonction utilitaire pour exécuter une action sur tous les fichiers d'un répertoire de maniÚre récursive.
#### Méthodes publiques
- **`run(filter, location, callbackAction)`** â Parcourt rĂ©cursivement un rĂ©pertoire et exĂ©cute une action sur les fichiers correspondant au filtre.
### `batcher.js`
Gestionnaire de traitement par lots avec support de timeout et de seuils de déclenchement. Idéal pour optimiser les opérations de base de données ou les écritures sur disque.
#### Méthodes publiques
- **`start()`** â DĂ©marre une nouvelle session de traitement par lots.
- **`bump()`** â IncrĂ©mente le compteur et dĂ©clenche le commit si le seuil est atteint.
- **`pump()`** â Force le commit si le timeout est atteint.
- **`stop()`** â Termine la session et exĂ©cute le commit final.
- **`dispose()`** â Marque le batcher pour destruction.
### `crypto.js`
Utilitaires cryptographiques pour le hachage, la génération de tokens et de mots de passe sécurisés.
#### Méthodes publiques
- **`md5(data)`** â Calcule le hash MD5 des donnĂ©es.
- **`sha256(data)`** â Calcule le hash SHA256 des donnĂ©es.
- **`genToken()`** â GĂ©nĂšre un token UUID sans tirets.
- **`randomInt(min, max)`** â GĂ©nĂšre un entier alĂ©atoire cryptographiquement sĂ»r dans la plage spĂ©cifiĂ©e.
- **`randomChar(chars)`** â GĂ©nĂšre un caractĂšre alĂ©atoire Ă partir d'un ensemble de caractĂšres.
- **`randomPassword(length=12, chars)`** â GĂ©nĂšre un mot de passe alĂ©atoire sĂ©curisĂ©.
### `cursorPump.js`
Wrapper pour les curseurs de base de données permettant de pomper les données de maniÚre asynchrone.
#### Méthodes publiques
- **`toArray()`** â Convertit toutes les donnĂ©es du curseur en tableau.
- **`pump()`** â RĂ©cupĂšre le prochain Ă©lĂ©ment du curseur.
### `eventDebouncer.js`
Classe pour dĂ©bouncer l'envoi d'Ă©vĂ©nements, Ă©vitant les envois trop frĂ©quents du mĂȘme type d'Ă©vĂ©nement.
#### Méthodes publiques
- **`publish(topic, data)`** â Publie un Ă©vĂ©nement avec debouncing automatique.
### `file-crypto.js`
Utilitaires cryptographiques pour les fichiers.
#### Méthodes publiques
- **`fileChecksum(filePath, options)`** â Calcule la somme de contrĂŽle d'un fichier avec l'algorithme spĂ©cifiĂ©.
### `files.js`
Utilitaires pour la détection de types de fichiers et l'analyse MIME avec une base de données complÚte d'extensions.
#### Méthodes publiques
- **`getFileFilter(filePath)`** â Retourne le filtre de fichier basĂ© sur l'extension.
- **`getMimeType(filePath)`** â DĂ©tecte le type MIME et l'encodage d'un fichier en utilisant libmagic.
### `hash.js`
Calcul de hash SHA256 pour des objets JavaScript complexes avec traversée récursive.
#### Méthodes publiques
- **`computeHash(payload)`** â Calcule un hash dĂ©terministe d'un objet JavaScript en traversant rĂ©cursivement ses propriĂ©tĂ©s.
### `jobQueue.js`
SystÚme de files d'attente avancé avec support de priorités, limitations de parallélisme, gestion des dépendances entre groupes et mécanismes de retry.
#### Méthodes publiques
- **`push(job)`** â Ajoute un job Ă la file d'attente.
- **`dispose()`** â Nettoie la file d'attente et envoie les Ă©vĂ©nements de fin.
### `js.js`
Utilitaires pour l'introspection de fonctions JavaScript.
#### Méthodes publiques
- **`isFunction(fn)`** â VĂ©rifie si l'argument est une fonction.
- **`isGenerator(fn)`** â VĂ©rifie si l'argument est une fonction gĂ©nĂ©rateur.
- **`isAsync(fn)`** â VĂ©rifie si l'argument est une fonction async.
### `json.js`
Utilitaires pour la manipulation de fichiers JSON et la transformation de structures de données.
#### Méthodes publiques
- **`fromFile(jsonFile)`** â â ïž DĂ©prĂ©ciĂ© : utiliser `fse.readJSONSync` Ă la place.
- **`toFile(json, destFile)`** â â ïž DĂ©prĂ©ciĂ© : utiliser `fse.writeJSONSync` Ă la place.
- **`dotKeysToObject(json)`** â Convertit les clĂ©s avec points en objets imbriquĂ©s.
### `locks.js`
Implémentations de primitives de synchronisation : mutex, sémaphores et mutex récursifs avec support des générateurs.
#### Classes et méthodes
- **`Mutex`** â Mutex simple avec mĂ©thodes `lock()` et `unlock()`.
- **`RecursiveMutex`** â Mutex rĂ©cursif supportant les verrous imbriquĂ©s par le mĂȘme propriĂ©taire.
- **`Semaphore`** â SĂ©maphore avec mĂ©thodes `wait()` et `signal()`.
- **`getMutex`** â Gestionnaire global de mutex par clĂ© avec mĂ©thodes `lock(key)` et `unlock(key)`.
### `log.js`
Utilitaires de formatage et de décoration pour les logs avec support des couleurs, de l'indentation et de la détection de logs imbriqués.
#### Méthodes publiques
- **`decorate(mode, prefix, mod, log, maxWidth, stripBegin)`** â Formate un message de log avec couleurs et indentation intelligente.
- **`graffiti(text, callback)`** â GĂ©nĂšre du texte ASCII art avec la police Graffiti et colorisation.
- **`getIndent()`** â Retourne l'indentation actuelle.
- **`computeIndent(prefix, mod)`** â Calcule l'indentation nĂ©cessaire pour un prĂ©fixe et module donnĂ©s.
### `mapAggregator.js`
Classe pour agréger des données dans une structure de map avec throttling.
#### Méthodes publiques
- **`put(keys, data)`** â Ajoute des donnĂ©es Ă la map en utilisant un chemin de clĂ©s.
- **`release()`** â Force la libĂ©ration immĂ©diate des donnĂ©es agrĂ©gĂ©es.
### `modules.js`
Utilitaires pour la gestion des modules et configurations d'applications Xcraft avec support des variantes et surcharges.
#### Méthodes publiques
- **`extractForEtc(appDir, appId, variantId)`** â Extrait la configuration pour xcraft-core-etc.
- **`loadAppConfig(appId, appDir, configJson, variantId)`** â Charge la configuration d'une application avec ses dĂ©pendances.
- **`extractAllDeps(appId, libDir, configJson)`** â Extrait toutes les dĂ©pendances d'une application rĂ©cursivement.
- **`extractAllJs(libDir, modules)`** â Extrait tous les fichiers JavaScript des modules spĂ©cifiĂ©s.
### `os.js`
Utilitaires pour les opérations systÚme multi-plateformes.
#### Méthodes publiques
- **`getAppData()`** â Retourne le rĂ©pertoire de donnĂ©es d'application appropriĂ© selon la plateforme.
### `prop-types.js`
Générateurs de PropTypes pour les composants React avec support des types étendus Xcraft.
#### Méthodes publiques
- **`makePropTypes(props)`** â GĂ©nĂšre un objet PropTypes Ă partir d'une dĂ©finition de propriĂ©tĂ©s.
- **`makeDefaultProps(props)`** â GĂ©nĂšre un objet de propriĂ©tĂ©s par dĂ©faut.
### `rankedCache.js`
Cache LRU (Least Recently Used) basé sur une liste chaßnée avec émission d'événements lors de l'éviction.
#### Méthodes publiques
- **`rank(item)`** â Ajoute ou met Ă jour un Ă©lĂ©ment dans le cache avec promotion automatique.
- **`clear()`** â Vide complĂštement le cache en Ă©mettant des Ă©vĂ©nements 'out'.
### `reflect.js`
Utilitaires de réflexion pour l'introspection de fonctions JavaScript.
#### Méthodes publiques
- **`funcParams(func)`** â Extrait les noms des paramĂštres d'une fonction en gĂ©rant les valeurs par dĂ©faut et les commentaires.
### `regex.js`
Utilitaires pour la manipulation d'expressions réguliÚres.
#### Méthodes publiques
- **`toRegexp(value)`** â Convertit une valeur en expression rĂ©guliĂšre.
- **`toAxonRegExpStr(str)`** â Convertit une chaĂźne avec wildcards en pattern regex pour Axon.
- **`toXcraftRegExpStr(str)`** â Convertit une chaĂźne avec wildcards en pattern regex pour Xcraft.
### `rest.js`
Client REST avancĂ© avec support des streams, retry automatique, gestion d'erreurs enrichie et throttling des requĂȘtes.
#### Méthodes publiques
- **`_get(query)`** â Effectue une requĂȘte GET et retourne le body.
- **`_getWithHeaders(query)`** â Effectue une requĂȘte GET et retourne body et headers.
- **`_post(query, payload, options)`** â Effectue une requĂȘte POST avec payload JSON.
- **`_delete(query)`** â Effectue une requĂȘte DELETE.
- **`_patch(query, payload)`** â Effectue une requĂȘte PATCH.
- **`_putForm(query, formData)`** â Effectue une requĂȘte PUT avec donnĂ©es de formulaire.
- **`_getStream(query, json=true)`** â Retourne un stream pour une requĂȘte GET.
- **`_postStream(query, payload, json=true)`** â Retourne un stream pour une requĂȘte POST.
- **`_streamPostStream(query, stream, json=true)`** â Envoie un stream et retourne un stream.
### `runnerInstance.js`
Singleton global pour la gestion des files d'attente de jobs avec support des priorités et dépendances.
#### Fonctionnalités
- Gestion centralisée de l'exécution des jobs
- Support des groupes de priorité
- Gestion des dépendances entre groupes
- Limitation du parallélisme par queue
### `string.js`
Utilitaires de manipulation de chaĂźnes de caractĂšres.
#### Méthodes publiques
- **`camelcasify(str)`** â Convertit les points en camelCase.
- **`capitalize(str)`** â Met en forme la premiĂšre lettre en majuscule.
- **`jsify(str)`** â Convertit les tirets en camelCase.
### `whereIs.js`
Utilitaire pour localiser des exécutables dans le PATH systÚme.
#### Méthodes publiques
- **`whereIs(bin)`** â Recherche un exĂ©cutable dans le PATH et retourne son chemin complet.
### `yaml.js`
Utilitaires pour la manipulation de fichiers YAML.
#### Méthodes publiques
- **`fromFile(yamlFile)`** â Charge et parse un fichier YAML.
### `zippy.js`
Utilitaire pour créer des archives ZIP avec support du chiffrement.
#### Méthodes publiques
- **`zippy(files, outputStream, options)`** â CrĂ©e une archive ZIP Ă partir d'une liste de fichiers vers un stream de sortie avec support optionnel du chiffrement par mot de passe.
---
_Ce document a été mis à jour pour refléter l'état actuel du code source._
[xcraft-core-log]: https://github.com/Xcraft-Inc/xcraft-core-log
[xcraft-core-fs]: https://github.com/Xcraft-Inc/xcraft-core-fs
[xcraft-core-busclient]: https://github.com/Xcraft-Inc/xcraft-core-busclient
[xcraft-traverse]: https://github.com/Xcraft-Inc/xcraft-traverse
[gigawatts]: https://github.com/Xcraft-Inc/gigawatts