code: const request = require('request')
  const Settings = require('settings-sharelatex')
  
  const buildUrl = (path) =>
    `http://${Settings.internal.clsi.host}:${Settings.internal.clsi.port}/${path}`
  
  const url = buildUrl(`project/smoketest-${process.pid}/compile`)
  
  module.exports = {
    sendNewResult(res) {
      this._run((error) => this._sendResponse(res, error))
    },
    sendLastResult(res) {
      this._sendResponse(res, this._lastError)
    },
    triggerRun(cb) {
      this._run((error) => {
        this._lastError = error
        cb(error)
      })
    },
  
    _lastError: new Error('SmokeTestsPending'),
    _sendResponse(res, error) {
      let code, body
      if (error) {
        code = 500
        body = error.message
      } else {
        code = 200
        body = 'OK'
      }
      res.contentType('text/plain')
      res.status(code).send(body)
    },
    _run(done) {
      request.post(
        {
          url,
          json: {
            compile: {
              resources: [
                {
                  path: 'main.tex',
                  content: `\
  % Membrane-like surface
  % Author: Yotam Avital
  \\documentclass{article}
  \\usepackage{tikz}
  \\usetikzlibrary{calc,fadings,decorations.pathreplacing}
  \\begin{document}
  \\begin{tikzpicture}
    \\def\\nuPi{3.1459265}
    \\foreach \\i in {5,4,...,2}{% This one doesn't matter
      \\foreach \\j in {3,2,...,0}{% This will crate a membrane
                                 % with the front lipids visible
        % top layer
        \\pgfmathsetmacro{\\dx}{rand*0.1}% A random variance in the x coordinate
        \\pgfmathsetmacro{\\dy}{rand*0.1}% A random variance in the y coordinate,
                                       % gives a hight fill to the lipid
        \\pgfmathsetmacro{\\rot}{rand*0.1}% A random variance in the
                                        % molecule orientation
        \\shade[ball color=red] ({\\i+\\dx+\\rot},{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)}) circle(0.45);
        \\shade[ball color=gray] (\\i+\\dx,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-0.9}) circle(0.45);
        \\shade[ball color=gray] (\\i+\\dx-\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-1.8}) circle(0.45);
        % bottom layer
        \\pgfmathsetmacro{\\dx}{rand*0.1}
        \\pgfmathsetmacro{\\dy}{rand*0.1}
        \\pgfmathsetmacro{\\rot}{rand*0.1}
        \\shade[ball color=gray] (\\i+\\dx+\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-2.8}) circle(0.45);
        \\shade[ball color=gray] (\\i+\\dx,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-3.7}) circle(0.45);
        \\shade[ball color=red] (\\i+\\dx-\\rot,{0.5*\\j+\\dy+0.4*sin(\\i*\\nuPi*10)-4.6}) circle(0.45);
      }
    }
  \\end{tikzpicture}
  \\end{document}\
  `
                }
              ]
            }
          }
        },
        (error, response, body) => {
          if (error) return done(error)
          if (!body || !body.compile || !body.compile.outputFiles) {
            return done(new Error('response payload incomplete'))
          }
  
          let pdfFound = false
          let logFound = false
          for (const file of body.compile.outputFiles) {
            if (file.type === 'pdf') pdfFound = true
            if (file.type === 'log') logFound = true
          }
  
          if (!pdfFound) return done(new Error('no pdf returned'))
          if (!logFound) return done(new Error('no log returned'))
          done()
        }
      )
    }
  }
  