const FN_URL = process.env.FMODE_FUNCTIONS_URL || 'https://server.fmode.cn/api/functions'; const APP_ID = process.env.PARSE_APP_ID || 'ncloudmaster'; const JIMENG_FN_ID = process.env.JIMENG_FN_ID || 'WUkf74lVE5'; const args = parseArgs(process.argv.slice(2)); async function main() { const checks = []; if (!args.baseProbe) { checks.push(['diagnose', { action: 'diagnose' }]); } if (!args.skipUnknown) { checks.unshift(['unknownAction', { action: 'unknown' }]); } if (args.workId) { checks.push(['diagnose.work', { action: 'diagnose', workId: args.workId }]); } if (args.assetUrl) { checks.push(['diagnose.asset', { action: 'diagnose', assetUrl: args.assetUrl }]); } if (args.connectivity) { checks.push([ 'diagnose.connectivity.getOhDateByTask', { action: 'diagnose', probeEndpoint: 'getOhDateByTask', allowCharge: '1', payload: { workId: 'codex-connectivity-probe', routerName: 'getOhIdentifyMain', }, }, ]); } if (args.baseProbe) { checks.push([ 'diagnoseBase.getOhDateByTask', { action: 'diagnoseBase', endpoint: args.endpoint || 'getOhDateByTask', payload: parsePayload(args.payload) || { workId: 'codex-connectivity-probe', routerName: 'getOhIdentifyMain', }, }, ]); } if (args.candidateBases) { checks.push([ 'diagnose.candidateBases', { action: 'diagnose', probeCandidates: '1', payload: { workId: 'codex-connectivity-probe', routerName: 'getOhIdentifyMain', }, }, ]); } if (args.endpoint) { checks.push([ `diagnose.${args.endpoint}`, { action: 'diagnose', probeEndpoint: args.endpoint, allowCharge: args.allowCharge ? '1' : '0', payload: parsePayload(args.payload), }, ]); } let failed = 0; for (const [name, body] of checks) { const startedAt = Date.now(); try { const result = await call(body); const ok = name === 'unknownAction' ? result?.success === false || Number(result?.code || 0) >= 400 : result?.success !== false && Number(result?.code || 200) < 400; if (!ok) failed += 1; console.log(`${ok ? 'OK' : 'FAIL'} ${name} ${Date.now() - startedAt}ms`); console.log(JSON.stringify(redact(result), null, 2)); } catch (error) { failed += 1; console.log(`FAIL ${name} ${Date.now() - startedAt}ms`); console.log(error?.message || error); } } if (failed) process.exitCode = 1; } async function call(body) { const response = await fetch(FN_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APP_ID, }, body: JSON.stringify({ id: JIMENG_FN_ID, _ApplicationId: APP_ID, ...body, }), }); const text = await response.text(); try { return JSON.parse(text); } catch { return { code: response.status, success: false, error: text }; } } function parseArgs(argv) { const out = {}; const booleanFlags = new Set(['allow-charge', 'skip-unknown', 'connectivity', 'candidate-bases', 'base-probe']); for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; if (arg.startsWith('--')) { const key = arg.slice(2).replace(/-([a-z])/g, (_, c) => c.toUpperCase()); if (booleanFlags.has(arg.slice(2))) { out[key] = true; continue; } out[key] = argv[i + 1] || ''; i += 1; } } return out; } function parsePayload(value) { if (!value) return {}; try { return JSON.parse(value); } catch { throw new Error('--payload 必须是合法 JSON 字符串'); } } function redact(value) { if (Array.isArray(value)) return value.map(redact); if (!value || typeof value !== 'object') return value; const out = {}; for (const [key, raw] of Object.entries(value)) { if (isSecretField(key, raw)) { out[key] = typeof raw === 'boolean' ? raw : '[redacted]'; } else { out[key] = redact(raw); } } return out; } function isSecretField(key, value) { if (typeof value === 'boolean' || typeof value === 'number') return false; if (/tokenSource|tokenConfigured|allowedEndpoints|jimengBaseUrl|parseBaseUrl/i.test(key)) return false; return /authorization|secret|password|accessKey|secretKey/i.test(key) || (/token/i.test(key) && !/Source|Configured|Format/i.test(key)); } main().catch((error) => { console.error(error?.message || error); process.exitCode = 1; });