kernel.mjs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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.db.onReady
  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. } catch (err) {
  46. WIKI.logger.error(err)
  47. process.exit(1)
  48. }
  49. },
  50. /**
  51. * Boot Web Process
  52. */
  53. async bootWeb() {
  54. try {
  55. await this.preBootWeb()
  56. await (await import('../web.mjs')).init()
  57. this.postBootWeb()
  58. } catch (err) {
  59. WIKI.logger.error(err)
  60. process.exit(1)
  61. }
  62. },
  63. /**
  64. * Post-Web Boot Sequence
  65. */
  66. async postBootWeb() {
  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.sites.reloadCache()
  76. await WIKI.db.storage.initTargets()
  77. await WIKI.db.subscribeToNotifications()
  78. await WIKI.scheduler.start()
  79. },
  80. /**
  81. * Graceful shutdown
  82. */
  83. async shutdown (devMode = false) {
  84. if (isShuttingDown) { return }
  85. isShuttingDown = true
  86. if (WIKI.servers) {
  87. await WIKI.servers.stopServers()
  88. }
  89. if (WIKI.scheduler) {
  90. await WIKI.scheduler.stop()
  91. }
  92. if (WIKI.models) {
  93. await WIKI.db.unsubscribeToNotifications()
  94. if (WIKI.db.knex) {
  95. await WIKI.db.knex.destroy()
  96. }
  97. }
  98. if (WIKI.asar) {
  99. await WIKI.asar.unload()
  100. }
  101. if (!devMode) {
  102. WIKI.logger.info('Terminating process...')
  103. process.exit(0)
  104. }
  105. }
  106. }