ConversionController.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import logger from '@overleaf/logger'
  2. import { expressify } from '@overleaf/promise-utils'
  3. import fs from 'node:fs/promises'
  4. import fsSync from 'node:fs'
  5. import ConversionManager from './ConversionManager.js'
  6. import { pipeline } from 'node:stream/promises'
  7. import Settings from '@overleaf/settings'
  8. import Path from 'node:path'
  9. async function convertDocxToLaTeX(req, res) {
  10. const { path } = req.file
  11. if (!Settings.enablePandocConversions) {
  12. await fs.unlink(path).catch(() => {})
  13. return res.sendStatus(404)
  14. }
  15. logger.debug({ path }, 'received file for conversion')
  16. const conversionId = crypto.randomUUID()
  17. let zipPath
  18. try {
  19. zipPath = await ConversionManager.promises.convertDocxToLaTeXWithLock(
  20. conversionId,
  21. path
  22. )
  23. } finally {
  24. await fs.unlink(path).catch(() => {})
  25. }
  26. try {
  27. const zipStat = await fs.stat(zipPath)
  28. res.setHeader('Content-Length', zipStat.size)
  29. res.attachment('conversion.zip')
  30. res.setHeader('X-Content-Type-Options', 'nosniff')
  31. const readStream = fsSync.createReadStream(zipPath)
  32. await pipeline(readStream, res)
  33. } finally {
  34. await fs
  35. .rm(Path.dirname(zipPath), { recursive: true, force: true })
  36. .catch(() => {})
  37. }
  38. }
  39. export default {
  40. convertDocxToLaTeX: expressify(convertDocxToLaTeX),
  41. }