Yolo host on EC2.

This commit is contained in:
Luke Curley 2022-07-11 12:09:14 -07:00
parent f6163e7a70
commit 1509d799cc
7 changed files with 21 additions and 91 deletions

View File

@ -1,19 +0,0 @@
FROM ubuntu
# Install dependencies
RUN apt-get update && apt-get install -y nginx certbot python3-certbot-nginx
# Contains the final certificates created by certbot
VOLUME /etc/letsencrypt
# Application configuration for our site
COPY nginx/quic.video.conf /etc/nginx/conf.d/quic.video.conf
# The script to init and run nginx
COPY nginx/run.sh /run/warp-client
# Copy over the web contents
COPY dist/* /var/www/quic.video
# Run the shell script
CMD /run/warp-client

View File

@ -1,6 +0,0 @@
server {
listen 80;
listen [::]:80;
server_name quic.video;
root /var/www/quic.video;
}

View File

@ -1,9 +0,0 @@
#!/bin/bash
set -euxo pipefail
# Try to generate a certificate that expires in 90 days.
# This will listen on port 80 and serve a challenge file, proving we own the domain.
certbot --nginx --email kixelated@gmail.com -d quic.video --agree-tos
# The certbot nginx plugin will automatically append the certs to the configuration.
nginx

View File

@ -3,7 +3,7 @@
"scripts": { "scripts": {
"serve": "parcel serve --https --host localhost.warp.demo --port 4444", "serve": "parcel serve --https --host localhost.warp.demo --port 4444",
"prebuild": "rm -rf dist", "prebuild": "rm -rf dist",
"build": "parcel build", "build": "parcel build --public-url ./",
"check": "tsc --noEmit" "check": "tsc --noEmit"
}, },
"devDependencies": { "devDependencies": {

View File

@ -12,12 +12,11 @@
<div id="player"> <div id="player">
<div id="screen"> <div id="screen">
<div id="play"><span>click to play</span></div> <div id="play"><span>click to play</span></div>
<video id="vid" controls></video> <video id="vid" autoplay controls></video>
</div> </div>
<div id="controls"> <div id="controls">
<button type="button" id="live">Go Live</button> <button type="button" id="live">Go Live</button>
<button type="button" id="throttle">Throttle: None</button>
</div> </div>
<div id="stats"> <div id="stats">
@ -35,28 +34,21 @@
// This is so ghetto but I'm too lazy to improve it right now // This is so ghetto but I'm too lazy to improve it right now
const vidRef = document.getElementById("vid") const vidRef = document.getElementById("vid")
const liveRef = document.getElementById("live") const liveRef = document.getElementById("live")
const throttleRef = document.getElementById("throttle")
const statsRef = document.getElementById("stats") const statsRef = document.getElementById("stats")
const playRef = document.getElementById("play") const playRef = document.getElementById("play")
const params = new URLSearchParams(window.location.search) const params = new URLSearchParams(window.location.search)
const player = new Player({ const player = new Player({
url: params.get("url") || "https://localhost.warp.demo:4443", url: params.get("url") || "https://quic.video/demo",
vid: vidRef, vid: vidRef,
stats: statsRef, stats: statsRef,
throttle: throttleRef,
}) })
liveRef.addEventListener("click", (e) => { liveRef.addEventListener("click", (e) => {
e.preventDefault() e.preventDefault()
player.goLive() player.goLive(0.3) // 300ms of buffer
})
throttleRef.addEventListener("click", (e) => {
e.preventDefault()
player.throttle()
}) })
playRef.addEventListener('click', (e) => { playRef.addEventListener('click', (e) => {
@ -66,7 +58,7 @@
function playFunc(e) { function playFunc(e) {
playRef.style.display = "none" playRef.style.display = "none"
//player.goLive() player.goLive(0.3) // 300ms of buffer
// Only fire once to restore pause/play functionality // Only fire once to restore pause/play functionality
vidRef.removeEventListener('play', playFunc) vidRef.removeEventListener('play', playFunc)
@ -76,7 +68,7 @@
vidRef.volume = 0.5 vidRef.volume = 0.5
// Try to autoplay but ignore errors on mobile; they need to click // Try to autoplay but ignore errors on mobile; they need to click
//vidRef.play().catch((e) => console.warn(e)) vidRef.play().catch((e) => console.warn(e))
</script> </script>
</body> </body>
</html> </html>

View File

@ -53,9 +53,6 @@ export class Player {
// async functions // async functions
this.receiveStreams() this.receiveStreams()
// Limit to 4Mb/s
this.sendThrottle()
} }
async close() { async close() {
@ -125,13 +122,24 @@ export class Player {
this.updateStats() this.updateStats()
} }
goLive() { goLive(offset: number) {
const ranges = this.vidRef.buffered const ranges = this.vidRef.buffered
if (!ranges.length) { if (!ranges.length) {
return return
} }
this.vidRef.currentTime = ranges.end(ranges.length-1); // Get the start and the end of the last chunk of the buffer.
const start = ranges.start(ranges.length-1);
const end = ranges.end(ranges.length-1)
if (start < end - offset) {
// Seek back offset from the end of the buffer.
this.vidRef.currentTime = end - offset;
} else {
// Start at the beginning of the range.
this.vidRef.currentTime = start;
}
this.vidRef.play(); this.vidRef.play();
} }
@ -272,10 +280,10 @@ export class Player {
updateStats() { updateStats() {
for (const child of this.statsRef.children) { for (const child of this.statsRef.children) {
if (child.className == "audio buffer") { if (child.classList.contains("audio")) {
const ranges: any = (this.audio) ? this.audio.buffered() : { length: 0 } const ranges: any = (this.audio) ? this.audio.buffered() : { length: 0 }
this.visualizeBuffer(child as HTMLElement, ranges) this.visualizeBuffer(child as HTMLElement, ranges)
} else if (child.className == "video buffer") { } else if (child.classList.contains("video")) {
const ranges: any = (this.video) ? this.video.buffered() : { length: 0 } const ranges: any = (this.video) ? this.video.buffered() : { length: 0 }
this.visualizeBuffer(child as HTMLElement, ranges) this.visualizeBuffer(child as HTMLElement, ranges)
} }

View File

@ -1,36 +0,0 @@
# build image #
FROM golang:1.18 AS build
WORKDIR /src
# Don't use the Go proxy because it's blocked on my laptop (lul)
ENV GOPRIVATE=*
# Copy over the files.
COPY . .
# Run the unit tests.
RUN go test -race ./...
# Run go vet
RUN go vet ./...
# Make sure go fmt was run.
# If this fails, you should configure your editor to run `gofmt` on save.
RUN test -z $(go fmt ./...)
# Install the binary.
RUN go install -v ./warp-server
# Final image
FROM ubuntu:22.04
# Install root certs for HTTPS
RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates
# Copy the binary from the build image
COPY --from=build /go/bin /usr/local/bin
# Copy over our pre-encoded media.
COPY media /media