piston/api/src/state.js

45 lines
1.2 KiB
JavaScript
Raw Normal View History

2021-02-20 23:39:03 +01:00
const fs = require('fs/promises');
const fss = require('fs');
2021-02-20 15:13:56 +01:00
2021-02-20 23:39:03 +01:00
const logger = require('logplease').create('state');
const state = new Map();
2021-02-20 15:13:56 +01:00
function replacer(key, value) {
if(value instanceof Map) {
return {
2021-02-20 23:39:03 +01:00
data_type: 'Map',
2021-02-20 15:13:56 +01:00
value: Array.from(value.entries()),
2021-02-20 23:39:03 +01:00
};
2021-02-20 15:13:56 +01:00
} else {
2021-02-20 23:39:03 +01:00
return value;
2021-02-20 15:13:56 +01:00
}
}
function reviver(key, value) {
2021-02-20 23:39:03 +01:00
if(typeof value === 'object' && value !== null) {
if (value.data_type === 'Map') {
return new Map(value.value);
2021-02-20 15:13:56 +01:00
}
}
2021-02-20 23:39:03 +01:00
return value;
2021-02-20 15:13:56 +01:00
}
module.exports = {
state,
async load(data_file){
2021-02-20 23:39:03 +01:00
if(fss.exists_sync(data_file)){
logger.info('Loading state from file');
var content = await fs.read_file(data_file);
var obj = JSON.parse(content.toString(), reviver);
2021-02-20 23:39:03 +01:00
[...obj.keys()].forEach(k => state.set(k, obj.get(k)));
2021-02-20 15:13:56 +01:00
}else{
2021-03-05 07:29:09 +01:00
logger.info('Creating new state file');
state.set('repositories', new Map());
2021-02-20 15:13:56 +01:00
}
},
async save(data_file){
2021-02-20 23:39:03 +01:00
logger.info('Saving state to disk');
await fs.write_file(data_file, JSON.stringify(state, replacer));
2021-02-20 15:13:56 +01:00
}
2021-02-20 23:39:03 +01:00
};