vertical-db
Version:
levelDB distributed,BigTable model.
264 lines (246 loc) • 6.55 kB
JavaScript
var crypto = require('crypto');
var path = require('path');
class VerticalServerRun
{
constructor(socket,config)
{
this.socket = socket;
this.config = config;
this.dbList = config.dbList;
this.eventList = this.socket.eventList;
this.streamList = this.socket.streamList;
this.syncData = this.socket.syncData;
}
runServerLevel(operData)
{
switch (operData.method) {
case 'level':
var md5 = crypto.createHash('md5');
var dbPath = path.join(this.config.dataPath,operData.params[0]);
var db = md5.update(JSON.stringify(dbPath)).digest('hex');
if (this.dbList.hasOwnProperty(db))
{
this.socket.writeData(operData.operid,0,[db]);
return;
}
var runFunc = this.genFunc(this.config.vsl,operData);
if(runFunc == '[runFunc Error]'){return;}
return runFunc.then((res)=>{
this.dbList[db] = {
'path':dbPath,
'db':res
};
this.socket.writeData(operData.operid,0,[db]);
});
break;
case 'destroy':
var runFunc = this.genFunc(this.config.vsl,operData);
if(runFunc == '[runFunc Error]'){return;}
return runFunc.then((res)=>{
var md5 = crypto.createHash('md5');
db = md5.update(JSON.stringify(operData.params)).digest('hex');
if (this.dbList.hasOwnProperty(db))
{
delete this.dbList[db];
}
this.socket.writeData(operData.operid,0,[res]);
});
break;
default:
var runFunc = this.genFunc(this.config.vsl,operData);
if(runFunc == '[runFunc Error]'){return;}
return runFunc.then((res)=>{
this.socket.writeData(operData.operid,0,[res]);
});
break;
}
}
runServerDB(operData)
{
var addSyncmethod = '';
var syncData = [];
switch (operData.method) {
case 'isOpen':
case 'isClosed':
case 'getProperty':
var runFunc = this.genFunc(this.dbList[operData.db]['db'],operData);
if(runFunc == '[runFunc Error]'){return;}
this.socket.writeData(operData.operid,0,[runFunc]);
return;
break;
case 'on':
var runEmit = this.genEmit(this.dbList[operData.db]['db'],operData);
if(runEmit == '[runEmit Error]'){return;}
break;
case 'put':
if (addSyncmethod=='')
{
syncData.push({ type: 'put', key: operData.params[0], value: operData.params[1]});
addSyncmethod = 'put';
}
case 'del':
if (addSyncmethod=='')
{
syncData.push({ type: 'del', key: operData.params[0] });
addSyncmethod = 'del';
}
case 'batch':
if (addSyncmethod=='')
{
syncData = operData.params[0];
addSyncmethod = 'batch';
}
if (!this.syncData.hasOwnProperty(operData.db)) {
this.syncData[operData.db] = {
'path':this.dbList[operData.db].path,
'data':[]
};
};
this.syncData[operData.db]['data'].push(...syncData);
default:
var runFunc = this.genFunc(this.dbList[operData.db]['db'],operData);
if(runFunc == '[runFunc Error]'){return;}
return runFunc.then((res)=>{
this.socket.writeData(operData.operid,0,[res]);
});
break;
}
}
runServerStream(operData)
{
if (!this.streamList.hasOwnProperty(operData.stream.streamId))
{
this.streamList[operData.stream.streamId] = this.genFunc(this.dbList[operData.db]['db'],operData.stream);
}
var stream = this.streamList[operData.stream.streamId];
switch (operData.method) {
case 'destroy':
var runFunc = this.genFunc(stream,operData);
if(runFunc == '[runFunc Error]'){return;}
delete this.streamList[operData.stream.streamId];
this.socket.writeData(operData.operid,0,[runFunc]);
return;
break;
case 'on':
var runEmit = this.genEmit(stream,operData);
if(runEmit == '[runEmit Error]'){return;}
break;
default:
var runFunc = this.genFunc(stream,operData);
if(runFunc == '[runFunc Error]'){return;}
this.socket.writeData(operData.operid,0,[runFunc]);
return;
break;
}
}
genEmit(obj,operData)
{
this.eventList[operData.operid] ={
db:obj,
event:operData.params,
listener:(...res)=>{
this.socket.writeData(operData.operid,0,res,true);
}
};
try{
obj[operData.method](this.eventList[operData.operid]['event'],this.eventList[operData.operid]['listener']);
} catch (err){
this.socket.writeData(operData.operid,1,[err.stack]);
return '[runEmit Error]';
}
}
genFunc(obj,operData)
{
try{
var runFunc = obj[operData.method](...operData.params);
} catch (err){
this.socket.writeData(operData.operid,1,[err.stack]);
return '[runFunc Error]';
}
return runFunc;
}
catchError(myPromise,operData)
{
myPromise.catch((err)=>{
this.socket.writeData(operData.operid,1,[err.stack]);
});
}
getPass(nowtime)
{
if (!this.config.hasOwnProperty("auth"))
{
this.config.auth = '';
}
var md5 = crypto.createHash('md5');
md5.update(this.config.auth+nowtime);
return md5.digest('hex');
}
acceptSync(operData)
{
try{
var md5 = crypto.createHash('md5');
var db = md5.update(JSON.stringify(operData.syncData.path)).digest('hex');
if (!this.dbList.hasOwnProperty(db))
{
var dbSyncFunc = this.config.vsl.level(operData.syncData.path)
.then((res)=>{
this.dbList[db] = res;
return this.dbList[db]['db'].batch(operData.syncData.data);
});
} else {
var dbSyncFunc = this.dbList[db]['db'].batch(operData.syncData.data);
}
dbSyncFunc
.then((res)=>{
this.socket.writeData(operData.operid,0,[res]);
})
.catch((err)=>{
this.socket.writeData(operData.operid,1,[err.stack]);
});
} catch (err){
this.socket.writeData(operData.operid,1,[err.stack]);
}
}
run(operData)
{
var nowtime = Date.now();
if (operData.nowtime>nowtime+300000 || operData.nowtime<nowtime-300000)
{
this.socket.writeData(operData.operid,1,[
'Time expired!server timestamp:'+
nowtime+
'-your timestamp:'+
operData.nowtime
]);
return;
} else {
var pass = this.getPass(operData.nowtime);
if (pass!=operData.pass)
{
this.socket.writeData(operData.operid,1,['password failure!']);
return;
}
}
if (operData.method=='sync')
{
this.acceptSync(operData);
return;
}
if (operData.db==null)
{
var myPromise = this.runServerLevel(operData);
} else {
if (operData.stream ==null)
{
var myPromise = this.runServerDB(operData);
} else {
var myPromise = this.runServerStream(operData);
}
}
if (Object.prototype.toString.call(myPromise)=='[object Promise]')
{
this.catchError(myPromise,operData);
}
}
}
module.exports = VerticalServerRun;