Guest User

ubuntu

a guest
May 1st, 2019
1,716
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict'
  2.  
  3.  
  4. let redis=require('redis')
  5. let client=redis.createClient()
  6.  
  7. let express=require('express')
  8. let app=express()
  9. let bodyparser=require('body-parser')
  10. app.use(bodyparser.json())
  11.  
  12. function valid(secret){
  13.     return'my code'
  14. }
  15.  
  16. app.post('/flush',(req,res)=>{
  17.     if(!valid(req.body.secret))return;
  18.     client.flushall(()=>{
  19.         res.json({})
  20.     })
  21. })
  22.  
  23. app.post('/get',(req,res)=>{
  24.     let key=req.body.key
  25.     if(key==undefined||!valid(req.body.secret))return;
  26.     client.get(key,(err,val)=>{
  27.         res.json({err,val})
  28.     })
  29. })
  30. app.post('/set',(req,res)=>{
  31.     let key=req.body.key
  32.     let val=req.body.val
  33.     if(key==undefined||val==undefined||!valid(req.body.secret))return;
  34.     client.set(key,val,(err,status)=>{
  35.         res.json({err})
  36.     })
  37. })
  38. app.post('/del',(req,res)=>{
  39.     let key=req.body.key
  40.     if(key==undefined||!valid(req.body.secret))return;
  41.     client.multi()
  42.         .get(key)
  43.         .del(key)
  44.         .exec((err,replies)=>{
  45.             res.json({err,val:replies[0]})
  46.         })
  47. })
  48. let jobs=new Map()
  49. let subs=new Map()//each key has job ids subscribed
  50. function getjob(jobid){
  51.     let job=jobs.get(jobid)
  52.     if(job){
  53.         clearTimeout(job.timeout)
  54.     }else{
  55.         job={
  56.             jobid,
  57.             queue:[],
  58.             res:null,
  59.             subs:new Set(),
  60.         }
  61.         jobs.set(jobid,job)
  62.     }
  63.     job.timeout=setTimeout(()=>{//remove if innactive
  64.         jobs.delete(jobid)
  65.         for(let key of job.subs){
  66.             if(subs.has(key)){
  67.                 subs.get(key).delete(job)
  68.             }
  69.         }
  70.     },100*1000)
  71.     return job
  72. }
  73.  
  74. app.post('/sub',(req,res)=>{
  75.     let key=req.body.key
  76.     let jobid=req.body.jobid
  77.     if(key==undefined||jobid==undefined||!valid(req.body.secret))return;
  78.     let job=getjob(jobid)
  79.     if(!subs.has(key))subs.set(key,new Set())
  80.     subs.get(key).add(job)
  81.     job.subs.add(key)
  82.     res.json({})
  83. })
  84.  
  85. app.post('/unsub',(req,res)=>{
  86.     let key=req.body.key
  87.     let jobid=req.body.jobid
  88.     if(key==undefined||jobid==undefined||!valid(req.body.secret))return;
  89.     let job=getjob(jobid)
  90.     if(!subs.has(key))return;
  91.     job.subs.delete(key)
  92.     subs.get(key).delete(job)
  93.     if(!subs.get(key).size)subs.delete(key)
  94.     res.json({})
  95. })
  96.  
  97. let lastid=0
  98. let upd1=new Map()
  99. app.post('/upd0',(req,res)=>{
  100.     let key=req.body.key
  101.     if(key==undefined||!valid(req.body.secret))return;
  102.     client.watch(key,(err)=>{
  103.         if(err){
  104.             res.json({err})
  105.             throw err
  106.         }
  107.         client.get(key,(err,oldval)=>{
  108.             if(err){
  109.                 res.json({err})
  110.                 throw err
  111.             }
  112.             let id=lastid++
  113.             lastid=lastid%(1<<30)
  114.             res.json({id,oldval})
  115.             let timeout
  116.             upd1.set(id,function callback(val,res){
  117.                 clearTimeout(timeout)
  118.                 if(upd1.get(id)!=callback){
  119.                     client.unwatch()
  120.                     return
  121.                 }
  122.                 upd1.delete(id)
  123.                 if(val==null){//timeout called
  124.                     client.unwatch()
  125.                 }else{
  126.                     client.multi()
  127.                         .set(key,val)
  128.                         .exec((err,replies)=>{
  129.                             if(replies){
  130.                                 res.json({err})
  131.                                 if(!err&&subs.has(key)){
  132.                                     for(let job of subs.get(key)){
  133.                                         if(job.res){
  134.                                             job.res.json({key,val,oldval})
  135.                                             job.res=null
  136.                                         }else{
  137.                                             job.queue.push({key,val,oldval})
  138.                                         }
  139.                                     }
  140.                                 }
  141.                             }else{
  142.                                 res.json({err:'externally modified'})
  143.                             }
  144.                         })
  145.                 }
  146.             })
  147.             timeout=setTimeout(upd1.get(id),30*1000)
  148.         })
  149.     })
  150. })
  151. app.post('/upd1',(req,res)=>{
  152.     let key=req.body.key
  153.     let val=req.body.val
  154.     let id=req.body.id
  155.     if(key==undefined||val==undefined||id==undefined||!valid(req.body.secret))return;
  156.     if(upd1.has(id)){
  157.         upd1.get(id)(val,res)
  158.     }else{
  159.         res.json({err:'invalid id or took too long'})
  160.     }
  161. })
  162.  
  163. app.post('/poll',(req,res)=>{
  164.     let jobid=req.body.jobid
  165.     if(jobid==undefined||!valid(req.body.secret))return;
  166.     let job=getjob(jobid)
  167.     if(job.queue[0]){
  168.         res.json(job.queue[0])
  169.         job.queue.shift()
  170.     }else{
  171.         job.res=res
  172.         setTimeout(()=>{
  173.             if(job.res==res){
  174.                 job.res=null
  175.                 res.json({timeout:true})
  176.             }
  177.         },10*1000)
  178.     }
  179. })
  180.  
  181. client.on('error',function(err){
  182.     console.log('error '+err)
  183. })
  184. app.listen(3000)
Add Comment
Please, Sign In to add comment