From a2b9e5d7773f0e7b51c84a0bc342c5b1eca80081 Mon Sep 17 00:00:00 2001
From: Ludovic Le Frioux <ludovic.le-frioux@inria.fr>
Date: Thu, 17 Dec 2020 14:47:55 +0100
Subject: [PATCH] Check CRDT form at first update, catch deserialization
 exception

---
 src/service.ts | 49 ++++++++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/src/service.ts b/src/service.ts
index e8dd542..388af3a 100644
--- a/src/service.ts
+++ b/src/service.ts
@@ -230,33 +230,32 @@ function updateObject(dbName: string, docName: string, document: string) {
         .use(dbName)
         .get(docName)
         .then((body) => {
-          const CRDT = crdtlib.crdt.DeltaCRDT.Companion.fromJson(document);
-          const bodyCRDT = crdtlib.crdt.DeltaCRDT.Companion.fromJson(
-            JSON.stringify(body)
-          );
-          bodyCRDT.merge(CRDT);
-          const newDocument = JSON.parse(bodyCRDT.toJson());
-          newDocument._rev = body._rev;
-          client.db
-            .use(dbName)
-            .insert(newDocument, docName)
-            .catch((error) => {
-              console.error(
-                `[SERVER][ERROR] Failed updating document '${docName}' in database '${dbName}'`
-              );
-              console.error(error);
-            });
+          try {
+            const CRDT = crdtlib.crdt.DeltaCRDT.Companion.fromJson(document);
+            const bodyCRDT = crdtlib.crdt.DeltaCRDT.Companion.fromJson(
+              JSON.stringify(body)
+            );
+            bodyCRDT.merge(CRDT);
+            const newDocument = JSON.parse(bodyCRDT.toJson());
+            newDocument._rev = body._rev;
+            client.db.use(dbName).insert(newDocument, docName);
+          } catch (error) {
+            console.error(
+              `[SERVER][ERROR] Failed updating document '${docName}' in database '${dbName}'`
+            );
+            console.error(error);
+          }
         })
         .catch((error) => {
-          client.db
-            .use(dbName)
-            .insert(JSON.parse(document), docName)
-            .catch((error) => {
-              console.error(
-                `[SERVER][ERROR] Failed updating document '${docName}' in database '${dbName}'`
-              );
-              console.error(error);
-            });
+          try {
+            const CRDT = crdtlib.crdt.DeltaCRDT.Companion.fromJson(document);
+            client.db.use(dbName).insert(JSON.parse(document), docName);
+          } catch (error) {
+            console.error(
+              `[SERVER][ERROR] Failed updating document '${docName}' in database '${dbName}'`
+            );
+            console.error(error);
+          }
         });
     })
     .catch((error) => {
-- 
GitLab