Commit b994c836c35b98c28a92a2c36c8285b9918066f8

Authored by Nattapon Wongpaet
0 parents
Exists in master and in 1 other branch dev

first commit

.gitignore 0 → 100644
  1 +++ a/.gitignore
... ... @@ -0,0 +1,30 @@
  1 +# Logs
  2 +logs
  3 +*.log
  4 +
  5 +# Runtime data
  6 +pids
  7 +*.pid
  8 +*.seed
  9 +
  10 +# Directory for instrumented libs generated by jscoverage/JSCover
  11 +lib-cov
  12 +
  13 +# Coverage directory used by tools like istanbul
  14 +coverage
  15 +
  16 +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
  17 +.grunt
  18 +
  19 +# node-waf configuration
  20 +.lock-wscript
  21 +
  22 +# Compiled binary addons (http://nodejs.org/api/addons.html)
  23 +build/Release
  24 +
  25 +# Dependency directory
  26 +# https://docs.npmjs.com/cli/shrinkwrap#caveats
  27 +node_modules
  28 +
  29 +# Debug log from npm
  30 +npm-debug.log
... ...
app.js 0 → 100644
  1 +++ a/app.js
... ... @@ -0,0 +1,48 @@
  1 +var express = require('express');
  2 +var path = require('path');
  3 +var favicon = require('serve-favicon');
  4 +var logger = require('morgan');
  5 +var cookieParser = require('cookie-parser');
  6 +var bodyParser = require('body-parser');
  7 +
  8 +var index = require('./routes/CMF/index');
  9 +var users = require('./routes/users');
  10 +
  11 +var app = express();
  12 +var prefixUrl = '/appName/v2'
  13 +
  14 +// view engine setup
  15 +app.set('views', path.join(__dirname, 'views'));
  16 +app.set('view engine', 'jade');
  17 +
  18 +// uncomment after placing your favicon in /public
  19 +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  20 +app.use(logger('dev'));
  21 +app.use(bodyParser.json());
  22 +app.use(bodyParser.urlencoded({ extended: false }));
  23 +app.use(cookieParser());
  24 +app.use(express.static(path.join(__dirname, 'public')));
  25 +
  26 +app.use(prefixUrl + '/', index);
  27 +app.use('/users', users);
  28 +app.listen(3000, () => console.log('Example app listening on port 3000!'))
  29 +
  30 +// catch 404 and forward to error handler
  31 +app.use(function(req, res, next) {
  32 + var err = new Error('Not Found');
  33 + err.status = 404;
  34 + next(err);
  35 +});
  36 +
  37 +// error handler
  38 +app.use(function(err, req, res, next) {
  39 + // set locals, only providing error in development
  40 + res.locals.message = err.message;
  41 + res.locals.error = req.app.get('env') === 'development' ? err : {};
  42 +
  43 + // render the error page
  44 + res.status(err.status || 500);
  45 + res.render('error');
  46 +});
  47 +
  48 +module.exports = app;
... ...
app_srfp.js 0 → 100644
  1 +++ a/app_srfp.js
... ... @@ -0,0 +1,93 @@
  1 +var express = require('express');
  2 +var path = require('path');
  3 +var favicon = require('serve-favicon');
  4 +var logger = require('morgan');
  5 +var cookieParser = require('cookie-parser');
  6 +var bodyParser = require('body-parser');
  7 +var index = require('./routes/index');
  8 +var users = require('./routes/users');
  9 +var app = express();
  10 +var fs = require('fs');
  11 +var util = require('util');
  12 +var crypto = require('crypto');
  13 +var http = require("http");
  14 +var url = require("url");
  15 +
  16 +app.listen(3000, function () {
  17 + console.log('Example app listening on port 3000!')
  18 +});
  19 +
  20 +/*const now=(unit)=>{
  21 +
  22 + const hrTime=process.hrtime();
  23 + switch (unit) {
  24 + case 'milli':return hrTime[0] * 1000 + hrTime[1] / 1000000;
  25 + case 'micro':return hrTime[0] * 1000000 + hrTime[1] / 1000;
  26 + case 'nano':return hrTime[0] * 1000000000 + hrTime[1] ;
  27 + break;
  28 + default:return hrTime[0] * 1000000000 + hrTime[1] ;
  29 + }
  30 +}*/
  31 +
  32 +app.get('/multiMedia.json',function (req, res) {
  33 + var name = req.query.name;
  34 + var type = req.query.type;
  35 + var commadId = req.query.commandId;
  36 + var pathfile = null;
  37 +
  38 + if (type === 'audio') {
  39 + pathfile = './audio/' + name;
  40 + } else if (type === 'video') {
  41 + pathfile = './video/' + name;
  42 + } else if (type === 'image') {
  43 + pathfile = 'D:\\PROJECT@AIS\\SRFP_Node\\Genesis-SRFP\\public\\image\\' + name;
  44 + } else {
  45 + console.log('Access Denied');
  46 + }
  47 +
  48 + // if (type === 'audio') {
  49 + // pathfile = path.join('D:', 'Node','Audio' , name);
  50 + // } else if (type === 'video') {
  51 + // pathfile = path.join('D:', 'Node','Video' , name);
  52 + // } else if (type === 'image') {
  53 + // pathfile = path.join('D:', 'Node','Image' , name);
  54 + // } else {
  55 + // console.log('Access Denied');
  56 + // }
  57 +
  58 + var file = fs.readFileSync(pathfile);
  59 + var value = Buffer.from(file).toString('base64');
  60 +
  61 + var stats = fs.statSync(pathfile);
  62 + var mtime = stats.mtime;
  63 + var size = stats.size;
  64 +
  65 + console.log(mtime.toISOString().replace(/T/, ' ').replace(/\..+/, ''));
  66 + // console.log(mtime.getTime());
  67 +
  68 + // Get the if-modified-since header from the request
  69 + var reqModDate = req.headers['if-modified-since'];
  70 + // console.log('If-modify ' + new Date(reqModDate).toISOString().replace(/T/, ' ').replace(/\..+/, ''));
  71 +
  72 + if (reqModDate != null) {
  73 + reqModDate = new Date(reqModDate);
  74 + if (reqModDate.getTime() == mtime.getTime()) {
  75 + console.log("load from cache");
  76 + res.writeHead(304, {
  77 + "Last-Modified": mtime.toUTCString()
  78 + });
  79 + res.end();
  80 + } else {
  81 + console.log("no cache");
  82 + var fileName = "test.jpg";
  83 + res.download(pathfile, fileName);
  84 + res.end();
  85 + }
  86 + } else {
  87 + res.writeHead(304, {
  88 + "Last-Modified": mtime.toUTCString()
  89 + });
  90 + res.end();
  91 + }
  92 + // res.send(value.toString());
  93 +});
... ...
bin/www 0 → 100644
  1 +++ a/bin/www
... ... @@ -0,0 +1,90 @@
  1 +#!/usr/bin/env node
  2 +
  3 +/**
  4 + * Module dependencies.
  5 + */
  6 +
  7 +var app = require('../app');
  8 +var debug = require('debug')('srfpgenesis:server');
  9 +var http = require('http');
  10 +
  11 +/**
  12 + * Get port from environment and store in Express.
  13 + */
  14 +
  15 +var port = normalizePort(process.env.PORT || '3000');
  16 +app.set('port', port);
  17 +
  18 +/**
  19 + * Create HTTP server.
  20 + */
  21 +
  22 +var server = http.createServer(app);
  23 +
  24 +/**
  25 + * Listen on provided port, on all network interfaces.
  26 + */
  27 +
  28 +server.listen(port);
  29 +server.on('error', onError);
  30 +server.on('listening', onListening);
  31 +
  32 +/**
  33 + * Normalize a port into a number, string, or false.
  34 + */
  35 +
  36 +function normalizePort(val) {
  37 + var port = parseInt(val, 10);
  38 +
  39 + if (isNaN(port)) {
  40 + // named pipe
  41 + return val;
  42 + }
  43 +
  44 + if (port >= 0) {
  45 + // port number
  46 + return port;
  47 + }
  48 +
  49 + return false;
  50 +}
  51 +
  52 +/**
  53 + * Event listener for HTTP server "error" event.
  54 + */
  55 +
  56 +function onError(error) {
  57 + if (error.syscall !== 'listen') {
  58 + throw error;
  59 + }
  60 +
  61 + var bind = typeof port === 'string'
  62 + ? 'Pipe ' + port
  63 + : 'Port ' + port;
  64 +
  65 + // handle specific listen errors with friendly messages
  66 + switch (error.code) {
  67 + case 'EACCES':
  68 + console.error(bind + ' requires elevated privileges');
  69 + process.exit(1);
  70 + break;
  71 + case 'EADDRINUSE':
  72 + console.error(bind + ' is already in use');
  73 + process.exit(1);
  74 + break;
  75 + default:
  76 + throw error;
  77 + }
  78 +}
  79 +
  80 +/**
  81 + * Event listener for HTTP server "listening" event.
  82 + */
  83 +
  84 +function onListening() {
  85 + var addr = server.address();
  86 + var bind = typeof addr === 'string'
  87 + ? 'pipe ' + addr
  88 + : 'port ' + addr.port;
  89 + debug('Listening on ' + bind);
  90 +}
... ...
config/config.js 0 → 100644
  1 +++ a/config/config.js
... ... @@ -0,0 +1,25 @@
  1 +'use strict';
  2 +
  3 +var config = {};
  4 +
  5 +// config.statCodeTbl = {};
  6 +config.log = {};
  7 +config.mediaPath={};
  8 +
  9 +config.log.logPath = 'D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\logTest\\';
  10 +config.log.summaryPath = 'D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\logTest\\';
  11 +config.log.statPath = 'D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\logTest\\';
  12 +config.log.alarmPath = 'D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\logTest\\';
  13 +config.log.detailPath = 'D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\logTest\\';
  14 +config.log.projectName = 'SRFP_Genesis';
  15 +config.log.logTime = 15; //Minute
  16 +config.log.statTime = 5; //Minute
  17 +config.log.alarmTime = 5; //Minute
  18 +config.log.detailTime = 15; //Minute
  19 +config.log.summaryTime = 15; //Minute
  20 +
  21 +config.mediaPath.video ="D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\source\\video\\";// --> mp4.m4a
  22 +config.mediaPath.image ='D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\source\\image\\';// --> jpg,jpeg,png
  23 +config.mediaPath.audio ='D:\\PROJECT@AIS\\SRFP_Node\\SRFPGenesis_TestLog\\source\\audio\\';// --> mp3,m4a
  24 +
  25 +module.exports = config;
... ...
config/log4js.json 0 → 100644
  1 +++ a/config/log4js.json
... ... @@ -0,0 +1,45 @@
  1 +{
  2 + "appenders": {
  3 + "access": {
  4 + "type": "dateFile",
  5 + "filename": "log/access",
  6 + "pattern": ".yyyy-MM-dd-hh-mm.log",
  7 + "compress": false,
  8 + "category": "serverLog",
  9 + "layout": {
  10 + "type": "pattern",
  11 + "pattern": "%h %d{dd/MM/yyyy hh:mm} %m"
  12 + }
  13 + },
  14 + "app": {
  15 + "type": "file",
  16 + "filename": "log/app.log",
  17 + "maxLogSize": 10485760,
  18 + "numBackups": 3
  19 + },
  20 + "errorFile": {
  21 + "type": "file",
  22 + "filename": "log/errors.log"
  23 + },
  24 + "errors": {
  25 + "type": "logLevelFilter",
  26 + "level": "ERROR",
  27 + "appender": "errorFile"
  28 + }
  29 + },
  30 + "categories": {
  31 + "default": {
  32 + "appenders": [
  33 + "app",
  34 + "errors"
  35 + ],
  36 + "level": "DEBUG"
  37 + },
  38 + "serverLog": {
  39 + "appenders": [
  40 + "access"
  41 + ],
  42 + "level": "DEBUG"
  43 + }
  44 + }
  45 +}
0 46 \ No newline at end of file
... ...
config/logger.js 0 → 100644
  1 +++ a/config/logger.js
... ... @@ -0,0 +1,3 @@
  1 +var SutisLog = require('../utils/SutisLog')
  2 +var logger = new SutisLog()
  3 +module.exports = logger
0 4 \ No newline at end of file
... ...
config/writeLog.rar 0 → 100644
No preview for this file type
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.detail 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.detail
... ... @@ -0,0 +1 @@
  1 +20180521 09:49:19|DESKTOP-G5SEAPD|SRFP_Genesis - detail: {"SRFP-Genesis.Details":{"Session":"1","Scenario":"getMultimedia","Identity":"","InputTimeStamp":"20180521 09:49:19.959","Input":[{"Event":"SRFP-Genesis.getMultimedia","Type":"REQ","RawData":"http://localhost:3000/mulitiMedia.json?name=girl.jpg&type=image&commandId=1","Data":{"Name":"girl.jpg","Type":"image","CommandId":"1"}}],"OutputTimeStamp":"20180521 09:49:19.959","Output":[{"Event":"SRFP-Genesis.getMultimedia","Type":"RES","RawData":"girl.jpg","Data":{"Size":"null","Modified":"null"}}],"ProcessingTime":"0 ms"}}
... ...
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.stat 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.stat
... ... @@ -0,0 +1,3 @@
  1 +20180521 09:49:19|DESKTOP-G5SEAPD|SRFP_Genesis - stat: SRFP-Genesis Returned Unknown URL
  2 +20180521 09:49:19|DESKTOP-G5SEAPD|SRFP_Genesis - stat: SRFP-Genesis Received Unknown URL Request
  3 +20180521 09:49:19|DESKTOP-G5SEAPD|SRFP_Genesis - stat: SRFP-Genesis Received Unknown URL Request
