Home

Awesome

ref-db

npm Package Version

access object with transparent reference to synchronous db operation (not async operation)

Supported Platforms

ref-db is built on top of cross-platform Storage, hence it works on:

How it works?

The loaded data object is proxied, it saves and loads data from the storage automatically. You can just use it as if they're all in-memory.

Usage

Create Proxy Store (database)

With in-memory caching:

import { proxyStoreCollectionsByPath } from 'ref-db'

let cachedDB = proxyStoreCollectionsByPath({
  path: 'data',
  storeQuota: Number.MAX_SAFE_INTEGER, // optional
  cacheSize: Number.MAX_SAFE_INTEGER, // optional
  whitelistCollectionNames: ['users', 'posts', 'comments'], // optional
})

Without caching (still benefit from OS-level file caching):

import { proxyStoreCollections } from 'ref-db'
import { LocalStorage } from 'node-localstorage'
import { Store } from '@beenotung/tslib/store'

let localStorage = new LocalStorage('data')
let store = Store.create(localStorage)
let db = proxyStoreCollections({
  store,
  whitelistCollectionNames: ['users', 'posts', 'comments'], // optional
})

Whitelisted collections are auto proxied from the database object:

> console.log(db)
{
  users: '[object Proxy]',
  posts: '[object Proxy]',
  comments: '[object Proxy]',
  [Symbol(store)]: CachedObjectStore {
    ...
  }
}

Each collection can be used as if they are ordinary javascript object. The data will be loaded from storage lazily.

> db.users
{}

> Object.keys(db.users)
[ 'user-1' ]

> Object.keys(db.users).forEach(key => delete db.users[key])
undefined

> Object.keys(db.users)
[]

> db.users["user-1"] = { id: "user-1", name: "Alice" }
{ id: 'user-1', name: 'Alice' }

> Object.keys(db.users)
[ 'user-1' ]

> db.users["user-1"]
{ id: 'user-1', name: 'Alice' }

> db.posts["post-1"] = { id: "post-1", author: { $ref: "users", id: "user-1" } }
{ id: 'post-1', author: { '$ref': 'users', id: 'user-1' } }

> db.posts["post-1"]
{ id: 'post-1', author: { '$ref': 'users', id: 'user-1' } }

> db.posts["post-1"].author
{ id: 'user-1', name: 'Alice' }

> db.posts["post-1"].author.name
'Alice'

License

BSD-2-Clause (Free Open Sourced Project)