https://github.com/bcomnes/level-hookdown
Simple levelup hooks implemented using instance method override of arbitrary levelups.
https://github.com/bcomnes/level-hookdown
level-sublevel leveldb
Last synced: 4 months ago
JSON representation
Simple levelup hooks implemented using instance method override of arbitrary levelups.
- Host: GitHub
- URL: https://github.com/bcomnes/level-hookdown
- Owner: bcomnes
- License: mit
- Created: 2016-12-31T23:23:48.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2020-05-25T04:10:04.000Z (about 6 years ago)
- Last Synced: 2026-01-14T15:22:07.304Z (5 months ago)
- Topics: level-sublevel, leveldb
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/level-hookdown
- Size: 80.1 KB
- Stars: 16
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# level-hookdown
Simple levelup hooks implemented using instance method override of arbitrary levelups.
```
npm install level-hookdown
```
[![level badge][level-badge]](https://github.com/level/awesome)
[![npm][npm-image]][npm-url]
[](https://travis-ci.org/hypermodules/level-hookdown)
[](https://david-dm.org/hypermodules/level-hookdown)
[](https://david-dm.org/hypermodules/level-hookdown?type=dev)

[level-badge]: https://camo.githubusercontent.com/1bd15320a5fad1db168bba8bcedb098735f82464/68747470733a2f2f6c6576656c6a732e6f72672f696d672f62616467652e737667
[npm-image]: https://img.shields.io/npm/v/level-hookdown.svg
[npm-url]: https://www.npmjs.com/package/level-hookdown
## Usage
```js
var hook = require('level-hookdown')
var mem = require('level-mem') // or 'level' or other levelup factory
var mdb = mem()
var db = hook(mdb)
function prehook (operation, cb) {
console.log('this should run before the db operation')
console.log(operation)
cb()
}
function posthook (operation, cb) {
console.log('this should run after the db operation')
console.log(operation)
cb()
}
db.prehooks.push(prehook)
db.posthooks.push(posthook)
db.put('beep', 'boop', function (err) {
if (err) throw err
db.del('beep', function (err) {
if (err) throw err
db.batch([
{ type: 'put', key: 'father', value: 'gloop' },
{ type: 'put', key: 'another', value: 'heep' }
], function (err) {
if (err) throw err
console.log('done')
})
})
})
```
## API
#### `hookdb = hook(db, [options])`
Returns a levelup instance that executes a series of pre and post hook functions before `put`, `del`, and `batch` method calls. Composes well with [mafintosh/subleveldown](https://github.com/mafintosh/subleveldown). Conflicts with [dominictarr/level-sublevel](https://github.com/dominictarr/level-sublevel).
The following `options` can be set when wrapping a `level` with `hook`:
```js
{
type: 'parallel' | 'series' | 'limit',
limit: 5,
protectHook: false
}
```
- The `type` determines if the hook functions are run in series, parallel or parallel-limit. Default is `parallel`.
- The limit option is passed to `run-parallel-limit` when `type` is set to `limit`. The default is 5.
- `protectHook` performs a deep copy on the operation array in batches to preserve values if the levelup mutates them (like `subleveldown` does).
### Hooks
#### `hookdb.prehooks`
An array of hook functions that are run before `put`, `del`, and `batch` method calls to the `hookdb` instance. If a hook function in the prehook array returns an `err` object to its callback, the originating `put`, `del` or `batch` operation will not be run on the contained `db` that `hookdb` is wrapping. A prehook veto convetion could be built on top of this behavior via error handling and retry.
#### `hookdb.posthooks`
An array of functions that are run after sucessful `put`, `del`, and `batch` method calls on the wrapped `db` instance inside a `hookdb` instance.
#### `hookFn(operation, callback)`
Hook functions receive an `operation` object that describes the level operation and a `callback` function.
`hookdb.prehooks` and `hookdb.posthooks` are arrays that you can add, rearrange, and delete hook functions from using standard array methods like `hookdb.prehooks.push(fn)` and `hookdb.posthooks.pop(fn)`.
##### `operation`
The `operation` argument can contain an object that looks like:
- `{type:'put', key: 'key', value: 'value', opts}`
- `{type: 'del', key: 'key', opts}`
- `{type: 'batch', array: [operationArray], opts}`
The `opts` object in the level operation object are the options that get passed through to the wrapped level.
## See Also
- [hypermodules/level-auto-index](https://github.com/hypermodules/level-auto-index) - Automatic secondary indexing for leveldb and subleveldown leveraging `level-hookdown`.
- [hypermodules/level-idx](https://github.com/hypermodules/level-idx) - Another high-level API for creating secondary leveldb indexes using `level-auto-index` and `level-hookdown`.
This module is basically an alternative implementation of:
- [dominictarr/level-hooks](https://github.com/dominictarr/level-hooks)
but aimed at a subleveldown workflow. These were also influential:
- [dominictarr/level-post](https://github.com/dominictarr/level-post)
- [dominictarr/level-sublevel](https://github.com/dominictarr/level-sublevel)