2023-01-11 06:38:48 +00:00
|
|
|
console.log("BareRTC!");
|
|
|
|
|
|
|
|
const app = Vue.createApp({
|
|
|
|
delimiters: ['[[', ']]'],
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
busy: false,
|
|
|
|
|
2023-01-27 04:34:58 +00:00
|
|
|
channel: "lobby",
|
|
|
|
username: "", //"test",
|
2023-01-11 06:38:48 +00:00
|
|
|
message: "",
|
|
|
|
|
|
|
|
// WebSocket connection.
|
|
|
|
ws: {
|
|
|
|
conn: null,
|
|
|
|
connected: false,
|
|
|
|
},
|
|
|
|
|
2023-01-27 04:34:58 +00:00
|
|
|
// Who List for the room.
|
|
|
|
whoList: [],
|
|
|
|
|
|
|
|
// My video feed.
|
|
|
|
webcam: {
|
|
|
|
busy: false,
|
|
|
|
active: false,
|
|
|
|
elem: null, // <video id="localVideo"> element
|
|
|
|
stream: null, // MediaStream object
|
|
|
|
},
|
|
|
|
|
2023-01-11 06:38:48 +00:00
|
|
|
// Chat history.
|
|
|
|
history: [],
|
2023-01-27 04:34:58 +00:00
|
|
|
historyScrollbox: null,
|
2023-01-11 06:38:48 +00:00
|
|
|
DMs: {},
|
|
|
|
|
|
|
|
loginModal: {
|
|
|
|
visible: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
mounted() {
|
2023-01-27 04:34:58 +00:00
|
|
|
this.webcam.elem = document.querySelector("#localVideo");
|
|
|
|
this.historyScrollbox = document.querySelector("#chatHistory");
|
|
|
|
|
|
|
|
this.ChatServer("Welcome to BareRTC!")
|
2023-01-11 06:38:48 +00:00
|
|
|
|
|
|
|
if (!this.username) {
|
|
|
|
this.loginModal.visible = true;
|
2023-01-27 04:34:58 +00:00
|
|
|
} else {
|
|
|
|
this.signIn();
|
2023-01-11 06:38:48 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
signIn() {
|
|
|
|
this.loginModal.visible = false;
|
|
|
|
this.dial();
|
|
|
|
},
|
|
|
|
|
|
|
|
sendMessage() {
|
|
|
|
if (!this.message) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this.ws.connected) {
|
2023-01-27 04:34:58 +00:00
|
|
|
this.ChatClient("You are not connected to the server.");
|
2023-01-11 06:38:48 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.debug("Send message: %s", this.message);
|
|
|
|
this.ws.conn.send(JSON.stringify({
|
|
|
|
action: "message",
|
|
|
|
message: this.message,
|
|
|
|
}));
|
|
|
|
|
|
|
|
this.message = "";
|
|
|
|
},
|
|
|
|
|
2023-01-27 04:34:58 +00:00
|
|
|
// Sync the current user state (such as video broadcasting status) to
|
|
|
|
// the backend, which will reload everybody's Who List.
|
|
|
|
sendMe() {
|
|
|
|
this.ws.conn.send(JSON.stringify({
|
|
|
|
action: "me",
|
|
|
|
videoActive: this.webcam.active,
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
onMe(msg) {
|
|
|
|
// We have had settings pushed to us by the server, such as a change
|
|
|
|
// in our choice of username.
|
|
|
|
if (this.username != msg.username) {
|
|
|
|
this.ChatServer(`Your username has been changed to ${msg.username}.`);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.ChatClient(`User sync from backend: ${JSON.stringify(msg)}`);
|
|
|
|
},
|
|
|
|
|
|
|
|
// Handle messages sent in chat.
|
|
|
|
onMessage(msg) {
|
|
|
|
this.pushHistory({
|
|
|
|
username: msg.username,
|
|
|
|
message: msg.message,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2023-01-11 06:38:48 +00:00
|
|
|
// Dial the WebSocket connection.
|
|
|
|
dial() {
|
|
|
|
const conn = new WebSocket(`ws://${location.host}/ws`);
|
|
|
|
|
|
|
|
conn.addEventListener("close", ev => {
|
|
|
|
this.ws.connected = false;
|
2023-01-27 04:34:58 +00:00
|
|
|
this.ChatClient(`WebSocket Disconnected code: ${ev.code}, reason: ${ev.reason}`);
|
2023-01-11 06:38:48 +00:00
|
|
|
|
|
|
|
if (ev.code !== 1001) {
|
2023-01-27 04:34:58 +00:00
|
|
|
this.ChatClient("Reconnecting in 1s");
|
2023-01-11 06:38:48 +00:00
|
|
|
setTimeout(this.dial, 1000);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
conn.addEventListener("open", ev => {
|
|
|
|
this.ws.connected = true;
|
2023-01-27 04:34:58 +00:00
|
|
|
this.ChatClient("Websocket connected!");
|
2023-01-11 06:38:48 +00:00
|
|
|
|
|
|
|
// Tell the server our username.
|
|
|
|
this.ws.conn.send(JSON.stringify({
|
|
|
|
action: "login",
|
|
|
|
username: this.username,
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
|
|
|
|
conn.addEventListener("message", ev => {
|
|
|
|
console.log(ev);
|
|
|
|
if (typeof ev.data !== "string") {
|
|
|
|
console.error("unexpected message type", typeof ev.data);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let msg = JSON.parse(ev.data);
|
2023-01-27 04:34:58 +00:00
|
|
|
switch (msg.action) {
|
|
|
|
case "who":
|
|
|
|
console.log("Got the Who List: %s", msg);
|
|
|
|
this.whoList = msg.whoList;
|
|
|
|
break;
|
|
|
|
case "me":
|
|
|
|
console.log("Got a self-update: %s", msg);
|
|
|
|
this.onMe(msg);
|
|
|
|
break;
|
|
|
|
case "message":
|
|
|
|
this.onMessage(msg);
|
|
|
|
break;
|
|
|
|
case "presence":
|
|
|
|
this.pushHistory({
|
|
|
|
action: msg.action,
|
|
|
|
username: msg.username,
|
|
|
|
message: msg.message,
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
console.error("Unexpected action: %s", JSON.stringify(msg));
|
|
|
|
}
|
2023-01-11 06:38:48 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
this.ws.conn = conn;
|
|
|
|
},
|
|
|
|
|
2023-01-27 04:34:58 +00:00
|
|
|
// Start broadcasting my webcam.
|
|
|
|
startVideo() {
|
|
|
|
if (this.webcam.busy) return;
|
|
|
|
this.webcam.busy = true;
|
|
|
|
|
|
|
|
navigator.mediaDevices.getUserMedia({
|
|
|
|
audio: true,
|
|
|
|
video: true,
|
|
|
|
}).then(stream => {
|
|
|
|
this.webcam.active = true;
|
|
|
|
this.webcam.elem.srcObject = stream;
|
|
|
|
this.webcam.stream = stream;
|
|
|
|
|
|
|
|
// Tell backend the camera is ready.
|
|
|
|
this.sendMe();
|
|
|
|
}).catch(err => {
|
|
|
|
this.ChatClient(`Webcam error: ${err}`);
|
|
|
|
}).finally(() => {
|
|
|
|
this.webcam.busy = false;
|
|
|
|
})
|
|
|
|
},
|
|
|
|
|
|
|
|
// Stop broadcasting.
|
|
|
|
stopVideo() {
|
|
|
|
this.webcam.elem.srcObject = null;
|
|
|
|
this.webcam.stream = null;
|
|
|
|
this.webcam.active = false;
|
|
|
|
|
|
|
|
// Tell backend our camera state.
|
|
|
|
this.sendMe();
|
|
|
|
},
|
|
|
|
|
|
|
|
pushHistory({username, message, action="message", isChatServer, isChatClient}) {
|
2023-01-11 06:38:48 +00:00
|
|
|
this.history.push({
|
2023-01-27 04:34:58 +00:00
|
|
|
action: action,
|
2023-01-11 06:38:48 +00:00
|
|
|
username: username,
|
|
|
|
message: message,
|
2023-01-27 04:34:58 +00:00
|
|
|
isChatServer,
|
|
|
|
isChatClient,
|
2023-01-11 06:38:48 +00:00
|
|
|
});
|
2023-01-27 04:34:58 +00:00
|
|
|
this.scrollHistory();
|
|
|
|
},
|
|
|
|
|
|
|
|
scrollHistory() {
|
|
|
|
window.requestAnimationFrame(() => {
|
|
|
|
this.historyScrollbox.scroll({
|
|
|
|
top: this.historyScrollbox.scrollHeight,
|
|
|
|
behavior: 'smooth',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
// Send a chat message as ChatServer
|
|
|
|
ChatServer(message) {
|
|
|
|
this.pushHistory({
|
|
|
|
username: "ChatServer",
|
|
|
|
message: message,
|
|
|
|
isChatServer: true,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
ChatClient(message) {
|
|
|
|
this.pushHistory({
|
|
|
|
username: "ChatClient",
|
|
|
|
message: message,
|
|
|
|
isChatClient: true,
|
|
|
|
});
|
|
|
|
},
|
2023-01-11 06:38:48 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
app.mount("#BareRTC-App");
|