const FN_URL = 'https://server.fmode.cn/api/functions'; const APP_ID = 'ncloudmaster'; const fn = { manifest: 'VWejNK8E5z', task: 'yL6opHxC4D', history: 'cegZcOyOH0', result: 'XPv6Sym2I6', remix: 'LjcaC94Kno', voice: 'LHBMMcDP4n', quickly: '', proxy: 'wzwnEuAhwb', jimeng: 'WUkf74lVE5', douyin: 'HArHym0smi', douyinInsight: 'pzBTvs6UcE', upload: 'VHS0noRP7Q', authCredit: '', }; const checks = [ ['manifest.list', fn.manifest, { action: 'list' }, true], ['task.list', fn.task, { action: 'list' }, true], ['history.list', fn.history, { action: 'list' }, true], ['result.list', fn.result, { action: 'list' }, true], ['remix.listAll', fn.remix, { action: 'listAll' }, true], ['voice.listProfiles', fn.voice, { action: 'listProfiles' }, true], ['upload.token.probe', fn.upload, { action: 'createUploadToken', filename: 'probe.txt', mimeType: 'text/plain', kind: 'probe' }, true], ['jimeng.unknownAction', fn.jimeng, { action: 'unknown' }, false], ['douyin.unknownRoute', fn.douyin, { action: 'call', route: 'unknown' }, false], ['douyinInsight.authGuard', fn.douyinInsight, { action: 'listTopics' }, false], ['proxy.unknownAction', fn.proxy, { action: 'foo' }, false], ['quickly.configured', fn.quickly, { action: 'query', taskId: 'probe' }, null], ['authCredit.configured', fn.authCredit, { action: 'me' }, null], ]; async function call(id, body) { const response = await fetch(FN_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APP_ID, }, body: JSON.stringify({ id, _ApplicationId: APP_ID, ...body }), }); const text = await response.text(); try { return JSON.parse(text); } catch { return { code: response.status, success: false, error: text }; } } let failed = 0; for (const [name, id, body, expectSuccess] of checks) { if (!id) { console.log(`SKIP ${name}: function id is empty`); continue; } try { const result = await call(id, body); const ok = expectSuccess === null ? true : expectSuccess ? result?.code === 200 && result?.success !== false : result?.code >= 400 || result?.success === false; if (!ok) failed += 1; console.log(`${ok ? 'OK' : 'FAIL'} ${name}: ${JSON.stringify(result).slice(0, 500)}`); } catch (error) { failed += 1; console.log(`FAIL ${name}: ${error?.message || error}`); } } if (failed > 0) { console.error(`Cloud function smoke failed: ${failed}`); process.exit(1); } console.log('Cloud function smoke passed');