permanent user store writes updates in separate transaction

This commit is contained in:
Kevin Jahns 2019-12-10 17:18:57 +01:00
parent d90c9b1cb2
commit 7f0e25dcba
2 changed files with 28 additions and 24 deletions

View File

@ -55,7 +55,7 @@ export const followRedone = (store, id) => {
item = getItem(store, nextID) item = getItem(store, nextID)
diff = nextID.clock - item.id.clock diff = nextID.clock - item.id.clock
nextID = item.redone nextID = item.redone
} while (nextID !== null) } while (nextID !== null && item instanceof Item)
return { return {
item, diff item, diff
} }

View File

@ -83,33 +83,37 @@ export class PermanentUserData {
} }
user.get('ids').push([clientid]) user.get('ids').push([clientid])
users.observe(event => { users.observe(event => {
const userOverwrite = users.get(userDescription) setTimeout(() => {
if (userOverwrite !== user) { const userOverwrite = users.get(userDescription)
// user was overwritten, port all data over to the next user object if (userOverwrite !== user) {
// @todo Experiment with Y.Sets here // user was overwritten, port all data over to the next user object
user = userOverwrite // @todo Experiment with Y.Sets here
// @todo iterate over old type user = userOverwrite
this.clients.forEach((_userDescription, clientid) => { // @todo iterate over old type
if (userDescription === _userDescription) { this.clients.forEach((_userDescription, clientid) => {
user.get('ids').push([clientid]) if (userDescription === _userDescription) {
user.get('ids').push([clientid])
}
})
const encoder = encoding.createEncoder()
const ds = this.dss.get(userDescription)
if (ds) {
writeDeleteSet(encoder, ds)
user.get('ds').push([encoding.toUint8Array(encoder)])
} }
})
const encoder = encoding.createEncoder()
const ds = this.dss.get(userDescription)
if (ds) {
writeDeleteSet(encoder, ds)
user.get('ds').push([encoding.toUint8Array(encoder)])
} }
} }, 0)
}) })
doc.on('afterTransaction', /** @param {Transaction} transaction */ transaction => { doc.on('afterTransaction', /** @param {Transaction} transaction */ transaction => {
const yds = user.get('ds') setTimeout(() => {
const ds = transaction.deleteSet const yds = user.get('ds')
if (transaction.local && ds.clients.size > 0) { const ds = transaction.deleteSet
const encoder = encoding.createEncoder() if (transaction.local && ds.clients.size > 0) {
writeDeleteSet(encoder, ds) const encoder = encoding.createEncoder()
yds.push([encoding.toUint8Array(encoder)]) writeDeleteSet(encoder, ds)
} yds.push([encoding.toUint8Array(encoder)])
}
})
}) })
} }
/** /**