new API onRecordDeletedOrErased

This commit is contained in:
Andre Staltz 2024-01-19 12:47:52 +02:00
parent f8a2006eb1
commit 7d5588ef4d
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
2 changed files with 72 additions and 3 deletions

View File

@ -197,6 +197,8 @@ function initDB(peer, config) {
const encryptionFormats = new Map()
/** @type {Obz<Rec>} */
const onRecordAdded = Obz()
/** @type {Obz<MsgID>} */
const onRecordDeletedOrErased = Obz()
const codec = {
/**
@ -879,7 +881,7 @@ function initDB(peer, config) {
* @param {{
* keypair?: Keypair;
* encryptionFormat?: string;
* data: any;
* data: Record<string, any>;
* domain: string;
* account: string;
* tangles?: Array<MsgID>;
@ -1036,7 +1038,12 @@ function initDB(peer, config) {
}
recs[seq] = null
log.onDrain(() => {
log.del(offset, cb)
log.del(offset, (err) => {
// prettier-ignore
if (err) return cb(new Error('del() failed to write to disk', { cause: err }))
queueMicrotask(() => onRecordDeletedOrErased.set(msgID))
cb()
})
})
}
@ -1126,7 +1133,12 @@ function initDB(peer, config) {
}
recs[seq] = rec
log.onDrain(() => {
log.overwrite(offset, rec, cb)
log.overwrite(offset, rec, (err) => {
// prettier-ignore
if (err) return cb(new Error('erase() failed to write to disk', { cause: err }))
queueMicrotask(() => onRecordDeletedOrErased.set(msgID))
cb()
})
})
}
@ -1180,6 +1192,7 @@ function initDB(peer, config) {
getMinDepth: getMinGhostDepth,
},
onRecordAdded,
onRecordDeletedOrErased,
getTangle,
msgs,
records,

View File

@ -0,0 +1,56 @@
const test = require('node:test')
const assert = require('node:assert')
const path = require('node:path')
const os = require('node:os')
const p = require('node:util').promisify
const rimraf = require('rimraf')
const Keypair = require('ppppp-keypair')
const { createPeer } = require('./util')
const DIR = path.join(os.tmpdir(), 'ppppp-db-on-record-deleted-or-erased')
rimraf.sync(DIR)
test('onRecordDeletedOrErased()', async (t) => {
const peer = createPeer({
keypair: Keypair.generate('ed25519', 'alice'),
path: DIR,
})
await peer.db.loaded()
const id = await p(peer.db.account.create)({
subdomain: 'person',
_nonce: 'alice',
})
const msgIDs = []
for (let i = 0; i < 5; i++) {
const rec = await p(peer.db.feed.publish)({
account: id,
domain: 'post',
data: { text: 'm' + i },
})
msgIDs.push(rec.id)
}
const listened1 = []
const remove1 = peer.db.onRecordDeletedOrErased((msgID) => {
listened1.push(msgID)
})
assert.deepEqual(listened1, [], '(nothing)')
await p(peer.db.erase)(msgIDs[2])
assert.deepEqual(listened1, [msgIDs[2]], 'erased')
remove1()
const listened2 = []
const remove2 = peer.db.onRecordDeletedOrErased((msgID) => {
listened2.push(msgID)
})
assert.deepEqual(listened2, [msgIDs[2]], 'erased')
await p(peer.db.del)(msgIDs[1])
assert.deepEqual(listened2, [msgIDs[2], msgIDs[1]], 'erased and deleted')
remove2()
assert.deepEqual(listened1, [msgIDs[2]], 'erased') // still the same
await p(peer.close)(true)
})