fs = require('fs')
async = require('async')
express = require('express')
express_index = require('serve-index')
body_parser = require('body-parser')
misc_node = require('smc-util-node/misc_node')
{defaults, required} = require('smc-util/misc')
{jupyter_router} = require('./jupyter/jupyter')
{directory_listing_router} = require('./directory-listing')
{upload_endpoint} = require('./upload')
kucalc = require('./kucalc')
exports.start_raw_server = (opts) ->
opts = defaults opts,
project_id : required
base_url : required
host : required
data_path : required
home : required
port : undefined
logger : undefined
cb : cb
{project_id, base_url, host, data_path, home, cb} = opts
opts.logger?.info("starting express http server...")
raw_port_file = misc_node.abspath("#{data_path}/raw.port")
raw_server = express()
raw_server.use(body_parser.urlencoded({ extended: true }))
port = opts.port
async.series([
(cb) ->
target = process.env.SMC + '/root'
fs.exists target, (exists) ->
if exists
cb()
else
fs.symlink '/', target, (err) ->
if err
opts.logger?.debug("WARNING: error creating root symlink -- #{err}")
cb()
(cb) ->
if port
cb()
else
misc_node.free_port (err, _port) ->
port = _port; cb(err)
(cb) ->
fs.writeFile(raw_port_file, port, cb)
(cb) ->
base = "#{base_url}/#{project_id}/raw/"
opts.logger?.info("raw server: port=#{port}, host='#{host}', base='#{base}'")
if kucalc.IN_KUCALC
kucalc.init_health_metrics(raw_server, project_id)
raw_server.use(base, jupyter_router(express))
raw_server.use(base, directory_listing_router(express))
raw_server.use(base, upload_endpoint(express, opts.logger))
raw_server.use base, (req, res, next) ->
if req.query.download?
res.setHeader('Content-Type', 'application/octet-stream')
res.setHeader('Cache-Control', 'private, no-cache, must-revalidate')
return next()
raw_server.use(base, express_index(home, {hidden:true, icons:true}))
raw_server.use(base, express.static(home, {hidden:true}))
raw_server.listen(port, host, cb)
], (err) ->
if err
opts.logger?.debug("error starting raw_server: err = #{misc.to_json(err)}")
cb(err)
)