Batch authoritative snapshots and bound rejected retreat fallback
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import {env} from 'cloudflare:workers';
|
||||
import {z} from 'zod';
|
||||
import {requireAleBridge} from '@/core/ale-auth';
|
||||
import {recordAleEvent} from '@/core/ale-store';
|
||||
import {queueSocialEncounter} from '@/core/conversation-store';
|
||||
import {D1Store} from '@/core/store';
|
||||
import {applyAuthoritativeAleSnapshots} from '@/core/service';
|
||||
import type {RuntimeConfig} from '@/core/types';
|
||||
const schema=z.object({payloads:z.array(z.record(z.unknown())).min(1).max(64)}).strict();
|
||||
export async function POST(request:Request){
|
||||
try{
|
||||
requireAleBridge(request,env as unknown as RuntimeConfig);
|
||||
const text=await request.text();
|
||||
if(text.length>512000)return Response.json({error:'Snapshot batch too large'},{status:413});
|
||||
const {payloads}=schema.parse(JSON.parse(text));
|
||||
const result=await applyAuthoritativeAleSnapshots(new D1Store(),payloads);
|
||||
for(const payload of payloads){
|
||||
await recordAleEvent(env.DB!,'player.snapshot',payload);
|
||||
if(payload.roster===true)await queueSocialEncounter(env.DB!,payload);
|
||||
}
|
||||
return Response.json(result);
|
||||
}catch(e){
|
||||
const error=e instanceof Error?e.message:'Snapshot batch failure';
|
||||
return Response.json({error},{status:error.startsWith('Unauthorized')?401:400});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user