server-util.mjs 2.3 KB

123456
  1. import fs from 'node:fs';import {randomBytes} from 'node:crypto';
  2. export const env={...process.env};for(const line of fs.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,'');}
  3. export const base='https://server.xiaoshu.pro',token=env.XIAOSHU_SYNC_OPERATOR_TOKEN;
  4. export async function parse(path,method='GET',body){if(!env.XIAOSHU_MASTER_KEY)throw Error('Authorized configuration missing');const r=await fetch(base+'/parse'+path,{method,headers:{'Content-Type':'application/json','X-Parse-Application-Id':env.XIAOSHU_PARSE_APP_ID,'X-Parse-Master-Key':env.XIAOSHU_MASTER_KEY},body:body?JSON.stringify(body):undefined,signal:AbortSignal.timeout(30000)});const data=await r.json();if(!r.ok||data.error)throw Error('Parse request failed '+r.status);return data;}
  5. export async function operator(){const r=await fetch(base+'/parse/users/me',{headers:{'X-Parse-Application-Id':env.XIAOSHU_PARSE_APP_ID,'X-Parse-Session-Token':token},signal:AbortSignal.timeout(15000)});const user=await r.json();if(!r.ok||!user.objectId)throw Error('Operator session invalid');return user;}
  6. export async function withGateway(source,task){const me=await operator(),path='xiaoshu/system/speed2-'+randomBytes(10).toString('hex');const code=source+`\nasync function handler(request,response){if(request.user?.id!==${JSON.stringify(me.objectId)}||Date.now()>${Date.now()+3600000})return response.status(403).json({success:false});try{return response.json({success:true,data:await run(request.body?.params||{})});}catch(e){return response.status(500).json({success:false,message:e.message});}}`;const row=await parse('/classes/Function','POST',{name:path,path,code,type:'standalone',enabled:true,params:[],paramList:[],respType:'json'});try{return await task(async params=>{const r=await fetch(base+'/api/functions/'+path,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({token,params}),signal:AbortSignal.timeout(180000)});const data=await r.json();if(!r.ok||!data.success)throw Error(String(data.message||'Diagnostic operation failed').slice(0,400));return data.data;},{path,me});}finally{await parse('/classes/Function/'+row.objectId,'DELETE');}}