add native javascript version

This commit is contained in:
Zack Scholl 2019-11-11 14:21:34 -08:00
parent 9c233be5d9
commit 1f2378c2ad
2 changed files with 146 additions and 3 deletions

143
src/webrtc/web/index.html Normal file
View File

@ -0,0 +1,143 @@
<html>
<head>
<script src="https://cdn.jsdelivr.net/gh/emn178/js-md5/build/md5.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/web-streams-polyfill@2.0.2/dist/ponyfill.min.js"></script>
<script src="https://jimmywarting.github.io/StreamSaver.js/StreamSaver.js"></script>
</head>
</html>
<body>
Base64: <textarea id="remoteSessionDescription"></textarea> <br />
<button onclick="startSession()"> Send Message </button> <br />
<script>
var transferable_readable_stream = false;
var message_channel_stream = true;
var fetch_to_keep_sw_alive = true;
var secure_web_context = true;
var use_hidden_frame = true;
var use_popup_to_install = true;
var use_location_href = false;
var use_cross_origin_service_worker = false;
var enable_desktop_notifications = false;
var filename_to_receive = "sample2.txt"
var file_is_closed = false;
if ('isSecureContext' in window) {
use_hidden_frame = secure_web_context = isSecureContext
use_popup_to_install = !isSecureContext
} else {
secure_web_context.indeterminate = true
}
use_location_href = !use_hidden_frame
use_cross_origin_service_worker = new URL(streamSaver.mitm).origin !== window.origin
try {
const { readable } = new TransformStream()
const mc = new MessageChannel()
mc.port1.postMessage(readable, [readable])
mc.port1.close()
mc.port2.close()
transferable_readable_stream = true
} catch (e) {
message_channel_stream = true
fetch_to_keep_sw_alive = true
}
if (Notification.permission !== 'granted' && enable_desktop_notifications == true) {
Notification.requestPermission().then(console.log, console.log)
}
// initial streaming variables
var max = 30;
var streaming_start = Date.now();
var num_bytes_written = 0;
// // testing streaming
// window.fileStream = streamSaver.createWriteStream(filename_to_receive, { size: max })
// window.writer = fileStream.getWriter()
// window.onunload = () => {
// console.log("aborting");
// window.writer.abort()
// }
// window.writer.write(new TextEncoder().encode("hello, world"))
// --- end streaming code ---
let pc = new RTCPeerConnection({
iceServers: [{
urls: 'stun:stun.l.google.com:19302'
}]
})
let log = msg => {
console.log(msg);
}
pc.onsignalingstatechange = e => log(pc.signalingState)
pc.oniceconnectionstatechange = e => log(pc.iceConnectionState)
pc.onicecandidate = event => {
if (event.candidate === null) {
log(JSON.stringify(pc.localDescription))
}
}
pc.ondatachannel = e => {
let dc = e.channel
log('New DataChannel ' + dc.label)
dc.onclose = () => log('dc has closed')
dc.onopen = () => {
log('dc has opened');
// initiate the streaming to file
streaming_start = Date.now()
window.fileStream = streamSaver.createWriteStream(filename_to_receive, { size: max })
window.writer = fileStream.getWriter()
window.onunload = () => writer.abort()
}
dc.onmessage = e => {
log(`Message from DataChannel '${dc.label}' payload '${e.data}'`)
log(md5(e.data));
if (!(file_is_closed)) {
let bytes_to_write = new Uint8Array(e.data);
log(bytes_to_write)
window.writer.write(bytes_to_write)
num_bytes_written = num_bytes_written + bytes_to_write.length;
console.log(num_bytes_written + ' bytes written');
if (num_bytes_written >= max) {
console.log('Download completed')
window.writer.close()
file_is_closed = true;
}
}
}
window.sendMessage = e => {
let message = e;
if (message === '') {
return alert('Message must not be empty')
}
dc.send(message)
}
}
window.startSession = () => {
pc.setRemoteDescription(new RTCSessionDescription(JSON.parse(atob(document.getElementById('remoteSessionDescription').value)))).catch(log)
pc.createAnswer().then(d => pc.setLocalDescription(d)).catch(log)
}
</script>
</body>
</html>

View File

@ -2,7 +2,6 @@ package main
import (
"crypto/md5"
"crypto/rand"
"encoding/base64"
"encoding/json"
"errors"
@ -88,8 +87,9 @@ func createOfferer(finished chan<- error) (pc *webrtc.PeerConnection, err error)
log.Debugf("OnOpen: %s-%d. Start sending a series of 1024-byte packets as fast as it can\n", dc.Label(), dc.ID())
its := 0
for {
buf := make([]byte, maxPacketSize)
rand.Read(buf)
// buf := make([]byte, maxPacketSize)
buf := []byte(fmt.Sprintf("%d\n", its))
// rand.Read(buf)
its++
if its == 3000000000 {
buf = []byte{1, 2, 3}