Files
Muse 084afeb8f4 3x-ui 式共享节点改造:nodes 状态机 + nodeClients 各自凭据
- 移除 VMess 协议
- VLESS/SS2022 按用户流量统计(AnyTLS 日志解析,SS 节点级)
- sing-box v2ray_api stats 支持
- 内存优化:面板 128M,agent 64M,sing-box 64M
2026-10-19 22:23:40 +08:00

28 lines
1.4 KiB
JavaScript

'use strict';
const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const { Store } = require('../lib/store');
const { Orchestrator } = require('../lib/orchestrator');
test('job failures redact a Reality secret and stale completions cannot overwrite a retry', async () => {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nexusgate-jobs-'));
try {
const store = await new Store(path.join(dir, 'data.json')).init();
await store.transaction((data) => {
data.jobs.push({ id:'job_running', status:'running', nodeId:'nod_test', action:'apply_resource',
serverId:'srv_test', payload:{}, attempts:1 });
data.jobs.push({ id:'job_requeued', status:'queued', nodeId:'nod_test', action:'apply_resource',
serverId:'srv_test', payload:{}, attempts:2 });
});
const orchestrator = new Orchestrator(store);
await orchestrator.completeJob('job_running', false, {}, 'PrivateKey: should_not_persist Password (PublicKey): public_value');
assert.match(store.data.jobs[0].error, /PrivateKey: \[REDACTED\]/);
assert.doesNotMatch(fs.readFileSync(path.join(dir, 'data.json'), 'utf8'), /should_not_persist/);
await assert.rejects(() => orchestrator.completeJob('job_requeued', true), (error) => error.statusCode === 409);
} finally { fs.rmSync(dir, { recursive:true, force:true }); }
});