Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/holepunchto/autobase
Autobase lets you write concise multiwriter data structures with Hypercore
https://github.com/holepunchto/autobase
Last synced: 1 day ago
JSON representation
Autobase lets you write concise multiwriter data structures with Hypercore
- Host: GitHub
- URL: https://github.com/holepunchto/autobase
- Owner: holepunchto
- License: apache-2.0
- Created: 2020-11-06T19:43:43.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2024-04-13T13:56:25.000Z (7 months ago)
- Last Synced: 2024-04-14T15:07:18.254Z (7 months ago)
- Language: JavaScript
- Homepage: https://docs.holepunch.to
- Size: 4.8 MB
- Stars: 96
- Watchers: 17
- Forks: 23
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-pears - autobase - multiwriter data structures with Hypercore (**Awesome Pears 🍐** / Building Blocks)
- awesome-pears - autobase - multiwriter data structures with Hypercore (**Awesome Pears 🍐** / Building Blocks)
README
# Autobase
## Install
`npm i autobase`
## Usage
```js
const RAM = require('random-access-memory')
const Corestore = require('corestore')
const Autobase = require('autobase')const store = new Corestore(RAM.reusable())
const local = new Autobase(store, remote.key, { apply, open })
await local.ready()// on remote base
// remote.append({ addWriter: local.local.key })await local.append('local 0')
// remote.append('remote 0')
// remote.append('remote 1')await local.update()
await local.append('local 1')for (let i = 0; i < base1.view.length; i++) {
console.log(await base1.view.get(i))/*
local 0
remote 0
remote 1
local 1
*/
}// create the view
async function open (store) {
return store.get('test')
}// use apply to handle to updates
async function apply (nodes, view, base) {
for (const { value } of nodes) {
if (value.addWriter) {
await base.addWriter(value.addWriter, { isIndexer: true })
continue
}await view.append(value)
}
}
```### Ordering
Autobase nodes explicitly reference previous nodes in the graph. The nodes are linearized by analyzing the causal references.
### Reordering
As new causal information comes in, existing nodes may be reordered. Any changes to the view will be undone and reapplied on top of the new ordering.
### Indexed Length
The linearizing algorithm is able to define a point at which the ordering of the graph below will never change.
### Views
An indexed view may be created on top of an Autobase. This view can be updated to reflect the messages of within the base.
Autobase accepts an `open` function for creating views and an `apply` function that can be used to update a view.
```js
async function open (store) {
return store.get('my-view')
}
``````js
async function apply (nodes, view, base) {
for (const n of nodes) await view.append(nodes)
}
```*IMPORTANT*: Autobase messages may be reordered as new data becomes available. Updates will be undone and reapplied internally, but this can _only_ work if the view is built with an instance of an `Autocore`. It is important that any data structures touched by the `apply` function have been derived from the `store` object passed to the `open` handler. If any external data structures are used, these updates will not be correctly undone.
## API
### Autobase
#### `const base = new Autobase(store, bootstrap, opts)`
Instantiate an Autobase.
If loading an existing Autobase then set `bootstrap` to `base.key`, otherwise pass `bootstrap` as null.
`opts` takes the following options:
```js
{
open: store => { ... }, // create the view
apply: (nodes, view, base) => { ... }, // handle nodes
close: view => { ... }, // close the view
valueEncoding, // encoding
ackInterval: 1000 // enable auto acking with the interval
}
```An `ackInterval` may be set to enable automatic acknowledgements. When enabled, in cases where it would help the linearizer converge the base shall eagerly append `null` values to the oplog.
#### `base.key`
The primary key of the autobase.
#### `base.discoveryKey`
The discovery key associated with the autobase.
#### `await base.append(value)`
Append a new entry to the autobase.
#### `await base.update({ wait: false })`
Fetch all available data and update the linearizer.
Setting `wait` option will wait for latest writer blocks to be fetched.
#### `const checkpoint = await base.checkpoint()`
Fetch a static checkpoint of the autobase state.
#### `const core = Autobase.getLocalCore(store, handlers, encryptionKey)`
Generate a local core to be used for an Autobase.
#### `const userData = Autobase.getUserData(core)`
Get user data associated with the autobase core.
### `AutoStore`
Each autobase creates a `AutoStore` which is used to create views. The store is passed to the `open` function.
#### `const core = await store.get(name || { name, valueEncoding })`
Load a `Autocore` by name (passed as `name`) and return a `AutocoreSession` for it. `name` should be passed as a string.
#### `await store.ready()`
Wait until all cores are ready.
### `AutocoreSession`
#### `const core = await store.get(name || { name, valueEncoding })`
Create or load a core and return a session for it. A string may be passed directly or otherwise an object can be passed to define `valueEncoding`
#### `core.indexedLength`
The ordering of blocks before this index is guaranteed to be consisted for all writers.
#### `core.length`
The number of blocks currently in the core
#### `await core.update()`
Ensure the core is at the latest state.
#### `await core.get(seq)`
Get an entry from a core.
#### `await core.append(buffers)`
Append data to the core