Skip to content

Commit 56c354e

Browse files
committed
slight refactor to be able to quickly switch between Differential Synchronization and Automerge
1 parent 09036ff commit 56c354e

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

cmd/root.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,16 @@ var rootCmd = &cobra.Command{
4141
fileWatcher := backend.NewFileWatcher(path, action)
4242
fileWatcher.WatchDirRecursive()
4343

44-
syncManager := backend.NewSyncManager(treeManager)
44+
//syncManager := backend.NewSyncManager(treeManager)
45+
automergeSyncManager := backend.NewAutomergeSyncManager(treeManager)
4546

46-
restService := backend.NewRestService(treeManager, syncManager)
47-
websocketConnectionManager := backend.NewWebsocketConnectionManager(treeManager)
47+
restService := backend.NewRestService(treeManager, automergeSyncManager)
48+
//websocketConnectionManager := backend.NewWebsocketConnectionManager(treeManager)
49+
automergeWebsocketConnectionManager := backend.NewWebsocketConnectionManager(treeManager)
4850

49-
restService.RegisterWebsocketHandler(websocketConnectionManager)
50-
syncManager.SetWebsocketConnectionManager(websocketConnectionManager)
51+
restService.RegisterWebsocketHandler(automergeWebsocketConnectionManager)
52+
//syncManager.SetWebsocketConnectionManager(websocketConnectionManager)
53+
automergeSyncManager.SetWebsocketConnectionManager(automergeWebsocketConnectionManager)
5154

5255
restService.Start()
5356
},

