@textbus/collaborate 2.0.0-alpha.36 → 2.0.0-alpha.39

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,151 @@
1
+ import { Map as YMap, YArrayEvent, YEvent, YMapEvent, Text as YText, YTextEvent, Array as YArray } from 'yjs'
2
+ import { ComponentInstance, ComponentLiteral, Registry, Slot, Translator } from '@textbus/core'
3
+
4
+ type YPath = [number, string][]
5
+
6
+ export class RemoteToLocal {
7
+ constructor(private translator: Translator,
8
+ private registry: Registry) {
9
+ }
10
+
11
+ transform(events: YEvent[], slot: Slot) {
12
+ events.forEach(ev => {
13
+ const path: YPath = []
14
+
15
+ for (let i = 0; i < ev.path.length; i += 2) {
16
+ path.push(ev.path.slice(i, i + 2) as [number, string])
17
+ }
18
+
19
+ if (path.length) {
20
+ const componentIndex = path.shift()![0] as number
21
+ const component = slot.getContentAtIndex(componentIndex) as ComponentInstance
22
+ this.applySharedComponentToComponent(ev, path, component)
23
+ return
24
+ }
25
+
26
+ this.applySharedSlotToSlot(ev, path, slot)
27
+ })
28
+ }
29
+
30
+ private applySharedComponentToComponent(ev: YEvent, path: YPath, component: ComponentInstance) {
31
+ if (path.length) {
32
+ const childPath = path.shift()!
33
+ const slot = component.slots.get(childPath[0])!
34
+ this.applySharedSlotToSlot(ev, path, slot)
35
+ return
36
+ }
37
+ if (ev instanceof YMapEvent) {
38
+ ev.keysChanged.forEach(key => {
39
+ if (key === 'state') {
40
+ const state = (ev.target as YMap<any>).get('state')
41
+ component.updateState(draft => {
42
+ Object.assign(draft, state)
43
+ })
44
+ }
45
+ })
46
+ } else if (ev instanceof YArrayEvent) {
47
+ const slots = component.slots
48
+ ev.delta.forEach(action => {
49
+ if (Reflect.has(action, 'retain')) {
50
+ slots.retain(action.retain!)
51
+ } else if (action.insert) {
52
+ (action.insert as Array<any>).forEach(item => {
53
+ slots.insert(this.translator.createSlot(item.toJSON())!)
54
+ })
55
+ } else if (action.delete) {
56
+ slots.retain(slots.index)
57
+ slots.delete(action.delete)
58
+ }
59
+ })
60
+ }
61
+ }
62
+
63
+ private applySharedSlotToSlot(ev: YEvent, path: YPath, slot: Slot) {
64
+ if (path.length) {
65
+ path.shift()
66
+ const delta = (ev.target.parent as YText).toDelta()
67
+ let componentIndex = 0
68
+ for (let i = 0; i < delta.length; i++) {
69
+ const action = delta[i]
70
+ if (action.insert === ev.target) {
71
+ break
72
+ }
73
+ componentIndex += typeof action.insert === 'string' ? action.insert.length : 1
74
+ }
75
+ const component = slot.getContentAtIndex(componentIndex) as ComponentInstance
76
+ this.applySharedComponentToComponent(ev, path, component)
77
+ return
78
+ }
79
+
80
+ if (ev instanceof YTextEvent) {
81
+ slot.retain(0)
82
+ ev.delta.forEach(action => {
83
+ if (Reflect.has(action, 'retain')) {
84
+ if (action.attributes) {
85
+ slot.retain(action.retain!, Object.keys(action.attributes).map(key => {
86
+ return [this.registry.getFormatter(key)!, action.attributes![key]]
87
+ }))
88
+ }
89
+ slot.retain(action.retain!)
90
+ } else if (action.insert) {
91
+ if (typeof action.insert === 'string') {
92
+ slot.insert(action.insert, action.attributes ? Object.keys(action.attributes).map(key => {
93
+ return [this.registry.getFormatter(key)!, action.attributes![key]]
94
+ }) : [])
95
+ } else {
96
+ const component = this.createComponentBySharedComponent(action.insert as YMap<any>)
97
+ slot.insert(component)
98
+ }
99
+ } else if (action.delete) {
100
+ slot.retain(slot.index)
101
+ slot.delete(action.delete)
102
+ } else if (action.attributes) {
103
+ slot.updateState(draft => {
104
+ Object.assign(draft, action.attributes)
105
+ })
106
+ }
107
+ })
108
+ } else {
109
+ throw new Error('xxx')
110
+ }
111
+ }
112
+
113
+ private createComponentBySharedComponent(yMap: YMap<any>): ComponentInstance {
114
+ const slots = yMap.get('slots') as YArray<YMap<any>>
115
+ const componentLiteral: ComponentLiteral = {
116
+ state: yMap.get('state'),
117
+ name: yMap.get('name'),
118
+ slots: slots.map(sharedSlot => {
119
+ return this.createSlotBySharedSlot(sharedSlot).toJSON()
120
+ })
121
+ }
122
+ return this.translator.createComponent(componentLiteral)!
123
+ }
124
+
125
+ private createSlotBySharedSlot(sharedSlot: YMap<any>): Slot {
126
+ const content = sharedSlot.get('content') as YText
127
+ const delta = content.toDelta()
128
+
129
+ const slot = this.translator.createSlot({
130
+ schema: sharedSlot.get('schema'),
131
+ state: sharedSlot.get('state'),
132
+ formats: {},
133
+ content: []
134
+ })
135
+
136
+ for (const action of delta) {
137
+ if (action.insert) {
138
+ if (typeof action.insert === 'string') {
139
+ slot.insert(action.insert, action.attributes ? Object.keys(action.attributes).map(key => {
140
+ return [this.registry.getFormatter(key)!, action.attributes![key]]
141
+ }) : [])
142
+ } else {
143
+ slot.insert(this.createComponentBySharedComponent(action.insert))
144
+ }
145
+ } else {
146
+ throw new Error('xxx')
147
+ }
148
+ }
149
+ return slot
150
+ }
151
+ }
@@ -1,54 +1,115 @@
1
1
  import { Injectable } from '@tanbo/di'
2
- import { debounceTime, filter, Subscription, tap } from '@tanbo/stream'
2
+ import { debounceTime, filter, Observable, Subject, Subscription, tap } from '@tanbo/stream'
3
3
  import {
4
4
  RootComponentRef,
5
5
  Starter,
6
6
  Operation,
7
7
  Translator,
8
- FormatterList
8
+ Registry,
9
+ Selection,
10
+ SelectionPaths,
11
+ History, Renderer
9
12
  } from '@textbus/core'
10
- import { Doc as YDoc } from 'yjs'
11
- import { localToRemote } from './local-to-remote'
12
- import { remoteToLocal } from './remote-to-local'
13
-
14
- // const collaborateErrorFn = makeError('Collaborate')
13
+ import { Doc as YDoc, UndoManager } from 'yjs'
14
+ import { LocalToRemote } from './collab/local-to-remote'
15
+ import { RemoteToLocal } from './collab/remote-to-local'
16
+ import { CollaborateCursor, RemoteSelection } from './collab/_api'
15
17
 
16
18
  @Injectable()
17
- export class Collaborate {
19
+ export class Collaborate implements History {
20
+ onSelectionChange: Observable<SelectionPaths>
18
21
  yDoc = new YDoc()
22
+ onBack: Observable<void>
23
+ onForward: Observable<void>
24
+ onChange: Observable<any>
25
+ onPush: Observable<void>
26
+
27
+ get canBack() {
28
+ return this.manager?.canUndo()
29
+ }
30
+
31
+ get canForward() {
32
+ return this.manager?.canRedo()
33
+ }
34
+
35
+ private localToRemote = new LocalToRemote()
36
+ private remoteToLocal = new RemoteToLocal(this.translator, this.registry)
37
+
38
+ private backEvent = new Subject<void>()
39
+ private forwardEvent = new Subject<void>()
40
+ private changeEvent = new Subject<void>()
41
+ private pushEvent = new Subject<void>()
42
+
43
+ private manager!: UndoManager
19
44
 
20
45
  private subscriptions: Subscription[] = []
21
46
  private updateFromSelf = true
22
47
 
48
+ private selectionChangeEvent = new Subject<SelectionPaths>()
49
+
23
50
  constructor(private rootComponentRef: RootComponentRef,
51
+ private collaborateCursor: CollaborateCursor,
24
52
  private translator: Translator,
25
- private formatterList: FormatterList,
53
+ private renderer: Renderer,
54
+ private registry: Registry,
55
+ private selection: Selection,
26
56
  private starter: Starter) {
57
+ this.onSelectionChange = this.selectionChangeEvent.asObservable()
58
+ this.onBack = this.backEvent.asObservable()
59
+ this.onForward = this.forwardEvent.asObservable()
60
+ this.onChange = this.changeEvent.asObservable()
61
+ this.onPush = this.pushEvent.asObservable()
27
62
  }
28
63
 
29
64
  setup() {
30
65
  this.subscriptions.push(
31
66
  this.starter.onReady.subscribe(() => {
32
- this.listen()
67
+ this.listen2()
68
+ }),
69
+ this.selection.onChange.subscribe(() => {
70
+ const paths = this.selection.getPaths()
71
+ this.selectionChangeEvent.next(paths)
33
72
  })
34
73
  )
35
74
  }
36
75
 
76
+ updateRemoteSelection(paths: RemoteSelection[]) {
77
+ this.collaborateCursor.draw(paths)
78
+ }
79
+
80
+ listen() {
81
+ //
82
+ }
83
+
84
+ back() {
85
+ if (this.canBack) {
86
+ this.manager.undo()
87
+ }
88
+ }
89
+
90
+ forward() {
91
+ if (this.canForward) {
92
+ this.manager.redo()
93
+ }
94
+ }
95
+
37
96
  destroy() {
38
97
  this.subscriptions.forEach(i => i.unsubscribe())
39
98
  }
40
99
 
41
- private listen() {
42
- const root = this.yDoc.getArray('content')
100
+ private listen2() {
101
+ const root = this.yDoc.getText('content')
43
102
  const slot = this.rootComponentRef.component.slots.get(0)!
103
+ this.manager = new UndoManager(root)
44
104
  root.observeDeep((events, transaction) => {
45
105
  if (transaction.origin === this.yDoc) {
46
106
  return
47
107
  }
48
108
  this.updateFromSelf = false
49
109
 
50
- remoteToLocal(events, slot, this.translator, this.formatterList)
51
-
110
+ this.remoteToLocal.transform(events, slot)
111
+ this.renderer.render()
112
+ this.selection.restore()
52
113
  this.updateFromSelf = true
53
114
  })
54
115
  const operations: Operation[] = []
@@ -64,10 +125,12 @@ export class Collaborate {
64
125
  ).subscribe(() => {
65
126
  this.yDoc.transact(() => {
66
127
  operations.forEach(operation => {
67
- localToRemote(operation, root)
128
+ this.localToRemote.transform(operation, root)
68
129
  })
69
130
  operations.length = 0
70
131
  }, this.yDoc)
132
+ this.renderer.render()
133
+ this.selection.restore()
71
134
  })
72
135
  )
73
136
  }
package/src/public-api.ts CHANGED
@@ -1 +1,2 @@
1
+ export * from './collab/_api'
1
2
  export * from './collaborate'
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "declaration": true,
4
+ "useDefineForClassFields": true,
4
5
  "emitDecoratorMetadata": true,
5
6
  "experimentalDecorators": true,
6
7
  "allowSyntheticDefaultImports": true,
@@ -10,6 +11,7 @@
10
11
  "module": "es2020",
11
12
  "moduleResolution": "node",
12
13
  "sourceMap": true,
14
+ "inlineSources": true,
13
15
  "noImplicitAny": false,
14
16
  "suppressImplicitAnyIndexErrors": true,
15
17
  "outDir": "bundles/",
@@ -1,3 +0,0 @@
1
- import { Operation } from '@textbus/core';
2
- import { Array as YArray } from 'yjs';
3
- export declare function localToRemote(operation: Operation, root: YArray<any>): void;
@@ -1,173 +0,0 @@
1
- import { Format } from '@textbus/core';
2
- import { Array as YArray, Map as YMap } from 'yjs';
3
- export function localToRemote(operation, root) {
4
- const path = [...operation.path];
5
- path.shift();
6
- if (path.length) {
7
- const componentIndex = path.shift();
8
- applyComponentOperationToSharedComponent(path, operation.apply, root.get(componentIndex));
9
- return;
10
- }
11
- insertContent(root, operation.apply);
12
- }
13
- function applyComponentOperationToSharedComponent(path, actions, componentYMap) {
14
- const sharedSlots = componentYMap.get('slots');
15
- if (path.length) {
16
- const slotIndex = path.shift();
17
- const sharedSlot = sharedSlots.get(slotIndex);
18
- applySlotOperationToSharedSlot(path, actions, sharedSlot);
19
- return;
20
- }
21
- let index;
22
- actions.forEach(action => {
23
- switch (action.type) {
24
- case 'retain':
25
- index = action.index;
26
- break;
27
- case 'insertSlot':
28
- sharedSlots.insert(index, [makeSharedSlotBySlotLiteral(action.slot)]);
29
- break;
30
- case 'apply':
31
- componentYMap.set('state', action.value);
32
- break;
33
- case 'delete':
34
- sharedSlots.delete(index, action.count);
35
- break;
36
- }
37
- });
38
- }
39
- function applySlotOperationToSharedSlot(path, actions, slotYMap) {
40
- if (path.length) {
41
- const componentIndex = path.shift();
42
- const sharedContent = slotYMap.get('content');
43
- const sharedComponent = sharedContent.get(componentIndex);
44
- applyComponentOperationToSharedComponent(path, actions, sharedComponent);
45
- return;
46
- }
47
- const content = slotYMap.get('content');
48
- let index;
49
- let len;
50
- actions.forEach(action => {
51
- switch (action.type) {
52
- case 'retain':
53
- if (action.formats) {
54
- mergeSharedFormats(index, action.index, action.formats, slotYMap);
55
- }
56
- index = action.index;
57
- break;
58
- case 'insert':
59
- if (typeof action.content === 'string') {
60
- len = action.content.length;
61
- content.insert(index, action.content.split(''));
62
- }
63
- else {
64
- len = 1;
65
- content.insert(index, [makeSharedComponentByComponentLiteral(action.content)]);
66
- }
67
- if (action.formats) {
68
- insertSharedFormats(index, len, action.formats, slotYMap);
69
- }
70
- break;
71
- case 'delete':
72
- if (content.length === 0) {
73
- // 当内容为空时,slot 实例内容为 ['\n'],触发删除会导致长度溢出
74
- return;
75
- }
76
- content.delete(index, action.count);
77
- break;
78
- case 'apply':
79
- slotYMap.set('state', action.value);
80
- break;
81
- }
82
- });
83
- }
84
- function insertSharedFormats(index, distance, formats, sharedSlots) {
85
- const sharedFormats = sharedSlots.get('formats');
86
- const keys = Array.from(sharedFormats.keys());
87
- const expandedValues = Array.from({ length: distance });
88
- keys.forEach(key => {
89
- const formatRanges = sharedFormats.get(key);
90
- const values = Format.tileRanges(formatRanges);
91
- values.splice(index, 0, ...expandedValues);
92
- const newRanges = Format.toRanges(values);
93
- sharedFormats.set(key, newRanges);
94
- });
95
- mergeSharedFormats(index, index + distance, formats, sharedSlots);
96
- }
97
- function mergeSharedFormats(startIndex, endIndex, formats, sharedSlots) {
98
- const sharedFormats = sharedSlots.get('formats');
99
- Object.keys(formats).forEach(key => {
100
- if (!sharedFormats.has(key)) {
101
- sharedFormats.set(key, [{
102
- startIndex,
103
- endIndex,
104
- value: formats[key]
105
- }]);
106
- }
107
- const oldFormatRanges = sharedFormats.get(key);
108
- const formatRanges = Format.normalizeFormatRange(oldFormatRanges, {
109
- startIndex,
110
- endIndex,
111
- value: formats[key]
112
- });
113
- sharedFormats.set(key, formatRanges);
114
- });
115
- }
116
- function insertContent(content, actions) {
117
- let index;
118
- actions.forEach(action => {
119
- switch (action.type) {
120
- case 'retain':
121
- index = action.index;
122
- break;
123
- case 'insert':
124
- content.insert(index, [
125
- typeof action.content === 'string' ?
126
- action.content :
127
- makeSharedComponentByComponentLiteral(action.content)
128
- ]);
129
- if (action.formats) {
130
- // TODO 根节点样式
131
- }
132
- break;
133
- case 'delete':
134
- content.delete(index, action.count);
135
- break;
136
- }
137
- });
138
- }
139
- function makeSharedSlotBySlotLiteral(slotLiteral) {
140
- const content = new YArray();
141
- let index = 0;
142
- slotLiteral.content.forEach(i => {
143
- let size;
144
- if (typeof i === 'string') {
145
- size = i.length;
146
- content.insert(index, [i]);
147
- }
148
- else {
149
- size = 1;
150
- content.insert(index, [makeSharedComponentByComponentLiteral(i)]);
151
- }
152
- index += size;
153
- });
154
- const formats = new YMap();
155
- const sharedSlot = new YMap();
156
- sharedSlot.set('state', slotLiteral.state);
157
- sharedSlot.set('content', content);
158
- sharedSlot.set('schema', slotLiteral.schema);
159
- sharedSlot.set('formats', formats);
160
- return sharedSlot;
161
- }
162
- function makeSharedComponentByComponentLiteral(componentLiteral) {
163
- const slots = new YArray();
164
- componentLiteral.slots.forEach(item => {
165
- slots.push([makeSharedSlotBySlotLiteral(item)]);
166
- });
167
- const sharedComponent = new YMap();
168
- sharedComponent.set('name', componentLiteral.name);
169
- sharedComponent.set('slots', slots);
170
- sharedComponent.set('state', componentLiteral.state);
171
- return sharedComponent;
172
- }
173
- //# sourceMappingURL=local-to-remote.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-to-remote.js","sourceRoot":"","sources":["../src/local-to-remote.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { YEvent } from 'yjs';
2
- import { FormatterList, Slot, Translator } from '@textbus/core';
3
- export declare function remoteToLocal(events: YEvent[], slot: Slot, translator: Translator, formatterList: FormatterList): void;
@@ -1,143 +0,0 @@
1
- import { YArrayEvent, YMapEvent } from 'yjs';
2
- import { FormatType } from '@textbus/core';
3
- export function remoteToLocal(events, slot, translator, formatterList) {
4
- events.forEach(ev => {
5
- const path = [];
6
- for (let i = 0; i < ev.path.length; i += 2) {
7
- path.push(ev.path.slice(i, i + 2));
8
- }
9
- if (path.length) {
10
- const componentIndex = path.shift()[0];
11
- const component = slot.getContentAtIndex(componentIndex);
12
- applySharedComponentToComponent(ev, path, component, translator, formatterList);
13
- return;
14
- }
15
- apply(ev, slot, translator);
16
- });
17
- }
18
- function applySharedComponentToComponent(ev, path, component, translator, formatterList) {
19
- if (path.length) {
20
- const childPath = path.shift();
21
- const slot = component.slots.get(childPath[0]);
22
- applySharedSlotToSlot(ev, path, slot, translator, formatterList, childPath[1] === 'formats');
23
- return;
24
- }
25
- if (ev instanceof YMapEvent) {
26
- ev.keysChanged.forEach(key => {
27
- if (key === 'state') {
28
- const state = ev.target.get('state');
29
- component.updateState(draft => {
30
- Object.assign(draft, state);
31
- });
32
- }
33
- });
34
- }
35
- else if (ev instanceof YArrayEvent) {
36
- const slots = component.slots;
37
- ev.delta.forEach(action => {
38
- if (Reflect.has(action, 'retain')) {
39
- slots.retain(action.retain);
40
- }
41
- else if (action.insert) {
42
- action.insert.forEach(item => {
43
- slots.insert(translator.createSlot(item.toJSON()));
44
- });
45
- }
46
- else if (action.delete) {
47
- slots.retain(slots.index);
48
- slots.delete(action.delete);
49
- }
50
- });
51
- }
52
- }
53
- function applySharedSlotToSlot(ev, path, slot, translator, formatterList, isUpdateFormats) {
54
- if (path.length) {
55
- const componentIndex = path.shift()[0];
56
- const component = slot.getContentAtIndex(componentIndex);
57
- applySharedComponentToComponent(ev, path, component, translator, formatterList);
58
- return;
59
- }
60
- if (ev instanceof YArrayEvent) {
61
- ev.delta.forEach(action => {
62
- if (Reflect.has(action, 'retain')) {
63
- slot.retain(action.retain);
64
- }
65
- else if (action.insert) {
66
- action.insert.forEach(item => {
67
- if (typeof item === 'string') {
68
- slot.insert(item);
69
- }
70
- else {
71
- slot.insert(translator.createComponent(item.toJSON()));
72
- }
73
- });
74
- }
75
- else if (action.delete) {
76
- slot.retain(slot.index);
77
- slot.delete(action.delete);
78
- }
79
- });
80
- }
81
- else if (ev instanceof YMapEvent) {
82
- if (isUpdateFormats) {
83
- const json = ev.target.toJSON();
84
- ev.keysChanged.forEach(key => {
85
- const formats = json[key];
86
- const formatter = formatterList.get(key);
87
- if (formatter.type !== FormatType.Block) {
88
- slot.applyFormat(formatter, {
89
- startIndex: 0,
90
- endIndex: slot.length,
91
- value: null
92
- });
93
- }
94
- formats.forEach(item => {
95
- if (formatter.type === FormatType.Block) {
96
- slot.applyFormat(formatter, item.value);
97
- }
98
- else {
99
- slot.applyFormat(formatter, item);
100
- }
101
- });
102
- });
103
- }
104
- else {
105
- ev.keysChanged.forEach(key => {
106
- if (key === 'state') {
107
- const state = ev.target.get('state');
108
- slot.updateState(draft => {
109
- Object.assign(draft, state);
110
- });
111
- }
112
- });
113
- }
114
- }
115
- }
116
- function apply(ev, slot, translator) {
117
- if (ev instanceof YArrayEvent) {
118
- slot.retain(0);
119
- const delta = ev.delta;
120
- delta.forEach(action => {
121
- if (action.insert) {
122
- action.insert.forEach(item => {
123
- if (typeof item === 'string') {
124
- slot.insert(item);
125
- }
126
- else {
127
- const json = item.toJSON();
128
- const component = translator.createComponent(json);
129
- slot.insert(component);
130
- }
131
- });
132
- }
133
- else if (action.retain) {
134
- slot.retain(action.retain);
135
- }
136
- else if (action.delete) {
137
- slot.retain(slot.index);
138
- slot.delete(action.delete);
139
- }
140
- });
141
- }
142
- }
143
- //# sourceMappingURL=remote-to-local.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote-to-local.js","sourceRoot":"","sources":["../src/remote-to-local.ts"],"names":[],"mappings":"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"}