... ...
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.summary 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805210945.summary
... ... @@ -0,0 +1 @@
  1 +20180521 09:49:19|DESKTOP-G5SEAPD|SRFP_Genesis - summary: 20180521 09:49:19|null||getMultimedia|null|40400|Unknown URL|[client; getMultimedia(1); [40400; Unknown URL(1)]]|20180521 09:49:19|0
... ...
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.detail 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.detail
... ... @@ -0,0 +1 @@
  1 +20180521 10:02:46|DESKTOP-G5SEAPD|SRFP_Genesis|{"SRFP-Genesis.Details":{"Session":"1","Scenario":"getMultimedia","Identity":"","InputTimeStamp":"20180521 10:02:46.944","Input":[{"Event":"SRFP-Genesis.getMultimedia","Type":"REQ","RawData":"http://localhost:3000/mulitiMedia.json?name=girl.jpg&type=image&commandId=1","Data":{"Name":"girl.jpg","Type":"image","CommandId":"1"}}],"OutputTimeStamp":"20180521 10:02:46.944","Output":[{"Event":"SRFP-Genesis.getMultimedia","Type":"RES","RawData":"girl.jpg","Data":{"Size":"null","Modified":"null"}}],"ProcessingTime":"0 ms"}}
... ...
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.stat 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.stat
... ... @@ -0,0 +1,3 @@
  1 +20180521 10:02:46|DESKTOP-G5SEAPD|SRFP_Genesis|SRFP-Genesis Received Unknown URL Request
  2 +20180521 10:02:46|DESKTOP-G5SEAPD|SRFP_Genesis|SRFP-Genesis Returned Unknown URL
  3 +20180521 10:02:46|DESKTOP-G5SEAPD|SRFP_Genesis|SRFP-Genesis Received Unknown URL Request
... ...
logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.summary 0 → 100644
  1 +++ a/logTest/DESKTOP-G5SEAPD_SRFP_Genesis_201805211000.summary
... ... @@ -0,0 +1 @@
  1 +20180521 10:02:46|null||getMultimedia|null|40400|Unknown URL|[client; getMultimedia(1); [40400; Unknown URL(1)]]|20180521 10:02:46|1
... ...
package-lock.json 0 → 100644
  1 +++ a/package-lock.json
