-
Notifications
You must be signed in to change notification settings - Fork 2
/
api.coffee
94 lines (73 loc) · 3.1 KB
/
api.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
express = require 'express'
util = require 'util'
experiments = require './experiment'
handlers = require './handlers/twitter'
errors = require './error'
io = require 'socket.io'
class API extends express.HTTPServer
constructor: (@exphandler) ->
super()
@use express.bodyParser()
@use express.logger()
@post '/experiment', (req, res) =>
@exphandler.createExperiment req.body, (exp) =>
resp = if exp instanceof errors.ExperimentError then exp else {experiment: @makeUri req, exp}
@respond res, resp
@get '/experiment/:id', (req, res) =>
@exphandler.getExperiment req.params.id, (exp) =>
@respond res, exp
@get '/experiment/:id/result', (req, res) =>
@exphandler.getResult req.params.id, (exp) =>
@respond res, exp
@del '/experiment/:id', (req, res) =>
@exphandler.cancelExperiment req.params.id, (exp) =>
@respond res, exp
@error (err, req, res, next) =>
util.log err
res.send({error: err.message}, err.code);
respond: (res, response) ->
if response instanceof errors.ExperimentError
throw response
else
res.send response
makeUri: (req, exp) ->
"http://#{req.header 'host'}/experiment/#{exp.id}"
#api = new API (new handlers.TimeOfDayWithDelaysHandler())
class SocketApi extends API
constructor: (@exphandler) ->
super @exphandler
@iosock = io.listen(@)
@exphandler.on 'experimentAdded', (id) =>
msg = "Experiment #{id} created with parameters #{util.inspect @exphandler.experiments[id].experiment.description}"
an = {announcement: msg}
util.log msg
@iosock.broadcast {event: 'experimentAdded', id: id}
@exphandler.on 'experimentStarted', (id) =>
msg = "Experiment #{id} started"
util.log msg
an = {announcement: msg}
@iosock.broadcast {event: 'experimentStarted', id: id}
@exphandler.on 'experimentCompleted', (id) =>
msg = "Experiment #{id} completed - results #{util.inspect @exphandler.experiments[id].result}"
util.log msg
an = {announcement: msg}
@iosock.broadcast {event: 'experimentCompleted', id: id}
@exphandler.on 'experimentCancelled', (id) =>
msg = "Experiment #{id} cancelled"
util.log 'cancelled'
an = {announcement: msg}
@iosock.broadcast an
@exphandler.on 'error', (what) =>
msg = "Error: #{what}"
util.log msg
an = {announcement: msg}
@iosock.broadcast {event: 'error', what: what}
api = new SocketApi (new handlers.TwitterExp())
api.get '/json.js', (req, res) ->
res.sendfile "#{__dirname}/test/json.js"
api.get '/', (req, res) ->
res.sendfile "#{__dirname}/test/chat.html"
api.get '/jquery.js', (req, res) ->
res.sendfile "#{__dirname}/test/jquery.js"
#api = new SocketApi (new handlers.TimeOfDayWithDelaysHandler())
api.listen 3000