kernel.mjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { padEnd } from 'lodash-es'
  2. import eventemitter2 from 'eventemitter2'
  3. import NodeCache from 'node-cache'
  4. import asar from './asar.mjs'
  5. import db from './db.mjs'
  6. import extensions from './extensions.mjs'
  7. import scheduler from './scheduler.mjs'
  8. import servers from './servers.mjs'
  9. import metrics from './metrics.mjs'
  10. let isShuttingDown = false
  11. export default {
  12. async init() {
  13. WIKI.logger.info('=======================================')
  14. WIKI.logger.info(`= Wiki.js ${padEnd(WIKI.version + ' ', 29, '=')}`)
  15. WIKI.logger.info('=======================================')
  16. WIKI.logger.info('Initializing...')
  17. WIKI.logger.info(`Running node.js ${process.version}`)
  18. WIKI.db = await db.init()
  19. try {
  20. await WIKI.configSvc.loadFromDb()
  21. await WIKI.configSvc.applyFlags()
  22. } catch (err) {
  23. WIKI.logger.error('Database Initialization Error: ' + err.message)
  24. if (WIKI.IS_DEBUG) {
  25. WIKI.logger.error(err)
  26. }
  27. process.exit(1)
  28. }
  29. this.bootWeb()
  30. },
  31. /**
  32. * Pre-Web Boot Sequence
  33. */
  34. async preBootWeb() {
  35. try {
  36. WIKI.cache = new NodeCache({ checkperiod: 0 })
  37. WIKI.scheduler = await scheduler.init()
  38. WIKI.servers = servers
  39. WIKI.events = {
  40. inbound: new eventemitter2.EventEmitter2(),
  41. outbound: new eventemitter2.EventEmitter2()
  42. }
  43. WIKI.extensions = extensions
  44. WIKI.asar = asar
  45. WIKI.metrics = await metrics.init()
  46. } catch (err) {
  47. WIKI.logger.error(err)
  48. process.exit(1)
  49. }
  50. },
  51. /**
  52. * Boot Web Process
  53. */
  54. async bootWeb() {
  55. try {
  56. await this.preBootWeb()
  57. await (await import('../web.mjs')).init()
  58. this.postBootWeb()
  59. } catch (err) {
  60. WIKI.logger.error(err)
  61. process.exit(1)
  62. }
  63. },
  64. /**
  65. * Post-Web Boot Sequence
  66. */
  67. async postBootWeb() {
  68. await WIKI.db.locales.refreshFromDisk()
  69. await WIKI.db.analytics.refreshProvidersFromDisk()
  70. await WIKI.db.authentication.refreshStrategiesFromDisk()
  71. await WIKI.db.commentProviders.refreshProvidersFromDisk()
  72. await WIKI.db.renderers.refreshRenderersFromDisk()
  73. await WIKI.db.storage.refreshTargetsFromDisk()
  74. await WIKI.extensions.init()
  75. await WIKI.auth.activateStrategies()
  76. await WIKI.db.commentProviders.initProvider()
  77. await WIKI.db.locales.reloadCache()
  78. await WIKI.db.sites.reloadCache()
  79. await WIKI.db.storage.initTargets()
  80. await WIKI.db.subscribeToNotifications()
  81. await WIKI.scheduler.start()
  82. },
  83. /**
  84. * Graceful shutdown
  85. */
  86. async shutdown (devMode = false) {
  87. if (isShuttingDown) { return }
  88. isShuttingDown = true
  89. if (WIKI.servers) {
  90. await WIKI.servers.stopServers()
  91. }
  92. if (WIKI.scheduler) {
  93. await WIKI.scheduler.stop()
  94. }
  95. if (WIKI.models) {
  96. await WIKI.db.unsubscribeToNotifications()
  97. if (WIKI.db.knex) {
  98. await WIKI.db.knex.destroy()
  99. }
  100. }
  101. if (WIKI.asar) {
  102. await WIKI.asar.unload()
  103. }
  104. if (!devMode) {
  105. WIKI.logger.info('Terminating process...')
  106. process.exit(0)
  107. }
  108. }
  109. }