From 7d5588ef4d23bbc4cc93ad1c3253b4167343cbe3 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Fri, 19 Jan 2024 12:47:52 +0200 Subject: [PATCH] new API onRecordDeletedOrErased --- lib/index.js | 19 ++++++-- test/on-record-deleted-or-erased.test.js | 56 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 test/on-record-deleted-or-erased.test.js diff --git a/lib/index.js b/lib/index.js index 557397e..2446109 100644 --- a/lib/index.js +++ b/lib/index.js @@ -197,6 +197,8 @@ function initDB(peer, config) { const encryptionFormats = new Map() /** @type {Obz} */ const onRecordAdded = Obz() + /** @type {Obz} */ + const onRecordDeletedOrErased = Obz() const codec = { /** @@ -879,7 +881,7 @@ function initDB(peer, config) { * @param {{ * keypair?: Keypair; * encryptionFormat?: string; - * data: any; + * data: Record; * domain: string; * account: string; * tangles?: Array; @@ -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, diff --git a/test/on-record-deleted-or-erased.test.js b/test/on-record-deleted-or-erased.test.js new file mode 100644 index 0000000..2f43560 --- /dev/null +++ b/test/on-record-deleted-or-erased.test.js @@ -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) +})