Source: boot.js


'use strict'

const lassi = require('lassi')
const config = require('./config')
const log = require('./lib/log.js')
const { merge } = require('sesajstools/utils/object')

const { application: { name: appName, staging } } = config

// plusieurs modules permettent de récupérer les traces async, tous font de grosses surcharges,
// pénalisantes pour les perfs mais surtout non exempte de bug, faut surtout pas utiliser ça en prod
// après avoir regardé
// https://github.com/mattinsler/longjohn/
// https://github.com/tlrobinson/long-stack-traces
// https://github.com/groundwater/node-stackup
// on opte pour https://github.com/AndreasMadsen/trace
// mais on ne le lance que via npm run start:devBack car ça fait parfois planter node (out of memory)

let lassiInstance

/**
 * Appelé après déclaration des composants mais avant bootstrap
 * @callback beforeBootstrapCallback
 * @param {Lassi} L'instance lassi
 * @param {Component} sesatheque Notre appli
 * @param {string[]} La liste des dépendances de notre appli
 */
/**
 * Boot l'application
 * @param {beforeBootstrapCallback} beforeBootstrapCb
 * @param {object} [options] Options qui seront passées à lassi() (@link Lassi)
 * @param {simpleCallback} afterBootCb
 */
function boot (beforeBootstrapCb, options, afterBootCb) {
  if (lassiInstance) {
    log.error(new Error('boot déjà appelé, beforeBootstrapCb et options ignorés'))
    if (afterBootCb) afterBootCb()
    return lassiInstance
  }
  if (!options) options = {}
  options.root = __dirname
  // @todo pas de var globale lassi
  // options.noGlobalLassi = true
  lassiInstance = lassi(options)
  if (options.config) {
    merge(config, options.config)
    // lassi charge en settings ${options.root}/config
    merge(lassiInstance.settings, options.config)
  }

  // notre fct de log en global
  global.log = log
  // et ce flag pratique
  global.isProd = /prod/.test(staging)
  /* global isProd */
  if (isProd || options.cli || staging === 'test') log.disable()
  else log(`Démarrage de l’application ${appName} avec l'environnement ${staging}`)

  /**
   * Gestion des traces
   * Attention, le module long-stack-traces m'a déjà joué des tours avec une erreur qui plante node
   * (reproductible, sur une 404), le désactiver a réglé le problème
   *
   * Pour augmenter les traces, mieux vaut passer à node ces options
   * --stack_trace_limit=100 --stack-size=2048
   */

  // les déclarations de nos components
  const dependancies = ['main', 'personne', 'ressource', 'update', 'auth']
  // on charge ces composants
  dependancies.forEach(dep => require(`./${dep}`)(lassiInstance))
  // des modules sup à charger
  if (config.extraModules) {
    config.extraModules.forEach(function (module) {
      log(`ajout du module supplémentaire ${module}`)
      require(module)
    })
  }
  if (config.extraDependenciesFirst) {
    config.extraDependenciesFirst.forEach(function (dependency) {
      log(`ajout en premier de la dépendance supplémentaire ${dependency}`)
      dependancies.unshift(dependency)
    })
  }
  if (config.extraDependenciesLast) {
    config.extraDependenciesLast.forEach(function (dependency) {
      log(`ajout en dernier de la dépendance supplémentaire ${dependency}`)
      dependancies.push(dependency)
    })
  }
  const sesatheque = lassiInstance.component('sesatheque', dependancies)

  beforeBootstrapCb(lassiInstance, sesatheque, dependancies)

  if (afterBootCb) lassiInstance.on('startup', afterBootCb)

  // et on lance le boot
  lassiInstance.bootstrap(sesatheque, function (error) {
    if (error) {
      log.error('boot failed')
      log.error(error)
      process.exit()
    }
    log('end bootstrap')
  })

  return lassiInstance
}

module.exports = boot