DeploymentManager.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import logger from '@overleaf/logger'
  2. import settings from '@overleaf/settings'
  3. import fs from 'node:fs'
  4. // Monitor a status file (e.g. /etc/real_time_status) periodically and close the
  5. // service if the file contents don't contain the matching deployment colour.
  6. const FILE_CHECK_INTERVAL = 5000
  7. const statusFile = settings.deploymentFile
  8. const deploymentColour = settings.deploymentColour
  9. let serviceCloseTime
  10. function updateDeploymentStatus(fileContent) {
  11. const closed = fileContent && !fileContent.includes(deploymentColour)
  12. if (closed && !settings.serviceIsClosed) {
  13. settings.serviceIsClosed = true
  14. serviceCloseTime = Date.now() + 60 * 1000 // delay closing by 1 minute
  15. logger.info({ fileContent }, 'closing service')
  16. } else if (!closed && settings.serviceIsClosed) {
  17. settings.serviceIsClosed = false
  18. logger.info({ fileContent }, 'opening service')
  19. }
  20. }
  21. function pollStatusFile() {
  22. fs.readFile(statusFile, { encoding: 'utf8' }, (err, fileContent) => {
  23. if (err) {
  24. logger.error(
  25. { file: statusFile, fsErr: err },
  26. 'error reading service status file'
  27. )
  28. return
  29. }
  30. updateDeploymentStatus(fileContent)
  31. })
  32. }
  33. function checkStatusFileSync() {
  34. // crash on start up if file does not exist
  35. const content = fs.readFileSync(statusFile, { encoding: 'utf8' })
  36. updateDeploymentStatus(content)
  37. if (settings.serviceIsClosed) {
  38. serviceCloseTime = Date.now() // skip closing delay on start up
  39. }
  40. }
  41. export default {
  42. initialise() {
  43. if (statusFile && deploymentColour) {
  44. logger.info(
  45. { statusFile, deploymentColour, interval: FILE_CHECK_INTERVAL },
  46. 'monitoring deployment status file'
  47. )
  48. checkStatusFileSync() // perform an initial synchronous check at start up
  49. setInterval(pollStatusFile, FILE_CHECK_INTERVAL) // continue checking periodically
  50. }
  51. },
  52. deploymentIsClosed() {
  53. return settings.serviceIsClosed && Date.now() >= serviceCloseTime
  54. },
  55. }