forked from jpillora/cloud-torrent
/
server.go
88 lines (73 loc) · 1.42 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"log"
"net/http"
"os"
"time"
"github.com/jpillora/go-realtime"
)
type Foo struct {
realtime.Object //adds sync state and an Update() method
A, B int
C []int
D string
E Bar
}
type Bar struct {
X, Y int
}
func main() {
foo := &Foo{A: 21, B: 42, D: "0"}
//create a go-realtime (websockets) http.Handler
rt := realtime.NewHandler()
//register foo
rt.Add("foo", foo)
go func() {
i := 0
for {
//change foo
foo.A++
if i%2 == 0 {
foo.B--
}
i++
if i > 10 {
foo.C = foo.C[1:]
}
foo.C = append(foo.C, i)
if i%5 == 0 {
foo.E.Y++
}
//mark updated
foo.Update()
//do other stuff...
time.Sleep(250 * time.Millisecond)
}
}()
//realtime handlers
http.Handle("/realtime", rt)
//index handler
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")
w.Write(indexhtml)
})
port := os.Getenv("PORT")
if port == "" {
port = "3000"
}
log.Printf("Listening on localhost:%s...", port)
http.ListenAndServe(":"+port, nil)
}
var indexhtml = []byte(`
<pre id="out"></pre>
<script src="/realtime"></script>
<script>
var foo = {};
var rt = realtime("/realtime");
//keep in sync with the server
rt.add("foo", foo, function onupdate() {
out.innerHTML = JSON.stringify(foo, null, 2);
});
</script>
`)
//NOTE: deltas are not sent in the example since the target object is too small