You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.0 KiB
143 lines
4.0 KiB
var express = require('express'); |
|
var expressWs = require('express-ws'); |
|
var router = express.Router(); |
|
var redis = require('redis'); |
|
var md5 = require('md5'); |
|
var mysql = require('mysql'); |
|
|
|
/* mysql start */ |
|
var sql = mysql.createConnection(require('/mnt/config/dbKeys/auth.js')); |
|
sql.connect(); |
|
|
|
/* redis start */ |
|
var rc = new redis.createClient({ |
|
host: 'redis' |
|
}); |
|
|
|
|
|
var getAddress = (mask) => { |
|
return new Promise((resolve, reject)=>{ |
|
sql.query("SELECT * FROM mask where mask=?", [mask], (err, res, fields)=>{ |
|
if(err || !res){ |
|
resolve(null); |
|
return; |
|
} |
|
var token = res[0]['token']; |
|
sql.query("SELECT * FROM token where token=?", [token], (err, res, fields)=>{ |
|
if(err || !res){ |
|
resolve(token); |
|
return; |
|
} |
|
if(!res[0]['state']){ |
|
resolve(token); |
|
return; |
|
} |
|
var hash = res[0]['hash']; |
|
resolve(hash); |
|
}) |
|
}); |
|
}); |
|
} |
|
|
|
|
|
router.get('/set', async function(req, res, next) { |
|
res.header('Access-Control-Allow-Origin', '*'); |
|
if(!req.query.key || !req.query.val || !req.query.t || !req.query.mask) {res.send({"code":"500"});;return;} |
|
let hash = await getAddress(req.query.mask); |
|
rc.hset('session/dialog/'+hash, req.query.key, req.query.val); |
|
rc.hset('session/dialog/'+hash, 'LastOperateTime', req.query.t); |
|
res.send({code:"200"}); |
|
}); |
|
|
|
router.get('/del', async function(req, res, next) { |
|
res.header('Access-Control-Allow-Origin', '*'); |
|
if(!req.query.del || !req.query.mask || !req.query.t) {res.send({"code":"500"});;return;} |
|
|
|
let hash = await getAddress(req.query.mask); |
|
rc.hdel('session/dialog/'+hash, req.query.del); |
|
rc.hset('session/dialog/'+hash, 'LastOperateTime', req.query.t); |
|
res.send({code:"200"}); |
|
}); |
|
|
|
|
|
router.get('/get', async function(req, res, next) { |
|
res.header('Access-Control-Allow-Origin', '*'); |
|
if(!req.query.mask) {res.send({"code":"500"});;return;} |
|
let hash = await getAddress(req.query.mask); |
|
var o = {}; |
|
rc.hkeys('session/dialog/'+hash, function(err, keys){ |
|
if(!err){ |
|
if(!keys.length){ |
|
res.send(o); |
|
} |
|
keys.forEach(function(key, i){ |
|
rc.hget('session/dialog/'+hash, key, function(err2, val){ |
|
if(!err2){ |
|
o[key] = val; |
|
if(i == keys.length - 1){ |
|
res.send(o); |
|
} |
|
} |
|
}) |
|
}); |
|
} |
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
expressWs(router); |
|
|
|
router |
|
.ws('/', async function (ws, req){ |
|
if(req.query.mask){ |
|
var hash = await getAddress(req.query.mask); |
|
}else{ |
|
ws.close(); |
|
} |
|
ws.on('message', async function (msg) { |
|
if(msg == 'get'){ |
|
var o = {}; |
|
rc.hkeys('session/dialog/'+hash, function(err, keys){ |
|
if(!err){ |
|
|
|
keys.forEach(function(key, i){ |
|
rc.hget('session/dialog/'+hash, key, function(err2, val){ |
|
if(!err2){ |
|
o[key] = val; |
|
if(i == keys.length - 1){ |
|
ws.send(JSON.stringify(o)); |
|
} |
|
} |
|
}) |
|
}); |
|
} |
|
}); |
|
}else if(isJson(msg)){ |
|
obj = JSON.parse(msg); |
|
if(obj.del && obj.t){ |
|
rc.hdel('session/dialog/'+hash, obj.del); |
|
rc.hset('session/dialog/'+hash, 'LastOperateTime', obj.t); |
|
} |
|
if(obj.key && obj.val && obj.t){ |
|
rc.hset('session/dialog/'+hash, obj.key, obj.val); |
|
rc.hset('session/dialog/'+hash, 'LastOperateTime', obj.t); |
|
} |
|
} |
|
}) |
|
}) |
|
|
|
module.exports = router; |
|
|
|
|
|
function isJson(str) { |
|
try { |
|
if (typeof JSON.parse(str) == "object") { |
|
return true; |
|
} |
|
} catch(e) { |
|
} |
|
return false; |
|
}
|
|
|