From 6074f0fa831abc45b40177ea498a2e0fbb3eeb32 Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Sat, 3 Jun 2023 20:09:11 +0100 Subject: [PATCH] feat: add black hole stores (#227) Sometimes it's useful to not store anything, for example calculating the CID of a datastructure without actually storing any of the data. --- packages/blockstore-core/README.md | 16 +++++++++-- packages/blockstore-core/package.json | 4 +++ packages/blockstore-core/src/black-hole.ts | 27 +++++++++++++++++++ packages/datastore-core/README.md | 21 +++++++++++---- packages/datastore-core/package.json | 4 +++ packages/datastore-core/src/black-hole.ts | 31 ++++++++++++++++++++++ 6 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 packages/blockstore-core/src/black-hole.ts create mode 100644 packages/datastore-core/src/black-hole.ts diff --git a/packages/blockstore-core/README.md b/packages/blockstore-core/README.md index 1e4a5f61..bde24348 100644 --- a/packages/blockstore-core/README.md +++ b/packages/blockstore-core/README.md @@ -15,6 +15,7 @@ - [Usage](#usage) - [BaseBlockstore](#baseblockstore) - [MemoryBlockstore](#memoryblockstore) + - [BlackHoleBlockstore](#blackholeblockstore) - [API Docs](#api-docs) - [License](#license) - [Contribute](#contribute) @@ -35,8 +36,9 @@ Loading this module through a script tag will make it's exports available as `Bl ## Implementations -- Base: [`src/base`](src/base.js) -- Memory: [`src/memory`](src/memory.js) +- Base: [`src/base`](src/base.ts) +- Memory: [`src/memory`](src/memory.ts) +- BlackHole: ['src/blackhole](src/blackhole.ts) ## Usage @@ -70,6 +72,16 @@ import { MemoryBlockstore } from 'blockstore-core/memory' const store = new MemoryBlockstore() ``` +### BlackHoleBlockstore + +A Blockstore that does not store any blocks. + +```js +import { BlackHoleBlockstore } from 'blockstore-core/black-hole' + +const store = new BlackHoleBlockstore() +``` + ## API Docs - diff --git a/packages/blockstore-core/package.json b/packages/blockstore-core/package.json index 80cdf454..0149677c 100644 --- a/packages/blockstore-core/package.json +++ b/packages/blockstore-core/package.json @@ -55,6 +55,10 @@ "types": "./dist/src/base.d.ts", "import": "./dist/src/base.js" }, + "./black-hole": { + "types": "./dist/src/black-hole.d.ts", + "import": "./dist/src/black-hole.js" + }, "./errors": { "types": "./dist/src/errors.d.ts", "import": "./dist/src/errors.js" diff --git a/packages/blockstore-core/src/black-hole.ts b/packages/blockstore-core/src/black-hole.ts new file mode 100644 index 00000000..ab1b5a61 --- /dev/null +++ b/packages/blockstore-core/src/black-hole.ts @@ -0,0 +1,27 @@ +import { BaseBlockstore } from './base.js' +import * as Errors from './errors.js' +import type { Pair } from 'interface-blockstore' +import type { Await, AwaitIterable } from 'interface-store' +import type { CID } from 'multiformats/cid' + +export class BlackHoleBlockstore extends BaseBlockstore { + put (key: CID): Await { + return key + } + + get (): Await { + throw Errors.notFoundError() + } + + has (): Await { + return false + } + + async delete (): Promise { + + } + + async * getAll (): AwaitIterable { + + } +} diff --git a/packages/datastore-core/README.md b/packages/datastore-core/README.md index 0b822a73..3afefb1b 100644 --- a/packages/datastore-core/README.md +++ b/packages/datastore-core/README.md @@ -37,11 +37,12 @@ Loading this module through a script tag will make it's exports available as `Da ## Implementations - Wrapper Implementations - - Mount: [`src/mount`](src/mount.js) - - Keytransform: [`src/keytransform`](src/keytransform.js) - - Sharding: [`src/sharding`](src/sharding.js) - - Tiered: [`src/tiered`](src/tirered.js) - - Namespace: [`src/namespace`](src/namespace.js) + - Mount: [`src/mount`](src/mount.ts) + - Keytransform: [`src/keytransform`](src/keytransform.ts) + - Sharding: [`src/sharding`](src/sharding.ts) + - Tiered: [`src/tiered`](src/tirered.ts) + - Namespace: [`src/namespace`](src/namespace.ts) + - BlackHole: [`src/black-hole`](src/black-hole.ts) ## Usage @@ -83,6 +84,16 @@ import { const store = new MountStore({prefix: new Key('/a'), datastore: new MemoryStore()}) ``` +### BlackHoleDatastore + +A datastore that does not store any data. + +```js +import { BlackHoleDatastore } from 'datastore-core/black-hole' + +const store = new BlackHoleDatastore() +``` + ## Contribute Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/js-ipfs-unixfs-importer/issues)! diff --git a/packages/datastore-core/package.json b/packages/datastore-core/package.json index f5181ef7..2efef0fb 100644 --- a/packages/datastore-core/package.json +++ b/packages/datastore-core/package.json @@ -55,6 +55,10 @@ "types": "./dist/src/base.d.ts", "import": "./dist/src/base.js" }, + "./black-hole": { + "types": "./dist/src/black-hole.d.ts", + "import": "./dist/src/black-hole.js" + }, "./errors": { "types": "./dist/src/errors.d.ts", "import": "./dist/src/errors.js" diff --git a/packages/datastore-core/src/black-hole.ts b/packages/datastore-core/src/black-hole.ts new file mode 100644 index 00000000..9c7b3d3e --- /dev/null +++ b/packages/datastore-core/src/black-hole.ts @@ -0,0 +1,31 @@ +import { BaseDatastore } from './base.js' +import * as Errors from './errors.js' +import type { Pair } from 'interface-datastore' +import type { Key } from 'interface-datastore/key' +import type { Await, AwaitIterable } from 'interface-store' + +export class BlackHoleDatastore extends BaseDatastore { + put (key: Key): Await { + return key + } + + get (): Await { + throw Errors.notFoundError() + } + + has (key: Key): Await { + return false + } + + delete (key: Key): Await { + + } + + * _all (): AwaitIterable { + + } + + * _allKeys (): AwaitIterable { + + } +}