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

> Isomorphic read/write lock that works in single processes, node clusters and web workers
- 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
``ts
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
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.
`ts
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:
`ts
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.
`console`
$ npm i mortice
-
Licensed under either of
- Apache 2.0, (LICENSE-APACHE /
- MIT (LICENSE-MIT /
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.