configStore.cjs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. const fs = require('node:fs');
  2. const path = require('node:path');
  3. const crypto = require('node:crypto');
  4. const { getConfigFilePath } = require('../utils/paths.cjs');
  5. const defaultConfig = {
  6. api_key: '',
  7. base_url: '',
  8. model_name: 'gpt-3.5-turbo',
  9. image_model: {
  10. provider: 'volcengine',
  11. base_url: 'https://ark.cn-beijing.volces.com/api/v3',
  12. api_key: '',
  13. model_name: '',
  14. status: 'untested',
  15. tested_at: '',
  16. last_error: '',
  17. },
  18. file_parser: {
  19. provider: 'local',
  20. mineru_token: '',
  21. },
  22. developer_mode: false,
  23. real_time_render: true,
  24. analytics_client_id: '',
  25. analytics_created_at: '',
  26. };
  27. function createAnalyticsClientId() {
  28. return crypto.randomUUID();
  29. }
  30. function createAnalyticsCreatedAt() {
  31. return new Date().toISOString().slice(0, 10);
  32. }
  33. function normalizeConfig(config) {
  34. const fileParser = config && config.file_parser ? config.file_parser : {};
  35. return {
  36. ...defaultConfig,
  37. ...config,
  38. image_model: {
  39. ...defaultConfig.image_model,
  40. ...(config && config.image_model ? config.image_model : {}),
  41. },
  42. file_parser: {
  43. provider: fileParser.provider || defaultConfig.file_parser.provider,
  44. mineru_token: fileParser.mineru_token || defaultConfig.file_parser.mineru_token,
  45. },
  46. };
  47. }
  48. function createConfigStore(app) {
  49. const configFile = getConfigFilePath(app);
  50. function persist(config) {
  51. fs.mkdirSync(path.dirname(configFile), { recursive: true });
  52. fs.writeFileSync(configFile, JSON.stringify(config, null, 2), 'utf-8');
  53. }
  54. function withAnalyticsIdentity(config) {
  55. if (config.analytics_client_id && config.analytics_created_at) {
  56. return config;
  57. }
  58. return {
  59. ...config,
  60. analytics_client_id: config.analytics_client_id || createAnalyticsClientId(),
  61. analytics_created_at: config.analytics_created_at || createAnalyticsCreatedAt(),
  62. };
  63. }
  64. return {
  65. getConfigFilePath() {
  66. return configFile;
  67. },
  68. load() {
  69. if (!fs.existsSync(configFile)) {
  70. const config = withAnalyticsIdentity(normalizeConfig());
  71. persist(config);
  72. return config;
  73. }
  74. try {
  75. const raw = fs.readFileSync(configFile, 'utf-8');
  76. const config = normalizeConfig(JSON.parse(raw));
  77. const nextConfig = withAnalyticsIdentity(config);
  78. if (nextConfig !== config) {
  79. persist(nextConfig);
  80. }
  81. return nextConfig;
  82. } catch (error) {
  83. throw new Error(`配置文件读取失败:${error.message}`);
  84. }
  85. },
  86. save(config) {
  87. try {
  88. const currentConfig = fs.existsSync(configFile)
  89. ? normalizeConfig(JSON.parse(fs.readFileSync(configFile, 'utf-8')))
  90. : normalizeConfig();
  91. const nextConfig = withAnalyticsIdentity(normalizeConfig({
  92. ...config,
  93. analytics_client_id: config?.analytics_client_id || currentConfig.analytics_client_id,
  94. analytics_created_at: config?.analytics_created_at || currentConfig.analytics_created_at,
  95. }));
  96. persist(nextConfig);
  97. return { success: true, message: '配置已保存', config_path: configFile };
  98. } catch (error) {
  99. throw new Error(`配置文件保存失败:${error.message}`);
  100. }
  101. },
  102. };
  103. }
  104. module.exports = {
  105. createConfigStore,
  106. };