node package manager

lucass

lucass (Lightweight Universal Content Addressable Storage Spec)

Coverage Status Build Status dependencies Status

semantic-release Greenkeeper badge Commitizen friendly JavaScript Style Guide

There are a bunch of content addressable stores out there, and even some abstract store specs. A few things that are different about lucass:

  • There is NO requirement that implementations use a specific hashing method, only that the method they use is consistent.
    • This means that there can be many more types of implementations but that they aren't compatible by default. Users of each implementation may need to configure the hashing methods.
  • Requires support for both Buffers and Streams as values.

This module contains compliance tests and two reference implementations (filesystem and inmemory).

Spec

class Store {
  async set (value, cb) {
    // value is either a Buffer or a Stream, both must be supported. 
    // cb(Error, Hash) 
    // Hash must be consistent. Data written with Buffer or Stream should 
    // be identical. 
    // Hash must be a String. 
  }
  async get (hash, cb) {
    // Hash must be a String. 
    // returns a buffer. 
  }
  async hash (value, cb) {
    // Identical method signature to set but MUST NOT store the value. 
  }
}

There are also optional APIs. These are not required as they may not be possible on top of certain storage but may be required by certain users of an implementation.

class Store {
  async set (value, ...args) {
    // Optional args are sent to the hashing function.. 
  }
  async hash (value, ...args) {
    // Optional args are sent to the hashing function. 
  }
  async missing (hashes) {
    // Optional array of hashes. Missing hashes will be returned. 
  }
}

In-Memory Implementation

let store = require('lucass/inmemory')()
let hasher = await store.set(Buffer.from('asdf'))
let value = await store.getBuffer(hash)
console.log(value.toString()) // 'asdf' 

Additionally, all methods in the spec are implemented.

Filesystem Implementation

let store = require('lucass/fs')('/var/custom-directory')
let hasher = await store.set(Buffer.from('asdf'))
let value = await store.getBuffer(hash)
console.log(value.toString()) // 'asdf' 

Additionally, all methods in the spec are implemented.