Nurturing Palpable Magnificence


    5.1.1 • Public • Published


    Open a leveldb handle multiple times, transparently upgrading to use multileveldown when more than 1 process try to use the same leveldb data directory at once and re-electing a new master when the primary unix socket goes down.

    level badge npm Node version Test Coverage Standard Common Changelog Donate


    Normally with level, when you try to open a database handle from more than one process you will get a locking error:

            throw er; // Unhandled 'error' event
    OpenError: IO error: lock /home/substack/projects/level-party/example/data/LOCK: Resource temporarily unavailable
        at /home/substack/projects/level-party/node_modules/level/node_modules/level-packager/node_modules/levelup/lib/levelup.js:114:34

    With level-party, the database open will automatically drop down to using multilevel over a unix socket using metadata placed into the level data directory transparently.

    This means that if you have 2 programs, 1 that gets:

    const level = require('level-party')
    const db = level(__dirname + '/data', { valueEncoding: 'json' })
    setInterval(function () {
      db.get('a', function (err, value) {
        console.log('a=', value)
    }, 250)

    And 1 that puts:

    const level = require('level-party')
    const db = level(__dirname + '/data', { valueEncoding: 'json' })
    const n = Math.floor(Math.random() * 100000)
    setInterval(function () {
      db.put('a', n + 1)
    }, 1000)

    and you start them up in any order, everything will just work! No more IO error: lock exceptions.

    $ node put.js & sleep 0.2; node put.js & sleep 0.2; node put.js & sleep 0.2; node put.js & sleep 0.2
    [1] 3498
    [2] 3502
    [3] 3509
    [4] 3513
    $ node get.js
    a= 35340
    a= 31575
    a= 37639
    a= 58874
    a= 35341
    a= 31576
    $ node get.js
    a= 35344
    a= 31579
    a= 37643
    a= 58878
    a= 35345


    Seamless failover

    level-party does seamless failover. This means that if you create a read-stream and the leader goes down while you are reading that stream level-party will resume your stream on the new leader.

    This disables leveldb snapshotting so if your app relies on this you should disable this by setting opts.retry = false:

    const db = level('./data', { retry: false }) // will not retry streams / gets / puts if the leader goes down

    Windows support

    level-party works on Windows as well using named pipes.


    db = level(...)

    The arguments are exactly the same as level. You will sometimes get a real leveldb handle and sometimes get a multileveldown handle back in the response.


    With npm do:

    npm install level-party


    Level/party 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 for more details.


    Support us with a monthly donation on Open Collective and help us continue our work.




    npm i level-party

    DownloadsWeekly Downloads






    Unpacked Size

    19.3 kB

    Total Files


    Last publish


    • vweevers
    • mafintosh
    • substack