@cocreate/crdt 1.14.35 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # [1.15.0](https://github.com/CoCreate-app/CoCreate-crdt/compare/v1.14.35...v1.15.0) (2023-01-04)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * bump cdn to 1.39.4 ([0fb1769](https://github.com/CoCreate-app/CoCreate-crdt/commit/0fb176942d89c52f78b33c6fcdca2330e869cabc))
7
+
8
+
9
+ ### Features
10
+
11
+ * sync docName if on itit if server has changed ([a338782](https://github.com/CoCreate-app/CoCreate-crdt/commit/a3387820756d2a4ce4aa2bc97bf8011459b91b92))
12
+
1
13
  ## [1.14.35](https://github.com/CoCreate-app/CoCreate-crdt/compare/v1.14.34...v1.14.35) (2023-01-01)
2
14
 
3
15
 
package/demo/index.html CHANGED
@@ -3,9 +3,9 @@
3
3
  </head>
4
4
  <body>
5
5
 
6
- <!--<textarea collection="apple" document_id="6193e3f6cbf74500119cfae8" name='test' width="100%" height="300px"></textarea>-->
6
+ <textarea collection="apple" document_id="6193e3f6cbf74500119cfae8" name='test' width="100%" height="300px"></textarea>
7
7
  <h1 collection="apple" document_id="6193e3f6cbf74500119cfae8" name='test'></h1>
8
- <h5 collection="apple" document_id="6193e3f6cbf74500119cfae8" name='test' contenteditable></h5>
8
+ <!-- <h5 collection="apple" document_id="6193e3f6cbf74500119cfae8" name='test' contenteditable></h5> -->
9
9
  <!--<iframe collection="apples" document_id="602c4dadb7fb6c9da35ca126" name='html' width="100%" height="300px"></iframe>-->
10
10
 
11
11
  <br/>
@@ -39,8 +39,9 @@
39
39
  })
40
40
 
41
41
 
42
- <!--<script src="../dist/CoCreate-crdt.js"></script>-->
43
- <script src="https://cdn.cocreate.app/latest/CoCreate.min.js" ></script>
42
+ <!--<script src="../dist/CoCreate-crdt.js"></script>-->
43
+ <script src="../../../CoCreateJS/dist/CoCreate.js" ></script>
44
+ <!-- <script src="https://cdn.cocreate.app/latest/CoCreate.min.js" ></script> -->
44
45
  </body>
45
46
  </html>
46
47
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/crdt",
3
- "version": "1.14.35",
3
+ "version": "1.15.0",
4
4
  "description": "CoCreate crdt",
5
5
  "author": "CoCreate LLC",
6
6
  "license": "SEE LICENSE",
package/src/index.js CHANGED
@@ -21,30 +21,18 @@ async function getDoc(data) {
21
21
  try {
22
22
  if (['_id', 'organization_id'].includes(data.name))
23
23
  return
24
- let docName = generateDocName(data);
25
- let typeName = data.name;
24
+ let docName = getDocName(data);
26
25
  let doc = docs.get(docName);
27
26
 
28
27
  if (!doc) {
29
- let docNameMap = new Map();
30
- docs.set(docName, docNameMap);
28
+ docs.set(docName, new Map());
31
29
  doc = docs.get(docName);
32
30
  }
33
31
 
34
- let type = doc.get(typeName)
35
- if (!type) {
36
- let typeNameMap = new Map();
37
- doc.set(typeName, typeNameMap);
38
- type = doc.get(typeName)
39
- }
40
- if (!type.has('changeLog')) {
32
+ if (!doc.has('changeLog')) {
41
33
  let changeLog = [];
42
-
43
- let undoLog = new Map()
44
- type.set('undoLog', undoLog)
45
-
46
- let redoLog = new Map()
47
- type.set('redoLog', redoLog)
34
+ doc.set('undoLog', new Map())
35
+ doc.set('redoLog', new Map())
48
36
 
49
37
  if (data.read != 'false') {
50
38
  if (!data.newDocument) {
@@ -58,18 +46,18 @@ async function getDoc(data) {
58
46
  }]
59
47
  }
60
48
  });
61
- if (response.document.length && response.document[0][typeName]) {
62
- changeLog = response.document[0][typeName];
49
+ if (response.document && response.document[0] && response.document[0].changeLog) {
50
+ changeLog = response.document[0].changeLog;
63
51
  }
64
52
  }
65
- type.set('changeLog', changeLog);
53
+ doc.set('changeLog', changeLog);
66
54
  await generateText(data, true);
67
55
  }
68
56
  }
