Compare commits

..

1 Commits

Author SHA1 Message Date
Kevin Jahns
2e061a4cb2 v13.0.0-26 -- distribution files 2017-11-09 17:32:54 -08:00
15 changed files with 609 additions and 637 deletions

36
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "yjs", "name": "yjs",
"version": "13.0.0-27", "version": "13.0.0-25",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -2808,6 +2808,14 @@
} }
} }
}, },
"string_decoder": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"safe-buffer": "5.0.1"
}
},
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
@@ -2818,14 +2826,6 @@
"strip-ansi": "3.0.1" "strip-ansi": "3.0.1"
} }
}, },
"string_decoder": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"safe-buffer": "5.0.1"
}
},
"stringstream": { "stringstream": {
"version": "0.0.5", "version": "0.0.5",
"bundled": true, "bundled": true,
@@ -4868,6 +4868,15 @@
"duplexer": "0.1.1" "duplexer": "0.1.1"
} }
}, },
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -4889,15 +4898,6 @@
"resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz",
"integrity": "sha1-aybpvTr8qnvjtCabUm3huCAArHg=" "integrity": "sha1-aybpvTr8qnvjtCabUm3huCAArHg="
}, },
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",

View File

@@ -1,6 +1,6 @@
{ {
"name": "yjs", "name": "yjs",
"version": "13.0.0-27", "version": "13.0.0-26",
"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",

View File

@@ -3,7 +3,7 @@ import commonjs from 'rollup-plugin-commonjs'
import multiEntry from 'rollup-plugin-multi-entry' import multiEntry from 'rollup-plugin-multi-entry'
export default { export default {
entry: 'test/y-map.tests.js', entry: 'test/y-xml.tests.js',
moduleName: 'y-tests', moduleName: 'y-tests',
format: 'umd', format: 'umd',
plugins: [ plugins: [

View File

@@ -1,6 +1,5 @@
import Type from '../Struct/Type.js' import Type from '../Struct/Type.js'
import ItemJSON from '../Struct/ItemJSON.js' import ItemJSON from '../Struct/ItemJSON.js'
import ItemString from '../Struct/ItemString.js'
import { logID } from '../MessageHandler/messageToString.js' import { logID } from '../MessageHandler/messageToString.js'
import YEvent from '../Util/YEvent.js' import YEvent from '../Util/YEvent.js'
@@ -20,11 +19,7 @@ export default class YArray extends Type {
while (n !== null) { while (n !== null) {
if (!n._deleted) { if (!n._deleted) {
if (pos < n._length) { if (pos < n._length) {
if (n.constructor === ItemJSON || n.constructor === ItemString) { return n._content[n._length - pos]
return n._content[pos]
} else {
return n
}
} }
pos -= n._length pos -= n._length
} }

View File

@@ -255,7 +255,7 @@ export default class YXmlFragment extends YArray {
} }
}) })
for (let dom of diffChildren) { for (let dom of diffChildren) {
if (dom._yxml != null && dom._yxml !== false) { if (dom._yxml != null) {
applyChangesFromDom(dom) applyChangesFromDom(dom)
} }
} }

View File

@@ -76,6 +76,7 @@ export default class UndoManager {
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 (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) { if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
console.log('appending', lastUndoOp, reverseOperation)
lastUndoOp.created = reverseOperation.created lastUndoOp.created = reverseOperation.created
lastUndoOp.toState = reverseOperation.toState lastUndoOp.toState = reverseOperation.toState
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs) reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs)
@@ -92,6 +93,7 @@ export default class UndoManager {
}) })
} }
undo () { undo () {
console.log('undoing')
this._undoing = true this._undoing = true
const performedUndo = applyReverseOperation(this.y, this._scope, this._undoBuffer) const performedUndo = applyReverseOperation(this.y, this._scope, this._undoBuffer)
this._undoing = false this._undoing = false

View File

@@ -8,15 +8,15 @@ export default class YEvent {
const path = [] const path = []
let type = this.target let type = this.target
const y = type._y const y = type._y
while (type !== this.currentTarget && type !== y) { while (type._parent !== this._currentTarget && type._parent !== y) {
let parent = type._parent let parent = type._parent
if (type._parentSub !== null) { if (type._parentSub !== null) {
path.unshift(type._parentSub) path.push(type._parentSub)
} else { } else {
// parent is array-ish // parent is array-ish
for (let [i, child] of parent) { for (let [i, child] of parent) {
if (child === type) { if (child === type) {
path.unshift(i) path.push(i)
break break
} }
} }

View File

@@ -172,36 +172,31 @@ test('observePath properties', async function map10 (t) {
}) })
*/ */
/* TODO: reimplement observeDeep
test('observe deep properties', async function map11 (t) { test('observe deep properties', async function map11 (t) {
let { users, map1, map2, map3 } = await initArrays(t, { users: 4 }) let { users, map1, map2, map3 } = await initArrays(t, { users: 4 })
var _map1 = map1.set('map', new Y.Map()) var _map1 = map1.set('map', new Y.Map())
var calls = 0 var calls = 0
var dmapid var dmapid
map1.observeDeep(function (events) { _map1.observe(function (event) {
events.forEach(event => { calls++
calls++ t.compare(event.name, 'deepmap')
t.assert(event.keysChanged.has('deepmap')) dmapid = event.target.opContents.deepmap
t.assert(event.path.length === 1)
t.assert(event.path[0] === 'map')
dmapid = event.target.get('deepmap')._id
})
}) })
await flushAll(t, users) await flushAll(t, users)
await flushAll(t, users)
var _map3 = map3.get('map') var _map3 = map3.get('map')
_map3.set('deepmap', new Y.Map()) _map3.set('deepmap', new Y.Map())
await flushAll(t, users) await flushAll(t, users)
var _map2 = map2.get('map') var _map2 = map2.get('map')
_map2.set('deepmap', new Y.Map()) _map2.set('deepmap', new Y.Map())
await flushAll(t, users) await flushAll(t, users)
await flushAll(t, users)
var dmap1 = _map1.get('deepmap') var dmap1 = _map1.get('deepmap')
var dmap2 = _map2.get('deepmap') var dmap2 = _map2.get('deepmap')
var dmap3 = _map3.get('deepmap') var dmap3 = _map3.get('deepmap')
t.assert(calls > 0) t.assert(calls > 0)
t.assert(dmap1._id.equals(dmap2._id)) t.compare(dmap1._model, dmap2._model)
t.assert(dmap1._id.equals(dmap3._id)) t.compare(dmap1._model, dmap3._model)
t.assert(dmap1._id.equals(dmapid)) t.compare(dmap1._model, dmapid)
await compareUsers(t, users) await compareUsers(t, users)
}) })
@@ -209,10 +204,8 @@ test('observes using observeDeep', async function map12 (t) {
let { users, map0 } = await initArrays(t, { users: 2 }) let { users, map0 } = await initArrays(t, { users: 2 })
var pathes = [] var pathes = []
var calls = 0 var calls = 0
map0.observeDeep(function (events) { map0.observeDeep(function (event) {
events.forEach(event => { pathes.push(event.path)
pathes.push(event.path)
})
calls++ calls++
}) })
map0.set('map', new Y.Map()) map0.set('map', new Y.Map())
@@ -222,6 +215,7 @@ test('observes using observeDeep', async function map12 (t) {
t.compare(pathes, [[], ['map'], ['map', 'array']]) t.compare(pathes, [[], ['map'], ['map', 'array']])
await compareUsers(t, users) await compareUsers(t, users)
}) })
*/
/* TODO: Test events in Y.Map /* TODO: Test events in Y.Map
function compareEvent (t, is, should) { function compareEvent (t, is, should) {

View File

@@ -187,7 +187,7 @@ export async function flushAll (t, users) {
if (users.length === 0) { if (users.length === 0) {
return return
} }
await wait(10) await wait(0)
if (users[0].connector.testRoom != null) { if (users[0].connector.testRoom != null) {
// use flushAll method specified in Test Connector // use flushAll method specified in Test Connector
await users[0].connector.testRoom.flushAll(users) await users[0].connector.testRoom.flushAll(users)

6
y.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

118
y.node.js
View File

@@ -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-27 * @version v13.0.0-26
* @license MIT * @license MIT
*/ */
@@ -687,6 +687,7 @@ if (!String.fromCodePoint) {
/*! http://mths.be/codepointat v0.2.0 by @mathias */ /*! http://mths.be/codepointat v0.2.0 by @mathias */
if (!String.prototype.codePointAt) { if (!String.prototype.codePointAt) {
(function() { (function() {
'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
var defineProperty = (function() { var defineProperty = (function() {
// IE 8 only supports `Object.defineProperty` on DOM elements // IE 8 only supports `Object.defineProperty` on DOM elements
try { try {
@@ -2121,47 +2122,6 @@ class ItemJSON extends Item {
} }
} }
class ItemString extends Item {
constructor () {
super();
this._content = null;
}
_copy () {
let struct = super._copy();
struct._content = this._content;
return struct
}
get _length () {
return this._content.length
}
_fromBinary (y, decoder) {
let missing = super._fromBinary(y, decoder);
this._content = decoder.readVarString();
return missing
}
_toBinary (encoder) {
super._toBinary(encoder);
encoder.writeVarString(this._content);
}
_logString () {
const left = this._left !== null ? this._left._lastId : null;
const origin = this._origin !== null ? this._origin._lastId : null;
return `ItemJSON(id:${logID(this._id)},content:${JSON.stringify(this._content)},left:${logID(left)},origin:${logID(origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${this._parentSub})`
}
_splitAt (y, diff) {
if (diff === 0) {
return this
} else if (diff >= this._length) {
return this._right
}
let item = new ItemString();
item._content = this._content.slice(diff);
this._content = this._content.slice(0, diff);
splitHelper(y, this, item, diff);
return item
}
}
class YEvent { class YEvent {
constructor (target) { constructor (target) {
this.target = target; this.target = target;
@@ -2171,15 +2131,15 @@ class YEvent {
const path = []; const path = [];
let type = this.target; let type = this.target;
const y = type._y; const y = type._y;
while (type !== this.currentTarget && type !== y) { while (type._parent !== this._currentTarget && type._parent !== y) {
let parent = type._parent; let parent = type._parent;
if (type._parentSub !== null) { if (type._parentSub !== null) {
path.unshift(type._parentSub); path.push(type._parentSub);
} else { } else {
// parent is array-ish // parent is array-ish
for (let [i, child] of parent) { for (let [i, child] of parent) {
if (child === type) { if (child === type) {
path.unshift(i); path.push(i);
break break
} }
} }
@@ -2206,11 +2166,7 @@ class YArray extends Type {
while (n !== null) { while (n !== null) {
if (!n._deleted) { if (!n._deleted) {
if (pos < n._length) { if (pos < n._length) {
if (n.constructor === ItemJSON || n.constructor === ItemString) { return n._content[n._length - pos]
return n._content[pos]
} else {
return n
}
} }
pos -= n._length; pos -= n._length;
} }
@@ -2516,6 +2472,47 @@ class YMap extends Type {
} }
} }
class ItemString extends Item {
constructor () {
super();
this._content = null;
}
_copy () {
let struct = super._copy();
struct._content = this._content;
return struct
}
get _length () {
return this._content.length
}
_fromBinary (y, decoder) {
let missing = super._fromBinary(y, decoder);
this._content = decoder.readVarString();
return missing
}
_toBinary (encoder) {
super._toBinary(encoder);
encoder.writeVarString(this._content);
}
_logString () {
const left = this._left !== null ? this._left._lastId : null;
const origin = this._origin !== null ? this._origin._lastId : null;
return `ItemJSON(id:${logID(this._id)},content:${JSON.stringify(this._content)},left:${logID(left)},origin:${logID(origin)},right:${logID(this._right)},parent:${logID(this._parent)},parentSub:${this._parentSub})`
}
_splitAt (y, diff) {
if (diff === 0) {
return this
} else if (diff >= this._length) {
return this._right
}
let item = new ItemString();
item._content = this._content.slice(diff);
this._content = this._content.slice(0, diff);
splitHelper(y, this, item, diff);
return item
}
}
class YText extends YArray { class YText extends YArray {
constructor (string) { constructor (string) {
super(); super();
@@ -3985,7 +3982,7 @@ class YXmlFragment extends YArray {
} }
}); });
for (let dom of diffChildren) { for (let dom of diffChildren) {
if (dom._yxml != null && dom._yxml !== false) { if (dom._yxml != null) {
applyChangesFromDom(dom); applyChangesFromDom(dom);
} }
} }
@@ -4445,6 +4442,7 @@ class UndoManager {
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 (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) { if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
console.log('appending', lastUndoOp, reverseOperation);
lastUndoOp.created = reverseOperation.created; lastUndoOp.created = reverseOperation.created;
lastUndoOp.toState = reverseOperation.toState; lastUndoOp.toState = reverseOperation.toState;
reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs); reverseOperation.deletedStructs.forEach(lastUndoOp.deletedStructs.add, lastUndoOp.deletedStructs);
@@ -4461,6 +4459,7 @@ class UndoManager {
}); });
} }
undo () { undo () {
console.log('undoing');
this._undoing = true; this._undoing = true;
const performedUndo = applyReverseOperation(this.y, this._scope, this._undoBuffer); const performedUndo = applyReverseOperation(this.y, this._scope, this._undoBuffer);
this._undoing = false; this._undoing = false;
@@ -4831,15 +4830,6 @@ function coerce(val) {
} }
}); });
var debug_1 = debug$1.coerce;
var debug_2 = debug$1.disable;
var debug_3 = debug$1.enable;
var debug_4 = debug$1.enabled;
var debug_5 = debug$1.humanize;
var debug_6 = debug$1.names;
var debug_7 = debug$1.skips;
var debug_8 = debug$1.formatters;
var browser = createCommonjsModule(function (module, exports) { var browser = createCommonjsModule(function (module, exports) {
/** /**
* This is the web browser implementation of `debug()`. * This is the web browser implementation of `debug()`.
@@ -5028,14 +5018,6 @@ function localstorage() {
} }
}); });
var browser_1 = browser.log;
var browser_2 = browser.formatArgs;
var browser_3 = browser.save;
var browser_4 = browser.load;
var browser_5 = browser.useColors;
var browser_6 = browser.storage;
var browser_7 = browser.colors;
class AbstractConnector { class AbstractConnector {
constructor (y, opts) { constructor (y, opts) {
this.y = y; this.y = y;

File diff suppressed because one or more lines are too long

1029
y.test.js

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long