livelystream
Version:
Stream changes to and from a lively database as a node.js stream.
120 lines (81 loc) • 3.44 kB
Markdown
Stream changes to and from a lively dataase as a node.js stream.
[](http://travis-ci.org/eugeneware/livelystream)
This module is installed via npm:
``` bash
$ npm install livelystream
```
LivelyStream when used in conjunction with
[](https://github.com/eugeneware/observestream) will replicate
data from the database pointed to LivelyStream with the local javascript
object pointed to by ObserveStream:
``` js
// a database to replicate to/from
var memdb = new MemLively();
// bind the database to the lively stream
var ls = new LivelyStream(memdb);
// scope will contain the local javascript versions of the data in the database
var scope = {};
// Watch for any changes on scope.target and replicate to the 'eugene' key in
// the remote database
var os = new ObserveStream('eugene', scope, 'target', {});
// Connect the database to the observestream to do two-way replication
ls.pipe(os).pipe(ls);
// Making any changes to the database, should eventually replicate
// the changes to scope.target
memdb.put('eugene', { name: 'Eugene', number: 42 }, function () {});
// Making any changes to the local scope.target will replicate to he database
scope.target.name = 'Susan';
```
Constructs a new LivelyStream instance bound to a Lively database.
* ```db``` - the Lively database to synchronize to. (eg.
[](https://github.com/eugeneware/memlively)
The LivelyStream emits 'data' events with the following format:
The very first event that the LivelyStream fires will be the ```value``` event.
This will contain the inital value of the ```key``` in the database, or if the
key is not found in the database, then the ```initialValue``` will be returned.
For example, if the initial value in the database is ```my value``` then the
first event emitted would be:
``` js
['value', 'my value']
```
Any time there is a change in the database, a ```change``` event is emitted.
The change is in [changeset](https://github.com/eugeneware/changeset) object
diff format. For example:
``` js
['change', [
{ type: 'put', key: ['name'], value: 'Eugene' },
{ type: 'put', key: ['number'], value: 42 },
{ type: 'del', key: ['old'] } ] ]
```
The very first event that should be received to synchronization should be a
```listen``` event, which contains a ```key``` and an ```initialValue```.
A sample message is:
``` js
['listen', { key: 'my key', initialValue: {} }]
```
* ```key``` - The key to bind to the remote database for watching.
* ```initialValue``` - If there is nothing in the database at the ```key```
then use this as the initial value.
When piped from a stream such as
[](https://github.com/eugeneware/observestream), the inbound
stream can write events that can modify the underlying database values pointed
to by the ```key```.
The format of these events is the same as the ```change``` event listed above.
Eg:
``` js
['change', [
{ type: 'put', key: ['name'], value: 'Eugene' },
{ type: 'put', key: ['number'], value: 42 },
{ type: 'del', key: ['old'] } ] ]
```