[wip] now display user's camera

next tricky thing is connecting users
This commit is contained in:
2026-02-24 10:40:43 -08:00
parent 484eea92e4
commit 079009a13e
6 changed files with 192 additions and 184 deletions
+28 -101
View File
@@ -10,14 +10,6 @@
* @module
*/
type state =
{whoami: string,
roster: Array<string>};
let st: state =
{whoami: "",
roster: []};
main();
async function
@@ -25,103 +17,38 @@ main
()
: Promise<void>
{
// start websocket immediately
let ws: WebSocket;
let init = document.getElementById('init') as HTMLDivElement;
let init_join = document.getElementById('init-join') as HTMLButtonElement;
// handle button click
init_join.addEventListener('click',
function() {
init.hidden = true;
document.getElementById('run')!.hidden = false;
ws = new WebSocket('/ws/webrtc');
ws.onopen = function(e) { console.log('ws open'); };
ws.onclose = function(e) { console.warn('ws closed'); };
ws.onerror = function(e) { console.error('ws error:', e); };
ws.onmessage =
function(e) {
// console.log('ws message:', e.data);
let message = JSON.parse(e.data) as ws_msg;
handle_ws_msg(message);
};
}
);
}
type ws_msg = ["whoami", string]
| ["roster", Array<string>];
function
handle_ws_msg
(message: ws_msg)
: void
{
console.log('message from server:', message);
switch(message[0]) {
case "whoami":
st.whoami = message[1];
break;
case "roster":
st.roster = (message[1] as Array<string>);
break;
default:
console.warn("unknown message", message);
}
render_state();
console.log('peepy');
let video : MediaStream = await getUserCamera();
console.log('poopy');
console.log('poopu');
let moi = document.getElementById('me') as HTMLVideoElement;
moi.srcObject = video;
console.log('poopa');
}
function
ws_send_json
(ws : WebSocket,
x : any)
: void
{
let s: string = JSON.stringify(x, undefined, 4);
console.log('sending:\n', s);
ws.send(s);
}
function
render_state
/**
* Try to get the user's camera
*
* tries to get screenshare if user camera not available for whatever reason
*
* chimps out if
* - not on https
* - user says no
*/
async function
getUserCamera
()
: void
: Promise<MediaStream>
{
console.log('st', st);
// whoami
document.getElementById('whoami')!.innerText = st.whoami;
//
let roster_ul = document.getElementById('roster-ul') as HTMLUListElement;
let newChildren : Array<HTMLElement> = [];
for (let nick of st.roster) {
if (!(nick === st.whoami)) {
let li = nickkk(nick);
newChildren.push(li);
}
if (!(navigator.mediaDevices)) {
console.error('navigator.mediaDevices is null; user not on https or something');
}
roster_ul.replaceChildren(...newChildren);
}
function
nickkk
(nick: string)
: HTMLElement
{
let li = document.createElement('li');
li.innerText += nick;
li.innerText += ' ';
let call_a = document.createElement('button');
call_a.innerText = 'call';
li.appendChild(call_a);
return li;
let availableDevices: Array<MediaDeviceInfo> =
await navigator.mediaDevices.enumerateDevices();
console.log(availableDevices);
return await navigator.mediaDevices.getUserMedia({video: true, audio: false});
// return await navigator.mediaDevices.getDisplayMedia();
}