npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

basebee

v0.0.33

Published

Basebee is a powerful key-value store built on top of Autobase and Hyperbee, designed to efficiently manage data with customizable key/value encodings, prefix-based key organization, and batch operations. It integrates stream-based APIs for handling key-v

Downloads

98

Readme

Basebee

alpha

Basebee is a flexible key-value store built on top of Autobase and Hyperbee, designed for efficient data management with custom key/value encodings, prefix-based key organization, batch operations, and a stream-based API.

Note: This is an alpha release . It is not yet stable, and additional testing is required before it is officially released.


Key Features

  • Custom Key/Value Encodings: Supports multiple encodings such as JSON, binary, or user-defined formats.
  • Prefix-Based Key Management: Organize and filter keys using prefixes for efficient querying and partitioning of data.
  • Batch Operations: Perform atomic batch operations such as put, del, addWriter, and removeWriter.
  • Stream-Based API: Supports real-time data streaming, history tracking, and efficient range queries.
  • Multi-Writer Support: Easily manage contributions from multiple writers.
  • Conflict Resolution Strategies Early adoption of conflict resolution strategy LWW, and plan to support more.

Status

  • Current Version: 0.0.1-alpha
  • This is a pre-release version under development. There are still tests to be conducted and a few adjustments needed for stability. Please proceed with caution if testing or integrating this version into your project.

Getting Started

Once Basebee is officially released, detailed installation instructions and usage examples will be provided.


Hyperbee vs Basebee

Prefix Handling in Hyperbee vs Basebee

Hyperbee:

  • In Hyperbee, keys are treated as-is, without any inherent concept of prefixes. When you insert or query data, the keys are compared lexicographically as binary data. If you want to implement a prefix system, you would have to do so manually by adding a prefix to your keys and handling prefix-based querying yourself.
  • Hyperbee doesn't automatically apply prefixes or manage the separation of data by prefixes. It operates purely on the raw keys you provide.
  • If you wish to add a namespace or segregate data using prefixes, you would need to manually prepend a prefix to the key when storing data and filter it by key range (e.g., gte or lte) when querying the data.
  • Key Encodings: Hyperbee supports encoding keys, which allows you to store keys in different formats (e.g., binary, utf-8, etc.).

Basebee:

  • Basebee introduces a more explicit and structured prefix system. Prefixes are an integral part of the design and can be defined at the time of the database's creation.
  • Basebee handles prefixing automatically:
    • When you define a prefix, Basebee will automatically add it to your keys before inserting them into the underlying Hyperbee instance.
    • When querying data, Basebee will automatically filter and remove the prefix from the results. This simplifies the process of using namespaces or logical separations within the keyspace.
    • Prefix-aware Querying: Basebee applies prefixes to key-based queries (like gte, lte, etc.) automatically, so you don’t have to manually manage or filter them when querying the data.
  • Stream Filtering: Basebee uses prefix-aware filtering streams (createPrefixFilteringStream) to ensure that only the keys within the specified prefix are retrieved when running queries.
  • Prefix When using Basebee, there's no need to set a prefix. Basebee automatically manages its own internal keys for conflict resolution. If you disable conflict resolution (i.e., config.useConflictStrategy = false and config.prefix = null), Basebee behaves just like Hyperbee, but this comes with the risk of potential conflicts between writes

Example of Key Prefixing:

  • Hyperbee (Manual Prefixing):

    const prefix = 'main';
    const key = prefix + ':some-key';
    await hyperbee.put(key, value);
    const result = await hyperbee.get(key);

    Querying with manual range:

    const prefix = 'main';
    const resultStream = hyperbee.createReadStream({
      gte: prefix + ':',
      lte: prefix + ':\xff'
    });
  • Basebee (Automatic Prefixing):

    const db = new Basebee(store, { prefix: 'main' });
    await db.put('some-key', value);
    const result = await db.get('some-key');

    Querying with automatic prefix handling:

    const resultStream = db.createReadStream(); // Automatically handles prefix

Other Key Differences

Conflict Strategy:

  • Hyperbee: Hyperbee does not include built-in conflict resolution logic, as it is designed to operate with a single writer.
  • Basebee: Basebee has an optional useConflictStrategy flag to handle write conflicts, typically by using a last-write-wins (LWW) strategy where the latest entry overwrites previous ones based on a timestamp.

Batching:

  • Both Hyperbee and Basebee support batching writes.
  • Basebee: Basebee wraps batch operations with Autobase functionality. Batching in Basebee is part of its Autobase workflow, which can include multiple writers.
  • Hyperbee: Hyperbee supports simple batch operations, but without the additional layer of conflict resolution or multiple writers.

Multiple Writers:

  • Hyperbee: Primarily designed for a single writer.
  • Basebee: Integrates with Autobase for handling multiple writers, allowing decentralized writing to a shared dataset.

Autobase Integration:

  • Hyperbee: No native support for Autobase or multiple writers. It’s a simple append-only B-tree key-value store.
  • Basebee: Extends Hyperbee with Autobase, enabling the handling of multiple concurrent writers with conflict resolution.

Streams and Read Options:

  • Both support streams (createReadStream, createHistoryStream, etc.), but Basebee automatically applies prefixes to these streams, filtering out irrelevant keys and simplifying access to specific namespaces.

    • Hyperbee: You need to manually manage filtering based on key ranges.
    • Basebee: Automatically applies prefix filtering based on the configuration provided.

Metadata Handling:

  • Hyperbee: Metadata can be used to store additional context but needs to be managed manually.
  • Basebee: The prefix itself is encoded in the metadata, which helps in identifying and segregating data across different namespaces. Plans for additional metadata options is in the future.

Summary

  • Hyperbee is a simple and powerful append-only B-tree key-value store with no built-in prefix management or multi-writer support. Prefixes need to be manually managed.
  • Basebee builds on top of Hyperbee by adding automatic prefix management, multi-writer support via Autobase, conflict resolution strategies, and a simpler interface for querying and managing prefixed data.

If you are building a system that requires managing data across different namespaces or handling multiple writers with conflict resolution, Basebee abstracts a lot of the complexity, especially when it comes to prefix management.

API Overview

put(key, value, options)

Insert a key-value pair into the store with the provided key encoding and value encoding.

get(key, options)

Retrieve a value by its key, with support for custom key and value encodings.

del(key, options)

Delete a key-value pair by its key.

batch()

Create a batch of operations, allowing multiple put, del, addWriter, and removeWriter calls to be committed in a single transaction.

Stream APIs

  • createReadStream(options): Stream key-value pairs over a specified range.
  • createHistoryStream(options): Stream historical changes to key-value pairs.
  • createDiffStream(options): Stream differences between states.
  • watch(options): Watch for real-time changes.

Development Status & To-Do

  • [x] Custom key/value encodings
  • [x] Prefix-based key management
  • [x] Batch operations
  • [x] Stream API
  • [x] Multi-writer support
  • [ ] Create additional pluggable conflict strategies.
  • [ ] Additional test cases (currently being worked on)
  • [ ] Stability improvements
  • [ ] Official release

License

Basebee is licensed under the MIT License.


Note: This alpha version is not intended for production use.