test with all encoders
This commit is contained in:
		
							parent
							
								
									4c929c6808
								
							
						
					
					
						commit
						0a40b541e8
					
				@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateEncoder, ID, Transaction // eslint-disable-line
 | 
			
		||||
  UpdateEncoderV1, UpdateEncoderV2, ID, Transaction // eslint-disable-line
 | 
			
		||||
} from '../internals.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} encodingRef
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
  UpdateEncoderV1, UpdateEncoderV2, UpdateDecoderV1, UpdateDecoderV2, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
export class ContentAny {
 | 
			
		||||
@ -74,7 +74,7 @@ export class ContentAny {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -95,7 +95,7 @@ export class ContentAny {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentAny}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentAny = decoder => {
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
@ -70,7 +70,7 @@ export class ContentBinary {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -86,7 +86,7 @@ export class ContentBinary {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder
 | 
			
		||||
 * @return {ContentBinary}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentBinary = decoder => new ContentBinary(decoder.readBuf())
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  addToDeleteSet,
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
export class ContentDeleted {
 | 
			
		||||
@ -77,7 +77,7 @@ export class ContentDeleted {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -95,7 +95,7 @@ export class ContentDeleted {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder
 | 
			
		||||
 * @return {ContentDeleted}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentDeleted = decoder => new ContentDeleted(decoder.readLen())
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  Doc, AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Transaction, Item // eslint-disable-line
 | 
			
		||||
  Doc, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, Item // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
@ -110,7 +110,7 @@ export class ContentDoc {
 | 
			
		||||
  gc (store) { }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -129,7 +129,7 @@ export class ContentDoc {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentDoc}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentDoc = decoder => new ContentDoc(new Doc({ guid: decoder.readString(), ...decoder.readAny() }))
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
@ -74,7 +74,7 @@ export class ContentEmbed {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -92,7 +92,7 @@ export class ContentEmbed {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentEmbed}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentEmbed = decoder => new ContentEmbed(decoder.readJSON())
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AbstractType, AbstractUpdateDecoder, AbstractUpdateEncoder, Item, StructStore, Transaction // eslint-disable-line
 | 
			
		||||
  AbstractType, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Item, StructStore, Transaction // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
@ -80,7 +80,7 @@ export class ContentFormat {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -97,7 +97,7 @@ export class ContentFormat {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentFormat}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentFormat = decoder => new ContentFormat(decoder.readString(), decoder.readJSON())
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -77,7 +77,7 @@ export class ContentJSON {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -100,7 +100,7 @@ export class ContentJSON {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentJSON}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentJSON = decoder => {
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import {
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -88,7 +88,7 @@ export class ContentString {
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {}
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -106,7 +106,7 @@ export class ContentString {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentString}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentString = decoder => new ContentString(decoder.readString())
 | 
			
		||||
 | 
			
		||||
@ -7,13 +7,13 @@ import {
 | 
			
		||||
  readYXmlFragment,
 | 
			
		||||
  readYXmlHook,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @type {Array<function(AbstractUpdateDecoder):AbstractType<any>>}
 | 
			
		||||
 * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractType<any>>}
 | 
			
		||||
 * @private
 | 
			
		||||
 */
 | 
			
		||||
export const typeRefs = [
 | 
			
		||||
@ -148,7 +148,7 @@ export class ContentType {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -166,7 +166,7 @@ export class ContentType {
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
 *
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {ContentType}
 | 
			
		||||
 */
 | 
			
		||||
export const readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder))
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  AbstractStruct,
 | 
			
		||||
  addStruct,
 | 
			
		||||
  AbstractUpdateEncoder, StructStore, Transaction, ID // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
export const structGCRefNumber = 0
 | 
			
		||||
@ -42,7 +42,7 @@ export class GC extends AbstractStruct {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ import {
 | 
			
		||||
  readContentFormat,
 | 
			
		||||
  readContentType,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
   *
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder The encoder to write data to.
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
@ -670,7 +670,7 @@ export class Item extends AbstractStruct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @param {number} info
 | 
			
		||||
 */
 | 
			
		||||
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.
 | 
			
		||||
 *
 | 
			
		||||
 * @type {Array<function(AbstractUpdateDecoder):AbstractContent>}
 | 
			
		||||
 * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractContent>}
 | 
			
		||||
 */
 | 
			
		||||
export const contentRefs = [
 | 
			
		||||
  () => { error.unexpectedCase() }, // GC is not ItemContent
 | 
			
		||||
@ -771,7 +771,7 @@ export class AbstractContent {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AbstractStruct,
 | 
			
		||||
  AbstractUpdateEncoder, StructStore, Transaction, ID // eslint-disable-line
 | 
			
		||||
  UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line
 | 
			
		||||
} from '../internals.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
 | 
			
		||||
   */
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ import {
 | 
			
		||||
  ContentAny,
 | 
			
		||||
  ContentBinary,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
import * as map from 'lib0/map.js'
 | 
			
		||||
@ -324,7 +324,7 @@ export class AbstractType {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   */
 | 
			
		||||
  _write (encoder) { }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ import {
 | 
			
		||||
  YArrayRefID,
 | 
			
		||||
  callTypeObservers,
 | 
			
		||||
  transact,
 | 
			
		||||
  ArraySearchMarker, AbstractUpdateDecoder, AbstractUpdateEncoder, Doc, Transaction, Item // eslint-disable-line
 | 
			
		||||
  ArraySearchMarker, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
import { typeListSlice } from './AbstractType.js'
 | 
			
		||||
 | 
			
		||||
@ -241,7 +241,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   */
 | 
			
		||||
  _write (encoder) {
 | 
			
		||||
    encoder.writeTypeRef(YArrayRefID)
 | 
			
		||||
@ -249,7 +249,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 * @function
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ import {
 | 
			
		||||
  YMapRefID,
 | 
			
		||||
  callTypeObservers,
 | 
			
		||||
  transact,
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder, Doc, Transaction, Item // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line
 | 
			
		||||
} from '../internals.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) {
 | 
			
		||||
    encoder.writeTypeRef(YMapRefID)
 | 
			
		||||
@ -246,7 +246,7 @@ export class YMap extends AbstractType {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 * @function
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@ import {
 | 
			
		||||
  typeMapGet,
 | 
			
		||||
  typeMapGetAll,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
    encoder.writeTypeRef(YTextRefID)
 | 
			
		||||
@ -1211,7 +1211,7 @@ export class YText extends AbstractType {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {YText}
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ import {
 | 
			
		||||
  typeMapGetAll,
 | 
			
		||||
  typeListForEach,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -208,7 +208,7 @@ export class YXmlElement extends YXmlFragment {
 | 
			
		||||
   *
 | 
			
		||||
   * 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) {
 | 
			
		||||
    encoder.writeTypeRef(YXmlElementRefID)
 | 
			
		||||
@ -217,7 +217,7 @@ export class YXmlElement extends YXmlFragment {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {YXmlElement}
 | 
			
		||||
 *
 | 
			
		||||
 * @function
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ import {
 | 
			
		||||
  transact,
 | 
			
		||||
  typeListGet,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
   *
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder The encoder to write data to.
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
 | 
			
		||||
   */
 | 
			
		||||
  _write (encoder) {
 | 
			
		||||
    encoder.writeTypeRef(YXmlFragmentRefID)
 | 
			
		||||
@ -418,7 +418,7 @@ export class YXmlFragment extends AbstractType {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {YXmlFragment}
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  YMap,
 | 
			
		||||
  YXmlHookRefID,
 | 
			
		||||
  AbstractUpdateDecoder, AbstractUpdateEncoder // eslint-disable-line
 | 
			
		||||
  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -76,7 +76,7 @@ export class YXmlHook extends YMap {
 | 
			
		||||
   *
 | 
			
		||||
   * 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) {
 | 
			
		||||
    encoder.writeTypeRef(YXmlHookRefID)
 | 
			
		||||
@ -85,7 +85,7 @@ export class YXmlHook extends YMap {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {YXmlHook}
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
import {
 | 
			
		||||
  YText,
 | 
			
		||||
  YXmlTextRefID,
 | 
			
		||||
  ContentType, YXmlElement, AbstractUpdateDecoder, AbstractUpdateEncoder // eslint-disable-line
 | 
			
		||||
  ContentType, YXmlElement, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -104,7 +104,7 @@ export class YXmlText extends YText {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
   */
 | 
			
		||||
  _write (encoder) {
 | 
			
		||||
    encoder.writeTypeRef(YXmlTextRefID)
 | 
			
		||||
@ -112,7 +112,7 @@ export class YXmlText extends YText {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 * @return {YXmlText}
 | 
			
		||||
 *
 | 
			
		||||
 * @private
 | 
			
		||||
 | 
			
		||||
@ -15,14 +15,13 @@ import {
 | 
			
		||||
  findIndexSS,
 | 
			
		||||
  UpdateEncoderV2,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
import * as map from 'lib0/map.js'
 | 
			
		||||
import * as set from 'lib0/set.js'
 | 
			
		||||
import * as decoding from 'lib0/decoding.js'
 | 
			
		||||
import * as encoding from 'lib0/encoding.js'
 | 
			
		||||
import { DSEncoderV1 } from './UpdateEncoder.js'
 | 
			
		||||
 | 
			
		||||
export class Snapshot {
 | 
			
		||||
  /**
 | 
			
		||||
@ -95,7 +94,7 @@ export const encodeSnapshot = snapshot => encodeSnapshotV2(snapshot, new DSEncod
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {Uint8Array} buf
 | 
			
		||||
 * @param {AbstractDSDecoder} [decoder]
 | 
			
		||||
 * @param {DSDecoderV1 | DSDecoderV2} [decoder]
 | 
			
		||||
 * @return {Snapshot}
 | 
			
		||||
 */
 | 
			
		||||
export const decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => {
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ import {
 | 
			
		||||
  Item,
 | 
			
		||||
  generateNewClientId,
 | 
			
		||||
  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'
 | 
			
		||||
 | 
			
		||||
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 logging from 'lib0/logging.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
 | 
			
		||||
@ -119,7 +118,7 @@ export class Transaction {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateEncoder} encoder
 | 
			
		||||
 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
 | 
			
		||||
 * @param {Transaction} transaction
 | 
			
		||||
 * @return {boolean} Whether data was written.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@ -1,132 +1,9 @@
 | 
			
		||||
import * as buffer from 'lib0/buffer.js'
 | 
			
		||||
import * as error from 'lib0/error.js'
 | 
			
		||||
import * as decoding from 'lib0/decoding.js'
 | 
			
		||||
import {
 | 
			
		||||
  ID, createID
 | 
			
		||||
} 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 {
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {decoding.Decoder} decoder
 | 
			
		||||
@ -250,6 +127,9 @@ export class DSDecoderV2 {
 | 
			
		||||
   * @param {decoding.Decoder} decoder
 | 
			
		||||
   */
 | 
			
		||||
  constructor (decoder) {
 | 
			
		||||
    /**
 | 
			
		||||
     * @private
 | 
			
		||||
     */
 | 
			
		||||
    this.dsCurrVal = 0
 | 
			
		||||
    this.restDecoder = decoder
 | 
			
		||||
  }
 | 
			
		||||
@ -258,11 +138,17 @@ export class DSDecoderV2 {
 | 
			
		||||
    this.dsCurrVal = 0
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  readDsClock () {
 | 
			
		||||
    this.dsCurrVal += decoding.readVarUint(this.restDecoder)
 | 
			
		||||
    return this.dsCurrVal
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  readDsLen () {
 | 
			
		||||
    const diff = decoding.readVarUint(this.restDecoder) + 1
 | 
			
		||||
    this.dsCurrVal += diff
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ import {
 | 
			
		||||
  DSEncoderV2,
 | 
			
		||||
  DSDecoderV1,
 | 
			
		||||
  DSEncoderV1,
 | 
			
		||||
  AbstractDSDecoder, AbstractUpdateDecoder, Doc, Transaction, GC, Item, StructStore, ID // eslint-disable-line
 | 
			
		||||
  Doc, Transaction, GC, Item, StructStore, ID // eslint-disable-line
 | 
			
		||||
} from '../internals.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 {Doc} doc
 | 
			
		||||
 * @return {Map<number,Array<GC|Item>>}
 | 
			
		||||
@ -370,7 +370,7 @@ const cleanupPendingStructs = pendingClientsStructRefs => {
 | 
			
		||||
 *
 | 
			
		||||
 * 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 {StructStore} store
 | 
			
		||||
 *
 | 
			
		||||
@ -405,7 +405,7 @@ export const readStructs = (decoder, transaction, store) => {
 | 
			
		||||
 * @param {decoding.Decoder} decoder
 | 
			
		||||
 * @param {Doc} ydoc
 | 
			
		||||
 * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`
 | 
			
		||||
 * @param {AbstractUpdateDecoder} [structDecoder]
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} [structDecoder]
 | 
			
		||||
 *
 | 
			
		||||
 * @function
 | 
			
		||||
 */
 | 
			
		||||
@ -509,7 +509,7 @@ export const encodeStateAsUpdate = (doc, encodedTargetStateVector) => encodeStat
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @function
 | 
			
		||||
 | 
			
		||||
@ -12,11 +12,11 @@ import {
 | 
			
		||||
  mergeDeleteSets,
 | 
			
		||||
  DSEncoderV1,
 | 
			
		||||
  DSEncoderV2,
 | 
			
		||||
  Item, GC, AbstractUpdateDecoder, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line
 | 
			
		||||
  Item, GC, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line
 | 
			
		||||
} from '../internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
 */
 | 
			
		||||
function * lazyStructReaderGenerator (decoder) {
 | 
			
		||||
  const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder)
 | 
			
		||||
@ -61,7 +61,7 @@ function * lazyStructReaderGenerator (decoder) {
 | 
			
		||||
 | 
			
		||||
export class LazyStructReader {
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractUpdateDecoder} decoder
 | 
			
		||||
   * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
 | 
			
		||||
   */
 | 
			
		||||
  constructor (decoder) {
 | 
			
		||||
    this.gen = lazyStructReaderGenerator(decoder)
 | 
			
		||||
 | 
			
		||||
@ -2,23 +2,34 @@ import * as t from 'lib0/testing.js'
 | 
			
		||||
import { init, compare } from './testHelper.js' // eslint-disable-line
 | 
			
		||||
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 mergeUpdates = useV2 ? Y.mergeUpdatesV2 : Y.mergeUpdates
 | 
			
		||||
const applyUpdate = useV2 ? Y.applyUpdateV2 : Y.applyUpdate
 | 
			
		||||
const logUpdate = useV2 ? Y.logUpdateV2 : Y.logUpdate
 | 
			
		||||
const updateEventName = useV2 ? 'updateV2' : 'update'
 | 
			
		||||
const encV2 = {
 | 
			
		||||
  mergeUpdates: Y.mergeUpdatesV2,
 | 
			
		||||
  encodeStateAsUpdate: Y.encodeStateAsUpdateV2,
 | 
			
		||||
  applyUpdate: Y.applyUpdateV2,
 | 
			
		||||
  logUpdate: Y.logUpdateV2,
 | 
			
		||||
  updateEventName: 'updateV2'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const encoders = [encV1, encV2]
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {Array<Y.Doc>} users
 | 
			
		||||
 * @param {encV1 | encV2} enc
 | 
			
		||||
 */
 | 
			
		||||
const fromUpdates = users => {
 | 
			
		||||
const fromUpdates = (users, enc) => {
 | 
			
		||||
  const updates = users.map(user =>
 | 
			
		||||
    encodeStateAsUpdate(user)
 | 
			
		||||
    enc.encodeStateAsUpdate(user)
 | 
			
		||||
  )
 | 
			
		||||
  const ydoc = new Y.Doc()
 | 
			
		||||
  applyUpdate(ydoc, mergeUpdates(updates))
 | 
			
		||||
  enc.applyUpdate(ydoc, enc.mergeUpdates(updates))
 | 
			
		||||
  return ydoc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -31,53 +42,56 @@ export const testMergeUpdates = tc => {
 | 
			
		||||
  array0.insert(0, [1])
 | 
			
		||||
  array1.insert(0, [2])
 | 
			
		||||
 | 
			
		||||
  const merged = fromUpdates(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 {Array<Uint8Array>} updates - expecting at least 4 updates
 | 
			
		||||
 * @param {encV1 | encV2} enc
 | 
			
		||||
 */
 | 
			
		||||
const checkUpdateCases = (ydoc, updates) => {
 | 
			
		||||
const checkUpdateCases = (ydoc, updates, enc) => {
 | 
			
		||||
  const cases = []
 | 
			
		||||
 | 
			
		||||
  // Case 1: Simple case, simply merge everything
 | 
			
		||||
  cases.push(mergeUpdates(updates))
 | 
			
		||||
  cases.push(enc.mergeUpdates(updates))
 | 
			
		||||
 | 
			
		||||
  // Case 2: Overlapping updates
 | 
			
		||||
  cases.push(mergeUpdates([
 | 
			
		||||
    mergeUpdates(updates.slice(2)),
 | 
			
		||||
    mergeUpdates(updates.slice(0, 2))
 | 
			
		||||
  cases.push(enc.mergeUpdates([
 | 
			
		||||
    enc.mergeUpdates(updates.slice(2)),
 | 
			
		||||
    enc.mergeUpdates(updates.slice(0, 2))
 | 
			
		||||
  ]))
 | 
			
		||||
 | 
			
		||||
  // Case 3: Overlapping updates
 | 
			
		||||
  cases.push(mergeUpdates([
 | 
			
		||||
    mergeUpdates(updates.slice(2)),
 | 
			
		||||
    mergeUpdates(updates.slice(1, 3)),
 | 
			
		||||
  cases.push(enc.mergeUpdates([
 | 
			
		||||
    enc.mergeUpdates(updates.slice(2)),
 | 
			
		||||
    enc.mergeUpdates(updates.slice(1, 3)),
 | 
			
		||||
    updates[0]
 | 
			
		||||
  ]))
 | 
			
		||||
 | 
			
		||||
  // Case 4: Separated updates (containing skips)
 | 
			
		||||
  cases.push(mergeUpdates([
 | 
			
		||||
    mergeUpdates([updates[0], updates[2]]),
 | 
			
		||||
    mergeUpdates([updates[1], updates[3]]),
 | 
			
		||||
    mergeUpdates(updates.slice(4))
 | 
			
		||||
  cases.push(enc.mergeUpdates([
 | 
			
		||||
    enc.mergeUpdates([updates[0], updates[2]]),
 | 
			
		||||
    enc.mergeUpdates([updates[1], updates[3]]),
 | 
			
		||||
    enc.mergeUpdates(updates.slice(4))
 | 
			
		||||
  ]))
 | 
			
		||||
 | 
			
		||||
  // 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: ')
 | 
			
		||||
  logUpdate(targetState)
 | 
			
		||||
  enc.logUpdate(targetState)
 | 
			
		||||
 | 
			
		||||
  cases.forEach((updates, i) => {
 | 
			
		||||
    t.info('State Case $' + i + ':')
 | 
			
		||||
    logUpdate(updates)
 | 
			
		||||
    enc.logUpdate(updates)
 | 
			
		||||
    const merged = new Y.Doc()
 | 
			
		||||
    applyUpdate(merged, updates)
 | 
			
		||||
    enc.applyUpdate(merged, updates)
 | 
			
		||||
    t.compareArrays(merged.getArray().toArray(), ydoc.getArray().toArray())
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
@ -86,34 +100,40 @@ const checkUpdateCases = (ydoc, updates) => {
 | 
			
		||||
 * @param {t.TestCase} tc
 | 
			
		||||
 */
 | 
			
		||||
export const testMergeUpdates1 = tc => {
 | 
			
		||||
  const ydoc = new Y.Doc({ gc: false })
 | 
			
		||||
  const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
			
		||||
  ydoc.on(updateEventName, update => { updates.push(update) })
 | 
			
		||||
  encoders.forEach((enc, i) => {
 | 
			
		||||
    t.info(`Using V${i + 1} encoder.`)
 | 
			
		||||
    const ydoc = new Y.Doc({ gc: false })
 | 
			
		||||
    const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
			
		||||
    ydoc.on(enc.updateEventName, update => { updates.push(update) })
 | 
			
		||||
 | 
			
		||||
  const array = ydoc.getArray()
 | 
			
		||||
  array.insert(0, [1])
 | 
			
		||||
  array.insert(0, [2])
 | 
			
		||||
  array.insert(0, [3])
 | 
			
		||||
  array.insert(0, [4])
 | 
			
		||||
    const array = ydoc.getArray()
 | 
			
		||||
    array.insert(0, [1])
 | 
			
		||||
    array.insert(0, [2])
 | 
			
		||||
    array.insert(0, [3])
 | 
			
		||||
    array.insert(0, [4])
 | 
			
		||||
 | 
			
		||||
  checkUpdateCases(ydoc, updates)
 | 
			
		||||
    checkUpdateCases(ydoc, updates, enc)
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {t.TestCase} tc
 | 
			
		||||
 */
 | 
			
		||||
export const testMergeUpdates2 = tc => {
 | 
			
		||||
  const ydoc = new Y.Doc({ gc: false })
 | 
			
		||||
  const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
			
		||||
  ydoc.on(updateEventName, update => { updates.push(update) })
 | 
			
		||||
  encoders.forEach((enc, i) => {
 | 
			
		||||
    t.info(`Using V${i + 1} encoder.`)
 | 
			
		||||
    const ydoc = new Y.Doc({ gc: false })
 | 
			
		||||
    const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
			
		||||
    ydoc.on(enc.updateEventName, update => { updates.push(update) })
 | 
			
		||||
 | 
			
		||||
  const array = ydoc.getArray()
 | 
			
		||||
  array.insert(0, [1, 2])
 | 
			
		||||
  array.delete(1, 1)
 | 
			
		||||
  array.insert(0, [3, 4])
 | 
			
		||||
  array.delete(1, 2)
 | 
			
		||||
    const array = ydoc.getArray()
 | 
			
		||||
    array.insert(0, [1, 2])
 | 
			
		||||
    array.delete(1, 1)
 | 
			
		||||
    array.insert(0, [3, 4])
 | 
			
		||||
    array.delete(1, 2)
 | 
			
		||||
 | 
			
		||||
  checkUpdateCases(ydoc, updates)
 | 
			
		||||
    checkUpdateCases(ydoc, updates, enc)
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user