@textbus/collaborate 4.0.0-alpha.26 → 4.0.0-alpha.28

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  import { Injectable, Inject, Optional } from '@viewfly/core';
2
2
  import { Subject, map, filter } from '@tanbo/stream';
3
- import { makeError, HISTORY_STACK_SIZE, ChangeOrigin, MapModel, ArrayModel, Slot, RootComponentRef, Scheduler, Registry, Selection, History } from '@textbus/core';
4
- import { Doc, UndoManager, Map, Array, Text, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex } from 'yjs';
3
+ import { makeError, HISTORY_STACK_SIZE, ChangeOrigin, createObjectProxy, createArrayProxy, Slot, RootComponentRef, Scheduler, Registry, Selection, History } from '@textbus/core';
4
+ import { Doc, UndoManager, Map, Array as Array$1, Text, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex } from 'yjs';
5
5
 
6
6
  /******************************************************************************
7
7
  Copyright (c) Microsoft Corporation.
@@ -269,25 +269,23 @@ let Collaborate = class Collaborate {
269
269
  }
270
270
  syncSharedMapToLocalMap(sharedMap, localMap, parent) {
271
271
  sharedMap.forEach((value, key) => {
272
- localMap.set(key, this.createLocalModelBySharedByModel(value, parent));
272
+ localMap[key] = this.createLocalModelBySharedByModel(value, parent);
273
273
  });
274
274
  this.syncObject(sharedMap, localMap, parent);
275
275
  }
276
276
  createLocalMapBySharedMap(sharedMap, parent) {
277
- const localMap = new MapModel(parent);
277
+ const localMap = createObjectProxy({}, parent);
278
278
  this.syncSharedMapToLocalMap(sharedMap, localMap, parent);
279
279
  return localMap;
280
280
  }
281
281
  createLocalArrayBySharedArray(sharedArray, parent) {
282
- const localArray = new ArrayModel(parent);
283
- sharedArray.forEach(item => {
284
- localArray.insert(this.createLocalModelBySharedByModel(item, parent));
285
- });
282
+ const localArray = createArrayProxy([], parent);
283
+ localArray.push(...sharedArray.map(item => this.createLocalModelBySharedByModel(item, parent)));
286
284
  this.syncArray(sharedArray, localArray, parent);
287
285
  return localArray;
288
286
  }
289
287
  syncLocalMapToSharedMap(localMap, sharedMap, parent) {
290
- localMap.forEach((value, key) => {
288
+ Object.entries(localMap).forEach(([key, value]) => {
291
289
  sharedMap.set(key, this.createSharedModelByLocalModel(value, parent));
292
290
  });
293
291
  this.syncObject(sharedMap, localMap, parent);
@@ -298,7 +296,7 @@ let Collaborate = class Collaborate {
298
296
  return sharedMap;
299
297
  }
300
298
  createSharedArrayByLocalArray(localArray, parent) {
301
- const sharedArray = new Array();
299
+ const sharedArray = new Array$1();
302
300
  localArray.forEach(value => {
303
301
  sharedArray.push([this.createSharedModelByLocalModel(value, parent)]);
304
302
  });
@@ -363,37 +361,29 @@ let Collaborate = class Collaborate {
363
361
  this.syncSlot(sharedSlot, localSlot);
364
362
  return localSlot;
365
363
  }
366
- // private createSharedModelByLocalModel(sharedModel: YMap<any>, parent: Component<any>): MapModel<any>
367
- // private createSharedModelByLocalModel(sharedModel: YArray<any>, parent: Component<any>): ArrayModel<any>
368
- // private createSharedModelByLocalModel(sharedModel: YText, parent: Component<any>): Slot
369
- // private createSharedModelByLocalModel(sharedModel: any, parent: Component<any>): any
370
- createSharedModelByLocalModel(sharedModel, parent) {
371
- if (sharedModel instanceof MapModel) {
372
- return this.createSharedMapByLocalMap(sharedModel, parent);
364
+ createSharedModelByLocalModel(localModel, parent) {
365
+ if (localModel instanceof Slot) {
366
+ return this.createSharedSlotByLocalSlot(localModel);
373
367
  }
374
- if (sharedModel instanceof ArrayModel) {
375
- return this.createSharedArrayByLocalArray(sharedModel, parent);
368
+ if (Array.isArray(localModel)) {
369
+ return this.createSharedArrayByLocalArray(localModel, parent);
376
370
  }
377
- if (sharedModel instanceof Slot) {
378
- return this.createSharedSlotByLocalSlot(sharedModel);
371
+ if (typeof localModel === 'object' && localModel !== null) {
372
+ return this.createSharedMapByLocalMap(localModel, parent);
379
373
  }
380
- return sharedModel;
374
+ return localModel;
381
375
  }
382
- // private createLocalModelBySharedByModel(localModel: MapModel<any>, parent: Component<any>): MapModel<any>
383
- // private createLocalModelBySharedByModel(localModel: ArrayModel<any>, parent: Component<any>): YArray<any>
384
- // private createLocalModelBySharedByModel(localModel: Slot, parent: Component<any>): YText
385
- // private createLocalModelBySharedByModel(localModel: any, parent: Component<any>): any
386
- createLocalModelBySharedByModel(localModel, parent) {
387
- if (localModel instanceof Map) {
388
- return this.createLocalMapBySharedMap(localModel, parent);
376
+ createLocalModelBySharedByModel(sharedModel, parent) {
377
+ if (sharedModel instanceof Map) {
378
+ return this.createLocalMapBySharedMap(sharedModel, parent);
389
379
  }
390
- if (localModel instanceof Array) {
391
- return this.createLocalArrayBySharedArray(localModel, parent);
380
+ if (sharedModel instanceof Array$1) {
381
+ return this.createLocalArrayBySharedArray(sharedModel, parent);
392
382
  }
393
- if (localModel instanceof Text) {
394
- return this.createLocalSlotBySharedSlot(localModel);
383
+ if (sharedModel instanceof Text) {
384
+ return this.createLocalSlotBySharedSlot(sharedModel);
395
385
  }
396
- return localModel;
386
+ return sharedModel;
397
387
  }
398
388
  getAbstractSelection(position) {
399
389
  const anchorPosition = createAbsolutePositionFromRelativePosition(position.anchor, this.yDoc);
@@ -567,7 +557,7 @@ let Collaborate = class Collaborate {
567
557
  });
568
558
  });
569
559
  this.slotMap.set(localSlot, sharedSlot);
570
- localSlot.destroyCallbacks.push(() => {
560
+ localSlot.changeMarker.destroyCallbacks.push(() => {
571
561
  this.slotMap.delete(localSlot);
572
562
  sharedSlot.unobserve(syncRemote);
573
563
  sub.unsubscribe();
@@ -599,23 +589,29 @@ let Collaborate = class Collaborate {
599
589
  * @private
600
590
  */
