UNPKG

hersserver

Version:

A 'now'-alike server extension not using socket.io

189 lines (178 loc) 5.31 kB
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 };