test with all encoders

This commit is contained in:
Kevin Jahns 2020-12-29 16:59:27 +01:00
parent 4c929c6808
commit 0a40b541e8
27 changed files with 149 additions and 245 deletions

View File

@ -1,6 +1,6 @@
import { import {
AbstractUpdateEncoder, ID, Transaction // eslint-disable-line UpdateEncoderV1, UpdateEncoderV2, ID, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -34,7 +34,7 @@ export class AbstractStruct {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder The encoder to write data to. * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
* @param {number} offset * @param {number} offset
* @param {number} encodingRef * @param {number} encodingRef
*/ */

View File

@ -1,5 +1,5 @@
import { import {
AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line UpdateEncoderV1, UpdateEncoderV2, UpdateDecoderV1, UpdateDecoderV2, Transaction, Item, StructStore // eslint-disable-line
} from '../internals.js' } from '../internals.js'
export class ContentAny { export class ContentAny {
@ -74,7 +74,7 @@ export class ContentAny {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -95,7 +95,7 @@ export class ContentAny {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentAny} * @return {ContentAny}
*/ */
export const readContentAny = decoder => { export const readContentAny = decoder => {

View File

@ -1,5 +1,5 @@
import { import {
AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -70,7 +70,7 @@ export class ContentBinary {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -86,7 +86,7 @@ export class ContentBinary {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder
* @return {ContentBinary} * @return {ContentBinary}
*/ */
export const readContentBinary = decoder => new ContentBinary(decoder.readBuf()) export const readContentBinary = decoder => new ContentBinary(decoder.readBuf())

View File

@ -1,7 +1,7 @@
import { import {
addToDeleteSet, addToDeleteSet,
AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
export class ContentDeleted { export class ContentDeleted {
@ -77,7 +77,7 @@ export class ContentDeleted {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -95,7 +95,7 @@ export class ContentDeleted {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder
* @return {ContentDeleted} * @return {ContentDeleted}
*/ */
export const readContentDeleted = decoder => new ContentDeleted(decoder.readLen()) export const readContentDeleted = decoder => new ContentDeleted(decoder.readLen())

View File

@ -1,6 +1,6 @@
import { import {
Doc, AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Transaction, Item // eslint-disable-line Doc, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, Item // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -110,7 +110,7 @@ export class ContentDoc {
gc (store) { } gc (store) { }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -129,7 +129,7 @@ export class ContentDoc {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentDoc} * @return {ContentDoc}
*/ */
export const readContentDoc = decoder => new ContentDoc(new Doc({ guid: decoder.readString(), ...decoder.readAny() })) export const readContentDoc = decoder => new ContentDoc(new Doc({ guid: decoder.readString(), ...decoder.readAny() }))

View File

@ -1,6 +1,6 @@
import { import {
AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -74,7 +74,7 @@ export class ContentEmbed {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -92,7 +92,7 @@ export class ContentEmbed {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentEmbed} * @return {ContentEmbed}
*/ */
export const readContentEmbed = decoder => new ContentEmbed(decoder.readJSON()) export const readContentEmbed = decoder => new ContentEmbed(decoder.readJSON())

View File

@ -1,6 +1,6 @@
import { import {
AbstractType, AbstractUpdateDecoder, AbstractUpdateEncoder, Item, StructStore, Transaction // eslint-disable-line AbstractType, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Item, StructStore, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -80,7 +80,7 @@ export class ContentFormat {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -97,7 +97,7 @@ export class ContentFormat {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentFormat} * @return {ContentFormat}
*/ */
export const readContentFormat = decoder => new ContentFormat(decoder.readString(), decoder.readJSON()) export const readContentFormat = decoder => new ContentFormat(decoder.readString(), decoder.readJSON())

View File

@ -1,5 +1,5 @@
import { import {
AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
@ -77,7 +77,7 @@ export class ContentJSON {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -100,7 +100,7 @@ export class ContentJSON {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentJSON} * @return {ContentJSON}
*/ */
export const readContentJSON = decoder => { export const readContentJSON = decoder => {

View File

@ -1,5 +1,5 @@
import { import {
AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
@ -88,7 +88,7 @@ export class ContentString {
*/ */
gc (store) {} gc (store) {}
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -106,7 +106,7 @@ export class ContentString {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentString} * @return {ContentString}
*/ */
export const readContentString = decoder => new ContentString(decoder.readString()) export const readContentString = decoder => new ContentString(decoder.readString())

View File

@ -7,13 +7,13 @@ import {
readYXmlFragment, readYXmlFragment,
readYXmlHook, readYXmlHook,
readYXmlText, readYXmlText,
AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Transaction, Item, YEvent, AbstractType // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, Item, YEvent, AbstractType // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
/** /**
* @type {Array<function(AbstractUpdateDecoder):AbstractType<any>>} * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractType<any>>}
* @private * @private
*/ */
export const typeRefs = [ export const typeRefs = [
@ -148,7 +148,7 @@ export class ContentType {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -166,7 +166,7 @@ export class ContentType {
/** /**
* @private * @private
* *
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {ContentType} * @return {ContentType}
*/ */
export const readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder)) export const readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder))

View File

@ -2,7 +2,7 @@
import { import {
AbstractStruct, AbstractStruct,
addStruct, addStruct,
AbstractUpdateEncoder, StructStore, Transaction, ID // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line
} from '../internals.js' } from '../internals.js'
export const structGCRefNumber = 0 export const structGCRefNumber = 0
@ -42,7 +42,7 @@ export class GC extends AbstractStruct {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {

View File

@ -22,7 +22,7 @@ import {
readContentFormat, readContentFormat,
readContentType, readContentType,
addChangedTypeToTransaction, addChangedTypeToTransaction,
AbstractUpdateDecoder, AbstractUpdateEncoder, ContentType, ContentDeleted, StructStore, ID, AbstractType, Transaction // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, ContentType, ContentDeleted, StructStore, ID, AbstractType, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -620,7 +620,7 @@ export class Item extends AbstractStruct {
* *
* This is called when this Item is sent to a remote peer. * This is called when this Item is sent to a remote peer.
* *
* @param {AbstractUpdateEncoder} encoder The encoder to write data to. * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {
@ -670,7 +670,7 @@ export class Item extends AbstractStruct {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @param {number} info * @param {number} info
*/ */
export const readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder) export const readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder)
@ -678,7 +678,7 @@ export const readItemContent = (decoder, info) => contentRefs[info & binary.BITS
/** /**
* A lookup map for reading Item content. * A lookup map for reading Item content.
* *
* @type {Array<function(AbstractUpdateDecoder):AbstractContent>} * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractContent>}
*/ */
export const contentRefs = [ export const contentRefs = [
() => { error.unexpectedCase() }, // GC is not ItemContent () => { error.unexpectedCase() }, // GC is not ItemContent
@ -771,7 +771,7 @@ export class AbstractContent {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {

View File

@ -1,7 +1,7 @@
import { import {
AbstractStruct, AbstractStruct,
AbstractUpdateEncoder, StructStore, Transaction, ID // eslint-disable-line UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -39,7 +39,7 @@ export class Skip extends AbstractStruct {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {number} offset * @param {number} offset
*/ */
write (encoder, offset) { write (encoder, offset) {

View File

@ -11,7 +11,7 @@ import {
ContentAny, ContentAny,
ContentBinary, ContentBinary,
getItemCleanStart, getItemCleanStart,
ContentDoc, YText, YArray, AbstractUpdateEncoder, Doc, Snapshot, Transaction, EventHandler, YEvent, Item, // eslint-disable-line ContentDoc, YText, YArray, UpdateEncoderV1, UpdateEncoderV2, Doc, Snapshot, Transaction, EventHandler, YEvent, Item, // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as map from 'lib0/map.js' import * as map from 'lib0/map.js'
@ -324,7 +324,7 @@ export class AbstractType {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
*/ */
_write (encoder) { } _write (encoder) { }

View File

@ -15,7 +15,7 @@ import {
YArrayRefID, YArrayRefID,
callTypeObservers, callTypeObservers,
transact, transact,
ArraySearchMarker, AbstractUpdateDecoder, AbstractUpdateEncoder, Doc, Transaction, Item // eslint-disable-line ArraySearchMarker, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import { typeListSlice } from './AbstractType.js' import { typeListSlice } from './AbstractType.js'
@ -241,7 +241,7 @@ export class YArray extends AbstractType {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YArrayRefID) encoder.writeTypeRef(YArrayRefID)
@ -249,7 +249,7 @@ export class YArray extends AbstractType {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* *
* @private * @private
* @function * @function

View File

@ -14,7 +14,7 @@ import {
YMapRefID, YMapRefID,
callTypeObservers, callTypeObservers,
transact, transact,
AbstractUpdateDecoder, AbstractUpdateEncoder, Doc, Transaction, Item // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as iterator from 'lib0/iterator.js' import * as iterator from 'lib0/iterator.js'
@ -238,7 +238,7 @@ export class YMap extends AbstractType {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YMapRefID) encoder.writeTypeRef(YMapRefID)
@ -246,7 +246,7 @@ export class YMap extends AbstractType {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* *
* @private * @private
* @function * @function

View File

@ -26,7 +26,7 @@ import {
typeMapGet, typeMapGet,
typeMapGetAll, typeMapGetAll,
updateMarkerChanges, updateMarkerChanges,
ArraySearchMarker, AbstractUpdateDecoder, AbstractUpdateEncoder, ID, Doc, Item, Snapshot, Transaction // eslint-disable-line ArraySearchMarker, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, ID, Doc, Item, Snapshot, Transaction // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as object from 'lib0/object.js' import * as object from 'lib0/object.js'
@ -1203,7 +1203,7 @@ export class YText extends AbstractType {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YTextRefID) encoder.writeTypeRef(YTextRefID)
@ -1211,7 +1211,7 @@ export class YText extends AbstractType {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {YText} * @return {YText}
* *
* @private * @private

View File

@ -8,7 +8,7 @@ import {
typeMapGetAll, typeMapGetAll,
typeListForEach, typeListForEach,
YXmlElementRefID, YXmlElementRefID,
YXmlText, ContentType, AbstractType, AbstractUpdateDecoder, AbstractUpdateEncoder, Snapshot, Doc, Item // eslint-disable-line YXmlText, ContentType, AbstractType, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Snapshot, Doc, Item // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
@ -208,7 +208,7 @@ export class YXmlElement extends YXmlFragment {
* *
* This is called when this Item is sent to a remote peer. * This is called when this Item is sent to a remote peer.
* *
* @param {AbstractUpdateEncoder} encoder The encoder to write data to. * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YXmlElementRefID) encoder.writeTypeRef(YXmlElementRefID)
@ -217,7 +217,7 @@ export class YXmlElement extends YXmlFragment {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {YXmlElement} * @return {YXmlElement}
* *
* @function * @function

View File

@ -17,7 +17,7 @@ import {
transact, transact,
typeListGet, typeListGet,
typeListSlice, typeListSlice,
AbstractUpdateDecoder, AbstractUpdateEncoder, Doc, ContentType, Transaction, Item, YXmlText, YXmlHook, Snapshot // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, ContentType, Transaction, Item, YXmlText, YXmlHook, Snapshot // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as error from 'lib0/error.js' import * as error from 'lib0/error.js'
@ -410,7 +410,7 @@ export class YXmlFragment extends AbstractType {
* *
* This is called when this Item is sent to a remote peer. * This is called when this Item is sent to a remote peer.
* *
* @param {AbstractUpdateEncoder} encoder The encoder to write data to. * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YXmlFragmentRefID) encoder.writeTypeRef(YXmlFragmentRefID)
@ -418,7 +418,7 @@ export class YXmlFragment extends AbstractType {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {YXmlFragment} * @return {YXmlFragment}
* *
* @private * @private

View File

@ -2,7 +2,7 @@
import { import {
YMap, YMap,
YXmlHookRefID, YXmlHookRefID,
AbstractUpdateDecoder, AbstractUpdateEncoder // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
@ -76,7 +76,7 @@ export class YXmlHook extends YMap {
* *
* This is called when this Item is sent to a remote peer. * This is called when this Item is sent to a remote peer.
* *
* @param {AbstractUpdateEncoder} encoder The encoder to write data to. * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YXmlHookRefID) encoder.writeTypeRef(YXmlHookRefID)
@ -85,7 +85,7 @@ export class YXmlHook extends YMap {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {YXmlHook} * @return {YXmlHook}
* *
* @private * @private

View File

@ -2,7 +2,7 @@
import { import {
YText, YText,
YXmlTextRefID, YXmlTextRefID,
ContentType, YXmlElement, AbstractUpdateDecoder, AbstractUpdateEncoder // eslint-disable-line ContentType, YXmlElement, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
@ -104,7 +104,7 @@ export class YXmlText extends YText {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
*/ */
_write (encoder) { _write (encoder) {
encoder.writeTypeRef(YXmlTextRefID) encoder.writeTypeRef(YXmlTextRefID)
@ -112,7 +112,7 @@ export class YXmlText extends YText {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
* @return {YXmlText} * @return {YXmlText}
* *
* @private * @private

View File

@ -15,14 +15,13 @@ import {
findIndexSS, findIndexSS,
UpdateEncoderV2, UpdateEncoderV2,
applyUpdateV2, applyUpdateV2,
AbstractDSDecoder, DSEncoderV2, DSDecoderV1, DSDecoderV2, Transaction, Doc, DeleteSet, Item // eslint-disable-line DSEncoderV1, DSEncoderV2, DSDecoderV1, DSDecoderV2, Transaction, Doc, DeleteSet, Item // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as map from 'lib0/map.js' import * as map from 'lib0/map.js'
import * as set from 'lib0/set.js' import * as set from 'lib0/set.js'
import * as decoding from 'lib0/decoding.js' import * as decoding from 'lib0/decoding.js'
import * as encoding from 'lib0/encoding.js' import * as encoding from 'lib0/encoding.js'
import { DSEncoderV1 } from './UpdateEncoder.js'
export class Snapshot { export class Snapshot {
/** /**
@ -95,7 +94,7 @@ export const encodeSnapshot = snapshot => encodeSnapshotV2(snapshot, new DSEncod
/** /**
* @param {Uint8Array} buf * @param {Uint8Array} buf
* @param {AbstractDSDecoder} [decoder] * @param {DSDecoderV1 | DSDecoderV2} [decoder]
* @return {Snapshot} * @return {Snapshot}
*/ */
export const decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => { export const decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => {

View File

@ -11,7 +11,7 @@ import {
Item, Item,
generateNewClientId, generateNewClientId,
createID, createID,
AbstractUpdateEncoder, GC, StructStore, UpdateEncoderV2, AbstractType, AbstractStruct, YEvent, Doc // eslint-disable-line UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, GC, StructStore, AbstractType, AbstractStruct, YEvent, Doc // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as map from 'lib0/map.js' import * as map from 'lib0/map.js'
@ -19,7 +19,6 @@ import * as math from 'lib0/math.js'
import * as set from 'lib0/set.js' import * as set from 'lib0/set.js'
import * as logging from 'lib0/logging.js' import * as logging from 'lib0/logging.js'
import { callAll } from 'lib0/function.js' import { callAll } from 'lib0/function.js'
import { UpdateEncoderV1 } from './UpdateEncoder.js'
/** /**
* A transaction is created for every change on the Yjs model. It is possible * A transaction is created for every change on the Yjs model. It is possible
@ -119,7 +118,7 @@ export class Transaction {
} }
/** /**
* @param {AbstractUpdateEncoder} encoder * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
* @param {Transaction} transaction * @param {Transaction} transaction
* @return {boolean} Whether data was written. * @return {boolean} Whether data was written.
*/ */

View File

@ -1,132 +1,9 @@
import * as buffer from 'lib0/buffer.js' import * as buffer from 'lib0/buffer.js'
import * as error from 'lib0/error.js'
import * as decoding from 'lib0/decoding.js' import * as decoding from 'lib0/decoding.js'
import { import {
ID, createID ID, createID
} from '../internals.js' } from '../internals.js'
export class AbstractDSDecoder {
/**
* @param {decoding.Decoder} decoder
*/
constructor (decoder) {
/**
* @type {decoding.Decoder}
*/
this.restDecoder = decoder
error.methodUnimplemented()
}
resetDsCurVal () { }
/**
* @return {number}
*/
readDsClock () {
error.methodUnimplemented()
}
/**
* @return {number}
*/
readDsLen () {
error.methodUnimplemented()
}
}
export class AbstractUpdateDecoder extends AbstractDSDecoder {
/**
* @return {ID}
*/
readLeftID () {
error.methodUnimplemented()
}
/**
* @return {ID}
*/
readRightID () {
error.methodUnimplemented()
}
/**
* Read the next client id.
* Use this in favor of readID whenever possible to reduce the number of objects created.
*
* @return {number}
*/
readClient () {
error.methodUnimplemented()
}
/**
* @return {number} info An unsigned 8-bit integer
*/
readInfo () {
error.methodUnimplemented()
}
/**
* @return {string}
*/
readString () {
error.methodUnimplemented()
}
/**
* @return {boolean} isKey
*/
readParentInfo () {
error.methodUnimplemented()
}
/**
* @return {number} info An unsigned 8-bit integer
*/
readTypeRef () {
error.methodUnimplemented()
}
/**
* Write len of a struct - well suited for Opt RLE encoder.
*
* @return {number} len
*/
readLen () {
error.methodUnimplemented()
}
/**
* @return {any}
*/
readAny () {
error.methodUnimplemented()
}
/**
* @return {Uint8Array}
*/
readBuf () {
error.methodUnimplemented()
}
/**
* Legacy implementation uses JSON parse. We use any-decoding in v2.
*
* @return {any}
*/
readJSON () {
error.methodUnimplemented()
}
/**
* @return {string}
*/
readKey () {
error.methodUnimplemented()
}
}
export class DSDecoderV1 { export class DSDecoderV1 {
/** /**
* @param {decoding.Decoder} decoder * @param {decoding.Decoder} decoder
@ -250,6 +127,9 @@ export class DSDecoderV2 {
* @param {decoding.Decoder} decoder * @param {decoding.Decoder} decoder
*/ */
constructor (decoder) { constructor (decoder) {
/**
* @private
*/
this.dsCurrVal = 0 this.dsCurrVal = 0
this.restDecoder = decoder this.restDecoder = decoder
} }
@ -258,11 +138,17 @@ export class DSDecoderV2 {
this.dsCurrVal = 0 this.dsCurrVal = 0
} }
/**
* @return {number}
*/
readDsClock () { readDsClock () {
this.dsCurrVal += decoding.readVarUint(this.restDecoder) this.dsCurrVal += decoding.readVarUint(this.restDecoder)
return this.dsCurrVal return this.dsCurrVal
} }
/**
* @return {number}
*/
readDsLen () { readDsLen () {
const diff = decoding.readVarUint(this.restDecoder) + 1 const diff = decoding.readVarUint(this.restDecoder) + 1
this.dsCurrVal += diff this.dsCurrVal += diff

View File

@ -33,7 +33,7 @@ import {
DSEncoderV2, DSEncoderV2,
DSDecoderV1, DSDecoderV1,
DSEncoderV1, DSEncoderV1,
AbstractDSDecoder, AbstractUpdateDecoder, Doc, Transaction, GC, Item, StructStore, ID // eslint-disable-line Doc, Transaction, GC, Item, StructStore, ID // eslint-disable-line
} from '../internals.js' } from '../internals.js'
import * as encoding from 'lib0/encoding.js' import * as encoding from 'lib0/encoding.js'
@ -97,7 +97,7 @@ export const writeClientsStructs = (encoder, store, _sm) => {
} }
/** /**
* @param {AbstractUpdateDecoder} decoder The decoder object to read data from. * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder The decoder object to read data from.
* @param {Map<number,Array<GC|Item>>} clientRefs * @param {Map<number,Array<GC|Item>>} clientRefs
* @param {Doc} doc * @param {Doc} doc
* @return {Map<number,Array<GC|Item>>} * @return {Map<number,Array<GC|Item>>}
@ -370,7 +370,7 @@ const cleanupPendingStructs = pendingClientsStructRefs => {
* *
* This is called when data is received from a remote peer. * This is called when data is received from a remote peer.
* *
* @param {AbstractUpdateDecoder} decoder The decoder object to read data from. * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder The decoder object to read data from.
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {StructStore} store * @param {StructStore} store
* *
@ -405,7 +405,7 @@ export const readStructs = (decoder, transaction, store) => {
* @param {decoding.Decoder} decoder * @param {decoding.Decoder} decoder
* @param {Doc} ydoc * @param {Doc} ydoc
* @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))` * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`
* @param {AbstractUpdateDecoder} [structDecoder] * @param {UpdateDecoderV1 | UpdateDecoderV2} [structDecoder]
* *
* @function * @function
*/ */
@ -509,7 +509,7 @@ export const encodeStateAsUpdate = (doc, encodedTargetStateVector) => encodeStat
/** /**
* Read state vector from Decoder and return as Map * Read state vector from Decoder and return as Map
* *
* @param {AbstractDSDecoder} decoder * @param {DSDecoderV1 | DSDecoderV2} decoder
* @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client. * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.
* *
* @function * @function

View File

@ -12,11 +12,11 @@ import {
mergeDeleteSets, mergeDeleteSets,
DSEncoderV1, DSEncoderV1,
DSEncoderV2, DSEncoderV2,
Item, GC, AbstractUpdateDecoder, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line Item, GC, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line
} from '../internals.js' } from '../internals.js'
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
*/ */
function * lazyStructReaderGenerator (decoder) { function * lazyStructReaderGenerator (decoder) {
const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder) const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder)
@ -61,7 +61,7 @@ function * lazyStructReaderGenerator (decoder) {
export class LazyStructReader { export class LazyStructReader {
/** /**
* @param {AbstractUpdateDecoder} decoder * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
*/ */
constructor (decoder) { constructor (decoder) {
this.gen = lazyStructReaderGenerator(decoder) this.gen = lazyStructReaderGenerator(decoder)

View File

@ -2,23 +2,34 @@ import * as t from 'lib0/testing.js'
import { init, compare } from './testHelper.js' // eslint-disable-line import { init, compare } from './testHelper.js' // eslint-disable-line
import * as Y from '../src/index.js' import * as Y from '../src/index.js'
const useV2 = true const encV1 = {
mergeUpdates: Y.mergeUpdates,
encodeStateAsUpdate: Y.encodeStateAsUpdate,
applyUpdate: Y.applyUpdate,
logUpdate: Y.logUpdate,
updateEventName: 'update'
}
const encodeStateAsUpdate = useV2 ? Y.encodeStateAsUpdateV2 : Y.encodeStateAsUpdate const encV2 = {
const mergeUpdates = useV2 ? Y.mergeUpdatesV2 : Y.mergeUpdates mergeUpdates: Y.mergeUpdatesV2,
const applyUpdate = useV2 ? Y.applyUpdateV2 : Y.applyUpdate encodeStateAsUpdate: Y.encodeStateAsUpdateV2,
const logUpdate = useV2 ? Y.logUpdateV2 : Y.logUpdate applyUpdate: Y.applyUpdateV2,
const updateEventName = useV2 ? 'updateV2' : 'update' logUpdate: Y.logUpdateV2,
updateEventName: 'updateV2'
}
const encoders = [encV1, encV2]
/** /**
* @param {Array<Y.Doc>} users * @param {Array<Y.Doc>} users
* @param {encV1 | encV2} enc
*/ */
const fromUpdates = users => { const fromUpdates = (users, enc) => {
const updates = users.map(user => const updates = users.map(user =>
encodeStateAsUpdate(user) enc.encodeStateAsUpdate(user)
) )
const ydoc = new Y.Doc() const ydoc = new Y.Doc()
applyUpdate(ydoc, mergeUpdates(updates)) enc.applyUpdate(ydoc, enc.mergeUpdates(updates))
return ydoc return ydoc
} }
@ -31,53 +42,56 @@ export const testMergeUpdates = tc => {
array0.insert(0, [1]) array0.insert(0, [1])
array1.insert(0, [2]) array1.insert(0, [2])
const merged = fromUpdates(users)
compare(users) compare(users)
t.compareArrays(array0.toArray(), merged.getArray('array').toArray()) encoders.forEach(enc => {
const merged = fromUpdates(users, enc)
t.compareArrays(array0.toArray(), merged.getArray('array').toArray())
})
} }
/** /**
* @param {Y.Doc} ydoc * @param {Y.Doc} ydoc
* @param {Array<Uint8Array>} updates - expecting at least 4 updates * @param {Array<Uint8Array>} updates - expecting at least 4 updates
* @param {encV1 | encV2} enc
*/ */
const checkUpdateCases = (ydoc, updates) => { const checkUpdateCases = (ydoc, updates, enc) => {
const cases = [] const cases = []
// Case 1: Simple case, simply merge everything // Case 1: Simple case, simply merge everything
cases.push(mergeUpdates(updates)) cases.push(enc.mergeUpdates(updates))
// Case 2: Overlapping updates // Case 2: Overlapping updates
cases.push(mergeUpdates([ cases.push(enc.mergeUpdates([
mergeUpdates(updates.slice(2)), enc.mergeUpdates(updates.slice(2)),
mergeUpdates(updates.slice(0, 2)) enc.mergeUpdates(updates.slice(0, 2))
])) ]))
// Case 3: Overlapping updates // Case 3: Overlapping updates
cases.push(mergeUpdates([ cases.push(enc.mergeUpdates([
mergeUpdates(updates.slice(2)), enc.mergeUpdates(updates.slice(2)),
mergeUpdates(updates.slice(1, 3)), enc.mergeUpdates(updates.slice(1, 3)),
updates[0] updates[0]
])) ]))
// Case 4: Separated updates (containing skips) // Case 4: Separated updates (containing skips)
cases.push(mergeUpdates([ cases.push(enc.mergeUpdates([
mergeUpdates([updates[0], updates[2]]), enc.mergeUpdates([updates[0], updates[2]]),
mergeUpdates([updates[1], updates[3]]), enc.mergeUpdates([updates[1], updates[3]]),
mergeUpdates(updates.slice(4)) enc.mergeUpdates(updates.slice(4))
])) ]))
// Case 5: overlapping with many duplicates // Case 5: overlapping with many duplicates
cases.push(mergeUpdates(cases)) cases.push(enc.mergeUpdates(cases))
const targetState = encodeStateAsUpdate(ydoc) const targetState = enc.encodeStateAsUpdate(ydoc)
t.info('Target State: ') t.info('Target State: ')
logUpdate(targetState) enc.logUpdate(targetState)
cases.forEach((updates, i) => { cases.forEach((updates, i) => {
t.info('State Case $' + i + ':') t.info('State Case $' + i + ':')
logUpdate(updates) enc.logUpdate(updates)
const merged = new Y.Doc() const merged = new Y.Doc()
applyUpdate(merged, updates) enc.applyUpdate(merged, updates)
t.compareArrays(merged.getArray().toArray(), ydoc.getArray().toArray()) t.compareArrays(merged.getArray().toArray(), ydoc.getArray().toArray())
}) })
} }
@ -86,34 +100,40 @@ const checkUpdateCases = (ydoc, updates) => {
* @param {t.TestCase} tc * @param {t.TestCase} tc
*/ */
export const testMergeUpdates1 = tc => { export const testMergeUpdates1 = tc => {
const ydoc = new Y.Doc({ gc: false }) encoders.forEach((enc, i) => {
const updates = /** @type {Array<Uint8Array>} */ ([]) t.info(`Using V${i + 1} encoder.`)
ydoc.on(updateEventName, update => { updates.push(update) }) const ydoc = new Y.Doc({ gc: false })
const updates = /** @type {Array<Uint8Array>} */ ([])
ydoc.on(enc.updateEventName, update => { updates.push(update) })
const array = ydoc.getArray() const array = ydoc.getArray()
array.insert(0, [1]) array.insert(0, [1])
array.insert(0, [2]) array.insert(0, [2])
array.insert(0, [3]) array.insert(0, [3])
array.insert(0, [4]) array.insert(0, [4])
checkUpdateCases(ydoc, updates) checkUpdateCases(ydoc, updates, enc)
})
} }
/** /**
* @param {t.TestCase} tc * @param {t.TestCase} tc
*/ */
export const testMergeUpdates2 = tc => { export const testMergeUpdates2 = tc => {
const ydoc = new Y.Doc({ gc: false }) encoders.forEach((enc, i) => {
const updates = /** @type {Array<Uint8Array>} */ ([]) t.info(`Using V${i + 1} encoder.`)
ydoc.on(updateEventName, update => { updates.push(update) }) const ydoc = new Y.Doc({ gc: false })
const updates = /** @type {Array<Uint8Array>} */ ([])
ydoc.on(enc.updateEventName, update => { updates.push(update) })
const array = ydoc.getArray() const array = ydoc.getArray()
array.insert(0, [1, 2]) array.insert(0, [1, 2])
array.delete(1, 1) array.delete(1, 1)
array.insert(0, [3, 4]) array.insert(0, [3, 4])
array.delete(1, 2) array.delete(1, 2)
checkUpdateCases(ydoc, updates) checkUpdateCases(ydoc, updates, enc)
})
} }
/** /**