From e4b537848d6a8c407164547fe9c4e21c8b2b1c80 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Sat, 21 Dec 2024 18:48:56 +0100 Subject: [PATCH] Add implicit- and explicitSnapshots Ref: https://github.com/Level/community/issues/118 Category: addition --- README.md | 40 ++++++++++++++++++++++++++++------------ index.js | 8 +++++++- test/self.js | 11 +++++++++++ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a3cefe7..bc739bc 100644 --- a/README.md +++ b/README.md @@ -41,42 +41,42 @@ Given zero or more manifest objects, returns a merged and enriched manifest obje For future extensibility, the properties are truthy rather than strictly typed booleans. Falsy or absent properties are converted to `false`, other values are allowed: ```js -supports().snapshots // false -supports({ snapshots: true }).snapshots // true -supports({ snapshots: {} }).snapshots // {} -supports({ snapshots: 1 }, { snapshots: 2 }).snapshots // 2 +supports().seek // false +supports({ seek: true }).seek // true +supports({ seek: {} }).seek // {} +supports({ seek: 1 }, { seek: 2 }).seek // 2 ``` For consumers of the manifest this means they should check support like so: ```js -if (db.supports.snapshots) +if (db.supports.seek) ``` Rather than: ```js -if (db.supports.snapshots === true) +if (db.supports.seek === true) ``` **Note:** the manifest describes high-level features that typically encompass multiple methods of a db. It is currently not a goal to describe a full API, or versions of it. ## Features -### `snapshots` (boolean) +### `implicitSnapshots` (boolean) -Does the database have snapshot guarantees? Meaning that reads are unaffected by simultaneous writes. For example, an iterator should read from a snapshot of the database, created at the time `db.iterator()` was called. This means the iterator will not see the data of simultaneous write operations. - -Must be `false` if any of the following is true: +Does the database read from a snapshot as described in [`abstract-level`](https://github.com/Level/abstract-level#reading-from-snapshots)? Must be `false` if any of the following is true: - Reads don't operate on a snapshot - Snapshots are created asynchronously. +Aliased as `snapshots` for backwards compatibility. +
Support matrix -| Module | Snapshot guarantee | -| :------------------- | :-------------------------- | +| Module | Implicit snapshots | +| :------------------- | :---------------------------- | | `classic-level` | ✅ | | `memory-level` | ✅ | | `browser-level` | ❌ | @@ -98,6 +98,22 @@ Must be `false` if any of the following is true:
+### `explicitSnapshots` (boolean) + +Does the database implement `db.snapshot()` and do read methods accept a `snapshot` option as described in [`abstract-level`](https://github.com/Level/abstract-level#reading-from-snapshots)? + +
+Support matrix + +| Module | Explicit snapshots | +| :------------------- | :-------------------------- | +| `classic-level` | Not yet | +| `memory-level` | Not yet | +| `browser-level` | ❌ | +| `rave-level` | TBD | + +
+ ### `permanence` (boolean) Does data survive after process (or environment) exit? Typically true. False for [`memory-level`](https://github.com/Level/memory-level) and [`memdown`](https://github.com/Level/memdown). diff --git a/index.js b/index.js index 803956c..618aa6c 100644 --- a/index.js +++ b/index.js @@ -3,8 +3,14 @@ exports.supports = function supports (...manifests) { const manifest = manifests.reduce((acc, m) => Object.assign(acc, m), {}) + // Snapshots is an alias for backwards compatibility + const implicitSnapshots = manifest.implicitSnapshots || manifest.snapshots || false + const explicitSnapshots = manifest.explicitSnapshots || false + return Object.assign(manifest, { - snapshots: manifest.snapshots || false, + implicitSnapshots, + explicitSnapshots, + snapshots: implicitSnapshots, permanence: manifest.permanence || false, seek: manifest.seek || false, createIfMissing: manifest.createIfMissing || false, diff --git a/test/self.js b/test/self.js index 2382a30..78eb8aa 100644 --- a/test/self.js +++ b/test/self.js @@ -73,3 +73,14 @@ test('does not merge additionalMethods', function (t) { t.same(manifest.additionalMethods, { bar: true }) t.end() }) + +test('adds snapshots alias', function (t) { + for (const value of [true, false]) { + t.is(supports({ implicitSnapshots: value }).implicitSnapshots, value) + t.is(supports({ implicitSnapshots: value }).snapshots, value) + t.is(supports({ snapshots: value }).implicitSnapshots, value) + t.is(supports({ snapshots: value }).snapshots, value) + } + + t.end() +})