# multileveldown

> multilevel implemented using leveldowns with reconnect support

Latest version **5.0.1** (published 2021-10-02) · MIT license · 0 weekly downloads

> **Deprecated.** This package is deprecated.

## Install

```sh
npm install multileveldown
pnpm add multileveldown
yarn add multileveldown
bun add multileveldown
```

## Health

**Score 10/100 (F)** — status: deprecated.

Negative: deprecated.

## Facts

| | |
|---|---|
| Version | 5.0.1 |
| Published | 2021-10-02 |
| First published | 2015-04-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=10 |
| Dependencies | 9 |
| Unpacked size | 69.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 58 |
| Author | Mathias Buus |
| Maintainers | vweevers, mafintosh |

## Links

- npm: https://www.npmjs.com/package/multileveldown
- Repository: https://github.com/Level/multileveldown
- Issues: https://github.com/Level/multileveldown/issues
- npm.io page: https://npm.io/package/multileveldown

## Dependencies (9)

- [levelup](https://npm.io/package/levelup.md) ^5.1.1
- [duplexify](https://npm.io/package/duplexify.md) ^4.1.1
- [reachdown](https://npm.io/package/reachdown.md) ^1.1.0
- [encoding-down](https://npm.io/package/encoding-down.md) ^7.1.0
- [end-of-stream](https://npm.io/package/end-of-stream.md) ^1.1.0
- [numeric-id-map](https://npm.io/package/numeric-id-map.md) ^1.1.0
- [abstract-leveldown](https://npm.io/package/abstract-leveldown.md) ^7.2.0
- [length-prefixed-stream](https://npm.io/package/length-prefixed-stream.md) ^2.0.0
- [protocol-buffers-encodings](https://npm.io/package/protocol-buffers-encodings.md) ^1.1.0

## Recent versions

- 5.0.1 (latest) — 2021-10-02
- 5.0.0 — 2021-10-01
- 4.0.0 — 2021-04-03
- 3.0.0 — 2019-11-04
- 2.3.1 — 2018-01-31
- 2.3.0 — 2017-02-03
- 2.2.0 — 2016-06-02
- 2.1.1 — 2016-01-10
- 2.1.0 — 2016-01-09
- 2.0.1 — 2016-01-09
- 2.0.0 — 2016-01-09
- 1.1.2 — 2015-06-10
- 1.1.1 — 2015-05-21
- 1.1.0 — 2015-05-04
- 1.0.3 — 2015-05-04
- … 3 more at https://npm.io/package/multileveldown/versions

## README

# multileveldown

> [`multilevel`](https://github.com/juliangruber/multilevel) implemented using leveldowns with seamless retry support

[![level badge][level-badge]](https://github.com/Level/awesome)
[![npm](https://img.shields.io/npm/v/multileveldown.svg)](https://www.npmjs.com/package/multileveldown)
[![Node version](https://img.shields.io/node/v/multileveldown.svg)](https://www.npmjs.com/package/multileveldown)
[![Test](https://img.shields.io/github/workflow/status/Level/multileveldown/Test?label=test)](https://github.com/Level/multileveldown/actions/workflows/test.yml)
[![Coverage](https://img.shields.io/codecov/c/github/Level/multileveldown?label=&logo=codecov&logoColor=fff)](https://codecov.io/gh/Level/multileveldown)
[![Standard](https://img.shields.io/badge/standard-informational?logo=javascript&logoColor=fff)](https://standardjs.com)
[![Common Changelog](https://common-changelog.org/badge.svg)](https://common-changelog.org)
[![Donate](https://img.shields.io/badge/donate-orange?logo=open-collective&logoColor=fff)](https://opencollective.com/level)

## Usage

Similar to [`multilevel`](https://github.com/juliangruber/multilevel) you can use this to share a `levelup` database across multiple processes over a stream. In addition `multileveldown` supports seamless retry so you can reconnect to a server without your read streams / puts failing etc.

First create a server:

```js
const multileveldown = require('multileveldown')
const level = require('level')
const net = require('net')

const db = level('db')

const server = net.createServer(function (sock) {
  sock.on('error', function () {
    sock.destroy()
  })

  sock.pipe(multileveldown.server(db)).pipe(sock)
})

server.listen(9000)
```

Then create some clients:

```js
const multileveldown = require('multileveldown')
const net = require('net')

const db = multileveldown.client()

const sock = net.connect(9000)
sock.pipe(db.connect()).pipe(sock)

db.put('hello', 'world', function () {
  db.get('hello', console.log)
})
```

## Reconnect

To setup reconnect in your client simply set `retry: true` and reconnect to your server when the connection fails:

```js
const multileveldown = require('multileveldown')
const net = require('net')

const db = multileveldown.client({
  retry: true
})

const connect = function () {
  const sock = net.connect(9000)
  const remote = db.connect()

  sock.on('error', function () {
    sock.destroy()
  })

  sock.on('close', function () {
    remote.destroy()
    setTimeout(connect, 1000) // reconnect after 1s
  })

  sock.pipe(remote).pipe(sock)
}

connect()
```

`multileveldown` will now make sure to retry your pending operations when you reconnect. If you create a read stream
and your connection fails half way through reading that stream `multileveldown` makes sure to only retry the part of the
stream you are missing. Please note that this might not guarantee leveldb snapshotting if you rely on that.

## API

#### `multileveldown.server(db, [options])`

Returns a new duplex server stream that you should connect with a client. Options include:

```js
{
  readonly: true, // make the database be accessible as read only
  preput: function (key, val, cb) {}, // called before puts
  predel: function (key, cb) {}, // called before dels
  prebatch: function (batch, cb) {} // called before batches
}
```

#### `clientDb = multileveldown.client([options])`

Creates a new client levelup that you can connect to a server.
Options are forwarded to the levelup constructor.

#### `clientDb.connect()`

Returns a new duplex client stream that you should connect with a server stream

#### `clientDb.createRpcStream()`

Just an alias to `.connect` for [`multilevel`](https://github.com/juliangruber/multilevel) API compatibility.

## Install

With [npm](https://npmjs.org) do:

```
npm i multileveldown
```

## Contributing

[`Level/multileveldown`](https://github.com/Level/multileveldown) is an **OPEN Open Source Project**. This means that:

> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project.

See the [Contribution Guide](https://github.com/Level/community/blob/master/CONTRIBUTING.md) for more details.

## Donate

Support us with a monthly donation on [Open Collective](https://opencollective.com/level) and help us continue our work.

## License

[MIT](LICENSE)

[level-badge]: https://leveljs.org/img/badge.svg

---
_Source: https://npm.io/package/multileveldown · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