601
591
  syncArray(sharedArray, localArray, parent) {
602
- const sub = localArray.changeMarker.onChange.subscribe((op) => {
592
+ const sub = localArray.__changeMarker__.onSelfChange.subscribe((actions) => {
603
593
  this.runLocalUpdate(() => {
604
594
  let index = 0;
605
- for (const action of op.apply) {
595
+ for (const action of actions) {
606
596
  switch (action.type) {
607
597
  case 'retain':
608
598
  index = action.offset;
609
599
  break;
610
600
  case 'insert':
611
601
  {
612
- const data = this.createSharedModelByLocalModel(action.ref, parent);
602
+ const data = action.ref.map(item => {
603
+ return this.createSharedModelByLocalModel(item, parent);
604
+ });
613
605
  sharedArray.insert(index, [data]);
614
606
  }
615
607
  break;
616
608
  case 'delete':
617
609
  sharedArray.delete(index, 1);
618
610
  break;
611
+ case 'setIndex':
612
+ sharedArray.delete(action.index, 1);
613
+ sharedArray.insert(action.index, this.createSharedModelByLocalModel(action.ref, parent));
614
+ break;
619
615
  }
620
616
  }
621
617
  });
@@ -623,28 +619,25 @@ let Collaborate = class Collaborate {
623
619
  const syncRemote = (ev, tr) => {
624
620
  this.runRemoteUpdate(tr, () => {
625
621
  let index = 0;
626
- localArray.retain(index);
627
622
  ev.delta.forEach((action) => {
628
623
  if (Reflect.has(action, 'retain')) {
629
624
  index += action.retain;
630
- localArray.retain(index);
631
625
  }
632
626
  else if (action.insert) {
633
- action.insert.forEach((item) => {
634
- const value = this.createLocalModelBySharedByModel(item, parent);
635
- localArray.insert(value);
636
- index++;
627
+ const data = action.insert.map((item) => {
628
+ return this.createLocalModelBySharedByModel(item, parent);
637
629
  });
630
+ localArray.splice(index, 0, ...data);
631
+ index += data.length;
638
632
  }
639
633
  else if (action.delete) {
640
- localArray.retain(index);
641
- localArray.delete(action.delete);
634
+ localArray.splice(index, action.delete);
642
635
  }
643
636
  });
644
637
  });
645
638
  };
646
639
  sharedArray.observe(syncRemote);
647
- localArray.destroyCallbacks.push(() => {
640
+ localArray.__changeMarker__.destroyCallbacks.push(() => {
648
641
  sub.unsubscribe();
649
642
  sharedArray.unobserve(syncRemote);
650
643
  });
@@ -662,18 +655,18 @@ let Collaborate = class Collaborate {
662
655
  ev.changes.keys.forEach((item, key) => {
663
656
  if (item.action === 'add' || item.action === 'update') {
664
657
  const value = sharedObject.get(key);
665
- localObject.set(key, this.createLocalModelBySharedByModel(value, parent));
658
+ localObject[key] = this.createLocalModelBySharedByModel(value, parent);
666
659
  }
667
660
  else {
668
- localObject.remove(key);
661
+ Reflect.deleteProperty(localObject, key);
669
662
  }
670
663
  });
671
664
  });
672
665
  };
673
666
  sharedObject.observe(syncRemote);
674
- const sub = localObject.changeMarker.onChange.subscribe((op) => {
667
+ const sub = localObject.__changeMarker__.onSelfChange.subscribe((actions) => {
675
668
  this.runLocalUpdate(() => {
676
- for (const action of op.apply) {
669
+ for (const action of actions) {
677
670
  switch (action.type) {
678
671
  case 'propSet':
679
672
  sharedObject.set(action.key, this.createSharedModelByLocalModel(action.value, parent));
package/bundles/index.js CHANGED
@@ -271,25 +271,23 @@ exports.Collaborate = class Collaborate {
271
271
  }
272
272
  syncSharedMapToLocalMap(sharedMap, localMap, parent) {
273
273
  sharedMap.forEach((value, key) => {
274
- localMap.set(key, this.createLocalModelBySharedByModel(value, parent));
274
+ localMap[key] = this.createLocalModelBySharedByModel(value, parent);
275
275
  });
276
276
  this.syncObject(sharedMap, localMap, parent);
277
277
  }
278
278
  createLocalMapBySharedMap(sharedMap, parent) {
279
- const localMap = new core.MapModel(parent);
279
+ const localMap = core.createObjectProxy({}, parent);
280
280
  this.syncSharedMapToLocalMap(sharedMap, localMap, parent);
281
281
  return localMap;
282
282
  }
283
283
  createLocalArrayBySharedArray(sharedArray, parent) {
284
- const localArray = new core.ArrayModel(parent);
285
- sharedArray.forEach(item => {
286
- localArray.insert(this.createLocalModelBySharedByModel(item, parent));
287
- });
284
+ const localArray = core.createArrayProxy([], parent);
285
+ localArray.push(...sharedArray.map(item => this.createLocalModelBySharedByModel(item, parent)));
288
286
  this.syncArray(sharedArray, localArray, parent);
289
287
  return localArray;
290
288
  }
291
289
  syncLocalMapToSharedMap(localMap, sharedMap, parent) {
292
- localMap.forEach((value, key) => {
290
+ Object.entries(localMap).forEach(([key, value]) => {
293
291
  sharedMap.set(key, this.createSharedModelByLocalModel(value, parent));
294
292
  });
295
293
  this.syncObject(sharedMap, localMap, parent);
@@ -365,37 +363,29 @@ exports.Collaborate = class Collaborate {
365
363
  this.syncSlot(sharedSlot, localSlot);
366
364
  return localSlot;
367
365
  }
368
- // private createSharedModelByLocalModel(sharedModel: YMap<any>, parent: Component<any>): MapModel<any>
369
- // private createSharedModelByLocalModel(sharedModel: YArray<any>, parent: Component<any>): ArrayModel<any>
370
- // private createSharedModelByLocalModel(sharedModel: YText, parent: Component<any>): Slot
371
- // private createSharedModelByLocalModel(sharedModel: any, parent: Component<any>): any
372
- createSharedModelByLocalModel(sharedModel, parent) {
373
- if (sharedModel instanceof core.MapModel) {
374
- return this.createSharedMapByLocalMap(sharedModel, parent);
366
+ createSharedModelByLocalModel(localModel, parent) {
367
+ if (localModel instanceof core.Slot) {
368
+ return this.createSharedSlotByLocalSlot(localModel);
375
369
  }
376
- if (sharedModel instanceof core.ArrayModel) {
377
- return this.createSharedArrayByLocalArray(sharedModel, parent);
370
+ if (Array.isArray(localModel)) {
371
+ return this.createSharedArrayByLocalArray(localModel, parent);
378
372
  }
379
- if (sharedModel instanceof core.Slot) {
380
- return this.createSharedSlotByLocalSlot(sharedModel);
373
+ if (typeof localModel === 'object' && localModel !== null) {
374
+ return this.createSharedMapByLocalMap(localModel, parent);
381
375
  }
382
- return sharedModel;
376
+ return localModel;
383
377
  }
384
- // private createLocalModelBySharedByModel(localModel: MapModel<any>, parent: Component<any>): MapModel<any>
385
- // private createLocalModelBySharedByModel(localModel: ArrayModel<any>, parent: Component<any>): YArray<any>
386
- // private createLocalModelBySharedByModel(localModel: Slot, parent: Component<any>): YText
387
- // private createLocalModelBySharedByModel(localModel: any, parent: Component<any>): any
388
- createLocalModelBySharedByModel(localModel, parent) {
389
- if (localModel instanceof yjs.Map) {
390
- return this.createLocalMapBySharedMap(localModel, parent);
378
+ createLocalModelBySharedByModel(sharedModel, parent) {
379
+ if (sharedModel instanceof yjs.Map) {
380
+ return this.createLocalMapBySharedMap(sharedModel, parent);
391
381
  }
392
- if (localModel instanceof yjs.Array) {
393
- return this.createLocalArrayBySharedArray(localModel, parent);
382
+ if (sharedModel instanceof yjs.Array) {
383
+ return this.createLocalArrayBySharedArray(sharedModel, parent);
394
384
  }
395
- if (localModel instanceof yjs.Text) {
396
- return this.createLocalSlotBySharedSlot(localModel);
385
+ if (sharedModel instanceof yjs.Text) {
386
+ return this.createLocalSlotBySharedSlot(sharedModel);
397
387
  }
398
- return localModel;
388
+ return sharedModel;
399
389
  }
400
390
  getAbstractSelection(position) {
401
391
  const anchorPosition = yjs.createAbsolutePositionFromRelativePosition(position.anchor, this.yDoc);
@@ -569,7 +559,7 @@ exports.Collaborate = class Collaborate {
569
559
  });
570
560
  });
571
561
  this.slotMap.set(localSlot, sharedSlot);
572
- localSlot.destroyCallbacks.push(() => {
562
+ localSlot.changeMarker.destroyCallbacks.push(() => {
573
563
  this.slotMap.delete(localSlot);
574
564
  sharedSlot.unobserve(syncRemote);
575
565
  sub.unsubscribe();
@@ -601,23 +591,29 @@ exports.Collaborate = class Collaborate {
601
591
  * @private
602
592
  */
603
593
  syncArray(sharedArray, localArray, parent) {
604
- const sub = localArray.changeMarker.onChange.subscribe((op) => {
594
+ const sub = localArray.__changeMarker__.onSelfChange.subscribe((actions) => {
605
595
  this.runLocalUpdate(() => {
606
596
  let index = 0;
607
- for (const action of op.apply) {
597
+ for (const action of actions) {
608
598
  switch (action.type) {
609
599
  case 'retain':
610
600
  index = action.offset;
611
601
  break;
612
602
  case 'insert':
613
603
  {
614
- const data = this.createSharedModelByLocalModel(action.ref, parent);
604
+ const data = action.ref.map(item => {
605
+ return this.createSharedModelByLocalModel(item, parent);
606
+ });
615
607
  sharedArray.insert(index, [data]);
616
608
  }
617
609
  break;
618
610
  case 'delete':
619
611
  sharedArray.delete(index, 1);
620
612
  break;
613
+ case 'setIndex':
614
+ sharedArray.delete(action.index, 1);
615
+ sharedArray.insert(action.index, this.createSharedModelByLocalModel(action.ref, parent));
616
+ break;
621
617
  }
622
618
  }
623
619
  });
@@ -625,28 +621,25 @@ exports.Collaborate = class Collaborate {
625
621
  const syncRemote = (ev, tr) => {
626
622
  this.runRemoteUpdate(tr, () => {
627
623
  let index = 0;
628
- localArray.retain(index);
629
624
  ev.delta.forEach((action) => {
630
625
  if (Reflect.has(action, 'retain')) {
631
626
  index += action.retain;
632
- localArray.retain(index);
633
627
  }
634
628
  else if (action.insert) {
635
- action.insert.forEach((item) => {
636
- const value = this.createLocalModelBySharedByModel(item, parent);
637
- localArray.insert(value);
638
- index++;
629
+ const data = action.insert.map((item) => {
630
+ return this.createLocalModelBySharedByModel(item, parent);
639
631
  });
632
+ localArray.splice(index, 0, ...data);
633
+ index += data.length;
640
634
  }
641
635
  else if (action.delete) {
642
- localArray.retain(index);
643
- localArray.delete(action.delete);
636
+ localArray.splice(index, action.delete);
644
637
  }
645
638
  });
646
639
  });
647
640
  };
648
641
  sharedArray.observe(syncRemote);
649
- localArray.destroyCallbacks.push(() => {
642
+ localArray.__changeMarker__.destroyCallbacks.push(() => {
650
643
  sub.unsubscribe();
651
644
  sharedArray.unobserve(syncRemote);
652
645
  });
@@ -664,18 +657,18 @@ exports.Collaborate = class Collaborate {
664
657
  ev.changes.keys.forEach((item, key) => {
665
658
  if (item.action === 'add' || item.action === 'update') {
666
659
  const value = sharedObject.get(key);
667
- localObject.set(key, this.createLocalModelBySharedByModel(value, parent));
660
+ localObject[key] = this.createLocalModelBySharedByModel(value, parent);
668
661
  }
669
662
  else {
670
- localObject.remove(key);
663
+ Reflect.deleteProperty(localObject, key);
671
664
  }
672
665
  });
673
666
  });
674
667
  };
675
668
  sharedObject.observe(syncRemote);
676
- const sub = localObject.changeMarker.onChange.subscribe((op) => {
669
+ const sub = localObject.__changeMarker__.onSelfChange.subscribe((actions) => {
677
670
  this.runLocalUpdate(() => {
678
- for (const action of op.apply) {
671
+ for (const action of actions) {
679
672
  switch (action.type) {
680
673
  case 'propSet':
681
674
  sharedObject.set(action.key, this.createSharedModelByLocalModel(action.value, parent));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textbus/collaborate",
3
- "version": "4.0.0-alpha.26",
3
+ "version": "4.0.0-alpha.28",
4
4
  "description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
5
5
  "main": "./bundles/index.js",
6
6
  "module": "./bundles/index.esm.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "dependencies": {
28
28
  "@tanbo/stream": "^1.2.3",
29
- "@textbus/core": "^4.0.0-alpha.26",
29
+ "@textbus/core": "^4.0.0-alpha.28",
30
30
  "@viewfly/core": "^0.6.0",
31
31
  "reflect-metadata": "^0.1.13",
32
32
  "y-protocols": "^1.0.5",
@@ -50,5 +50,5 @@
50
50
  "bugs": {
51
51
  "url": "https://github.com/textbus/textbus.git/issues"
52
52
  },
53
- "gitHead": "36aff3db9897ccd73ba4533972991d537778bd6e"
53
+ "gitHead": "afb457beb39742c7e00f78b71cd24e13443bae56"
54
54
  }