... ... @@ -0,0 +1,1109 @@
  1 +{
  2 + "name": "srfpgenesis",
  3 + "version": "0.0.0",
  4 + "lockfileVersion": 1,
  5 + "requires": true,
  6 + "dependencies": {
  7 + "accepts": {
  8 + "version": "1.3.4",
  9 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
  10 + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
  11 + "requires": {
  12 + "mime-types": "2.1.17",
  13 + "negotiator": "0.6.1"
  14 + }
  15 + },
  16 + "acorn": {
  17 + "version": "2.7.0",
  18 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
  19 + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
  20 + },
  21 + "acorn-globals": {
  22 + "version": "1.0.9",
  23 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
  24 + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
  25 + "requires": {
  26 + "acorn": "2.7.0"
  27 + }
  28 + },
  29 + "ajv": {
  30 + "version": "5.5.2",
  31 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
  32 + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
  33 + "requires": {
  34 + "co": "4.6.0",
  35 + "fast-deep-equal": "1.1.0",
  36 + "fast-json-stable-stringify": "2.0.0",
  37 + "json-schema-traverse": "0.3.1"
  38 + }
  39 + },
  40 + "align-text": {
  41 + "version": "0.1.4",
  42 + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
  43 + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
  44 + "requires": {
  45 + "kind-of": "3.2.2",
  46 + "longest": "1.0.1",
  47 + "repeat-string": "1.6.1"
  48 + }
  49 + },
  50 + "amdefine": {
  51 + "version": "1.0.1",
  52 + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
  53 + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
  54 + },
  55 + "array-flatten": {
  56 + "version": "1.1.1",
  57 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
  58 + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
  59 + },
  60 + "asap": {
  61 + "version": "1.0.0",
  62 + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz",
  63 + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0="
  64 + },
  65 + "asn1": {
  66 + "version": "0.2.4",
  67 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
  68 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
  69 + "requires": {
  70 + "safer-buffer": "2.1.2"
  71 + }
  72 + },
  73 + "assert-plus": {
  74 + "version": "1.0.0",
  75 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
  76 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
  77 + },
  78 + "asynckit": {
  79 + "version": "0.4.0",
  80 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
  81 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
  82 + },
  83 + "aws-sign2": {
  84 + "version": "0.7.0",
  85 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
  86 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
  87 + },
  88 + "aws4": {
  89 + "version": "1.8.0",
  90 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
  91 + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
  92 + },
  93 + "basic-auth": {
  94 + "version": "2.0.0",
  95 + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
  96 + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
  97 + "requires": {
  98 + "safe-buffer": "5.1.1"
  99 + }
  100 + },
  101 + "bcrypt-pbkdf": {
  102 + "version": "1.0.2",
  103 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
  104 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
  105 + "optional": true,
  106 + "requires": {
  107 + "tweetnacl": "0.14.5"
  108 + }
  109 + },
  110 + "body-parser": {
  111 + "version": "1.18.2",
  112 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
  113 + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
  114 + "requires": {
  115 + "bytes": "3.0.0",
  116 + "content-type": "1.0.4",
  117 + "debug": "2.6.9",
  118 + "depd": "1.1.2",
  119 + "http-errors": "1.6.2",
  120 + "iconv-lite": "0.4.19",
  121 + "on-finished": "2.3.0",
  122 + "qs": "6.5.1",
  123 + "raw-body": "2.3.2",
  124 + "type-is": "1.6.15"
  125 + }
  126 + },
  127 + "bytes": {
  128 + "version": "3.0.0",
  129 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
  130 + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
  131 + },
  132 + "camelcase": {
  133 + "version": "1.2.1",
  134 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
  135 + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
  136 + },
  137 + "caseless": {
  138 + "version": "0.12.0",
  139 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
  140 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
  141 + },
  142 + "center-align": {
  143 + "version": "0.1.3",
  144 + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
  145 + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
  146 + "requires": {
  147 + "align-text": "0.1.4",
  148 + "lazy-cache": "1.0.4"
  149 + }
  150 + },
  151 + "character-parser": {
  152 + "version": "1.2.1",
  153 + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz",
  154 + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY="
  155 + },
  156 + "clean-css": {
  157 + "version": "3.4.28",
  158 + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
  159 + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
  160 + "requires": {
  161 + "commander": "2.8.1",
  162 + "source-map": "0.4.4"
  163 + },
  164 + "dependencies": {
  165 + "commander": {
  166 + "version": "2.8.1",
  167 + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
  168 + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
  169 + "requires": {
  170 + "graceful-readlink": "1.0.1"
  171 + }
  172 + }
  173 + }
  174 + },
  175 + "cliui": {
  176 + "version": "2.1.0",
  177 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
  178 + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
  179 + "requires": {
  180 + "center-align": "0.1.3",
  181 + "right-align": "0.1.3",
  182 + "wordwrap": "0.0.2"
  183 + },
  184 + "dependencies": {
  185 + "wordwrap": {
  186 + "version": "0.0.2",
  187 + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
  188 + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
  189 + }
  190 + }
  191 + },
  192 + "co": {
  193 + "version": "4.6.0",
  194 + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
  195 + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
  196 + },
  197 + "combined-stream": {
  198 + "version": "1.0.6",
  199 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
  200 + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
  201 + "requires": {
  202 + "delayed-stream": "1.0.0"
  203 + }
  204 + },
  205 + "commander": {
  206 + "version": "2.6.0",
  207 + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
  208 + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0="
  209 + },
  210 + "constantinople": {
  211 + "version": "3.0.2",
  212 + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz",
  213 + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=",
  214 + "requires": {
  215 + "acorn": "2.7.0"
  216 + }
  217 + },
  218 + "content-disposition": {
  219 + "version": "0.5.2",
  220 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
  221 + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
  222 + },
  223 + "content-type": {
  224 + "version": "1.0.4",
  225 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
  226 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
  227 + },
  228 + "cookie": {
  229 + "version": "0.3.1",
  230 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
  231 + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
  232 + },
  233 + "cookie-parser": {
  234 + "version": "1.4.3",
  235 + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
  236 + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
  237 + "requires": {
  238 + "cookie": "0.3.1",
  239 + "cookie-signature": "1.0.6"
  240 + }
  241 + },
  242 + "cookie-signature": {
  243 + "version": "1.0.6",
  244 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
  245 + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
  246 + },
  247 + "core-util-is": {
  248 + "version": "1.0.2",
  249 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
  250 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
  251 + },
  252 + "css": {
  253 + "version": "1.0.8",
  254 + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz",
  255 + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=",
  256 + "requires": {
  257 + "css-parse": "1.0.4",
  258 + "css-stringify": "1.0.5"
  259 + }
  260 + },
  261 + "css-parse": {
  262 + "version": "1.0.4",
  263 + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz",
  264 + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90="
  265 + },
  266 + "css-stringify": {
  267 + "version": "1.0.5",
  268 + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz",
  269 + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE="
  270 + },
  271 + "dashdash": {
  272 + "version": "1.14.1",
  273 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
  274 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
  275 + "requires": {
  276 + "assert-plus": "1.0.0"
  277 + }
  278 + },
  279 + "debug": {
  280 + "version": "2.6.9",
  281 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  282 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  283 + "requires": {
  284 + "ms": "2.0.0"
  285 + }
  286 + },
  287 + "decamelize": {
  288 + "version": "1.2.0",
  289 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
  290 + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
  291 + },
  292 + "delayed-stream": {
  293 + "version": "1.0.0",
  294 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
  295 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
  296 + },
  297 + "depd": {
  298 + "version": "1.1.2",
  299 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
  300 + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
  301 + },
  302 + "destroy": {
  303 + "version": "1.0.4",
  304 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
  305 + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
  306 + },
  307 + "easysoap": {
  308 + "version": "2.0.1",
  309 + "resolved": "https://registry.npmjs.org/easysoap/-/easysoap-2.0.1.tgz",
  310 + "integrity": "sha512-pMLbaDcR3BGVy94yTEyZbsY7OXKm4xmM5FLy+bOz1mYSNt2drNOQSuj7bim2WGiJwoE648wtqa8wHnZbNjuFQw==",
  311 + "requires": {
  312 + "request": "2.87.0",
  313 + "underscore": "1.9.1",
  314 + "wsdlrdr": "0.4.0",
  315 + "xmldoc": "1.1.2"
  316 + }
  317 + },
  318 + "ecc-jsbn": {
  319 + "version": "0.1.2",
  320 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
  321 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
  322 + "optional": true,
  323 + "requires": {
  324 + "jsbn": "0.1.1",
  325 + "safer-buffer": "2.1.2"
  326 + }
  327 + },
  328 + "ee-first": {
  329 + "version": "1.1.1",
  330 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
  331 + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
  332 + },
  333 + "encodeurl": {
  334 + "version": "1.0.2",
  335 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
  336 + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
  337 + },
  338 + "escape-html": {
  339 + "version": "1.0.3",
  340 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
  341 + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
  342 + },
  343 + "etag": {
  344 + "version": "1.8.1",
  345 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
  346 + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
  347 + },
  348 + "express": {
  349 + "version": "4.15.5",
  350 + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz",
  351 + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=",
  352 + "requires": {
  353 + "accepts": "1.3.4",
  354 + "array-flatten": "1.1.1",
  355 + "content-disposition": "0.5.2",
  356 + "content-type": "1.0.4",
  357 + "cookie": "0.3.1",
  358 + "cookie-signature": "1.0.6",
  359 + "debug": "2.6.9",
  360 + "depd": "1.1.2",
  361 + "encodeurl": "1.0.2",
  362 + "escape-html": "1.0.3",
  363 + "etag": "1.8.1",
  364 + "finalhandler": "1.0.6",
  365 + "fresh": "0.5.2",
  366 + "merge-descriptors": "1.0.1",
  367 + "methods": "1.1.2",
  368 + "on-finished": "2.3.0",
  369 + "parseurl": "1.3.2",
  370 + "path-to-regexp": "0.1.7",
  371 + "proxy-addr": "1.1.5",
  372 + "qs": "6.5.0",
  373 + "range-parser": "1.2.0",
  374 + "send": "0.15.6",
  375 + "serve-static": "1.12.6",
  376 + "setprototypeof": "1.0.3",
  377 + "statuses": "1.3.1",
  378 + "type-is": "1.6.15",
  379 + "utils-merge": "1.0.0",
  380 + "vary": "1.1.2"
  381 + },
  382 + "dependencies": {
  383 + "qs": {
  384 + "version": "6.5.0",
  385 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz",
  386 + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg=="
  387 + },
  388 + "statuses": {
  389 + "version": "1.3.1",
  390 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
  391 + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
  392 + }
  393 + }
  394 + },
  395 + "extend": {
  396 + "version": "3.0.2",
  397 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
  398 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
  399 + },
  400 + "extsprintf": {
  401 + "version": "1.3.0",
  402 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
  403 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
  404 + },
  405 + "fast-deep-equal": {
  406 + "version": "1.1.0",
  407 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
  408 + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
  409 + },
  410 + "fast-json-stable-stringify": {
  411 + "version": "2.0.0",
  412 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
  413 + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
  414 + },
  415 + "finalhandler": {
  416 + "version": "1.0.6",
  417 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz",
  418 + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=",
  419 + "requires": {
  420 + "debug": "2.6.9",
  421 + "encodeurl": "1.0.2",
  422 + "escape-html": "1.0.3",
  423 + "on-finished": "2.3.0",
  424 + "parseurl": "1.3.2",
  425 + "statuses": "1.3.1",
  426 + "unpipe": "1.0.0"
  427 + },
  428 + "dependencies": {
  429 + "statuses": {
  430 + "version": "1.3.1",
  431 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
  432 + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
  433 + }
  434 + }
  435 + },
  436 + "forever-agent": {
  437 + "version": "0.6.1",
  438 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
  439 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
  440 + },
  441 + "form-data": {
  442 + "version": "2.3.2",
  443 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
  444 + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
  445 + "requires": {
  446 + "asynckit": "0.4.0",
  447 + "combined-stream": "1.0.6",
  448 + "mime-types": "2.1.17"
  449 + }
  450 + },
  451 + "forwarded": {
  452 + "version": "0.1.2",
  453 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
  454 + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
  455 + },
  456 + "fresh": {
  457 + "version": "0.5.2",
  458 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
  459 + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
  460 + },
  461 + "getpass": {
  462 + "version": "0.1.7",
  463 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
  464 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
  465 + "requires": {
  466 + "assert-plus": "1.0.0"
  467 + }
  468 + },
  469 + "graceful-readlink": {
  470 + "version": "1.0.1",
  471 + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
  472 + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
  473 + },
  474 + "har-schema": {
  475 + "version": "2.0.0",
  476 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
  477 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
  478 + },
  479 + "har-validator": {
  480 + "version": "5.0.3",
  481 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
  482 + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
  483 + "requires": {
  484 + "ajv": "5.5.2",
  485 + "har-schema": "2.0.0"
  486 + }
  487 + },
  488 + "http-errors": {
  489 + "version": "1.6.2",
  490 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
  491 + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
  492 + "requires": {
  493 + "depd": "1.1.1",
  494 + "inherits": "2.0.3",
  495 + "setprototypeof": "1.0.3",
  496 + "statuses": "1.4.0"
  497 + },
  498 + "dependencies": {
  499 + "depd": {
  500 + "version": "1.1.1",
  501 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
  502 + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
  503 + }
  504 + }
  505 + },
  506 + "http-signature": {
  507 + "version": "1.2.0",
  508 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
  509 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
  510 + "requires": {
  511 + "assert-plus": "1.0.0",
  512 + "jsprim": "1.4.1",
  513 + "sshpk": "1.14.2"
  514 + }
  515 + },
  516 + "iconv-lite": {
  517 + "version": "0.4.19",
  518 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
  519 + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
  520 + },
  521 + "inherits": {
  522 + "version": "2.0.3",
  523 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
  524 + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
  525 + },
  526 + "ipaddr.js": {
  527 + "version": "1.4.0",
  528 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz",
  529 + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA="
  530 + },
  531 + "is-buffer": {
  532 + "version": "1.1.6",
  533 + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
  534 + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
  535 + },
  536 + "is-promise": {
  537 + "version": "2.1.0",
  538 + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
  539 + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
  540 + },
  541 + "is-typedarray": {
  542 + "version": "1.0.0",
  543 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
  544 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
  545 + },
  546 + "isstream": {
  547 + "version": "0.1.2",
  548 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
  549 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
  550 + },
  551 + "jade": {
  552 + "version": "1.11.0",
  553 + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz",
  554 + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=",
  555 + "requires": {
  556 + "character-parser": "1.2.1",
  557 + "clean-css": "3.4.28",
  558 + "commander": "2.6.0",
  559 + "constantinople": "3.0.2",
  560 + "jstransformer": "0.0.2",
  561 + "mkdirp": "0.5.1",
  562 + "transformers": "2.1.0",
  563 + "uglify-js": "2.8.29",
  564 + "void-elements": "2.0.1",
  565 + "with": "4.0.3"
  566 + }
  567 + },
  568 + "jsbn": {
  569 + "version": "0.1.1",
  570 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
  571 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
  572 + "optional": true
  573 + },
  574 + "json-schema": {
  575 + "version": "0.2.3",
  576 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
  577 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
  578 + },
  579 + "json-schema-traverse": {
  580 + "version": "0.3.1",
  581 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
  582 + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
  583 + },
  584 + "json-stringify-safe": {
  585 + "version": "5.0.1",
  586 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
  587 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
  588 + },
  589 + "jsprim": {
  590 + "version": "1.4.1",
  591 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
  592 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
  593 + "requires": {
  594 + "assert-plus": "1.0.0",
  595 + "extsprintf": "1.3.0",
  596 + "json-schema": "0.2.3",
  597 + "verror": "1.10.0"
  598 + }
  599 + },
  600 + "jstransformer": {
  601 + "version": "0.0.2",
  602 + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz",
  603 + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=",
  604 + "requires": {
  605 + "is-promise": "2.1.0",
  606 + "promise": "6.1.0"
  607 + }
  608 + },
  609 + "kind-of": {
  610 + "version": "3.2.2",
  611 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  612 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  613 + "requires": {
  614 + "is-buffer": "1.1.6"
  615 + }
  616 + },
  617 + "lazy-cache": {
  618 + "version": "1.0.4",
  619 + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
  620 + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
  621 + },
  622 + "longest": {
  623 + "version": "1.0.1",
  624 + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
  625 + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
  626 + },
  627 + "media-typer": {
  628 + "version": "0.3.0",
  629 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
  630 + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
  631 + },
  632 + "merge-descriptors": {
  633 + "version": "1.0.1",
  634 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
  635 + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
  636 + },
  637 + "methods": {
  638 + "version": "1.1.2",
  639 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
  640 + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
  641 + },
  642 + "mime": {
  643 + "version": "1.3.4",
  644 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
  645 + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
  646 + },
  647 + "mime-db": {
  648 + "version": "1.30.0",
  649 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
  650 + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
  651 + },
  652 + "mime-types": {
  653 + "version": "2.1.17",
  654 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
  655 + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
  656 + "requires": {
  657 + "mime-db": "1.30.0"
  658 + }
  659 + },
  660 + "minimist": {
  661 + "version": "0.0.8",
  662 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
  663 + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
  664 + },
  665 + "mkdirp": {
  666 + "version": "0.5.1",
  667 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
  668 + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
  669 + "requires": {
  670 + "minimist": "0.0.8"
  671 + }
  672 + },
  673 + "morgan": {
  674 + "version": "1.9.0",
  675 + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz",
  676 + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=",
  677 + "requires": {
  678 + "basic-auth": "2.0.0",
  679 + "debug": "2.6.9",
  680 + "depd": "1.1.2",
  681 + "on-finished": "2.3.0",
  682 + "on-headers": "1.0.1"
  683 + }
  684 + },
  685 + "ms": {
  686 + "version": "2.0.0",
  687 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
  688 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
  689 + },
  690 + "negotiator": {
  691 + "version": "0.6.1",
  692 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
  693 + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
  694 + },
  695 + "oauth-sign": {
  696 + "version": "0.8.2",
  697 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
  698 + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
  699 + },
  700 + "on-finished": {
  701 + "version": "2.3.0",
  702 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
  703 + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
  704 + "requires": {
  705 + "ee-first": "1.1.1"
  706 + }
  707 + },
  708 + "on-headers": {
  709 + "version": "1.0.1",
  710 + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
  711 + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
  712 + },
  713 + "optimist": {
  714 + "version": "0.3.7",
  715 + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
  716 + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=",
  717 + "requires": {
  718 + "wordwrap": "0.0.3"
  719 + }
  720 + },
  721 + "parseurl": {
  722 + "version": "1.3.2",
  723 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
  724 + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
  725 + },
  726 + "path-to-regexp": {
  727 + "version": "0.1.7",
  728 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
  729 + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
  730 + },
  731 + "performance-now": {
  732 + "version": "2.1.0",
  733 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
  734 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
  735 + },
  736 + "promise": {
  737 + "version": "6.1.0",
  738 + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz",
  739 + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=",
  740 + "requires": {
  741 + "asap": "1.0.0"
  742 + }
  743 + },
  744 + "proxy-addr": {
  745 + "version": "1.1.5",
  746 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz",
  747 + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=",
  748 + "requires": {
  749 + "forwarded": "0.1.2",
  750 + "ipaddr.js": "1.4.0"
  751 + }
  752 + },
  753 + "punycode": {
  754 + "version": "1.4.1",
  755 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
  756 + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
  757 + },
  758 + "qs": {
  759 + "version": "6.5.1",
  760 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
  761 + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
  762 + },
  763 + "range-parser": {
  764 + "version": "1.2.0",
  765 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
  766 + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
  767 + },
  768 + "raw-body": {
  769 + "version": "2.3.2",
  770 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
  771 + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
  772 + "requires": {
  773 + "bytes": "3.0.0",
  774 + "http-errors": "1.6.2",
  775 + "iconv-lite": "0.4.19",
  776 + "unpipe": "1.0.0"
  777 + }
  778 + },
  779 + "repeat-string": {
  780 + "version": "1.6.1",
  781 + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
  782 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
  783 + },
  784 + "request": {
  785 + "version": "2.87.0",
  786 + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
  787 + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
  788 + "requires": {
  789 + "aws-sign2": "0.7.0",
  790 + "aws4": "1.8.0",
  791 + "caseless": "0.12.0",
  792 + "combined-stream": "1.0.6",
  793 + "extend": "3.0.2",
  794 + "forever-agent": "0.6.1",
  795 + "form-data": "2.3.2",
  796 + "har-validator": "5.0.3",
  797 + "http-signature": "1.2.0",
  798 + "is-typedarray": "1.0.0",
  799 + "isstream": "0.1.2",
  800 + "json-stringify-safe": "5.0.1",
  801 + "mime-types": "2.1.17",
  802 + "oauth-sign": "0.8.2",
  803 + "performance-now": "2.1.0",
  804 + "qs": "6.5.1",
  805 + "safe-buffer": "5.1.1",
  806 + "tough-cookie": "2.3.4",
  807 + "tunnel-agent": "0.6.0",
  808 + "uuid": "3.3.2"
  809 + }
  810 + },
  811 + "right-align": {
  812 + "version": "0.1.3",
  813 + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
  814 + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
  815 + "requires": {
  816 + "align-text": "0.1.4"
  817 + }
  818 + },
  819 + "safe-buffer": {
  820 + "version": "5.1.1",
  821 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
  822 + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
  823 + },
  824 + "safer-buffer": {
  825 + "version": "2.1.2",
  826 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
  827 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
  828 + },
  829 + "sax": {
  830 + "version": "1.2.4",
  831 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
  832 + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
  833 + },
  834 + "send": {
  835 + "version": "0.15.6",
  836 + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz",
  837 + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=",
  838 + "requires": {
  839 + "debug": "2.6.9",
  840 + "depd": "1.1.2",
  841 + "destroy": "1.0.4",
  842 + "encodeurl": "1.0.2",
  843 + "escape-html": "1.0.3",
  844 + "etag": "1.8.1",
  845 + "fresh": "0.5.2",
  846 + "http-errors": "1.6.2",
  847 + "mime": "1.3.4",
  848 + "ms": "2.0.0",
  849 + "on-finished": "2.3.0",
  850 + "range-parser": "1.2.0",
  851 + "statuses": "1.3.1"
  852 + },
  853 + "dependencies": {
  854 + "statuses": {
  855 + "version": "1.3.1",
  856 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
  857 + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
  858 + }
  859 + }
  860 + },
  861 + "serve-favicon": {
  862 + "version": "2.4.5",
  863 + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz",
  864 + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==",
  865 + "requires": {
  866 + "etag": "1.8.1",
  867 + "fresh": "0.5.2",
  868 + "ms": "2.0.0",
  869 + "parseurl": "1.3.2",
  870 + "safe-buffer": "5.1.1"
  871 + }
  872 + },
  873 + "serve-static": {
  874 + "version": "1.12.6",
  875 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz",
  876 + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=",
  877 + "requires": {
  878 + "encodeurl": "1.0.2",
  879 + "escape-html": "1.0.3",
  880 + "parseurl": "1.3.2",
  881 + "send": "0.15.6"
  882 + }
  883 + },
  884 + "setprototypeof": {
  885 + "version": "1.0.3",
  886 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
  887 + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
  888 + },
  889 + "source-map": {
  890 + "version": "0.4.4",
  891 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
  892 + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
  893 + "requires": {
  894 + "amdefine": "1.0.1"
  895 + }
  896 + },
  897 + "sshpk": {
  898 + "version": "1.14.2",
  899 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
  900 + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
  901 + "requires": {
  902 + "asn1": "0.2.4",
  903 + "assert-plus": "1.0.0",
  904 + "bcrypt-pbkdf": "1.0.2",
  905 + "dashdash": "1.14.1",
  906 + "ecc-jsbn": "0.1.2",
  907 + "getpass": "0.1.7",
  908 + "jsbn": "0.1.1",
  909 + "safer-buffer": "2.1.2",
  910 + "tweetnacl": "0.14.5"
  911 + }
  912 + },
  913 + "statuses": {
  914 + "version": "1.4.0",
  915 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
  916 + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
  917 + },
  918 + "tough-cookie": {
  919 + "version": "2.3.4",
  920 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
  921 + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
  922 + "requires": {
  923 + "punycode": "1.4.1"
  924 + }
  925 + },
  926 + "transformers": {
  927 + "version": "2.1.0",
  928 + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz",
  929 + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=",
  930 + "requires": {
  931 + "css": "1.0.8",
  932 + "promise": "2.0.0",
  933 + "uglify-js": "2.2.5"
  934 + },
  935 + "dependencies": {
  936 + "is-promise": {
  937 + "version": "1.0.1",
  938 + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz",
  939 + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU="
  940 + },
  941 + "promise": {
  942 + "version": "2.0.0",
  943 + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz",
  944 + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=",
  945 + "requires": {
  946 + "is-promise": "1.0.1"
  947 + }
  948 + },
  949 + "source-map": {
  950 + "version": "0.1.43",
  951 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
  952 + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
  953 + "requires": {
  954 + "amdefine": "1.0.1"
  955 + }
  956 + },
  957 + "uglify-js": {
  958 + "version": "2.2.5",
  959 + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz",
  960 + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=",
  961 + "requires": {
  962 + "optimist": "0.3.7",
  963 + "source-map": "0.1.43"
  964 + }
  965 + }
  966 + }
  967 + },
  968 + "tunnel-agent": {
  969 + "version": "0.6.0",
  970 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
  971 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
  972 + "requires": {
  973 + "safe-buffer": "5.1.1"
  974 + }
  975 + },
  976 + "tweetnacl": {
  977 + "version": "0.14.5",
  978 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
  979 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
  980 + "optional": true
  981 + },
  982 + "type-is": {
  983 + "version": "1.6.15",
  984 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
  985 + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
  986 + "requires": {
  987 + "media-typer": "0.3.0",
  988 + "mime-types": "2.1.17"
  989 + }
  990 + },
  991 + "uglify-js": {
  992 + "version": "2.8.29",
  993 + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
  994 + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
  995 + "requires": {
  996 + "source-map": "0.5.7",
  997 + "uglify-to-browserify": "1.0.2",
  998 + "yargs": "3.10.0"
  999 + },
  1000 + "dependencies": {
  1001 + "source-map": {
  1002 + "version": "0.5.7",
  1003 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
  1004 + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
  1005 + }
  1006 + }
  1007 + },
  1008 + "uglify-to-browserify": {
  1009 + "version": "1.0.2",
  1010 + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
  1011 + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
  1012 + "optional": true
  1013 + },
  1014 + "underscore": {
  1015 + "version": "1.9.1",
  1016 + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
  1017 + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
  1018 + },
  1019 + "unpipe": {
  1020 + "version": "1.0.0",
  1021 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
  1022 + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
  1023 + },
  1024 + "utils-merge": {
  1025 + "version": "1.0.0",
  1026 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
  1027 + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
  1028 + },
  1029 + "uuid": {
  1030 + "version": "3.3.2",
  1031 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
  1032 + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
  1033 + },
  1034 + "vary": {
  1035 + "version": "1.1.2",
  1036 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
  1037 + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
  1038 + },
  1039 + "verror": {
  1040 + "version": "1.10.0",
  1041 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
  1042 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
  1043 + "requires": {
  1044 + "assert-plus": "1.0.0",
  1045 + "core-util-is": "1.0.2",
  1046 + "extsprintf": "1.3.0"
  1047 + }
  1048 + },
  1049 + "void-elements": {
  1050 + "version": "2.0.1",
  1051 + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
  1052 + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
  1053 + },
  1054 + "window-size": {
  1055 + "version": "0.1.0",
  1056 + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
  1057 + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
  1058 + },
  1059 + "with": {
  1060 + "version": "4.0.3",
  1061 + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz",
  1062 + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=",
  1063 + "requires": {
  1064 + "acorn": "1.2.2",
  1065 + "acorn-globals": "1.0.9"
  1066 + },
  1067 + "dependencies": {
  1068 + "acorn": {
  1069 + "version": "1.2.2",
  1070 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz",
  1071 + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ="
  1072 + }
  1073 + }
  1074 + },
  1075 + "wordwrap": {
  1076 + "version": "0.0.3",
  1077 + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
  1078 + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
  1079 + },
  1080 + "wsdlrdr": {
  1081 + "version": "0.4.0",
  1082 + "resolved": "https://registry.npmjs.org/wsdlrdr/-/wsdlrdr-0.4.0.tgz",
  1083 + "integrity": "sha512-9JZLfnxRx4j8nABatZwYt+DN5p0/4NW5LAIk4oac3rt6sdn9O2pxsoHVrgvk8hPrKya0lw1Ql30sdKzNn4hSWg==",
  1084 + "requires": {
  1085 + "request": "2.87.0",
  1086 + "xmldoc": "1.1.2"
  1087 + }
  1088 + },
  1089 + "xmldoc": {
  1090 + "version": "1.1.2",
  1091 + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz",
  1092 + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==",
  1093 + "requires": {
  1094 + "sax": "1.2.4"
  1095 + }
  1096 + },
  1097 + "yargs": {
  1098 + "version": "3.10.0",
  1099 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
  1100 + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
  1101 + "requires": {
  1102 + "camelcase": "1.2.1",
  1103 + "cliui": "2.1.0",
  1104 + "decamelize": "1.2.0",
  1105 + "window-size": "0.1.0"
  1106 + }
  1107 + }
  1108 + }
  1109 +}
