74 lines
2.4 KiB
CoffeeScript
74 lines
2.4 KiB
CoffeeScript
#
|
|
# Crafting Guide - middleware.coffee
|
|
#
|
|
# Copyright © 2014-2017 by Redwood Labs
|
|
# All rights reserved.
|
|
#
|
|
|
|
bodyParser = require 'body-parser'
|
|
clientSessions = require 'client-sessions'
|
|
express = require 'express'
|
|
w = require 'when'
|
|
|
|
############################################################################################################
|
|
|
|
exports.installBefore = (app)->
|
|
app.use m for m in [
|
|
bodyParser.json
|
|
limit: '1024kb'
|
|
clientSessions
|
|
cookieName: 'session-cookie'
|
|
duration: 1000 * 60 * 60 * 24 * 7 * 2 # 2 weeks in ms
|
|
secret: '8QmZ9KbBtN,^%9QT'
|
|
logRequest
|
|
prevent304
|
|
promisify
|
|
]
|
|
|
|
exports.installAfter = (app)->
|
|
app.use '/data', express.static '/src/crafting-guide/data/data/', etag:false, maxAge: 0
|
|
app.use express.static './static', etag: false, maxAge: 0
|
|
|
|
# Middleware Functions #####################################################################################
|
|
|
|
logRequest = (request, response, next)->
|
|
console.log ">>>>> #{request.method} #{request.url}"
|
|
|
|
receivedAt = Date.now()
|
|
totalBytes = 0
|
|
|
|
originalWrite = response.write
|
|
response.write = (chunk)->
|
|
totalBytes += chunk.length if chunk?.length?
|
|
originalWrite.apply response, arguments
|
|
|
|
originalEnd = response.end
|
|
response.end = (chunk)->
|
|
totalBytes += chunk.length if chunk?.length?
|
|
|
|
duration = Date.now() - receivedAt
|
|
sizeText = if totalBytes > 1024 then "#{(totalBytes / 1024.0).toFixed(2)} kB" else "#{totalBytes} B"
|
|
console.log "<<<<< #{request.method} #{request.url} responded " +
|
|
"#{response.statusCode} after #{duration}ms with #{sizeText}\n"
|
|
originalEnd.apply response, arguments
|
|
|
|
next()
|
|
|
|
prevent304 = (request, response, next)->
|
|
response.setHeader 'Last-Modified', new Date().toUTCString()
|
|
next()
|
|
|
|
promisify = (request, response, next)->
|
|
response.sendPromise = (func)->
|
|
w.try func
|
|
.then (result)->
|
|
responseText = JSON.stringify result
|
|
console.log "#{responseText}"
|
|
response.send responseText
|
|
.catch (error)->
|
|
console.error "Request failed with error:\n#{error.stack}"
|
|
response.status 500
|
|
response.send message:error.message, stack:error.stack
|
|
.done()
|
|
next()
|