initial commit
This commit is contained in:
commit
b262e2d8ed
21
cmd/server/cert.pem
Normal file
21
cmd/server/cert.pem
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDXzCCAkegAwIBAgIUFLBXeBoRiWo+BlKfVFxGAOU9uwgwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwPzELMAkGA1UEBhMCQVQxDTALBgNVBAgMBFdpZW4xDTALBgNVBAcMBFdpZW4x
|
||||||
|
EjAQBgNVBAoMCURpZSBQYXJ0eTAeFw0yNTA5MTExNzUyNTZaFw0yNjA5MTExNzUy
|
||||||
|
NTZaMD8xCzAJBgNVBAYTAkFUMQ0wCwYDVQQIDARXaWVuMQ0wCwYDVQQHDARXaWVu
|
||||||
|
MRIwEAYDVQQKDAlEaWUgUGFydHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDpNdBYKyc2z9hadellByc/CIPoDtHRVvjt94AMJFQ52Fu/yaN9/FX25egV
|
||||||
|
S9st9TbIJkJ2rMX8gaposF1Z1fN0uEujwuRv/l3MnvKEtYcVJtcc96/KdV/JD0kX
|
||||||
|
lTTr8WX6C5uJ8J9gZx4epc3SUVUevKvyjGjtO/1pGsS/JKpE1fgpa8V5TYaitL8t
|
||||||
|
EIMp7DOH2ebc8YXFb/nyr4mlsRTbheD/BJgAqWKi3kKJuml9etzWFlwoMli/nONJ
|
||||||
|
pj/KGCJLXABczwHehBIu4rBl56R9qtnRtPN9i9AEotRQHla5125mRyCCd2PRRITu
|
||||||
|
RiSdB0y8kImhROlzpacDSBPh0sJhAgMBAAGjUzBRMB0GA1UdDgQWBBQJP+zNoNNG
|
||||||
|
RQh0cgt42u0qGuMRkTAfBgNVHSMEGDAWgBQJP+zNoNNGRQh0cgt42u0qGuMRkTAP
|
||||||
|
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAINSMWHokDTqoQodHY
|
||||||
|
IJH0p0NxEqoQMhrt44medHWPYMlk4k3mWn5JD/9e29hsmovaobLPmW4+Qh90+vMu
|
||||||
|
/+yu1YBkjsNhyZ7INyPjT2UhC6JWxJTSBFtkfL8/sg61gjDSo2ERzlC/MkQ3wozr
|
||||||
|
bLsIf9Kj8FWMotfp71Anrrf6K83BQv6Xz5Vl/pCge0bUFkwAnoupEuiAGhLcflUH
|
||||||
|
0p/KX72qq1fdZjd6HRm2RodtJGT8wve3HWCzJcNA45DFbuF3RCH5o3Ntc+nLX8oF
|
||||||
|
OhYq/a8agiEWzaKwqZZ7LNyDQk65HcQDAi0qG31IdBBd6OM6DEvlh0DZIDzL7igj
|
||||||
|
g2C/
|
||||||
|
-----END CERTIFICATE-----
|
||||||
28
cmd/server/key.pem
Normal file
28
cmd/server/key.pem
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDpNdBYKyc2z9ha
|
||||||
|
dellByc/CIPoDtHRVvjt94AMJFQ52Fu/yaN9/FX25egVS9st9TbIJkJ2rMX8gapo
|
||||||
|
sF1Z1fN0uEujwuRv/l3MnvKEtYcVJtcc96/KdV/JD0kXlTTr8WX6C5uJ8J9gZx4e
|
||||||
|
pc3SUVUevKvyjGjtO/1pGsS/JKpE1fgpa8V5TYaitL8tEIMp7DOH2ebc8YXFb/ny
|
||||||
|
r4mlsRTbheD/BJgAqWKi3kKJuml9etzWFlwoMli/nONJpj/KGCJLXABczwHehBIu
|
||||||
|
4rBl56R9qtnRtPN9i9AEotRQHla5125mRyCCd2PRRITuRiSdB0y8kImhROlzpacD
|
||||||
|
SBPh0sJhAgMBAAECggEARvLKOaiXO4OsDIlGwieU9wY+KwEnMArHnI3pdMgwn5CF
|
||||||
|
CSntBU0ZUg3Lt37mZWruiaGqIrSZXyKLl2HgZI5EjMPsrxuBp9i47KGGon0fZX31
|
||||||
|
f6iS4IMo6uAtmnEYMpe0MIgLf8GmmwuEDErg/RUlUj6QCTBSU6omhC1SodwjuODS
|
||||||
|
7iCl11XcamqmVUY/VIByQH38rGzPuvNVHjc9w0nyop4TSLaoxAH/yyrg2oFfc/Ra
|
||||||
|
h3bgsrYoasDjI1+BzreDiyoCJBwTlpG11DTmlO2bYYUgt3lgwQz12McdNJK+1s+R
|
||||||
|
60M0BkD4TiglvHSHaUenDtXT93D8JlzOrrwYSNe0qQKBgQD7RPy3EO4KXij7QSAs
|
||||||
|
8aM5kJQjV0JKzmLH2+/WeIjFGiJLVqWbMLF2NSaKPjh5ktXT1YmkJgbfgLw7M4q3
|
||||||
|
a/TWdAxPpjT4GhZh8AdqEKAlpLxaweu2umKsgmPwk12/nsB/vmEZG96vhHviC5PI
|
||||||
|
+KHKqTvGtdBsTMWhA0z0zf9GQwKBgQDtmcnirPD9QLtQd5O6dqNVUmgH8/wqGLrD
|
||||||
|
Y88H6Yv5nmd9Oex9JoZLOQO0oXRNRUU+eCxDm6volKgI0W6XT3U1+qBicLmGdYy6
|
||||||
|
4MHQ7Zu4e8+TNmGeAWlnOrCf8nmEQz9KjW8kOGLY09pHj6U8xxoICi2DPmNQgN6s
|
||||||
|
t8KJQCY0iwKBgFI4Z81rj8j6uMRGskWiqDuc8KyD0CB0WmR1toxikraUb6Zhav1W
|
||||||
|
OKuqhrrz0z0M7EVN+aUqAFPAZ1ej7P9KJyrJfIHPrEOHHc3cYkC1wgGvXyb/j6cS
|
||||||
|
ZFl4rUU6o5GhW/IxFMrHkN20J2l3SluX6DFNoU7LjbDyijS+xL7SbXbLAoGBAJJ1
|
||||||
|
AoGsEpw44311R+VfLczxD9kfJueX+L9p7Xq2FicW4jnJk6GNNqh1i3gzMWpT8ZvR
|
||||||
|
HY/LDEtAHtfYqK+yNdDBHU2wqFteaBHlavLrE9rCzq+yjLeFrUAJaEgfgZHqlb/R
|
||||||
|
sJmF/EAlTl5gB/2PyNb91xIYScWcuiWC2/IYTbSDAoGAZfDgx5CZZirYjzyTxDGM
|
||||||
|
+Ex06mqgDO+fWDm/Uyug4Ja3gk10Iu88F8MB6btm2yIras88RwnMPicBSq++yE0R
|
||||||
|
/ilOe5KSFyfQ3uu63gUgTKwCgb4LrdC6hMsD4ILnH44VH2zQ9yyLjrOq/8nsEq7v
|
||||||
|
E9VeQGnFHeM6Rpl1KUHTnnY=
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
104
cmd/server/main.go
Normal file
104
cmd/server/main.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
//"encoding/json"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Timestamp string `json:"timestamp"`
|
||||||
|
Random float64 `json:"random"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var page_template = template.Must(template.ParseFiles("../../ui/index.html"))
|
||||||
|
|
||||||
|
var upgrader = websocket.Upgrader{
|
||||||
|
CheckOrigin: func(r *http.Request) bool { return true }, // allow all origins
|
||||||
|
}
|
||||||
|
|
||||||
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
data := struct {
|
||||||
|
Name string
|
||||||
|
}{
|
||||||
|
Name: "Visitor",
|
||||||
|
}
|
||||||
|
page_template.Execute(w, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ws_handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
conn, err := upgrader.Upgrade(w, r, nil)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Upgrade error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
done := make(chan struct{})
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
ticker := time.NewTicker(1 * time.Second);
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
case t := <-ticker.C:
|
||||||
|
msg := map[string]interface{}{
|
||||||
|
"type": "server_tick",
|
||||||
|
"timestamp": t.Format(time.RFC3339),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if err := conn.WriteJSON(msg); err != nil {
|
||||||
|
fmt.Println("Write error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
var msg Message
|
||||||
|
err := conn.ReadJSON(&msg)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Read error:", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fmt.Println(msg)
|
||||||
|
|
||||||
|
// Send a response
|
||||||
|
// response := fmt.Sprintf("Server time: %s", time.Now())
|
||||||
|
// if err := conn.WriteMessage(websocket.TextMessage, []byte(response)); err != nil {
|
||||||
|
// fmt.Println("Write error:", err)
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func redirect_to_HTTPS(w http.ResponseWriter, r *http.Request) {
|
||||||
|
http.Redirect(w, r, "https://localhost:8443" + r.URL.RequestURI(), http.StatusMovedPermanently)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("/", handler)
|
||||||
|
http.HandleFunc("/ws", ws_handler)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
err := http.ListenAndServe(":8080", http.HandlerFunc(redirect_to_HTTPS))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Start HTTPS server (requires cert.pem and key.pem in current dir)
|
||||||
|
err := http.ListenAndServeTLS(":8443", "cert.pem", "key.pem", nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module party.at/party
|
||||||
|
|
||||||
|
go 1.25.1
|
||||||
|
|
||||||
|
require github.com/gorilla/websocket v1.5.3 // indirect
|
||||||
2
go.sum
Normal file
2
go.sum
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
|
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
30
ui/index.html
Normal file
30
ui/index.html
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Ping Demo</title>
|
||||||
|
<script>
|
||||||
|
const ws = new WebSocket("wss://localhost:8443/ws");
|
||||||
|
|
||||||
|
ws.onopen = () => console.log("Connected")
|
||||||
|
ws.onmessage = (event) => console.log(event.data)
|
||||||
|
ws.onclose = () => console.log("Closed")
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
if (ws.readyState === WebSocket.OPEN) {
|
||||||
|
const message = {
|
||||||
|
type: "ping",
|
||||||
|
timestamp: Date(),
|
||||||
|
random: Math.random()
|
||||||
|
};
|
||||||
|
|
||||||
|
ws.send(JSON.stringify(message))
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello, {{.Name}}!</h1>
|
||||||
|
<p>This page sends a ping to the server every second.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user