113 lines
3.7 KiB
JavaScript
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);
|