@textbus/collaborate 2.0.0-beta.2 → 2.0.0-beta.22

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,33 +1,38 @@
1
1
  import { SelectionBridge } from '@textbus/browser';
2
- import { Selection, SelectionPaths } from '@textbus/core';
2
+ import { Selection, SelectionPaths, Range as TBRange } from '@textbus/core';
3
3
  export interface RemoteSelection {
4
4
  color: string;
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(range: TBRange, 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,265 @@
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({
136
+ focusOffset,
137
+ anchorOffset,
138
+ focusSlot,
139
+ anchorSlot
140
+ }, nativeRange);
141
+ }
142
+ if (!rects) {
143
+ rects = nativeRange.getClientRects();
144
+ }
145
+ const selectionRects = [];
146
+ for (let i = rects.length - 1; i >= 0; i--) {
147
+ const rect = rects[i];
148
+ selectionRects.push({
149
+ color: item.color,
150
+ username: item.username,
151
+ x: rect.x - containerRect.x,
152
+ y: rect.y - containerRect.y,
153
+ width: rect.width,
154
+ height: rect.height,
155
+ });
156
+ }
157
+ this.onRectsChange.next(selectionRects);
158
+ const cursorRange = nativeRange.cloneRange();
159
+ cursorRange.setStart(focus.node, focus.offset);
160
+ cursorRange.collapse(true);
161
+ const cursorRect = getLayoutRectByRange(cursorRange);
162
+ users.push({
163
+ username: item.username,
164
+ color: item.color,
165
+ x: cursorRect.x - containerRect.x,
166
+ y: cursorRect.y - containerRect.y,
167
+ width: 2,
168
+ height: cursorRect.height
169
+ });
170
+ });
171
+ this.drawUserCursor(users);
172
+ }
173
+ drawUserCursor(rects) {
174
+ for (let i = 0; i < rects.length; i++) {
175
+ const rect = rects[i];
176
+ const { cursor, userTip, anchor } = this.getUserCursor(i);
177
+ Object.assign(cursor.style, {
178
+ left: rect.x + 'px',
179
+ top: rect.y + 'px',
180
+ width: rect.width + 'px',
181
+ height: rect.height + 'px',
182
+ background: rect.color,
183
+ display: 'block'
184
+ });
185
+ anchor.style.background = rect.color;
186
+ userTip.innerText = rect.username;
187
+ userTip.style.background = rect.color;
188
+ }
189
+ for (let i = rects.length; i < this.tooltips.children.length; i++) {
190
+ this.tooltips.removeChild(this.tooltips.children[i]);
191
+ }
192
+ }
193
+ getUserCursor(index) {
194
+ let child = this.tooltips.children[index];
195
+ if (child) {
196
+ const anchor = child.children[0];
197
+ return {
198
+ cursor: child,
199
+ anchor,
200
+ userTip: anchor.children[0]
201
+ };
202
+ }
203
+ const userTip = createElement('span', {
204
+ styles: {
205
+ position: 'absolute',
206
+ display: 'none',
207
+ left: '50%',
208
+ transform: 'translateX(-50%)',
209
+ marginBottom: '2px',
210
+ bottom: '100%',
211
+ whiteSpace: 'nowrap',
212
+ color: '#fff',
213
+ boxShadow: '0 1px 2px rgba(0,0,0,.1)',
214
+ borderRadius: '3px',
215
+ padding: '3px 5px',
216
+ pointerEvents: 'none',
217
+ }
218
+ });
219
+ const anchor = createElement('span', {
220
+ styles: {
221
+ position: 'absolute',
222
+ top: '-2px',
223
+ left: '-2px',
224
+ width: '6px',
225
+ height: '6px',
226
+ pointerEvents: 'auto',
227
+ pointer: 'cursor',
228
+ },
229
+ children: [userTip],
230
+ on: {
231
+ mouseenter() {
232
+ userTip.style.display = 'block';
233
+ },
234
+ mouseleave() {
235
+ userTip.style.display = 'none';
236
+ }
237
+ }
238
+ });
239
+ child = createElement('span', {
240
+ styles: {
241
+ position: 'absolute',
242
+ },
243
+ children: [
244
+ anchor
245
+ ]
246
+ });
247
+ this.tooltips.append(child);
248
+ return {
249
+ cursor: child,
250
+ anchor,
251
+ userTip
252
+ };
253
+ }
254
+ };
255
+ CollaborateCursor = __decorate([
256
+ Injectable(),
257
+ __param(0, Inject(EDITOR_CONTAINER)),
258
+ __param(1, Optional()),
259
+ __metadata("design:paramtypes", [HTMLElement,
260
+ CollaborateCursorAwarenessDelegate,
261
+ SelectionBridge,
262
+ Selection])
263
+ ], CollaborateCursor);
264
+ export { CollaborateCursor };
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBMEJ2QyxNQUFNLE9BQWdCLGtDQUFrQztDQUV2RDtBQUdELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBNEI1QixZQUE4QyxTQUFzQixFQUNwQyxpQkFBcUQsRUFDakUsZUFBZ0MsRUFDaEMsU0FBb0I7Ozs7O21CQUhNOzs7Ozs7bUJBQ2Q7Ozs7OzttQkFDWjs7Ozs7O21CQUNBOztRQTlCcEI7Ozs7bUJBQWlCLGFBQWEsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZDLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsT0FBTyxFQUFFLEdBQUc7b0JBQ1osSUFBSSxFQUFFLENBQUM7b0JBQ1AsR0FBRyxFQUFFLENBQUM7b0JBQ04sS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE1BQU07b0JBQ2QsYUFBYSxFQUFFLE1BQU07aUJBQ3RCO2FBQ0YsQ0FBc0I7V0FBQTtRQUN2Qjs7OzttQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFO1dBQUE7UUFDL0M7Ozs7bUJBQW1CLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RDLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxF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LE1BQU0sQ0FBQTtnQkFDaEMsQ0FBQzthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxVQUFVO2FBQ3JCO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE1BQU07YUFDUDtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNCLE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBak5ZLGlCQUFpQjtJQUQ3QixVQUFVLEVBQUU7SUE2QkUsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN4QixXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQURrQyxXQUFXO1FBQ2pCLGtDQUFrQztRQUNoRCxlQUFlO1FBQ3JCLFNBQVM7R0EvQjdCLGlCQUFpQixDQWlON0I7U0FqTlksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEVESVRPUl9DT05UQUlORVIsXG4gIGdldExheW91dFJlY3RCeVJhbmdlLFxuICBTZWxlY3Rpb25CcmlkZ2Vcbn0gZnJvbSAnQHRleHRidXMvYnJvd3NlcidcbmltcG9ydCB7IFNlbGVjdGlvbiwgU2VsZWN0aW9uUGF0aHMsIFJhbmdlIGFzIFRCUmFuZ2UgfSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2VsZWN0aW9uIHtcbiAgY29sb3I6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG4gIHBhdGhzOiBTZWxlY3Rpb25QYXRoc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICB4OiBudW1iZXJcbiAgeTogbnVtYmVyXG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25SZWN0IGV4dGVuZHMgUmVjdCB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gIGN1cnNvcjogSFRNTEVsZW1lbnRcbiAgYW5jaG9yOiBIVE1MRWxlbWVudFxuICB1c2VyVGlwOiBIVE1MRWxlbWVudFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3JBd2FyZW5lc3NEZWxlZ2F0ZSB7XG4gIGFic3RyYWN0IGdldFJlY3RzKHJhbmdlOiBUQlJhbmdlLCBuYXRpdmVSYW5nZTogUmFuZ2UpOiBmYWxzZSB8IFJlY3RbXVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGVDdXJzb3Ige1xuICBwcml2YXRlIGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfSkgYXMgSFRNTENhbnZhc0VsZW1lbnRcbiAgcHJpdmF0ZSBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgcHJpdmF0ZSB0b29sdGlwcyA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgICB6SW5kZXg6IDEwXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgb25SZWN0c0NoYW5nZSA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblJlY3RbXT4oKVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRURJVE9SX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF3YXJlbmVzc0RlbGVnYXRlOiBDb2xsYWJvcmF0ZUN1cnNvckF3YXJlbmVzc0RlbGVnYXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIG5hdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uQnJpZGdlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XG4gICAgY29udGFpbmVyLnByZXBlbmQodGhpcy5jYW52YXMsIHRoaXMudG9vbHRpcHMpXG4gICAgdGhpcy5vblJlY3RzQ2hhbmdlLnN1YnNjcmliZShyZWN0cyA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHJlY3Qgb2YgcmVjdHMpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHJlY3QuY29sb3JcbiAgICAgICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpXG4gICAgICAgIHRoaXMuY29udGV4dC5yZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodClcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGwoKVxuICAgICAgICB0aGlzLmNvbnRleHQuY2xvc2VQYXRoKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJhdyhwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGhcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodFxuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcblxuICAgIGNvbnN0IHVzZXJzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuXG5cbiAgICBwYXRocy5maWx0ZXIoaSA9PiB7XG4gICAgICByZXR1cm4gaS5wYXRocy5hbmNob3IubGVuZ3RoICYmIGkucGF0aHMuZm9jdXMubGVuZ3RoXG4gICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IGl0ZW0ucGF0aHMuYW5jaG9yLnBvcCgpIVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmFuY2hvcilcbiAgICAgIGNvbnN0IGZvY3VzT2Zmc2V0ID0gaXRlbS5wYXRocy5mb2N1cy5wb3AoKSFcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhpdGVtLnBhdGhzLmZvY3VzKVxuICAgICAgaWYgKCFhbmNob3JTbG90IHx8ICFmb2N1c1Nsb3QpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmb2N1cywgYW5jaG9yfSA9IHRoaXMubmF0aXZlU2VsZWN0aW9uLmdldFBvc2l0aW9uQnlSYW5nZSh7XG4gICAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgYW5jaG9yU2xvdFxuICAgICAgfSlcbiAgICAgIGlmICghZm9jdXMgfHwgIWFuY2hvcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hdGl2ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpXG4gICAgICBuYXRpdmVSYW5nZS5zZXRFbmQoZm9jdXMubm9kZSwgZm9jdXMub2Zmc2V0KVxuICAgICAgaWYgKChhbmNob3Iubm9kZSAhPT0gZm9jdXMubm9kZSB8fCBhbmNob3Iub2Zmc2V0ICE9PSBmb2N1cy5vZmZzZXQpICYmIG5hdGl2ZVJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgICBuYXRpdmVSYW5nZS5zZXRTdGFydChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldClcbiAgICAgIH1cblxuICAgICAgbGV0IHJlY3RzOiBSZWN0W10gfCBET01SZWN0TGlzdCB8IGZhbHNlID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmF3YXJlbmVzc0RlbGVnYXRlKSB7XG4gICAgICAgIHJlY3RzID0gdGhpcy5hd2FyZW5lc3NEZWxlZ2F0ZS5nZXRSZWN0cyh7XG4gICAgICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgICBhbmNob3JTbG90XG4gICAgICAgIH0sIG5hdGl2ZVJhbmdlKVxuICAgICAgfVxuICAgICAgaWYgKCFyZWN0cykge1xuICAgICAgICByZWN0cyA9IG5hdGl2ZVJhbmdlLmdldENsaWVudFJlY3RzKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvblJlY3RzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IHJlY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgICBzZWxlY3Rpb25SZWN0cy5wdXNoKHtcbiAgICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgICB1c2VybmFtZTogaXRlbS51c2VybmFtZSxcbiAgICAgICAgICB4OiByZWN0LnggLSBjb250YWluZXJSZWN0LngsXG4gICAgICAgICAgeTogcmVjdC55IC0gY29udGFpbmVyUmVjdC55LFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLm9uUmVjdHNDaGFuZ2UubmV4dChzZWxlY3Rpb25SZWN0cylcblxuICAgICAgY29uc3QgY3Vyc29yUmFuZ2UgPSBuYXRpdmVSYW5nZS5jbG9uZVJhbmdlKClcbiAgICAgIGN1cnNvclJhbmdlLnNldFN0YXJ0KGZvY3VzLm5vZGUsIGZvY3VzLm9mZnNldClcbiAgICAgIGN1cnNvclJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgIGNvbnN0IGN1cnNvclJlY3QgPSBnZXRMYXlvdXRSZWN0QnlSYW5nZShjdXJzb3JSYW5nZSlcblxuICAgICAgdXNlcnMucHVzaCh7XG4gICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgeDogY3Vyc29yUmVjdC54IC0gY29udGFpbmVyUmVjdC54LFxuICAgICAgICB5OiBjdXJzb3JSZWN0LnkgLSBjb250YWluZXJSZWN0LnksXG4gICAgICAgIHdpZHRoOiAyLFxuICAgICAgICBoZWlnaHQ6IGN1cnNvclJlY3QuaGVpZ2h0XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5kcmF3VXNlckN1cnNvcih1c2VycylcbiAgfVxuXG4gIHByaXZhdGUgZHJhd1VzZXJDdXJzb3IocmVjdHM6IFNlbGVjdGlvblJlY3RbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgY29uc3Qge2N1cnNvciwgdXNlclRpcCwgYW5jaG9yfSA9IHRoaXMuZ2V0VXNlckN1cnNvcihpKVxuICAgICAgT2JqZWN0LmFzc2lnbihjdXJzb3Iuc3R5bGUsIHtcbiAgICAgICAgbGVmdDogcmVjdC54ICsgJ3B4JyxcbiAgICAgICAgdG9wOiByZWN0LnkgKyAncHgnLFxuICAgICAgICB3aWR0aDogcmVjdC53aWR0aCArICdweCcsXG4gICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQgKyAncHgnLFxuICAgICAgICBiYWNrZ3JvdW5kOiByZWN0LmNvbG9yLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICB9KVxuICAgICAgYW5jaG9yLnN0eWxlLmJhY2tncm91bmQgPSByZWN0LmNvbG9yXG4gICAgICB1c2VyVGlwLmlubmVyVGV4dCA9IHJlY3QudXNlcm5hbWVcbiAgICAgIHVzZXJUaXAuc3R5bGUuYmFja2dyb3VuZCA9IHJlY3QuY29sb3JcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gcmVjdHMubGVuZ3RoOyBpIDwgdGhpcy50b29sdGlwcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy50b29sdGlwcy5yZW1vdmVDaGlsZCh0aGlzLnRvb2x0aXBzLmNoaWxkcmVuW2ldKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckN1cnNvcihpbmRleDogbnVtYmVyKTogUmVtb3RlU2VsZWN0aW9uQ3Vyc29yIHtcbiAgICBsZXQgY2hpbGQ6IEhUTUxFbGVtZW50ID0gdGhpcy50b29sdGlwcy5jaGlsZHJlbltpbmRleF0gYXMgSFRNTEVsZW1lbnRcbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGNoaWxkLmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJzb3I6IGNoaWxkLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHVzZXJUaXA6IGFuY2hvci5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB1c2VyVGlwID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogJzJweCcsXG4gICAgICAgIGJvdHRvbTogJzEwMCUnLFxuICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgICAgY29sb3I6ICcjZmZmJyxcbiAgICAgICAgYm94U2hhZG93OiAnMCAxcHggMnB4IHJnYmEoMCwwLDAsLjEpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgcGFkZGluZzogJzNweCA1cHgnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGFuY2hvciA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogJy0ycHgnLFxuICAgICAgICBsZWZ0OiAnLTJweCcsXG4gICAgICAgIHdpZHRoOiAnNnB4JyxcbiAgICAgICAgaGVpZ2h0OiAnNnB4JyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ2F1dG8nLFxuICAgICAgICBwb2ludGVyOiAnY3Vyc29yJyxcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogW3VzZXJUaXBdLFxuICAgICAgb246IHtcbiAgICAgICAgbW91c2VlbnRlcigpIHtcbiAgICAgICAgICB1c2VyVGlwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlbGVhdmUoKSB7XG4gICAgICAgICAgdXNlclRpcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIGNoaWxkID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICBhbmNob3JcbiAgICAgIF1cbiAgICB9KVxuICAgIHRoaXMudG9vbHRpcHMuYXBwZW5kKGNoaWxkKVxuICAgIHJldHVybiB7XG4gICAgICBjdXJzb3I6IGNoaWxkLFxuICAgICAgYW5jaG9yLFxuICAgICAgdXNlclRpcFxuICAgIH1cbiAgfVxufVxuIl19
@@ -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;