Permet de charger une configuration via un object JSON, un fichier, une url, une collection @sbesson/json-db ou de variable d'environnement.
const ConfigLoader = require("@sbesson/configuration-loader").ConfigLoader;
configLoader = new ConfigLoader();
configLoader.load([
{
type: "object",
desc: "configuration par défaut",
config: {option1: "value1", option2: {cle1: "value2"}}
}, {
type: "file",
file: "path/config.json"
}
]).then(() => {
if (configLoader.hasLayersInErrors()) {
console.log("Le chargement de la configuration à rencontrer une erreur",
configLoader.getLayersInError());
throw new Error("Chargement de la configuration en erreur");
}
console.log("option 1", configLoader.getValue("option1"));
console.log("option 2", configLoader.getValue("option2.cle1"));
console.log("option other", configLoader.getValue("optionOther", "defaultValue"));
}).catch((error) {
console.log("La configuration est incorrecte", error.message, error.details);
});
La class ConfigLoader permet la gestion de chargement d'une configuration en plusieurs layers. Elle hérite de EventEmitter
options est un objet qui peut contenir les attributs suivants :
-
jsonschema: {jsonschema}
json schema de validation de la configuration. -
httpTimeoutRequestInS: integer
Timeout d'une requête http en seconde.
Par défaut 20s. -
httpTimeoutInS: integer
Timeout global d'une requête http et de ses re-tentatives en seconde.
Si ce temps est dépassé il n'y aura plus de re-tentative et l'appel sera considéré en erreur.
Par défaut 180s (3mn). -
httpRetryDelayInS: integer
Délai en seconde avant une nouvelle tentative.
Par défaut 10s.
Charge la configuration à partir de layers.
layers est une liste de layer.
Chaque layer est exécuté et le résultat d'un layer sera fusionné avec le résultat du layer précédent.
définition d'un layer
Un layer est un objet qui décrit comment récupérer une configuration.
Il y a 5 types de layer possible :
- le type object
- le type file
- le type url
- le type json-db
- le type environment
Chaque type peut contenir un attribut desc permettant d'indiquer une description du layer.
Description des différents types :
-
le type object
Dans ce type la configuration est directement dans l'attributconfig
.{ type: "object", desc: "configuration par défaut", config: {...} }
-
le type file
Ce type permet d'obtenir la configuration dans un fichier json, yaml ou js (module nodejs).
Le layer doit contenir un attributfile
indiquant le chemin du fichier.{ type: "file", desc: "configuration via un fichier" file: "configuration/config.json" }
-
le type url
Ce type permet d'obtenir la configuration depuis une url.
Ce layer doit contenir un attributurl
contenant l'url à appeler.
Si l'appel à l'url échoue ou ne répond pas au bout dehttpTimeoutRequestInS
secondes, on retentera toutes leshttpRetryDelayInS
secondes. Si au bout dehttpTimeoutInS
secondes la requête est toujours en erreur, on arrêtera et le layer sera considéré en erreur. Une fois chargé, le layer contiendra un champattempts
permettant de retrouver toutes les tentatives avec leurs échecs.{ type: "url", desc: "configuration via une url" url: "https://www.domain.tld/configuration/config.json" }
Ce layer peut générer l'événement
layer_url_attempt_error
, qui est généré quand une tentative échoue. On reçoit en paramètre le layer et la tentative en échecconfigLoader.on("layer_url_attempt_error", (layer, attempt) => { console.log("tentative en erreur", layer.desc, layer.url, attempt.message); });
-
le type json-db
Ce type permet d'obtenir la configuration depuis une "base de donnée json" voir le module @sbesson/json-db.
Ce layer doit contenir un attributfile
et un attributid
qui sera utilisé via le package @sbesson/json-db pour récupérer la configuration.{ type: "json-db", desc: "configuration via une collection json-db" file: "/path/collection", id: "config" }
-
le type environment
Ce type permet d'obtenir la configuration depuis des variables d'environnement.
Ce layer doit contenir un attributmapping
qui permettra de définir quelle variable d'environnement doit être utilisé pour créer la configuration.
Si la variable d'environnement n'existe pas, la configuration correspondante ne sera pas définie.
Le mapping peut-être une chaîne de caractères correspondant au path de l'option à créer, ou un objet contenant deux attributs:path
contenant le path de l'option à créertype
définissant le type de la variable. 3 types possiblestring
(valeur pas défaut),boolean
etnumber
.
Le type permettra de convertir la valeur de l'environnement qui est forcement une string dans le type défini. Pour le type
boolean
, les chaînes "true", "on" ou "1" permettent d'obtenir la valeurtrue
toute autre chaîne donnera la valeurfalse
.Exemple :
{ type: "environment", desc: "configuration depuis des variables d'environnement", /* Si les variables d'environnement OPTION1, OPTION2, BOOL et NUMBER existent et contiennent VALUE1, 20, true et 10 alors la configuration suivante sera générée : {option1: "VALUE1", rubrique: {option2: "20", number: 10}, bool: true} */ mapping: { OPTION1: "option1", OPTION2: "rubrique.option2", BOOL: {type: "boolean", path: "bool"}, NUMBER: {type: "number", path: "rubrique.number"}, }
retourne une promise qui sera résolu si au moins un layer a pu être utilisé et que le jsonschema (s'il y en a un) de la configuration soit sans erreur.
en cas d'erreur, retourne un objet de type Error
contenant deux attributs type
et details
en
plus du message
.
type
contiendra soit layer
(Si tous les layers sont en erreur), soit jsonschema
en cas d'erreur du à jsonschema.
details
contiendra soit le résultat de getLayersInError
soit les erreurs de jsonschema.
Permet de savoir si au moins un layer n'a pas pu être exécuté.
Retourne true
si au moins un layer est en erreur, Retourne false
si aucun layer n'est en erreur.
Permet de retourner la liste des layers en erreur. Chaque layer contiendra un attribut error
contenant un object de type Error
décrivant l'erreur qui c'est produite.
error
contiendra au moins l'attribut message
décrivant l'erreur.
Exemple :
[{
type: "file",
file: "path/config.json",
error: {
message: "Impossible de lire file_not_found.json",
cause: "Cannot find module '../file_not_found.json'"
}
}, {
type: "url",
url: "https://www.domain.tld/configuration/config.json",
error: {
message: "le délai de 50s a expiré",
}
}]
Permet de récupérer une option. Si cette option n'existe pas retourne defaultValue
Exemple :
const ConfigLoader = require("@sbesson/configuration-loader").ConfigLoader;
configLoader = new ConfigLoader();
configLoader.load([{
type: "object",
config: {option1: "value1", option2: {cle1: "value2"}}
}]).then(() => {
console.log("option 1 :", configLoader.getValue("option1"));
// Affiche : option 1 : value1
console.log("cle1 de option 2 :", configLoader.getValue("option2.cle1"));
// Affiche cle1 de option 2 : value2
console.log("option other :", configLoader.getValue("optionOther", "defaultValue"));
// Affiche option other : defaultValue
});
Cette class peut générer les événements suivants :
-
layer_load_start
: événement executé juste avant le chargement d'une configuration par un layer, on reçoit le layer en paramètre.configLoader.on("layer_load_start", (layer) => { console.log("Début du chargement de la configuration du layer", layer.desc); });
-
layer_load_stop
: événement executé juste après le chargement d'une configuration par un layer, on reçoit le layer en paramètre.configLoader.on("layer_load_stop", (layer) => { console.log("Fin du chargement de la configuration du layer", layer.desc, layer.config); });
-
layer_load_error
: événement executé si une erreur survient lors du chargement d'une configuration par un layer, on reçoit le layer en paramètre.configLoader.on("layer_load_error", (layer) => { console.log("Erreur lors du chargement de la configuration du layer", layer.desc, layer.error); });