#!/usr/bin/env node // Read-only baseline. Never creates accounts/functions or changes production data. import {readFileSync,writeFileSync,mkdirSync} from 'node:fs'; import {createHash} from 'node:crypto'; const env={...process.env}; for(const line of readFileSync('/Users/mac/.config/xiaoshu/legacy-sync-nightly.env','utf8').split('\n')){ const m=line.match(/^(?:export\s+)?(XIAOSHU_[A-Z0-9_]+)=(.*)$/);if(m&&!env[m[1]])env[m[1]]=m[2].replace(/^['"]|['"]$/g,''); } const base='https://server.xiaoshu.pro',report={at:new Date().toISOString(),readOnly:true,functions:[],samples:[]}; try{ const paths=['xiaoshu/ops/gateway-v3','xiaoshu/ops/gateway','xiaoshu/app/gateway']; const response=await fetch(base+'/parse/classes/Function?'+new URLSearchParams({where:JSON.stringify({path:{$in:paths}}),keys:'path,code,updatedAt',limit:'20'}),{headers:{'X-Parse-Application-Id':env.XIAOSHU_PARSE_APP_ID,...(env.XIAOSHU_MASTER_KEY?{'X-Parse-Master-Key':env.XIAOSHU_MASTER_KEY}:{'X-Parse-Session-Token':env.XIAOSHU_SYNC_OPERATOR_TOKEN})},signal:AbortSignal.timeout(15_000)}); const data=await response.json();if(!response.ok)report.definitionReadStatus=response.status;report.functions=(data.results||[]).map(r=>({path:r.path,updatedAt:r.updatedAt,sha256:createHash('sha256').update(r.code||'').digest('hex'),isolatedRuntime:r.code?.includes('XIAOSHU_ISOLATED_RUNTIME_COMPAT_V1')})); for(let i=0;i<10;i++){ const start=performance.now();const r=await fetch(base+'/api/functions/xiaoshu/ops/gateway-v3',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({token:env.XIAOSHU_SYNC_OPERATOR_TOKEN,params:{operation:'ops/lessons/list',page:1,pageSize:20}}),signal:AbortSignal.timeout(20_000)}); const body=await r.text();let json;try{json=JSON.parse(body);}catch{} report.samples.push({ms:performance.now()-start,status:r.status,success:json?.success===true,bytes:Buffer.byteLength(body),items:json?.data?.items?.length,total:json?.data?.total}); if(!r.ok||!json?.success)break; } }catch(e){report.error=e.name==='TimeoutError'?'timeout':String(e.message).slice(0,100);} const times=report.samples.filter(s=>s.success).map(s=>s.ms).sort((a,b)=>a-b);report.summary={runs:times.length,p50:times[Math.ceil(times.length*.5)-1],p75:times[Math.ceil(times.length*.75)-1],p95:times[Math.ceil(times.length*.95)-1]}; mkdirSync('perf/cloud-concurrency-2026-11-15',{recursive:true});writeFileSync('perf/cloud-concurrency-2026-11-15/production-baseline.json',JSON.stringify(report,null,2));console.log(JSON.stringify(report,null,2));