Package detail

mortice

achingbrain153kApache-2.0 OR MIT3.3.1

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

async, await, cluster, lock

readme

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

Example

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

Clean up

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()

Auto clean up

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

React native support

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

Browser <script> tag

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.

changelog

3.3.1 (2025-06-05)

Bug Fixes

3.3.0 (2025-06-05)

Features

3.2.1 (2025-06-02)

Bug Fixes

3.2.0 (2025-06-02)

Features

  • expose queue, add finalize method (#96) (b0daf48)

3.1.0 (2025-05-28)

Features

3.0.6 (2024-10-24)

Dependencies

  • dev: bump esbuild from 0.19.12 to 0.24.0 (#86) (2e3610f)

3.0.5 (2024-10-24)

Trivial Changes

Dependencies

  • dev: bump aegir from 41.3.5 to 42.2.5 (#84) (ce44225)

3.0.4 (2023-12-18)

Dependencies

  • bump p-queue from 7.4.1 to 8.0.1 (#72) (7ab57c4)

3.0.3 (2023-12-08)

Bug Fixes

Trivial Changes

3.0.2 (2023-12-08)

Bug Fixes

3.0.1 (2022-08-17)

Dependencies

  • update aegir, p-timeout and p-queue (#34) (5c0eebc)

3.0.0 (2022-02-09)

⚠ BREAKING CHANGES

  • switch to named exports, ESM only

Features