2 var http = require('http');
3 var path = require('path');
4 var socketio = require('socket.io');
5 var fs = require('fs');
6 var express = require('express');
7 var bodyParser = require('body-parser');
8 var winston = require('winston');
9 var moment = require('moment');
10 var JL = require('jsnlog').JL;
11 var jsnlog_nodejs = require('jsnlog-nodejs').jsnlog_nodejs;
13 var logger = JL('app.js');
15 var server = http.createServer(app);
16 var io = socketio.listen(server);
19 var Config = require('./config.json');
20 var FileSystem = require('./server/fs/filesystem');
21 var Mic = require('./server/fs/mic');
22 var Router = require('./server/routes/router');
23 var SocketEvent = require('./server/fs/socketEvent');
26 app.set('port', process.env.PORT || Config.TIC_WEB.PORT);
27 app.use(bodyParser.json());
28 app.use(bodyParser.urlencoded({extended: true}));
29 app.use(express.static(path.join(__dirname, '/public/src'))); //module directory
30 app.use('/api', Router);
32 server.listen(app.get('port'), process.env.IP || "0.0.0.0", function () {
33 var addr = server.address();
35 // init logger(winston and jsnlog)
36 function _timestamp() {
37 return moment().format("YYYY-MM-DD HH:mm:ss.SSS");
39 function _customFormatter(options) {
40 return options.timestamp() +
41 ' ['+ options.level.toUpperCase() + ']' +
42 '['+ options.meta.loggerName + '] ' +
43 (!options.meta.clientMessage ? options.message : options.meta.clientMessage);
45 var consoleAppender = new winston.transports.Console({
46 timestamp: _timestamp,
47 formatter: _customFormatter
49 var fileAppender = new winston.transports.File({
50 timestamp: _timestamp,
51 formatter: _customFormatter,
53 filename: Config.TIC_WEB.LOG_FILE
55 JL().setOptions({ appenders: [ consoleAppender, fileAppender ] });
57 logger.info('Server listening at' + addr.address + ':' + addr.port);
61 server.on('error', function(err) {
62 if (err.errno === 'EADDRINUSE') {
63 logger.error('The specified port(' + app.get('port') + ') is already in use. Please check that port is available.');
65 logger.error(err.message);
71 * jsnlog.js on the client by default sends log messages to /jsnlog.logger, using POST.
75 app.post('*.logger', function (req, res) {
76 // Pass the log messages to the server side jsnlog.js
77 jsnlog_nodejs(JL, req.body);
79 // Send empty response. This is ok, because client side jsnlog does not use response from server.
84 * Get package data from tic-core via RESTful API
88 app.post('/analysis', function(req, res) {
89 var postData = JSON.stringify(req.body);
90 var addr = server.address();
94 port: Config.TIC_CORE.PORT || addr.port + 1,
98 'Content-Type': 'application/json',
99 'Content-Length': Buffer.byteLength(postData)
104 var ticCoreReq = http.request(options, function (ticCoreRes) {
105 ticCoreRes.setEncoding('utf8');
106 ticCoreRes.on('data', function (chunk) {
109 ticCoreRes.on('end', function () {
114 ticCoreReq.write(postData);
119 * Get ks file path from tic-core via RESTful API
123 app.post('/exports', function(req, res) {
124 var postData = JSON.stringify(req.body);
125 var addr = server.address();
129 port: Config.TIC_CORE.PORT || addr.port + 1,
133 'Content-Type': 'application/json',
134 'Content-Length': Buffer.byteLength(postData)
139 var ticCoreReq = http.request(options, function (ticCoreRes) {
140 ticCoreRes.setEncoding('utf8');
141 ticCoreRes.on('data', function (chunk) {
144 ticCoreRes.on('end', function () {
149 ticCoreReq.write(postData);
155 * FileSystem controller (read/create)
156 * Connection with MIC
158 io.on('connection', function (socket) {
159 logger.info('socket connection');
162 * SocketEvent.FS_IMAGE_LIST_FROM = 'ws/fs/image/list/from'
164 socket.on(SocketEvent.FS_IMAGE_LIST_FROM, function (data) {
165 var msgData, fileList, targetDirectory;
169 targetDirectory = data.path;
171 // get the list of file
172 fileList = FileSystem.list(targetDirectory);
175 msgData.list = fileList;
178 socket.emit(SocketEvent.FS_IMAGE_LIST_TO, msgData);
182 * SocketEvent.FS_IMAGE_ADD_FROM = 'ws/fs/image/add/from'
184 socket.on(SocketEvent.FS_IMAGE_ADD_FROM, function (data) {
185 Mic.create(data, io);
187 io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
191 * SocketEvent.FS_IMAGE_ADD_KILL = 'ws/fs/image/add/kill'
193 socket.on(SocketEvent.FS_IMAGE_ADD_KILL, function () {
196 io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
200 * SocketEvent.MIC_AVAILABLE_FROM = 'ws/mic/available/from'
202 socket.on(SocketEvent.MIC_AVAILABLE_FROM, function () {
203 logger.info('mic available: ' + Mic.isAvailable());
204 io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
208 * SocketEvent.APP_CONFIG_FROM = 'ws/app/config/from'
210 socket.on(SocketEvent.APP_CONFIG_FROM, function () {
211 socket.emit(SocketEvent.APP_CONFIG_TO, Config);
214 socket.on('disconnect', function () {
215 logger.info('socket disconnect');