WIP
2016-10-04 19:07:31 +02:00
2016-03-21 10:00:36 +01:00
2016-10-04 19:07:32 +02:00
2016-10-04 19:07:31 +02:00
WIP
2016-10-04 19:07:31 +02:00
2016-10-04 19:07:32 +02:00
2016-10-04 19:07:31 +02:00
2016-03-10 17:00:45 +01:00
2016-10-04 19:07:32 +02:00
2016-08-09 16:56:51 +02:00
2016-04-15 16:07:51 +02:00
WIP
2016-10-04 19:07:31 +02:00
WIP
2016-10-04 19:07:31 +02:00
2016-10-04 19:07:32 +02:00

OrbitDB

Distributed, peer-to-peer database on IPFS.

CircleCI Status Project Status

Introduction

orbit-db is a distributed, peer-to-peer database for applications. You can use orbit-db for different data models: Key-Value Store, Eventlog (append-only log), Feed (add and remove log) and Counters. The database gets replicated automatically with peers who are connected to the same database.

This is the Javascript implementation and it works both in Node.js and Browsers.

  • Client-side database to be embedded in Javascript applications
  • Stores all data in IPFS
  • Aggregation happens on client side and data is eventually consistent
  • Designed to work offline first

Check out a visualization of the data flow at https://github.com/haadcode/proto2

Live demo: http://celebdil.benet.ai:8080/ipfs/Qmezm7g8mBpWyuPk6D84CNcfLKJwU6mpXuEN5GJZNkX3XK/

Screenshot

NOTE: the README can be out of date, I'm working to get up to date. If you find a problem, please open an issue or a PR.

Currently requires orbit-server for pubsub communication. This will change in the future as soon as IPFS provides pubsub.

Install

npm install orbit-db

Data stores

Currently available data stores:

Usage

const OrbitDB = require('orbit-db')
const IPFS = require('ipfs')

OrbitDB.connect('178.62.241.75:3333', 'tester', null, new IPFS(), { allowOffline: true })
  .then((orbitdb) => {
    const kvstore = orbitdb.kvstore('db name')
    const events = orbitdb.eventlog('db name')
    const feed = orbitdb.feed('db name')
    const counters = orbitdb.counter('db name')

    kvstore.put('key1', 'hello1')
      .then(() => kvstore.get('key1'))
      .then((value) => console.log(value)) // 'hello!'
  })

Documentation for individual stores are WIP, please see each store's source code for available public methods.

Examples

To run the examples below, make sure to run a local orbit-server

Browser examples

Build the examples:

npm install
npm run build:examples

Then open examples/browser.html or examples/index.html. See the full example here.

<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script type="text/javascript" src="../dist/orbitdb.min.js" charset="utf-8"></script>
    <script type="text/javascript" src="../node_modules/logplease/dist/logplease.min.js" charset="utf-8"></script>
    <script type="text/javascript" src="../node_modules/ipfs/dist/index.min.js" charset="utf-8"></script>

    <script type="text/javascript">
      const ipfs = window.Ipfs();
      OrbitDB.connect('localhost:3333', 'user1', '', ipfs)
        .then((orbit) => orbit.kvstore('test'))
        .then((db) => db.put('hello', 'world'))
        .then((res) => {
            const result = db.get(key)
            console.log(result)
        })
    </script>
  </body>
</html>

Node.js examples

Before running the examples, install dependencies with:

npm install

Key-Value store example:

node examples/keyvalue.js <host:port> <username> <channel> <key> <value>

Event log example (run several in separate shells):

node examples/eventlog.js <host:port> <username> <channel> <data> <interval in ms>

Benchmark writes:

node examples/benchmark.js <host:port> <username> <channel>;

API

NOTE: the API documentation is currently out of date. It will be updated soon!

See usage example below

OrbitDB calls its namespaces channels. A channel is similar to "table", "keyspace", "topic", "feed" or "collection" in other db systems.

connect(<host:port>, username, password)

channel(name, password)

    .add(data: String) // Insert an event to a channel, returns <ipfs-hash> of the event

    .iterator([options]) // Returns an iterator of events

        // options : { 
        //   gt: <ipfs-hash>,   // Return events newer than <ipfs-hash>
        //   gte: <ipfs-hash>,  // Return events newer then <ipfs-hash> (inclusive)
        //   lt: <ipfs-hash>,   // Return events older than <ipfs-hash>
        //   lte: <ipfs-hash>,  // Return events older than <ipfs-hash> (inclusive)
        //   limit: -1,         // Number of events to return, -1 returns all, default 1
        //   reverse: true      // Return items oldest first, default latest first
        // }

    .put(key, data: String) // Insert (key,value) to a channel

    .get(key) // Retrieve value

    .del({ key: <key or hash> }) // Remove entry

    .delete() // Deletes the channel, all data will be "removed" (unassociated with the channel, actual data is not deleted from ipfs)

Usage

const async   = require('asyncawait/async');
const ipfsAPI = require('ipfs-api');
const OrbitDB = require('orbit-db');

// local ipfs daemon
const ipfs = ipfsAPI();

async(() => {
    // Connect
    const orbit = await(OrbitClient.connect('localhost:3333', 'usernamne', '', ipfs));

    /* Event Log */
    const eventlog = orbit.eventlog('eventlog test');
    const hash = await(eventlog.add('hello')); // <ipfs-hash>

    // Remove event
    await(eventlog.remove(hash));

    // Iterator options
    const options = { limit: -1 }; // fetch all messages

    // Get events
    const iter = eventlog.iterator(options); // Symbol.iterator
    const next = iter.next(); // { value: <item>, done: false|true}

    // OR:
    // var all = iter.collect(); // returns all elements as an array

    // OR:
    // for(let i of iter)
    //   console.log(i.hash, i.item);

    /* Delete database locally */
    eventlog.delete();

    /* KV Store */
    const kvstore = orbit.kvstore('kv test');
    await(kvstore.put('key1', 'hello world'));
    kvstore.get('key1'); // returns "hello world"
    await(kvstore.del('key1'));
})();

Development

Run Tests

npm test

Keep tests running while development:

mocha -w

Build distributables

npm install
npm run build
Description
No description provided
Readme 11 MiB
Languages
JavaScript 94.2%
HTML 5.4%
Makefile 0.3%
Dockerfile 0.1%