mirror of https://codeberg.org/pzp/pzp-db.git
new API onRecordDeletedOrErased
This commit is contained in:
parent
f8a2006eb1
commit
7d5588ef4d
19
lib/index.js
19
lib/index.js
|
@ -197,6 +197,8 @@ function initDB(peer, config) {
|
||||||
const encryptionFormats = new Map()
|
const encryptionFormats = new Map()
|
||||||
/** @type {Obz<Rec>} */
|
/** @type {Obz<Rec>} */
|
||||||
const onRecordAdded = Obz()
|
const onRecordAdded = Obz()
|
||||||
|
/** @type {Obz<MsgID>} */
|
||||||
|
const onRecordDeletedOrErased = Obz()
|
||||||
|
|
||||||
const codec = {
|
const codec = {
|
||||||
/**
|
/**
|
||||||
|
@ -879,7 +881,7 @@ function initDB(peer, config) {
|
||||||
* @param {{
|
* @param {{
|
||||||
* keypair?: Keypair;
|
* keypair?: Keypair;
|
||||||
* encryptionFormat?: string;
|
* encryptionFormat?: string;
|
||||||
* data: any;
|
* data: Record<string, any>;
|
||||||
* domain: string;
|
* domain: string;
|
||||||
* account: string;
|
* account: string;
|
||||||
* tangles?: Array<MsgID>;
|
* tangles?: Array<MsgID>;
|
||||||
|
@ -1036,7 +1038,12 @@ function initDB(peer, config) {
|
||||||
}
|
}
|
||||||
recs[seq] = null
|
recs[seq] = null
|
||||||
log.onDrain(() => {
|
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
|
recs[seq] = rec
|
||||||
log.onDrain(() => {
|
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,
|
getMinDepth: getMinGhostDepth,
|
||||||
},
|
},
|
||||||
onRecordAdded,
|
onRecordAdded,
|
||||||
|
onRecordDeletedOrErased,
|
||||||
getTangle,
|
getTangle,
|
||||||
msgs,
|
msgs,
|
||||||
records,
|
records,
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
Loading…
Reference in New Issue