3 lines
1.3 KiB
JavaScript
3 lines
1.3 KiB
JavaScript
import fs from 'node:fs';import path from 'node:path';import crypto from 'node:crypto';
|
|
const req=(v,e)=>{if(!v)throw Error(e);},hex=v=>typeof v==='string'&&/^[a-f0-9]{64}$/.test(v),text=(v,n=1000)=>typeof v==='string'&&v.trim()&&v.length<=n,digest=v=>crypto.createHash('sha256').update(JSON.stringify(v)).digest('hex');
|
|
export class WorldStateStore{constructor(file){req(path.isAbsolute(file),'world_path');this.file=file;}validate(x){req(x?.schema==='guanghu.fifth-domain-runtime-navigation-state/v1','world_schema');req(Array.isArray(x.nodes)&&x.nodes.length<=100,'world_nodes');req(/^[a-f0-9]{40}$/.test(x.source_commit||'')&&hex(x.tcs_root_freshness)&&x.fifth_domain_private===true,'world_identity');for(const n of x.nodes)req(text(n.id,128)&&text(n.kind,128)&&text(n.state,200)&&text(n.summary)&&text(n.route,500),'world_node');req(Buffer.byteLength(JSON.stringify(x))<=64000,'world_size');return structuredClone(x);}status(){if(!fs.existsSync(this.file))return{outcome:'FAIL',state:'MISSING'};const v=this.validate(JSON.parse(fs.readFileSync(this.file)));return{...v,outcome:'PASS',sha256:digest(v),content_bodies_stored:false};}resolve(id){const c=this.status(),n=c.nodes?.find(x=>x.id===id);return n?{outcome:'PASS',result:n,source_commit:c.source_commit,tcs_root_freshness:c.tcs_root_freshness}:{outcome:'FAIL',state:'UNKNOWN_ID_NO_GUESS',requested:id};}}
|