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