code wiki / _hdl_build / nx_room_relay_gate.nx

nx_room_relay_gate.nx source

↩ module page · 86 lines · 4129 B

1// nx_room_relay_gate.nx -- proves the sovereign server-relay core (nx_room_relay): 2// 1) roster lists OTHER live peers in a room (not self), correct ids 3// 2) room isolation -- peers in different rooms never see each other 4// 3) frame update -- re-post replaces a peer's latest frame + seq (no dup slot) 5// 4) staleness -- peers past TTL drop out of the roster 6// 5) neg-control -- a ghost peer that never posted is not found 7// Built nx_cc_sovereign -> nxasm_x86 (no gcc, no .sh). Composes with nx_room_stream. 8// license_tier: ORIGINAL 9import "nx_syscalls.nx" 10import "nx_gate_emit_lib.nx" 11import "nx_room_relay.nx" 12import "nx_gate_verdict.nx" 13 14func main() -> i64 { 15 g_puts("nx_room_relay gate (sovereign server-relay core, no WebRTC/STUN/TURN)\n" as *u8) 16 var pass: i64 = 0; var total: i64 = 0 17 18 let N: i64 = 8 19 let SB: i64 = 512 20 let st: *i64 = sys_mmap((2 + 5*N) * 8) as *i64 21 let arena: *u8 = sys_mmap(N * SB) 22 rr_init(st, N, SB) 23 24 // distinct frame payloads per peer 25 let fa: *u8 = sys_mmap(64); var i: i64=0; while i<20 { fa[i]=(100+i) as u8; i=i+1 } 26 let fb: *u8 = sys_mmap(64); i=0; while i<20 { fb[i]=(40+i) as u8; i=i+1 } 27 let fc: *u8 = sys_mmap(64); i=0; while i<20 { fc[i]=(7+i) as u8; i=i+1 } 28 let fb2: *u8 = sys_mmap(64); i=0; while i<20 { fb2[i]=(200-i) as u8; i=i+1 } 29 let fd: *u8 = sys_mmap(64); i=0; while i<20 { fd[i]=(3*i) as u8; i=i+1 } 30 31 let ROOM_A: i64 = 0xAAA111 32 let ROOM_B: i64 = 0xBBB222 33 34 rr_post(st, arena, ROOM_A, 100, 1000, 1, fa, 20) 35 rr_post(st, arena, ROOM_A, 101, 1000, 1, fb, 20) 36 rr_post(st, arena, ROOM_A, 102, 1000, 1, fc, 20) 37 38 // 1) roster from peer 100 in room A -> [101,102] 39 let out: *i64 = sys_mmap(N * 8) as *i64 40 var c: i64 = rr_roster(st, ROOM_A, 100, 1000, 8000, out) 41 var r1: i64 = 1 42 if c != 2 { r1 = 0 } 43 if out[0] != 101 { r1 = 0 } 44 if out[1] != 102 { r1 = 0 } 45 pass = pass + g_check("roster lists other live peers (101,102), not self" as *u8, r1); total=total+1 46 47 // 2) room isolation -- peer 200 in room B; A unchanged, B alone 48 rr_post(st, arena, ROOM_B, 200, 1000, 1, fd, 20) 49 let ca: i64 = rr_roster(st, ROOM_A, 100, 1000, 8000, out) 50 let cb: i64 = rr_roster(st, ROOM_B, 200, 1000, 8000, out) 51 var r2: i64 = 1 52 if ca != 2 { r2 = 0 } 53 if cb != 0 { r2 = 0 } 54 pass = pass + g_check("room isolation (A still 2, B alone)" as *u8, r2); total=total+1 55 56 // 3) frame update -- re-post peer 101 with new seq + new frame; no dup slot 57 rr_post(st, arena, ROOM_A, 101, 1100, 5, fb2, 20) 58 let c3: i64 = rr_roster(st, ROOM_A, 100, 1100, 8000, out) // still exactly 2 (no dup) 59 let s101: i64 = rr_live(st, ROOM_A, 101, 1100, 8000) 60 var r3: i64 = 1 61 if c3 != 2 { r3 = 0 } 62 if s101 < 0 { r3 = 0 } else { 63 if rr_seq(st, s101) != 5 { r3 = 0 } 64 var k: i64 = 0; while k < 20 { if arena[s101*SB + k] != fb2[k] { r3 = 0 } k = k + 1 } 65 } 66 pass = pass + g_check("re-post replaces frame+seq, no duplicate slot" as *u8, r3); total=total+1 67 68 // 4) staleness -- advance now past TTL; everyone drops out 69 let c4: i64 = rr_roster(st, ROOM_A, 100, 20000, 8000, out) 70 pass = pass + g_check("stale peers (past TTL) drop from roster" as *u8, c4 == 0); total=total+1 71 72 // 5) neg-control -- ghost peer never posted 73 let ghost: i64 = rr_find(st, ROOM_A, 999) 74 pass = pass + g_check("ghost peer not found (neg-control)" as *u8, ghost < 0); total=total+1 75 76 g_puts("---- room-relay gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 77 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 78 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 79 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 80 let ctr__dry: *i64 = gv_ctr() 81 ctr__dry[0] = pass 82 ctr__dry[1] = total 83 let rc__dry: i64 = gv_verdict("ROOM-RELAY-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 84 sys_exit(rc__dry) 85 return rc__dry 86}