spa-handler/reloader.go
2025-06-06 20:41:50 +02:00

75 lines
1.8 KiB
Go

package spa_handler
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
func clientScript(clientVersion string) string {
return fmt.Sprintf(`
<!-- [spa_handler] Live Reloading Script Start -->
<script type="application/javascript">
function spaHandlerLiveReloaderConnect() {
const ws = new WebSocket("/_livereloader_");
ws.onopen = function() {
console.info('[spa_handler]: live reloader connected!');
};
ws.onmessage = function(event) {
try {
const message = JSON.parse(event.data);
if (message && message.clientVersion && message.clientVersion !== '%s') {
console.info('[spa_handler]: receive reload');
location.reload(true);
}
} catch (err) {
console.warning('[spa_handler]: something was wrong! ', err)
}
};
ws.onclose = function() {
console.info('[spa_handler]: connection closed');
setTimeout(function() {
console.info('[spa_handler]: try reconnect');
spaHandlerLiveReloaderConnect();
}, 5000);
};
ws.onerror = function(err) {
console.warning('[spa_handler]: something was wrong with websocket connection! ', err)
};
}
document.onload = function() {
spaHandlerLiveReloaderConnect();
};
</script>
<!-- [spa_handler] Live Reloading Script End -->
`, clientVersion)
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
type reloader struct {
clientVersion string
}
func (rel reloader) ServeHTTP(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("Error upgrading:", err)
return
}
defer conn.Close()
_ = conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("{\"clientVersion\":\"%s\"}", rel.clientVersion)))
for {
_, _, err := conn.ReadMessage()
if err != nil {
fmt.Println("Error reading message:", err)
break
}
}
}