From d8b71b37dd7b71ef8af7871bbc43275fbe36549c Mon Sep 17 00:00:00 2001 From: Mathias Buus Date: Mon, 29 Jul 2024 19:15:34 +0200 Subject: [PATCH 1/2] add .removeable and enforce it removeWriter --- index.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/index.js b/index.js index 6351b3e0..560c0cd3 100644 --- a/index.js +++ b/index.js @@ -1873,9 +1873,19 @@ module.exports = class Autobase extends ReadyResource { this._queueBump() } + removeable (key) { + if (this.system.indexers.length !== 1) return true + return !b4a.equals(this.system.indexers[0].key, key) + } + // triggered from apply async removeWriter (key) { // just compat for old version assert(this._applying !== null, 'System changes are only allowed in apply') + + if (!this.removeable(key)) { + throw new Error('Not allowed to remove the last indexer') + } + await this.system.remove(key) if (b4a.equals(key, this.local.key)) { From 9f8b2e2dafe61a27c12c77de4e5185140a49feb4 Mon Sep 17 00:00:00 2001 From: Mathias Buus Date: Mon, 29 Jul 2024 19:25:39 +0200 Subject: [PATCH 2/2] test removeWriter throwing --- test/basic.js | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/test/basic.js b/test/basic.js index e7f2b3e3..b453a4e3 100644 --- a/test/basic.js +++ b/test/basic.js @@ -1362,7 +1362,9 @@ test('basic - indexer removes themselves', async t => { } }) -test('basic - all indexers removed', async t => { +test('basic - cannot remove last indexer', async t => { + t.plan(7) + const { bases } = await create(2, t, { apply }) const [a, b] = bases @@ -1381,19 +1383,6 @@ test('basic - all indexers removed', async t => { await a.append({ remove: b4a.toString(a.local.key, 'hex') }) - await replicateAndSync([a, b]) - - t.is(a.writable, false) - - t.is(a.view.getBackingCore().session.manifest.signers.length, 0) - t.is(b.view.getBackingCore().session.manifest.signers.length, 0) - - t.is(a.view.length, 1) - t.is(b.view.length, 1) - - await t.exception(a.append('fail'), /Not writable/) - await t.exception(b.append('fail'), /Not writable/) - async function apply (batch, view, base) { for (const { value } of batch) { if (value.add) { @@ -1402,7 +1391,7 @@ test('basic - all indexers removed', async t => { } if (value.remove) { - await base.removeWriter(b4a.from(value.remove, 'hex')) + await t.exception(() => base.removeWriter(b4a.from(value.remove, 'hex'))) continue }