hersserver
Version:
A 'now'-alike server extension not using socket.io
189 lines (178 loc) • 5.31 kB
JavaScript
var url = require('url');
var path = require('path');
var fs = require('fs');
var os = require('os');
var crypto = require('crypto');
var responding = require('./responding');
var exposedparameter = require('./exposedparameter');
var childprocess=require('child_process');
var destruction=require('./destruction');
methodmap = {};
isChildProcess=false;
function compactQuery(query){
if(query.$jsonPackage){
try{
var jp = JSON.parse(query.$jsonPackage);
return jp;
}
catch(e){
console.log(query.$jsonPackage,'could not be parsed');
return {};
}
}
return query;
};
now = require('./mynow.js');
everyone = null;
var connectedUsersCount=new (exposedparameter.Number)('admin','numberOfConnectedUsers',0);
var connInfo = function connInfo(nowcontext){
return nowcontext.user.clientId+' ('+nowcontext.socket.handshake.address.address+')';
}
now.on('connect',function(client){
connectedUsersCount.inc();
var cid = client.clientId;
//console.log(connInfo(this)+' connected');
console.log('connected',cid,client.cookie,client.remoteAddress,client.remotePort);
var level = client.cookie.level;
if(level){
//console.log(cid+' assigned to group '+level);
now.getGroup(level).addUser(cid);
}
});
now.on('disconnect',function(){
connectedUsersCount.dec();
//console.log(connInfo(this)+' disconnected');
});
serverpasscode=(function(){
var Buffer = require('buffer').Buffer;
var fd = fs.openSync('/dev/random','r');
var b = new Buffer(20);
fs.readSync(fd,b,0,b.length,0);
var ret = '';
for(var i=0; i<b.length; i++){
ret += b[i];
}
return ret;
})();
server_token='';
realmname='';
realmscheme='';
realmhost='';
function registrationHandler(title,name,cb){
var n = name||clusterConf.username;
return function(result){
var rr =(result&&(typeof result.uid !== 'undefined'));
console.log(title,n,'logged',rr);
if(!rr){
process.exit(0);
return;
}
realmname=result.realm;
realmscheme=result.realmscheme;
realmhost=result.realmhost;
server_token=result.sessid;
cb();
}
};
function resp(request, response) {
var parsed = url.parse(request.url,true);
var uri = parsed.pathname;
var query = compactQuery(parsed.query);
var ishtml = (uri.slice(-5)==='.html');
var isjs = (ishtml ? false : (uri.slice(-3)==='.js'));
var isfile = ishtml||isjs;
var methodname = uri.slice(1);
var methodobj = methodmap[methodname];
var iscommand = (isfile ? false : (responding.isResponder(methodobj)));
if(isfile){
var filename = path.join(htmlroot, uri);
fs.exists(filename, function(exists) {
if (!exists) {
response.writeHead(404, {
'Content-Type' : 'text/plain'
});
response.write("404 "+filename+" Not Found\n");
response.end();
} else {
fs.readFile(filename, "binary", function(err, file) {
if (err) {
response.writeHead(500, {
"Content-Type" : "text/plain"
});
response.write(err + "\n");
response.end();
return;
}
for(var i in filequeryparamnames){
var fqpn = filequeryparamnames[i];
var fqpv = query[fqpn];
if(fqpv){
var rs = '%'+fqpn+'%';
var re = new RegExp(rs,'g');
file = file.replace(re,fqpv);
}
}
/*
if(ishtml){
response.writeHead(200,{'Content-Type':'text/html',
'Access-Control-Allow-Origin': 'https://backoffice.tdrpartner.com',
'Access-Control-Allow-Credentials': true });
}else if(isjs){
response.writeHead(200,{'Content-Type':'text/javascript',
'Access-Control-Allow-Origin': 'https://backoffice.tdrpartner.com',
'Access-Control-Allow-Credentials': true });
}else{
response.writeHead(200,{'Content-Type':'text/plain',
'Access-Control-Allow-Origin': 'https://backoffice.tdrpartner.com',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Credentials': 'true' });
}
*/
response.write(file, "binary");
response.end();
});
}
});
}else{
if(iscommand){
now.getClient(query.clientId,function(c){
if(c){
c.lastCommand = methodname;
}
});
methodobj.httpRespond(request,response,query);
}else{
response.writeHead(404, {
"Content-Type" : "text/plain"
});
response.write("404 "+filename+" Not Found\n");
response.end();
}
}
}
function extend(server){
everyone = now.initialize(server);
invocation = require('./invocation');
responding.createResponder({
name:'prove',
handler:function(){
this.stringifyandend({'ok':process.pid});
}
});
server.createResponder = function(respobj){
responding.createResponder(respobj);
};
server.invoke = function(){
invocation.invoke.apply(null,arguments);
};
server.invokeOnUser = function(){
invocation.invokeOnUser.apply(null,arguments);
};
server.invokeOnGroup = function(){
invocation.invokeOnGroup.apply(null,arguments);
};
server.on('request',resp);
};
module.exports = {
extend : extend
};