Files
P42_wssGateway/actions/store.js
T
2025-09-21 20:09:42 +00:00

111 lines
3.6 KiB
JavaScript

export const methods = {
/* Request:
{
"action": "SET"
"payload": {
"key": "keyname",
"value": "stringifiedvalue", // If null : deletes the key
"expire": 60 // if present & non zero, expires the key in x seconds.
// if absent or zero, we force a TTL of 2 years = 63072000 sec.
"observe": true // if true: make it an observable key & subscribe to it
}
"reqid": "6az5e4r6a"
}
Reply:
{
"action":"SET",
"success":true,
"reqid": reqid
}
*/
async action_SET(action, payload, reqid){
//TODO : observable...
if((typeof(payload)!='object') || (typeof(payload.key)!='string') ||
((typeof(payload.value)!='object') && (payload.value!==null)) ||
(payload.expire && (typeof(payload.expire)!='number')) ||
(payload.observe && (typeof(payload.observe)!='boolean'))
){
this.sendErr(action, 'Invalid payload', reqid)
return
}
if(!this.accessRights.canSet(this.userId, this.roles, payload.key)){
this.sendErr(action, 'Unauthorized key !', reqid);
return
}
if(payload.value) {
let val = null
try { val = JSON.stringify(payload.value)}
catch(err) {
this.sendErr(action, 'Cannot stringify value object !', reqid);
return
}
if(val.length > this.config.redis.storeMaxSize){
this.sendErr(action, 'value too large !', reqid);
return
}
let exp = ((payload.expire>0) && (payload.expire<63072000)) ? payload.expire : 63072000
await this.rediscnx.redisSet(payload.key, val, exp, this.config.redis.storePrefix)
} else {
await this.rediscnx.redisDel(payload.key, this.config.redis.storePrefix)
}
var reply = {
'action': action,
'success': true,
};
if(reqid) reply.reqid = reqid;
this.send(JSON.stringify(reply));
},
/* Request:
{
"action": "GET"
"payload": {
"key": "keyname"
}
"reqid": "6az5e4r6a"
}
Reply:
{
"action":"GET",
"success":true,
"payload": {
"key" : key,
"value": value
}
"reqid": reqid
}
*/
async action_GET(action, payload, reqid){
//TODO : observable...
if((typeof(payload)!='object') || (typeof(payload.key)!='string')){
this.sendErr(action, 'Invalid payload', reqid);
return;
};
if(!this.accessRights.canGet(this.userId, this.roles, payload.key)) {
console.log('Unauth GET key:',this.userId, this.roles, payload.key)
this.sendErr(action, 'Unauthorized key !', reqid);
return
}
let rawVal = await this.rediscnx.redisGet(payload.key, this.config.redis.storePrefix)
let val = null
try { val = JSON.parse(rawVal)}
catch(err) { console.error('Action GET: Not a json !? ', rawVal) }
var reply = {
'action': action,
'payload': {
'key': payload.key,
'value': val
},
'success': true,
};
if(reqid) reply.reqid = reqid;
this.send(JSON.stringify(reply));
}
}