overleaf/services/web/public/coffee/editor/sharejs/server/index.coffee
2014-02-12 10:23:40 +00:00

57 lines
1.9 KiB
CoffeeScript

# The server module...
connect = require 'connect'
Model = require './model'
createDb = require './db'
rest = require './rest'
socketio = require './socketio'
browserChannel = require './browserchannel'
# Create an HTTP server and attach whatever frontends are specified in the options.
#
# The model will be created based on options if it is not specified.
module.exports = create = (options, model = createModel(options)) ->
attach(connect(), options, model)
# Create an OT document model attached to a database.
create.createModel = createModel = (options) ->
dbOptions = options?.db
db = createDb dbOptions
new Model db, options
# Attach the OT server frontends to the provided Node HTTP server. Use this if you
# already have a http.Server or https.Server and want to make some URL paths do OT.
#
# The options object specifies options for everything. If settings are missing,
# defaults will be provided.
#
# Set options.rest == null or options.socketio == null to turn off that frontend.
create.attach = attach = (server, options, model = createModel(options)) ->
options ?= {}
options.staticpath ?= '/share'
server.model = model
server.on 'close', -> model.closeDb()
server.use options.staticpath, connect.static("#{__dirname}/../../webclient") if options.staticpath != null
createAgent = require('./useragent') model, options
# The client frontend doesn't get access to the model at all, to make sure security stuff is
# done properly.
server.use rest(createAgent, options.rest) if options.rest != null
# Socketio frontend is now disabled by default.
socketio.attach(server, createAgent, options.socketio or {}) if options.socketio?
if options.browserChannel != null
options.browserChannel ?= {}
#options.browserChannel.base ?= '/sjs'
options.browserChannel.server = server
server.use browserChannel(createAgent, options.browserChannel)
server