@textbus/collaborate 2.0.0-beta.0 → 2.0.0-beta.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,29 +5,34 @@ export interface RemoteSelection {
5
5
  username: string;
6
6
  paths: SelectionPaths;
7
7
  }
8
- export interface SelectionRect {
9
- color: string;
10
- username: string;
8
+ export interface Rect {
11
9
  x: number;
12
10
  y: number;
13
11
  width: number;
14
12
  height: number;
15
13
  }
14
+ export interface SelectionRect extends Rect {
15
+ color: string;
16
+ username: string;
17
+ }
16
18
  export interface RemoteSelectionCursor {
17
19
  cursor: HTMLElement;
18
20
  anchor: HTMLElement;
19
21
  userTip: HTMLElement;
20
22
  }
23
+ export declare abstract class CollaborateCursorAwarenessDelegate {
24
+ abstract getRects(selection: Selection, nativeRange: Range): false | Rect[];
25
+ }
21
26
  export declare class CollaborateCursor {
22
27
  private container;
23
- private document;
28
+ private awarenessDelegate;
24
29
  private nativeSelection;
25
30
  private selection;
26
31
  private canvas;
27
32
  private context;
28
33
  private tooltips;
29
34
  private onRectsChange;
30
- constructor(container: HTMLElement, document: Document, nativeSelection: SelectionBridge, selection: Selection);
35
+ constructor(container: HTMLElement, awarenessDelegate: CollaborateCursorAwarenessDelegate, nativeSelection: SelectionBridge, selection: Selection);
31
36
  draw(paths: RemoteSelection[]): void;
32
37
  private drawUserCursor;
33
38
  private getUserCursor;
@@ -0,0 +1,260 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, Injectable, Optional } from '@tanbo/di';
14
+ import { createElement, EDITOR_CONTAINER, getLayoutRectByRange, SelectionBridge } from '@textbus/browser';
15
+ import { Selection } from '@textbus/core';
16
+ import { Subject } from '@tanbo/stream';
17
+ export class CollaborateCursorAwarenessDelegate {
18
+ }
19
+ let CollaborateCursor = class CollaborateCursor {
20
+ constructor(container, awarenessDelegate, nativeSelection, selection) {
21
+ Object.defineProperty(this, "container", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: container
26
+ });
27
+ Object.defineProperty(this, "awarenessDelegate", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: awarenessDelegate
32
+ });
33
+ Object.defineProperty(this, "nativeSelection", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: nativeSelection
38
+ });
39
+ Object.defineProperty(this, "selection", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: selection
44
+ });
45
+ Object.defineProperty(this, "canvas", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: createElement('canvas', {
50
+ styles: {
51
+ position: 'absolute',
52
+ opacity: 0.5,
53
+ left: 0,
54
+ top: 0,
55
+ width: '100%',
56
+ height: '100%',
57
+ pointerEvents: 'none'
58
+ }
59
+ })
60
+ });
61
+ Object.defineProperty(this, "context", {
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true,
65
+ value: this.canvas.getContext('2d')
66
+ });
67
+ Object.defineProperty(this, "tooltips", {
68
+ enumerable: true,
69
+ configurable: true,
70
+ writable: true,
71
+ value: createElement('div', {
72
+ styles: {
73
+ position: 'absolute',
74
+ left: 0,
75
+ top: 0,
76
+ width: '100%',
77
+ height: '100%',
78
+ pointerEvents: 'none',
79
+ fontSize: '12px',
80
+ zIndex: 10
81
+ }
82
+ })
83
+ });
84
+ Object.defineProperty(this, "onRectsChange", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: new Subject()
89
+ });
90
+ container.prepend(this.canvas, this.tooltips);
91
+ this.onRectsChange.subscribe(rects => {
92
+ for (const rect of rects) {
93
+ this.context.fillStyle = rect.color;
94
+ this.context.beginPath();
95
+ this.context.rect(rect.x, rect.y, rect.width, rect.height);
96
+ this.context.fill();
97
+ this.context.closePath();
98
+ }
99
+ });
100
+ }
101
+ draw(paths) {
102
+ const containerRect = this.container.getBoundingClientRect();
103
+ this.canvas.width = containerRect.width;
104
+ this.canvas.height = containerRect.height;
105
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
106
+ const users = [];
107
+ paths.filter(i => {
108
+ return i.paths.anchor.length && i.paths.focus.length;
109
+ }).forEach(item => {
110
+ const anchorOffset = item.paths.anchor.pop();
111
+ const anchorSlot = this.selection.findSlotByPaths(item.paths.anchor);
112
+ const focusOffset = item.paths.focus.pop();
113
+ const focusSlot = this.selection.findSlotByPaths(item.paths.focus);
114
+ if (!anchorSlot || !focusSlot) {
115
+ return;
116
+ }
117
+ const { focus, anchor } = this.nativeSelection.getPositionByRange({
118
+ focusOffset,
119
+ anchorOffset,
120
+ focusSlot,
121
+ anchorSlot
122
+ });
123
+ if (!focus || !anchor) {
124
+ return;
125
+ }
126
+ const nativeRange = document.createRange();
127
+ nativeRange.setStart(anchor.node, anchor.offset);
128
+ nativeRange.setEnd(focus.node, focus.offset);
129
+ if ((anchor.node !== focus.node || anchor.offset !== focus.offset) && nativeRange.collapsed) {
130
+ nativeRange.setStart(focus.node, focus.offset);
131
+ nativeRange.setEnd(anchor.node, anchor.offset);
132
+ }
133
+ let rects = false;
134
+ if (this.awarenessDelegate) {
135
+ rects = this.awarenessDelegate.getRects(this.selection, nativeRange);
136
+ }
137
+ if (!rects) {
138
+ rects = nativeRange.getClientRects();
139
+ }
140
+ const selectionRects = [];
141
+ for (let i = rects.length - 1; i >= 0; i--) {
142
+ const rect = rects[i];
143
+ selectionRects.push({
144
+ color: item.color,
145
+ username: item.username,
146
+ x: rect.x - containerRect.x,
147
+ y: rect.y - containerRect.y,
148
+ width: rect.width,
149
+ height: rect.height,
150
+ });
151
+ }
152
+ this.onRectsChange.next(selectionRects);
153
+ const cursorRange = nativeRange.cloneRange();
154
+ cursorRange.setStart(focus.node, focus.offset);
155
+ cursorRange.collapse(true);
156
+ const cursorRect = getLayoutRectByRange(cursorRange);
157
+ users.push({
158
+ username: item.username,
159
+ color: item.color,
160
+ x: cursorRect.x - containerRect.x,
161
+ y: cursorRect.y - containerRect.y,
162
+ width: 2,
163
+ height: cursorRect.height
164
+ });
165
+ });
166
+ this.drawUserCursor(users);
167
+ }
168
+ drawUserCursor(rects) {
169
+ for (let i = 0; i < rects.length; i++) {
170
+ const rect = rects[i];
171
+ const { cursor, userTip, anchor } = this.getUserCursor(i);
172
+ Object.assign(cursor.style, {
173
+ left: rect.x + 'px',
174
+ top: rect.y + 'px',
175
+ width: rect.width + 'px',
176
+ height: rect.height + 'px',
177
+ background: rect.color,
178
+ display: 'block'
179
+ });
180
+ anchor.style.background = rect.color;
181
+ userTip.innerText = rect.username;
182
+ userTip.style.background = rect.color;
183
+ }
184
+ for (let i = rects.length; i < this.tooltips.children.length; i++) {
185
+ this.tooltips.removeChild(this.tooltips.children[i]);
186
+ }
187
+ }
188
+ getUserCursor(index) {
189
+ let child = this.tooltips.children[index];
190
+ if (child) {
191
+ const anchor = child.children[0];
192
+ return {
193
+ cursor: child,
194
+ anchor,
195
+ userTip: anchor.children[0]
196
+ };
197
+ }
198
+ const userTip = createElement('span', {
199
+ styles: {
200
+ position: 'absolute',
201
+ display: 'none',
202
+ left: '50%',
203
+ transform: 'translateX(-50%)',
204
+ marginBottom: '2px',
205
+ bottom: '100%',
206
+ whiteSpace: 'nowrap',
207
+ color: '#fff',
208
+ boxShadow: '0 1px 2px rgba(0,0,0,.1)',
209
+ borderRadius: '3px',
210
+ padding: '3px 5px',
211
+ pointerEvents: 'none',
212
+ }
213
+ });
214
+ const anchor = createElement('span', {
215
+ styles: {
216
+ position: 'absolute',
217
+ top: '-2px',
218
+ left: '-2px',
219
+ width: '6px',
220
+ height: '6px',
221
+ pointerEvents: 'auto',
222
+ pointer: 'cursor',
223
+ },
224
+ children: [userTip],
225
+ on: {
226
+ mouseenter() {
227
+ userTip.style.display = 'block';
228
+ },
229
+ mouseleave() {
230
+ userTip.style.display = 'none';
231
+ }
232
+ }
233
+ });
234
+ child = createElement('span', {
235
+ styles: {
236
+ position: 'absolute',
237
+ },
238
+ children: [
239
+ anchor
240
+ ]
241
+ });
242
+ this.tooltips.append(child);
243
+ return {
244
+ cursor: child,
245
+ anchor,
246
+ userTip
247
+ };
248
+ }
249
+ };
250
+ CollaborateCursor = __decorate([
251
+ Injectable(),
252
+ __param(0, Inject(EDITOR_CONTAINER)),
253
+ __param(1, Optional()),
254
+ __metadata("design:paramtypes", [HTMLElement,
255
+ CollaborateCursorAwarenessDelegate,
256
+ SelectionBridge,
257
+ Selection])
258
+ ], CollaborateCursor);
259
+ export { CollaborateCursor };
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBMEJ2QyxNQUFNLE9BQWdCLGtDQUFrQztDQUV2RDtBQUdELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBNEI1QixZQUE4QyxTQUFzQixFQUNwQyxpQkFBcUQsRUFDakUsZUFBZ0MsRUFDaEMsU0FBb0I7Ozs7O21CQUhNOzs7Ozs7bUJBQ2Q7Ozs7OzttQkFDWjs7Ozs7O21CQUNBOztRQTlCcEI7Ozs7bUJBQWlCLGFBQWEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsT0FBTyxFQUFFLEdBQUc7b0JBQ1osSUFBSSxFQUFFLENBQUM7b0JBQ1AsR0FBRyxFQUFFLENBQUM7b0JBQ04sS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE1BQU07b0JBQ2QsYUFBYSxFQUFFLE1BQU07aUJBQ3RCO2FBQ0YsQ0FBc0I7V0FBQTtRQUN2Qjs7OzttQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFO1dBQUE7UUFDL0M7Ozs7bUJBQW1CLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RDLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxF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QyxDQUFBO1FBQ0YsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxVQUFVO2FBQ3JCO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE1BQU07YUFDUDtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNCLE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBNU1ZLGlCQUFpQjtJQUQ3QixVQUFVLEVBQUU7SUE2QkUsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN4QixXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQURrQyxXQUFXO1FBQ2pCLGtDQUFrQztRQUNoRCxlQUFlO1FBQ3JCLFNBQVM7R0EvQjdCLGlCQUFpQixDQTRNN0I7U0E1TVksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEVESVRPUl9DT05UQUlORVIsXG4gIGdldExheW91dFJlY3RCeVJhbmdlLFxuICBTZWxlY3Rpb25CcmlkZ2Vcbn0gZnJvbSAnQHRleHRidXMvYnJvd3NlcidcbmltcG9ydCB7IFNlbGVjdGlvbiwgU2VsZWN0aW9uUGF0aHMgfSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2VsZWN0aW9uIHtcbiAgY29sb3I6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG4gIHBhdGhzOiBTZWxlY3Rpb25QYXRoc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25SZWN0IGV4dGVuZHMgUmVjdCB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gIGN1cnNvcjogSFRNTEVsZW1lbnRcbiAgYW5jaG9yOiBIVE1MRWxlbWVudFxuICB1c2VyVGlwOiBIVE1MRWxlbWVudFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3JBd2FyZW5lc3NEZWxlZ2F0ZSB7XG4gIGFic3RyYWN0IGdldFJlY3RzKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBuYXRpdmVSYW5nZTogUmFuZ2UpOiBmYWxzZSB8IFJlY3RbXVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3Ige1xuICBwcml2YXRlIGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfSkgYXMgSFRNTENhbnZhc0VsZW1lbnRcbiAgcHJpdmF0ZSBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgcHJpdmF0ZSB0b29sdGlwcyA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgICB6SW5kZXg6IDEwXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgb25SZWN0c0NoYW5nZSA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblJlY3RbXT4oKVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRURJVE9SX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF3YXJlbmVzc0RlbGVnYXRlOiBDb2xsYWJvcmF0ZUN1cnNvckF3YXJlbmVzc0RlbGVnYXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIG5hdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uQnJpZGdlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XG4gICAgY29udGFpbmVyLnByZXBlbmQodGhpcy5jYW52YXMsIHRoaXMudG9vbHRpcHMpXG4gICAgdGhpcy5vblJlY3RzQ2hhbmdlLnN1YnNjcmliZShyZWN0cyA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJlY3Qgb2YgcmVjdHMpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHJlY3QuY29sb3JcbiAgICAgICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpXG4gICAgICAgIHRoaXMuY29udGV4dC5yZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodClcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGwoKVxuICAgICAgICB0aGlzLmNvbnRleHQuY2xvc2VQYXRoKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJhdyhwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGhcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodFxuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcblxuICAgIGNvbnN0IHVzZXJzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuXG5cbiAgICBwYXRocy5maWx0ZXIoaSA9PiB7XG4gICAgICByZXR1cm4gaS5wYXRocy5hbmNob3IubGVuZ3RoICYmIGkucGF0aHMuZm9jdXMubGVuZ3RoXG4gICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IGl0ZW0ucGF0aHMuYW5jaG9yLnBvcCgpIVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmFuY2hvcilcbiAgICAgIGNvbnN0IGZvY3VzT2Zmc2V0ID0gaXRlbS5wYXRocy5mb2N1cy5wb3AoKSFcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmZvY3VzKVxuICAgICAgaWYgKCFhbmNob3JTbG90IHx8ICFmb2N1c1Nsb3QpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmb2N1cywgYW5jaG9yfSA9IHRoaXMubmF0aXZlU2VsZWN0aW9uLmdldFBvc2l0aW9uQnlSYW5nZSh7XG4gICAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgYW5jaG9yU2xvdFxuICAgICAgfSlcbiAgICAgIGlmICghZm9jdXMgfHwgIWFuY2hvcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hdGl2ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpXG4gICAgICBuYXRpdmVSYW5nZS5zZXRFbmQoZm9jdXMubm9kZSwgZm9jdXMub2Zmc2V0KVxuICAgICAgaWYgKChhbmNob3Iubm9kZSAhPT0gZm9jdXMubm9kZSB8fCBhbmNob3Iub2Zmc2V0ICE9PSBmb2N1cy5vZmZzZXQpICYmIG5hdGl2ZVJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgICBuYXRpdmVSYW5nZS5zZXRTdGFydChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldClcbiAgICAgIH1cblxuICAgICAgbGV0IHJlY3RzOiBSZWN0W10gfCBET01SZWN0TGlzdCB8IGZhbHNlID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmF3YXJlbmVzc0RlbGVnYXRlKSB7XG4gICAgICAgIHJlY3RzID0gdGhpcy5hd2FyZW5lc3NEZWxlZ2F0ZS5nZXRSZWN0cyh0aGlzLnNlbGVjdGlvbiwgbmF0aXZlUmFuZ2UpXG4gICAgICB9XG4gICAgICBpZiAoIXJlY3RzKSB7XG4gICAgICAgIHJlY3RzID0gbmF0aXZlUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9uUmVjdHM6IFNlbGVjdGlvblJlY3RbXSA9IFtdXG4gICAgICBmb3IgKGxldCBpID0gcmVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICAgIHNlbGVjdGlvblJlY3RzLnB1c2goe1xuICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICAgIHg6IHJlY3QueCAtIGNvbnRhaW5lclJlY3QueCxcbiAgICAgICAgICB5OiByZWN0LnkgLSBjb250YWluZXJSZWN0LnksXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25SZWN0c0NoYW5nZS5uZXh0KHNlbGVjdGlvblJlY3RzKVxuXG4gICAgICBjb25zdCBjdXJzb3JSYW5nZSA9IG5hdGl2ZVJhbmdlLmNsb25lUmFuZ2UoKVxuICAgICAgY3Vyc29yUmFuZ2Uuc2V0U3RhcnQoZm9jdXMubm9kZSwgZm9jdXMub2Zmc2V0KVxuICAgICAgY3Vyc29yUmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgY29uc3QgY3Vyc29yUmVjdCA9IGdldExheW91dFJlY3RCeVJhbmdlKGN1cnNvclJhbmdlKVxuXG4gICAgICB1c2Vycy5wdXNoKHtcbiAgICAgICAgdXNlcm5hbWU6IGl0ZW0udXNlcm5hbWUsXG4gICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICB4OiBjdXJzb3JSZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgIHk6IGN1cnNvclJlY3QueSAtIGNvbnRhaW5lclJlY3QueSxcbiAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgIGhlaWdodDogY3Vyc29yUmVjdC5oZWlnaHRcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLmRyYXdVc2VyQ3Vyc29yKHVzZXJzKVxuICB9XG5cbiAgcHJpdmF0ZSBkcmF3VXNlckN1cnNvcihyZWN0czogU2VsZWN0aW9uUmVjdFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICBjb25zdCB7Y3Vyc29yLCB1c2VyVGlwLCBhbmNob3J9ID0gdGhpcy5nZXRVc2VyQ3Vyc29yKGkpXG4gICAgICBPYmplY3QuYXNzaWduKGN1cnNvci5zdHlsZSwge1xuICAgICAgICBsZWZ0OiByZWN0LnggKyAncHgnLFxuICAgICAgICB0b3A6IHJlY3QueSArICdweCcsXG4gICAgICAgIHdpZHRoOiByZWN0LndpZHRoICsgJ3B4JyxcbiAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArICdweCcsXG4gICAgICAgIGJhY2tncm91bmQ6IHJlY3QuY29sb3IsXG4gICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgIH0pXG4gICAgICBhbmNob3Iuc3R5bGUuYmFja2dyb3VuZCA9IHJlY3QuY29sb3JcbiAgICAgIHVzZXJUaXAuaW5uZXJUZXh0ID0gcmVjdC51c2VybmFtZVxuICAgICAgdXNlclRpcC5zdHlsZS5iYWNrZ3JvdW5kID0gcmVjdC5jb2xvclxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSByZWN0cy5sZW5ndGg7IGkgPCB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnRvb2x0aXBzLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcHMuY2hpbGRyZW5baV0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQ3Vyc29yKGluZGV4OiBudW1iZXIpOiBSZW1vdGVTZWxlY3Rpb25DdXJzb3Ige1xuICAgIGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuW2luZGV4XSBhcyBIVE1MRWxlbWVudFxuICAgIGlmIChjaGlsZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gY2hpbGQuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgdXNlclRpcDogYW5jaG9yLmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVzZXJUaXAgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIGxlZnQ6ICc1MCUnLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyxcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnMnB4JyxcbiAgICAgICAgYm90dG9tOiAnMTAwJScsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgICBib3hTaGFkb3c6ICcwIDFweCAycHggcmdiYSgwLDAsMCwuMSknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICBwYWRkaW5nOiAnM3B4IDVweCcsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYW5jaG9yID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnLTJweCcsXG4gICAgICAgIGxlZnQ6ICctMnB4JyxcbiAgICAgICAgd2lkdGg6ICc2cHgnLFxuICAgICAgICBoZWlnaHQ6ICc2cHgnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnYXV0bycsXG4gICAgICAgIHBvaW50ZXI6ICdjdXJzb3InLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbdXNlclRpcF0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyKCkge1xuICAgICAgICAgIHVzZXJUaXAuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VsZWF2ZSgpIHtcbiAgICAgICAgICB1c2VyVGlwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgY2hpbGQgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIGFuY2hvclxuICAgICAgXVxuICAgIH0pXG4gICAgdGhpcy50b29sdGlwcy5hcHBlbmQoY2hpbGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICBhbmNob3IsXG4gICAgICB1c2VyVGlwXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,12 +1,12 @@
1
1
  import { Observable } from '@tanbo/stream';
