code wiki / (root) / nx_cli_meet.nx

nx_cli_meet.nx source

↩ module page · 112 lines · 3781 B

1// nx_cli_meet.nx -- terminal-only conferencing consumer. 2// 3// Audio + chat composed into a CLI-friendly bundle. No video. 4// Designed to run from `ssh elderwesto@nishifamily.com` and let the 5// operator drop into an audio + text channel without a browser. 6// 7// Same OOP pattern as nx_call but simpler -- no per-call peer 8// tracking, just a session pair the caller can poll. 9 10// nx_safety_envelope: 11// intended_use: headless / terminal conferencing consumer 12// sil_target: SIL2 13// evidence: composes nx_audio_session + nx_chat_session 14// verdict: NOT_YET_EVALUATED -- pending smoke 15 16import "nx_syscalls_x86_64.nx" 17import "nx_media_session.nx" 18import "nx_audio_session.nx" 19import "nx_chat_ring.nx" 20import "nx_chat_session.nx" 21 22struct nx_cli_meet { 23 audio: *nx_audio_session, 24 chat: *nx_chat_session, 25} 26 27const NX_CLI_MEET_BYTES: i64 = 16 28 29func nx_cli_meet_new(out: *nx_cli_meet, 30 audio: *nx_audio_session, 31 chat: *nx_chat_session) -> i64 { 32 if audio as i64 == 0 { return -1 } 33 if chat as i64 == 0 { return -1 } 34 out.audio = audio 35 out.chat = chat 36 return 0 37} 38 39func nx_cli_meet_open(m: *nx_cli_meet) -> i64 { 40 let amss: *nx_media_session = m.audio as *nx_media_session 41 let arc: i64 = nx_media_session_open(amss) 42 if arc != 0 { return arc } 43 let cmss: *nx_media_session = m.chat as *nx_media_session 44 return nx_media_session_open(cmss) 45} 46 47func nx_cli_meet_close(m: *nx_cli_meet) -> i64 { 48 let amss: *nx_media_session = m.audio as *nx_media_session 49 nx_media_session_close(amss) 50 let cmss: *nx_media_session = m.chat as *nx_media_session 51 nx_media_session_close(cmss) 52 return 0 53} 54 55// Render the chat log to fd (typically stdout) one message per line: 56// "<seq> <peer_id>: <text>\n" 57// Returns number of messages rendered. 58func nx_cli_meet_render_chat(m: *nx_cli_meet, fd: i64) -> i64 { 59 let count: i64 = nx_chat_session_count(m.chat) 60 let line: *u8 = sys_mmap(512) 61 var i: i64 = 0 62 while i < count { 63 let s: *ChatSlot = nx_chat_session_get_at(m.chat, i) 64 if s as i64 != 0 { 65 // Format: "<seq> <peer>: " followed by text. 66 var off: i64 = 0 67 // seq as decimal (up to 6 digits) 68 var nv: i64 = s.seq 69 var digits: i64 = 0 70 let tmp: *u8 = sys_mmap(8) 71 if nv == 0 { tmp[0]=48; digits=1 } 72 while nv > 0 { 73 tmp[digits] = ((nv % 10) + 48) as u8 74 nv = nv / 10 75 digits = digits + 1 76 } 77 var d: i64 = digits 78 while d > 0 { 79 line[off] = tmp[d - 1] 80 off = off + 1 81 d = d - 1 82 } 83 line[off] = 32; off = off + 1 // ' ' 84 // peer as decimal 85 nv = s.peer_id 86 digits = 0 87 if nv == 0 { tmp[0]=48; digits=1 } 88 while nv > 0 { 89 tmp[digits] = ((nv % 10) + 48) as u8 90 nv = nv / 10 91 digits = digits + 1 92 } 93 d = digits 94 while d > 0 { 95 line[off] = tmp[d - 1] 96 off = off + 1 97 d = d - 1 98 } 99 line[off] = 58; off = off + 1 // ':' 100 line[off] = 32; off = off + 1 // ' ' 101 // text body 102 let n_txt: i64 = nx_chat_session_copy_text(m.chat, s, 103 (line as i64 + off) as *u8, 104 512 - off) 105 if n_txt > 0 { off = off + n_txt } 106 line[off] = 10; off = off + 1 // '\n' 107 sys_write(fd, line, off) 108 } 109 i = i + 1 110 } 111 return count 112}