69
- else if (!type.has('text')){
57
+ else if (!doc.has('text')){
70
58
  await generateText(data, false);
71
59
  }
72
- return true;
60
+ return doc;
73
61
  }
74
62
  catch (e) {
75
63
  console.log('Invalid param', e);
@@ -82,9 +70,11 @@ String.prototype.customSplice = function (index, absIndex, string) {
82
70
 
83
71
  async function generateText(data, flag) {
84
72
  try {
85
- let name = docs.get(`${data.collection}${data.document_id}`).get(data.name);
73
+ let doc = docs.get(getDocName(data))
74
+ console.log('docName1', doc)
75
+
86
76
  let string = '';
87
- let changeLog = name.get('changeLog');
77
+ let changeLog = doc.get('changeLog');
88
78
  for (let change of changeLog) {
89
79
  if (change || change !== null ) {
90
80
  string = string.customSplice(change.start, change.length, change.value);
@@ -93,7 +83,7 @@ async function generateText(data, flag) {
93
83
  if (string === '' && data.read !== 'false') {
94
84
  string = await checkDb(data, flag);
95
85
  }
96
- name.set('text', string);
86
+ doc.set('text', string);
97
87
  return;
98
88
  }
99
89
  catch (e) {
@@ -123,10 +113,13 @@ async function checkDb(data, flag) {
123
113
  }
124
114
 
125
115
  function insertChange(data, flag) {
126
- let docName = generateDocName(data);
127
- let typeName = data.name;
128
- let type = 'insert';
129
-
116
+ let docName = getDocName(data);
117
+ let doc = docs.get(docName);
118
+ let changeLog = doc.get('changeLog');
119
+ if (!changeLog)
120
+ return
121
+
122
+ let type = 'insert';
130
123
  if (data.start == undefined) return;
131
124
  if (!data.value)
132
125
  type = 'delete';
@@ -142,11 +135,6 @@ function insertChange(data, flag) {
142
135
  type
143
136
  };
144
137
 
145
- let name = docs.get(docName).get(typeName);
146
- let changeLog = name.get('changeLog');
147
- if (!changeLog)
148
- return
149
-
150
138
  let lastChange = changeLog[changeLog.length - 1];
151
139
  if (lastChange && change.datetime && lastChange.datetime){
152
140
  if (change.datetime < lastChange.datetime){
@@ -175,20 +163,20 @@ function insertChange(data, flag) {
175
163
  console.log('null change')
176
164
  return
177
165
  }
178
- let string = name.get('text') || '';
166
+ let string = doc.get('text') || '';
179
167
  if (change.length > 0)
180
168
  change.removedValue = string.substr(change.start, change.length);
181
169
 
182
170
  if (flag == 'replace') {
183
171
  // ToDo get current string and create new changeLog array then push new change
184
172
  changeLog = [change];
185
- name.set('changeLog', changeLog)
173
+ doc.set('changeLog', changeLog)
186
174
  } else {
187
175
  changeLog.push(change);
188
176
  }
189
177
 
190
- name.set('text', string.customSplice(change.start, change.length, change.value));
191
- string = {string: name.get('text')};
178
+ doc.set('text', string.customSplice(change.start, change.length, change.value));
179
+ string = {string: doc.get('text')};
192
180
 
193
181
  if (!data.clientId){
194
182
  data['datetime'] = change.datetime;
@@ -222,16 +210,22 @@ function localChange(data, string) {
222
210
  }
223
211
 
224
212
  function persistChange(data) {
225
- let docName = generateDocName(data);
226
- let typeName = data.name;
227
- let name = docs.get(docName).get(typeName);
228
- let changeLog = name.get('changeLog');
213
+ let docName = getDocName(data);
214
+ let doc = docs.get(docName);
215
+ let changeLog = doc.get('changeLog');
216
+ let text = doc.get('tex');
229
217
  let Data = {
230
218
  collection: 'crdt-transactions',
231
219
  document: {
232
220
  _id: data.document_id,
233
221
  docName,
234
- [typeName]: changeLog
222
+ changeLog,
223
+ text,
224
+ crud: {
225
+ collection: data.collection,
226
+ document_id: data.document_id,
227
+ name: data.name
228
+ }
235
229
  },
236
230
  upsert: true,
237
231
  namespace: data.namespace,
@@ -246,14 +240,37 @@ function persistChange(data) {
246
240
 
247
241
  message.listen('crdt', function(response) {
248
242
  let data = response.data
249
- if (docs.get(`${data.collection}${data.document_id}`)){
250
- if (docs.get(`${data.collection}${data.document_id}`).get(data.name))
243
+ let docName = getDocName(data);
244
+ let doc = docs.get(docName);
245
+ console.log('doc2', doc)
246
+
247
+ if (doc){
251
248
  if (data.clientId !== clientId){
252
249
  insertChange(data);
253
250
  }
254
251
  }
255
252
  });
256
253
 
254
+ crud.listen('sync', function(data) {
255
+ if (data.collection.includes('crdt-transactions')) {
256
+ if (data.document && data.document[0]) {
257
+ let Data = data.document[0];
258
+ let docName = Data.docName;
259
+ let doc = docs.get(docName);
260
+ if (doc && Data.crud) {
261
+ Data.start = 0
262
+ Data.length = doc.set('text').length
263
+
264
+ doc.set('changeLog', Data.changeLog)
265
+ doc.set('text', Data.text)
266
+ localChange(Data.crud, Data.text)
267
+ console.log('crdtSync')
268
+ }
269
+ }
270
+ }
271
+ });
272
+
273
+
257
274
  /*
258
275
  crdt.getText({
259
276
  collection: 'modules',
@@ -263,11 +280,9 @@ crdt.getText({
263
280
  */
264
281
  async function getText(data) {
265
282
  try {
266
- let docName = generateDocName(data);
267
- let typeName = data.name;
268
283
  let doc = await getDoc(data);
269
284
  if (doc) {
270
- let value = docs.get(docName).get(typeName).get('text')
285
+ let value = doc.get('text')
271
286
  return value;
272
287
  }
273
288
  else {
@@ -367,12 +382,10 @@ function createChange(data, change){
367
382
  }
368
383
 
369
384
  function undoText(data){
370
- let docName = generateDocName(data);
371
- let typeName = data.name;
372
-
373
- let name = docs.get(docName).get(typeName);
374
- let changeLog = name.get('changeLog');
375
- let undoLog = name.get('undoLog')
385
+ let docName = getDocName(data);
386
+ let doc = docs.get(docName);
387
+ let changeLog = doc.get('changeLog');
388
+ let undoLog = doc.get('undoLog')
376
389
 
377
390
  for (let index = changeLog.length - 1; index >= 0; index--) {
378
391
  let change = Object.assign({}, changeLog[index]);
@@ -393,12 +406,10 @@ function undoText(data){
393
406
  }
394
407
 
395
408
  function redoText(data){
396
- let docName = generateDocName(data);
397
- let typeName = data.name;
398
-
399
- let name = docs.get(docName).get(typeName);
400
- let redoLog = name.get('redoLog')
401
- let undoLog = Array.from(name.get('undoLog').values());
409
+ let docName = getDocName(data);
410
+ let doc = docs.get(docName);
411
+ let redoLog = doc.get('redoLog')
412
+ let undoLog = Array.from(doc.get('undoLog').values());
402
413
 
403
414
  for (let index = undoLog.length - 1; index >= 0; index--) {
404
415
  let change = Object.assign({}, undoLog[index]);
@@ -419,9 +430,11 @@ function redoText(data){
419
430
 
420
431
  async function viewVersion(data) {
421
432
  try {
422
- let name = docs.get(`${data.collection}${data.document_id}`).get(data.name);
433
+ let docName = getDocName(data);
434
+ let doc = docs.get(docName);
435
+ let changeLog = doc.get('changeLog');
423
436
  let string = '';
424
- let changeLog = name.get('changeLog');
437
+
425
438
  let log = changeLog.slice(0, data.version)
426
439
  for (let change of log) {
427
440
  if (change || change !== null ) {
@@ -448,10 +461,8 @@ async function viewVersion(data) {
448
461
  // this.docs[docName].socket.awareness.off('change', this._awarenessListener);
449
462
  // }
450
463
 
451
- function generateDocName(data) {
452
- let docName = { collection: data.collection, document_id: data.document_id };
453
- return `${data.collection}${data.document_id}`;
454
- // return btoa(JSON.stringify(docName));
464
+ function getDocName(data) {
465
+ return `${data.collection}${data.document_id}${data.name}`;
455
466
  }
456
467
 
457
468
  export default { init, getText, updateText, replaceText, undoText, redoText, viewVersion };