store.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import path from "path";
  2. import { fileURLToPath } from "url";
  3. import Logs from "../libs/logs.js";
  4. import Cache from "../libs/cache.js";
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = path.dirname(__filename);
  7. const STORE_FILE = path.join(__dirname, '../data/store.json');
  8. const STORE_DATA = {};
  9. const isPlainObject = (obj) => {
  10. if (Object.prototype.toString.call(obj) !== '[object Object]') return false;
  11. const proto = Object.getPrototypeOf(obj);
  12. return proto === Object.prototype || proto === null;
  13. }
  14. const initStore = () => {
  15. Cache.getData(STORE_FILE).then(data => {
  16. Logs.out('load store data', data);
  17. Object.assign(STORE_DATA, data);
  18. }).catch(error => {
  19. Logs.out('not load store data', error.message);
  20. });
  21. }
  22. const saveStore = () => {
  23. Cache.setData(STORE_FILE, STORE_DATA).catch(error => {
  24. Logs.out('save cache failed', error);
  25. });
  26. }
  27. export const get = (key, property) => {
  28. if (!key) {
  29. return STORE_DATA;
  30. }
  31. if (property) {
  32. return STORE_DATA[property]?.[key] ?? null;
  33. }
  34. return STORE_DATA[key] ?? null;
  35. }
  36. export const set = (key, value, property) => {
  37. if (typeof(key) == 'string' && typeof(value) != 'undefined') {
  38. if (property && typeof(property) == 'string') {
  39. if (!STORE_DATA[property]) {
  40. STORE_DATA[property] = {};
  41. }
  42. STORE_DATA[property][key] = value;
  43. }
  44. else {
  45. STORE_DATA[key] = value;
  46. }
  47. saveStore();
  48. }
  49. else if (isPlainObject(key)) {
  50. if (value && typeof(value) == 'string') {
  51. property = value;
  52. value = key;
  53. if (!STORE_DATA[property]) {
  54. STORE_DATA[property] = {};
  55. }
  56. Object.assign(STORE_DATA[property], value);
  57. }
  58. else {
  59. value = key;
  60. Object.assign(STORE_DATA, value);
  61. }
  62. saveStore();
  63. }
  64. else {
  65. Logs.out('invalid key or value', key, value);
  66. }
  67. }
  68. export const remove = (key, property) => {
  69. if (property && STORE_DATA[property]) {
  70. delete STORE_DATA[property][key];
  71. }
  72. else if (!property) {
  73. delete STORE_DATA[key];
  74. }
  75. saveStore();
  76. }
  77. // 进程结束时保存数据
  78. process.on('exit', saveStore);
  79. process.on('SIGINT', () => {
  80. process.exit(0);
  81. });
  82. process.on('SIGTERM', () => {
  83. process.exit(0);
  84. });
  85. process.on('SIGUSR2', () => {
  86. process.exit(0);
  87. });
  88. // 初始化缓存
  89. initStore();
  90. export default { get, set, remove };