mortice
    Preparing search index...

    mortice

    mortice

    codecov CI

    Isomorphic read/write lock that works in single processes, node clusters and web workers

    About

    • Reads occur concurrently
    • Writes occur one at a time
    • No reads occur while a write operation is in progress
    • Locks can be created with different names
    • Reads/writes can time out
    import mortice from 'mortice'
    import delay from 'delay'

    // the lock name & options objects are both optional
    const mutex = mortice()

    Promise.all([
    (async () => {
    const release = await mutex.readLock()

    try {
    console.info('read 1')
    } finally {
    release()
    }
    })(),
    (async () => {
    const release = await mutex.readLock()

    try {
    console.info('read 2')
    } finally {
    release()
    }
    })(),
    (async () => {
    const release = await mutex.writeLock()

    try {
    await delay(1000)

    console.info('write 1')
    } finally {
    release()
    }
    })(),
    (async () => {
    const release = await mutex.readLock()

    try {
    console.info('read 3')
    } finally {
    release()
    }
    })()
    ])
    read 1
    read 2
    <small pause>
    write 1
    read 3

    Mutexes are stored globally reference by name, this is so you can obtain the same lock from different contexts, including workers.

    When a mutex is no longer required, the .finalize function should be called to remove any internal references to it.

    import mortice from 'mortice'

    const mutex = mortice()

    // ...some time later

    mutex.finalize()

    If your app generates a lot of short-lived mutexes and you want to clean them up after the last lock has been released, pass the autoFinalize option to mortice in the owning context:

    import mortice from 'mortice'

    const mutex = mortice({
    autoFinalize: true
    })

    const release = await mutex.readLock()
    // ...some time later

    release()

    // mutex will be freed soon after

    This module should run on react native but it only supports single-process concurrency as it's not clear to the author (disclaimer - not a react native dev) what the officially supported process concurrency model is.

    Please open an issue if this is a feature you would like to see added.

    Install

    $ npm i mortice
    

    Loading this module through a script tag will make its exports available as Mortice in the global namespace.

    <script src="https://unpkg.com/mortice/dist/index.min.js"></script>
    

    API Docs

    License

    Licensed under either of

    Contribution

    Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.