UNPKG

3.22 kBtext/coffeescriptView Raw
1cors = require 'cors'
2cookieParser = require 'cookie-parser'
3cookieSession = require 'cookie-session'
4MeshbluHTTP = require 'meshblu-http'
5passport = require 'passport'
6
7octobluExpress = require 'express-octoblu'
8
9Router = require './router'
10CredentialsDeviceService = require './services/credentials-device-service'
11MessagesService = require './services/messages-service'
12ConfigureService = require './services/configure-service'
13
14class Server
15 constructor: (options) ->
16 {
17 @apiStrategy
18 @appOctobluHost
19 @deviceType
20 @meshbluConfig
21 @messageHandler
22 @configureHandler
23 @octobluStrategy
24 @schemas
25 @serviceUrl
26 @userDeviceManagerUrl
27 @disableLogging
28 @logFn
29 @port
30 @staticSchemasPath
31 @skipRedirectAfterApiAuth
32 } = options
33
34 throw new Error 'schemas not allowed' if @schemas?
35 throw new Error 'Missing required parameter: apiStrategy' unless @apiStrategy?
36 throw new Error 'Missing required parameter: appOctobluHost' unless @appOctobluHost?
37 throw new Error 'Missing required parameter: deviceType' unless @deviceType?
38 throw new Error 'Missing required parameter: meshbluConfig' unless @meshbluConfig?
39 throw new Error 'Missing required parameter: messageHandler' unless @messageHandler?
40 throw new Error 'Missing required parameter: configureHandler' unless @configureHandler?
41 throw new Error 'Missing required parameter: octobluStrategy' unless @octobluStrategy?
42 throw new Error 'Missing required parameter: serviceUrl' unless @serviceUrl?
43 throw new Error 'Missing required parameter: userDeviceManagerUrl' unless @userDeviceManagerUrl?
44
45 address: =>
46 @server.address()
47
48 run: (callback) =>
49 passport.serializeUser (user, done) => done null, user
50 passport.deserializeUser (user, done) => done null, user
51
52 passport.use 'octoblu', @octobluStrategy
53 passport.use 'api', @apiStrategy
54
55 app = octobluExpress({ @disableLogging, @logFn })
56 app.use cors(exposedHeaders: ['Location'])
57 app.use cookieSession secret: @meshbluConfig.token
58 app.use cookieParser()
59 app.use passport.initialize()
60 app.use passport.session()
61
62 meshblu = new MeshbluHTTP @meshbluConfig
63 meshblu.whoami (error, device) =>
64 throw new Error('Could not authenticate with meshblu!') if error?
65 {imageUrl} = device.options ? {}
66 credentialsDeviceService = new CredentialsDeviceService { @deviceType, imageUrl, @meshbluConfig, @serviceUrl }
67 messagesService = new MessagesService { @messageHandler, @schemas, @meshbluConfig }
68 configureService = new ConfigureService { @configureHandler, @schemas, @meshbluConfig }
69 router = new Router {
70 credentialsDeviceService
71 messagesService
72 configureService
73 @appOctobluHost
74 @meshbluConfig
75 @serviceUrl
76 @userDeviceManagerUrl
77 @staticSchemasPath
78 @skipRedirectAfterApiAuth
79 }
80 router.route app
81
82 @server = app.listen @port, callback
83
84 stop: (callback) =>
85 @server.close callback
86
87module.exports = Server