code wiki / _hdl_build / nx_connect_call.nx
nx_connect_call.nx source
↩ module page · 149 lines · 7230 B
1// nx_connect_call.nx -- FUNCTIONALITY rung: call SESSION SIGNALING (the control plane of voice/
2// video calls) + group call rooms. This is the gateable LOGIC of calling -- the media plane
3// (audio/video codec + transport) is a separate substrate and stays ABSENT in the census until built.
4//
5// 1:1 call state machine (valid transitions ONLY): IDLE -> RINGING -> CONNECTED -> ENDED, with
6// RINGING -> REJECTED (callee) / CANCELLED (caller) / and illegal jumps refused. Actor rules: only
7// the callee accepts/rejects; only the caller cancels; either ends a connected call. SAFETY by
8// construction: you cannot cold-call a non-contact and cannot call a BLOCKED user (anti-harassment).
9// Group rooms: host create / join / leave / host-only end. 7 checks incl. negative controls.
10// 100% sovereign. license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12
13const C_IDLE: i64 = 0
14const C_RINGING: i64 = 1
15const C_CONNECTED:i64 = 2
16const C_ENDED: i64 = 3
17const C_REJECTED: i64 = 4
18const C_CANCELLED:i64 = 5
19// call layout: c[0]=state c[1]=caller c[2]=callee
20
21func sw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
22func sn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 }
23
24// rel < 0 means "no relationship" (cannot cold-call); blocked==1 means anti-harassment block
25func call_initiate(c: *i64, caller: i64, callee: i64, rel: i64, blocked: i64) -> i64 {
26 if c[0]!=C_IDLE { return 0 } // already in a call
27 if rel<0 { return 0 } // no relationship -> no cold-calling strangers
28 if blocked==1 { return 0 } // blocked -> anti-harassment by construction
29 c[0]=C_RINGING; c[1]=caller; c[2]=callee
30 return 1
31}
32func call_accept(c: *i64, actor: i64) -> i64 {
33 if c[0]!=C_RINGING { return 0 }
34 if actor!=c[2] { return 0 } // only the callee may accept
35 c[0]=C_CONNECTED; return 1
36}
37func call_reject(c: *i64, actor: i64) -> i64 {
38 if c[0]!=C_RINGING { return 0 }
39 if actor!=c[2] { return 0 } // only the callee may reject
40 c[0]=C_REJECTED; return 1
41}
42func call_cancel(c: *i64, actor: i64) -> i64 {
43 if c[0]!=C_RINGING { return 0 }
44 if actor!=c[1] { return 0 } // only the caller may cancel
45 c[0]=C_CANCELLED; return 1
46}
47func call_end(c: *i64, actor: i64) -> i64 {
48 if c[0]!=C_CONNECTED { return 0 } // can only end a CONNECTED call
49 if actor!=c[1] { if actor!=c[2] { return 0 } } // either party
50 c[0]=C_ENDED; return 1
51}
52
53// group call room: r[0]=host r[1]=count ; mem = participant uids
54func room_create(r: *i64, mem: *i64, host: i64) -> i64 { r[0]=host; r[1]=1; mem[0]=host; return 0 }
55func room_find(r: *i64, mem: *i64, uid: i64) -> i64 { var i: i64=0; while i<r[1] { if mem[i]==uid { return i } i=i+1 } return 0-1 }
56func room_join(r: *i64, mem: *i64, uid: i64) -> i64 { if room_find(r,mem,uid)>=0 { return 1 } let c: i64=r[1]; mem[c]=uid; r[1]=c+1; return 1 }
57func room_leave(r: *i64, mem: *i64, uid: i64) -> i64 { let idx: i64=room_find(r,mem,uid); if idx<0 { return 0 } let c: i64=r[1]; mem[idx]=mem[c-1]; r[1]=c-1; return 1 }
58func room_end(r: *i64, mem: *i64, actor: i64) -> i64 { if actor!=r[0] { return 0 } r[1]=0; return 1 }
59
60func tcheck(pass: i64, label: *u8, fails: *i64) -> i64 {
61 sw(" " as *u8); sw(label); sw(": " as *u8)
62 if pass==1 { sw("PASS\n" as *u8) } else { sw("FAIL\n" as *u8); fails[0]=fails[0]+1 }
63 return 0
64}
65
66func main() -> i64 {
67 let fails: *i64 = sys_mmap(16) as *i64
68 fails[0]=0
69 let c: *i64 = sys_mmap(32) as *i64
70
71 // T1 happy path
72 c[0]=C_IDLE
73 let i1: i64 = call_initiate(c, 1, 2, 0, 0)
74 let s_ring: i64 = c[0]
75 let a1: i64 = call_accept(c, 2)
76 let s_conn: i64 = c[0]
77 let e1: i64 = call_end(c, 1)
78 let s_end: i64 = c[0]
79
80 // T2 reject
81 c[0]=C_IDLE; call_initiate(c,1,2,0,0)
82 let rj: i64 = call_reject(c, 2); let s_rej: i64 = c[0]
83
84 // T3 cancel (only caller)
85 c[0]=C_IDLE; call_initiate(c,1,2,0,0)
86 let cc_callee: i64 = call_cancel(c, 2) // callee cannot cancel
87 let cc_caller: i64 = call_cancel(c, 1) // caller cancels
88 let s_can: i64 = c[0]
89
90 // T4 illegal transitions refused
91 c[0]=C_IDLE
92 let ill_accept_idle: i64 = call_accept(c, 2) // accept with no ringing call
93 call_initiate(c,1,2,0,0)
94 let ill_end_ring: i64 = call_end(c, 1) // end a non-connected call
95 let dbl_init: i64 = call_initiate(c,1,2,0,0) // initiate while already ringing
96
97 // T5 actor enforcement
98 c[0]=C_IDLE; call_initiate(c,1,2,0,0)
99 let caller_accepts_own: i64 = call_accept(c, 1) // caller cannot accept own call
100 let s_still_ring: i64 = c[0]
101
102 // T6 safety: no cold-call + no calling a blocked user
103 c[0]=C_IDLE
104 let no_rel: i64 = call_initiate(c, 1, 9, 0-1, 0) // no relationship
105 let blk: i64 = call_initiate(c, 1, 2, 0, 1) // blocked
106 let ok_call: i64 = call_initiate(c, 1, 2, 0, 0) // friend, not blocked
107
108 // T7 group room
109 let r: *i64 = sys_mmap(64) as *i64
110 let rm: *i64 = sys_mmap(512) as *i64
111 room_create(r, rm, 1)
112 room_join(r,rm,2); room_join(r,rm,3); room_join(r,rm,4)
113 let c4: i64 = r[1]
114 room_leave(r,rm,3)
115 let c3: i64 = r[1]
116 let end_nonhost: i64 = room_end(r,rm,2)
117 let end_host: i64 = room_end(r,rm,1)
118
119 sw("=== nx_connect_call -- call session signaling + group rooms (control plane) ===\n" as *u8)
120 sw(" 1:1 lifecycle states: ring=" as *u8); sn(s_ring); sw(" conn=" as *u8); sn(s_conn); sw(" end=" as *u8); sn(s_end); sw("\n" as *u8)
121 sw("-- gate checks --\n" as *u8)
122
123 var t1: i64=0; if i1==1 { if s_ring==C_RINGING { if a1==1 { if s_conn==C_CONNECTED { if e1==1 { if s_end==C_ENDED { t1=1 } } } } } }
124 tcheck(t1, "T1 happy path IDLE->RINGING->CONNECTED->ENDED" as *u8, fails)
125
126 var t2: i64=0; if rj==1 { if s_rej==C_REJECTED { t2=1 } }
127 tcheck(t2, "T2 callee reject -> REJECTED" as *u8, fails)
128
129 var t3: i64=0; if cc_callee==0 { if cc_caller==1 { if s_can==C_CANCELLED { t3=1 } } }
130 tcheck(t3, "T3 cancel is caller-only -> CANCELLED" as *u8, fails)
131
132 var t4: i64=0; if ill_accept_idle==0 { if ill_end_ring==0 { if dbl_init==0 { t4=1 } } }
133 tcheck(t4, "T4 illegal transitions refused (state machine enforced)" as *u8, fails)
134
135 var t5: i64=0; if caller_accepts_own==0 { if s_still_ring==C_RINGING { t5=1 } }
136 tcheck(t5, "T5 actor enforcement (caller cannot accept own call)" as *u8, fails)
137
138 var t6: i64=0; if no_rel==0 { if blk==0 { if ok_call==1 { t6=1 } } }
139 tcheck(t6, "T6 SAFETY no cold-call + no calling a blocked user (NEG-CTRL)" as *u8, fails)
140
141 var t7: i64=0; if c4==4 { if c3==3 { if end_nonhost==0 { if end_host==1 { if r[1]==0 { t7=1 } } } } }
142 tcheck(t7, "T7 group room join/leave/host-only-end" as *u8, fails)
143
144 sw(" fails=" as *u8); sn(fails[0]); sw("\n" as *u8)
145 if fails[0]==0 { sw("VERDICT: GREEN (call signaling state machine + rooms correct; anti-harassment by construction)\n" as *u8); sys_exit(0) }
146 sw("VERDICT: RED\n" as *u8)
147 sys_exit(1)
148 return 1
149}