@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 +12 -0
- package/demo/index.html +5 -4
- package/package.json +1 -1
- package/src/index.js +77 -66
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
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
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 =
|
|
25
|
-
let typeName = data.name;
|
|
24
|
+
let docName = getDocName(data);
|
|
26
25
|
let doc = docs.get(docName);
|
|
27
26
|
|
|
28
27
|
if (!doc) {
|
|
29
|
-
|
|
30
|
-
docs.set(docName, docNameMap);
|
|
28
|
+
docs.set(docName, new Map());
|
|
31
29
|
doc = docs.get(docName);
|
|
32
30
|
}
|
|
33
31
|
|
|
34
|
-
|
|
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
|
-
|
|
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
|
|
62
|
-
changeLog = response.document[0]
|
|
49
|
+
if (response.document && response.document[0] && response.document[0].changeLog) {
|
|
50
|
+
changeLog = response.document[0].changeLog;
|
|
63
51
|
}
|
|
64
52
|
}
|
|
65
|
-
|
|
53
|
+
doc.set('changeLog', changeLog);
|
|
66
54
|
await generateText(data, true);
|
|
67
55
|
}
|
|
68
56
|
}
|
|
69
|
-
else if (!
|
|
57
|
+
else if (!doc.has('text')){
|
|
70
58
|
await generateText(data, false);
|
|
71
59
|
}
|
|
72
|
-
return
|
|
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
|
|
73
|
+
let doc = docs.get(getDocName(data))
|
|
74
|
+
console.log('docName1', doc)
|
|
75
|
+
|
|
86
76
|
let string = '';
|
|
87
|
-
let 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
|
-
|
|
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 =
|
|
127
|
-
let
|
|
128
|
-
let
|
|
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 =
|
|
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
|
-
|
|
173
|
+
doc.set('changeLog', changeLog)
|
|
186
174
|
} else {
|
|
187
175
|
changeLog.push(change);
|
|
188
176
|
}
|
|
189
177
|
|
|
190
|
-
|
|
191
|
-
string = {string:
|
|
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 =
|
|
226
|
-
let
|
|
227
|
-
let
|
|
228
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
250
|
-
|
|
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 =
|
|
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 =
|
|
371
|
-
let
|
|
372
|
-
|
|
373
|
-
let
|
|
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 =
|
|
397
|
-
let
|
|
398
|
-
|
|
399
|
-
let
|
|
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
|
|
433
|
+
let docName = getDocName(data);
|
|
434
|
+
let doc = docs.get(docName);
|
|
435
|
+
let changeLog = doc.get('changeLog');
|
|
423
436
|
let string = '';
|
|
424
|
-
|
|
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
|
|
452
|
-
|
|
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 };
|