Skip to content

Commit 7ae7c63

Browse files
committed
fix presenece (previous commit does not work)
1 parent 40f5a5b commit 7ae7c63

File tree

3 files changed

+57
-31
lines changed

3 files changed

+57
-31
lines changed

client.js

+53-25
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
const g = require("./global.js");
2+
g.codeshare.debug = window.location.hostname == "localhost";
3+
14
const sharedb = require('sharedb/lib/client');
25
const CodeMirror = require('codemirror');
36
const shortid = require('shortid');
@@ -35,8 +38,13 @@ socket.addEventListener('error', function () {
3538
connStatusSpan.style.backgroundColor = 'red';
3639
});
3740

38-
const setDocStatus = (msg) => {
41+
const setDocStatus = (msg, ok = true) => {
3942
docStatusSpan.innerHTML = msg;
43+
if (ok) {
44+
docStatusSpan.style.backgroundColor = undefined;
45+
} else {
46+
docStatusSpan.style.backgroundColor = 'red';
47+
}
4048
};
4149

4250
setDocStatus("initializing...");
@@ -119,9 +127,11 @@ doc.subscribe(function (err) {
119127
log.info("doc before op:", ops, source);
120128
});
121129

130+
let applyingOp = false;
122131
doc.on("op", (ops, source) => {
123132
log.group("doc op:", ops, source);
124133
try {
134+
applyingOp = true;
125135
if (source) {
126136
return;
127137
}
@@ -155,6 +165,7 @@ doc.subscribe(function (err) {
155165
console.error(thrown.message);
156166
throw thrown;
157167
} finally {
168+
applyingOp = false;
158169
log.groupEnd();
159170
}
160171
});
@@ -167,7 +178,7 @@ doc.subscribe(function (err) {
167178
} else {
168179
// log.info("codeMirror.getValue()", codeMirror.getValue())
169180
if (doc.type === null) {
170-
setDocStatus("synchronization failed... please save your doc manually and refresh");
181+
setDocStatus("synchronization failed... please save your doc manually and refresh", false);
171182
// doc.create(codeMirror.getValue(), (err) => {
172183
// if (err) {
173184
// console.error("error while creating, resync in 5 sec", err);
@@ -185,44 +196,53 @@ doc.subscribe(function (err) {
185196
});
186197
};
187198

199+
const errHandler = (err) => {
200+
if (err) {
201+
console.error("error while submitting", err);
202+
setDocStatus("synchronizing...");
203+
if (!needSync) {
204+
log.info("already synchronizing...");
205+
needSync = true;
206+
sync();
207+
}
208+
}
209+
};
210+
let opQueue = [];
188211
codeMirror.on("beforeChange", (codeMirror, change) => {
189212
log.group("on codeMirror beforeChange");
190213
try {
214+
let changeCp = change;
191215
if (needSync) {
192216
log.info("need sychronize");
193-
while (change) {
194-
if (change.origin !== "setValue") {
195-
change.cancel();
217+
while (changeCp) {
218+
if (changeCp.origin !== "setValue") {
219+
changeCp.cancel();
196220
}
197-
change = change.next;
221+
changeCp = changeCp.next;
198222
}
199223
} else {
200-
while (change) {
201-
log.info("change", change);
202-
if (change.origin !== "+sharedb") {
203-
const indexFrom = codeMirror.indexFromPos(change.from);
204-
const indexTo = codeMirror.indexFromPos(change.to);
205-
doc.submitOp([
224+
while (changeCp) {
225+
log.info("change", changeCp);
226+
if (changeCp.origin !== "+sharedb") {
227+
const indexFrom = codeMirror.indexFromPos(changeCp.from);
228+
const indexTo = codeMirror.indexFromPos(changeCp.to);
229+
opQueue.push([
206230
indexFrom,
207231
{ d: indexTo - indexFrom },
208-
change.text.join("\n")
209-
], (err) => {
210-
if (err) {
211-
console.error("error while submitting", err);
212-
setDocStatus("synchronizing...");
213-
if (!needSync) {
214-
log.info("already synchronizing...");
215-
needSync = true;
216-
sync();
217-
}
218-
}
219-
});
232+
changeCp.text.join("\n")
233+
]);
220234
}
221-
change = change.next;
235+
changeCp = changeCp.next;
222236
}
223237
}
224238
} catch (thrown) {
225239
console.error(thrown.message);
240+
// cancel all changes if error
241+
opQueue = [];
242+
while (change) {
243+
change.cancel();
244+
change = change.next;
245+
}
226246
throw thrown;
227247
} finally {
228248
log.groupEnd();
@@ -242,8 +262,13 @@ doc.subscribe(function (err) {
242262
}
243263
change = change.next;
244264
}
265+
} else {
266+
for (let i = 0; i < opQueue.length; i++) {
267+
doc.submitOp(opQueue[i], errHandler);
268+
}
245269
}
246270
} finally {
271+
opQueue = [];
247272
log.groupEnd();
248273
}
249274
});
@@ -260,6 +285,9 @@ doc.subscribe(function (err) {
260285
codeMirror.on('cursorActivity', (codeMirror) => {
261286
log.group('on codeMirror cursorActivity', codeMirror);
262287
try {
288+
if (applyingOp) {
289+
return;
290+
}
263291
const cursorPos = codeMirror.getCursor();
264292
const index = codeMirror.indexFromPos(cursorPos);
265293
localPresence.submit(index, (err) => {

log.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const group = (msg, ...args) => {
55
console.group(msg, ...args);
66
}
77
};
8-
const groupEnd = (msg, ...args) => {
8+
const groupEnd = () => {
99
if (g.codeshare.debug) {
1010
console.groupEnd();
1111
}

ot.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ type.transformPresence = (range, ops, source) => {
1010
if (range === undefined || range === null) {
1111
return range;
1212
}
13-
// no transform if source is remote
14-
if (!source) {
15-
return range;
16-
}
17-
return type.transformPosition(range, ops);
13+
newRange = type.transformPosition(range, ops);
14+
console.log(range, ops, newRange);
15+
return newRange;
1816
} finally {
1917
log.groupEnd();
2018
}

0 commit comments

Comments
 (0)