migrate to ObservableV2
This commit is contained in:
		
							parent
							
								
									53173a9ea7
								
							
						
					
					
						commit
						541306b254
					
				@ -1,4 +1,4 @@
 | 
				
			|||||||
import { Observable } from 'lib0/observable'
 | 
					import { ObservableV2 } from 'lib0/observable'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  Doc // eslint-disable-line
 | 
					  Doc // eslint-disable-line
 | 
				
			||||||
@ -10,9 +10,9 @@ import {
 | 
				
			|||||||
 * @note This interface is experimental and it is not advised to actually inherit this class.
 | 
					 * @note This interface is experimental and it is not advised to actually inherit this class.
 | 
				
			||||||
 *       It just serves as typing information.
 | 
					 *       It just serves as typing information.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @extends {Observable<any>}
 | 
					 * @extends {ObservableV2<any>}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export class AbstractConnector extends Observable {
 | 
					export class AbstractConnector extends ObservableV2 {
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * @param {Doc} ydoc
 | 
					   * @param {Doc} ydoc
 | 
				
			||||||
   * @param {any} awareness
 | 
					   * @param {any} awareness
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ import {
 | 
				
			|||||||
  ContentDoc, Item, Transaction, YEvent // eslint-disable-line
 | 
					  ContentDoc, Item, Transaction, YEvent // eslint-disable-line
 | 
				
			||||||
} from '../internals.js'
 | 
					} from '../internals.js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Observable } from 'lib0/observable'
 | 
					import { ObservableV2 } from 'lib0/observable'
 | 
				
			||||||
import * as random from 'lib0/random'
 | 
					import * as random from 'lib0/random'
 | 
				
			||||||
import * as map from 'lib0/map'
 | 
					import * as map from 'lib0/map'
 | 
				
			||||||
import * as array from 'lib0/array'
 | 
					import * as array from 'lib0/array'
 | 
				
			||||||
@ -34,10 +34,26 @@ export const generateNewClientId = random.uint32
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * A Yjs instance handles the state of shared data.
 | 
					 * @typedef {Object} DocEvents
 | 
				
			||||||
 * @extends Observable<string>
 | 
					 * @property {function(Doc):void} DocEvents.destroy
 | 
				
			||||||
 | 
					 * @property {function(Doc):void} DocEvents.load
 | 
				
			||||||
 | 
					 * @property {function(boolean, Doc):void} DocEvents.sync
 | 
				
			||||||
 | 
					 * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.update
 | 
				
			||||||
 | 
					 * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.updateV2
 | 
				
			||||||
 | 
					 * @property {function(Doc):void} DocEvents.beforeAllTransactions
 | 
				
			||||||
 | 
					 * @property {function(Transaction, Doc):void} DocEvents.beforeTransaction
 | 
				
			||||||
 | 
					 * @property {function(Transaction, Doc):void} DocEvents.beforeObserverCalls
 | 
				
			||||||
 | 
					 * @property {function(Transaction, Doc):void} DocEvents.afterTransaction
 | 
				
			||||||
 | 
					 * @property {function(Transaction, Doc):void} DocEvents.afterTransactionCleanup
 | 
				
			||||||
 | 
					 * @property {function(Doc, Array<Transaction>):void} DocEvents.afterAllTransactions
 | 
				
			||||||
 | 
					 * @property {function({ loaded: Set<Doc>, added: Set<Doc>, removed: Set<Doc> }, Doc, Transaction):void} DocEvents.subdocs
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export class Doc extends Observable {
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A Yjs instance handles the state of shared data.
 | 
				
			||||||
 | 
					 * @extends ObservableV2<DocEvents>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class Doc extends ObservableV2 {
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * @param {DocOpts} opts configuration
 | 
					   * @param {DocOpts} opts configuration
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
@ -115,7 +131,7 @@ export class Doc extends Observable {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      this.isSynced = isSynced === undefined || isSynced === true
 | 
					      this.isSynced = isSynced === undefined || isSynced === true
 | 
				
			||||||
      if (this.isSynced && !this.isLoaded) {
 | 
					      if (this.isSynced && !this.isLoaded) {
 | 
				
			||||||
        this.emit('load', [])
 | 
					        this.emit('load', [this])
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -321,24 +337,9 @@ export class Doc extends Observable {
 | 
				
			|||||||
        transaction.subdocsRemoved.add(this)
 | 
					        transaction.subdocsRemoved.add(this)
 | 
				
			||||||
      }, null, true)
 | 
					      }, null, true)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    this.emit('destroyed', [true])
 | 
					    // @ts-ignore
 | 
				
			||||||
 | 
					    this.emit('destroyed', [true]) // DEPRECATED!
 | 
				
			||||||
    this.emit('destroy', [this])
 | 
					    this.emit('destroy', [this])
 | 
				
			||||||
    super.destroy()
 | 
					    super.destroy()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
   * @param {string} eventName
 | 
					 | 
				
			||||||
   * @param {function(...any):any} f
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  on (eventName, f) {
 | 
					 | 
				
			||||||
    super.on(eventName, f)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /**
 | 
					 | 
				
			||||||
   * @param {string} eventName
 | 
					 | 
				
			||||||
   * @param {function} f
 | 
					 | 
				
			||||||
   */
 | 
					 | 
				
			||||||
  off (eventName, f) {
 | 
					 | 
				
			||||||
    super.off(eventName, f)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,13 +10,13 @@ import {
 | 
				
			|||||||
  getItemCleanStart,
 | 
					  getItemCleanStart,
 | 
				
			||||||
  isDeleted,
 | 
					  isDeleted,
 | 
				
			||||||
  addToDeleteSet,
 | 
					  addToDeleteSet,
 | 
				
			||||||
  Transaction, Doc, Item, GC, DeleteSet, AbstractType // eslint-disable-line
 | 
					  YEvent, Transaction, Doc, Item, GC, DeleteSet, AbstractType // eslint-disable-line
 | 
				
			||||||
} from '../internals.js'
 | 
					} from '../internals.js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as time from 'lib0/time'
 | 
					import * as time from 'lib0/time'
 | 
				
			||||||
import * as array from 'lib0/array'
 | 
					import * as array from 'lib0/array'
 | 
				
			||||||
import * as logging from 'lib0/logging'
 | 
					import * as logging from 'lib0/logging'
 | 
				
			||||||
import { Observable } from 'lib0/observable'
 | 
					import { ObservableV2 } from 'lib0/observable'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class StackItem {
 | 
					export class StackItem {
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
@ -48,7 +48,7 @@ const clearUndoManagerStackItem = (tr, um, stackItem) => {
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {UndoManager} undoManager
 | 
					 * @param {UndoManager} undoManager
 | 
				
			||||||
 * @param {Array<StackItem>} stack
 | 
					 * @param {Array<StackItem>} stack
 | 
				
			||||||
 * @param {string} eventType
 | 
					 * @param {'undo'|'redo'} eventType
 | 
				
			||||||
 * @return {StackItem?}
 | 
					 * @return {StackItem?}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
const popStackItem = (undoManager, stack, eventType) => {
 | 
					const popStackItem = (undoManager, stack, eventType) => {
 | 
				
			||||||
@ -120,7 +120,7 @@ const popStackItem = (undoManager, stack, eventType) => {
 | 
				
			|||||||
  }, undoManager)
 | 
					  }, undoManager)
 | 
				
			||||||
  if (undoManager.currStackItem != null) {
 | 
					  if (undoManager.currStackItem != null) {
 | 
				
			||||||
    const changedParentTypes = _tr.changedParentTypes
 | 
					    const changedParentTypes = _tr.changedParentTypes
 | 
				
			||||||
    undoManager.emit('stack-item-popped', [{ stackItem: undoManager.currStackItem, type: eventType, changedParentTypes }, undoManager])
 | 
					    undoManager.emit('stack-item-popped', [{ stackItem: undoManager.currStackItem, type: eventType, changedParentTypes, origin: undoManager }, undoManager])
 | 
				
			||||||
    undoManager.currStackItem = null
 | 
					    undoManager.currStackItem = null
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return undoManager.currStackItem
 | 
					  return undoManager.currStackItem
 | 
				
			||||||
@ -139,6 +139,14 @@ const popStackItem = (undoManager, stack, eventType) => {
 | 
				
			|||||||
 * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty.
 | 
					 * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef {Object} StackItemEvent
 | 
				
			||||||
 | 
					 * @property {StackItem} StackItemEvent.stackItem
 | 
				
			||||||
 | 
					 * @property {any} StackItemEvent.origin
 | 
				
			||||||
 | 
					 * @property {'undo'|'redo'} StackItemEvent.type
 | 
				
			||||||
 | 
					 * @property {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>} StackItemEvent.changedParentTypes
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Fires 'stack-item-added' event when a stack item was added to either the undo- or
 | 
					 * Fires 'stack-item-added' event when a stack item was added to either the undo- or
 | 
				
			||||||
 * the redo-stack. You may store additional stack information via the
 | 
					 * the redo-stack. You may store additional stack information via the
 | 
				
			||||||
@ -146,9 +154,9 @@ const popStackItem = (undoManager, stack, eventType) => {
 | 
				
			|||||||
 * Fires 'stack-item-popped' event when a stack item was popped from either the
 | 
					 * Fires 'stack-item-popped' event when a stack item was popped from either the
 | 
				
			||||||
 * undo- or the redo-stack. You may restore the saved stack information from `event.stackItem.meta`.
 | 
					 * undo- or the redo-stack. You may restore the saved stack information from `event.stackItem.meta`.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @extends {Observable<'stack-item-added'|'stack-item-popped'|'stack-cleared'|'stack-item-updated'>}
 | 
					 * @extends {ObservableV2<{'stack-item-added':function(StackItemEvent, UndoManager):void, 'stack-item-popped': function(StackItemEvent, UndoManager):void, 'stack-cleared': function({ undoStackCleared: boolean, redoStackCleared: boolean }):void, 'stack-item-updated': function(StackItemEvent, UndoManager):void }>}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export class UndoManager extends Observable {
 | 
					export class UndoManager extends ObservableV2 {
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * @param {AbstractType<any>|Array<AbstractType<any>>} typeScope Accepts either a single type, or an array of types
 | 
					   * @param {AbstractType<any>|Array<AbstractType<any>>} typeScope Accepts either a single type, or an array of types
 | 
				
			||||||
   * @param {UndoManagerOptions} options
 | 
					   * @param {UndoManagerOptions} options
 | 
				
			||||||
@ -246,6 +254,9 @@ export class UndoManager extends Observable {
 | 
				
			|||||||
          keepItem(item, true)
 | 
					          keepItem(item, true)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					      /**
 | 
				
			||||||
 | 
					       * @type {[StackItemEvent, UndoManager]}
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
      const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? 'redo' : 'undo', changedParentTypes: transaction.changedParentTypes }, this]
 | 
					      const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? 'redo' : 'undo', changedParentTypes: transaction.changedParentTypes }, this]
 | 
				
			||||||
      if (didAdd) {
 | 
					      if (didAdd) {
 | 
				
			||||||
        this.emit('stack-item-added', changeEvent)
 | 
					        this.emit('stack-item-added', changeEvent)
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ export const encV1 = {
 | 
				
			|||||||
  mergeUpdates: Y.mergeUpdates,
 | 
					  mergeUpdates: Y.mergeUpdates,
 | 
				
			||||||
  applyUpdate: Y.applyUpdate,
 | 
					  applyUpdate: Y.applyUpdate,
 | 
				
			||||||
  logUpdate: Y.logUpdate,
 | 
					  logUpdate: Y.logUpdate,
 | 
				
			||||||
  updateEventName: 'update',
 | 
					  updateEventName: /** @type {'update'} */ ('update'),
 | 
				
			||||||
  diffUpdate: Y.diffUpdate
 | 
					  diffUpdate: Y.diffUpdate
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -43,7 +43,7 @@ export const encV2 = {
 | 
				
			|||||||
  mergeUpdates: Y.mergeUpdatesV2,
 | 
					  mergeUpdates: Y.mergeUpdatesV2,
 | 
				
			||||||
  applyUpdate: Y.applyUpdateV2,
 | 
					  applyUpdate: Y.applyUpdateV2,
 | 
				
			||||||
  logUpdate: Y.logUpdateV2,
 | 
					  logUpdate: Y.logUpdateV2,
 | 
				
			||||||
  updateEventName: 'updateV2',
 | 
					  updateEventName: /** @type {'updateV2'} */ ('updateV2'),
 | 
				
			||||||
  diffUpdate: Y.diffUpdateV2
 | 
					  diffUpdate: Y.diffUpdateV2
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import * as object from 'lib0/object'
 | 
				
			|||||||
 * @property {function(Uint8Array):{from:Map<number,number>,to:Map<number,number>}} Enc.parseUpdateMeta
 | 
					 * @property {function(Uint8Array):{from:Map<number,number>,to:Map<number,number>}} Enc.parseUpdateMeta
 | 
				
			||||||
 * @property {function(Y.Doc):Uint8Array} Enc.encodeStateVector
 | 
					 * @property {function(Y.Doc):Uint8Array} Enc.encodeStateVector
 | 
				
			||||||
 * @property {function(Uint8Array):Uint8Array} Enc.encodeStateVectorFromUpdate
 | 
					 * @property {function(Uint8Array):Uint8Array} Enc.encodeStateVectorFromUpdate
 | 
				
			||||||
 * @property {string} Enc.updateEventName
 | 
					 * @property {'update'|'updateV2'} Enc.updateEventName
 | 
				
			||||||
 * @property {string} Enc.description
 | 
					 * @property {string} Enc.description
 | 
				
			||||||
 * @property {function(Uint8Array, Uint8Array):Uint8Array} Enc.diffUpdate
 | 
					 * @property {function(Uint8Array, Uint8Array):Uint8Array} Enc.diffUpdate
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -169,7 +169,7 @@ const checkUpdateCases = (ydoc, updates, enc, hasDeletes) => {
 | 
				
			|||||||
  // t.info('Target State: ')
 | 
					  // t.info('Target State: ')
 | 
				
			||||||
  // enc.logUpdate(targetState)
 | 
					  // enc.logUpdate(targetState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cases.forEach((mergedUpdates, i) => {
 | 
					  cases.forEach((mergedUpdates) => {
 | 
				
			||||||
    // t.info('State Case $' + i + ':')
 | 
					    // t.info('State Case $' + i + ':')
 | 
				
			||||||
    // enc.logUpdate(updates)
 | 
					    // enc.logUpdate(updates)
 | 
				
			||||||
    const merged = new Y.Doc({ gc: false })
 | 
					    const merged = new Y.Doc({ gc: false })
 | 
				
			||||||
@ -218,10 +218,10 @@ const checkUpdateCases = (ydoc, updates, enc, hasDeletes) => {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {t.TestCase} tc
 | 
					 * @param {t.TestCase} _tc
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const testMergeUpdates1 = tc => {
 | 
					export const testMergeUpdates1 = _tc => {
 | 
				
			||||||
  encoders.forEach((enc, i) => {
 | 
					  encoders.forEach((enc) => {
 | 
				
			||||||
    t.info(`Using encoder: ${enc.description}`)
 | 
					    t.info(`Using encoder: ${enc.description}`)
 | 
				
			||||||
    const ydoc = new Y.Doc({ gc: false })
 | 
					    const ydoc = new Y.Doc({ gc: false })
 | 
				
			||||||
    const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
					    const updates = /** @type {Array<Uint8Array>} */ ([])
 | 
				
			||||||
@ -299,16 +299,16 @@ export const testMergePendingUpdates = tc => {
 | 
				
			|||||||
  Y.applyUpdate(yDoc5, update4)
 | 
					  Y.applyUpdate(yDoc5, update4)
 | 
				
			||||||
  Y.applyUpdate(yDoc5, serverUpdates[4])
 | 
					  Y.applyUpdate(yDoc5, serverUpdates[4])
 | 
				
			||||||
  // @ts-ignore
 | 
					  // @ts-ignore
 | 
				
			||||||
  const update5 = Y.encodeStateAsUpdate(yDoc5) // eslint-disable-line
 | 
					  const _update5 = Y.encodeStateAsUpdate(yDoc5) // eslint-disable-line
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const yText5 = yDoc5.getText('textBlock')
 | 
					  const yText5 = yDoc5.getText('textBlock')
 | 
				
			||||||
  t.compareStrings(yText5.toString(), 'nenor')
 | 
					  t.compareStrings(yText5.toString(), 'nenor')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {t.TestCase} tc
 | 
					 * @param {t.TestCase} _tc
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const testObfuscateUpdates = tc => {
 | 
					export const testObfuscateUpdates = _tc => {
 | 
				
			||||||
  const ydoc = new Y.Doc()
 | 
					  const ydoc = new Y.Doc()
 | 
				
			||||||
  const ytext = ydoc.getText('text')
 | 
					  const ytext = ydoc.getText('text')
 | 
				
			||||||
  const ymap = ydoc.getMap('map')
 | 
					  const ymap = ydoc.getMap('map')
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user