store.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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 STORE_OPTIONS = {
  10. saveVersion: 0,
  11. updateVersion: 0,
  12. };
  13. /**
  14. * 判断是否为普通对象
  15. * @param {*} obj
  16. * @returns
  17. */
  18. const isPlainObject = (obj) => {
  19. if (Object.prototype.toString.call(obj) !== '[object Object]') return false;
  20. const proto = Object.getPrototypeOf(obj);
  21. return proto === Object.prototype || proto === null;
  22. }
  23. /**
  24. * 初始化数据
  25. */
  26. const initStore = () => {
  27. Cache.getData(STORE_FILE).then(data => {
  28. Logs.out('load store data', data);
  29. Object.assign(STORE_DATA, data);
  30. }).catch(error => {
  31. Logs.out('not load store data', error.message);
  32. });
  33. }
  34. /**
  35. * 保存数据
  36. */
  37. const saveStore = () => {
  38. Cache.setData(STORE_FILE, STORE_DATA, 0).catch(error => {
  39. Logs.out('save cache failed', error);
  40. });
  41. }
  42. /**
  43. * 获取数据
  44. * @param {*} key
  45. * @param {*} property
  46. */
  47. export const get = (key, property) => {
  48. if (!key) {
  49. return STORE_DATA;
  50. }
  51. if (property) {
  52. return STORE_DATA[property]?.[key] ?? null;
  53. }
  54. return STORE_DATA[key] ?? null;
  55. }
  56. /**
  57. * 设置数据
  58. * @param {*} key
  59. * @param {*} value
  60. * @param {*} property
  61. */
  62. export const set = (key, value, property) => {
  63. if (typeof(key) == 'string' && typeof(value) != 'undefined') {
  64. if (property && typeof(property) == 'string') {
  65. if (!STORE_DATA[property]) {
  66. STORE_DATA[property] = {};
  67. }
  68. STORE_DATA[property][key] = value;
  69. }
  70. else {
  71. STORE_DATA[key] = value;
  72. }
  73. STORE_OPTIONS.updateVersion = Date.now();
  74. }
  75. else if (isPlainObject(key)) {
  76. if (value && typeof(value) == 'string') {
  77. property = value;
  78. value = key;
  79. if (!STORE_DATA[property]) {
  80. STORE_DATA[property] = {};
  81. }
  82. Object.assign(STORE_DATA[property], value);
  83. }
  84. else {
  85. value = key;
  86. Object.assign(STORE_DATA, value);
  87. }
  88. STORE_OPTIONS.updateVersion = Date.now();
  89. }
  90. else {
  91. Logs.out('invalid key or value', key, value);
  92. }
  93. }
  94. export const remove = (key, property) => {
  95. if (property && STORE_DATA[property]) {
  96. delete STORE_DATA[property][key];
  97. }
  98. else if (!property) {
  99. delete STORE_DATA[key];
  100. }
  101. STORE_OPTIONS.updateVersion = Date.now();
  102. }
  103. /**
  104. * 自动保存数据
  105. */
  106. const autoSaveStore = () => {
  107. if (STORE_OPTIONS.updateVersion > STORE_OPTIONS.saveVersion) {
  108. saveStore();
  109. STORE_OPTIONS.saveVersion = STORE_OPTIONS.updateVersion;
  110. }
  111. setTimeout(() => {
  112. autoSaveStore();
  113. }, 1000 * 60);
  114. }
  115. /**
  116. * 进程结束时保存数据
  117. */
  118. process.on('exit', saveStore);
  119. process.on('SIGINT', () => {
  120. process.exit(0);
  121. });
  122. process.on('SIGTERM', () => {
  123. process.exit(0);
  124. });
  125. process.on('SIGUSR2', () => {
  126. process.exit(0);
  127. });
  128. // 初始化缓存
  129. initStore();
  130. // 自动保存数据
  131. autoSaveStore();
  132. export default { get, set, remove };