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)) { 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 }