2
- import { RootComponentRef, Starter, Translator, Registry, Selection, SelectionPaths, History, Renderer } from '@textbus/core';
2
+ import { History, Registry, RootComponentRef, Scheduler, Selection, SelectionPaths, Starter, Translator } from '@textbus/core';
3
3
  import { Doc as YDoc } from 'yjs';
4
- import { CollaborateCursor, RemoteSelection } from './collab/_api';
4
+ import { CollaborateCursor, RemoteSelection } from './collaborate-cursor';
5
5
  export declare class Collaborate implements History {
6
6
  private rootComponentRef;
7
7
  private collaborateCursor;
8
+ private scheduler;
8
9
  private translator;
9
- private renderer;
10
10
  private registry;
11
11
  private selection;
12
12
  private starter;
@@ -31,14 +31,14 @@ export declare class Collaborate implements History {
31
31
  private componentStateSyncCaches;
32
32
  private selectionChangeEvent;
33
33
  private updateRemoteActions;
34
- constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, translator: Translator, renderer: Renderer, registry: Registry, selection: Selection, starter: Starter);
34
+ constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, scheduler: Scheduler, translator: Translator, registry: Registry, selection: Selection, starter: Starter);
35
35
  setup(): void;
36
36
  updateRemoteSelection(paths: RemoteSelection[]): void;
37
37
  listen(): void;
38
38
  back(): void;
39
39
  forward(): void;
40
40
  destroy(): void;
41
- private listen2;
41
+ private syncRootComponent;
42
42
  private syncContent;
43
43
  private syncSlot;
44
44
  private syncSlots;