UNPKG

blockstore-core

Version:

Contains various implementations of the API contract described in interface-blockstore

81 lines (63 loc) 2.01 kB
import { NotFoundError } from 'interface-store' import { BaseBlockstore } from './base.js' import type { Blockstore, Pair } from 'interface-blockstore' import type { AbortOptions, Await, AwaitIterable } from 'interface-store' import type { CID } from 'multiformats/cid' // https://github.com/multiformats/multicodec/blob/d06fc6194710e8909bac64273c43f16b56ca4c34/table.csv#L2 const IDENTITY_CODEC = 0x00 export class IdentityBlockstore extends BaseBlockstore { private readonly child?: Blockstore constructor (child?: Blockstore) { super() this.child = child } put (key: CID, block: Uint8Array, options?: AbortOptions): Await<CID> { if (key.multihash.code === IDENTITY_CODEC) { options?.signal?.throwIfAborted() return key } if (this.child == null) { options?.signal?.throwIfAborted() return key } return this.child.put(key, block, options) } get (key: CID, options?: AbortOptions): Await<Uint8Array> { if (key.multihash.code === IDENTITY_CODEC) { options?.signal?.throwIfAborted() return key.multihash.digest } if (this.child == null) { options?.signal?.throwIfAborted() throw new NotFoundError() } return this.child.get(key, options) } has (key: CID, options?: AbortOptions): Await<boolean> { if (key.multihash.code === IDENTITY_CODEC) { options?.signal?.throwIfAborted() return true } if (this.child == null) { options?.signal?.throwIfAborted() return false } return this.child.has(key, options) } delete (key: CID, options?: AbortOptions): Await<void> { if (key.code === IDENTITY_CODEC) { options?.signal?.throwIfAborted() return } if (this.child != null) { return this.child.delete(key, options) } } getAll (options?: AbortOptions): AwaitIterable<Pair> { if (this.child != null) { return this.child.getAll(options) } options?.signal?.throwIfAborted() return [] } }