Persil/src/main.js

113 lines
3.7 KiB
JavaScript

import connect from "mumble-client-websocket"
import MicrophoneStream from 'microphone-stream'
import messages from './Messages.js'
import users from './Users.js'
var handleAudio = (data) => {}
function raiseError(error) {
console.log(error)
document.querySelector('#page-loader').classList.add('invisible')
document.querySelector('main').classList.add('invisible')
document.querySelector('#error').classList.remove('invisible')
document.querySelector('#error_msg').innerText = error
throw error;
}
function initVoice (onData) {
return window.navigator.mediaDevices.getUserMedia({ audio: true }).then((userMedia) => {
// MicrophoneStream is maybe not nescessary
var micStream = new MicrophoneStream(userMedia, { objectMode: true, bufferSize: 1024 })
micStream.on('data', data => {
onData(Buffer.from(data))
})
return userMedia
})
}
function connectToMumble(micStream)
{
var AudioContext = window.AudioContext || window.webkitAudioContext;
var ctx = new AudioContext();
var _micNode = ctx.createMediaStreamSource(micStream)
var _delayNode = ctx.createDelay()
var _delayNode.delayTime.value = 0.15
var _delayedMicNode = ctx.createMediaStreamDestination()
const name = document.querySelector('#login__name').value
connect('wss://room.fede.re/ws:443', {
username: name,
webrtc: {
enabled: true,
required: true,
mic: micStream,
audioContext: ctx,
iceServers: [{
urls: "stun:meet-jit-si-turnrelay.jitsi.net:443"
}]
}
}, function (err, client) {
if (err) {
raiseError(err)
}
function sendMessage(event) {
const message = document.querySelector('#input_message').value
client.self.channel.sendMessage(message)
messages.add(message,"You")
document.querySelector('#input_message').value = null
event.preventDefault()
}
console.log(client)
document.querySelector('#page-loader').classList.add('invisible')
document.querySelector('main').classList.remove('invisible')
document.querySelector('#send_message').addEventListener("submit", sendMessage);
var outbound = client.createVoiceStream()
handleAudio = (data) => {
// not really nescessary, should work without it
// see https://github.com/Johni0702/mumble-client/blob/f73a08bcb223c530326d44484a357380dfe3e6ee/src/client.js#L291
outbound.write(data)
}
//var testChannel = client.getChannel('Blbl')
//console.log(testChannel)
//
// client.on('newChannel', channel => this._newChannel(channel))
client.on('message', (sender, message, users, channels, trees) => {
sender = sender || { _username: 'Server' }
console.log(message, sender, users, channels)
messages.add(message,sender._username)
})
messages.addInfo("You use Persil, a web mumble client: https://git.bksp.space/Tjiho/Persil")
messages.add(client.welcomeMessage,'Server')
console.log('Actual username:', client.self.username)
console.log('Actual Channel:', client.self.channel.name)
console.log('Children channel:', client.self.channel.children)
client.users.forEach(function (user) {
users.add(user,client)
})
client.on('newUser', (user) => {
// display a message like "user ... is joining us"
// create an "info" component or customise message element to be less visible without sender
users.add(user,client)
})
})
}
function main(event) {
document.querySelector('#login').classList.add('invisible')
document.querySelector('#page-loader').classList.remove('invisible')
initVoice((data) => handleAudio(data)).then(connectToMumble).catch(raiseError)
event.preventDefault()
}
document.querySelector('#login').addEventListener("submit", main);