... ...
package.json 0 → 100644
  1 +++ a/package.json
... ... @@ -0,0 +1,18 @@
  1 +{
  2 + "name": "srfpgenesis",
  3 + "version": "0.0.0",
  4 + "private": true,
  5 + "scripts": {
  6 + "start": "node ./bin/www"
  7 + },
  8 + "dependencies": {
  9 + "body-parser": "~1.18.2",
  10 + "cookie-parser": "~1.4.3",
  11 + "debug": "~2.6.9",
  12 + "easysoap": "^2.0.1",
  13 + "express": "^4.15.5",
  14 + "jade": "~1.11.0",
  15 + "morgan": "~1.9.0",
  16 + "serve-favicon": "~2.4.5"
  17 + }
  18 +}
... ...
public/image/image.jpg 0 → 100644

57 KB

public/stylesheets/style.css 0 → 100644
  1 +++ a/public/stylesheets/style.css
... ... @@ -0,0 +1,8 @@
  1 +body {
  2 + padding: 50px;
  3 + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
  4 +}
  5 +
  6 +a {
  7 + color: #00B7FF;
  8 +}
... ...
routes/CMF/customerMembership.js 0 → 100644
  1 +++ a/routes/CMF/customerMembership.js
... ... @@ -0,0 +1,9 @@
  1 +var express = require('express');
  2 +var router = express.Router();
  3 +
  4 +/* GET users listing. */
  5 +router.get('/', function(req, res, next) {
  6 + res.send('customer membership');
  7 +});
  8 +
  9 +module.exports = router;
... ...
routes/CMF/index.js 0 → 100644
  1 +++ a/routes/CMF/index.js
... ... @@ -0,0 +1,11 @@
  1 +let express = require('express');
  2 +let router = express.Router();
  3 +
  4 +// load controllers
  5 +const vizCard = require('./vizCard');
  6 +const customerMembership = require('./customerMembership');
  7 +
  8 +router.use('/vizCard.json', vizCard);
  9 +router.use('/customerMembership.json', customerMembership);
  10 +
  11 +module.exports = router;
0 12 \ No newline at end of file
... ...
routes/CMF/vizCard.js 0 → 100644
  1 +++ a/routes/CMF/vizCard.js
... ... @@ -0,0 +1,41 @@
  1 +'use strict';
  2 +var express = require('express');
  3 +var router = express.Router();
  4 +const EasySoap = require('easysoap');
  5 +
  6 +/* GET users listing. */
  7 +router.get('/', function(req, res, next) {
  8 +
  9 + // define soap params
  10 + const params = {
  11 + host: 'www.sample.com',
  12 + path: '/path/soap/',
  13 +
  14 + // set soap headers (optional)
  15 + headers: [{
  16 + 'name' : 'item_name',
  17 + 'value' : 'item_value',
  18 + 'namespace': 'item_namespace'
  19 + }]
  20 + }
  21 +
  22 + /*
  23 + * create the client
  24 + */
  25 + var soapClient = EasySoap(params);
  26 +
  27 + console.log(soapClient);
  28 +
  29 + /*
  30 + * get all available functions
  31 + */
  32 + soapClient.getAllFunctions()
  33 + .then((functionArray) => { console.log(functionArray); })
  34 + .catch((err) => { throw new Error(err); });
  35 +
  36 +
  37 + res.send('viz card id');
  38 +
  39 +});
  40 +
  41 +module.exports = router;
... ...
routes/users.js 0 → 100644
  1 +++ a/routes/users.js
... ... @@ -0,0 +1,9 @@
  1 +var express = require('express');
  2 +var router = express.Router();
  3 +
  4 +/* GET users listing. */
  5 +router.get('/', function(req, res, next) {
  6 + res.send('respond with a resource');
  7 +});
  8 +
  9 +module.exports = router;
... ...
srfp_genesis.js 0 → 100644
  1 +++ a/srfp_genesis.js
... ... @@ -0,0 +1,323 @@
  1 +var express = require('express');
  2 +var path = require('path');
  3 +var app = express();
  4 +var fs = require('fs');
  5 +var logger = require('./config/logger');
  6 +var config = require('./config/config');
  7 +
  8 +function checkReq(req) {
  9 + var regex_filetype = /^.*\.(jpg|jpeg|png|mp3|mp4|m4a)$/ig;
  10 + var regex_datetime = /(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{1,2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\sGMT$/g;
  11 + var regex_commandId = /^\d+$/g;
  12 +
  13 + var reqModDate = req.get('If-Modified-Since');
  14 + var errorCase = null;
  15 + // logger.error('>>>>>>>>> ' + req.url);
  16 +
  17 + if (reqModDate != null) {
  18 + // logger.error('Req Header Not null');
  19 + if (!regex_datetime.test(reqModDate)) {
  20 + logger.error('[invalid] date format: ' + reqModDate);
  21 + errorCase = 'req.If-Modified-Since=' + reqModDate;
  22 +
  23 + var resc = '40300';
  24 + var desc = 'Missing or invalid parameter';
  25 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  26 + var missingInvalid = errorCase;
  27 + return [resc, desc, prompt, missingInvalid];
  28 + }
  29 + }
  30 +
  31 + if (req.query.name && req.query.type && req.query.commandId) {
  32 + if (regex_filetype.test(req.query.name)) {
  33 + return true;
  34 + }
  35 + }
  36 +
  37 + if (!req.query.name) {
  38 + logger.error('[missing or invalid]: name');
  39 + errorCase = 'req.name=' + req.query.name;
  40 + } else if (!req.query.type) {
  41 + logger.error('[missing or invalid]: type');
  42 + errorCase = 'req.type=' + req.query.type;
  43 + } else if (!req.query.commandId) {
  44 + logger.error('[missing or invalid]: commandId');
  45 + errorCase = 'req.commandId=' + req.query.commandId;
  46 + }
  47 +
  48 + var resc = '40300';
  49 + var desc = 'Missing or invalid parameter';
  50 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  51 + var missingInvalid = errorCase;
  52 + return [resc, desc, prompt, missingInvalid];
  53 +
  54 +};
  55 +
  56 +function checkFile(req) {
  57 + var path;
  58 + if (req.query.type === 'audio') {
  59 + path = config.mediaPath.audio + req.query.name;
  60 + } else if (req.query.type === 'video') {
  61 + path = config.mediaPath.video + req.query.name;
  62 + } else if (req.query.type === 'image') {
  63 + path = config.mediaPath.image + req.query.name;
  64 + } else {
  65 + var resc = '40401';
  66 + var desc = 'File not found';
  67 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  68 + var missingInvalid = 'req.name=' + req.query.name;
  69 + return [resc, desc, prompt, missingInvalid];
  70 + }
  71 +
  72 + if (fs.existsSync(path)) {
  73 + try {
  74 + fs.accessSync(path, fs.constants.R_OK);
  75 + var file_name = req.query.name;
  76 + return [true, file_name, path];
  77 + } catch (err) {
  78 + var resc = '40101';
  79 + var desc = 'Access denied';
  80 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  81 + var missingInvalid = 'req.name=' + req.query.name;
  82 + return [resc, desc, prompt, missingInvalid];
  83 + }
  84 + } else {
  85 + var resc = '40401';
  86 + var desc = 'File not found';
  87 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  88 + var missingInvalid = 'req.name=' + req.query.name;
  89 + return [resc, desc, prompt, missingInvalid];
  90 + }
  91 +};
  92 +
  93 +function checkHeader(req, path_file) {
  94 + try {
  95 + // var reqModDate = req.headers['If-Modified-Since'];
  96 + var reqModDate = req.get('If-Modified-Since');
  97 + var stats = fs.statSync(path_file);
  98 + var mtime = stats.mtime;
  99 + var size = stats['size'];
  100 +
  101 + if (reqModDate != null) {
  102 + reqModDate = new Date(reqModDate);
  103 +
  104 + logger.info('[If-Modified-Since]: ' + reqModDate.toUTCString());
  105 + logger.info('[Modified-File] : ' + mtime.toUTCString());
  106 +
  107 + if (reqModDate.toUTCString() == mtime.toUTCString()) {
  108 + logger.info('[Req Header]: If-Modified-Since == Modified File');
  109 + return [304, mtime, size];
  110 + } else {
  111 + logger.info('[Req Header]: If-Modified-Since != Modified File');
  112 + return [200, mtime, size];
  113 + }
  114 + } else {
  115 + logger.info('[Req Header]: No-header: If-Modified-Since');
  116 + logger.info('[Modified-File]: ' + mtime.toUTCString());
  117 + return [200, mtime, size];
  118 + }
  119 + } catch (error) {
  120 + logger.error('[Error check header!!!]');
  121 + return [200, mtime, size];
  122 + }
  123 +};
  124 +
  125 +function writeApplog(req) {
  126 +
  127 + logger.info('[Start getMultimedia Validate Parameter]: ' + 'name: ' + req.query.name + ', type=' + req.query.type + ', commandId=' + req.query.commandId);
  128 + logger.info('[incommigHeader: If-Modified-Since]: ' + req.get('If-Modified-Since'));
  129 + logger.info('[incomming url]: ' + req.protocol + '://' + req.get('host') + req.originalUrl);
  130 +}
  131 +
  132 +app.listen(8080, function() {
  133 + logger.info('=============================');
  134 + logger.info('SRFP-Genesis on port 8080!');
  135 +});
  136 +
  137 +app.get('/multiMedia.json', function(req, res) {
  138 + var summaryLog;
  139 + var request = checkReq(req);
  140 + var fileReq = checkFile(req);
  141 + // var headerReq = checkHeader(req, fileReq[2]);
  142 +
  143 + var session = req.query.commandId;
  144 + var cmd = 'getMultimedia';
  145 + var identity = '';
  146 + var reqfile = req.query.name;
  147 +
  148 + writeApplog(req);
  149 +
  150 + // [Check Request]
  151 + if (request == true && fileReq[0] == true) {
  152 + var resc = '20000';
  153 + var desc = 'Success';
  154 +
  155 + var headerReq = checkHeader(req, fileReq[2]);
  156 + var statusCode = headerReq[0];
  157 + var mtime = headerReq[1];
  158 + var size = headerReq[2];
  159 +
  160 + summaryLog = logger.summary(session, cmd, identity, resc, desc);
  161 + summaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
  162 + summaryLog.addSuccessBlock('null', 'getFile', resc, desc);
  163 +
  164 + logger.statRecv(cmd, resc);
  165 + logger.statRetn(cmd, resc);
  166 + logger.detail(req, cmd, size, mtime.toUTCString());
  167 +
  168 + var content_type;
  169 + var regex_image = /^.*\.(jpg|jpeg)$/ig;
  170 + var regex_png = /^.*\.(png)$/ig;
  171 + var regex_mp3 = /^.*\.(mp3)$/ig;
  172 + var regex_mp4 = /^.*\.(mp4)$/ig;
  173 + var regex_m4a = /^.*\.(m4a)$/ig;
  174 +
  175 + if (regex_image.test(checkFile(req)[1])) {
  176 + content_type = 'image/jpeg';
  177 + } else if (regex_png.test(checkFile(req)[1])) {
  178 + content_type = 'image/png';
  179 + } else if (regex_mp3.test(checkFile(req)[1])) {
  180 + content_type = 'audio/mpeg';
  181 + } else if (regex_mp4.test(checkFile(req)[1])) {
  182 + content_type = 'video/mp4';
  183 + } else if (regex_m4a.test(checkFile(req)[1])) {
  184 + content_type = 'audio/m4a';
  185 + }
  186 +
  187 + logger.info('[Path File]: ' + fileReq[2]);
  188 +
  189 + if (statusCode == 200) {
  190 + logger.info('[statusCode]: 200');
  191 + var resc = '20000';
  192 + var desc = 'Success';
  193 +
  194 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  195 +
  196 + res.writeHead(200, {
  197 + "Last-Modified": mtime.toUTCString(),
  198 + "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  199 + "Content-Type": content_type,
  200 + "Content-Length": size
  201 + });
  202 + fs.createReadStream(checkFile(req)[2]).pipe(res);
  203 + // res.write(img);
  204 + // res.end();
  205 +
  206 + }
  207 + // return 304!
  208 + else {
  209 + logger.info('[statusCode]: 304');
  210 + var resc = '20000';
  211 + var desc = 'Success';
  212 +
  213 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  214 +
  215 + res.writeHead(304, {
  216 + // "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  217 + "Content-Type": content_type,
  218 + "Content-Length": size
  219 + });
  220 + res.end();
  221 +
  222 + }
  223 + } else if (request == true && fileReq[0] != true) {
  224 + var status_code = fileReq[0].substring(0, 3);
  225 +
  226 + logger.error('[statusCode]: ' + status_code);
  227 + logger.error('[resultCode]: ' + fileReq[0] + ', [developerMessage]: ' + fileReq[1]);
  228 +
  229 + summaryLog = logger.summary(session, cmd, identity, fileReq[0], fileReq[1]);
  230 + summaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
  231 + summaryLog.addErrorBlock('null', 'getFile', fileReq[0], fileReq[1], fileReq[3]);
  232 +
  233 + logger.statRecv(cmd, fileReq[0]);
  234 + logger.statRetn(cmd, fileReq[0]);
  235 + logger.detail(req, cmd, null, null);
  236 +
  237 + res.writeHead(status_code, {
  238 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  239 + "Content-Type": 'application/json'
  240 + });
  241 + res.write(fileReq[2]);
  242 + res.end();
  243 +
  244 + } else if (request != true) {
  245 + var status_code = request[0].substring(0, 3);
  246 +
  247 + logger.error('[statusCode]: ' + status_code);
  248 + logger.error('[resultCode]: ' + request[0] + ', [developerMessage]: ' + request[1]);
  249 +
  250 + summaryLog = logger.summary(session, cmd, identity, request[0], request[1]);
  251 + summaryLog.addErrorBlock('client', cmd, request[0], request[1], request[3]);
  252 +
  253 + logger.statRecv(cmd, request[0]);
  254 + logger.statRetn(cmd, request[0]);
  255 + logger.alarm(cmd, request[0]);
  256 + logger.detail(req, cmd, null, null);
  257 +
  258 + res.writeHead(status_code, {
  259 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  260 + "Content-Type": 'application/json'
  261 + });
  262 + res.write(request[2]);
  263 + res.end();
  264 +
  265 + } else {
  266 + var resc = '50000';
  267 + var desc = 'System error';
  268 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  269 +
  270 + logger.error('[statusCode]: 500');
  271 + logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  272 +
  273 + summaryLog = logger.summary(session, cmd, identity, resc, desc);
  274 + summaryLog.addErrorBlock('client', cmd, resc, desc, 'system_error');
  275 +
  276 + logger.statRecv(cmd, resc);
  277 + logger.statRetn(cmd, resc);
  278 + logger.alarm(cmd, resc);
  279 + logger.detail(req, cmd, null, null);
  280 +
  281 + res.writeHead(500, {
  282 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  283 + "Content-Type": 'application/json'
  284 + });
  285 + res.write(prompt);
  286 + res.end();
  287 + }
  288 + summaryLog.flush();
  289 + logger.info('=============================');
  290 +});
  291 +
  292 +app.use(function(req, res, next) {
  293 + writeApplog(req);
  294 + var resc = '40400';
  295 + var desc = 'Unknown URL';
  296 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  297 +
  298 + var session = 'null';
  299 + var cmd = 'getMultimedia';
  300 + var identity = 'null';
  301 +
  302 + logger.error('[statusCode]: 404');
  303 + logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  304 +
  305 + logger.statRecv(cmd, resc);
  306 + logger.statRetn(cmd, resc);
  307 + logger.alarm(cmd, resc);
  308 + logger.detail(req, cmd, null, null);
  309 +
  310 + summaryLog = logger.summary(session, cmd, identity, resc, desc);
  311 + summaryLog.addErrorBlock('client', cmd, resc, desc, 'req.url=' + req.url);
  312 + summaryLog.flush();
  313 +
  314 +
  315 + res.writeHead(404, {
  316 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  317 + "Content-Type": 'application/json'
  318 + });
  319 + res.write(prompt);
  320 + res.end();
  321 +
  322 + logger.info('=============================');
  323 +});
... ...
srfp_genesis_backup.js 0 → 100644
  1 +++ a/srfp_genesis_backup.js
... ... @@ -0,0 +1,278 @@
  1 +var express = require('express');
  2 +var path = require('path');
  3 +var app = express();
  4 +var fs = require('fs');
  5 +var util = require('util');
  6 +var crypto = require('crypto');
  7 +var http = require("http");
  8 +var url = require("url");
  9 +//var logger = require('./config/logger');
  10 +var config = require('./config/config');
  11 +var stat = require('./utils/SutisStat');
  12 +var detail = require('./utils/SutisDetail');
  13 +//var summaryLog = require('./utils/SutisLogSummary');
  14 +var logger = require('./utils/SutisLogSummary');
  15 +
  16 +function checkReq(req) {
  17 + var regex_filetype = /^.*\.(jpg|jpeg|png|mp3|mp4|m4a)$/ig;
  18 + var regex_datetime = /(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{1,2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s[0-2][0-3]:[0-5][0-9]:[0-5][0-9]\sGMT$/g;
  19 +
  20 + // var reqModDate = req.get('If-Modified-Since')
  21 + // logger.error('>>>>>>>>> ' + req.url);
  22 +
  23 + if (req.query.name != null && req.query.type != null && req.query.commandId != null) {
  24 + if (regex_filetype.test(req.query.name) == true) {
  25 + return true;
  26 + }
  27 + }
  28 +
  29 + var resc = '40300';
  30 + var desc = 'Missing or invalid parameter';
  31 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  32 + return [resc, desc, prompt];
  33 +
  34 +};
  35 +
  36 +function checkFile(req) {
  37 + var path;
  38 + if (req.query.type === 'audio') {
  39 + path = config.mediaPath.audio + req.query.name;
  40 + } else if (req.query.type === 'video') {
  41 + path = config.mediaPath.video + req.query.name;
  42 + } else if (req.query.type === 'image') {
  43 + path = config.mediaPath.image + req.query.name;
  44 + } else {
  45 + var resc = '40401';
  46 + var desc = 'File not found';
  47 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  48 + return [resc, desc, prompt];
  49 + }
  50 +
  51 + if (fs.existsSync(path)) {
  52 + try {
  53 + fs.accessSync(path, fs.constants.R_OK);
  54 + var file_name = req.query.name;
  55 + return [true, file_name, path];
  56 + } catch (err) {
  57 + var resc = '40101';
  58 + var desc = 'Access denied';
  59 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  60 + return [resc, desc, prompt];
  61 + }
  62 + } else {
  63 + var resc = '40401';
  64 + var desc = 'File not found';
  65 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  66 + return [resc, desc, prompt];
  67 + }
  68 +};
  69 +
  70 +function checkHeader(req, path_file) {
  71 + try {
  72 + // var reqModDate = req.headers['If-Modified-Since'];
  73 + var reqModDate = req.get('If-Modified-Since')
  74 + var stats = fs.statSync(path_file);
  75 + var mtime = stats.mtime;
  76 + var size = stats['size'];
  77 +
  78 + if (reqModDate != null) {
  79 + reqModDate = new Date(reqModDate);
  80 +
  81 + logger.info('[If-Modified-Since]: ' + reqModDate.toUTCString());
  82 + logger.info('[Modified-File] : ' + mtime.toUTCString());
  83 +
  84 + if (reqModDate.toUTCString() == mtime.toUTCString()) {
  85 + logger.info('[Req Header]: If-Modified-Since == Modified File');
  86 + return [304, mtime, size];
  87 + } else {
  88 + logger.info('[Req Header]: If-Modified-Since != Modified File');
  89 + return [200, mtime, size];
  90 + }
  91 + } else {
  92 + logger.info('[Req Header]: No-header: If-Modified-Since');
  93 + logger.info('[Modified-File]: ' + mtime.toUTCString());
  94 + return [200, mtime, size];
  95 + }
  96 + } catch (error) {
  97 + logger.error('[Error check header!!!]');
  98 + return [200, mtime, size];
  99 + }
  100 +};
  101 +
  102 +function writeApplog(req) {
  103 +
  104 + logger.info('[Start getMultimedia Validate Parameter]: ' + 'name: ' + req.query.name + ', type=' + req.query.type + ', commandId=' + req.query.commandId);
  105 + logger.info('[incommigHeader: If-Modified-Since]: ' + req.get('If-Modified-Since'));
  106 + logger.info('[incomming url]: ' + req.protocol + '://' + req.get('host') + req.originalUrl);
  107 +}
  108 +
  109 +app.listen(3000, function() {
  110 + logger.info('=============================');
  111 + logger.info('SRFP-Genesis on port 3000!');
  112 +});
  113 +
  114 +app.get('/multiMedia.json', function(req, res) {
  115 + var sumaryLog;
  116 + var request = checkReq(req);
  117 + var fileReq = checkFile(req);
  118 +
  119 + var session = req.query.commandId;
  120 + var cmd = 'getMultimedia';
  121 + var identiry = 'null';
  122 +
  123 + writeApplog(req);
  124 +
  125 + // [Check Request]
  126 + if (request == true && fileReq[0] == true) {
  127 + var headerReq = checkHeader(req, fileReq[2]);
  128 + var statusCode = headerReq[0];
  129 + var mtime = headerReq[1];
  130 + var size = headerReq[2];
  131 +
  132 + // logger.info('>>> Last-Modified: ' + mtime.toUTCString());
  133 +
  134 + var content_type;
  135 + var regex_image = /^.*\.(jpg|jpeg)$/ig;
  136 + var regex_png = /^.*\.(png)$/ig;
  137 + var regex_mp3 = /^.*\.(mp3)$/ig;
  138 + var regex_mp4 = /^.*\.(mp4)$/ig;
  139 + var regex_m4a = /^.*\.(m4a)$/ig;
  140 +
  141 + if (regex_image.test(checkFile(req)[1])) {
  142 + content_type = 'image/jpeg';
  143 + } else if (regex_png.test(checkFile(req)[1])) {
  144 + content_type = 'image/png';
  145 + } else if (regex_mp3.test(checkFile(req)[1])) {
  146 + content_type = 'audio/mpeg';
  147 + } else if (regex_mp4.test(checkFile(req)[1])) {
  148 + content_type = 'video/mp4';
  149 + } else if (regex_m4a.test(checkFile(req)[1])) {
  150 + content_type = 'audio/m4a';
  151 + }
  152 +
  153 + logger.info('[Path File]: ' + fileReq[2]);
  154 +
  155 + if (statusCode == 200) {
  156 + logger.info('[statusCode]: 200');
  157 + var resc = '20000';
  158 + var desc = 'Success';
  159 +
  160 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  161 +
  162 + sumaryLog = logger.summary(session, cmd, identiry);
  163 + sumaryLog.addSuccessBlock('client', cmd, resc, desc);
  164 + stat.recv(cmd, resc);
  165 + stat.retn(cmd, resc);
  166 + detail.write(req, cmd, size, mtime);
  167 +
  168 + res.writeHead(200, {
  169 + "Last-Modified": mtime.toUTCString(),
  170 + "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  171 + "Content-Type": content_type,
  172 + "Content-Length": size
  173 + });
  174 + fs.createReadStream(checkFile(req)[2]).pipe(res);
  175 + // res.write(img);
  176 + // res.end();
  177 +
  178 + }
  179 + // return 304!
  180 + else {
  181 + logger.info('[statusCode]: 304');
  182 + var resc = '20000';
  183 + var desc = 'Success';
  184 +
  185 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  186 +
  187 + sumaryLog = logger.summary(session, cmd, identiry);
  188 + sumaryLog.addSuccessBlock('client', cmd, resc, desc);
  189 + stat.recv(cmd, resc);
  190 + stat.retn(cmd, resc);
  191 + detail.write(req, cmd, size, mtime);
  192 +
  193 + res.writeHead(304, {
  194 + // "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  195 + "Content-Type": content_type,
  196 + "Content-Length": size
  197 + });
  198 + res.end();
  199 +
  200 + }
  201 + } else {
  202 + if (request != true) {
  203 + logger.error('[resultCode]: ' + request[0] + ', [developerMessage]: ' + request[1]);
  204 + sumaryLog = logger.summary(session, cmd, identiry);
  205 + sumaryLog.addErrorBlock('client', cmd, request[0], request[1]);
  206 + stat.recv(cmd, request[0]);
  207 + stat.retn(cmd, request[0]);
  208 + detail.write(req, cmd, size, mtime);
  209 +
  210 + res.writeHead(request[0].substring(0, 3), {
  211 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  212 + "Content-Type": 'application/json'
  213 + });
  214 + res.write(request[2]);
  215 + res.end();
  216 + // res.send();
  217 +
  218 + } else if (fileReq != true) {
  219 +
  220 + logger.error('[resultCode]: ' + fileReq[0] + ', [developerMessage]: ' + fileReq[1]);
  221 + sumaryLog = logger.summary(session, cmd, identiry);
  222 + sumaryLog.addErrorBlock('client', cmd, fileReq[0], fileReq[1]);
  223 + stat.recv(cmd, fileReq[0]);
  224 + stat.retn(cmd, fileReq[0]);
  225 + detail.write(req, cmd, size, mtime);
  226 +
  227 + res.writeHead(fileReq[0].substring(0, 3), {
  228 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  229 + "Content-Type": 'application/json'
  230 + });
  231 + res.write(fileReq[2]);
  232 + res.end();
  233 + } else {
  234 + var resc = '50000';
  235 + var desc = 'System error';
  236 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  237 +
  238 + logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  239 + sumaryLog = logger.summary(session, cmd, identiry);
  240 + sumaryLog.addErrorBlock('client', cmd, resc, desc);
  241 + stat.recv(cmd, resc);
  242 + stat.retn(cmd, resc);
  243 + detail.write(req, cmd, null, null);
  244 +
  245 + res.writeHead(500, {
  246 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  247 + "Content-Type": 'application/json'
  248 + });
  249 + res.write(prompt);
  250 + res.end();
  251 + }
  252 + }
  253 + sumaryLog.flush();
  254 + logger.info('=============================');
  255 +});
  256 +
  257 +app.use(function(req, res, next) {
  258 + writeApplog(req);
  259 + var resc = '40400';
  260 + var desc = 'Unknown URL';
  261 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  262 +
  263 + var session = 'null';
  264 + var cmd = 'getMultimedia';
  265 + var identiry = 'null';
  266 +
  267 + logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  268 + sumaryLog = logger.summary(session, cmd, identiry);
  269 + sumaryLog.addErrorBlock('client', cmd, resc, desc);
  270 + stat.recv(cmd, resc);
  271 + stat.retn(cmd, resc);
  272 + detail.write(req, cmd, null, null);
  273 + sumaryLog.flush();
  274 +
  275 + res.status(404).send(prompt);
  276 +
  277 + logger.info('=============================');
  278 +});
0 279 \ No newline at end of file
... ...
srfp_genesis_backup_2.js 0 → 100644
  1 +++ a/srfp_genesis_backup_2.js
... ... @@ -0,0 +1,316 @@
  1 +var express = require('express');
  2 +var path = require('path');
  3 +var app = express();
  4 +var fs = require('fs');
  5 +// var util = require('util');
  6 +// var crypto = require('crypto');
  7 +// var http = require("http");
  8 +var url = require("url");
  9 +var custom_log = require('./config/logger');
  10 +var config = require('./config/config');
  11 +var stat = require('./utils/SutisStat');
  12 +var alarm = require('./utils/SutisAlarm');
  13 +var detail = require('./utils/SutisDetail');
  14 +var logger = require('./utils/SutisLogSummary');
  15 +
  16 +function checkReq(req) {
  17 + var regex_filetype = /^.*\.(jpg|jpeg|png|mp3|mp4|m4a)$/ig;
  18 + var regex_datetime = /(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{1,2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\sGMT$/g;
  19 + var regex_commandId = /^\d+$/g;
  20 +
  21 + var reqModDate = req.get('If-Modified-Since');
  22 + var errorCase = null;
  23 + // logger.error('>>>>>>>>> ' + req.url);
  24 +
  25 + if (reqModDate != null) {
  26 + // logger.error('Req Header Not null');
  27 + if (!regex_datetime.test(reqModDate)) {
  28 + logger.error('[invalid] date format: ' + reqModDate);
  29 + errorCase = 'req.If-Modified-Since=' + reqModDate;
  30 +
  31 + var resc = '40300';
  32 + var desc = 'Missing or invalid parameter';
  33 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  34 + var missingInvalid = errorCase;
  35 + return [resc, desc, prompt, missingInvalid];
  36 + }
  37 + }
  38 +
  39 + if (req.query.name && req.query.type && req.query.commandId) {
  40 + if (regex_filetype.test(req.query.name)) {
  41 + return true;
  42 + }
  43 + }
  44 +
  45 + if (!req.query.name) {
  46 + logger.error('[missing or invalid]: name');
  47 + errorCase = 'req.name=' + req.query.name;
  48 + } else if (!req.query.type) {
  49 + logger.error('[missing or invalid]: type');
  50 + errorCase = 'req.type=' + req.query.type;
  51 + } else if (!req.query.commandId) {
  52 + logger.error('[missing or invalid]: commandId');
  53 + errorCase = 'req.commandId=' + req.query.commandId;
  54 + }
  55 +
  56 + var resc = '40300';
  57 + var desc = 'Missing or invalid parameter';
  58 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  59 + var missingInvalid = errorCase;
  60 + return [resc, desc, prompt, missingInvalid];
  61 +
  62 +};
  63 +
  64 +function checkFile(req) {
  65 + var path;
  66 + if (req.query.type === 'audio') {
  67 + path = config.mediaPath.audio + req.query.name;
  68 + } else if (req.query.type === 'video') {
  69 + path = config.mediaPath.video + req.query.name;
  70 + } else if (req.query.type === 'image') {
  71 + path = config.mediaPath.image + req.query.name;
  72 + } else {
  73 + var resc = '40401';
  74 + var desc = 'File not found';
  75 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  76 + var missingInvalid = 'req.name=' + req.query.name;
  77 + return [resc, desc, prompt, missingInvalid];
  78 + }
  79 +
  80 + if (fs.existsSync(path)) {
  81 + try {
  82 + fs.accessSync(path, fs.constants.R_OK);
  83 + var file_name = req.query.name;
  84 + return [true, file_name, path];
  85 + } catch (err) {
  86 + var resc = '40101';
  87 + var desc = 'Access denied';
  88 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  89 + var missingInvalid = 'req.name=' + req.query.name;
  90 + return [resc, desc, prompt, missingInvalid];
  91 + }
  92 + } else {
  93 + var resc = '40401';
  94 + var desc = 'File not found';
  95 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  96 + var missingInvalid = 'req.name=' + req.query.name;
  97 + return [resc, desc, prompt, missingInvalid];
  98 + }
  99 +};
  100 +
  101 +function checkHeader(req, path_file) {
  102 + try {
  103 + // var reqModDate = req.headers['If-Modified-Since'];
  104 + var reqModDate = req.get('If-Modified-Since');
  105 + var stats = fs.statSync(path_file);
  106 + var mtime = stats.mtime;
  107 + var size = stats['size'];
  108 +
  109 + if (reqModDate != null) {
  110 + reqModDate = new Date(reqModDate);
  111 +
  112 + logger.info('[If-Modified-Since]: ' + reqModDate.toUTCString());
  113 + logger.info('[Modified-File] : ' + mtime.toUTCString());
  114 +
  115 + if (reqModDate.toUTCString() == mtime.toUTCString()) {
  116 + logger.info('[Req Header]: If-Modified-Since == Modified File');
  117 + return [304, mtime, size];
  118 + } else {
  119 + logger.info('[Req Header]: If-Modified-Since != Modified File');
  120 + return [200, mtime, size];
  121 + }
  122 + } else {
  123 + logger.info('[Req Header]: No-header: If-Modified-Since');
  124 + logger.info('[Modified-File]: ' + mtime.toUTCString());
  125 + return [200, mtime, size];
  126 + }
  127 + } catch (error) {
  128 + logger.error('[Error check header!!!]');
  129 + return [200, mtime, size];
  130 + }
  131 +};
  132 +
  133 +function writeApplog(req) {
  134 +
  135 + logger.info('[Start getMultimedia Validate Parameter]: ' + 'name: ' + req.query.name + ', type=' + req.query.type + ', commandId=' + req.query.commandId);
  136 + logger.info('[incommigHeader: If-Modified-Since]: ' + req.get('If-Modified-Since'));
  137 + logger.info('[incomming url]: ' + req.protocol + '://' + req.get('host') + req.originalUrl);
  138 +}
  139 +
  140 +app.listen(3000, function () {
  141 + logger.info('=============================');
  142 + logger.info('SRFP-Genesis on port 3000!');
  143 +});
  144 +
  145 +app.get('/multiMedia.json', function (req, res) {
  146 + var sumaryLog;
  147 + var request = checkReq(req);
  148 + var fileReq = checkFile(req);
  149 + // var headerReq = checkHeader(req, fileReq[2]);
  150 +
  151 + var session = req.query.commandId;
  152 + var cmd = 'getMultimedia';
  153 + var identity = '';
  154 + var reqfile = req.query.name;
  155 +
  156 + writeApplog(req);
  157 +
  158 + // [Check Request]
  159 + if (request == true && fileReq[0] == true) {
  160 + var resc = '20000';
  161 + var desc = 'Success';
  162 +
  163 + var headerReq = checkHeader(req, fileReq[2]);
  164 + var statusCode = headerReq[0];
  165 + var mtime = headerReq[1];
  166 + var size = headerReq[2];
  167 +
  168 + sumaryLog = logger.summary(session, cmd, identity, resc, desc);
  169 + sumaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
  170 + sumaryLog.addSuccessBlock('null', 'getFile', resc, desc);
  171 + stat.recv(cmd, resc);
  172 + stat.retn(cmd, resc);
  173 + detail.write(req, cmd, size, mtime.toUTCString());
  174 +
  175 + var content_type;
  176 + var regex_image = /^.*\.(jpg|jpeg)$/ig;
  177 + var regex_png = /^.*\.(png)$/ig;
  178 + var regex_mp3 = /^.*\.(mp3)$/ig;
  179 + var regex_mp4 = /^.*\.(mp4)$/ig;
  180 + var regex_m4a = /^.*\.(m4a)$/ig;
  181 +
  182 + if (regex_image.test(checkFile(req)[1])) {
  183 + content_type = 'image/jpeg';
  184 + } else if (regex_png.test(checkFile(req)[1])) {
  185 + content_type = 'image/png';
  186 + } else if (regex_mp3.test(checkFile(req)[1])) {
  187 + content_type = 'audio/mpeg';
  188 + } else if (regex_mp4.test(checkFile(req)[1])) {
  189 + content_type = 'video/mp4';
  190 + } else if (regex_m4a.test(checkFile(req)[1])) {
  191 + content_type = 'audio/m4a';
  192 + }
  193 +
  194 + logger.info('[Path File]: ' + fileReq[2]);
  195 +
  196 + if (statusCode == 200) {
  197 + logger.info('[statusCode]: 200');
  198 + var resc = '20000';
  199 + var desc = 'Success';
  200 +
  201 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  202 +
  203 + res.writeHead(200, {
  204 + "Last-Modified": mtime.toUTCString(),
  205 + "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  206 + "Content-Type": content_type,
  207 + "Content-Length": size
  208 + });
  209 + fs.createReadStream(checkFile(req)[2]).pipe(res);
  210 + // res.write(img);
  211 + // res.end();
  212 +
  213 + }
  214 + // return 304!
  215 + else {
  216 + logger.info('[statusCode]: 304');
  217 + var resc = '20000';
  218 + var desc = 'Success';
  219 +
  220 + logger.info('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  221 +
  222 + res.writeHead(304, {
  223 + // "Content-Disposition": 'attachment; filename="' + checkFile(req)[1] + '"',
  224 + "Content-Type": content_type,
  225 + "Content-Length": size
  226 + });
  227 + res.end();
  228 +
  229 + }
  230 + } else if (request == true && fileReq[0] != true) {
  231 + sumaryLog = logger.summary(session, cmd, identity, fileReq[0], fileReq[1]);
  232 + sumaryLog.addSuccessBlock('client', cmd, 'null', 'Success');
  233 + sumaryLog.addErrorBlock('null', 'getFile', fileReq[0], fileReq[1], fileReq[3]);
  234 + stat.recv(cmd, fileReq[0]);
  235 + stat.retn(cmd, fileReq[0]);
  236 + detail.write(req, cmd, null, null);
  237 +
  238 + } else if (request != true) {
  239 + var status_code = request[0].substring(0, 3);
  240 + logger.error('[statusCode]: ' + status_code);
  241 + logger.error('[resultCode]: ' + request[0] + ', [developerMessage]: ' + request[1]);
  242 + sumaryLog = logger.summary(session, cmd, identity, request[0], request[1]);
  243 + sumaryLog.addErrorBlock('client', cmd, request[0], request[1], request[3]);
  244 + stat.recv(cmd, request[0]);
  245 + stat.retn(cmd, request[0]);
  246 + alarm.recv(cmd, request[0]);
  247 + detail.write(req, cmd, null, null);
  248 +
  249 + res.writeHead(status_code, {
  250 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  251 + "Content-Type": 'application/json'
  252 + });
  253 + res.write(request[2]);
  254 + res.end();
  255 +
  256 +
  257 + } else {
  258 + var resc = '50000';
  259 + var desc = 'System error';
  260 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';;
  261 +
  262 + logger.error('[statusCode]: 500');
  263 + logger.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  264 + sumaryLog = logger.summary(session, cmd, identity, resc, desc);
  265 + sumaryLog.addErrorBlock('client', cmd, resc, desc, 'system_error');
  266 + stat.recv(cmd, resc);
  267 + stat.retn(cmd, resc);
  268 + alarm.recv(cmd, resc);
  269 + detail.write(req, cmd, null, null);
  270 +
  271 + res.writeHead(500, {
  272 + // "Content-Disposition": 'attachment; filename="' + req.query.name + '"',
  273 + "Content-Type": 'application/json'
  274 + });
  275 + res.write(prompt);
  276 + res.end();
  277 + }
  278 + sumaryLog.flush();
  279 + logger.info('=============================');
  280 +});
  281 +
  282 +app.use(function (req, res, next) {
  283 + writeApplog(req);
  284 + var resc = '40400';
  285 + var desc = 'Unknown URL';
  286 + var prompt = '{"prompt":{"resultCode":"' + resc + '","developerMessage":"' + desc + '"}}';
  287 +
  288 + var session = 'null';
  289 + var cmd = 'getMultimedia';
  290 + var identity = 'null';
  291 +
  292 + var summaryLog;
  293 +
  294 + custom_log.error('[statusCode]: 404');
  295 + custom_log.error('[resultCode]: ' + resc + ', [developerMessage]: ' + desc);
  296 +
  297 +
  298 + custom_log.statRecv(cmd, resc);
  299 + custom_log.statRetn(cmd, resc);
  300 + custom_log.alarm(cmd, resc);
  301 +
  302 + summaryLog = custom_log.summaryLog(session, cmd, identity, resc, desc);
  303 + summaryLog.addErrorBlock('client', cmd, resc, desc, 'req.url=' + req.url);
  304 + summaryLog.flush();
  305 +
  306 + custom_log.detail(req, cmd, null, null);
  307 +
  308 + res.writeHead(404, {
  309 + "Content-Type": 'application/json'
  310 + });
  311 + res.write(prompt);
  312 + res.end();
  313 +
  314 + // logger.info('=============================');
  315 + custom_log.info('=============================');
  316 +});
... ...
utils/SutisAlarm.js 0 → 100644
  1 +++ a/utils/SutisAlarm.js
... ... @@ -0,0 +1,35 @@
  1 +'use strict';
  2 +var logger = require('./SutisLogSummary');
  3 +var alarm ={};
  4 +var nodeName = 'SRFP-Genesis';
  5 +// var statTbl = require('../config/config');
  6 +
  7 +alarm.recv=function(cmd, errCode){
  8 +
  9 + var alarmName = nodeName;
  10 + if (errCode == 40400) {
  11 + alarmName = alarmName + ' Received Unknown URL Request';
  12 + }else if (errCode == 40300) {
  13 + alarmName = alarmName + ' Received Bad '+ cmd + ' Request';
  14 + }
  15 + else{
  16 + // statName = statName + ' Received ' + cmd + ' err ' + statDesc;
  17 + }
  18 + logger.alarm(alarmName);
  19 +};
  20 +
  21 +// stat.retn=function(cmd, errCode){
  22 +
  23 +// var statName = nodeName;
  24 +// if(errCode == 20000){
  25 +// statName = statName + ' Returned ' + cmd + ' Success';
  26 +// } else if (errCode == 40400) {
  27 +// statName = statName + ' Returned Unknown URL';
  28 +// } else if (errCode == 40300 || errCode == 40401 || errCode == 40101) {
  29 +// statName = statName + ' Returned ' + cmd + ' Error';
  30 +// } else{
  31 +// // statName = statName + ' Received ' + cmd + ' err ' + statDesc;
  32 +// }
  33 +// logger.stat(statName);
  34 +// };
  35 +module.exports = alarm;
... ...
utils/SutisDetail.js 0 → 100644
  1 +++ a/utils/SutisDetail.js
... ... @@ -0,0 +1,70 @@
  1 +'use strict';
  2 +var logger = require('./SutisLogSummary');
  3 +var detail ={};
  4 +var nodeName = 'SRFP-Genesis';
  5 +var dateFormat = require('dateformat');
  6 +// var dateFMT = 'l';
  7 +var dateFMT = 'yyyymmdd HH:MM:ss.l';
  8 +
  9 +function dateTimeReq(dateFMT) {
  10 + var date = new Date();
  11 + var dateMs = 'l';
  12 + var dateFor = dateFormat(date, dateFMT);
  13 + var dateForms = dateFormat(date, dateMs);
  14 + return [dateFor, dateForms]
  15 +}
  16 +
  17 +function dateTimeRes(dateFMT) {
  18 + // var time = new Date();
  19 + // var dateTime = formatDate(new Date(), dateFMT)
  20 + // return [dateTime,time.getTime()];
  21 +
  22 + var date = new Date();
  23 + var dateMs = 'l';
  24 + var dateFor = dateFormat(date, dateFMT);
  25 + var dateForms = dateFormat(date, dateMs);
  26 + return [dateFor, dateForms]
  27 +}
  28 +
  29 +detail.write=function(req, cmd, size, mtime){
  30 + var requestTime = dateTimeReq(dateFMT);
  31 + var responseTime = dateTimeRes(dateFMT);
  32 + var processTime = parseInt(responseTime[1]-requestTime[1]);
  33 +
  34 + var appDetail = '{'+
  35 + '"' + nodeName + '.Details' + '":{' +
  36 + '"Session":"'+ req.query.commandId +'",' +
  37 + '"Scenario":"'+ cmd +'",' +
  38 + '"Identity":"",' +
  39 + '"InputTimeStamp":"'+ requestTime[0] +'",' +
  40 + '"Input":' + '[' +
  41 + '{'+
  42 + '"Event":"'+ nodeName +'.'+ cmd +'",' +
  43 + '"Type":"REQ",' +
  44 + '"RawData":"' + req.protocol + '://' + req.get('host') + req.originalUrl +'",' +
  45 + '"Data":' + '{'+
  46 + '"Name":"'+ req.query.name + '",' +
  47 + '"Type":"'+ req.query.type + '",' +
  48 + '"CommandId":"'+ req.query.commandId + '"' +
  49 + '}' +
  50 + '}'+
  51 + '],'+
  52 + '"OutputTimeStamp":"'+ responseTime[0] +'",' +
  53 + '"Output":' + '[' +
  54 + '{'+
  55 + '"Event":"'+ nodeName +'.'+ cmd +'",' +
  56 + '"Type":"' + 'RES",' +
  57 + '"RawData":"'+ req.query.name +'",' +
  58 + '"Data":' + '{'+
  59 + '"Size":"'+ size + '",' +
  60 + '"Modified":"'+ mtime + '"' +
  61 + '}' +
  62 + '}'+
  63 + '],'+
  64 + '"ProcessingTime":"'+ processTime +' ms"' +
  65 + '}' +
  66 + '}'
  67 + logger.detail(appDetail);
  68 +};
  69 +
  70 +module.exports = detail;
... ...
utils/SutisLog.js 0 → 100644
  1 +++ a/utils/SutisLog.js
... ... @@ -0,0 +1,288 @@
  1 +var fs = require('fs');
  2 +var os = require("os");
  3 +var config = null;
  4 +var logCfg = require('../config/config');
  5 +
  6 +var dateFormat = require('dateformat');
  7 +
  8 +function SutisLog() {
  9 +}
  10 +function getDateTimeFormat(time) {
  11 +
  12 + var years = new Date().getFullYear();
  13 + var months = new Date().getMonth() + 1;
  14 + var day = new Date().getDate();
  15 + var hours = new Date().getHours();
  16 + var mins = new Date().getMinutes();
  17 + var monthFormatted = months < 10 ? "0" + months : months;
  18 + var dayFormatted = day < 10 ? "0" + day : day;
  19 + var hourFormatted = hours < 10 ? "0" + hours : hours;
  20 + var result = "";
  21 + var minFormatted = null;
  22 + var div = null;
  23 +
  24 + if ((mins % time) > 0) {
  25 + minFormatted = ((Math.floor(mins / time)) * time);
  26 + } else {
  27 + minFormatted = mins;
  28 + }
  29 +
  30 + minFormatted = minFormatted < 10 ? "0" + minFormatted : minFormatted;
  31 + result = '' + years + monthFormatted + dayFormatted + hourFormatted + minFormatted;
  32 + return result;
  33 +}
  34 +
  35 +function getDateTimeLogFormat() {
  36 + var dates = new Date();
  37 + var years = dates.getFullYear();
  38 + var months = dates.getMonth() + 1;
  39 + var day = dates.getDate();
  40 + var hours = dates.getHours();
  41 + var minutes = dates.getMinutes();
  42 + var second = new Date().getSeconds();
  43 + var millisecs = dates.getMilliseconds();
  44 + var monthFormatted = months < 10 ? "0" + months : months;
  45 + var dayFormatted = day < 10 ? "0" + day : day;
  46 + var hourFormatted = hours < 10 ? "0" + hours : hours;
  47 + var minFormatted = minutes < 10 ? "0" + minutes : minutes;
  48 + var secFormatted = second < 10 ? "0" + second : second;
  49 + var milliFormatted = null;
  50 +
  51 + if (millisecs < 10) {
  52 + milliFormatted = "00" + millisecs;
  53 + }
  54 + else if (millisecs < 100) {
  55 + milliFormatted = "0" + millisecs;
  56 + }
  57 + else {
  58 + milliFormatted = millisecs;
  59 + }
  60 +
  61 + // return '[' + years + '-' + monthFormatted + '-' + dayFormatted + ' ' + hourFormatted + ':' + minFormatted + ':' + secFormatted + ':' + milliFormatted + ']';
  62 + var detail = years + monthFormatted + dayFormatted + ' ' + hourFormatted + ':' + minFormatted + ':' + secFormatted + '|' + os.hostname() + '|' + logCfg.log.projectName + '|';
  63 + return detail;
  64 +}
  65 +
  66 +function getLogFileName() {
  67 + return os.hostname() + '_' + logCfg.log.projectName + '_' + getDateTimeFormat(logCfg.log.logTime) + '.log';
  68 +}
  69 +function getStatFileName() {
  70 + return os.hostname() + '_' + logCfg.log.projectName + '_' + getDateTimeFormat(logCfg.log.statTime) + '.stat';
  71 +}
  72 +function getAlarmFileName() {
  73 + return os.hostname() + '_' + logCfg.log.projectName + '_' + getDateTimeFormat(logCfg.log.alarmTime) + '.stat';
  74 +}
  75 +function getSummaryFileName() {
  76 + return os.hostname() + '_' + logCfg.log.projectName + '_' + getDateTimeFormat(logCfg.log.summaryTime) + '.summary';
  77 +}
  78 +function getDetailFileName() {
  79 + return os.hostname() + '_' + logCfg.log.projectName + '_' + getDateTimeFormat(logCfg.log.detailTime) + '.detail';
  80 +}
  81 +
  82 +SutisLog.prototype.info = function (logMessage) {
  83 + var stream = fs.createWriteStream(logCfg.log.logPath + '/' + getLogFileName(), { 'flags': 'a' });
  84 + stream.once('open', function (fd) {
  85 + stream.write(getDateTimeLogFormat() + ' - info: ' + logMessage + '\n');
  86 + stream.end();
  87 + });
  88 +};
  89 +
  90 +SutisLog.prototype.error = function (logMessage) {
  91 + var stream = fs.createWriteStream(logCfg.log.logPath + '/' + getLogFileName(), { 'flags': 'a' });
  92 +
  93 + stream.once('open', function (fd) {
  94 + stream.write(getDateTimeLogFormat() + ' - error: ' + logMessage + '\n');
  95 + stream.end();
  96 + });
  97 +};
  98 +// session, cmd, identity, resultCode, resultDescription
  99 +SutisLog.prototype.summaryLog = function (session, cmd, identity, resultCode, resultDescription) {
  100 + var dateFMT = 'yyyymmdd HH:MM:ss';
  101 +
  102 + var stream = fs.createWriteStream(logCfg.log.summaryPath + '/' + getSummaryFileName(), { 'flags': 'a' });
  103 +
  104 + // var test = {
  105 + // x1: function() {
  106 + // stream.once('open', function (fd) {
  107 + // stream.write(getDateTimeLogFormat() + ' - summary: ' + 'txt-+-+-+dhjsdhfjkshfjsd' + '\n');
  108 + // stream.end();
  109 + // });
  110 + // }
  111 + // }
  112 + // return test;
  113 +
  114 + var summaryLog = {
  115 + requestTime: new Date(),
  116 + session: session,
  117 + initInvoke: '', //only equinox platform
  118 + cmd: cmd,
  119 + identity: identity,
  120 + resultCode: resultCode,
  121 + resultDescription: resultDescription,
  122 + blockDetail: [],
  123 +
  124 + addSuccessBlock: function(node, cmd, statusCode, detail){
  125 + this.blockDetail.push('['+ node+'; '+cmd+'(1); ['+ statusCode+'; '+detail+'(1)]]');
  126 + },
  127 +
  128 + addErrorBlock: function(node, cmd, statusCode, detail, errorDetail){
  129 + this.blockDetail.push('['+ node+'; '+cmd+'(1); ['+ statusCode+'; '+detail+'(1)]]');
  130 + },
  131 +
  132 + flush : function(){
  133 + var endTime = new Date();
  134 +
  135 + var txt = dateFormat(this.requestTime, dateFMT) + '|';
  136 + txt += this.session +'|';
  137 + txt += this.initInvoke +'|'
  138 + txt += this.cmd +'|'
  139 + txt += this.identity +'|'
  140 + txt += this.resultCode +'|'
  141 + txt += this.resultDescription +'|'
  142 + txt += this.blockDetail +'|'
  143 + txt += dateFormat(endTime, dateFMT) +'|'
  144 + txt += (endTime.getTime() - this.requestTime.getTime());
  145 +
  146 + stream.once('open', function (fd) {
  147 + stream.write(txt + '\n');
  148 + stream.end();
  149 + });
  150 +
  151 + }
  152 + };
  153 + return summaryLog;
  154 +};
  155 +
  156 +SutisLog.prototype.detail = function (req, cmd, size, mtime) {
  157 + var stream = fs.createWriteStream(logCfg.log.detailPath + '/' + getDetailFileName(), { 'flags': 'a' });
  158 +
  159 + var nodeName = 'SRFP-Genesis';
  160 + var dateFormat = require('dateformat');
  161 + // var dateFMT = 'l';
  162 + var dateFMT = 'yyyymmdd HH:MM:ss.l';
  163 +
  164 + function dateTimeReq(dateFMT) {
  165 + var date = new Date();
  166 + var dateMs = 'l';
  167 + var dateFor = dateFormat(date, dateFMT);
  168 + var dateForms = dateFormat(date, dateMs);
  169 + return [dateFor, dateForms]
  170 + }
  171 +
  172 + function dateTimeRes(dateFMT) {
  173 + // var time = new Date();
  174 + // var dateTime = formatDate(new Date(), dateFMT)
  175 + // return [dateTime,time.getTime()];
  176 +
  177 + var date = new Date();
  178 + var dateMs = 'l';
  179 + var dateFor = dateFormat(date, dateFMT);
  180 + var dateForms = dateFormat(date, dateMs);
  181 + return [dateFor, dateForms]
  182 + }
  183 +
  184 + var requestTime = dateTimeReq(dateFMT);
  185 + var responseTime = dateTimeRes(dateFMT);
  186 + var processTime = parseInt(responseTime[1] - requestTime[1]);
  187 +
  188 + var appDetail = '{' +
  189 + '"' + nodeName + '.Details' + '":{' +
  190 + '"Session":"' + req.query.commandId + '",' +
  191 + '"Scenario":"' + cmd + '",' +
  192 + '"Identity":"",' +
  193 + '"InputTimeStamp":"' + requestTime[0] + '",' +
  194 + '"Input":' + '[' +
  195 + '{' +
  196 + '"Event":"' + nodeName + '.' + cmd + '",' +
  197 + '"Type":"REQ",' +
  198 + '"RawData":"' + req.protocol + '://' + req.get('host') + req.originalUrl + '",' +
  199 + '"Data":' + '{' +
  200 + '"Name":"' + req.query.name + '",' +
  201 + '"Type":"' + req.query.type + '",' +
  202 + '"CommandId":"' + req.query.commandId + '"' +
  203 + '}' +
  204 + '}' +
  205 + '],' +
  206 + '"OutputTimeStamp":"' + responseTime[0] + '",' +
  207 + '"Output":' + '[' +
  208 + '{' +
  209 + '"Event":"' + nodeName + '.' + cmd + '",' +
  210 + '"Type":"' + 'RES",' +
  211 + '"RawData":"' + req.query.name + '",' +
  212 + '"Data":' + '{' +
  213 + '"Size":"' + size + '",' +
  214 + '"Modified":"' + mtime + '"' +
  215 + '}' +
  216 + '}' +
  217 + '],' +
  218 + '"ProcessingTime":"' + processTime + ' ms"' +
  219 + '}' +
  220 + '}';
  221 +
  222 + stream.once('open', function (fd) {
  223 + stream.write(getDateTimeLogFormat() + appDetail + '\n');
  224 + stream.end();
  225 + });
  226 +};
  227 +
  228 +SutisLog.prototype.statRecv = function (cmd, errCode) {
  229 + var nodeName = 'SRFP-Genesis';
  230 + var stream = fs.createWriteStream(logCfg.log.statPath + '/' + getStatFileName(), { 'flags': 'a' });
  231 +
  232 + var statName = nodeName;
  233 + if (errCode == 20000 || errCode == 40401 || errCode == 40101) {
  234 + statName = statName + ' Received Request';
  235 + } else if (errCode == 40400) {
  236 + statName = statName + ' Received Unknown URL Request';
  237 + } else if (errCode == 40300) {
  238 + statName = statName + ' Received Bad ' + cmd + ' Request';
  239 + }
  240 + else {
  241 + statName = statName + ' Received ' + cmd + ' error';
  242 + }
  243 + stream.once('open', function (fd) {
  244 + stream.write(getDateTimeLogFormat() + statName + '\n');
  245 + stream.end();
  246 + });
  247 +};
  248 +
  249 +SutisLog.prototype.statRetn = function (cmd, errCode) {
  250 + var nodeName = 'SRFP-Genesis';
  251 + var stream = fs.createWriteStream(logCfg.log.statPath + '/' + getStatFileName(), { 'flags': 'a' });
  252 +
  253 + var statName = nodeName;
  254 + if (errCode == 20000) {
  255 + statName = statName + ' Returned ' + cmd + ' Success';
  256 + } else if (errCode == 40400) {
  257 + statName = statName + ' Returned Unknown URL';
  258 + } else if (errCode == 40300 || errCode == 40401 || errCode == 40101 || errCode == 50000) {
  259 + statName = statName + ' Returned ' + cmd + ' Error';
  260 + } else {
  261 + // statName = statName + ' Returned ' + cmd + ' err ' + statDesc;
  262 + }
  263 + stream.once('open', function (fd) {
  264 + stream.write(getDateTimeLogFormat() + statName + '\n');
  265 + stream.end();
  266 + });
  267 +};
  268 +
  269 +SutisLog.prototype.alarm = function (cmd, errCode) {
  270 + var nodeName = 'SRFP-Genesis';
  271 + var stream = fs.createWriteStream(logCfg.log.alarmPath + '/' + getAlarmFileName(), { 'flags': 'a' });
  272 +
  273 + var alarmName = nodeName;
  274 + if (errCode == 40400) {
  275 + alarmName = alarmName + ' Received Unknown URL Request';
  276 + } else if (errCode == 40300) {
  277 + alarmName = alarmName + ' Received Bad ' + cmd + ' Request';
  278 + }
  279 + else {
  280 + // alarmName = alarmName + ' Received ' + cmd + ' err ' + statDesc;
  281 + }
  282 + stream.once('open', function (fd) {
  283 + stream.write(getDateTimeLogFormat() + alarmName + '\n');
  284 + stream.end();
  285 + });
  286 +};
  287 +module.exports = SutisLog;
  288 +
... ...
utils/SutisLogSummary.js 0 → 100644
  1 +++ a/utils/SutisLogSummary.js
... ... @@ -0,0 +1,75 @@
  1 +var log4js = require('log4js');
  2 +log4js.configure('./config/log4js.json');
  3 +
  4 +var log = log4js.getLogger('serverLog');
  5 +var stat = log4js.getLogger('statLog');
  6 +var alarm = log4js.getLogger('alarmLog');
  7 +var detail = log4js.getLogger('datailLog');
  8 +var summary = log4js.getLogger('summaryLog');
  9 +
  10 +var dateFMT = 'yyyymmdd HH:MM:ss';
  11 +var dateFormat = require('dateformat');
  12 +
  13 +
  14 +var l = {};
  15 +l.debug = function(_log){
  16 + log.debug(_log);
  17 +}
  18 +l.info = function(_log){
  19 + log.info(_log);
  20 +}
  21 +l.warn = function(_log){
  22 + log.warn(_log);
  23 +}
  24 +l.error = function(_log){
  25 + log.error(_log);
  26 +}
  27 +l.stat = function(statName){
  28 + stat.info(statName);
  29 +}
  30 +l.alarm = function(alarmName){
  31 + alarm.info(alarmName);
  32 +}
  33 +l.detail = function(appDetail){
  34 + detail.info(appDetail);
  35 +}
  36 +
  37 +l.summary = function(session, cmd, identity, resultCode, resultDescription){
  38 + var summaryLog = {
  39 + requestTime: new Date(),
  40 + session: session,
  41 + initInvoke: '', //only equinox platform
  42 + cmd: cmd,
  43 + identity: identity,
  44 + resultCode: resultCode,
  45 + resultDescription: resultDescription,
  46 + blockDetail: [],
  47 +
  48 + addSuccessBlock: function(node, cmd, statusCode, detail){
  49 + this.blockDetail.push('['+ node+'; '+cmd+'(1); ['+ statusCode+'; '+detail+'(1)]]');
  50 + },
  51 +
  52 + addErrorBlock: function(node, cmd, statusCode, detail, errorDetail){
  53 + this.blockDetail.push('['+ node+'; '+cmd+'(1); ['+ statusCode+'; '+detail+'(1)]]');
  54 + },
  55 +
  56 + flush : function(){
  57 + var endTime = new Date();
  58 +
  59 + var txt = dateFormat(this.requestTime, dateFMT) + '|';
  60 + txt += this.session +'|';
  61 + txt += this.initInvoke +'|'
  62 + txt += this.cmd +'|'
  63 + txt += this.identity +'|'
  64 + txt += this.resultCode +'|'
  65 + txt += this.resultDescription +'|'
  66 + txt += this.blockDetail +'|'
  67 + txt += dateFormat(endTime, dateFMT) +'|'
  68 + txt += (endTime.getTime() - this.requestTime.getTime());
  69 +
  70 + summary.info(txt);
  71 + }
  72 + };
  73 + return summaryLog;
  74 +}
  75 +module.exports = l;
0 76 \ No newline at end of file
... ...
utils/SutisStat.js 0 → 100644
  1 +++ a/utils/SutisStat.js
... ... @@ -0,0 +1,64 @@
  1 +'use strict';
  2 +var logger = require('./SutisLogSummary');
  3 +var stat ={};
  4 +var nodeName = 'SRFP-Genesis';
  5 +// var statTbl = require('../config/config');
  6 +
  7 +// stat.sendReq=function(cmd){
  8 +// var statName = nodeName + ' send ' + cmd + ' req.';
  9 +// logger.stat(statName);
  10 +// };
  11 +
  12 +// stat.sendRes=function(cmd, errCode){
  13 +// var statDesc;
  14 +// if(!errCode){
  15 +// errCode = "50000";
  16 +
  17 +// }else{
  18 +// statDesc = statTbl[errCode];
  19 +// if(!statDesc){
  20 +// errCode = "90000";
  21 +// }
  22 +// }
  23 +// statDesc = statTbl[errCode];
  24 +
  25 +// var statName = nodeName;
  26 +// if(errCode == '20000'){
  27 +// statName = statName + ' send ' + cmd + ' success res '+ errCode +'.';
  28 +// }else{
  29 +// statName = statName + ' send ' + cmd + ' err ' + statDesc.toLowerCase() +' res '+ errCode +'.';
  30 +// }
  31 +// logger.stat(statName);
  32 +// };
  33 +
  34 +stat.recv=function(cmd, errCode){
  35 +
  36 + var statName = nodeName;
  37 + if(errCode == 20000 || errCode == 40401 || errCode == 40101){
  38 + statName = statName + ' Received Request';
  39 + } else if (errCode == 40400) {
  40 + statName = statName + ' Received Unknown URL Request';
  41 + }else if (errCode == 40300) {
  42 + statName = statName + ' Received Bad '+ cmd + ' Request';
  43 + }
  44 + else{
  45 + statName = statName + ' Received ' + cmd + ' error';
  46 + }
  47 + logger.stat(statName);
  48 +};
  49 +
  50 +stat.retn=function(cmd, errCode){
  51 +
  52 + var statName = nodeName;
  53 + if(errCode == 20000){
  54 + statName = statName + ' Returned ' + cmd + ' Success';
  55 + } else if (errCode == 40400) {
  56 + statName = statName + ' Returned Unknown URL';
  57 + } else if (errCode == 40300 || errCode == 40401 || errCode == 40101 || errCode == 50000) {
  58 + statName = statName + ' Returned ' + cmd + ' Error';
  59 + } else{
  60 + // statName = statName + ' Returned ' + cmd + ' err ' + statDesc;
  61 + }
  62 + logger.stat(statName);
  63 +};
  64 +module.exports = stat;
... ...
views/error.jade 0 → 100644
  1 +++ a/views/error.jade
... ... @@ -0,0 +1,5 @@
  1 +extends layout
  2 +
  3 +block content
  4 + h1= message
  5 + h2= error.status
... ...
views/index.jade 0 → 100644
  1 +++ a/views/index.jade
... ... @@ -0,0 +1,5 @@
  1 +extends layout
  2 +
  3 +block content
  4 + h1= title
  5 + p Welcome to #{title}
... ...
views/layout.jade 0 → 100644
  1 +++ a/views/layout.jade
... ... @@ -0,0 +1,7 @@
  1 +doctype html
  2 +html
  3 + head
  4 + title= title
  5 + link(rel='stylesheet', href='/stylesheets/style.css')
  6 + body
  7 + block content
... ...