Skip to content

Instantly share code, notes, and snippets.

@ClaesBas
Last active January 29, 2025 16:21
Show Gist options
  • Select an option

  • Save ClaesBas/bb04d23ddaedf2615142d8775b6f76a5 to your computer and use it in GitHub Desktop.

Select an option

Save ClaesBas/bb04d23ddaedf2615142d8775b6f76a5 to your computer and use it in GitHub Desktop.
Reworked Example from Datastars SDK for GO Readme
package main
import (
"fmt"
"math"
"math/rand"
"net/http"
"time"
datastar "github.com/starfederation/datastar/sdk/go"
)
const fps = 60 // Frames per second (test with different values)
const listenAddress = "0.0.0.0:9001"
const cdn = "https://cdn.jsdelivr.net/gh/starfederation/datastar@develop/bundles/datastar.js"
const style = `
display:flex;flex-direction:column;
background-color:oklch(25.3267% 0.015896 252.417568);
height:100vh;
justify-content:center;
align-items:center;
font-family:
ui-sans-serif,
system-ui,
sans-serif,
'Apple Color Emoji',
'Segoe UI Emoji',
'Segoe UI Symbol',
'Noto Color Emoji';
`
const htmlStr4Sprintf = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta
name="viewport"
content="width=device-width,
initial-scale=1,
maximum-scale=1,
user-scalable=0"
/>
<script type="module" defer src="%s"></script>
</head>
<body style="%s">
<span id="feed" data-on-load="%s"></span>
</body>
</html>
`
func main() {
mux := http.NewServeMux()
page := []byte(fmt.Sprintf(htmlStr4Sprintf, cdn, style, datastar.GetSSE("/stream")))
duration := time.Duration(int(math.Round(1000.0/fps))) * time.Millisecond
pageHandler := func(w http.ResponseWriter, r *http.Request) {
w.Write(page)
}
mux.HandleFunc("GET /", pageHandler)
streamHandler := func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Client connected from: %s\n", r.RemoteAddr)
ticker := time.NewTicker(duration)
defer ticker.Stop()
sse := datastar.NewSSE(w, r)
for {
select {
case <-r.Context().Done():
fmt.Println("Client connection closed")
return
case <-ticker.C:
hexString := fmt.Sprintf("%06x\n", rand.Intn(16777216)) // 2^24 = 16777216, 0xFFFFFF
frag := fmt.Sprintf(`
<span id="feed"
style="color:#%s;border:1px solid #%s;border-radius:0.25rem;padding:1rem;"
>
%s
</span>`,
hexString,
hexString,
hexString,
)
sse.MergeFragments(frag)
}
}
}
mux.HandleFunc("GET /stream", streamHandler)
fmt.Printf("Server listen at: %s and runs at %d fps\n", listenAddress, fps)
if err := http.ListenAndServe(listenAddress, mux); err != nil {
fmt.Printf("Error starting server: %v\n", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment