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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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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"}