sync_demo.go
1package main
2
3import (
4 "context"
5 "fmt"
6 "log"
7 "os"
8 "os/signal"
9 "syscall"
10
11 ygo "git.kilimanjaro.io/ygo"
12 "git.kilimanjaro.io/ygo/ysweet"
13)
14
15func main() {
16 ctx, cancel := context.WithCancel(context.Background())
17 defer cancel()
18
19 sigCh := make(chan os.Signal, 1)
20 signal.Notify(sigCh, os.Interrupt, syscall.SIGINT)
21 go func() {
22 <-sigCh
23 fmt.Println("\nShutting down...")
24 cancel()
25 }()
26
27 client, err := ysweet.NewClient("http://127.0.0.1:8080")
28 if err != nil {
29 log.Fatalf("Failed to create y-sweet client: %v", err)
30 }
31
32 docID, err := client.NewDoc("")
33 if err != nil {
34 log.Fatalf("Failed to create document: %v", err)
35 }
36 fmt.Printf("Created document with ID: %s\n", docID)
37
38 auth, err := client.AuthDoc(docID)
39 if err != nil {
40 log.Fatalf("Failed to auth document: %v", err)
41 }
42 fmt.Printf("Auth response - URL: %s\n", auth.URL)
43
44 doc1, err := ygo.NewDoc()
45 if err != nil {
46 log.Fatalf("Failed to create doc1: %v", err)
47 }
48 defer doc1.Destroy()
49
50 doc2, err := ygo.NewDoc()
51 if err != nil {
52 log.Fatalf("Failed to create doc2: %v", err)
53 }
54 defer doc2.Destroy()
55
56 txt1, err := doc1.GetText("content")
57 if err != nil {
58 log.Fatalf("Failed to get text1: %v", err)
59 }
60 defer txt1.Destroy()
61
62 txt2, err := doc2.GetText("content")
63 if err != nil {
64 log.Fatalf("Failed to get text1: %v", err)
65 }
66 defer txt2.Destroy()
67
68 err = doc1.Sync(ctx, ygo.WithSyncEndpoint(auth.WebsocketURL()), ygo.WithOnUpdate(func(d *ygo.Doc) error {
69 jsonBytes, err := d.MarshalJSON(ygo.WithText("content"))
70 if err != nil {
71 return err
72 }
73 fmt.Println("Doc1 received update:", string(jsonBytes))
74 return nil
75 }))
76 if err != nil {
77 log.Fatalf("Failed to sync doc1: %v", err)
78 }
79 fmt.Println("Doc1 connected")
80
81 var fired bool
82 err = doc2.Sync(ctx, ygo.WithSyncEndpoint(auth.WebsocketURL()), ygo.WithOnUpdate(func(d *ygo.Doc) error {
83 jsonBytes, err := d.MarshalJSON(ygo.WithText("content"))
84 if err != nil {
85 return err
86 }
87 fmt.Println("Doc2 received update:", string(jsonBytes))
88 // send something back one time, without the fired flag it would repeatedly
89 // add this text to the end
90 if !fired {
91 if err := d.WithWriteTransaction(func(txn *ygo.Transaction) error {
92 length := txt2.Len(txn)
93 txt2.Insert(txn, length+1, " Right back at you from client 2")
94 fired = true
95 return nil
96 }); err != nil {
97 return err
98 }
99
100 }
101 return nil
102 }))
103 if err != nil {
104 log.Fatalf("Failed to sync doc2: %v", err)
105 }
106 fmt.Println("Doc2 connected")
107
108 err = doc1.WithWriteTransaction(func(txn *ygo.Transaction) error {
109 txt1.Insert(txn, 0, "Hello from client 1")
110 return nil
111 })
112 if err != nil {
113 log.Fatalf("Failed to insert text: %v", err)
114 }
115
116 fmt.Println("Inserted text from doc1, waiting for updates...")
117
118 <-ctx.Done()
119 fmt.Println("Done")
120}