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}