1.0.1 • Published 4 years ago

sb-configuration-loader v1.0.1

Weekly downloads
-
License
GPL-3.0
Repository
github
Last release
4 years ago

sb-configuration-loader

Description

Permet de charger une configuration via un object JSON, un fichier, une url, une collection sb-collection-file ou de variable d'environnement.

Exemple d'utilisation

const ConfigLoader = require("sb-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);
});

API

class ConfigLoader

La class ConfigLoader permet la gestion de chargement d'une configuration en plusieurs layers.

new ConfigLoader(options)

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.

load(layers)

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 sb-collection-file
  • 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'attribut config.

    {
      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 attribut file 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 attribut url contenant l'url à appeler.
    Si l'appel à l'url échoue ou ne répond pas au bout de httpTimeoutRequestInS secondes, on retentera toutes les httpRetryDelayInS secondes. Si au bout de httpTimeoutInS 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 champ attempts permettant de retrouver toutes les tentatives avec leurs échecs.

    {
      type: "url",
      desc: "configuration via une url"
      url: "https://www.domain.tld/configuration/config.json"
    }
  • le type sb-collection-file
    Ce type permet d'obtenir la configuration depuis une collection file.
    Ce layer doit contenir un attribut file et un attribut id qui sera utilisé via le package sb-collection-file pour récupérer la configuration.

    {
      type: "sb-collection-file",
      desc: "configuration via une collection file"
      file: "/path/collectionfile",
      id: "config"
    }
  • le type environment
    Ce type permet d'obtenir la configuration depuis des variables d'environnement.
    Ce layer doit contenir un attribut mapping 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.

    {
      type: "environment",
      desc: "configuration depuis des variables d'environnement",
      /* Si les variables d'environnement OPTION1 et OPTION2 existent et contiennent VALUE1 et
         VALUE2, alors la configuration suivante sera générée :
        {option1: "VALUE1", rubrique: {option2: "VALUE2}}
      */
      mapping: {
        OPTION1: "option1",
        OPTION2: "rubrique.option2",
    }

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.

hasLayersInError()

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.

getLayersInError()

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é",
  }
}]

getValue(fromPath, defaultValue)

Permet de récupérer une option. Si cette option n'existe pas retourne defaultValue
Exemple :

const ConfigLoader = require("sb-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
});
1.0.1

4 years ago

1.0.0

6 years ago