parseAcceptHeader = require('./parseAcceptHeader')parseAcceptHeader = require('./parseAcceptHeader')Supported rendering formats
FORMAT = {
html : 'text/html',
json : 'application/json',
text : 'text/plain'
}This class handles http requests received by the server
class RequestHandlerinit_store : the cache where initial render / idmap data is stored for later retrieval to answer initialize socket message
container : the container that handles page rendering
constructor : (args)->
@_init_store = args.init_store
@_container = args.containerthis function is called by the connect middleware pipeline on server. It uses the container to handle the page thats been attached to the request, caches data to be passed down to the client during the socket setup and initializing phase, and then calls render to send the response
request,response,next: the standard connect middleware trio
handle : (request, response, next)->
_onError = (error)->
console.error(error.stack)
next("500")
page = request.page
@_container.load(
page : page
callback : (error)=>
if error
return _onError(error)
@_container.storeInitData(
store : @_init_store
callback : (error)=>
if error
_onError(error)
else
try
@_render(
request : request
response : response
)
catch error
_onError(error)
)
)Finds the response format for an incoming request
request : the http request to find the response format for
_responseFormat : (request)->
accepts = request.headers['Accept']
if accepts
parsed_accepts = parseAcceptHeader(accepts)
for accept in parsed_accepts
type = "#{accept.type}/#{accept.subtype}"
types = (v for k,v of FORMAT)
if (type in types)
return [k, type]
['html', FORMAT.html]Have the container render the page for the given request
request : the http request being handled
response : the http response that will be used to answer the request
_render : (args)=>
request = args.request
response = args.response
[format, content_type] = @_responseFormat(request)
headers = @_container.headers()
headers['Content-Type'] = content_type
status = @_container.status() || 200
body = @_container[format]()
response.writeHead(status, headers)
response.end(body)
module.exports = RequestHandler