-
Notifications
You must be signed in to change notification settings - Fork 11
/
app.coffee
104 lines (83 loc) · 2.16 KB
/
app.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
fs = require('fs')
path = require('path')
strata = require('strata')
fibers = require('./fibers')
context = require('./context')
static = require('./static')
filter = require('./filter')
templates = require('./templates')
class App extends strata.Builder
defaults:
static: true
sessions: true
port: 1982
bind: '0.0.0.0'
root: process.cwd()
views: './views'
assets: './assets'
public: './public'
layout: 'layout'
context: context
constructor: ->
super()
@settings = {}
@set @defaults
@settings.layout = templates.resolve(
@settings.layout, false
)
unless fs.existsSync(@settings.public)
@settings.static = false
@pool = new fibers.Pool
@router = new strata.Router
@use(strata.commonLogger)
@use(strata.contentType, 'text/html')
@use(strata.contentLength)
before: (conditions, callback) ->
unless callback
callback = conditions
conditions = true
@use(filter, conditions, callback)
rewrite: (pattern, replacement) ->
@use(strata.rewrite, pattern, replacement)
root: (replacement) ->
@rewrite('/', replacement)
route: (pattern, app, methods) ->
@router.route(
pattern,
context.wrap(app, this),
methods
)
set: (key, value) ->
if typeof key is 'object'
@set(k, v) for k, v of key
else
@settings[key] = value
useSessions: ->
options = {}
if typeof @settings.sessions is 'object'
options = @settings.sessions
@use(strata.sessionCookie, options)
useStatic: ->
@use(static, @settings.public, ['index.html'])
toApp: ->
@useSessions() if @settings.sessions
@useStatic() if @settings.static
@run (env, callback) =>
@pool.wrap(@router.toApp())(env, callback)
super
serve: ->
strata.run this,
host: @settings.host
port: @settings.port
socket: @settings.socket
methods =
get: ['GET', 'HEAD'],
post: 'POST',
put: 'PUT',
del: 'DELETE',
head: 'HEAD',
options: 'OPTIONS'
for method of methods
App::[method] = do (method) ->
(args...) -> @route(args..., method)
module.exports = App