1 | cors = require 'cors'
|
2 | cookieParser = require 'cookie-parser'
|
3 | cookieSession = require 'cookie-session'
|
4 | MeshbluHTTP = require 'meshblu-http'
|
5 | passport = require 'passport'
|
6 |
|
7 | octobluExpress = require 'express-octoblu'
|
8 |
|
9 | Router = require './router'
|
10 | CredentialsDeviceService = require './services/credentials-device-service'
|
11 | MessagesService = require './services/messages-service'
|
12 | ConfigureService = require './services/configure-service'
|
13 |
|
14 | class 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!: #{error.message}") 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 |
|
87 | module.exports = Server
|