-
-
Notifications
You must be signed in to change notification settings - Fork 29
/
client.js
100 lines (81 loc) · 2.54 KB
/
client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
var ShareDB = require('sharedb/lib/client');
var richText = require('rich-text');
ShareDB.types.register(richText.type);
// Open WebSocket connection to ShareDB server
var socket = new WebSocket(getWebSocketDocUrl());
var connection = new ShareDB.Connection(socket);
var docSubs = {};
var onTextChanges = {};
var onOps = {};
var realTime = {};
function getWebSocketDocUrl() {
var url = 'wss://' + window.location.host;
return (url.endsWith(':8443')) ? url : url + ':8443';
}
realTime.createAndSubscribeRichTextDoc =
function createAndSubscribeRichTextDoc(collection, id, quill) {
var doc;
if (id in docSubs) {
doc = docSubs[id];
realTime.disconnectRichTextDoc(id, quill);
} else {
collection = collection || 'collection';
doc = connection.get(collection, id);
doc.fetch(function (err) {
if (err) throw err;
if (doc.type === null) {
doc.create([{ insert: '' }], richText.type.name);
}
});
}
docSubs[id] = doc;
doc.subscribe(function (err) {
if (err) throw err;
quill.setContents(doc.data);
onTextChanges[id] = function (delta, oldDelta, source) {
if (source !== Quill.sources.USER) return;
doc.submitOp(delta, { source: quill });
// console.log('onTextChange: docId', id, 'data', quill.getText());
};
quill.on(Quill.events.TEXT_CHANGE, onTextChanges[id]);
onOps[id] = function (op, source) {
if (source === quill) return;
quill.updateContents(op);
// console.log('onOp: docId', id, 'data', quill.getText());
};
doc.on('op', onOps[id]);
});
};
realTime.updateRichTextDoc = function updateRichTextDoc(collection, id, delta, source) {
var doc;
if (id in docSubs) {
doc = docSubs[id];
doc.submitOp(delta, { source: source });
} else {
collection = collection || 'collection';
doc = connection.get(collection, id);
doc.fetch(function (err) {
if (err) throw err;
if (doc.type === null) {
doc.create([{ insert: '' }], richText.type.name);
} else {
doc.submitOp(delta, { source: source });
}
});
}
};
realTime.disconnectRichTextDoc = function disconnectRichTextDoc(id, quill) {
if (id in onTextChanges) {
quill.off(Quill.events.TEXT_CHANGE, onTextChanges[id]);
delete onTextChanges[id];
}
if (id in docSubs) {
if (id in onOps) {
docSubs[id].removeListener('op', onOps[id]);
delete onOps[id];
}
docSubs[id].destroy();
delete docSubs[id];
}
};
exports.realTime = realTime;