@liveblocks/core 3.16.0-flow1 → 3.16.0-flow2
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.
- package/dist/index.cjs +863 -651
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +102 -7
- package/dist/index.d.ts +102 -7
- package/dist/index.js +810 -598
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -6,7 +6,7 @@ var __export = (target, all) => {
|
|
|
6
6
|
|
|
7
7
|
// src/version.ts
|
|
8
8
|
var PKG_NAME = "@liveblocks/core";
|
|
9
|
-
var PKG_VERSION = "3.16.0-
|
|
9
|
+
var PKG_VERSION = "3.16.0-flow2";
|
|
10
10
|
var PKG_FORMAT = "cjs";
|
|
11
11
|
|
|
12
12
|
// src/dupe-detection.ts
|
|
@@ -6302,7 +6302,6 @@ var AbstractCrdt = class {
|
|
|
6302
6302
|
}
|
|
6303
6303
|
/**
|
|
6304
6304
|
* @internal
|
|
6305
|
-
*
|
|
6306
6305
|
* Return an snapshot of this Live tree for use in DevTools.
|
|
6307
6306
|
*/
|
|
6308
6307
|
toTreeNode(key) {
|
|
@@ -6312,6 +6311,14 @@ var AbstractCrdt = class {
|
|
|
6312
6311
|
}
|
|
6313
6312
|
return this.#cachedTreeNode;
|
|
6314
6313
|
}
|
|
6314
|
+
/**
|
|
6315
|
+
* @private
|
|
6316
|
+
* Returns true if the cached immutable snapshot exists and is
|
|
6317
|
+
* reference-equal to the given value. Does not trigger a recompute.
|
|
6318
|
+
*/
|
|
6319
|
+
immutableIs(value) {
|
|
6320
|
+
return this.#cachedImmutable !== void 0 && this.#cachedImmutable === value;
|
|
6321
|
+
}
|
|
6315
6322
|
/**
|
|
6316
6323
|
* Return an immutable snapshot of this Live node and its children.
|
|
6317
6324
|
*/
|
|
@@ -7859,160 +7866,563 @@ var LiveMap = class _LiveMap extends AbstractCrdt {
|
|
|
7859
7866
|
}
|
|
7860
7867
|
};
|
|
7861
7868
|
|
|
7862
|
-
// src/
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
|
|
7866
|
-
|
|
7867
|
-
|
|
7868
|
-
|
|
7869
|
-
|
|
7870
|
-
|
|
7871
|
-
|
|
7872
|
-
|
|
7873
|
-
|
|
7874
|
-
|
|
7875
|
-
|
|
7876
|
-
|
|
7877
|
-
|
|
7878
|
-
|
|
7879
|
-
|
|
7880
|
-
|
|
7881
|
-
|
|
7882
|
-
|
|
7883
|
-
|
|
7884
|
-
|
|
7885
|
-
|
|
7886
|
-
|
|
7887
|
-
|
|
7888
|
-
|
|
7889
|
-
|
|
7890
|
-
|
|
7891
|
-
|
|
7892
|
-
|
|
7893
|
-
|
|
7894
|
-
|
|
7895
|
-
|
|
7869
|
+
// src/lib/Json.ts
|
|
7870
|
+
function isJsonScalar(data) {
|
|
7871
|
+
return data === null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
|
|
7872
|
+
}
|
|
7873
|
+
function isJsonArray(data) {
|
|
7874
|
+
return Array.isArray(data);
|
|
7875
|
+
}
|
|
7876
|
+
function isJsonObject(data) {
|
|
7877
|
+
return !isJsonScalar(data) && !isJsonArray(data);
|
|
7878
|
+
}
|
|
7879
|
+
|
|
7880
|
+
// src/immutable.ts
|
|
7881
|
+
function lsonObjectToJson(obj) {
|
|
7882
|
+
const result = {};
|
|
7883
|
+
for (const key in obj) {
|
|
7884
|
+
const val = obj[key];
|
|
7885
|
+
if (val !== void 0) {
|
|
7886
|
+
result[key] = lsonToJson(val);
|
|
7887
|
+
}
|
|
7888
|
+
}
|
|
7889
|
+
return result;
|
|
7890
|
+
}
|
|
7891
|
+
function liveObjectToJson(liveObject) {
|
|
7892
|
+
return lsonObjectToJson(liveObject.toObject());
|
|
7893
|
+
}
|
|
7894
|
+
function liveMapToJson(map) {
|
|
7895
|
+
const result = {};
|
|
7896
|
+
for (const [key, value] of map.entries()) {
|
|
7897
|
+
result[key] = lsonToJson(value);
|
|
7898
|
+
}
|
|
7899
|
+
return result;
|
|
7900
|
+
}
|
|
7901
|
+
function lsonListToJson(value) {
|
|
7902
|
+
return value.map(lsonToJson);
|
|
7903
|
+
}
|
|
7904
|
+
function liveListToJson(value) {
|
|
7905
|
+
return lsonListToJson(value.toArray());
|
|
7906
|
+
}
|
|
7907
|
+
function lsonToJson(value) {
|
|
7908
|
+
if (value instanceof LiveObject) {
|
|
7909
|
+
return liveObjectToJson(value);
|
|
7910
|
+
} else if (value instanceof LiveList) {
|
|
7911
|
+
return liveListToJson(value);
|
|
7912
|
+
} else if (value instanceof LiveMap) {
|
|
7913
|
+
return liveMapToJson(value);
|
|
7914
|
+
} else if (value instanceof LiveRegister) {
|
|
7915
|
+
return value.data;
|
|
7916
|
+
}
|
|
7917
|
+
if (Array.isArray(value)) {
|
|
7918
|
+
return lsonListToJson(value);
|
|
7919
|
+
} else if (isPlainObject(value)) {
|
|
7920
|
+
return lsonObjectToJson(value);
|
|
7921
|
+
}
|
|
7922
|
+
return value;
|
|
7923
|
+
}
|
|
7924
|
+
function deepLiveify(value, config) {
|
|
7925
|
+
if (Array.isArray(value)) {
|
|
7926
|
+
return new LiveList(value.map((v) => deepLiveify(v, config)));
|
|
7927
|
+
} else if (isPlainObject(value)) {
|
|
7928
|
+
const init = {};
|
|
7929
|
+
const locals = {};
|
|
7930
|
+
for (const key in value) {
|
|
7931
|
+
const val = value[key];
|
|
7932
|
+
if (val === void 0) {
|
|
7933
|
+
continue;
|
|
7934
|
+
}
|
|
7935
|
+
const subConfig = isPlainObject(config) ? config[key] : config;
|
|
7936
|
+
if (subConfig === false) {
|
|
7937
|
+
locals[key] = val;
|
|
7938
|
+
} else if (subConfig === "atomic") {
|
|
7939
|
+
init[key] = val;
|
|
7896
7940
|
} else {
|
|
7897
|
-
|
|
7898
|
-
const children = parentToChildren.get(crdt.parentId);
|
|
7899
|
-
if (children !== void 0) {
|
|
7900
|
-
children.push(node);
|
|
7901
|
-
} else {
|
|
7902
|
-
parentToChildren.set(crdt.parentId, [node]);
|
|
7903
|
-
}
|
|
7941
|
+
init[key] = deepLiveify(val, subConfig);
|
|
7904
7942
|
}
|
|
7905
7943
|
}
|
|
7906
|
-
|
|
7907
|
-
|
|
7944
|
+
const lo = new LiveObject(init);
|
|
7945
|
+
for (const key in locals) {
|
|
7946
|
+
lo.setLocal(key, locals[key]);
|
|
7908
7947
|
}
|
|
7909
|
-
return
|
|
7948
|
+
return lo;
|
|
7949
|
+
} else {
|
|
7950
|
+
return value;
|
|
7910
7951
|
}
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7915
|
-
|
|
7916
|
-
|
|
7917
|
-
|
|
7918
|
-
|
|
7952
|
+
}
|
|
7953
|
+
function deepLiveifyObject(obj, config) {
|
|
7954
|
+
return deepLiveify(obj, config);
|
|
7955
|
+
}
|
|
7956
|
+
function reconcile(live, json, config) {
|
|
7957
|
+
if (isLiveObject(live) && isPlainObject(json)) {
|
|
7958
|
+
return reconcileLiveObject(live, json, config);
|
|
7959
|
+
} else if (isLiveList(live) && Array.isArray(json)) {
|
|
7960
|
+
return reconcileLiveList(live, json, config);
|
|
7961
|
+
} else if (isLiveMap(live) && isPlainObject(json)) {
|
|
7962
|
+
return reconcileLiveMap(live, config);
|
|
7963
|
+
} else {
|
|
7964
|
+
return deepLiveify(json, config);
|
|
7919
7965
|
}
|
|
7920
|
-
|
|
7921
|
-
|
|
7922
|
-
|
|
7923
|
-
|
|
7924
|
-
|
|
7925
|
-
|
|
7926
|
-
|
|
7927
|
-
|
|
7966
|
+
}
|
|
7967
|
+
function reconcileLiveMap(_liveMap, _config) {
|
|
7968
|
+
throw new Error("Reconciling a LiveMap is not supported yet");
|
|
7969
|
+
}
|
|
7970
|
+
function reconcileLiveObject(liveObj, jsonObj, config) {
|
|
7971
|
+
const currentKeys = liveObj.keys();
|
|
7972
|
+
for (const key in jsonObj) {
|
|
7973
|
+
currentKeys.delete(key);
|
|
7974
|
+
const newVal = jsonObj[key];
|
|
7975
|
+
if (newVal === void 0) {
|
|
7976
|
+
liveObj.delete(key);
|
|
7977
|
+
continue;
|
|
7978
|
+
}
|
|
7979
|
+
const subConfig = isPlainObject(config) ? config[key] : config;
|
|
7980
|
+
if (subConfig === false) {
|
|
7981
|
+
liveObj.setLocal(key, newVal);
|
|
7982
|
+
} else if (subConfig === "atomic") {
|
|
7983
|
+
const curVal = liveObj.get(key);
|
|
7984
|
+
if (curVal !== newVal) {
|
|
7985
|
+
liveObj.set(key, newVal);
|
|
7986
|
+
}
|
|
7987
|
+
} else {
|
|
7988
|
+
const curVal = liveObj.get(key);
|
|
7989
|
+
if (curVal === void 0) {
|
|
7990
|
+
liveObj.set(key, deepLiveify(newVal, subConfig));
|
|
7991
|
+
} else if (isLiveStructure(curVal)) {
|
|
7992
|
+
const next = reconcile(curVal, newVal, subConfig);
|
|
7993
|
+
if (next !== curVal) {
|
|
7994
|
+
liveObj.set(key, next);
|
|
7995
|
+
}
|
|
7996
|
+
} else if (curVal !== newVal) {
|
|
7997
|
+
liveObj.set(key, deepLiveify(newVal, subConfig));
|
|
7928
7998
|
}
|
|
7929
7999
|
}
|
|
7930
|
-
this.#map = new Map(Object.entries(o));
|
|
7931
8000
|
}
|
|
7932
|
-
|
|
7933
|
-
|
|
7934
|
-
|
|
7935
|
-
|
|
7936
|
-
|
|
7937
|
-
|
|
7938
|
-
|
|
7939
|
-
|
|
7940
|
-
|
|
7941
|
-
|
|
7942
|
-
|
|
7943
|
-
|
|
7944
|
-
|
|
7945
|
-
|
|
7946
|
-
|
|
7947
|
-
if (isLiveNode(value)) {
|
|
7948
|
-
for (const childOp of value._toOps(this._id, key)) {
|
|
7949
|
-
ops.push(childOp);
|
|
7950
|
-
}
|
|
7951
|
-
} else {
|
|
7952
|
-
op.data[key] = value;
|
|
8001
|
+
for (const key of currentKeys) {
|
|
8002
|
+
liveObj.delete(key);
|
|
8003
|
+
}
|
|
8004
|
+
return liveObj;
|
|
8005
|
+
}
|
|
8006
|
+
function reconcileLiveList(liveList, jsonArr, config) {
|
|
8007
|
+
const curLen = liveList.length;
|
|
8008
|
+
const newLen = jsonArr.length;
|
|
8009
|
+
for (let i = 0; i < Math.min(curLen, newLen); i++) {
|
|
8010
|
+
const curVal = liveList.get(i);
|
|
8011
|
+
const newVal = jsonArr[i];
|
|
8012
|
+
if (isLiveStructure(curVal)) {
|
|
8013
|
+
const next = reconcile(curVal, newVal, config);
|
|
8014
|
+
if (next !== curVal) {
|
|
8015
|
+
liveList.set(i, next);
|
|
7953
8016
|
}
|
|
8017
|
+
} else if (curVal !== newVal) {
|
|
8018
|
+
liveList.set(i, deepLiveify(newVal, config));
|
|
7954
8019
|
}
|
|
7955
|
-
return ops;
|
|
7956
8020
|
}
|
|
7957
|
-
|
|
7958
|
-
|
|
7959
|
-
const liveObj = new _LiveObject(item.data);
|
|
7960
|
-
liveObj._attach(id, pool);
|
|
7961
|
-
return this._deserializeChildren(liveObj, parentToChildren, pool);
|
|
8021
|
+
for (let i = curLen; i < newLen; i++) {
|
|
8022
|
+
liveList.push(deepLiveify(jsonArr[i], config));
|
|
7962
8023
|
}
|
|
7963
|
-
|
|
7964
|
-
|
|
7965
|
-
|
|
7966
|
-
|
|
7967
|
-
|
|
8024
|
+
for (let i = curLen - 1; i >= newLen; i--) {
|
|
8025
|
+
liveList.delete(i);
|
|
8026
|
+
}
|
|
8027
|
+
return liveList;
|
|
8028
|
+
}
|
|
8029
|
+
function legacy_patchLiveList(liveList, prev, next) {
|
|
8030
|
+
let i = 0;
|
|
8031
|
+
let prevEnd = prev.length - 1;
|
|
8032
|
+
let nextEnd = next.length - 1;
|
|
8033
|
+
let prevNode = prev[0];
|
|
8034
|
+
let nextNode = next[0];
|
|
8035
|
+
outer: {
|
|
8036
|
+
while (prevNode === nextNode) {
|
|
8037
|
+
++i;
|
|
8038
|
+
if (i > prevEnd || i > nextEnd) {
|
|
8039
|
+
break outer;
|
|
8040
|
+
}
|
|
8041
|
+
prevNode = prev[i];
|
|
8042
|
+
nextNode = next[i];
|
|
7968
8043
|
}
|
|
7969
|
-
|
|
7970
|
-
|
|
7971
|
-
|
|
7972
|
-
|
|
7973
|
-
|
|
8044
|
+
prevNode = prev[prevEnd];
|
|
8045
|
+
nextNode = next[nextEnd];
|
|
8046
|
+
while (prevNode === nextNode) {
|
|
8047
|
+
prevEnd--;
|
|
8048
|
+
nextEnd--;
|
|
8049
|
+
if (i > prevEnd || i > nextEnd) {
|
|
8050
|
+
break outer;
|
|
7974
8051
|
}
|
|
7975
|
-
|
|
7976
|
-
|
|
8052
|
+
prevNode = prev[prevEnd];
|
|
8053
|
+
nextNode = next[nextEnd];
|
|
7977
8054
|
}
|
|
7978
|
-
return liveObj;
|
|
7979
8055
|
}
|
|
7980
|
-
|
|
7981
|
-
|
|
7982
|
-
|
|
7983
|
-
|
|
7984
|
-
|
|
7985
|
-
value._attach(pool.generateId(), pool);
|
|
8056
|
+
if (i > prevEnd) {
|
|
8057
|
+
if (i <= nextEnd) {
|
|
8058
|
+
while (i <= nextEnd) {
|
|
8059
|
+
liveList.insert(deepLiveify(next[i]), i);
|
|
8060
|
+
i++;
|
|
7986
8061
|
}
|
|
7987
8062
|
}
|
|
7988
|
-
}
|
|
7989
|
-
|
|
7990
|
-
|
|
7991
|
-
|
|
7992
|
-
|
|
8063
|
+
} else if (i > nextEnd) {
|
|
8064
|
+
let localI = i;
|
|
8065
|
+
while (localI <= prevEnd) {
|
|
8066
|
+
liveList.delete(i);
|
|
8067
|
+
localI++;
|
|
7993
8068
|
}
|
|
7994
|
-
|
|
7995
|
-
|
|
7996
|
-
|
|
7997
|
-
|
|
7998
|
-
|
|
8069
|
+
} else {
|
|
8070
|
+
while (i <= prevEnd && i <= nextEnd) {
|
|
8071
|
+
prevNode = prev[i];
|
|
8072
|
+
nextNode = next[i];
|
|
8073
|
+
const liveListNode = liveList.get(i);
|
|
8074
|
+
if (isLiveObject(liveListNode) && isPlainObject(prevNode) && isPlainObject(nextNode)) {
|
|
8075
|
+
legacy_patchLiveObject(liveListNode, prevNode, nextNode);
|
|
8076
|
+
} else {
|
|
8077
|
+
liveList.set(i, deepLiveify(nextNode));
|
|
7999
8078
|
}
|
|
8000
|
-
|
|
8079
|
+
i++;
|
|
8001
8080
|
}
|
|
8002
|
-
|
|
8003
|
-
|
|
8004
|
-
|
|
8005
|
-
} else if (this.#unackedOpsByKey.get(key) === opId) {
|
|
8006
|
-
this.#unackedOpsByKey.delete(key);
|
|
8007
|
-
return { modified: false };
|
|
8008
|
-
} else {
|
|
8009
|
-
return { modified: false };
|
|
8081
|
+
while (i <= nextEnd) {
|
|
8082
|
+
liveList.insert(deepLiveify(next[i]), i);
|
|
8083
|
+
i++;
|
|
8010
8084
|
}
|
|
8011
|
-
|
|
8012
|
-
|
|
8013
|
-
|
|
8014
|
-
|
|
8015
|
-
|
|
8085
|
+
let localI = i;
|
|
8086
|
+
while (localI <= prevEnd) {
|
|
8087
|
+
liveList.delete(i);
|
|
8088
|
+
localI++;
|
|
8089
|
+
}
|
|
8090
|
+
}
|
|
8091
|
+
}
|
|
8092
|
+
function legacy_patchLiveObjectKey(liveObject, key, prev, next) {
|
|
8093
|
+
if (process.env.NODE_ENV !== "production") {
|
|
8094
|
+
const nonSerializableValue = findNonSerializableValue(next);
|
|
8095
|
+
if (nonSerializableValue) {
|
|
8096
|
+
error2(
|
|
8097
|
+
`New state path: '${nonSerializableValue.path}' value: '${String(
|
|
8098
|
+
nonSerializableValue.value
|
|
8099
|
+
)}' is not serializable.
|
|
8100
|
+
Only serializable value can be synced with Liveblocks.`
|
|
8101
|
+
);
|
|
8102
|
+
return;
|
|
8103
|
+
}
|
|
8104
|
+
}
|
|
8105
|
+
const value = liveObject.get(key);
|
|
8106
|
+
if (next === void 0) {
|
|
8107
|
+
liveObject.delete(key);
|
|
8108
|
+
} else if (value === void 0) {
|
|
8109
|
+
liveObject.set(key, deepLiveify(next));
|
|
8110
|
+
} else if (prev === next) {
|
|
8111
|
+
return;
|
|
8112
|
+
} else if (isLiveList(value) && Array.isArray(prev) && Array.isArray(next)) {
|
|
8113
|
+
legacy_patchLiveList(value, prev, next);
|
|
8114
|
+
} else if (isLiveObject(value) && isPlainObject(prev) && isPlainObject(next)) {
|
|
8115
|
+
legacy_patchLiveObject(value, prev, next);
|
|
8116
|
+
} else {
|
|
8117
|
+
liveObject.set(key, deepLiveify(next));
|
|
8118
|
+
}
|
|
8119
|
+
}
|
|
8120
|
+
function legacy_patchLiveObject(root, prev, next) {
|
|
8121
|
+
const updates = {};
|
|
8122
|
+
for (const key in next) {
|
|
8123
|
+
legacy_patchLiveObjectKey(root, key, prev[key], next[key]);
|
|
8124
|
+
}
|
|
8125
|
+
for (const key in prev) {
|
|
8126
|
+
if (next[key] === void 0) {
|
|
8127
|
+
root.delete(key);
|
|
8128
|
+
}
|
|
8129
|
+
}
|
|
8130
|
+
if (Object.keys(updates).length > 0) {
|
|
8131
|
+
root.update(updates);
|
|
8132
|
+
}
|
|
8133
|
+
}
|
|
8134
|
+
function getParentsPath(node) {
|
|
8135
|
+
const path = [];
|
|
8136
|
+
while (node.parent.type === "HasParent") {
|
|
8137
|
+
if (isLiveList(node.parent.node)) {
|
|
8138
|
+
path.push(node.parent.node._indexOfPosition(node.parent.key));
|
|
8139
|
+
} else {
|
|
8140
|
+
path.push(node.parent.key);
|
|
8141
|
+
}
|
|
8142
|
+
node = node.parent.node;
|
|
8143
|
+
}
|
|
8144
|
+
return path;
|
|
8145
|
+
}
|
|
8146
|
+
function legacy_patchImmutableObject(state, updates) {
|
|
8147
|
+
return updates.reduce(
|
|
8148
|
+
(state2, update) => legacy_patchImmutableObjectWithUpdate(state2, update),
|
|
8149
|
+
state
|
|
8150
|
+
);
|
|
8151
|
+
}
|
|
8152
|
+
function legacy_patchImmutableObjectWithUpdate(state, update) {
|
|
8153
|
+
const path = getParentsPath(update.node);
|
|
8154
|
+
return legacy_patchImmutableNode(state, path, update);
|
|
8155
|
+
}
|
|
8156
|
+
function legacy_patchImmutableNode(state, path, update) {
|
|
8157
|
+
const pathItem = path.pop();
|
|
8158
|
+
if (pathItem === void 0) {
|
|
8159
|
+
switch (update.type) {
|
|
8160
|
+
case "LiveObject": {
|
|
8161
|
+
if (!isJsonObject(state)) {
|
|
8162
|
+
throw new Error(
|
|
8163
|
+
"Internal: received update on LiveObject but state was not an object"
|
|
8164
|
+
);
|
|
8165
|
+
}
|
|
8166
|
+
const newState = Object.assign({}, state);
|
|
8167
|
+
for (const key in update.updates) {
|
|
8168
|
+
if (_optionalChain([update, 'access', _192 => _192.updates, 'access', _193 => _193[key], 'optionalAccess', _194 => _194.type]) === "update") {
|
|
8169
|
+
const val = update.node.get(key);
|
|
8170
|
+
if (val !== void 0) {
|
|
8171
|
+
newState[key] = lsonToJson(val);
|
|
8172
|
+
}
|
|
8173
|
+
} else if (_optionalChain([update, 'access', _195 => _195.updates, 'access', _196 => _196[key], 'optionalAccess', _197 => _197.type]) === "delete") {
|
|
8174
|
+
delete newState[key];
|
|
8175
|
+
}
|
|
8176
|
+
}
|
|
8177
|
+
return newState;
|
|
8178
|
+
}
|
|
8179
|
+
case "LiveList": {
|
|
8180
|
+
if (!Array.isArray(state)) {
|
|
8181
|
+
throw new Error(
|
|
8182
|
+
"Internal: received update on LiveList but state was not an array"
|
|
8183
|
+
);
|
|
8184
|
+
}
|
|
8185
|
+
let newState = state.map((x) => x);
|
|
8186
|
+
for (const listUpdate of update.updates) {
|
|
8187
|
+
if (listUpdate.type === "set") {
|
|
8188
|
+
newState = newState.map(
|
|
8189
|
+
(item, index) => index === listUpdate.index ? lsonToJson(listUpdate.item) : item
|
|
8190
|
+
);
|
|
8191
|
+
} else if (listUpdate.type === "insert") {
|
|
8192
|
+
if (listUpdate.index === newState.length) {
|
|
8193
|
+
newState.push(lsonToJson(listUpdate.item));
|
|
8194
|
+
} else {
|
|
8195
|
+
newState = [
|
|
8196
|
+
...newState.slice(0, listUpdate.index),
|
|
8197
|
+
lsonToJson(listUpdate.item),
|
|
8198
|
+
...newState.slice(listUpdate.index)
|
|
8199
|
+
];
|
|
8200
|
+
}
|
|
8201
|
+
} else if (listUpdate.type === "delete") {
|
|
8202
|
+
newState.splice(listUpdate.index, 1);
|
|
8203
|
+
} else if (listUpdate.type === "move") {
|
|
8204
|
+
if (listUpdate.previousIndex > listUpdate.index) {
|
|
8205
|
+
newState = [
|
|
8206
|
+
...newState.slice(0, listUpdate.index),
|
|
8207
|
+
lsonToJson(listUpdate.item),
|
|
8208
|
+
...newState.slice(listUpdate.index, listUpdate.previousIndex),
|
|
8209
|
+
...newState.slice(listUpdate.previousIndex + 1)
|
|
8210
|
+
];
|
|
8211
|
+
} else {
|
|
8212
|
+
newState = [
|
|
8213
|
+
...newState.slice(0, listUpdate.previousIndex),
|
|
8214
|
+
...newState.slice(
|
|
8215
|
+
listUpdate.previousIndex + 1,
|
|
8216
|
+
listUpdate.index + 1
|
|
8217
|
+
),
|
|
8218
|
+
lsonToJson(listUpdate.item),
|
|
8219
|
+
...newState.slice(listUpdate.index + 1)
|
|
8220
|
+
];
|
|
8221
|
+
}
|
|
8222
|
+
}
|
|
8223
|
+
}
|
|
8224
|
+
return newState;
|
|
8225
|
+
}
|
|
8226
|
+
case "LiveMap": {
|
|
8227
|
+
if (!isJsonObject(state)) {
|
|
8228
|
+
throw new Error(
|
|
8229
|
+
"Internal: received update on LiveMap but state was not an object"
|
|
8230
|
+
);
|
|
8231
|
+
}
|
|
8232
|
+
const newState = Object.assign({}, state);
|
|
8233
|
+
for (const key in update.updates) {
|
|
8234
|
+
if (_optionalChain([update, 'access', _198 => _198.updates, 'access', _199 => _199[key], 'optionalAccess', _200 => _200.type]) === "update") {
|
|
8235
|
+
const value = update.node.get(key);
|
|
8236
|
+
if (value !== void 0) {
|
|
8237
|
+
newState[key] = lsonToJson(value);
|
|
8238
|
+
}
|
|
8239
|
+
} else if (_optionalChain([update, 'access', _201 => _201.updates, 'access', _202 => _202[key], 'optionalAccess', _203 => _203.type]) === "delete") {
|
|
8240
|
+
delete newState[key];
|
|
8241
|
+
}
|
|
8242
|
+
}
|
|
8243
|
+
return newState;
|
|
8244
|
+
}
|
|
8245
|
+
}
|
|
8246
|
+
}
|
|
8247
|
+
if (Array.isArray(state)) {
|
|
8248
|
+
const newArray = [...state];
|
|
8249
|
+
newArray[pathItem] = legacy_patchImmutableNode(
|
|
8250
|
+
state[pathItem],
|
|
8251
|
+
path,
|
|
8252
|
+
update
|
|
8253
|
+
);
|
|
8254
|
+
return newArray;
|
|
8255
|
+
} else if (isJsonObject(state)) {
|
|
8256
|
+
const node = state[pathItem];
|
|
8257
|
+
if (node === void 0) {
|
|
8258
|
+
return state;
|
|
8259
|
+
} else {
|
|
8260
|
+
const stateAsObj = state;
|
|
8261
|
+
return {
|
|
8262
|
+
...stateAsObj,
|
|
8263
|
+
[pathItem]: legacy_patchImmutableNode(node, path, update)
|
|
8264
|
+
};
|
|
8265
|
+
}
|
|
8266
|
+
} else {
|
|
8267
|
+
return state;
|
|
8268
|
+
}
|
|
8269
|
+
}
|
|
8270
|
+
|
|
8271
|
+
// src/crdts/LiveObject.ts
|
|
8272
|
+
var MAX_LIVE_OBJECT_SIZE = 128 * 1024;
|
|
8273
|
+
var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
8274
|
+
#synced;
|
|
8275
|
+
#local = /* @__PURE__ */ new Map();
|
|
8276
|
+
/**
|
|
8277
|
+
* Tracks unacknowledged local changes per property to preserve optimistic
|
|
8278
|
+
* updates. Maps property keys to their pending operation IDs.
|
|
8279
|
+
*
|
|
8280
|
+
* INVARIANT: Only locally-generated opIds are ever stored here. Remote opIds
|
|
8281
|
+
* are only compared against (to detect ACKs), never stored.
|
|
8282
|
+
*
|
|
8283
|
+
* When a local change is made, the opId is stored here. When a remote op
|
|
8284
|
+
* arrives for the same key:
|
|
8285
|
+
* - If no entry exists → apply remote op
|
|
8286
|
+
* - If opId matches → it's an ACK, clear the entry
|
|
8287
|
+
* - If opId differs → ignore remote op to preserve optimistic update
|
|
8288
|
+
*/
|
|
8289
|
+
#unackedOpsByKey;
|
|
8290
|
+
/**
|
|
8291
|
+
* Enable or disable detection of too large LiveObjects.
|
|
8292
|
+
* When enabled, throws an error if LiveObject static data exceeds 128KB, which
|
|
8293
|
+
* is the maximum value the server will be able to accept.
|
|
8294
|
+
* By default, this behavior is disabled to avoid the runtime performance
|
|
8295
|
+
* overhead on every LiveObject.set() or LiveObject.update() call.
|
|
8296
|
+
*
|
|
8297
|
+
* @experimental
|
|
8298
|
+
*/
|
|
8299
|
+
static __initStatic() {this.detectLargeObjects = false}
|
|
8300
|
+
static #buildRootAndParentToChildren(nodes) {
|
|
8301
|
+
const parentToChildren = /* @__PURE__ */ new Map();
|
|
8302
|
+
let root = null;
|
|
8303
|
+
for (const node of nodes) {
|
|
8304
|
+
if (isRootStorageNode(node)) {
|
|
8305
|
+
root = node[1];
|
|
8306
|
+
} else {
|
|
8307
|
+
const crdt = node[1];
|
|
8308
|
+
const children = parentToChildren.get(crdt.parentId);
|
|
8309
|
+
if (children !== void 0) {
|
|
8310
|
+
children.push(node);
|
|
8311
|
+
} else {
|
|
8312
|
+
parentToChildren.set(crdt.parentId, [node]);
|
|
8313
|
+
}
|
|
8314
|
+
}
|
|
8315
|
+
}
|
|
8316
|
+
if (root === null) {
|
|
8317
|
+
throw new Error("Root can't be null");
|
|
8318
|
+
}
|
|
8319
|
+
return [root, parentToChildren];
|
|
8320
|
+
}
|
|
8321
|
+
/** @private Do not use this API directly */
|
|
8322
|
+
static _fromItems(nodes, pool) {
|
|
8323
|
+
const [root, parentToChildren] = _LiveObject.#buildRootAndParentToChildren(nodes);
|
|
8324
|
+
return _LiveObject._deserialize(
|
|
8325
|
+
["root", root],
|
|
8326
|
+
parentToChildren,
|
|
8327
|
+
pool
|
|
8328
|
+
);
|
|
8329
|
+
}
|
|
8330
|
+
constructor(obj = {}) {
|
|
8331
|
+
super();
|
|
8332
|
+
this.#unackedOpsByKey = /* @__PURE__ */ new Map();
|
|
8333
|
+
const o = compactObject(obj);
|
|
8334
|
+
for (const key of Object.keys(o)) {
|
|
8335
|
+
const value = o[key];
|
|
8336
|
+
if (isLiveNode(value)) {
|
|
8337
|
+
value._setParentLink(this, key);
|
|
8338
|
+
}
|
|
8339
|
+
}
|
|
8340
|
+
this.#synced = new Map(Object.entries(o));
|
|
8341
|
+
}
|
|
8342
|
+
/** @internal */
|
|
8343
|
+
_toOps(parentId, parentKey) {
|
|
8344
|
+
if (this._id === void 0) {
|
|
8345
|
+
throw new Error("Cannot serialize item is not attached");
|
|
8346
|
+
}
|
|
8347
|
+
const ops = [];
|
|
8348
|
+
const op = {
|
|
8349
|
+
type: OpCode.CREATE_OBJECT,
|
|
8350
|
+
id: this._id,
|
|
8351
|
+
parentId,
|
|
8352
|
+
parentKey,
|
|
8353
|
+
data: {}
|
|
8354
|
+
};
|
|
8355
|
+
ops.push(op);
|
|
8356
|
+
for (const [key, value] of this.#synced) {
|
|
8357
|
+
if (isLiveNode(value)) {
|
|
8358
|
+
for (const childOp of value._toOps(this._id, key)) {
|
|
8359
|
+
ops.push(childOp);
|
|
8360
|
+
}
|
|
8361
|
+
} else {
|
|
8362
|
+
op.data[key] = value;
|
|
8363
|
+
}
|
|
8364
|
+
}
|
|
8365
|
+
return ops;
|
|
8366
|
+
}
|
|
8367
|
+
/** @internal */
|
|
8368
|
+
static _deserialize([id, item], parentToChildren, pool) {
|
|
8369
|
+
const liveObj = new _LiveObject(item.data);
|
|
8370
|
+
liveObj._attach(id, pool);
|
|
8371
|
+
return this._deserializeChildren(liveObj, parentToChildren, pool);
|
|
8372
|
+
}
|
|
8373
|
+
/** @internal */
|
|
8374
|
+
static _deserializeChildren(liveObj, parentToChildren, pool) {
|
|
8375
|
+
const children = parentToChildren.get(nn(liveObj._id));
|
|
8376
|
+
if (children === void 0) {
|
|
8377
|
+
return liveObj;
|
|
8378
|
+
}
|
|
8379
|
+
for (const node of children) {
|
|
8380
|
+
const child = deserializeToLson(node, parentToChildren, pool);
|
|
8381
|
+
const crdt = node[1];
|
|
8382
|
+
if (isLiveStructure(child)) {
|
|
8383
|
+
child._setParentLink(liveObj, crdt.parentKey);
|
|
8384
|
+
}
|
|
8385
|
+
liveObj.#synced.set(crdt.parentKey, child);
|
|
8386
|
+
liveObj.invalidate();
|
|
8387
|
+
}
|
|
8388
|
+
return liveObj;
|
|
8389
|
+
}
|
|
8390
|
+
/** @internal */
|
|
8391
|
+
_attach(id, pool) {
|
|
8392
|
+
super._attach(id, pool);
|
|
8393
|
+
for (const [_key, value] of this.#synced) {
|
|
8394
|
+
if (isLiveNode(value)) {
|
|
8395
|
+
value._attach(pool.generateId(), pool);
|
|
8396
|
+
}
|
|
8397
|
+
}
|
|
8398
|
+
}
|
|
8399
|
+
/** @internal */
|
|
8400
|
+
_attachChild(op, source) {
|
|
8401
|
+
if (this._pool === void 0) {
|
|
8402
|
+
throw new Error("Can't attach child if managed pool is not present");
|
|
8403
|
+
}
|
|
8404
|
+
const { id, opId, parentKey: key } = op;
|
|
8405
|
+
const child = creationOpToLson(op);
|
|
8406
|
+
if (this._pool.getNode(id) !== void 0) {
|
|
8407
|
+
if (this.#unackedOpsByKey.get(key) === opId) {
|
|
8408
|
+
this.#unackedOpsByKey.delete(key);
|
|
8409
|
+
}
|
|
8410
|
+
return { modified: false };
|
|
8411
|
+
}
|
|
8412
|
+
if (source === 0 /* LOCAL */) {
|
|
8413
|
+
this.#unackedOpsByKey.set(key, nn(opId));
|
|
8414
|
+
} else if (this.#unackedOpsByKey.get(key) === void 0) {
|
|
8415
|
+
} else if (this.#unackedOpsByKey.get(key) === opId) {
|
|
8416
|
+
this.#unackedOpsByKey.delete(key);
|
|
8417
|
+
return { modified: false };
|
|
8418
|
+
} else {
|
|
8419
|
+
return { modified: false };
|
|
8420
|
+
}
|
|
8421
|
+
const thisId = nn(this._id);
|
|
8422
|
+
const previousValue = this.#synced.get(key);
|
|
8423
|
+
let reverse;
|
|
8424
|
+
if (isLiveNode(previousValue)) {
|
|
8425
|
+
reverse = previousValue._toOps(thisId, key);
|
|
8016
8426
|
previousValue._detach();
|
|
8017
8427
|
} else if (previousValue === void 0) {
|
|
8018
8428
|
reverse = [{ type: OpCode.DELETE_OBJECT_KEY, id: thisId, key }];
|
|
@@ -8025,7 +8435,8 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8025
8435
|
}
|
|
8026
8436
|
];
|
|
8027
8437
|
}
|
|
8028
|
-
this.#
|
|
8438
|
+
this.#local.delete(key);
|
|
8439
|
+
this.#synced.set(key, child);
|
|
8029
8440
|
this.invalidate();
|
|
8030
8441
|
if (isLiveStructure(child)) {
|
|
8031
8442
|
child._setParentLink(this, key);
|
|
@@ -8046,9 +8457,9 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8046
8457
|
const id = nn(this._id);
|
|
8047
8458
|
const parentKey = nn(child._parentKey);
|
|
8048
8459
|
const reverse = child._toOps(id, parentKey);
|
|
8049
|
-
for (const [key, value] of this.#
|
|
8460
|
+
for (const [key, value] of this.#synced) {
|
|
8050
8461
|
if (value === child) {
|
|
8051
|
-
this.#
|
|
8462
|
+
this.#synced.delete(key);
|
|
8052
8463
|
this.invalidate();
|
|
8053
8464
|
}
|
|
8054
8465
|
}
|
|
@@ -8067,7 +8478,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8067
8478
|
/** @internal */
|
|
8068
8479
|
_detach() {
|
|
8069
8480
|
super._detach();
|
|
8070
|
-
for (const value of this.#
|
|
8481
|
+
for (const value of this.#synced.values()) {
|
|
8071
8482
|
if (isLiveNode(value)) {
|
|
8072
8483
|
value._detach();
|
|
8073
8484
|
}
|
|
@@ -8085,7 +8496,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8085
8496
|
/** @internal */
|
|
8086
8497
|
_serialize() {
|
|
8087
8498
|
const data = {};
|
|
8088
|
-
for (const [key, value] of this.#
|
|
8499
|
+
for (const [key, value] of this.#synced) {
|
|
8089
8500
|
if (!isLiveNode(value)) {
|
|
8090
8501
|
data[key] = value;
|
|
8091
8502
|
}
|
|
@@ -8114,7 +8525,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8114
8525
|
data: {}
|
|
8115
8526
|
};
|
|
8116
8527
|
for (const key in op.data) {
|
|
8117
|
-
const oldValue = this.#
|
|
8528
|
+
const oldValue = this.#synced.get(key);
|
|
8118
8529
|
if (isLiveNode(oldValue)) {
|
|
8119
8530
|
for (const childOp of oldValue._toOps(id, key)) {
|
|
8120
8531
|
reverse.push(childOp);
|
|
@@ -8142,13 +8553,14 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8142
8553
|
} else {
|
|
8143
8554
|
continue;
|
|
8144
8555
|
}
|
|
8145
|
-
const oldValue = this.#
|
|
8556
|
+
const oldValue = this.#synced.get(key);
|
|
8146
8557
|
if (isLiveNode(oldValue)) {
|
|
8147
8558
|
oldValue._detach();
|
|
8148
8559
|
}
|
|
8149
8560
|
isModified = true;
|
|
8150
8561
|
updateDelta[key] = { type: "update" };
|
|
8151
|
-
this.#
|
|
8562
|
+
this.#local.delete(key);
|
|
8563
|
+
this.#synced.set(key, value);
|
|
8152
8564
|
this.invalidate();
|
|
8153
8565
|
}
|
|
8154
8566
|
if (Object.keys(reverseUpdate.data).length !== 0) {
|
|
@@ -8165,7 +8577,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8165
8577
|
}
|
|
8166
8578
|
#applyDeleteObjectKey(op, isLocal) {
|
|
8167
8579
|
const key = op.key;
|
|
8168
|
-
const oldValue = this.#
|
|
8580
|
+
const oldValue = this.#synced.get(key);
|
|
8169
8581
|
if (oldValue === void 0) {
|
|
8170
8582
|
return { modified: false };
|
|
8171
8583
|
}
|
|
@@ -8186,7 +8598,8 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8186
8598
|
}
|
|
8187
8599
|
];
|
|
8188
8600
|
}
|
|
8189
|
-
this.#
|
|
8601
|
+
this.#local.delete(key);
|
|
8602
|
+
this.#synced.delete(key);
|
|
8190
8603
|
this.invalidate();
|
|
8191
8604
|
return {
|
|
8192
8605
|
modified: {
|
|
@@ -8199,11 +8612,23 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8199
8612
|
reverse
|
|
8200
8613
|
};
|
|
8201
8614
|
}
|
|
8615
|
+
/** @private */
|
|
8616
|
+
keys() {
|
|
8617
|
+
const result = new Set(this.#synced.keys());
|
|
8618
|
+
for (const key of this.#local.keys()) {
|
|
8619
|
+
result.add(key);
|
|
8620
|
+
}
|
|
8621
|
+
return result;
|
|
8622
|
+
}
|
|
8202
8623
|
/**
|
|
8203
8624
|
* Transform the LiveObject into a javascript object
|
|
8204
8625
|
*/
|
|
8205
8626
|
toObject() {
|
|
8206
|
-
|
|
8627
|
+
const result = Object.fromEntries(this.#synced);
|
|
8628
|
+
for (const [key, value] of this.#local) {
|
|
8629
|
+
result[key] = value;
|
|
8630
|
+
}
|
|
8631
|
+
return result;
|
|
8207
8632
|
}
|
|
8208
8633
|
/**
|
|
8209
8634
|
* Adds or updates a property with a specified key and a value.
|
|
@@ -8211,49 +8636,109 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8211
8636
|
* @param value The value of the property to add
|
|
8212
8637
|
*/
|
|
8213
8638
|
set(key, value) {
|
|
8214
|
-
_optionalChain([this, 'access', _192 => _192._pool, 'optionalAccess', _193 => _193.assertStorageIsWritable, 'call', _194 => _194()]);
|
|
8215
8639
|
this.update({ [key]: value });
|
|
8216
8640
|
}
|
|
8641
|
+
/**
|
|
8642
|
+
* @experimental
|
|
8643
|
+
*
|
|
8644
|
+
* Sets a local-only property that is not synchronized over the wire.
|
|
8645
|
+
* The value will be visible via get(), toObject(), and toImmutable() on
|
|
8646
|
+
* this client only. Other clients and the server will see `undefined`
|
|
8647
|
+
* for this key.
|
|
8648
|
+
*
|
|
8649
|
+
* Caveat: this method will not add changes to the undo/redo stack.
|
|
8650
|
+
*/
|
|
8651
|
+
setLocal(key, value) {
|
|
8652
|
+
_optionalChain([this, 'access', _204 => _204._pool, 'optionalAccess', _205 => _205.assertStorageIsWritable, 'call', _206 => _206()]);
|
|
8653
|
+
const deleteResult = this.#prepareDelete(key);
|
|
8654
|
+
this.#local.set(key, value);
|
|
8655
|
+
this.invalidate();
|
|
8656
|
+
if (this._pool !== void 0 && this._id !== void 0) {
|
|
8657
|
+
const ops = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _207 => _207[0]]), () => ( []));
|
|
8658
|
+
const reverse = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _208 => _208[1]]), () => ( []));
|
|
8659
|
+
const storageUpdates = _nullishCoalesce(_optionalChain([deleteResult, 'optionalAccess', _209 => _209[2]]), () => ( /* @__PURE__ */ new Map()));
|
|
8660
|
+
const existing = storageUpdates.get(this._id);
|
|
8661
|
+
storageUpdates.set(this._id, {
|
|
8662
|
+
node: this,
|
|
8663
|
+
type: "LiveObject",
|
|
8664
|
+
updates: {
|
|
8665
|
+
..._optionalChain([existing, 'optionalAccess', _210 => _210.updates]),
|
|
8666
|
+
[key]: { type: "update" }
|
|
8667
|
+
}
|
|
8668
|
+
});
|
|
8669
|
+
this._pool.dispatch(ops, reverse, storageUpdates);
|
|
8670
|
+
}
|
|
8671
|
+
}
|
|
8217
8672
|
/**
|
|
8218
8673
|
* Returns a specified property from the LiveObject.
|
|
8219
8674
|
* @param key The key of the property to get
|
|
8220
8675
|
*/
|
|
8221
8676
|
get(key) {
|
|
8222
|
-
return this.#
|
|
8677
|
+
return this.#local.has(key) ? this.#local.get(key) : this.#synced.get(key);
|
|
8223
8678
|
}
|
|
8224
8679
|
/**
|
|
8225
|
-
*
|
|
8226
|
-
*
|
|
8680
|
+
* Removes a synced key, returning the ops, reverse ops, and storage updates
|
|
8681
|
+
* needed to notify the pool. Returns null if the key doesn't exist in
|
|
8682
|
+
* #synced or pool/id are unavailable. Does NOT dispatch.
|
|
8227
8683
|
*/
|
|
8228
|
-
|
|
8229
|
-
_optionalChain([this, 'access',
|
|
8230
|
-
const
|
|
8231
|
-
|
|
8684
|
+
#prepareDelete(key) {
|
|
8685
|
+
_optionalChain([this, 'access', _211 => _211._pool, 'optionalAccess', _212 => _212.assertStorageIsWritable, 'call', _213 => _213()]);
|
|
8686
|
+
const k = key;
|
|
8687
|
+
if (this.#local.has(k) && !this.#synced.has(k)) {
|
|
8688
|
+
const oldValue2 = this.#local.get(k);
|
|
8689
|
+
this.#local.delete(k);
|
|
8690
|
+
this.invalidate();
|
|
8691
|
+
if (this._pool !== void 0 && this._id !== void 0) {
|
|
8692
|
+
const storageUpdates2 = /* @__PURE__ */ new Map();
|
|
8693
|
+
storageUpdates2.set(this._id, {
|
|
8694
|
+
node: this,
|
|
8695
|
+
type: "LiveObject",
|
|
8696
|
+
updates: {
|
|
8697
|
+
[k]: {
|
|
8698
|
+
type: "delete",
|
|
8699
|
+
deletedItem: oldValue2
|
|
8700
|
+
}
|
|
8701
|
+
}
|
|
8702
|
+
});
|
|
8703
|
+
return [[], [], storageUpdates2];
|
|
8704
|
+
}
|
|
8705
|
+
return null;
|
|
8706
|
+
}
|
|
8707
|
+
this.#local.delete(k);
|
|
8708
|
+
const oldValue = this.#synced.get(k);
|
|
8232
8709
|
if (oldValue === void 0) {
|
|
8233
|
-
return;
|
|
8710
|
+
return null;
|
|
8234
8711
|
}
|
|
8235
8712
|
if (this._pool === void 0 || this._id === void 0) {
|
|
8236
8713
|
if (isLiveNode(oldValue)) {
|
|
8237
8714
|
oldValue._detach();
|
|
8238
8715
|
}
|
|
8239
|
-
this.#
|
|
8716
|
+
this.#synced.delete(k);
|
|
8240
8717
|
this.invalidate();
|
|
8241
|
-
return;
|
|
8718
|
+
return null;
|
|
8242
8719
|
}
|
|
8720
|
+
const ops = [
|
|
8721
|
+
{
|
|
8722
|
+
type: OpCode.DELETE_OBJECT_KEY,
|
|
8723
|
+
key: k,
|
|
8724
|
+
id: this._id,
|
|
8725
|
+
opId: this._pool.generateOpId()
|
|
8726
|
+
}
|
|
8727
|
+
];
|
|
8243
8728
|
let reverse;
|
|
8244
8729
|
if (isLiveNode(oldValue)) {
|
|
8245
8730
|
oldValue._detach();
|
|
8246
|
-
reverse = oldValue._toOps(this._id,
|
|
8731
|
+
reverse = oldValue._toOps(this._id, k);
|
|
8247
8732
|
} else {
|
|
8248
8733
|
reverse = [
|
|
8249
8734
|
{
|
|
8250
8735
|
type: OpCode.UPDATE_OBJECT,
|
|
8251
|
-
data: { [
|
|
8736
|
+
data: { [k]: oldValue },
|
|
8252
8737
|
id: this._id
|
|
8253
8738
|
}
|
|
8254
8739
|
];
|
|
8255
8740
|
}
|
|
8256
|
-
this.#
|
|
8741
|
+
this.#synced.delete(k);
|
|
8257
8742
|
this.invalidate();
|
|
8258
8743
|
const storageUpdates = /* @__PURE__ */ new Map();
|
|
8259
8744
|
storageUpdates.set(this._id, {
|
|
@@ -8263,28 +8748,28 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8263
8748
|
[key]: { type: "delete", deletedItem: oldValue }
|
|
8264
8749
|
}
|
|
8265
8750
|
});
|
|
8266
|
-
|
|
8267
|
-
|
|
8268
|
-
|
|
8269
|
-
|
|
8270
|
-
|
|
8271
|
-
|
|
8272
|
-
|
|
8273
|
-
|
|
8274
|
-
|
|
8275
|
-
reverse,
|
|
8276
|
-
storageUpdates
|
|
8277
|
-
|
|
8751
|
+
return [ops, reverse, storageUpdates];
|
|
8752
|
+
}
|
|
8753
|
+
/**
|
|
8754
|
+
* Deletes a key from the LiveObject
|
|
8755
|
+
* @param key The key of the property to delete
|
|
8756
|
+
*/
|
|
8757
|
+
delete(key) {
|
|
8758
|
+
const result = this.#prepareDelete(key);
|
|
8759
|
+
if (result) {
|
|
8760
|
+
const [ops, reverse, storageUpdates] = result;
|
|
8761
|
+
_optionalChain([this, 'access', _214 => _214._pool, 'optionalAccess', _215 => _215.dispatch, 'call', _216 => _216(ops, reverse, storageUpdates)]);
|
|
8762
|
+
}
|
|
8278
8763
|
}
|
|
8279
8764
|
/**
|
|
8280
8765
|
* Adds or updates multiple properties at once with an object.
|
|
8281
8766
|
* @param patch The object used to overrides properties
|
|
8282
8767
|
*/
|
|
8283
8768
|
update(patch) {
|
|
8284
|
-
_optionalChain([this, 'access',
|
|
8769
|
+
_optionalChain([this, 'access', _217 => _217._pool, 'optionalAccess', _218 => _218.assertStorageIsWritable, 'call', _219 => _219()]);
|
|
8285
8770
|
if (_LiveObject.detectLargeObjects) {
|
|
8286
8771
|
const data = {};
|
|
8287
|
-
for (const [key, value] of this.#
|
|
8772
|
+
for (const [key, value] of this.#synced) {
|
|
8288
8773
|
if (!isLiveNode(value)) {
|
|
8289
8774
|
data[key] = value;
|
|
8290
8775
|
}
|
|
@@ -8313,14 +8798,15 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8313
8798
|
if (newValue === void 0) {
|
|
8314
8799
|
continue;
|
|
8315
8800
|
}
|
|
8316
|
-
const oldValue = this.#
|
|
8801
|
+
const oldValue = this.#synced.get(key);
|
|
8317
8802
|
if (isLiveNode(oldValue)) {
|
|
8318
8803
|
oldValue._detach();
|
|
8319
8804
|
}
|
|
8320
8805
|
if (isLiveNode(newValue)) {
|
|
8321
8806
|
newValue._setParentLink(this, key);
|
|
8322
8807
|
}
|
|
8323
|
-
this.#
|
|
8808
|
+
this.#local.delete(key);
|
|
8809
|
+
this.#synced.set(key, newValue);
|
|
8324
8810
|
this.invalidate();
|
|
8325
8811
|
}
|
|
8326
8812
|
return;
|
|
@@ -8340,7 +8826,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8340
8826
|
if (newValue === void 0) {
|
|
8341
8827
|
continue;
|
|
8342
8828
|
}
|
|
8343
|
-
const oldValue = this.#
|
|
8829
|
+
const oldValue = this.#synced.get(key);
|
|
8344
8830
|
if (isLiveNode(oldValue)) {
|
|
8345
8831
|
for (const childOp of oldValue._toOps(this._id, key)) {
|
|
8346
8832
|
reverseOps.push(childOp);
|
|
@@ -8372,7 +8858,8 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8372
8858
|
updatedProps[key] = newValue;
|
|
8373
8859
|
this.#unackedOpsByKey.set(key, opId);
|
|
8374
8860
|
}
|
|
8375
|
-
this.#
|
|
8861
|
+
this.#local.delete(key);
|
|
8862
|
+
this.#synced.set(key, newValue);
|
|
8376
8863
|
this.invalidate();
|
|
8377
8864
|
updateDelta[key] = { type: "update" };
|
|
8378
8865
|
}
|
|
@@ -8395,6 +8882,19 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8395
8882
|
});
|
|
8396
8883
|
this._pool.dispatch(ops, reverseOps, storageUpdates);
|
|
8397
8884
|
}
|
|
8885
|
+
/**
|
|
8886
|
+
* Reconciles a LiveObject tree to match the given JSON object and sync
|
|
8887
|
+
* config. Only mutates keys that actually changed. Recursively reconciles
|
|
8888
|
+
* the entire Live tree below it.
|
|
8889
|
+
*/
|
|
8890
|
+
reconcile(jsonObj, config) {
|
|
8891
|
+
if (this.immutableIs(jsonObj)) return;
|
|
8892
|
+
if (!isPlainObject(jsonObj))
|
|
8893
|
+
throw new Error(
|
|
8894
|
+
"Reconciling the document root expects a plain object value"
|
|
8895
|
+
);
|
|
8896
|
+
reconcileLiveObject(this, jsonObj, config);
|
|
8897
|
+
}
|
|
8398
8898
|
toImmutable() {
|
|
8399
8899
|
return super.toImmutable();
|
|
8400
8900
|
}
|
|
@@ -8409,7 +8909,7 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8409
8909
|
type: "LiveObject",
|
|
8410
8910
|
id: nodeId,
|
|
8411
8911
|
key,
|
|
8412
|
-
payload: Array.from(this.#
|
|
8912
|
+
payload: Array.from(this.#synced.entries()).map(
|
|
8413
8913
|
([key2, value]) => isLiveNode(value) ? value.toTreeNode(key2) : { type: "Json", id: `${nodeId}:${key2}`, key: key2, payload: value }
|
|
8414
8914
|
)
|
|
8415
8915
|
};
|
|
@@ -8417,20 +8917,27 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
|
|
|
8417
8917
|
/** @internal */
|
|
8418
8918
|
_toImmutable() {
|
|
8419
8919
|
const result = {};
|
|
8420
|
-
for (const [key, val] of this.#
|
|
8920
|
+
for (const [key, val] of this.#synced) {
|
|
8421
8921
|
result[key] = isLiveStructure(val) ? val.toImmutable() : val;
|
|
8422
8922
|
}
|
|
8923
|
+
for (const [key, val] of this.#local) {
|
|
8924
|
+
result[key] = val;
|
|
8925
|
+
}
|
|
8423
8926
|
return process.env.NODE_ENV === "production" ? result : Object.freeze(result);
|
|
8424
8927
|
}
|
|
8425
8928
|
clone() {
|
|
8426
|
-
|
|
8929
|
+
const cloned = new _LiveObject(
|
|
8427
8930
|
Object.fromEntries(
|
|
8428
|
-
Array.from(this.#
|
|
8931
|
+
Array.from(this.#synced).map(([key, value]) => [
|
|
8429
8932
|
key,
|
|
8430
8933
|
isLiveStructure(value) ? value.clone() : deepClone(value)
|
|
8431
8934
|
])
|
|
8432
8935
|
)
|
|
8433
8936
|
);
|
|
8937
|
+
for (const [key, value] of this.#local) {
|
|
8938
|
+
cloned.#local.set(key, deepClone(value));
|
|
8939
|
+
}
|
|
8940
|
+
return cloned;
|
|
8434
8941
|
}
|
|
8435
8942
|
}, _class2.__initStatic(), _class2);
|
|
8436
8943
|
|
|
@@ -8730,17 +9237,6 @@ var Deque = class {
|
|
|
8730
9237
|
}
|
|
8731
9238
|
};
|
|
8732
9239
|
|
|
8733
|
-
// src/lib/Json.ts
|
|
8734
|
-
function isJsonScalar(data) {
|
|
8735
|
-
return data === null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
|
|
8736
|
-
}
|
|
8737
|
-
function isJsonArray(data) {
|
|
8738
|
-
return Array.isArray(data);
|
|
8739
|
-
}
|
|
8740
|
-
function isJsonObject(data) {
|
|
8741
|
-
return !isJsonScalar(data) && !isJsonArray(data);
|
|
8742
|
-
}
|
|
8743
|
-
|
|
8744
9240
|
// src/lib/stopwatch.ts
|
|
8745
9241
|
function makeStopWatch() {
|
|
8746
9242
|
let startTime = 0;
|
|
@@ -9038,15 +9534,15 @@ function installBackgroundTabSpy() {
|
|
|
9038
9534
|
const doc = typeof document !== "undefined" ? document : void 0;
|
|
9039
9535
|
const inBackgroundSince = { current: null };
|
|
9040
9536
|
function onVisibilityChange() {
|
|
9041
|
-
if (_optionalChain([doc, 'optionalAccess',
|
|
9537
|
+
if (_optionalChain([doc, 'optionalAccess', _220 => _220.visibilityState]) === "hidden") {
|
|
9042
9538
|
inBackgroundSince.current = _nullishCoalesce(inBackgroundSince.current, () => ( Date.now()));
|
|
9043
9539
|
} else {
|
|
9044
9540
|
inBackgroundSince.current = null;
|
|
9045
9541
|
}
|
|
9046
9542
|
}
|
|
9047
|
-
_optionalChain([doc, 'optionalAccess',
|
|
9543
|
+
_optionalChain([doc, 'optionalAccess', _221 => _221.addEventListener, 'call', _222 => _222("visibilitychange", onVisibilityChange)]);
|
|
9048
9544
|
const unsub = () => {
|
|
9049
|
-
_optionalChain([doc, 'optionalAccess',
|
|
9545
|
+
_optionalChain([doc, 'optionalAccess', _223 => _223.removeEventListener, 'call', _224 => _224("visibilitychange", onVisibilityChange)]);
|
|
9050
9546
|
};
|
|
9051
9547
|
return [inBackgroundSince, unsub];
|
|
9052
9548
|
}
|
|
@@ -9226,14 +9722,18 @@ function createRoom(options, config) {
|
|
|
9226
9722
|
}
|
|
9227
9723
|
context.activeBatch.reverseOps.pushLeft(reverse);
|
|
9228
9724
|
} else {
|
|
9229
|
-
|
|
9230
|
-
|
|
9231
|
-
|
|
9725
|
+
if (reverse.length > 0) {
|
|
9726
|
+
addToUndoStack(reverse);
|
|
9727
|
+
}
|
|
9728
|
+
if (ops.length > 0) {
|
|
9729
|
+
context.redoStack.length = 0;
|
|
9730
|
+
dispatchOps(ops);
|
|
9731
|
+
}
|
|
9232
9732
|
notify({ storageUpdates });
|
|
9233
9733
|
}
|
|
9234
9734
|
}
|
|
9235
9735
|
function isStorageWritable() {
|
|
9236
|
-
const scopes = _optionalChain([context, 'access',
|
|
9736
|
+
const scopes = _optionalChain([context, 'access', _225 => _225.dynamicSessionInfoSig, 'access', _226 => _226.get, 'call', _227 => _227(), 'optionalAccess', _228 => _228.scopes]);
|
|
9237
9737
|
return scopes !== void 0 ? canWriteStorage(scopes) : true;
|
|
9238
9738
|
}
|
|
9239
9739
|
const eventHub = {
|
|
@@ -9336,20 +9836,21 @@ function createRoom(options, config) {
|
|
|
9336
9836
|
context.pool
|
|
9337
9837
|
);
|
|
9338
9838
|
}
|
|
9339
|
-
const canWrite = _nullishCoalesce(_optionalChain([self, 'access',
|
|
9340
|
-
const
|
|
9341
|
-
|
|
9342
|
-
|
|
9343
|
-
if (
|
|
9344
|
-
|
|
9345
|
-
|
|
9346
|
-
|
|
9347
|
-
|
|
9348
|
-
|
|
9839
|
+
const canWrite = _nullishCoalesce(_optionalChain([self, 'access', _229 => _229.get, 'call', _230 => _230(), 'optionalAccess', _231 => _231.canWrite]), () => ( true));
|
|
9840
|
+
const root = context.root;
|
|
9841
|
+
withoutHistory(() => {
|
|
9842
|
+
for (const key in context.initialStorage) {
|
|
9843
|
+
if (root.get(key) === void 0) {
|
|
9844
|
+
if (canWrite) {
|
|
9845
|
+
root.set(key, cloneLson(context.initialStorage[key]));
|
|
9846
|
+
} else {
|
|
9847
|
+
warn(
|
|
9848
|
+
`Attempted to populate missing storage key '${key}', but current user has no write access`
|
|
9849
|
+
);
|
|
9850
|
+
}
|
|
9349
9851
|
}
|
|
9350
9852
|
}
|
|
9351
|
-
}
|
|
9352
|
-
context.undoStack.length = stackSizeBefore;
|
|
9853
|
+
});
|
|
9353
9854
|
}
|
|
9354
9855
|
function _addToRealUndoStack(frames) {
|
|
9355
9856
|
if (context.undoStack.length >= 50) {
|
|
@@ -9540,7 +10041,7 @@ function createRoom(options, config) {
|
|
|
9540
10041
|
}
|
|
9541
10042
|
context.myPresence.patch(patch);
|
|
9542
10043
|
if (context.activeBatch) {
|
|
9543
|
-
if (_optionalChain([options2, 'optionalAccess',
|
|
10044
|
+
if (_optionalChain([options2, 'optionalAccess', _232 => _232.addToHistory])) {
|
|
9544
10045
|
context.activeBatch.reverseOps.pushLeft({
|
|
9545
10046
|
type: "presence",
|
|
9546
10047
|
data: oldValues
|
|
@@ -9549,7 +10050,7 @@ function createRoom(options, config) {
|
|
|
9549
10050
|
context.activeBatch.updates.presence = true;
|
|
9550
10051
|
} else {
|
|
9551
10052
|
flushNowOrSoon();
|
|
9552
|
-
if (_optionalChain([options2, 'optionalAccess',
|
|
10053
|
+
if (_optionalChain([options2, 'optionalAccess', _233 => _233.addToHistory])) {
|
|
9553
10054
|
addToUndoStack([{ type: "presence", data: oldValues }]);
|
|
9554
10055
|
}
|
|
9555
10056
|
notify({ presence: true });
|
|
@@ -9723,11 +10224,11 @@ function createRoom(options, config) {
|
|
|
9723
10224
|
break;
|
|
9724
10225
|
}
|
|
9725
10226
|
case ServerMsgCode.STORAGE_CHUNK:
|
|
9726
|
-
_optionalChain([stopwatch, 'optionalAccess',
|
|
10227
|
+
_optionalChain([stopwatch, 'optionalAccess', _234 => _234.lap, 'call', _235 => _235()]);
|
|
9727
10228
|
nodeMapBuffer.append(compactNodesToNodeStream(message.nodes));
|
|
9728
10229
|
break;
|
|
9729
10230
|
case ServerMsgCode.STORAGE_STREAM_END: {
|
|
9730
|
-
const timing = _optionalChain([stopwatch, 'optionalAccess',
|
|
10231
|
+
const timing = _optionalChain([stopwatch, 'optionalAccess', _236 => _236.stop, 'call', _237 => _237()]);
|
|
9731
10232
|
if (timing) {
|
|
9732
10233
|
const ms = (v) => `${v.toFixed(1)}ms`;
|
|
9733
10234
|
const rest = timing.laps.slice(1);
|
|
@@ -9890,7 +10391,7 @@ function createRoom(options, config) {
|
|
|
9890
10391
|
const unacknowledgedOps = new Map(context.unacknowledgedOps);
|
|
9891
10392
|
createOrUpdateRootFromMessage(nodes);
|
|
9892
10393
|
applyAndSendOfflineOps(unacknowledgedOps);
|
|
9893
|
-
_optionalChain([_resolveStoragePromise, 'optionalCall',
|
|
10394
|
+
_optionalChain([_resolveStoragePromise, 'optionalCall', _238 => _238()]);
|
|
9894
10395
|
notifyStorageStatus();
|
|
9895
10396
|
eventHub.storageDidLoad.notify();
|
|
9896
10397
|
}
|
|
@@ -9908,7 +10409,7 @@ function createRoom(options, config) {
|
|
|
9908
10409
|
} else if (!messages.some((msg) => msg.type === ClientMsgCode.FETCH_STORAGE)) {
|
|
9909
10410
|
messages.push({ type: ClientMsgCode.FETCH_STORAGE });
|
|
9910
10411
|
nodeMapBuffer.take();
|
|
9911
|
-
_optionalChain([stopwatch, 'optionalAccess',
|
|
10412
|
+
_optionalChain([stopwatch, 'optionalAccess', _239 => _239.start, 'call', _240 => _240()]);
|
|
9912
10413
|
}
|
|
9913
10414
|
if (options2.flush) {
|
|
9914
10415
|
flushNowOrSoon();
|
|
@@ -10042,6 +10543,16 @@ function createRoom(options, config) {
|
|
|
10042
10543
|
_addToRealUndoStack(Array.from(frames));
|
|
10043
10544
|
}
|
|
10044
10545
|
}
|
|
10546
|
+
function withoutHistory(fn) {
|
|
10547
|
+
const undoBefore = context.undoStack.length;
|
|
10548
|
+
const redoBefore = context.redoStack.length;
|
|
10549
|
+
try {
|
|
10550
|
+
return fn();
|
|
10551
|
+
} finally {
|
|
10552
|
+
context.undoStack.length = undoBefore;
|
|
10553
|
+
context.redoStack.length = redoBefore;
|
|
10554
|
+
}
|
|
10555
|
+
}
|
|
10045
10556
|
const syncSourceForStorage = config.createSyncSource();
|
|
10046
10557
|
function getStorageStatus() {
|
|
10047
10558
|
if (context.root === void 0) {
|
|
@@ -10111,8 +10622,8 @@ function createRoom(options, config) {
|
|
|
10111
10622
|
async function getThreads(options2) {
|
|
10112
10623
|
return httpClient.getThreads({
|
|
10113
10624
|
roomId,
|
|
10114
|
-
query: _optionalChain([options2, 'optionalAccess',
|
|
10115
|
-
cursor: _optionalChain([options2, 'optionalAccess',
|
|
10625
|
+
query: _optionalChain([options2, 'optionalAccess', _241 => _241.query]),
|
|
10626
|
+
cursor: _optionalChain([options2, 'optionalAccess', _242 => _242.cursor])
|
|
10116
10627
|
});
|
|
10117
10628
|
}
|
|
10118
10629
|
async function getThread(threadId) {
|
|
@@ -10234,7 +10745,7 @@ function createRoom(options, config) {
|
|
|
10234
10745
|
function getSubscriptionSettings(options2) {
|
|
10235
10746
|
return httpClient.getSubscriptionSettings({
|
|
10236
10747
|
roomId,
|
|
10237
|
-
signal: _optionalChain([options2, 'optionalAccess',
|
|
10748
|
+
signal: _optionalChain([options2, 'optionalAccess', _243 => _243.signal])
|
|
10238
10749
|
});
|
|
10239
10750
|
}
|
|
10240
10751
|
function updateSubscriptionSettings(settings) {
|
|
@@ -10256,7 +10767,7 @@ function createRoom(options, config) {
|
|
|
10256
10767
|
{
|
|
10257
10768
|
[kInternal]: {
|
|
10258
10769
|
get presenceBuffer() {
|
|
10259
|
-
return deepClone(_nullishCoalesce(_optionalChain([context, 'access',
|
|
10770
|
+
return deepClone(_nullishCoalesce(_optionalChain([context, 'access', _244 => _244.buffer, 'access', _245 => _245.presenceUpdates, 'optionalAccess', _246 => _246.data]), () => ( null)));
|
|
10260
10771
|
},
|
|
10261
10772
|
// prettier-ignore
|
|
10262
10773
|
get undoStack() {
|
|
@@ -10271,9 +10782,9 @@ function createRoom(options, config) {
|
|
|
10271
10782
|
return context.yjsProvider;
|
|
10272
10783
|
},
|
|
10273
10784
|
setYjsProvider(newProvider) {
|
|
10274
|
-
_optionalChain([context, 'access',
|
|
10785
|
+
_optionalChain([context, 'access', _247 => _247.yjsProvider, 'optionalAccess', _248 => _248.off, 'call', _249 => _249("status", yjsStatusDidChange)]);
|
|
10275
10786
|
context.yjsProvider = newProvider;
|
|
10276
|
-
_optionalChain([newProvider, 'optionalAccess',
|
|
10787
|
+
_optionalChain([newProvider, 'optionalAccess', _250 => _250.on, 'call', _251 => _251("status", yjsStatusDidChange)]);
|
|
10277
10788
|
context.yjsProviderDidChange.notify();
|
|
10278
10789
|
},
|
|
10279
10790
|
yjsProviderDidChange: context.yjsProviderDidChange.observable,
|
|
@@ -10320,7 +10831,7 @@ function createRoom(options, config) {
|
|
|
10320
10831
|
source.dispose();
|
|
10321
10832
|
}
|
|
10322
10833
|
eventHub.roomWillDestroy.notify();
|
|
10323
|
-
_optionalChain([context, 'access',
|
|
10834
|
+
_optionalChain([context, 'access', _252 => _252.yjsProvider, 'optionalAccess', _253 => _253.off, 'call', _254 => _254("status", yjsStatusDidChange)]);
|
|
10324
10835
|
syncSourceForStorage.destroy();
|
|
10325
10836
|
syncSourceForYjs.destroy();
|
|
10326
10837
|
uninstallBgTabSpy();
|
|
@@ -10340,7 +10851,10 @@ function createRoom(options, config) {
|
|
|
10340
10851
|
canRedo,
|
|
10341
10852
|
clear,
|
|
10342
10853
|
pause: pauseHistory,
|
|
10343
|
-
resume: resumeHistory
|
|
10854
|
+
resume: resumeHistory,
|
|
10855
|
+
[kInternal]: {
|
|
10856
|
+
withoutHistory
|
|
10857
|
+
}
|
|
10344
10858
|
},
|
|
10345
10859
|
fetchYDoc,
|
|
10346
10860
|
getStorage,
|
|
@@ -10471,7 +10985,7 @@ function makeClassicSubscribeFn(roomId, events, errorEvents) {
|
|
|
10471
10985
|
}
|
|
10472
10986
|
if (isLiveNode(first)) {
|
|
10473
10987
|
const node = first;
|
|
10474
|
-
if (_optionalChain([options, 'optionalAccess',
|
|
10988
|
+
if (_optionalChain([options, 'optionalAccess', _255 => _255.isDeep])) {
|
|
10475
10989
|
const storageCallback = second;
|
|
10476
10990
|
return subscribeToLiveStructureDeeply(node, storageCallback);
|
|
10477
10991
|
} else {
|
|
@@ -10557,8 +11071,8 @@ function createClient(options) {
|
|
|
10557
11071
|
const authManager = createAuthManager(options, (token) => {
|
|
10558
11072
|
currentUserId.set(() => token.uid);
|
|
10559
11073
|
});
|
|
10560
|
-
const fetchPolyfill = _optionalChain([clientOptions, 'access',
|
|
10561
|
-
_optionalChain([globalThis, 'access',
|
|
11074
|
+
const fetchPolyfill = _optionalChain([clientOptions, 'access', _256 => _256.polyfills, 'optionalAccess', _257 => _257.fetch]) || /* istanbul ignore next */
|
|
11075
|
+
_optionalChain([globalThis, 'access', _258 => _258.fetch, 'optionalAccess', _259 => _259.bind, 'call', _260 => _260(globalThis)]);
|
|
10562
11076
|
const httpClient = createApiClient({
|
|
10563
11077
|
baseUrl,
|
|
10564
11078
|
fetchPolyfill,
|
|
@@ -10576,7 +11090,7 @@ function createClient(options) {
|
|
|
10576
11090
|
delegates: {
|
|
10577
11091
|
createSocket: makeCreateSocketDelegateForAi(
|
|
10578
11092
|
baseUrl,
|
|
10579
|
-
_optionalChain([clientOptions, 'access',
|
|
11093
|
+
_optionalChain([clientOptions, 'access', _261 => _261.polyfills, 'optionalAccess', _262 => _262.WebSocket])
|
|
10580
11094
|
),
|
|
10581
11095
|
authenticate: async () => {
|
|
10582
11096
|
const resp = await authManager.getAuthValue({
|
|
@@ -10636,7 +11150,7 @@ function createClient(options) {
|
|
|
10636
11150
|
createSocket: makeCreateSocketDelegateForRoom(
|
|
10637
11151
|
roomId,
|
|
10638
11152
|
baseUrl,
|
|
10639
|
-
_optionalChain([clientOptions, 'access',
|
|
11153
|
+
_optionalChain([clientOptions, 'access', _263 => _263.polyfills, 'optionalAccess', _264 => _264.WebSocket])
|
|
10640
11154
|
),
|
|
10641
11155
|
authenticate: makeAuthDelegateForRoom(roomId, authManager)
|
|
10642
11156
|
})),
|
|
@@ -10659,7 +11173,7 @@ function createClient(options) {
|
|
|
10659
11173
|
const shouldConnect = _nullishCoalesce(options2.autoConnect, () => ( true));
|
|
10660
11174
|
if (shouldConnect) {
|
|
10661
11175
|
if (typeof atob === "undefined") {
|
|
10662
|
-
if (_optionalChain([clientOptions, 'access',
|
|
11176
|
+
if (_optionalChain([clientOptions, 'access', _265 => _265.polyfills, 'optionalAccess', _266 => _266.atob]) === void 0) {
|
|
10663
11177
|
throw new Error(
|
|
10664
11178
|
"You need to polyfill atob to use the client in your environment. Please follow the instructions at https://liveblocks.io/docs/errors/liveblocks-client/atob-polyfill"
|
|
10665
11179
|
);
|
|
@@ -10671,7 +11185,7 @@ function createClient(options) {
|
|
|
10671
11185
|
return leaseRoom(newRoomDetails);
|
|
10672
11186
|
}
|
|
10673
11187
|
function getRoom(roomId) {
|
|
10674
|
-
const room = _optionalChain([roomsById, 'access',
|
|
11188
|
+
const room = _optionalChain([roomsById, 'access', _267 => _267.get, 'call', _268 => _268(roomId), 'optionalAccess', _269 => _269.room]);
|
|
10675
11189
|
return room ? room : null;
|
|
10676
11190
|
}
|
|
10677
11191
|
function logout() {
|
|
@@ -10687,7 +11201,7 @@ function createClient(options) {
|
|
|
10687
11201
|
const batchedResolveUsers = new Batch(
|
|
10688
11202
|
async (batchedUserIds) => {
|
|
10689
11203
|
const userIds = batchedUserIds.flat();
|
|
10690
|
-
const users = await _optionalChain([resolveUsers, 'optionalCall',
|
|
11204
|
+
const users = await _optionalChain([resolveUsers, 'optionalCall', _270 => _270({ userIds })]);
|
|
10691
11205
|
warnOnceIf(
|
|
10692
11206
|
!resolveUsers,
|
|
10693
11207
|
"Set the resolveUsers option in createClient to specify user info."
|
|
@@ -10704,7 +11218,7 @@ function createClient(options) {
|
|
|
10704
11218
|
const batchedResolveRoomsInfo = new Batch(
|
|
10705
11219
|
async (batchedRoomIds) => {
|
|
10706
11220
|
const roomIds = batchedRoomIds.flat();
|
|
10707
|
-
const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall',
|
|
11221
|
+
const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall', _271 => _271({ roomIds })]);
|
|
10708
11222
|
warnOnceIf(
|
|
10709
11223
|
!resolveRoomsInfo,
|
|
10710
11224
|
"Set the resolveRoomsInfo option in createClient to specify room info."
|
|
@@ -10721,7 +11235,7 @@ function createClient(options) {
|
|
|
10721
11235
|
const batchedResolveGroupsInfo = new Batch(
|
|
10722
11236
|
async (batchedGroupIds) => {
|
|
10723
11237
|
const groupIds = batchedGroupIds.flat();
|
|
10724
|
-
const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall',
|
|
11238
|
+
const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall', _272 => _272({ groupIds })]);
|
|
10725
11239
|
warnOnceIf(
|
|
10726
11240
|
!resolveGroupsInfo,
|
|
10727
11241
|
"Set the resolveGroupsInfo option in createClient to specify group info."
|
|
@@ -10777,7 +11291,7 @@ function createClient(options) {
|
|
|
10777
11291
|
}
|
|
10778
11292
|
};
|
|
10779
11293
|
const win = typeof window !== "undefined" ? window : void 0;
|
|
10780
|
-
_optionalChain([win, 'optionalAccess',
|
|
11294
|
+
_optionalChain([win, 'optionalAccess', _273 => _273.addEventListener, 'call', _274 => _274("beforeunload", maybePreventClose)]);
|
|
10781
11295
|
}
|
|
10782
11296
|
async function getNotificationSettings(options2) {
|
|
10783
11297
|
const plainSettings = await httpClient.getNotificationSettings(options2);
|
|
@@ -10904,7 +11418,7 @@ var commentBodyElementsTypes = {
|
|
|
10904
11418
|
mention: "inline"
|
|
10905
11419
|
};
|
|
10906
11420
|
function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
|
|
10907
|
-
if (!body || !_optionalChain([body, 'optionalAccess',
|
|
11421
|
+
if (!body || !_optionalChain([body, 'optionalAccess', _275 => _275.content])) {
|
|
10908
11422
|
return;
|
|
10909
11423
|
}
|
|
10910
11424
|
const element = typeof elementOrVisitor === "string" ? elementOrVisitor : void 0;
|
|
@@ -10914,13 +11428,13 @@ function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
|
|
|
10914
11428
|
for (const block of body.content) {
|
|
10915
11429
|
if (type === "all" || type === "block") {
|
|
10916
11430
|
if (guard(block)) {
|
|
10917
|
-
_optionalChain([visitor, 'optionalCall',
|
|
11431
|
+
_optionalChain([visitor, 'optionalCall', _276 => _276(block)]);
|
|
10918
11432
|
}
|
|
10919
11433
|
}
|
|
10920
11434
|
if (type === "all" || type === "inline") {
|
|
10921
11435
|
for (const inline of block.children) {
|
|
10922
11436
|
if (guard(inline)) {
|
|
10923
|
-
_optionalChain([visitor, 'optionalCall',
|
|
11437
|
+
_optionalChain([visitor, 'optionalCall', _277 => _277(inline)]);
|
|
10924
11438
|
}
|
|
10925
11439
|
}
|
|
10926
11440
|
}
|
|
@@ -11090,7 +11604,7 @@ var stringifyCommentBodyPlainElements = {
|
|
|
11090
11604
|
text: ({ element }) => element.text,
|
|
11091
11605
|
link: ({ element }) => _nullishCoalesce(element.text, () => ( element.url)),
|
|
11092
11606
|
mention: ({ element, user, group }) => {
|
|
11093
|
-
return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess',
|
|
11607
|
+
return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _278 => _278.name]), () => ( _optionalChain([group, 'optionalAccess', _279 => _279.name]))), () => ( element.id))}`;
|
|
11094
11608
|
}
|
|
11095
11609
|
};
|
|
11096
11610
|
var stringifyCommentBodyHtmlElements = {
|
|
@@ -11120,7 +11634,7 @@ var stringifyCommentBodyHtmlElements = {
|
|
|
11120
11634
|
return html`<a href="${href}" target="_blank" rel="noopener noreferrer">${element.text ? html`${element.text}` : element.url}</a>`;
|
|
11121
11635
|
},
|
|
11122
11636
|
mention: ({ element, user, group }) => {
|
|
11123
|
-
return html`<span data-mention>@${_optionalChain([user, 'optionalAccess',
|
|
11637
|
+
return html`<span data-mention>@${_optionalChain([user, 'optionalAccess', _280 => _280.name]) ? html`${_optionalChain([user, 'optionalAccess', _281 => _281.name])}` : _optionalChain([group, 'optionalAccess', _282 => _282.name]) ? html`${_optionalChain([group, 'optionalAccess', _283 => _283.name])}` : element.id}</span>`;
|
|
11124
11638
|
}
|
|
11125
11639
|
};
|
|
11126
11640
|
var stringifyCommentBodyMarkdownElements = {
|
|
@@ -11132,424 +11646,121 @@ var stringifyCommentBodyMarkdownElements = {
|
|
|
11132
11646
|
if (!children) {
|
|
11133
11647
|
return children;
|
|
11134
11648
|
}
|
|
11135
|
-
if (element.bold) {
|
|
11136
|
-
children = markdown`**${children}**`;
|
|
11137
|
-
}
|
|
11138
|
-
if (element.italic) {
|
|
11139
|
-
children = markdown`_${children}_`;
|
|
11140
|
-
}
|
|
11141
|
-
if (element.strikethrough) {
|
|
11142
|
-
children = markdown`~~${children}~~`;
|
|
11143
|
-
}
|
|
11144
|
-
if (element.code) {
|
|
11145
|
-
children = markdown`\`${children}\``;
|
|
11146
|
-
}
|
|
11147
|
-
return children;
|
|
11148
|
-
},
|
|
11149
|
-
link: ({ element, href }) => {
|
|
11150
|
-
return markdown`[${_nullishCoalesce(element.text, () => ( element.url))}](${href})`;
|
|
11151
|
-
},
|
|
11152
|
-
mention: ({ element, user, group }) => {
|
|
11153
|
-
return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _265 => _265.name]), () => ( _optionalChain([group, 'optionalAccess', _266 => _266.name]))), () => ( element.id))}`;
|
|
11154
|
-
}
|
|
11155
|
-
};
|
|
11156
|
-
async function stringifyCommentBody(body, options) {
|
|
11157
|
-
const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _267 => _267.format]), () => ( "plain"));
|
|
11158
|
-
const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _268 => _268.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
|
|
11159
|
-
const elements = {
|
|
11160
|
-
...format === "html" ? stringifyCommentBodyHtmlElements : format === "markdown" ? stringifyCommentBodyMarkdownElements : stringifyCommentBodyPlainElements,
|
|
11161
|
-
..._optionalChain([options, 'optionalAccess', _269 => _269.elements])
|
|
11162
|
-
};
|
|
11163
|
-
const { users: resolvedUsers, groups: resolvedGroupsInfo } = await resolveMentionsInCommentBody(
|
|
11164
|
-
body,
|
|
11165
|
-
_optionalChain([options, 'optionalAccess', _270 => _270.resolveUsers]),
|
|
11166
|
-
_optionalChain([options, 'optionalAccess', _271 => _271.resolveGroupsInfo])
|
|
11167
|
-
);
|
|
11168
|
-
const blocks = body.content.flatMap((block, blockIndex) => {
|
|
11169
|
-
switch (block.type) {
|
|
11170
|
-
case "paragraph": {
|
|
11171
|
-
const inlines = block.children.flatMap((inline, inlineIndex) => {
|
|
11172
|
-
if (isCommentBodyMention(inline)) {
|
|
11173
|
-
return inline.id ? [
|
|
11174
|
-
elements.mention(
|
|
11175
|
-
{
|
|
11176
|
-
element: inline,
|
|
11177
|
-
user: inline.kind === "user" ? resolvedUsers.get(inline.id) : void 0,
|
|
11178
|
-
group: inline.kind === "group" ? resolvedGroupsInfo.get(inline.id) : void 0
|
|
11179
|
-
},
|
|
11180
|
-
inlineIndex
|
|
11181
|
-
)
|
|
11182
|
-
] : [];
|
|
11183
|
-
}
|
|
11184
|
-
if (isCommentBodyLink(inline)) {
|
|
11185
|
-
const href = sanitizeUrl(inline.url);
|
|
11186
|
-
if (href === null) {
|
|
11187
|
-
return [
|
|
11188
|
-
elements.text(
|
|
11189
|
-
{
|
|
11190
|
-
element: { text: _nullishCoalesce(inline.text, () => ( inline.url)) }
|
|
11191
|
-
},
|
|
11192
|
-
inlineIndex
|
|
11193
|
-
)
|
|
11194
|
-
];
|
|
11195
|
-
}
|
|
11196
|
-
return [
|
|
11197
|
-
elements.link(
|
|
11198
|
-
{
|
|
11199
|
-
element: inline,
|
|
11200
|
-
href
|
|
11201
|
-
},
|
|
11202
|
-
inlineIndex
|
|
11203
|
-
)
|
|
11204
|
-
];
|
|
11205
|
-
}
|
|
11206
|
-
if (isCommentBodyText(inline)) {
|
|
11207
|
-
return [elements.text({ element: inline }, inlineIndex)];
|
|
11208
|
-
}
|
|
11209
|
-
return [];
|
|
11210
|
-
});
|
|
11211
|
-
return [
|
|
11212
|
-
elements.paragraph(
|
|
11213
|
-
{ element: block, children: inlines.join("") },
|
|
11214
|
-
blockIndex
|
|
11215
|
-
)
|
|
11216
|
-
];
|
|
11217
|
-
}
|
|
11218
|
-
default:
|
|
11219
|
-
return [];
|
|
11220
|
-
}
|
|
11221
|
-
});
|
|
11222
|
-
return blocks.join(separator);
|
|
11223
|
-
}
|
|
11224
|
-
|
|
11225
|
-
// src/crdts/utils.ts
|
|
11226
|
-
function toPlainLson(lson) {
|
|
11227
|
-
if (lson instanceof LiveObject) {
|
|
11228
|
-
return {
|
|
11229
|
-
liveblocksType: "LiveObject",
|
|
11230
|
-
data: Object.fromEntries(
|
|
11231
|
-
Object.entries(lson.toObject()).flatMap(
|
|
11232
|
-
([key, value]) => value !== void 0 ? [[key, toPlainLson(value)]] : []
|
|
11233
|
-
)
|
|
11234
|
-
)
|
|
11235
|
-
};
|
|
11236
|
-
} else if (lson instanceof LiveMap) {
|
|
11237
|
-
return {
|
|
11238
|
-
liveblocksType: "LiveMap",
|
|
11239
|
-
data: Object.fromEntries(
|
|
11240
|
-
[...lson].map(([key, value]) => [key, toPlainLson(value)])
|
|
11241
|
-
)
|
|
11242
|
-
};
|
|
11243
|
-
} else if (lson instanceof LiveList) {
|
|
11244
|
-
return {
|
|
11245
|
-
liveblocksType: "LiveList",
|
|
11246
|
-
data: [...lson].map((item) => toPlainLson(item))
|
|
11247
|
-
};
|
|
11248
|
-
} else {
|
|
11249
|
-
return lson;
|
|
11250
|
-
}
|
|
11251
|
-
}
|
|
11252
|
-
|
|
11253
|
-
// src/immutable.ts
|
|
11254
|
-
function lsonObjectToJson(obj) {
|
|
11255
|
-
const result = {};
|
|
11256
|
-
for (const key in obj) {
|
|
11257
|
-
const val = obj[key];
|
|
11258
|
-
if (val !== void 0) {
|
|
11259
|
-
result[key] = lsonToJson(val);
|
|
11260
|
-
}
|
|
11261
|
-
}
|
|
11262
|
-
return result;
|
|
11263
|
-
}
|
|
11264
|
-
function liveObjectToJson(liveObject) {
|
|
11265
|
-
return lsonObjectToJson(liveObject.toObject());
|
|
11266
|
-
}
|
|
11267
|
-
function liveMapToJson(map) {
|
|
11268
|
-
const result = {};
|
|
11269
|
-
for (const [key, value] of map.entries()) {
|
|
11270
|
-
result[key] = lsonToJson(value);
|
|
11271
|
-
}
|
|
11272
|
-
return result;
|
|
11273
|
-
}
|
|
11274
|
-
function lsonListToJson(value) {
|
|
11275
|
-
return value.map(lsonToJson);
|
|
11276
|
-
}
|
|
11277
|
-
function liveListToJson(value) {
|
|
11278
|
-
return lsonListToJson(value.toArray());
|
|
11279
|
-
}
|
|
11280
|
-
function lsonToJson(value) {
|
|
11281
|
-
if (value instanceof LiveObject) {
|
|
11282
|
-
return liveObjectToJson(value);
|
|
11283
|
-
} else if (value instanceof LiveList) {
|
|
11284
|
-
return liveListToJson(value);
|
|
11285
|
-
} else if (value instanceof LiveMap) {
|
|
11286
|
-
return liveMapToJson(value);
|
|
11287
|
-
} else if (value instanceof LiveRegister) {
|
|
11288
|
-
return value.data;
|
|
11289
|
-
}
|
|
11290
|
-
if (Array.isArray(value)) {
|
|
11291
|
-
return lsonListToJson(value);
|
|
11292
|
-
} else if (isPlainObject(value)) {
|
|
11293
|
-
return lsonObjectToJson(value);
|
|
11294
|
-
}
|
|
11295
|
-
return value;
|
|
11296
|
-
}
|
|
11297
|
-
function deepLiveify(value) {
|
|
11298
|
-
if (Array.isArray(value)) {
|
|
11299
|
-
return new LiveList(value.map(deepLiveify));
|
|
11300
|
-
} else if (isPlainObject(value)) {
|
|
11301
|
-
const init = {};
|
|
11302
|
-
for (const key in value) {
|
|
11303
|
-
const val = value[key];
|
|
11304
|
-
if (val === void 0) {
|
|
11305
|
-
continue;
|
|
11306
|
-
}
|
|
11307
|
-
init[key] = deepLiveify(val);
|
|
11308
|
-
}
|
|
11309
|
-
return new LiveObject(init);
|
|
11310
|
-
} else {
|
|
11311
|
-
return value;
|
|
11312
|
-
}
|
|
11313
|
-
}
|
|
11314
|
-
function patchLiveList(liveList, prev, next) {
|
|
11315
|
-
let i = 0;
|
|
11316
|
-
let prevEnd = prev.length - 1;
|
|
11317
|
-
let nextEnd = next.length - 1;
|
|
11318
|
-
let prevNode = prev[0];
|
|
11319
|
-
let nextNode = next[0];
|
|
11320
|
-
outer: {
|
|
11321
|
-
while (prevNode === nextNode) {
|
|
11322
|
-
++i;
|
|
11323
|
-
if (i > prevEnd || i > nextEnd) {
|
|
11324
|
-
break outer;
|
|
11325
|
-
}
|
|
11326
|
-
prevNode = prev[i];
|
|
11327
|
-
nextNode = next[i];
|
|
11328
|
-
}
|
|
11329
|
-
prevNode = prev[prevEnd];
|
|
11330
|
-
nextNode = next[nextEnd];
|
|
11331
|
-
while (prevNode === nextNode) {
|
|
11332
|
-
prevEnd--;
|
|
11333
|
-
nextEnd--;
|
|
11334
|
-
if (i > prevEnd || i > nextEnd) {
|
|
11335
|
-
break outer;
|
|
11336
|
-
}
|
|
11337
|
-
prevNode = prev[prevEnd];
|
|
11338
|
-
nextNode = next[nextEnd];
|
|
11339
|
-
}
|
|
11340
|
-
}
|
|
11341
|
-
if (i > prevEnd) {
|
|
11342
|
-
if (i <= nextEnd) {
|
|
11343
|
-
while (i <= nextEnd) {
|
|
11344
|
-
liveList.insert(deepLiveify(next[i]), i);
|
|
11345
|
-
i++;
|
|
11346
|
-
}
|
|
11347
|
-
}
|
|
11348
|
-
} else if (i > nextEnd) {
|
|
11349
|
-
let localI = i;
|
|
11350
|
-
while (localI <= prevEnd) {
|
|
11351
|
-
liveList.delete(i);
|
|
11352
|
-
localI++;
|
|
11353
|
-
}
|
|
11354
|
-
} else {
|
|
11355
|
-
while (i <= prevEnd && i <= nextEnd) {
|
|
11356
|
-
prevNode = prev[i];
|
|
11357
|
-
nextNode = next[i];
|
|
11358
|
-
const liveListNode = liveList.get(i);
|
|
11359
|
-
if (isLiveObject(liveListNode) && isPlainObject(prevNode) && isPlainObject(nextNode)) {
|
|
11360
|
-
patchLiveObject(liveListNode, prevNode, nextNode);
|
|
11361
|
-
} else {
|
|
11362
|
-
liveList.set(i, deepLiveify(nextNode));
|
|
11363
|
-
}
|
|
11364
|
-
i++;
|
|
11365
|
-
}
|
|
11366
|
-
while (i <= nextEnd) {
|
|
11367
|
-
liveList.insert(deepLiveify(next[i]), i);
|
|
11368
|
-
i++;
|
|
11369
|
-
}
|
|
11370
|
-
let localI = i;
|
|
11371
|
-
while (localI <= prevEnd) {
|
|
11372
|
-
liveList.delete(i);
|
|
11373
|
-
localI++;
|
|
11649
|
+
if (element.bold) {
|
|
11650
|
+
children = markdown`**${children}**`;
|
|
11374
11651
|
}
|
|
11375
|
-
|
|
11376
|
-
}
|
|
11377
|
-
function patchLiveObjectKey(liveObject, key, prev, next) {
|
|
11378
|
-
if (process.env.NODE_ENV !== "production") {
|
|
11379
|
-
const nonSerializableValue = findNonSerializableValue(next);
|
|
11380
|
-
if (nonSerializableValue) {
|
|
11381
|
-
error2(
|
|
11382
|
-
`New state path: '${nonSerializableValue.path}' value: '${String(
|
|
11383
|
-
nonSerializableValue.value
|
|
11384
|
-
)}' is not serializable.
|
|
11385
|
-
Only serializable value can be synced with Liveblocks.`
|
|
11386
|
-
);
|
|
11387
|
-
return;
|
|
11652
|
+
if (element.italic) {
|
|
11653
|
+
children = markdown`_${children}_`;
|
|
11388
11654
|
}
|
|
11389
|
-
|
|
11390
|
-
|
|
11391
|
-
if (next === void 0) {
|
|
11392
|
-
liveObject.delete(key);
|
|
11393
|
-
} else if (value === void 0) {
|
|
11394
|
-
liveObject.set(key, deepLiveify(next));
|
|
11395
|
-
} else if (prev === next) {
|
|
11396
|
-
return;
|
|
11397
|
-
} else if (isLiveList(value) && Array.isArray(prev) && Array.isArray(next)) {
|
|
11398
|
-
patchLiveList(value, prev, next);
|
|
11399
|
-
} else if (isLiveObject(value) && isPlainObject(prev) && isPlainObject(next)) {
|
|
11400
|
-
patchLiveObject(value, prev, next);
|
|
11401
|
-
} else {
|
|
11402
|
-
liveObject.set(key, deepLiveify(next));
|
|
11403
|
-
}
|
|
11404
|
-
}
|
|
11405
|
-
function patchLiveObject(root, prev, next) {
|
|
11406
|
-
const updates = {};
|
|
11407
|
-
for (const key in next) {
|
|
11408
|
-
patchLiveObjectKey(root, key, prev[key], next[key]);
|
|
11409
|
-
}
|
|
11410
|
-
for (const key in prev) {
|
|
11411
|
-
if (next[key] === void 0) {
|
|
11412
|
-
root.delete(key);
|
|
11655
|
+
if (element.strikethrough) {
|
|
11656
|
+
children = markdown`~~${children}~~`;
|
|
11413
11657
|
}
|
|
11414
|
-
|
|
11415
|
-
|
|
11416
|
-
root.update(updates);
|
|
11417
|
-
}
|
|
11418
|
-
}
|
|
11419
|
-
function getParentsPath(node) {
|
|
11420
|
-
const path = [];
|
|
11421
|
-
while (node.parent.type === "HasParent") {
|
|
11422
|
-
if (isLiveList(node.parent.node)) {
|
|
11423
|
-
path.push(node.parent.node._indexOfPosition(node.parent.key));
|
|
11424
|
-
} else {
|
|
11425
|
-
path.push(node.parent.key);
|
|
11658
|
+
if (element.code) {
|
|
11659
|
+
children = markdown`\`${children}\``;
|
|
11426
11660
|
}
|
|
11427
|
-
|
|
11661
|
+
return children;
|
|
11662
|
+
},
|
|
11663
|
+
link: ({ element, href }) => {
|
|
11664
|
+
return markdown`[${_nullishCoalesce(element.text, () => ( element.url))}](${href})`;
|
|
11665
|
+
},
|
|
11666
|
+
mention: ({ element, user, group }) => {
|
|
11667
|
+
return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _284 => _284.name]), () => ( _optionalChain([group, 'optionalAccess', _285 => _285.name]))), () => ( element.id))}`;
|
|
11428
11668
|
}
|
|
11429
|
-
|
|
11430
|
-
|
|
11431
|
-
|
|
11432
|
-
|
|
11433
|
-
|
|
11434
|
-
|
|
11669
|
+
};
|
|
11670
|
+
async function stringifyCommentBody(body, options) {
|
|
11671
|
+
const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _286 => _286.format]), () => ( "plain"));
|
|
11672
|
+
const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _287 => _287.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
|
|
11673
|
+
const elements = {
|
|
11674
|
+
...format === "html" ? stringifyCommentBodyHtmlElements : format === "markdown" ? stringifyCommentBodyMarkdownElements : stringifyCommentBodyPlainElements,
|
|
11675
|
+
..._optionalChain([options, 'optionalAccess', _288 => _288.elements])
|
|
11676
|
+
};
|
|
11677
|
+
const { users: resolvedUsers, groups: resolvedGroupsInfo } = await resolveMentionsInCommentBody(
|
|
11678
|
+
body,
|
|
11679
|
+
_optionalChain([options, 'optionalAccess', _289 => _289.resolveUsers]),
|
|
11680
|
+
_optionalChain([options, 'optionalAccess', _290 => _290.resolveGroupsInfo])
|
|
11435
11681
|
);
|
|
11436
|
-
|
|
11437
|
-
|
|
11438
|
-
|
|
11439
|
-
|
|
11440
|
-
|
|
11441
|
-
|
|
11442
|
-
|
|
11443
|
-
|
|
11444
|
-
|
|
11445
|
-
|
|
11446
|
-
|
|
11447
|
-
|
|
11448
|
-
|
|
11449
|
-
|
|
11450
|
-
|
|
11451
|
-
const newState = Object.assign({}, state);
|
|
11452
|
-
for (const key in update.updates) {
|
|
11453
|
-
if (_optionalChain([update, 'access', _272 => _272.updates, 'access', _273 => _273[key], 'optionalAccess', _274 => _274.type]) === "update") {
|
|
11454
|
-
const val = update.node.get(key);
|
|
11455
|
-
if (val !== void 0) {
|
|
11456
|
-
newState[key] = lsonToJson(val);
|
|
11457
|
-
}
|
|
11458
|
-
} else if (_optionalChain([update, 'access', _275 => _275.updates, 'access', _276 => _276[key], 'optionalAccess', _277 => _277.type]) === "delete") {
|
|
11459
|
-
delete newState[key];
|
|
11682
|
+
const blocks = body.content.flatMap((block, blockIndex) => {
|
|
11683
|
+
switch (block.type) {
|
|
11684
|
+
case "paragraph": {
|
|
11685
|
+
const inlines = block.children.flatMap((inline, inlineIndex) => {
|
|
11686
|
+
if (isCommentBodyMention(inline)) {
|
|
11687
|
+
return inline.id ? [
|
|
11688
|
+
elements.mention(
|
|
11689
|
+
{
|
|
11690
|
+
element: inline,
|
|
11691
|
+
user: inline.kind === "user" ? resolvedUsers.get(inline.id) : void 0,
|
|
11692
|
+
group: inline.kind === "group" ? resolvedGroupsInfo.get(inline.id) : void 0
|
|
11693
|
+
},
|
|
11694
|
+
inlineIndex
|
|
11695
|
+
)
|
|
11696
|
+
] : [];
|
|
11460
11697
|
}
|
|
11461
|
-
|
|
11462
|
-
|
|
11463
|
-
|
|
11464
|
-
|
|
11465
|
-
|
|
11466
|
-
|
|
11467
|
-
|
|
11468
|
-
|
|
11469
|
-
|
|
11470
|
-
|
|
11471
|
-
for (const listUpdate of update.updates) {
|
|
11472
|
-
if (listUpdate.type === "set") {
|
|
11473
|
-
newState = newState.map(
|
|
11474
|
-
(item, index) => index === listUpdate.index ? lsonToJson(listUpdate.item) : item
|
|
11475
|
-
);
|
|
11476
|
-
} else if (listUpdate.type === "insert") {
|
|
11477
|
-
if (listUpdate.index === newState.length) {
|
|
11478
|
-
newState.push(lsonToJson(listUpdate.item));
|
|
11479
|
-
} else {
|
|
11480
|
-
newState = [
|
|
11481
|
-
...newState.slice(0, listUpdate.index),
|
|
11482
|
-
lsonToJson(listUpdate.item),
|
|
11483
|
-
...newState.slice(listUpdate.index)
|
|
11484
|
-
];
|
|
11485
|
-
}
|
|
11486
|
-
} else if (listUpdate.type === "delete") {
|
|
11487
|
-
newState.splice(listUpdate.index, 1);
|
|
11488
|
-
} else if (listUpdate.type === "move") {
|
|
11489
|
-
if (listUpdate.previousIndex > listUpdate.index) {
|
|
11490
|
-
newState = [
|
|
11491
|
-
...newState.slice(0, listUpdate.index),
|
|
11492
|
-
lsonToJson(listUpdate.item),
|
|
11493
|
-
...newState.slice(listUpdate.index, listUpdate.previousIndex),
|
|
11494
|
-
...newState.slice(listUpdate.previousIndex + 1)
|
|
11495
|
-
];
|
|
11496
|
-
} else {
|
|
11497
|
-
newState = [
|
|
11498
|
-
...newState.slice(0, listUpdate.previousIndex),
|
|
11499
|
-
...newState.slice(
|
|
11500
|
-
listUpdate.previousIndex + 1,
|
|
11501
|
-
listUpdate.index + 1
|
|
11502
|
-
),
|
|
11503
|
-
lsonToJson(listUpdate.item),
|
|
11504
|
-
...newState.slice(listUpdate.index + 1)
|
|
11698
|
+
if (isCommentBodyLink(inline)) {
|
|
11699
|
+
const href = sanitizeUrl(inline.url);
|
|
11700
|
+
if (href === null) {
|
|
11701
|
+
return [
|
|
11702
|
+
elements.text(
|
|
11703
|
+
{
|
|
11704
|
+
element: { text: _nullishCoalesce(inline.text, () => ( inline.url)) }
|
|
11705
|
+
},
|
|
11706
|
+
inlineIndex
|
|
11707
|
+
)
|
|
11505
11708
|
];
|
|
11506
11709
|
}
|
|
11710
|
+
return [
|
|
11711
|
+
elements.link(
|
|
11712
|
+
{
|
|
11713
|
+
element: inline,
|
|
11714
|
+
href
|
|
11715
|
+
},
|
|
11716
|
+
inlineIndex
|
|
11717
|
+
)
|
|
11718
|
+
];
|
|
11507
11719
|
}
|
|
11508
|
-
|
|
11509
|
-
|
|
11510
|
-
}
|
|
11511
|
-
case "LiveMap": {
|
|
11512
|
-
if (!isJsonObject(state)) {
|
|
11513
|
-
throw new Error(
|
|
11514
|
-
"Internal: received update on LiveMap but state was not an object"
|
|
11515
|
-
);
|
|
11516
|
-
}
|
|
11517
|
-
const newState = Object.assign({}, state);
|
|
11518
|
-
for (const key in update.updates) {
|
|
11519
|
-
if (_optionalChain([update, 'access', _278 => _278.updates, 'access', _279 => _279[key], 'optionalAccess', _280 => _280.type]) === "update") {
|
|
11520
|
-
const value = update.node.get(key);
|
|
11521
|
-
if (value !== void 0) {
|
|
11522
|
-
newState[key] = lsonToJson(value);
|
|
11523
|
-
}
|
|
11524
|
-
} else if (_optionalChain([update, 'access', _281 => _281.updates, 'access', _282 => _282[key], 'optionalAccess', _283 => _283.type]) === "delete") {
|
|
11525
|
-
delete newState[key];
|
|
11720
|
+
if (isCommentBodyText(inline)) {
|
|
11721
|
+
return [elements.text({ element: inline }, inlineIndex)];
|
|
11526
11722
|
}
|
|
11527
|
-
|
|
11528
|
-
|
|
11723
|
+
return [];
|
|
11724
|
+
});
|
|
11725
|
+
return [
|
|
11726
|
+
elements.paragraph(
|
|
11727
|
+
{ element: block, children: inlines.join("") },
|
|
11728
|
+
blockIndex
|
|
11729
|
+
)
|
|
11730
|
+
];
|
|
11529
11731
|
}
|
|
11732
|
+
default:
|
|
11733
|
+
return [];
|
|
11530
11734
|
}
|
|
11531
|
-
}
|
|
11532
|
-
|
|
11533
|
-
|
|
11534
|
-
|
|
11535
|
-
|
|
11536
|
-
|
|
11537
|
-
|
|
11538
|
-
|
|
11539
|
-
|
|
11540
|
-
|
|
11541
|
-
|
|
11542
|
-
|
|
11543
|
-
|
|
11544
|
-
|
|
11545
|
-
|
|
11546
|
-
|
|
11547
|
-
|
|
11548
|
-
|
|
11549
|
-
|
|
11550
|
-
|
|
11735
|
+
});
|
|
11736
|
+
return blocks.join(separator);
|
|
11737
|
+
}
|
|
11738
|
+
|
|
11739
|
+
// src/crdts/utils.ts
|
|
11740
|
+
function toPlainLson(lson) {
|
|
11741
|
+
if (lson instanceof LiveObject) {
|
|
11742
|
+
return {
|
|
11743
|
+
liveblocksType: "LiveObject",
|
|
11744
|
+
data: Object.fromEntries(
|
|
11745
|
+
Object.entries(lson.toObject()).flatMap(
|
|
11746
|
+
([key, value]) => value !== void 0 ? [[key, toPlainLson(value)]] : []
|
|
11747
|
+
)
|
|
11748
|
+
)
|
|
11749
|
+
};
|
|
11750
|
+
} else if (lson instanceof LiveMap) {
|
|
11751
|
+
return {
|
|
11752
|
+
liveblocksType: "LiveMap",
|
|
11753
|
+
data: Object.fromEntries(
|
|
11754
|
+
[...lson].map(([key, value]) => [key, toPlainLson(value)])
|
|
11755
|
+
)
|
|
11756
|
+
};
|
|
11757
|
+
} else if (lson instanceof LiveList) {
|
|
11758
|
+
return {
|
|
11759
|
+
liveblocksType: "LiveList",
|
|
11760
|
+
data: [...lson].map((item) => toPlainLson(item))
|
|
11761
|
+
};
|
|
11551
11762
|
} else {
|
|
11552
|
-
return
|
|
11763
|
+
return lson;
|
|
11553
11764
|
}
|
|
11554
11765
|
}
|
|
11555
11766
|
|
|
@@ -11601,9 +11812,9 @@ function makePoller(callback, intervalMs, options) {
|
|
|
11601
11812
|
const startTime = performance.now();
|
|
11602
11813
|
const doc = typeof document !== "undefined" ? document : void 0;
|
|
11603
11814
|
const win = typeof window !== "undefined" ? window : void 0;
|
|
11604
|
-
const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess',
|
|
11815
|
+
const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _291 => _291.maxStaleTimeMs]), () => ( Number.POSITIVE_INFINITY));
|
|
11605
11816
|
const context = {
|
|
11606
|
-
inForeground: _optionalChain([doc, 'optionalAccess',
|
|
11817
|
+
inForeground: _optionalChain([doc, 'optionalAccess', _292 => _292.visibilityState]) !== "hidden",
|
|
11607
11818
|
lastSuccessfulPollAt: startTime,
|
|
11608
11819
|
count: 0,
|
|
11609
11820
|
backoff: 0
|
|
@@ -11684,11 +11895,11 @@ function makePoller(callback, intervalMs, options) {
|
|
|
11684
11895
|
pollNowIfStale();
|
|
11685
11896
|
}
|
|
11686
11897
|
function onVisibilityChange() {
|
|
11687
|
-
setInForeground(_optionalChain([doc, 'optionalAccess',
|
|
11898
|
+
setInForeground(_optionalChain([doc, 'optionalAccess', _293 => _293.visibilityState]) !== "hidden");
|
|
11688
11899
|
}
|
|
11689
|
-
_optionalChain([doc, 'optionalAccess',
|
|
11690
|
-
_optionalChain([win, 'optionalAccess',
|
|
11691
|
-
_optionalChain([win, 'optionalAccess',
|
|
11900
|
+
_optionalChain([doc, 'optionalAccess', _294 => _294.addEventListener, 'call', _295 => _295("visibilitychange", onVisibilityChange)]);
|
|
11901
|
+
_optionalChain([win, 'optionalAccess', _296 => _296.addEventListener, 'call', _297 => _297("online", onVisibilityChange)]);
|
|
11902
|
+
_optionalChain([win, 'optionalAccess', _298 => _298.addEventListener, 'call', _299 => _299("focus", pollNowIfStale)]);
|
|
11692
11903
|
fsm.start();
|
|
11693
11904
|
return {
|
|
11694
11905
|
inc,
|
|
@@ -11827,5 +12038,6 @@ detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
|
|
|
11827
12038
|
|
|
11828
12039
|
|
|
11829
12040
|
|
|
11830
|
-
|
|
12041
|
+
|
|
12042
|
+
exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.deepLiveifyObject = deepLiveifyObject; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.legacy_patchImmutableObject = legacy_patchImmutableObject; exports.legacy_patchLiveObjectKey = legacy_patchLiveObjectKey; exports.lsonToJson = lsonToJson; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
|
|
11831
12043
|
//# sourceMappingURL=index.cjs.map
|