piston/api/src/state.js

45 lines
1.2 KiB
JavaScript

const fs = require('fs/promises');
const fss = require('fs');
const logger = require('logplease').create('state');
const state = new Map();
function replacer(key, value) {
if(value instanceof Map) {
return {
data_type: 'Map',
value: Array.from(value.entries()),
};
} else {
return value;
}
}
function reviver(key, value) {
if(typeof value === 'object' && value !== null) {
if (value.data_type === 'Map') {
return new Map(value.value);
}
}
return value;
}
module.exports = {
state,
async load(data_file){
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);
[...obj.keys()].forEach(k => state.set(k, obj.get(k)));
}else{
logger.info('Creating new state file');
state.set('repositories', new Map());
}
},
async save(data_file){
logger.info('Saving state to disk');
await fs.write_file(data_file, JSON.stringify(state, replacer));
}
};