Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict'
- let redis=require('redis')
- let client=redis.createClient()
- let express=require('express')
- let app=express()
- let bodyparser=require('body-parser')
- app.use(bodyparser.json())
- function valid(secret){
- return'my code'
- }
- app.post('/flush',(req,res)=>{
- if(!valid(req.body.secret))return;
- client.flushall(()=>{
- res.json({})
- })
- })
- app.post('/get',(req,res)=>{
- let key=req.body.key
- if(key==undefined||!valid(req.body.secret))return;
- client.get(key,(err,val)=>{
- res.json({err,val})
- })
- })
- app.post('/set',(req,res)=>{
- let key=req.body.key
- let val=req.body.val
- if(key==undefined||val==undefined||!valid(req.body.secret))return;
- client.set(key,val,(err,status)=>{
- res.json({err})
- })
- })
- app.post('/del',(req,res)=>{
- let key=req.body.key
- if(key==undefined||!valid(req.body.secret))return;
- client.multi()
- .get(key)
- .del(key)
- .exec((err,replies)=>{
- res.json({err,val:replies[0]})
- })
- })
- let jobs=new Map()
- let subs=new Map()//each key has job ids subscribed
- function getjob(jobid){
- let job=jobs.get(jobid)
- if(job){
- clearTimeout(job.timeout)
- }else{
- job={
- jobid,
- queue:[],
- res:null,
- subs:new Set(),
- }
- jobs.set(jobid,job)
- }
- job.timeout=setTimeout(()=>{//remove if innactive
- jobs.delete(jobid)
- for(let key of job.subs){
- if(subs.has(key)){
- subs.get(key).delete(job)
- }
- }
- },100*1000)
- return job
- }
- app.post('/sub',(req,res)=>{
- let key=req.body.key
- let jobid=req.body.jobid
- if(key==undefined||jobid==undefined||!valid(req.body.secret))return;
- let job=getjob(jobid)
- if(!subs.has(key))subs.set(key,new Set())
- subs.get(key).add(job)
- job.subs.add(key)
- res.json({})
- })
- app.post('/unsub',(req,res)=>{
- let key=req.body.key
- let jobid=req.body.jobid
- if(key==undefined||jobid==undefined||!valid(req.body.secret))return;
- let job=getjob(jobid)
- if(!subs.has(key))return;
- job.subs.delete(key)
- subs.get(key).delete(job)
- if(!subs.get(key).size)subs.delete(key)
- res.json({})
- })
- let lastid=0
- let upd1=new Map()
- app.post('/upd0',(req,res)=>{
- let key=req.body.key
- if(key==undefined||!valid(req.body.secret))return;
- client.watch(key,(err)=>{
- if(err){
- res.json({err})
- throw err
- }
- client.get(key,(err,oldval)=>{
- if(err){
- res.json({err})
- throw err
- }
- let id=lastid++
- lastid=lastid%(1<<30)
- res.json({id,oldval})
- let timeout
- upd1.set(id,function callback(val,res){
- clearTimeout(timeout)
- if(upd1.get(id)!=callback){
- client.unwatch()
- return
- }
- upd1.delete(id)
- if(val==null){//timeout called
- client.unwatch()
- }else{
- client.multi()
- .set(key,val)
- .exec((err,replies)=>{
- if(replies){
- res.json({err})
- if(!err&&subs.has(key)){
- for(let job of subs.get(key)){
- if(job.res){
- job.res.json({key,val,oldval})
- job.res=null
- }else{
- job.queue.push({key,val,oldval})
- }
- }
- }
- }else{
- res.json({err:'externally modified'})
- }
- })
- }
- })
- timeout=setTimeout(upd1.get(id),30*1000)
- })
- })
- })
- app.post('/upd1',(req,res)=>{
- let key=req.body.key
- let val=req.body.val
- let id=req.body.id
- if(key==undefined||val==undefined||id==undefined||!valid(req.body.secret))return;
- if(upd1.has(id)){
- upd1.get(id)(val,res)
- }else{
- res.json({err:'invalid id or took too long'})
- }
- })
- app.post('/poll',(req,res)=>{
- let jobid=req.body.jobid
- if(jobid==undefined||!valid(req.body.secret))return;
- let job=getjob(jobid)
- if(job.queue[0]){
- res.json(job.queue[0])
- job.queue.shift()
- }else{
- job.res=res
- setTimeout(()=>{
- if(job.res==res){
- job.res=null
- res.json({timeout:true})
- }
- },10*1000)
- }
- })
- client.on('error',function(err){
- console.log('error '+err)
- })
- app.listen(3000)
Add Comment
Please, Sign In to add comment