| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /**
- * 持久化保存:将单个键值写入当前流程目录 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 }
|