-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.ts
80 lines (72 loc) · 1.7 KB
/
main.ts
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
import "./cursor.css";
import { editor } from "monaco-editor/esm/vs/editor/editor.api";
import { LoroDoc } from "loro-crdt";
import { MonacoAwareness, MonacoBinding } from "loro-monaco";
import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
self.MonacoEnvironment = {
getWorker() {
return new editorWorker();
},
};
const divA = document.getElementById("editorA")!;
const divB = document.getElementById("editorB")!;
const editorA = editor.create(divA, {
theme: "vs",
language: "javascript",
automaticLayout: true,
});
const editorB = editor.create(divB, {
theme: "vs",
language: "javascript",
automaticLayout: true,
});
const docA = new LoroDoc();
const docB = new LoroDoc();
const textA = docA.getText("code");
const textB = docB.getText("code");
const awarenessA = new MonacoAwareness(docA.peerIdStr);
const awarenessB = new MonacoAwareness(docB.peerIdStr);
docA.subscribe((event) => {
if (event.by == "local") {
docB.import(
docA.export({
mode: "update",
from: docB.oplogVersion(),
})
);
}
});
docB.subscribe((event) => {
if (event.by == "local") {
docA.import(
docB.export({
mode: "update",
from: docA.oplogVersion(),
})
);
}
});
awarenessA.addListener((_state, origin) => {
if (origin === "local") {
awarenessB.apply(awarenessA.encode([docA.peerIdStr]));
}
});
awarenessB.addListener((_state, origin) => {
if (origin === "local") {
awarenessA.apply(awarenessB.encode([docB.peerIdStr]));
}
});
new MonacoBinding(
docA,
textA,
editorA.getModel()!,
new Set([editorA]),
awarenessA
);
new MonacoBinding(
docB,
textB,
editorB.getModel()!,
new Set([editorB]),
awarenessB
);