storage-node.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import fs = require('fs');
  2. import { Storage } from './storage';
  3. export class StorageNode implements Storage {
  4. private prefix: string;
  5. constructor(id:string) {
  6. try {
  7. fs.mkdirSync("data");
  8. } catch (e) {
  9. // ignore
  10. }
  11. const safeId = id.replace(/[^A-Za-z0-9]/g, "");
  12. if (safeId === '') {
  13. throw new Error("must have non-empty id");
  14. }
  15. this.prefix = safeId;
  16. }
  17. public async getValues() {
  18. return Object.values(this.getMap());
  19. }
  20. public async get(key:string) {
  21. return this.getMap()[key];
  22. }
  23. public async set(key:string, value:any) {
  24. const filename = "data/storage_" + this.prefix;
  25. let map;
  26. try {
  27. const contents = fs.readFileSync(filename, {encoding: 'utf-8'});
  28. map = JSON.parse(contents);
  29. } catch(e) {
  30. map = {};
  31. }
  32. map[key] = value;
  33. fs.writeFileSync(filename, JSON.stringify(map));
  34. }
  35. private getMap() {
  36. try {
  37. const filename = "data/storage_" + this.prefix;
  38. const contents = fs.readFileSync(filename, {encoding: 'utf-8'});
  39. return JSON.parse(contents);
  40. } catch (e) {
  41. return {};
  42. }
  43. }
  44. }