Compare commits
1 Commits
v13.0.0-54
...
v13.0.0-48
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e486d4f46 |
13
README.md
13
README.md
@@ -64,19 +64,6 @@ missing modules.
|
|||||||
<script src="./bower_components/yjs/y.js"></script>
|
<script src="./bower_components/yjs/y.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
### CDN
|
|
||||||
```
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/yjs@12/src/y.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-array@10/dist/y-array.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-websockets-client@8/dist/y-websockets-client.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-memory@8/dist/y-memory.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-array@10/dist/y-array.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-map@10/dist/y-map.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/y-text@9/dist/y-text.js"></script>
|
|
||||||
// ..
|
|
||||||
// do the same for all modules you want to use
|
|
||||||
```
|
|
||||||
|
|
||||||
### Npm
|
### Npm
|
||||||
```
|
```
|
||||||
npm install --save yjs % add all y-* modules you want to use
|
npm install --save yjs % add all y-* modules you want to use
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ window.undoManager = new Y.utils.UndoManager(window.yXmlType, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
document.onkeydown = function interceptUndoRedo (e) {
|
document.onkeydown = function interceptUndoRedo (e) {
|
||||||
if (e.keyCode === 90 && (e.metaKey || e.ctrlKey)) {
|
if (e.keyCode === 90 && e.metaKey) {
|
||||||
if (!e.shiftKey) {
|
if (!e.shiftKey) {
|
||||||
window.undoManager.undo()
|
window.undoManager.undo()
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
914
package-lock.json
generated
914
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "yjs",
|
"name": "yjs",
|
||||||
"version": "13.0.0-54",
|
"version": "13.0.0-48",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1039,7 +1039,6 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"anymatch": "1.3.0",
|
"anymatch": "1.3.0",
|
||||||
"async-each": "1.0.1",
|
"async-each": "1.0.1",
|
||||||
"fsevents": "1.1.3",
|
|
||||||
"glob-parent": "2.0.0",
|
"glob-parent": "2.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "2.0.3",
|
||||||
"is-binary-path": "1.0.1",
|
"is-binary-path": "1.0.1",
|
||||||
@@ -1991,910 +1990,6 @@
|
|||||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"fsevents": {
|
|
||||||
"version": "1.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
|
|
||||||
"integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"nan": "2.8.0",
|
|
||||||
"node-pre-gyp": "0.6.39"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"abbrev": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"ajv": {
|
|
||||||
"version": "4.11.8",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"co": "4.6.0",
|
|
||||||
"json-stable-stringify": "1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ansi-regex": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"aproba": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"are-we-there-yet": {
|
|
||||||
"version": "1.1.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"delegates": "1.0.0",
|
|
||||||
"readable-stream": "2.2.9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"asn1": {
|
|
||||||
"version": "0.2.3",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "0.2.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"asynckit": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"aws-sign2": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"aws4": {
|
|
||||||
"version": "1.6.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"balanced-match": {
|
|
||||||
"version": "0.4.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"bcrypt-pbkdf": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"tweetnacl": "0.14.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"block-stream": {
|
|
||||||
"version": "0.0.9",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"inherits": "2.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"boom": {
|
|
||||||
"version": "2.10.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"hoek": "2.16.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"brace-expansion": {
|
|
||||||
"version": "1.1.7",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"balanced-match": "0.4.2",
|
|
||||||
"concat-map": "0.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"buffer-shims": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"caseless": {
|
|
||||||
"version": "0.12.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"co": {
|
|
||||||
"version": "4.6.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"code-point-at": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"combined-stream": {
|
|
||||||
"version": "1.0.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"delayed-stream": "1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"concat-map": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"console-control-strings": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"core-util-is": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"cryptiles": {
|
|
||||||
"version": "2.0.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"boom": "2.10.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dashdash": {
|
|
||||||
"version": "1.14.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"assert-plus": "1.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"debug": {
|
|
||||||
"version": "2.6.8",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"ms": "2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"deep-extend": {
|
|
||||||
"version": "0.4.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"delayed-stream": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"delegates": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"detect-libc": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"ecc-jsbn": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"jsbn": "0.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"extend": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"extsprintf": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"forever-agent": {
|
|
||||||
"version": "0.6.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"form-data": {
|
|
||||||
"version": "2.1.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"asynckit": "0.4.0",
|
|
||||||
"combined-stream": "1.0.5",
|
|
||||||
"mime-types": "2.1.15"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fs.realpath": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"fstream": {
|
|
||||||
"version": "1.0.11",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"graceful-fs": "4.1.11",
|
|
||||||
"inherits": "2.0.3",
|
|
||||||
"mkdirp": "0.5.1",
|
|
||||||
"rimraf": "2.6.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fstream-ignore": {
|
|
||||||
"version": "1.0.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"fstream": "1.0.11",
|
|
||||||
"inherits": "2.0.3",
|
|
||||||
"minimatch": "3.0.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gauge": {
|
|
||||||
"version": "2.7.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"aproba": "1.1.1",
|
|
||||||
"console-control-strings": "1.1.0",
|
|
||||||
"has-unicode": "2.0.1",
|
|
||||||
"object-assign": "4.1.1",
|
|
||||||
"signal-exit": "3.0.2",
|
|
||||||
"string-width": "1.0.2",
|
|
||||||
"strip-ansi": "3.0.1",
|
|
||||||
"wide-align": "1.1.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"getpass": {
|
|
||||||
"version": "0.1.7",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"assert-plus": "1.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"glob": {
|
|
||||||
"version": "7.1.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"fs.realpath": "1.0.0",
|
|
||||||
"inflight": "1.0.6",
|
|
||||||
"inherits": "2.0.3",
|
|
||||||
"minimatch": "3.0.4",
|
|
||||||
"once": "1.4.0",
|
|
||||||
"path-is-absolute": "1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"graceful-fs": {
|
|
||||||
"version": "4.1.11",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"har-schema": {
|
|
||||||
"version": "1.0.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"har-validator": {
|
|
||||||
"version": "4.2.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"ajv": "4.11.8",
|
|
||||||
"har-schema": "1.0.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"has-unicode": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"hawk": {
|
|
||||||
"version": "3.1.3",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"boom": "2.10.1",
|
|
||||||
"cryptiles": "2.0.5",
|
|
||||||
"hoek": "2.16.3",
|
|
||||||
"sntp": "1.0.9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hoek": {
|
|
||||||
"version": "2.16.3",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"http-signature": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"assert-plus": "0.2.0",
|
|
||||||
"jsprim": "1.4.0",
|
|
||||||
"sshpk": "1.13.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inflight": {
|
|
||||||
"version": "1.0.6",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"once": "1.4.0",
|
|
||||||
"wrappy": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inherits": {
|
|
||||||
"version": "2.0.3",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"ini": {
|
|
||||||
"version": "1.3.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"is-fullwidth-code-point": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"number-is-nan": "1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"is-typedarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"isarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"isstream": {
|
|
||||||
"version": "0.1.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"jodid25519": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"jsbn": "0.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"jsbn": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"json-schema": {
|
|
||||||
"version": "0.2.3",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"json-stable-stringify": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"jsonify": "0.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"json-stringify-safe": {
|
|
||||||
"version": "5.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"jsonify": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"jsprim": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"assert-plus": "1.0.0",
|
|
||||||
"extsprintf": "1.0.2",
|
|
||||||
"json-schema": "0.2.3",
|
|
||||||
"verror": "1.3.6"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mime-db": {
|
|
||||||
"version": "1.27.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"mime-types": {
|
|
||||||
"version": "2.1.15",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"mime-db": "1.27.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minimatch": {
|
|
||||||
"version": "3.0.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"brace-expansion": "1.1.7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minimist": {
|
|
||||||
"version": "0.0.8",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"mkdirp": {
|
|
||||||
"version": "0.5.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"minimist": "0.0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ms": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"node-pre-gyp": {
|
|
||||||
"version": "0.6.39",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"detect-libc": "1.0.2",
|
|
||||||
"hawk": "3.1.3",
|
|
||||||
"mkdirp": "0.5.1",
|
|
||||||
"nopt": "4.0.1",
|
|
||||||
"npmlog": "4.1.0",
|
|
||||||
"rc": "1.2.1",
|
|
||||||
"request": "2.81.0",
|
|
||||||
"rimraf": "2.6.1",
|
|
||||||
"semver": "5.3.0",
|
|
||||||
"tar": "2.2.1",
|
|
||||||
"tar-pack": "3.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nopt": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"abbrev": "1.1.0",
|
|
||||||
"osenv": "0.1.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"npmlog": {
|
|
||||||
"version": "4.1.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"are-we-there-yet": "1.1.4",
|
|
||||||
"console-control-strings": "1.1.0",
|
|
||||||
"gauge": "2.7.4",
|
|
||||||
"set-blocking": "2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"number-is-nan": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"oauth-sign": {
|
|
||||||
"version": "0.8.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"object-assign": {
|
|
||||||
"version": "4.1.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"once": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"wrappy": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"os-homedir": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"os-tmpdir": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"osenv": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"os-homedir": "1.0.2",
|
|
||||||
"os-tmpdir": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path-is-absolute": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"performance-now": {
|
|
||||||
"version": "0.2.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"process-nextick-args": {
|
|
||||||
"version": "1.0.7",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"punycode": {
|
|
||||||
"version": "1.4.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"qs": {
|
|
||||||
"version": "6.4.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"rc": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"deep-extend": "0.4.2",
|
|
||||||
"ini": "1.3.4",
|
|
||||||
"minimist": "1.2.0",
|
|
||||||
"strip-json-comments": "2.0.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"minimist": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"readable-stream": {
|
|
||||||
"version": "2.2.9",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"buffer-shims": "1.0.0",
|
|
||||||
"core-util-is": "1.0.2",
|
|
||||||
"inherits": "2.0.3",
|
|
||||||
"isarray": "1.0.0",
|
|
||||||
"process-nextick-args": "1.0.7",
|
|
||||||
"string_decoder": "1.0.1",
|
|
||||||
"util-deprecate": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"request": {
|
|
||||||
"version": "2.81.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"aws-sign2": "0.6.0",
|
|
||||||
"aws4": "1.6.0",
|
|
||||||
"caseless": "0.12.0",
|
|
||||||
"combined-stream": "1.0.5",
|
|
||||||
"extend": "3.0.1",
|
|
||||||
"forever-agent": "0.6.1",
|
|
||||||
"form-data": "2.1.4",
|
|
||||||
"har-validator": "4.2.1",
|
|
||||||
"hawk": "3.1.3",
|
|
||||||
"http-signature": "1.1.1",
|
|
||||||
"is-typedarray": "1.0.0",
|
|
||||||
"isstream": "0.1.2",
|
|
||||||
"json-stringify-safe": "5.0.1",
|
|
||||||
"mime-types": "2.1.15",
|
|
||||||
"oauth-sign": "0.8.2",
|
|
||||||
"performance-now": "0.2.0",
|
|
||||||
"qs": "6.4.0",
|
|
||||||
"safe-buffer": "5.0.1",
|
|
||||||
"stringstream": "0.0.5",
|
|
||||||
"tough-cookie": "2.3.2",
|
|
||||||
"tunnel-agent": "0.6.0",
|
|
||||||
"uuid": "3.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rimraf": {
|
|
||||||
"version": "2.6.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"glob": "7.1.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"safe-buffer": {
|
|
||||||
"version": "5.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"semver": {
|
|
||||||
"version": "5.3.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"set-blocking": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"signal-exit": {
|
|
||||||
"version": "3.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"sntp": {
|
|
||||||
"version": "1.0.9",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"hoek": "2.16.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sshpk": {
|
|
||||||
"version": "1.13.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"asn1": "0.2.3",
|
|
||||||
"assert-plus": "1.0.0",
|
|
||||||
"bcrypt-pbkdf": "1.0.1",
|
|
||||||
"dashdash": "1.14.1",
|
|
||||||
"ecc-jsbn": "0.1.1",
|
|
||||||
"getpass": "0.1.7",
|
|
||||||
"jodid25519": "1.0.2",
|
|
||||||
"jsbn": "0.1.1",
|
|
||||||
"tweetnacl": "0.14.5"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"string-width": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"code-point-at": "1.1.0",
|
|
||||||
"is-fullwidth-code-point": "1.0.0",
|
|
||||||
"strip-ansi": "3.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "5.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"stringstream": {
|
|
||||||
"version": "0.0.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"strip-ansi": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ansi-regex": "2.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-json-comments": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"tar": {
|
|
||||||
"version": "2.2.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"block-stream": "0.0.9",
|
|
||||||
"fstream": "1.0.11",
|
|
||||||
"inherits": "2.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tar-pack": {
|
|
||||||
"version": "3.4.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"debug": "2.6.8",
|
|
||||||
"fstream": "1.0.11",
|
|
||||||
"fstream-ignore": "1.0.5",
|
|
||||||
"once": "1.4.0",
|
|
||||||
"readable-stream": "2.2.9",
|
|
||||||
"rimraf": "2.6.1",
|
|
||||||
"tar": "2.2.1",
|
|
||||||
"uid-number": "0.0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tough-cookie": {
|
|
||||||
"version": "2.3.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"punycode": "1.4.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tunnel-agent": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "5.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tweetnacl": {
|
|
||||||
"version": "0.14.5",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"uid-number": {
|
|
||||||
"version": "0.0.6",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"util-deprecate": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"uuid": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"verror": {
|
|
||||||
"version": "1.3.6",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"extsprintf": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"wide-align": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
|
||||||
"string-width": "1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"wrappy": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"bundled": true,
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"function-bind": {
|
"function-bind": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
|
||||||
@@ -3843,13 +2938,6 @@
|
|||||||
"integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
|
"integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"nan": {
|
|
||||||
"version": "2.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
|
|
||||||
"integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"natural-compare": {
|
"natural-compare": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "yjs",
|
"name": "yjs",
|
||||||
"version": "13.0.0-54",
|
"version": "13.0.0-48",
|
||||||
"description": "A framework for real-time p2p shared editing on any data",
|
"description": "A framework for real-time p2p shared editing on any data",
|
||||||
"main": "./y.node.js",
|
"main": "./y.node.js",
|
||||||
"browser": "./y.js",
|
"browser": "./y.js",
|
||||||
|
|||||||
@@ -4,10 +4,8 @@ import { readDeleteSet, writeDeleteSet } from './deleteSet.js'
|
|||||||
import BinaryEncoder from '../Binary/Encoder.js'
|
import BinaryEncoder from '../Binary/Encoder.js'
|
||||||
|
|
||||||
export function fromBinary (y, decoder) {
|
export function fromBinary (y, decoder) {
|
||||||
y.transact(function () {
|
integrateRemoteStructs(y, decoder)
|
||||||
integrateRemoteStructs(y, decoder)
|
readDeleteSet(y, decoder)
|
||||||
readDeleteSet(y, decoder)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function toBinary (y) {
|
export function toBinary (y) {
|
||||||
|
|||||||
@@ -17,13 +17,13 @@ export default class AbstractPersistence {
|
|||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
this.opts = opts
|
this.opts = opts
|
||||||
this.ys = new Map()
|
this.ys = new Map()
|
||||||
|
this.mutualExclude = createMutualExclude()
|
||||||
}
|
}
|
||||||
|
|
||||||
_init (y) {
|
_init (y) {
|
||||||
let cnf = this.ys.get(y)
|
let cnf = this.ys.get(y)
|
||||||
if (cnf === undefined) {
|
if (cnf === undefined) {
|
||||||
cnf = getFreshCnf()
|
cnf = getFreshCnf()
|
||||||
cnf.mutualExclude = createMutualExclude()
|
|
||||||
this.ys.set(y, cnf)
|
this.ys.set(y, cnf)
|
||||||
return this.init(y).then(() => {
|
return this.init(y).then(() => {
|
||||||
y.on('afterTransaction', (y, transaction) => {
|
y.on('afterTransaction', (y, transaction) => {
|
||||||
@@ -85,7 +85,7 @@ export default class AbstractPersistence {
|
|||||||
saveStruct (y, struct) {
|
saveStruct (y, struct) {
|
||||||
let cnf = this.ys.get(y)
|
let cnf = this.ys.get(y)
|
||||||
if (cnf !== undefined) {
|
if (cnf !== undefined) {
|
||||||
cnf.mutualExclude(function () {
|
this.mutualExclude(function () {
|
||||||
struct._toBinary(cnf.buffer)
|
struct._toBinary(cnf.buffer)
|
||||||
cnf.len++
|
cnf.len++
|
||||||
})
|
})
|
||||||
@@ -94,22 +94,19 @@ export default class AbstractPersistence {
|
|||||||
|
|
||||||
/* overwrite */
|
/* overwrite */
|
||||||
retrieve (y, model, updates) {
|
retrieve (y, model, updates) {
|
||||||
let cnf = this.ys.get(y)
|
this.mutualExclude(function () {
|
||||||
if (cnf !== undefined) {
|
y.transact(function () {
|
||||||
cnf.mutualExclude(function () {
|
if (model != null) {
|
||||||
y.transact(function () {
|
fromBinary(y, new BinaryDecoder(new Uint8Array(model)))
|
||||||
if (model != null) {
|
}
|
||||||
fromBinary(y, new BinaryDecoder(new Uint8Array(model)))
|
if (updates != null) {
|
||||||
|
for (let i = 0; i < updates.length; i++) {
|
||||||
|
integrateRemoteStructs(y, new BinaryDecoder(new Uint8Array(updates[i])))
|
||||||
}
|
}
|
||||||
if (updates != null) {
|
}
|
||||||
for (let i = 0; i < updates.length; i++) {
|
|
||||||
integrateRemoteStructs(y, new BinaryDecoder(new Uint8Array(updates[i])))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
y.emit('persistenceReady')
|
|
||||||
})
|
})
|
||||||
}
|
y.emit('persistenceReady')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* overwrite */
|
/* overwrite */
|
||||||
|
|||||||
@@ -51,57 +51,20 @@ export default class Item {
|
|||||||
this._parent = null
|
this._parent = null
|
||||||
this._parentSub = null
|
this._parentSub = null
|
||||||
this._deleted = false
|
this._deleted = false
|
||||||
this._redone = null
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Create a operation with the same effect (without position effect)
|
* Copy the effect of struct
|
||||||
*/
|
*/
|
||||||
_copy () {
|
_copy () {
|
||||||
return new this.constructor()
|
let struct = new this.constructor()
|
||||||
}
|
struct._origin = this._left
|
||||||
/**
|
struct._left = this._left
|
||||||
* Redo the effect of this operation.
|
struct._right = this
|
||||||
*/
|
struct._right_origin = this
|
||||||
_redo (y) {
|
struct._parent = this._parent
|
||||||
if (this._redone !== null) {
|
|
||||||
return this._redone
|
|
||||||
}
|
|
||||||
let struct = this._copy()
|
|
||||||
let left = this._left
|
|
||||||
let right = this
|
|
||||||
let parent = this._parent
|
|
||||||
// make sure that parent is redone
|
|
||||||
if (parent._deleted === true && parent._redone === null) {
|
|
||||||
parent._redo(y)
|
|
||||||
}
|
|
||||||
if (parent._redone !== null) {
|
|
||||||
parent = parent._redone
|
|
||||||
// find next cloned items
|
|
||||||
while (left !== null) {
|
|
||||||
if (left._redone !== null && left._redone._parent === parent) {
|
|
||||||
left = left._redone
|
|
||||||
break
|
|
||||||
}
|
|
||||||
left = left._left
|
|
||||||
}
|
|
||||||
while (right !== null) {
|
|
||||||
if (right._redone !== null && right._redone._parent === parent) {
|
|
||||||
right = right._redone
|
|
||||||
}
|
|
||||||
right = right._right
|
|
||||||
}
|
|
||||||
}
|
|
||||||
struct._origin = left
|
|
||||||
struct._left = left
|
|
||||||
struct._right = right
|
|
||||||
struct._right_origin = right
|
|
||||||
struct._parent = parent
|
|
||||||
struct._parentSub = this._parentSub
|
struct._parentSub = this._parentSub
|
||||||
struct._integrate(y)
|
|
||||||
this._redone = struct
|
|
||||||
return struct
|
return struct
|
||||||
}
|
}
|
||||||
|
|
||||||
get _lastId () {
|
get _lastId () {
|
||||||
return new ID(this._id.user, this._id.clock + this._length - 1)
|
return new ID(this._id.user, this._id.clock + this._length - 1)
|
||||||
}
|
}
|
||||||
@@ -127,15 +90,11 @@ export default class Item {
|
|||||||
if (!this._deleted) {
|
if (!this._deleted) {
|
||||||
this._deleted = true
|
this._deleted = true
|
||||||
y.ds.markDeleted(this._id, this._length)
|
y.ds.markDeleted(this._id, this._length)
|
||||||
let del = new Delete()
|
|
||||||
del._targetID = this._id
|
|
||||||
del._length = this._length
|
|
||||||
if (createDelete) {
|
if (createDelete) {
|
||||||
// broadcast and persists Delete
|
let del = new Delete()
|
||||||
|
del._targetID = this._id
|
||||||
|
del._length = this._length
|
||||||
del._integrate(y, true)
|
del._integrate(y, true)
|
||||||
} else if (y.persistence !== null) {
|
|
||||||
// only persist Delete
|
|
||||||
y.persistence.saveStruct(y, del)
|
|
||||||
}
|
}
|
||||||
transactionTypeChanged(y, this._parent, this._parentSub)
|
transactionTypeChanged(y, this._parent, this._parentSub)
|
||||||
y._transaction.deletedStructs.add(this)
|
y._transaction.deletedStructs.add(this)
|
||||||
|
|||||||
@@ -79,6 +79,39 @@ export default class Type extends Item {
|
|||||||
type = type._parent
|
type = type._parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_copy (undeleteChildren) {
|
||||||
|
let copy = super._copy()
|
||||||
|
let map = new Map()
|
||||||
|
copy._map = map
|
||||||
|
for (let [key, value] of this._map) {
|
||||||
|
if (undeleteChildren.has(value) || !value.deleted) {
|
||||||
|
let _item = value._copy(undeleteChildren)
|
||||||
|
_item._parent = copy
|
||||||
|
map.set(key, value._copy(undeleteChildren))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let prevUndeleted = null
|
||||||
|
copy._start = null
|
||||||
|
let item = this._start
|
||||||
|
while (item !== null) {
|
||||||
|
if (undeleteChildren.has(item) || !item.deleted) {
|
||||||
|
let _item = item._copy(undeleteChildren)
|
||||||
|
_item._left = prevUndeleted
|
||||||
|
_item._origin = prevUndeleted
|
||||||
|
_item._right = null
|
||||||
|
_item._right_origin = null
|
||||||
|
_item._parent = copy
|
||||||
|
if (prevUndeleted === null) {
|
||||||
|
copy._start = _item
|
||||||
|
} else {
|
||||||
|
prevUndeleted._right = _item
|
||||||
|
}
|
||||||
|
prevUndeleted = _item
|
||||||
|
}
|
||||||
|
item = item._right
|
||||||
|
}
|
||||||
|
return copy
|
||||||
|
}
|
||||||
_transact (f) {
|
_transact (f) {
|
||||||
const y = this._y
|
const y = this._y
|
||||||
if (y !== null) {
|
if (y !== null) {
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ export default class YXmlElement extends YXmlFragment {
|
|||||||
this._domFilter = arg2
|
this._domFilter = arg2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_copy () {
|
_copy (undeleteChildren) {
|
||||||
let struct = super._copy()
|
let struct = super._copy(undeleteChildren)
|
||||||
struct.nodeName = this.nodeName
|
struct.nodeName = this.nodeName
|
||||||
return struct
|
return struct
|
||||||
}
|
}
|
||||||
@@ -36,8 +36,7 @@ export default class YXmlElement extends YXmlFragment {
|
|||||||
let attributes = new Map()
|
let attributes = new Map()
|
||||||
for (let i = 0; i < dom.attributes.length; i++) {
|
for (let i = 0; i < dom.attributes.length; i++) {
|
||||||
let attr = dom.attributes[i]
|
let attr = dom.attributes[i]
|
||||||
// get attribute via getAttribute for custom element support (some write something different in attr.value)
|
attributes.set(attr.name, attr.value)
|
||||||
attributes.set(attr.name, dom.getAttribute(attr.name))
|
|
||||||
}
|
}
|
||||||
attributes = this._domFilter(dom, attributes)
|
attributes = this._domFilter(dom, attributes)
|
||||||
attributes.forEach((value, name) => {
|
attributes.forEach((value, name) => {
|
||||||
|
|||||||
@@ -152,20 +152,18 @@ export default class YXmlFragment extends YArray {
|
|||||||
attributes.set(key, attrs[key])
|
attributes.set(key, attrs[key])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this._y.transact(() => {
|
let result = this._domFilter(this.nodeName, new Map(attributes))
|
||||||
let result = this._domFilter(this.nodeName, new Map(attributes))
|
if (result === null) {
|
||||||
if (result === null) {
|
this._delete(this._y)
|
||||||
this._delete(this._y)
|
} else {
|
||||||
} else {
|
attributes.forEach((value, key) => {
|
||||||
attributes.forEach((value, key) => {
|
if (!result.has(key)) {
|
||||||
if (!result.has(key)) {
|
this.removeAttribute(key)
|
||||||
this.removeAttribute(key)
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.forEach(xml => {
|
|
||||||
xml.setDomFilter(f)
|
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
this.forEach(xml => {
|
||||||
|
xml.setDomFilter(f)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
_callObserver (transaction, parentSubs, remote) {
|
_callObserver (transaction, parentSubs, remote) {
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ export default class YXmlHook extends YMap {
|
|||||||
getHook(hookName).fillType(dom, this)
|
getHook(hookName).fillType(dom, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_copy () {
|
|
||||||
const struct = super._copy()
|
|
||||||
struct.hookName = this.hookName
|
|
||||||
return struct
|
|
||||||
}
|
|
||||||
getDom (_document) {
|
getDom (_document) {
|
||||||
_document = _document || document
|
_document = _document || document
|
||||||
if (this._dom === null) {
|
if (this._dom === null) {
|
||||||
|
|||||||
@@ -4,12 +4,11 @@ class ReverseOperation {
|
|||||||
constructor (y, transaction) {
|
constructor (y, transaction) {
|
||||||
this.created = new Date()
|
this.created = new Date()
|
||||||
const beforeState = transaction.beforeState
|
const beforeState = transaction.beforeState
|
||||||
|
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1)
|
||||||
if (beforeState.has(y.userID)) {
|
if (beforeState.has(y.userID)) {
|
||||||
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1)
|
|
||||||
this.fromState = new ID(y.userID, beforeState.get(y.userID))
|
this.fromState = new ID(y.userID, beforeState.get(y.userID))
|
||||||
} else {
|
} else {
|
||||||
this.toState = null
|
this.fromState = this.toState
|
||||||
this.fromState = null
|
|
||||||
}
|
}
|
||||||
this.deletedStructs = transaction.deletedStructs
|
this.deletedStructs = transaction.deletedStructs
|
||||||
}
|
}
|
||||||
@@ -31,32 +30,28 @@ function applyReverseOperation (y, scope, reverseBuffer) {
|
|||||||
while (!performedUndo && reverseBuffer.length > 0) {
|
while (!performedUndo && reverseBuffer.length > 0) {
|
||||||
let undoOp = reverseBuffer.pop()
|
let undoOp = reverseBuffer.pop()
|
||||||
// make sure that it is possible to iterate {from}-{to}
|
// make sure that it is possible to iterate {from}-{to}
|
||||||
if (undoOp.fromState !== null) {
|
y.os.getItemCleanStart(undoOp.fromState)
|
||||||
y.os.getItemCleanStart(undoOp.fromState)
|
y.os.getItemCleanEnd(undoOp.toState)
|
||||||
y.os.getItemCleanEnd(undoOp.toState)
|
y.os.iterate(undoOp.fromState, undoOp.toState, op => {
|
||||||
y.os.iterate(undoOp.fromState, undoOp.toState, op => {
|
if (!op._deleted && isStructInScope(y, op, scope)) {
|
||||||
while (op._deleted && op._redone !== null) {
|
performedUndo = true
|
||||||
op = op._redone
|
op._delete(y)
|
||||||
}
|
}
|
||||||
if (op._deleted === false && isStructInScope(y, op, scope)) {
|
})
|
||||||
performedUndo = true
|
|
||||||
op._delete(y)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
for (let op of undoOp.deletedStructs) {
|
for (let op of undoOp.deletedStructs) {
|
||||||
if (
|
if (
|
||||||
isStructInScope(y, op, scope) &&
|
isStructInScope(y, op, scope) &&
|
||||||
op._parent !== y &&
|
op._parent !== y &&
|
||||||
|
!op._parent._deleted &&
|
||||||
(
|
(
|
||||||
op._id.user !== y.userID ||
|
op._parent._id.user !== y.userID ||
|
||||||
undoOp.fromState === null ||
|
op._parent._id.clock < undoOp.fromState.clock ||
|
||||||
op._id.clock < undoOp.fromState.clock ||
|
op._parent._id.clock > undoOp.fromState.clock
|
||||||
op._id.clock > undoOp.toState.clock
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
performedUndo = true
|
performedUndo = true
|
||||||
op._redo(y)
|
op = op._copy(undoOp.deletedStructs)
|
||||||
|
op._integrate(y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,7 +68,6 @@ export default class UndoManager {
|
|||||||
this._scope = scope
|
this._scope = scope
|
||||||
this._undoing = false
|
this._undoing = false
|
||||||
this._redoing = false
|
this._redoing = false
|
||||||
this._lastTransactionWasUndo = false
|
|
||||||
const y = scope._y
|
const y = scope._y
|
||||||
this.y = y
|
this.y = y
|
||||||
y.on('afterTransaction', (y, transaction, remote) => {
|
y.on('afterTransaction', (y, transaction, remote) => {
|
||||||
@@ -81,29 +75,17 @@ export default class UndoManager {
|
|||||||
let reverseOperation = new ReverseOperation(y, transaction)
|
let reverseOperation = new ReverseOperation(y, transaction)
|
||||||
if (!this._undoing) {
|
if (!this._undoing) {
|
||||||
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null
|
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null
|
||||||
if (
|
if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
|
||||||
this._redoing === false &&
|
|
||||||
this._lastTransactionWasUndo === false &&
|
|
||||||
lastUndoOp !== null &&
|
|
||||||
reverseOperation.created - lastUndoOp.created <= options.captureTimeout
|
|
||||||
) {
|
|
||||||
lastUndoOp.created = reverseOperation.created
|
lastUndoOp.created = reverseOperation.created
|
||||||
if (reverseOperation.toState !== null) {
|
lastUndoOp.toState = reverseOperation.toState
|
||||||
lastUndoOp.toState = reverseOperation.toState
|
|
||||||
if (lastUndoOp.fromState === null) {
|
|
||||||
lastUndoOp.fromState = reverseOperation.fromState
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs)
|
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs)
|
||||||
} else {
|
} else {
|
||||||
this._lastTransactionWasUndo = false
|
|
||||||
this._undoBuffer.push(reverseOperation)
|
this._undoBuffer.push(reverseOperation)
|
||||||
}
|
}
|
||||||
if (!this._redoing) {
|
if (!this._redoing) {
|
||||||
this._redoBuffer = []
|
this._redoBuffer = []
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this._lastTransactionWasUndo = true
|
|
||||||
this._redoBuffer.push(reverseOperation)
|
this._redoBuffer.push(reverseOperation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
221
y.node.js
221
y.node.js
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* yjs - A framework for real-time p2p shared editing on any data
|
* yjs - A framework for real-time p2p shared editing on any data
|
||||||
* @version v13.0.0-54
|
* @version v13.0.0-48
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -1340,57 +1340,20 @@ class Item {
|
|||||||
this._parent = null;
|
this._parent = null;
|
||||||
this._parentSub = null;
|
this._parentSub = null;
|
||||||
this._deleted = false;
|
this._deleted = false;
|
||||||
this._redone = null;
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Create a operation with the same effect (without position effect)
|
* Copy the effect of struct
|
||||||
*/
|
*/
|
||||||
_copy () {
|
_copy () {
|
||||||
return new this.constructor()
|
let struct = new this.constructor();
|
||||||
}
|
struct._origin = this._left;
|
||||||
/**
|
struct._left = this._left;
|
||||||
* Redo the effect of this operation.
|
struct._right = this;
|
||||||
*/
|
struct._right_origin = this;
|
||||||
_redo (y) {
|
struct._parent = this._parent;
|
||||||
if (this._redone !== null) {
|
|
||||||
return this._redone
|
|
||||||
}
|
|
||||||
let struct = this._copy();
|
|
||||||
let left = this._left;
|
|
||||||
let right = this;
|
|
||||||
let parent = this._parent;
|
|
||||||
// make sure that parent is redone
|
|
||||||
if (parent._deleted === true && parent._redone === null) {
|
|
||||||
parent._redo(y);
|
|
||||||
}
|
|
||||||
if (parent._redone !== null) {
|
|
||||||
parent = parent._redone;
|
|
||||||
// find next cloned items
|
|
||||||
while (left !== null) {
|
|
||||||
if (left._redone !== null && left._redone._parent === parent) {
|
|
||||||
left = left._redone;
|
|
||||||
break
|
|
||||||
}
|
|
||||||
left = left._left;
|
|
||||||
}
|
|
||||||
while (right !== null) {
|
|
||||||
if (right._redone !== null && right._redone._parent === parent) {
|
|
||||||
right = right._redone;
|
|
||||||
}
|
|
||||||
right = right._right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
struct._origin = left;
|
|
||||||
struct._left = left;
|
|
||||||
struct._right = right;
|
|
||||||
struct._right_origin = right;
|
|
||||||
struct._parent = parent;
|
|
||||||
struct._parentSub = this._parentSub;
|
struct._parentSub = this._parentSub;
|
||||||
struct._integrate(y);
|
|
||||||
this._redone = struct;
|
|
||||||
return struct
|
return struct
|
||||||
}
|
}
|
||||||
|
|
||||||
get _lastId () {
|
get _lastId () {
|
||||||
return new ID(this._id.user, this._id.clock + this._length - 1)
|
return new ID(this._id.user, this._id.clock + this._length - 1)
|
||||||
}
|
}
|
||||||
@@ -1416,15 +1379,11 @@ class Item {
|
|||||||
if (!this._deleted) {
|
if (!this._deleted) {
|
||||||
this._deleted = true;
|
this._deleted = true;
|
||||||
y.ds.markDeleted(this._id, this._length);
|
y.ds.markDeleted(this._id, this._length);
|
||||||
let del = new Delete();
|
|
||||||
del._targetID = this._id;
|
|
||||||
del._length = this._length;
|
|
||||||
if (createDelete) {
|
if (createDelete) {
|
||||||
// broadcast and persists Delete
|
let del = new Delete();
|
||||||
|
del._targetID = this._id;
|
||||||
|
del._length = this._length;
|
||||||
del._integrate(y, true);
|
del._integrate(y, true);
|
||||||
} else if (y.persistence !== null) {
|
|
||||||
// only persist Delete
|
|
||||||
y.persistence.saveStruct(y, del);
|
|
||||||
}
|
}
|
||||||
transactionTypeChanged(y, this._parent, this._parentSub);
|
transactionTypeChanged(y, this._parent, this._parentSub);
|
||||||
y._transaction.deletedStructs.add(this);
|
y._transaction.deletedStructs.add(this);
|
||||||
@@ -1759,6 +1718,39 @@ class Type extends Item {
|
|||||||
type = type._parent;
|
type = type._parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_copy (undeleteChildren) {
|
||||||
|
let copy = super._copy();
|
||||||
|
let map = new Map();
|
||||||
|
copy._map = map;
|
||||||
|
for (let [key, value] of this._map) {
|
||||||
|
if (undeleteChildren.has(value) || !value.deleted) {
|
||||||
|
let _item = value._copy(undeleteChildren);
|
||||||
|
_item._parent = copy;
|
||||||
|
map.set(key, value._copy(undeleteChildren));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let prevUndeleted = null;
|
||||||
|
copy._start = null;
|
||||||
|
let item = this._start;
|
||||||
|
while (item !== null) {
|
||||||
|
if (undeleteChildren.has(item) || !item.deleted) {
|
||||||
|
let _item = item._copy(undeleteChildren);
|
||||||
|
_item._left = prevUndeleted;
|
||||||
|
_item._origin = prevUndeleted;
|
||||||
|
_item._right = null;
|
||||||
|
_item._right_origin = null;
|
||||||
|
_item._parent = copy;
|
||||||
|
if (prevUndeleted === null) {
|
||||||
|
copy._start = _item;
|
||||||
|
} else {
|
||||||
|
prevUndeleted._right = _item;
|
||||||
|
}
|
||||||
|
prevUndeleted = _item;
|
||||||
|
}
|
||||||
|
item = item._right;
|
||||||
|
}
|
||||||
|
return copy
|
||||||
|
}
|
||||||
_transact (f) {
|
_transact (f) {
|
||||||
const y = this._y;
|
const y = this._y;
|
||||||
if (y !== null) {
|
if (y !== null) {
|
||||||
@@ -2920,20 +2912,18 @@ class YXmlFragment extends YArray {
|
|||||||
attributes.set(key, attrs[key]);
|
attributes.set(key, attrs[key]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this._y.transact(() => {
|
let result = this._domFilter(this.nodeName, new Map(attributes));
|
||||||
let result = this._domFilter(this.nodeName, new Map(attributes));
|
if (result === null) {
|
||||||
if (result === null) {
|
this._delete(this._y);
|
||||||
this._delete(this._y);
|
} else {
|
||||||
} else {
|
attributes.forEach((value, key) => {
|
||||||
attributes.forEach((value, key) => {
|
if (!result.has(key)) {
|
||||||
if (!result.has(key)) {
|
this.removeAttribute(key);
|
||||||
this.removeAttribute(key);
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.forEach(xml => {
|
|
||||||
xml.setDomFilter(f);
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
this.forEach(xml => {
|
||||||
|
xml.setDomFilter(f);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_callObserver (transaction, parentSubs, remote) {
|
_callObserver (transaction, parentSubs, remote) {
|
||||||
@@ -3138,8 +3128,8 @@ class YXmlElement extends YXmlFragment {
|
|||||||
this._domFilter = arg2;
|
this._domFilter = arg2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_copy () {
|
_copy (undeleteChildren) {
|
||||||
let struct = super._copy();
|
let struct = super._copy(undeleteChildren);
|
||||||
struct.nodeName = this.nodeName;
|
struct.nodeName = this.nodeName;
|
||||||
return struct
|
return struct
|
||||||
}
|
}
|
||||||
@@ -3154,8 +3144,7 @@ class YXmlElement extends YXmlFragment {
|
|||||||
let attributes = new Map();
|
let attributes = new Map();
|
||||||
for (let i = 0; i < dom.attributes.length; i++) {
|
for (let i = 0; i < dom.attributes.length; i++) {
|
||||||
let attr = dom.attributes[i];
|
let attr = dom.attributes[i];
|
||||||
// get attribute via getAttribute for custom element support (some write something different in attr.value)
|
attributes.set(attr.name, attr.value);
|
||||||
attributes.set(attr.name, dom.getAttribute(attr.name));
|
|
||||||
}
|
}
|
||||||
attributes = this._domFilter(dom, attributes);
|
attributes = this._domFilter(dom, attributes);
|
||||||
attributes.forEach((value, name) => {
|
attributes.forEach((value, name) => {
|
||||||
@@ -3278,11 +3267,6 @@ class YXmlHook extends YMap {
|
|||||||
getHook(hookName).fillType(dom, this);
|
getHook(hookName).fillType(dom, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_copy () {
|
|
||||||
const struct = super._copy();
|
|
||||||
struct.hookName = this.hookName;
|
|
||||||
return struct
|
|
||||||
}
|
|
||||||
getDom (_document) {
|
getDom (_document) {
|
||||||
_document = _document || document;
|
_document = _document || document;
|
||||||
if (this._dom === null) {
|
if (this._dom === null) {
|
||||||
@@ -3677,12 +3661,11 @@ class ReverseOperation {
|
|||||||
constructor (y, transaction) {
|
constructor (y, transaction) {
|
||||||
this.created = new Date();
|
this.created = new Date();
|
||||||
const beforeState = transaction.beforeState;
|
const beforeState = transaction.beforeState;
|
||||||
|
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1);
|
||||||
if (beforeState.has(y.userID)) {
|
if (beforeState.has(y.userID)) {
|
||||||
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1);
|
|
||||||
this.fromState = new ID(y.userID, beforeState.get(y.userID));
|
this.fromState = new ID(y.userID, beforeState.get(y.userID));
|
||||||
} else {
|
} else {
|
||||||
this.toState = null;
|
this.fromState = this.toState;
|
||||||
this.fromState = null;
|
|
||||||
}
|
}
|
||||||
this.deletedStructs = transaction.deletedStructs;
|
this.deletedStructs = transaction.deletedStructs;
|
||||||
}
|
}
|
||||||
@@ -3704,32 +3687,28 @@ function applyReverseOperation (y, scope, reverseBuffer) {
|
|||||||
while (!performedUndo && reverseBuffer.length > 0) {
|
while (!performedUndo && reverseBuffer.length > 0) {
|
||||||
let undoOp = reverseBuffer.pop();
|
let undoOp = reverseBuffer.pop();
|
||||||
// make sure that it is possible to iterate {from}-{to}
|
// make sure that it is possible to iterate {from}-{to}
|
||||||
if (undoOp.fromState !== null) {
|
y.os.getItemCleanStart(undoOp.fromState);
|
||||||
y.os.getItemCleanStart(undoOp.fromState);
|
y.os.getItemCleanEnd(undoOp.toState);
|
||||||
y.os.getItemCleanEnd(undoOp.toState);
|
y.os.iterate(undoOp.fromState, undoOp.toState, op => {
|
||||||
y.os.iterate(undoOp.fromState, undoOp.toState, op => {
|
if (!op._deleted && isStructInScope(y, op, scope)) {
|
||||||
while (op._deleted && op._redone !== null) {
|
performedUndo = true;
|
||||||
op = op._redone;
|
op._delete(y);
|
||||||
}
|
}
|
||||||
if (op._deleted === false && isStructInScope(y, op, scope)) {
|
});
|
||||||
performedUndo = true;
|
|
||||||
op._delete(y);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
for (let op of undoOp.deletedStructs) {
|
for (let op of undoOp.deletedStructs) {
|
||||||
if (
|
if (
|
||||||
isStructInScope(y, op, scope) &&
|
isStructInScope(y, op, scope) &&
|
||||||
op._parent !== y &&
|
op._parent !== y &&
|
||||||
|
!op._parent._deleted &&
|
||||||
(
|
(
|
||||||
op._id.user !== y.userID ||
|
op._parent._id.user !== y.userID ||
|
||||||
undoOp.fromState === null ||
|
op._parent._id.clock < undoOp.fromState.clock ||
|
||||||
op._id.clock < undoOp.fromState.clock ||
|
op._parent._id.clock > undoOp.fromState.clock
|
||||||
op._id.clock > undoOp.toState.clock
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
performedUndo = true;
|
performedUndo = true;
|
||||||
op._redo(y);
|
op = op._copy(undoOp.deletedStructs);
|
||||||
|
op._integrate(y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3746,7 +3725,6 @@ class UndoManager {
|
|||||||
this._scope = scope;
|
this._scope = scope;
|
||||||
this._undoing = false;
|
this._undoing = false;
|
||||||
this._redoing = false;
|
this._redoing = false;
|
||||||
this._lastTransactionWasUndo = false;
|
|
||||||
const y = scope._y;
|
const y = scope._y;
|
||||||
this.y = y;
|
this.y = y;
|
||||||
y.on('afterTransaction', (y, transaction, remote) => {
|
y.on('afterTransaction', (y, transaction, remote) => {
|
||||||
@@ -3754,29 +3732,17 @@ class UndoManager {
|
|||||||
let reverseOperation = new ReverseOperation(y, transaction);
|
let reverseOperation = new ReverseOperation(y, transaction);
|
||||||
if (!this._undoing) {
|
if (!this._undoing) {
|
||||||
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null;
|
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null;
|
||||||
if (
|
if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
|
||||||
this._redoing === false &&
|
|
||||||
this._lastTransactionWasUndo === false &&
|
|
||||||
lastUndoOp !== null &&
|
|
||||||
reverseOperation.created - lastUndoOp.created <= options.captureTimeout
|
|
||||||
) {
|
|
||||||
lastUndoOp.created = reverseOperation.created;
|
lastUndoOp.created = reverseOperation.created;
|
||||||
if (reverseOperation.toState !== null) {
|
lastUndoOp.toState = reverseOperation.toState;
|
||||||
lastUndoOp.toState = reverseOperation.toState;
|
|
||||||
if (lastUndoOp.fromState === null) {
|
|
||||||
lastUndoOp.fromState = reverseOperation.fromState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs);
|
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs);
|
||||||
} else {
|
} else {
|
||||||
this._lastTransactionWasUndo = false;
|
|
||||||
this._undoBuffer.push(reverseOperation);
|
this._undoBuffer.push(reverseOperation);
|
||||||
}
|
}
|
||||||
if (!this._redoing) {
|
if (!this._redoing) {
|
||||||
this._redoBuffer = [];
|
this._redoBuffer = [];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this._lastTransactionWasUndo = true;
|
|
||||||
this._redoBuffer.push(reverseOperation);
|
this._redoBuffer.push(reverseOperation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4650,10 +4616,8 @@ class AbstractConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fromBinary (y, decoder) {
|
function fromBinary (y, decoder) {
|
||||||
y.transact(function () {
|
integrateRemoteStructs(y, decoder);
|
||||||
integrateRemoteStructs(y, decoder);
|
readDeleteSet(y, decoder);
|
||||||
readDeleteSet(y, decoder);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function toBinary (y) {
|
function toBinary (y) {
|
||||||
@@ -4691,13 +4655,13 @@ class AbstractPersistence {
|
|||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
this.opts = opts;
|
this.opts = opts;
|
||||||
this.ys = new Map();
|
this.ys = new Map();
|
||||||
|
this.mutualExclude = createMutualExclude();
|
||||||
}
|
}
|
||||||
|
|
||||||
_init (y) {
|
_init (y) {
|
||||||
let cnf = this.ys.get(y);
|
let cnf = this.ys.get(y);
|
||||||
if (cnf === undefined) {
|
if (cnf === undefined) {
|
||||||
cnf = getFreshCnf();
|
cnf = getFreshCnf();
|
||||||
cnf.mutualExclude = createMutualExclude();
|
|
||||||
this.ys.set(y, cnf);
|
this.ys.set(y, cnf);
|
||||||
return this.init(y).then(() => {
|
return this.init(y).then(() => {
|
||||||
y.on('afterTransaction', (y, transaction) => {
|
y.on('afterTransaction', (y, transaction) => {
|
||||||
@@ -4759,7 +4723,7 @@ class AbstractPersistence {
|
|||||||
saveStruct (y, struct) {
|
saveStruct (y, struct) {
|
||||||
let cnf = this.ys.get(y);
|
let cnf = this.ys.get(y);
|
||||||
if (cnf !== undefined) {
|
if (cnf !== undefined) {
|
||||||
cnf.mutualExclude(function () {
|
this.mutualExclude(function () {
|
||||||
struct._toBinary(cnf.buffer);
|
struct._toBinary(cnf.buffer);
|
||||||
cnf.len++;
|
cnf.len++;
|
||||||
});
|
});
|
||||||
@@ -4768,22 +4732,19 @@ class AbstractPersistence {
|
|||||||
|
|
||||||
/* overwrite */
|
/* overwrite */
|
||||||
retrieve (y, model, updates) {
|
retrieve (y, model, updates) {
|
||||||
let cnf = this.ys.get(y);
|
this.mutualExclude(function () {
|
||||||
if (cnf !== undefined) {
|
y.transact(function () {
|
||||||
cnf.mutualExclude(function () {
|
if (model != null) {
|
||||||
y.transact(function () {
|
fromBinary(y, new BinaryDecoder(new Uint8Array(model)));
|
||||||
if (model != null) {
|
}
|
||||||
fromBinary(y, new BinaryDecoder(new Uint8Array(model)));
|
if (updates != null) {
|
||||||
|
for (let i = 0; i < updates.length; i++) {
|
||||||
|
integrateRemoteStructs(y, new BinaryDecoder(new Uint8Array(updates[i])));
|
||||||
}
|
}
|
||||||
if (updates != null) {
|
}
|
||||||
for (let i = 0; i < updates.length; i++) {
|
|
||||||
integrateRemoteStructs(y, new BinaryDecoder(new Uint8Array(updates[i])));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
y.emit('persistenceReady');
|
|
||||||
});
|
});
|
||||||
}
|
y.emit('persistenceReady');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* overwrite */
|
/* overwrite */
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user