@textbus/collaborate 5.3.2 → 5.3.3

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.
@@ -72,9 +72,13 @@ export declare class Collaborate {
72
72
  private sharedModelForArraySlot;
73
73
  /**
74
74
  * 在可观察数组中插入稀疏空洞(与 YArray 中 XmlElement 占位对齐)。
75
- * 仅在远端同步路径调用;直接操作 raw,避免走插入 undefined 的可观察路径。
75
+ * 仅在远端同步路径调用;先改 raw,再用与 {@link ArrayProxyHandler} `length` 增长一致的原子命令
76
+ * `retain` + `insert`(`undefined` 槽)记录,`unApply` 为 `retain` + `delete`。
77
+ * `runLocalUpdate` 在 `updateFromRemote` 为 true 时会跳过,不会把洞再写回 Y。
76
78
  */
77
79
  private insertSparseHole;
80
+ /** 与 Y 洞位对齐的稀疏洞写入,仅操作 raw */
81
+ private applySparseHoleToRaw;
78
82
  /**
79
83
  * 双向同步数组
80
84
  * @param sharedArray
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Injectable, Inject, Optional } from '@viewfly/core';
2
- import { makeError, Slot, ChangeOrigin, observe, toRaw, AsyncSlot, AsyncComponent, Component, Scheduler, Registry, Selection, HISTORY_STACK_SIZE, RootComponentRef, History } from '@textbus/core';
2
+ import { makeError, Slot, ChangeOrigin, observe, AsyncSlot, AsyncComponent, Component, toRaw, getObserver, attachModel, valueToJSON, Scheduler, Registry, Selection, HISTORY_STACK_SIZE, RootComponentRef, History } from '@textbus/core';
3
3
  import { Subject, map, filter, Subscription } from '@tanbo/stream';
4
4
  import { Doc, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex, Map, Array as Array$1, Text, XmlElement, UndoManager } from 'yjs';
5
5
  import { HocuspocusProvider } from '@hocuspocus/provider';
@@ -731,11 +731,10 @@ var Collaborate = /*#__PURE__*/ function() {
731
731
  key: "createSharedArrayByLocalArray",
732
732
  value: function createSharedArrayByLocalArray(localArray) {
733
733
  var sharedArray = new Array$1();
734
- var raw = toRaw(localArray);
735
- for(var i = 0; i < raw.length; i++){
736
- if (i in raw) {
734
+ for(var i = 0; i < localArray.length; i++){
735
+ if (i in localArray) {
737
736
  sharedArray.push([
738
- this.sharedModelForArraySlot(raw[i])
737
+ this.sharedModelForArraySlot(localArray[i])
739
738
  ]);
740
739
  } else {
741
740
  sharedArray.push([
@@ -1070,9 +1069,60 @@ var Collaborate = /*#__PURE__*/ function() {
1070
1069
  key: "insertSparseHole",
1071
1070
  value: /**
1072
1071
  * 在可观察数组中插入稀疏空洞(与 YArray 中 XmlElement 占位对齐)。
1073
- * 仅在远端同步路径调用;直接操作 raw,避免走插入 undefined 的可观察路径。
1072
+ * 仅在远端同步路径调用;先改 raw,再用与 {@link ArrayProxyHandler} `length` 增长一致的原子命令
1073
+ * `retain` + `insert`(`undefined` 槽)记录,`unApply` 为 `retain` + `delete`。
1074
+ * `runLocalUpdate` 在 `updateFromRemote` 为 true 时会跳过,不会把洞再写回 Y。
1074
1075
  */ function insertSparseHole(localArray, atIndex) {
1075
1076
  var raw = toRaw(localArray);
1077
+ var oldLen = raw.length;
1078
+ this.applySparseHoleToRaw(raw, atIndex);
1079
+ var holeCount = atIndex >= oldLen ? atIndex + 1 - oldLen : 1;
1080
+ var newTail = [];
1081
+ if (atIndex >= oldLen) {
1082
+ for(var i = oldLen; i < oldLen + holeCount; i++){
1083
+ newTail.push(raw[i]);
1084
+ }
1085
+ } else {
1086
+ newTail.push(undefined);
1087
+ }
1088
+ var changeMarker = localArray.__changeMarker__;
1089
+ changeMarker.beforeChange();
1090
+ var parentModel = getObserver(raw);
1091
+ var subModels = newTail.map(function(item) {
1092
+ var m = observe(item);
1093
+ attachModel(parentModel, m);
1094
+ return m;
1095
+ });
1096
+ var retainOffset = atIndex >= oldLen ? oldLen : atIndex;
1097
+ changeMarker.markAsDirtied({
1098
+ paths: [],
1099
+ apply: [
1100
+ {
1101
+ type: 'retain',
1102
+ offset: retainOffset
1103
+ },
1104
+ {
1105
+ type: 'insert',
1106
+ data: valueToJSON(newTail),
1107
+ ref: subModels
1108
+ }
1109
+ ],
1110
+ unApply: [
1111
+ {
1112
+ type: 'retain',
1113
+ offset: retainOffset
1114
+ },
1115
+ {
1116
+ type: 'delete',
1117
+ count: holeCount
1118
+ }
1119
+ ]
1120
+ });
1121
+ }
1122
+ },
1123
+ {
1124
+ key: "applySparseHoleToRaw",
1125
+ value: /** 与 Y 洞位对齐的稀疏洞写入,仅操作 raw */ function applySparseHoleToRaw(raw, atIndex) {
1076
1126
  var len = raw.length;
1077
1127
  if (atIndex >= len) {
1078
1128
  raw.length = atIndex + 1;