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}