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