75 lines
1.8 KiB
Go
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
|
|
}
|
|
}
|
|
}
|