internal/backend/automergesyncmanager.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,7 @@ func (sm *AutomergeSyncManager) sendInitialTextResponse(client *websocket.Conn,
138138
automergeDocument := automerge.New()
139139
syncState := automerge.NewSyncState(automergeDocument)
140140

141-
documentContentText, err := automerge.As[*automerge.Text](automergeDocument.RootMap().Get("content"))
142-
if err != nil {
143-
return err
144-
}
141+
documentContentText := automergeDocument.Path("content").Text()
145142
err = documentContentText.Set(document.Content)
146143
if err != nil {
147144
return err

internal/backend/rest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ type (
5252
type RestService struct {
5353
echoRest *echo.Echo
5454
treeManager *TreeManager
55-
syncManager *SyncManager
55+
syncManager SyncManager
5656
websocketConnectionManager *WebsocketConnectionManager
5757
}
5858

5959
func NewRestService(
6060
treeManager *TreeManager,
61-
syncManager *SyncManager,
61+
syncManager SyncManager,
6262
) *RestService {
6363
rs := &RestService{
6464
treeManager: treeManager,

internal/backend/syncmanager.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ type (
2828
}
2929
)
3030

31-
// SyncManager manages processing of EditRequests from clients
32-
type SyncManager struct {
31+
type SyncManager interface {
32+
IsItemBeingEditedRecursive(s *Section) (err error)
33+
}
34+
35+
// DSSyncManager manages processing of EditRequests from clients
36+
type DSSyncManager struct {
3337
treeManager *TreeManager
3438
websocketConnectionManager *WebsocketConnectionManager
3539

@@ -42,16 +46,16 @@ type SyncManager struct {
4246

4347
func NewSyncManager(
4448
treeManager *TreeManager,
45-
) *SyncManager {
46-
syncManager := &SyncManager{
49+
) *DSSyncManager {
50+
syncManager := &DSSyncManager{
4751
treeManager: treeManager,
4852
ServerShadows: make(map[*websocket.Conn]string),
4953
}
5054

5155
return syncManager
5256
}
5357

54-
func (sm *SyncManager) IsItemBeingEditedRecursive(s *Section) (err error) {
58+
func (sm *DSSyncManager) IsItemBeingEditedRecursive(s *Section) (err error) {
5559
for _, doc := range *s.Documents {
5660
if sm.websocketConnectionManager.IsClientConnected(doc.ID) {
5761
return errors.New("a document within this section is currently being edited by another user")
@@ -69,17 +73,17 @@ func (sm *SyncManager) IsItemBeingEditedRecursive(s *Section) (err error) {
6973
}
7074

7175
// sets the initial server shadow for a new client connection
72-
func (sm *SyncManager) initClient(conn *websocket.Conn, shadowContent string) {
76+
func (sm *DSSyncManager) initClient(conn *websocket.Conn, shadowContent string) {
7377
sm.ServerShadows[conn] = shadowContent
7478
}
7579

7680
// removes the shadow for the given client
77-
func (sm *SyncManager) removeClient(conn *websocket.Conn) {
81+
func (sm *DSSyncManager) removeClient(conn *websocket.Conn) {
7882
delete(sm.ServerShadows, conn)
7983
}
8084

8185
// handles incoming edit requests from the client
82-
func (sm *SyncManager) handleEditRequest(client *websocket.Conn, editRequest EditRequest) (err error) {
86+
func (sm *DSSyncManager) handleEditRequest(client *websocket.Conn, editRequest EditRequest) (err error) {
8387
documentId := editRequest.DocumentId
8488

8589
// check if the server shadow matches the client shadow before the patch has been applied
@@ -122,7 +126,7 @@ func (sm *SyncManager) handleEditRequest(client *websocket.Conn, editRequest Edi
122126
}
123127

124128
// send the full document text to a client
125-
func (sm *SyncManager) sendInitialTextResponse(client *websocket.Conn, document *Document) (err error) {
129+
func (sm *DSSyncManager) sendInitialTextResponse(client *websocket.Conn, document *Document) (err error) {
126130
// set initial state in backend
127131
sm.initClient(client, document.Content)
128132

@@ -142,7 +146,7 @@ func (sm *SyncManager) sendInitialTextResponse(client *websocket.Conn, document
142146
}
143147

144148
// responds to a client with the changes from the server site document version
145-
func (sm *SyncManager) sendEditRequestResponse(client *websocket.Conn, documentId string) (err error) {
149+
func (sm *DSSyncManager) sendEditRequestResponse(client *websocket.Conn, documentId string) (err error) {
146150
d := sm.treeManager.GetDocument(documentId)
147151

148152
shadow := sm.ServerShadows[client]
@@ -177,7 +181,7 @@ func (sm *SyncManager) sendEditRequestResponse(client *websocket.Conn, documentI
177181
// this will ensure the bytes are the same on all clients
178182
// - the checksum string must include leading zeros
179183
// - all characters are lowercase
180-
func (sm *SyncManager) calculateChecksum(text string) string {
184+
func (sm *DSSyncManager) calculateChecksum(text string) string {
181185
encoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
182186
utf16, err := encoder.String(text)
183187
if err != nil {
@@ -189,7 +193,7 @@ func (sm *SyncManager) calculateChecksum(text string) string {
189193
return strings.ToLower(checksum)
190194
}
191195

192-
func (sm *SyncManager) saveCurrentDocumentContent(documentId string) {
196+
func (sm *DSSyncManager) saveCurrentDocumentContent(documentId string) {
193197
sm.lock.RLock()
194198
defer sm.lock.RUnlock()
195199

@@ -209,7 +213,7 @@ func (sm *SyncManager) saveCurrentDocumentContent(documentId string) {
209213
log.Printf("Document '%s' synchronized to disk successfully", documentId)
210214
}
211215

212-
func (sm *SyncManager) SetWebsocketConnectionManager(manager *WebsocketConnectionManager) {
216+
func (sm *DSSyncManager) SetWebsocketConnectionManager(manager *WebsocketConnectionManager) {
213217
sm.websocketConnectionManager = manager
214218

215219
sm.websocketConnectionManager.SetOnNewClientListener(func(client *websocket.Conn, document *Document) error {

0 commit comments

Comments
 (0)