import fs = require('fs'); import { Storage } from './storage'; export class StorageNode implements Storage { private prefix: string; constructor(id:string) { try { fs.mkdirSync("data"); } catch (e) { // ignore } const safeId = id.replace(/[^A-Za-z0-9]/g, ""); if (safeId === '') { throw new Error("must have non-empty id"); } this.prefix = safeId; } public async getValues() { return Object.values(this.getMap()); } public async get(key:string) { return this.getMap()[key]; } public async set(key:string, value:any) { const filename = "data/storage_" + this.prefix; let map; try { const contents = fs.readFileSync(filename, {encoding: 'utf-8'}); map = JSON.parse(contents); } catch(e) { map = {}; } map[key] = value; fs.writeFileSync(filename, JSON.stringify(map)); } private getMap() { try { const filename = "data/storage_" + this.prefix; const contents = fs.readFileSync(filename, {encoding: 'utf-8'}); return JSON.parse(contents); } catch (e) { return {}; } } }