| 
									
										
										
										
											2016-05-04 22:06:52 +02:00
										 |  |  | import * as _express from "express"; | 
					
						
							|  |  |  | import * as _bodyParser from "body-parser"; | 
					
						
							|  |  |  | import * as _http from "http"; | 
					
						
							| 
									
										
										
										
											2016-03-18 21:36:58 +01:00
										 |  |  | import {PublicRouter} from "./routes/PublicRouter"; | 
					
						
							|  |  |  | import {UserRouter} from "./routes/UserRouter"; | 
					
						
							| 
									
										
										
										
											2016-03-19 17:31:42 +01:00
										 |  |  | import {GalleryRouter} from "./routes/GalleryRouter"; | 
					
						
							| 
									
										
										
										
											2016-05-04 22:06:52 +02:00
										 |  |  | import {AdminRouter} from "./routes/AdminRouter"; | 
					
						
							| 
									
										
										
										
											2016-03-26 11:19:10 +01:00
										 |  |  | import {ErrorRouter} from "./routes/ErrorRouter"; | 
					
						
							|  |  |  | import {SharingRouter} from "./routes/SharingRouter"; | 
					
						
							| 
									
										
										
										
											2016-04-22 13:23:44 +02:00
										 |  |  | import {ObjectManagerRepository} from "./model/ObjectManagerRepository"; | 
					
						
							| 
									
										
										
										
											2017-06-03 22:35:47 +02:00
										 |  |  | import {Logger} from "./Logger"; | 
					
						
							| 
									
										
										
										
											2017-06-04 15:25:08 +02:00
										 |  |  | import {Config} from "../common/config/private/Config"; | 
					
						
							| 
									
										
										
										
											2017-07-13 23:39:09 +02:00
										 |  |  | import {DatabaseType} from "../common/config/private/IPrivateConfig"; | 
					
						
							| 
									
										
										
										
											2017-06-21 11:32:56 +02:00
										 |  |  | import {LoggerRouter} from "./routes/LoggerRouter"; | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  | import {ThumbnailGeneratorMWs} from "./middlewares/thumbnail/ThumbnailGeneratorMWs"; | 
					
						
							|  |  |  | import {DiskManager} from "./model/DiskManger"; | 
					
						
							| 
									
										
										
										
											2017-07-09 14:23:50 +02:00
										 |  |  | import {NotificationRouter} from "./routes/NotificationRouter"; | 
					
						
							| 
									
										
										
										
											2017-07-13 23:39:09 +02:00
										 |  |  | import {ConfigDiagnostics} from "./model/ConfigDiagnostics"; | 
					
						
							| 
									
										
										
										
											2017-07-16 14:03:16 +02:00
										 |  |  | import _session = require('cookie-session'); | 
					
						
							| 
									
										
										
										
											2016-03-12 12:53:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 22:35:47 +02:00
										 |  |  | const LOG_TAG = "[server]"; | 
					
						
							| 
									
										
										
										
											2017-07-19 10:21:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 14:57:22 +01:00
										 |  |  | export class Server { | 
					
						
							| 
									
										
										
										
											2016-03-12 12:53:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |   private app: any; | 
					
						
							|  |  |  |   private server: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor() { | 
					
						
							| 
									
										
										
										
											2017-07-16 20:49:39 +02:00
										 |  |  |     if (!(process.env.NODE_ENV == "production")) { | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  |       Logger.debug(LOG_TAG, "Running in DEBUG mode"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     this.init(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async init() { | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  |     Logger.info(LOG_TAG, "running diagnostics..."); | 
					
						
							| 
									
										
										
										
											2017-07-13 23:39:09 +02:00
										 |  |  |     await ConfigDiagnostics.runDiagnostics(); | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  |     Logger.info(LOG_TAG, "using config:"); | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     this.app = _express(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-21 11:32:56 +02:00
										 |  |  |     LoggerRouter.route(this.app); | 
					
						
							| 
									
										
										
										
											2016-03-12 12:53:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     this.app.set('view engine', 'ejs'); | 
					
						
							| 
									
										
										
										
											2017-06-04 15:25:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-18 21:36:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Session above all | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-07-16 10:59:28 +02:00
										 |  |  |     function s4() { | 
					
						
							|  |  |  |       return Math.floor((1 + Math.random()) * 0x10000) | 
					
						
							|  |  |  |         .toString(16) | 
					
						
							|  |  |  |         .substring(1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     this.app.use(_session({ | 
					
						
							|  |  |  |       name: "pigallery2-session", | 
					
						
							| 
									
										
										
										
											2017-07-16 10:59:28 +02:00
										 |  |  |       keys: ["key1" + s4() + s4() + s4() + s4(), "key2" + s4() + s4() + s4() + s4(), "key3" + s4() + s4() + s4() + s4()] | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     })); | 
					
						
							| 
									
										
										
										
											2017-06-04 15:25:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Parse parameters in POST | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     // for parsing application/json
 | 
					
						
							|  |  |  |     this.app.use(_bodyParser.json()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  |     DiskManager.init(); | 
					
						
							|  |  |  |     ThumbnailGeneratorMWs.init(); | 
					
						
							| 
									
										
										
										
											2017-07-20 23:37:10 +02:00
										 |  |  |     if (Config.Server.database.type != DatabaseType.memory) { | 
					
						
							|  |  |  |       await  ObjectManagerRepository.InitSQLManagers(); | 
					
						
							| 
									
										
										
										
											2017-07-13 23:39:09 +02:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       await  ObjectManagerRepository.InitMemoryManagers(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PublicRouter.route(this.app); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     UserRouter.route(this.app); | 
					
						
							|  |  |  |     GalleryRouter.route(this.app); | 
					
						
							|  |  |  |     SharingRouter.route(this.app); | 
					
						
							|  |  |  |     AdminRouter.route(this.app); | 
					
						
							| 
									
										
										
										
											2017-07-09 14:23:50 +02:00
										 |  |  |     NotificationRouter.route(this.app); | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ErrorRouter.route(this.app); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Get PORT from environment and store in Express.
 | 
					
						
							|  |  |  |     this.app.set('port', Config.Server.port); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Create HTTP server.
 | 
					
						
							|  |  |  |     this.server = _http.createServer(this.app); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //Listen on provided PORT, on all network interfaces.
 | 
					
						
							|  |  |  |     this.server.listen(Config.Server.port); | 
					
						
							|  |  |  |     this.server.on('error', this.onError); | 
					
						
							|  |  |  |     this.server.on('listening', this.onListening); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 14:57:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Event listener for HTTP server "error" event. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   private onError = (error: any) => { | 
					
						
							|  |  |  |     if (error.syscall !== 'listen') { | 
					
						
							| 
									
										
										
										
											2017-07-19 10:21:52 +02:00
										 |  |  |       Logger.error(LOG_TAG, 'Server error', error); | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  |       throw error; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const bind = typeof Config.Server.port === 'string' | 
					
						
							|  |  |  |       ? 'Pipe ' + Config.Server.port | 
					
						
							|  |  |  |       : 'Port ' + Config.Server.port; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // handle specific listen error with friendly messages
 | 
					
						
							|  |  |  |     switch (error.code) { | 
					
						
							|  |  |  |       case 'EACCES': | 
					
						
							|  |  |  |         Logger.error(LOG_TAG, bind + ' requires elevated privileges'); | 
					
						
							|  |  |  |         process.exit(1); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 'EADDRINUSE': | 
					
						
							|  |  |  |         Logger.error(LOG_TAG, bind + ' is already in use'); | 
					
						
							|  |  |  |         process.exit(1); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         throw error; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2016-03-12 14:57:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 22:32:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Event listener for HTTP server "listening" event. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   private onListening = () => { | 
					
						
							|  |  |  |     let addr = this.server.address(); | 
					
						
							|  |  |  |     const bind = typeof addr === 'string' | 
					
						
							|  |  |  |       ? 'pipe ' + addr | 
					
						
							|  |  |  |       : 'port ' + addr.port; | 
					
						
							|  |  |  |     Logger.info(LOG_TAG, 'Listening on ' + bind); | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2016-03-12 14:57:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 12:53:19 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-04 10:24:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |