mirror of
https://github.com/Hopiu/webapi-eca.git
synced 2026-03-16 22:10:31 +00:00
server in coffeescript
This commit is contained in:
parent
3ab28e31f1
commit
12b5088d5e
5 changed files with 340 additions and 13 deletions
|
|
@ -16,9 +16,132 @@ Valid `log_type`'s are:
|
|||
[config](config.html) file, to listen to, e.g. used by the test suite.
|
||||
|
||||
###
|
||||
root = exports ? this
|
||||
root.foo = -> 'Hello World'
|
||||
###
|
||||
My comments will show up here
|
||||
|
||||
###
|
||||
'use strict'
|
||||
|
||||
path = require 'path'
|
||||
log = require './logging'
|
||||
conf = require './config'
|
||||
db = require './db_interface'
|
||||
engine = require './engine'
|
||||
http_listener = require './http_listener'
|
||||
mm = require './module_manager'
|
||||
args = {}
|
||||
procCmds = {}
|
||||
### Prepare the admin commands that are issued via HTTP requests. ###
|
||||
adminCmds = {
|
||||
'loadrules': mm.loadRulesFromFS,
|
||||
'loadaction': mm.loadActionModuleFromFS,
|
||||
'loadactions': mm.loadActionModulesFromFS,
|
||||
'loadevent': mm.loadEventModuleFromFS,
|
||||
'loadevents': mm.loadEventModulesFromFS,
|
||||
'loadusers': http_listener.loadUsers,
|
||||
'shutdown': shutDown
|
||||
};
|
||||
|
||||
###
|
||||
Error handling of the express port listener requires special attention,
|
||||
thus we have to catch the process error, which is issued if
|
||||
the port is already in use.
|
||||
###
|
||||
process.on 'uncaughtException', (err) ->
|
||||
switch err.errno
|
||||
when 'EADDRINUSE'
|
||||
err.addInfo = 'http_port already in use, shutting down!'
|
||||
log.error 'RS', err
|
||||
shutDown()
|
||||
else log.error err
|
||||
null
|
||||
|
||||
|
||||
###
|
||||
## Initialize the Server
|
||||
This function is invoked right after the module is loaded and starts the server.
|
||||
###
|
||||
|
||||
init = ->
|
||||
log.print 'RS', 'STARTING SERVER'
|
||||
if !conf.isReady()
|
||||
log.error 'RS', 'Config file not ready!'
|
||||
process.exit
|
||||
|
||||
### Fetch the `log_type` argument and post a log about which log type is used. ###
|
||||
if process.argv.length > 2
|
||||
args.logType = parseInt(process.argv[2]) || 0
|
||||
switch args.logType
|
||||
when 0 then log.print 'RS', 'Log type set to standard I/O output'
|
||||
when 1 then log.print 'RS', 'Log type set to file output'
|
||||
when 2 then log.print 'RS', 'Log type set to silent'
|
||||
else log.print 'RS', 'Unknown log type, using standard I/O'
|
||||
log(args);
|
||||
else
|
||||
log.print 'RS', 'No log method argument provided, using standard I/O'
|
||||
|
||||
### Fetch the `http_port` argument ###
|
||||
if process.argv.length > 3 then args.http_port = parseInt(process.argv[3]);
|
||||
else log.print 'RS', 'No HTTP port passed, using standard port from config file'
|
||||
|
||||
### Initialize all required modules with the args object. ###
|
||||
db args
|
||||
db.isConnected((err, result) -> if !err then continueInit())
|
||||
|
||||
continueInit = ->
|
||||
log.print 'RS', 'Initialzing engine'
|
||||
engine(args)
|
||||
log.print 'RS', 'Initialzing http listener'
|
||||
http_listener(args)
|
||||
log.print 'RS', 'Initialzing module manager'
|
||||
mm(args)
|
||||
log.print 'RS', 'Initialzing DB'
|
||||
|
||||
### Distribute handlers between modules to link the application. ###
|
||||
log.print 'RS', 'Passing handlers to engine'
|
||||
engine.addDBLinkAndLoadActionsAndRules db
|
||||
log.print 'RS', 'Passing handlers to http listener'
|
||||
http_listener.addHandlers db, handleAdminCommands, engine.pushEvent
|
||||
log.print 'RS', 'Passing handlers to module manager'
|
||||
mm.addHandlers db, engine.loadActionModule, engine.addRule
|
||||
null
|
||||
|
||||
###
|
||||
admin commands handler receives all command arguments and an answerHandler
|
||||
object that eases response handling to the HTTP request issuer.
|
||||
###
|
||||
|
||||
handleAdminCommands = (args, answHandler) ->
|
||||
if args and args.cmd then adminCmds[args.cmd]?(args, answHandler)
|
||||
else log.print 'RS', 'No command in request'
|
||||
fAnsw = (ah) -> ->
|
||||
if not ah.isAnswered() then answHandler.answerError 'Not handled...'
|
||||
setTimeout fAnsw(answHandler), 2000
|
||||
null
|
||||
|
||||
###
|
||||
Shuts down the server.
|
||||
@param {Object} args
|
||||
@param {Object} answHandler
|
||||
###
|
||||
shutDown = (args, answHandler) ->
|
||||
answHandler?.answerSuccess 'Goodbye!'
|
||||
log.print 'RS', 'Received shut down command!'
|
||||
engine?.shutDown()
|
||||
http_listener?.shutDown()
|
||||
|
||||
###
|
||||
## Process Commands
|
||||
|
||||
When the server is run as a child process, this function handles messages
|
||||
from the parent process (e.g. the testing suite)
|
||||
###
|
||||
process.on 'message', (cmd) -> procCmds[cmd]?()
|
||||
|
||||
###
|
||||
The die command redirects to the shutDown function.
|
||||
###
|
||||
procCmds.die = shutDown
|
||||
|
||||
###
|
||||
*Start initialization*
|
||||
###
|
||||
|
||||
init()
|
||||
|
|
|
|||
|
|
@ -1 +1,10 @@
|
|||
efew = require 'fs'
|
||||
|
||||
###
|
||||
root = exports ? this
|
||||
root.foo = -> 'Hello World'
|
||||
console.log root.foo()
|
||||
|
||||
My comments will show up here
|
||||
|
||||
###
|
||||
|
|
@ -18,17 +18,197 @@ Valid `log_type`'s are:
|
|||
|
||||
|
||||
(function() {
|
||||
var root;
|
||||
'use strict';
|
||||
var adminCmds, args, conf, continueInit, db, engine, handleAdminCommands, http_listener, init, log, mm, path, procCmds, shutDown;
|
||||
|
||||
root = typeof exports !== "undefined" && exports !== null ? exports : this;
|
||||
path = require('path');
|
||||
|
||||
root.foo = function() {
|
||||
return 'Hello World';
|
||||
log = require('./logging');
|
||||
|
||||
conf = require('./config');
|
||||
|
||||
db = require('./db_interface');
|
||||
|
||||
engine = require('./engine');
|
||||
|
||||
http_listener = require('./http_listener');
|
||||
|
||||
mm = require('./module_manager');
|
||||
|
||||
args = {};
|
||||
|
||||
procCmds = {};
|
||||
|
||||
/* Prepare the admin commands that are issued via HTTP requests.*/
|
||||
|
||||
|
||||
adminCmds = {
|
||||
'loadrules': mm.loadRulesFromFS,
|
||||
'loadaction': mm.loadActionModuleFromFS,
|
||||
'loadactions': mm.loadActionModulesFromFS,
|
||||
'loadevent': mm.loadEventModuleFromFS,
|
||||
'loadevents': mm.loadEventModulesFromFS,
|
||||
'loadusers': http_listener.loadUsers,
|
||||
'shutdown': shutDown
|
||||
};
|
||||
|
||||
/*
|
||||
My comments will show up here
|
||||
Error handling of the express port listener requires special attention,
|
||||
thus we have to catch the process error, which is issued if
|
||||
the port is already in use.
|
||||
*/
|
||||
|
||||
|
||||
process.on('uncaughtException', function(err) {
|
||||
switch (err.errno) {
|
||||
case 'EADDRINUSE':
|
||||
err.addInfo = 'http_port already in use, shutting down!';
|
||||
log.error('RS', err);
|
||||
shutDown();
|
||||
break;
|
||||
default:
|
||||
log.error(err);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
/*
|
||||
## Initialize the Server
|
||||
This function is invoked right after the module is loaded and starts the server.
|
||||
*/
|
||||
|
||||
|
||||
init = function() {
|
||||
log.print('RS', 'STARTING SERVER');
|
||||
if (!conf.isReady()) {
|
||||
log.error('RS', 'Config file not ready!');
|
||||
process.exit;
|
||||
}
|
||||
/* Fetch the `log_type` argument and post a log about which log type is used.*/
|
||||
|
||||
if (process.argv.length > 2) {
|
||||
args.logType = parseInt(process.argv[2]) || 0;
|
||||
switch (args.logType) {
|
||||
case 0:
|
||||
log.print('RS', 'Log type set to standard I/O output');
|
||||
break;
|
||||
case 1:
|
||||
log.print('RS', 'Log type set to file output');
|
||||
break;
|
||||
case 2:
|
||||
log.print('RS', 'Log type set to silent');
|
||||
break;
|
||||
default:
|
||||
log.print('RS', 'Unknown log type, using standard I/O');
|
||||
}
|
||||
log(args);
|
||||
} else {
|
||||
log.print('RS', 'No log method argument provided, using standard I/O');
|
||||
}
|
||||
/* Fetch the `http_port` argument*/
|
||||
|
||||
if (process.argv.length > 3) {
|
||||
args.http_port = parseInt(process.argv[3]);
|
||||
} else {
|
||||
log.print('RS', 'No HTTP port passed, using standard port from config file');
|
||||
}
|
||||
/* Initialize all required modules with the args object.*/
|
||||
|
||||
db(args);
|
||||
return db.isConnected(function(err, result) {
|
||||
if (!err) {
|
||||
return continueInit();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
continueInit = function() {
|
||||
log.print('RS', 'Initialzing engine');
|
||||
engine(args);
|
||||
log.print('RS', 'Initialzing http listener');
|
||||
http_listener(args);
|
||||
log.print('RS', 'Initialzing module manager');
|
||||
mm(args);
|
||||
log.print('RS', 'Initialzing DB');
|
||||
/* Distribute handlers between modules to link the application.*/
|
||||
|
||||
log.print('RS', 'Passing handlers to engine');
|
||||
engine.addDBLinkAndLoadActionsAndRules(db);
|
||||
log.print('RS', 'Passing handlers to http listener');
|
||||
http_listener.addHandlers(db, handleAdminCommands, engine.pushEvent);
|
||||
log.print('RS', 'Passing handlers to module manager');
|
||||
mm.addHandlers(db, engine.loadActionModule, engine.addRule);
|
||||
return null;
|
||||
};
|
||||
|
||||
/*
|
||||
admin commands handler receives all command arguments and an answerHandler
|
||||
object that eases response handling to the HTTP request issuer.
|
||||
*/
|
||||
|
||||
|
||||
handleAdminCommands = function(args, answHandler) {
|
||||
var fAnsw, _name;
|
||||
if (args && args.cmd) {
|
||||
if (typeof adminCmds[_name = args.cmd] === "function") {
|
||||
adminCmds[_name](args, answHandler);
|
||||
}
|
||||
} else {
|
||||
log.print('RS', 'No command in request');
|
||||
}
|
||||
fAnsw = function(ah) {
|
||||
return function() {
|
||||
if (!ah.isAnswered()) {
|
||||
return answHandler.answerError('Not handled...');
|
||||
}
|
||||
};
|
||||
};
|
||||
setTimeout(fAnsw(answHandler), 2000);
|
||||
return null;
|
||||
};
|
||||
|
||||
/*
|
||||
Shuts down the server.
|
||||
@param {Object} args
|
||||
@param {Object} answHandler
|
||||
*/
|
||||
|
||||
|
||||
shutDown = function(args, answHandler) {
|
||||
if (answHandler != null) {
|
||||
answHandler.answerSuccess('Goodbye!');
|
||||
}
|
||||
log.print('RS', 'Received shut down command!');
|
||||
if (engine != null) {
|
||||
engine.shutDown();
|
||||
}
|
||||
return http_listener != null ? http_listener.shutDown() : void 0;
|
||||
};
|
||||
|
||||
/*
|
||||
## Process Commands
|
||||
|
||||
When the server is run as a child process, this function handles messages
|
||||
from the parent process (e.g. the testing suite)
|
||||
*/
|
||||
|
||||
|
||||
process.on('message', function(cmd) {
|
||||
return typeof procCmds[cmd] === "function" ? procCmds[cmd]() : void 0;
|
||||
});
|
||||
|
||||
/*
|
||||
The die command redirects to the shutDown function.
|
||||
*/
|
||||
|
||||
|
||||
procCmds.die = shutDown;
|
||||
|
||||
/*
|
||||
*Start initialization*
|
||||
*/
|
||||
|
||||
|
||||
init();
|
||||
|
||||
}).call(this);
|
||||
|
|
|
|||
16
js-coffee/test.js
Normal file
16
js-coffee/test.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// Generated by CoffeeScript 1.6.3
|
||||
(function() {
|
||||
var efew;
|
||||
|
||||
efew = require('fs');
|
||||
|
||||
/*
|
||||
root = exports ? this
|
||||
root.foo = -> 'Hello World'
|
||||
console.log root.foo()
|
||||
|
||||
My comments will show up here
|
||||
*/
|
||||
|
||||
|
||||
}).call(this);
|
||||
|
|
@ -111,11 +111,10 @@ function handleAdminCommands(args, answHandler) {
|
|||
if(typeof func == 'function') func(args, answHandler);
|
||||
} else log.print('RS', 'No command in request');
|
||||
setTimeout(function(ah) {
|
||||
answHandler = ah;
|
||||
return function() {
|
||||
if(!answHandler.isAnswered()) answHandler.answerError('Not handeled...');
|
||||
if(!ah.isAnswered()) ah.answerError('Not handeled...');
|
||||
};
|
||||
}, 2000);
|
||||
}(answHandler), 2000);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue