Merge 29bcb2683ef782c5e74810b335456c9e33e4948c into 00ef472d68545cb260abd35c2de4b3b78719c9e4
This commit is contained in:
commit
331a719d8f
@ -239,10 +239,10 @@ export const tryGc = (ds, store, gcFilter) => {
|
||||
|
||||
/**
|
||||
* @param {Array<Transaction>} transactionCleanups
|
||||
* @param {number} i
|
||||
*/
|
||||
const cleanupTransactions = (transactionCleanups, i) => {
|
||||
if (i < transactionCleanups.length) {
|
||||
const cleanupTransactions = (transactionCleanups) => {
|
||||
let lastError = null;
|
||||
for (let i = 0; i < transactionCleanups.length; i++) {
|
||||
const transaction = transactionCleanups[i]
|
||||
const doc = transaction.doc
|
||||
const store = doc.store
|
||||
@ -295,7 +295,9 @@ const cleanupTransactions = (transactionCleanups, i) => {
|
||||
fs.push(() => doc.emit('afterTransaction', [transaction, doc]))
|
||||
})
|
||||
callAll(fs, [])
|
||||
} finally {
|
||||
} catch (e) {
|
||||
lastError = e
|
||||
}
|
||||
// Replace deleted items with ItemDeleted / GC.
|
||||
// This is where content is actually remove from the Yjs Doc.
|
||||
if (doc.gc) {
|
||||
@ -366,10 +368,10 @@ const cleanupTransactions = (transactionCleanups, i) => {
|
||||
if (transactionCleanups.length <= i + 1) {
|
||||
doc._transactionCleanups = []
|
||||
doc.emit('afterAllTransactions', [doc, transactionCleanups])
|
||||
} else {
|
||||
cleanupTransactions(transactionCleanups, i + 1)
|
||||
}
|
||||
}
|
||||
if (lastError) {
|
||||
throw lastError
|
||||
}
|
||||
}
|
||||
|
||||
@ -415,7 +417,7 @@ export const transact = (doc, f, origin = null, local = true) => {
|
||||
// observes throw errors.
|
||||
// This file is full of hacky try {} finally {} blocks to ensure that an
|
||||
// event can throw errors and also that the cleanup is called.
|
||||
cleanupTransactions(transactionCleanups, 0)
|
||||
cleanupTransactions(transactionCleanups)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -210,3 +210,21 @@ export const testFormattingBug = _tc => {
|
||||
yxml.applyDelta(delta)
|
||||
t.compare(yxml.toDelta(), delta)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {t.TestCase} tc
|
||||
*/
|
||||
export const testCleanupTransactions = tc => {
|
||||
const ydoc = new Y.Doc()
|
||||
const yxml = ydoc.getXmlFragment('')
|
||||
ydoc.on('afterTransaction', tr => {
|
||||
if (tr.origin === 'test') {
|
||||
yxml.toJSON()
|
||||
}
|
||||
})
|
||||
ydoc.transact(tr => {
|
||||
for (let i = 0; i < 100000; i++) {
|
||||
yxml.push([new Y.XmlText('a')])
|
||||
}
|
||||
}, 'test')
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user