const fs = require('fs-extra') const path = require('path') const logger = require('logger-sharelatex') const Settings = require('settings-sharelatex') const streamBuffers = require('stream-buffers') const { promisify } = require('util') const Stream = require('stream') const pipeline = promisify(Stream.pipeline) const fsCopy = promisify(fs.copy) const fsUnlink = promisify(fs.unlink) const { HealthCheckError } = require('./Errors') const FileConverter = require('./FileConverter').promises const FileHandler = require('./FileHandler').promises async function checkCanGetFiles() { if (!Settings.health_check) { return } const projectId = Settings.health_check.project_id const fileId = Settings.health_check.file_id const key = `${projectId}/${fileId}` const bucket = Settings.filestore.stores.user_files const buffer = new streamBuffers.WritableStreamBuffer({ initialSize: 100 }) const sourceStream = await FileHandler.getFile(bucket, key, {}) try { await pipeline(sourceStream, buffer) } catch (err) { throw new HealthCheckError('failed to get health-check file').withCause(err) } if (!buffer.size()) { throw new HealthCheckError('no bytes written to download stream') } } async function checkFileConvert() { if (!Settings.enableConversions) { return } const imgPath = path.join(Settings.path.uploadFolder, '/tiny.pdf') let resultPath try { await fsCopy('./tiny.pdf', imgPath) resultPath = await FileConverter.thumbnail(imgPath) } finally { if (resultPath) { await fsUnlink(resultPath) } await fsUnlink(imgPath) } } module.exports = { check(req, res) { logger.log({}, 'performing health check') Promise.all([checkCanGetFiles(), checkFileConvert()]) .then(() => res.send(200)) .catch(err => { logger.err({ err }, 'Health check: error running') res.send(500) }) } }