- 回滚/备份:空 bak 改名 .bad 跳过;升级刷新 bak 补上单数 marker 补丁;统一原子写 - 补丁命中:optional 命中不符记软失败;#42 插入型替换加探针防重复插入 - Windows:进程枚举改用 | 分隔 + UTF-8,修复中文路径换包不杀旧进程;换包失败拉起原版 - 安全:asar 解包防越界;红队路径校验 realpath 防空 symlink;更新仅 https;报告回放去换行注入 - 提示词钩子:停用后 rewriteFn 返回原装配文本并清理 assemble guard;缓存签名纳入红队/策略/override - 红队:listEngagements 默认不算统计;listVulns/报告支持 evidenceLimit - 子代理名额占位即时生效并回退;--apply 有失败项退出码 1 - 清理:删除 lib/mnemon-settings.js 及 13 处死代码/未使用 import;移除 test 目录与 test 脚本
29 lines
904 B
JavaScript
29 lines
904 B
JavaScript
import { closeSync, fsyncSync, openSync, renameSync, unlinkSync, writeSync } from 'node:fs'
|
|
|
|
/**
|
|
* 先写临时文件、fsync、再 rename。
|
|
* 直接 writeFileSync 覆盖原文件时,写到一半崩溃会留下半截 JSON;读侧又会把解析错
|
|
* 吞成默认值,用户的设置就无声消失了。
|
|
*/
|
|
export function atomicWriteFileSync(file, text) {
|
|
const tmp = file + '.tmp-' + process.pid + '-' + Date.now().toString(36)
|
|
const fd = openSync(tmp, 'w')
|
|
try {
|
|
writeSync(fd, text)
|
|
try { fsyncSync(fd) } catch { /* 部分文件系统不支持,忽略 */ }
|
|
} catch (error) {
|
|
try { closeSync(fd) } catch { /* ignore */ }
|
|
try { unlinkSync(tmp) } catch { /* ignore */ }
|
|
throw error
|
|
}
|
|
try {
|
|
closeSync(fd)
|
|
} catch { /* ignore */ }
|
|
try {
|
|
renameSync(tmp, file)
|
|
} catch (error) {
|
|
try { unlinkSync(tmp) } catch { /* ignore */ }
|
|
throw error
|
|
}
|
|
}
|