|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
|
/**
|
|
|
|
|
* yjs - A framework for real-time p2p shared editing on any data
|
|
|
|
|
* @version v12.2.1
|
|
|
|
|
* @version v12.3.1
|
|
|
|
|
* @link http://y-js.org
|
|
|
|
|
* @license MIT
|
|
|
|
|
*/
|
|
|
|
|
@@ -48,20 +48,20 @@ function useColors() {
|
|
|
|
|
// NB: In an Electron preload script, document will be defined but not fully
|
|
|
|
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
|
|
|
|
// explicitly
|
|
|
|
|
if (typeof window !== 'undefined' && window && typeof window.process !== 'undefined' && window.process.type === 'renderer') {
|
|
|
|
|
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// is webkit? http://stackoverflow.com/a/16459606/376773
|
|
|
|
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
|
|
|
|
return (typeof document !== 'undefined' && document && 'WebkitAppearance' in document.documentElement.style) ||
|
|
|
|
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
|
|
|
|
// is firebug? http://stackoverflow.com/a/398120/376773
|
|
|
|
|
(typeof window !== 'undefined' && window && window.console && (console.firebug || (console.exception && console.table))) ||
|
|
|
|
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
|
|
|
|
// is firefox >= v31?
|
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
|
|
|
|
(typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
|
|
|
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
|
|
|
|
// double check webkit in userAgent just in case we are in a worker
|
|
|
|
|
(typeof navigator !== 'undefined' && navigator && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
|
|
|
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -403,11 +403,11 @@ function coerce(val) {
|
|
|
|
|
* Helpers.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
var s = 1000
|
|
|
|
|
var m = s * 60
|
|
|
|
|
var h = m * 60
|
|
|
|
|
var d = h * 24
|
|
|
|
|
var y = d * 365.25
|
|
|
|
|
var s = 1000;
|
|
|
|
|
var m = s * 60;
|
|
|
|
|
var h = m * 60;
|
|
|
|
|
var d = h * 24;
|
|
|
|
|
var y = d * 365.25;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse or format the given `val`.
|
|
|
|
|
@@ -423,18 +423,19 @@ var y = d * 365.25
|
|
|
|
|
* @api public
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
module.exports = function (val, options) {
|
|
|
|
|
options = options || {}
|
|
|
|
|
var type = typeof val
|
|
|
|
|
module.exports = function(val, options) {
|
|
|
|
|
options = options || {};
|
|
|
|
|
var type = typeof val;
|
|
|
|
|
if (type === 'string' && val.length > 0) {
|
|
|
|
|
return parse(val)
|
|
|
|
|
return parse(val);
|
|
|
|
|
} else if (type === 'number' && isNaN(val) === false) {
|
|
|
|
|
return options.long ?
|
|
|
|
|
fmtLong(val) :
|
|
|
|
|
fmtShort(val)
|
|
|
|
|
return options.long ? fmtLong(val) : fmtShort(val);
|
|
|
|
|
}
|
|
|
|
|
throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))
|
|
|
|
|
}
|
|
|
|
|
throw new Error(
|
|
|
|
|
'val is not a non-empty string or a valid number. val=' +
|
|
|
|
|
JSON.stringify(val)
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse the given `str` and return milliseconds.
|
|
|
|
|
@@ -445,53 +446,55 @@ module.exports = function (val, options) {
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function parse(str) {
|
|
|
|
|
str = String(str)
|
|
|
|
|
if (str.length > 10000) {
|
|
|
|
|
return
|
|
|
|
|
str = String(str);
|
|
|
|
|
if (str.length > 100) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)
|
|
|
|
|
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
|
|
|
|
|
str
|
|
|
|
|
);
|
|
|
|
|
if (!match) {
|
|
|
|
|
return
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var n = parseFloat(match[1])
|
|
|
|
|
var type = (match[2] || 'ms').toLowerCase()
|
|
|
|
|
var n = parseFloat(match[1]);
|
|
|
|
|
var type = (match[2] || 'ms').toLowerCase();
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 'years':
|
|
|
|
|
case 'year':
|
|
|
|
|
case 'yrs':
|
|
|
|
|
case 'yr':
|
|
|
|
|
case 'y':
|
|
|
|
|
return n * y
|
|
|
|
|
return n * y;
|
|
|
|
|
case 'days':
|
|
|
|
|
case 'day':
|
|
|
|
|
case 'd':
|
|
|
|
|
return n * d
|
|
|
|
|
return n * d;
|
|
|
|
|
case 'hours':
|
|
|
|
|
case 'hour':
|
|
|
|
|
case 'hrs':
|
|
|
|
|
case 'hr':
|
|
|
|
|
case 'h':
|
|
|
|
|
return n * h
|
|
|
|
|
return n * h;
|
|
|
|
|
case 'minutes':
|
|
|
|
|
case 'minute':
|
|
|
|
|
case 'mins':
|
|
|
|
|
case 'min':
|
|
|
|
|
case 'm':
|
|
|
|
|
return n * m
|
|
|
|
|
return n * m;
|
|
|
|
|
case 'seconds':
|
|
|
|
|
case 'second':
|
|
|
|
|
case 'secs':
|
|
|
|
|
case 'sec':
|
|
|
|
|
case 's':
|
|
|
|
|
return n * s
|
|
|
|
|
return n * s;
|
|
|
|
|
case 'milliseconds':
|
|
|
|
|
case 'millisecond':
|
|
|
|
|
case 'msecs':
|
|
|
|
|
case 'msec':
|
|
|
|
|
case 'ms':
|
|
|
|
|
return n
|
|
|
|
|
return n;
|
|
|
|
|
default:
|
|
|
|
|
return undefined
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -505,18 +508,18 @@ function parse(str) {
|
|
|
|
|
|
|
|
|
|
function fmtShort(ms) {
|
|
|
|
|
if (ms >= d) {
|
|
|
|
|
return Math.round(ms / d) + 'd'
|
|
|
|
|
return Math.round(ms / d) + 'd';
|
|
|
|
|
}
|
|
|
|
|
if (ms >= h) {
|
|
|
|
|
return Math.round(ms / h) + 'h'
|
|
|
|
|
return Math.round(ms / h) + 'h';
|
|
|
|
|
}
|
|
|
|
|
if (ms >= m) {
|
|
|
|
|
return Math.round(ms / m) + 'm'
|
|
|
|
|
return Math.round(ms / m) + 'm';
|
|
|
|
|
}
|
|
|
|
|
if (ms >= s) {
|
|
|
|
|
return Math.round(ms / s) + 's'
|
|
|
|
|
return Math.round(ms / s) + 's';
|
|
|
|
|
}
|
|
|
|
|
return ms + 'ms'
|
|
|
|
|
return ms + 'ms';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -532,7 +535,7 @@ function fmtLong(ms) {
|
|
|
|
|
plural(ms, h, 'hour') ||
|
|
|
|
|
plural(ms, m, 'minute') ||
|
|
|
|
|
plural(ms, s, 'second') ||
|
|
|
|
|
ms + ' ms'
|
|
|
|
|
ms + ' ms';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -541,12 +544,12 @@ function fmtLong(ms) {
|
|
|
|
|
|
|
|
|
|
function plural(ms, n, name) {
|
|
|
|
|
if (ms < n) {
|
|
|
|
|
return
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (ms < n * 1.5) {
|
|
|
|
|
return Math.floor(ms / n) + ' ' + name
|
|
|
|
|
return Math.floor(ms / n) + ' ' + name;
|
|
|
|
|
}
|
|
|
|
|
return Math.ceil(ms / n) + ' ' + name + 's'
|
|
|
|
|
return Math.ceil(ms / n) + ' ' + name + 's';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
},{}],4:[function(require,module,exports){
|
|
|
|
|
@@ -736,9 +739,6 @@ process.chdir = function (dir) {
|
|
|
|
|
process.umask = function() { return 0; };
|
|
|
|
|
|
|
|
|
|
},{}],5:[function(require,module,exports){
|
|
|
|
|
/* @flow */
|
|
|
|
|
'use strict'
|
|
|
|
|
|
|
|
|
|
function canRead (auth) { return auth === 'read' || auth === 'write' }
|
|
|
|
|
function canWrite (auth) { return auth === 'write' }
|
|
|
|
|
|
|
|
|
|
@@ -817,7 +817,7 @@ module.exports = function (Y/* :any */) {
|
|
|
|
|
}
|
|
|
|
|
reconnect () {
|
|
|
|
|
this.log('reconnecting..')
|
|
|
|
|
this.y.db.startGarbageCollector()
|
|
|
|
|
return this.y.db.startGarbageCollector()
|
|
|
|
|
}
|
|
|
|
|
disconnect () {
|
|
|
|
|
this.log('discronnecting..')
|
|
|
|
|
@@ -826,7 +826,8 @@ module.exports = function (Y/* :any */) {
|
|
|
|
|
this.currentSyncTarget = null
|
|
|
|
|
this.syncingClients = []
|
|
|
|
|
this.whenSyncedListeners = []
|
|
|
|
|
return this.y.db.stopGarbageCollector()
|
|
|
|
|
this.y.db.stopGarbageCollector()
|
|
|
|
|
return this.y.db.whenTransactionsFinished()
|
|
|
|
|
}
|
|
|
|
|
repair () {
|
|
|
|
|
this.log('Repairing the state of Yjs. This can happen if messages get lost, and Yjs detects that something is wrong. If this happens often, please report an issue here: https://github.com/y-js/yjs/issues')
|
|
|
|
|
@@ -1009,7 +1010,7 @@ module.exports = function (Y/* :any */) {
|
|
|
|
|
}
|
|
|
|
|
if (message.auth != null && this.connections[sender] != null) {
|
|
|
|
|
// authenticate using auth in message
|
|
|
|
|
var auth = this.checkAuth(message.auth, this.y)
|
|
|
|
|
var auth = this.checkAuth(message.auth, this.y, sender)
|
|
|
|
|
this.connections[sender].auth = auth
|
|
|
|
|
auth.then(auth => {
|
|
|
|
|
for (var f of this.userEventListeners) {
|
|
|
|
|
@@ -1022,7 +1023,7 @@ module.exports = function (Y/* :any */) {
|
|
|
|
|
})
|
|
|
|
|
} else if (this.connections[sender] != null && this.connections[sender].auth == null) {
|
|
|
|
|
// authenticate without otherwise
|
|
|
|
|
this.connections[sender].auth = this.checkAuth(null, this.y)
|
|
|
|
|
this.connections[sender].auth = this.checkAuth(null, this.y, sender)
|
|
|
|
|
}
|
|
|
|
|
if (this.connections[sender] != null && this.connections[sender].auth != null) {
|
|
|
|
|
return this.connections[sender].auth.then((auth) => {
|
|
|
|
|
@@ -3568,9 +3569,13 @@ module.exports = function (Y /* : any*/) {
|
|
|
|
|
event.path = []
|
|
|
|
|
while (type != null && type._deepEventHandler != null) {
|
|
|
|
|
type._deepEventHandler.callEventListeners(event)
|
|
|
|
|
if (type._parent != null && type._parentSub != null) {
|
|
|
|
|
event.path = [type._parentSub].concat(event.path)
|
|
|
|
|
type = type.os.getType(type._parent)
|
|
|
|
|
var parent = null
|
|
|
|
|
if (type._parent != null) {
|
|
|
|
|
parent = type.os.getType(type._parent)
|
|
|
|
|
}
|
|
|
|
|
if (parent != null && parent._getPathToChild != null) {
|
|
|
|
|
event.path = [parent._getPathToChild(type._model)].concat(event.path)
|
|
|
|
|
type = parent
|
|
|
|
|
} else {
|
|
|
|
|
type = null
|
|
|
|
|
}
|
|
|
|
|
@@ -4015,7 +4020,20 @@ module.exports = function (Y /* : any*/) {
|
|
|
|
|
Default class of custom types!
|
|
|
|
|
*/
|
|
|
|
|
class CustomType {
|
|
|
|
|
|
|
|
|
|
getPath () {
|
|
|
|
|
var parent = null
|
|
|
|
|
if (this._parent != null) {
|
|
|
|
|
parent = this.os.getType(this._parent)
|
|
|
|
|
}
|
|
|
|
|
if (parent != null && parent._getPathToChild != null) {
|
|
|
|
|
var firstKey = parent._getPathToChild(this._model)
|
|
|
|
|
var parentKeys = parent.getPath()
|
|
|
|
|
parentKeys.push(firstKey)
|
|
|
|
|
return parentKeys
|
|
|
|
|
} else {
|
|
|
|
|
return []
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Y.utils.CustomType = CustomType
|
|
|
|
|
|
|
|
|
|
|