kernel.mjs 2.9 KB

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