/** * 持久化保存:将单个键值写入当前流程目录 save/config.json * 支持:string、number;普通 object(如 {x,y})会 JSON.stringify 后以字符串写入 * 路径:folderPath/save/config.json(folderPath 一般为 static/process/<流程名>) */ const path = require('path') const fs = require('fs') function normalizeStoredValue (value) { if (value === undefined) { return { ok: false, error: 'persist-save 缺少 value' } } if (value === null) { return { ok: false, error: 'persist-save 不支持 null' } } if (typeof value === 'number') { if (!Number.isFinite(value)) { return { ok: false, error: 'persist-save 不支持 NaN / Infinity' } } return { ok: true, stored: value } } if (typeof value === 'string') { return { ok: true, stored: value } } if (typeof value === 'object') { if (Array.isArray(value)) { return { ok: false, error: 'persist-save 不支持 array' } } try { return { ok: true, stored: JSON.stringify(value) } } catch (e) { return { ok: false, error: 'persist-save 对象无法序列化为 JSON' } } } if (typeof value === 'boolean') { return { ok: false, error: 'persist-save 仅支持 string 与 number,当前为 boolean' } } return { ok: false, error: `persist-save 仅支持 string 与 number,当前类型: ${typeof value}` } } async function executePersistSave ({ stateKey, stateValue, folderPath }) { if (!folderPath || typeof folderPath !== 'string') { return { success: false, error: 'persist-save 缺少流程目录 folderPath' } } if (stateKey == null || String(stateKey).trim() === '') { return { success: false, error: 'persist-save 缺少 key(JSON 键名)' } } const key = String(stateKey).trim() const norm = normalizeStoredValue(stateValue) if (!norm.ok) { return { success: false, error: norm.error } } const saveDir = path.join(folderPath, 'save') const configPath = path.join(saveDir, 'config.json') let data = {} try { if (fs.existsSync(configPath)) { const raw = fs.readFileSync(configPath, 'utf8') const parsed = JSON.parse(raw) if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { data = parsed } } } catch (_) { data = {} } data[key] = norm.stored try { fs.mkdirSync(saveDir, { recursive: true }) fs.writeFileSync(configPath, JSON.stringify(data, null, 2), 'utf8') } catch (e) { return { success: false, error: `persist-save 写入失败: ${e.message || e}` } } return { success: true, path: configPath, key, value: norm.stored } } module.exports = { executePersistSave }