LockDB
LockDB is a cross-platform tool you can use to handle process/event locking and avoid race conditions. It is sometimes also known as a semaphore.
There are packages for Node.js/Browser/Bun/NPM, Deno, and you can also use it as a CLI.
It has no dependencies, and is very simple to use, with effectively 3 commands/actions/methods: lock('name')
, unlock('name')
, and check('name')
. It also supports locking/unlocking/checking multiple locks at once.
You can get your apiKey
at lockdb.com or connect LockDB
to your own server/API.
Usage (package)
Node / Browser / Bun / Npm
You don't need to install anything with Deno, but here's how you do it with all others:
npm install --save-exact lockdb
yarn add --exact lockdb
pnpm add --save-exact lockdb
const LockDB = require('lockdb');
const lockName = 'sales';
const locker = new LockDB('reports', { apiKey: 'api-key' });
const isReportLocked = await locker.check(lockName);
console.log(isReportLocked);
try {
await locker.lock(lockName);
const wasReportLockedBeforeUnlock = await locker.unlock(lockName);
console.log(wasReportLockedBeforeUnlock);
} catch (error) {
console.error(`Failed to obtain lock (${lockName}): ${error}`);
}
CLI
You can find binaries for your system in the latest release.
Here's an example for Linux intel (x86_64), on downloading it with curl
and moving it to /usr/local/bin/
so it's available globally as lockdb
:
curl -L https://github.com/BrunoBernardino/lockdb/releases/latest/download/lockdb-linux-intel --output lockdb && chmod +x lockdb && sudo mv lockdb /usr/local/bin/
Then to use it, on any OS:
export LOCKDB_SERVICE_ID="reports"
export LOCKDB_API_KEY="api-key"
lockdb check sales
lockdb lock sales
lockdb unlock sales
lockdb check sales,report,cleanup
Development
Requires deno@1.41.0
(other versions will probably work).
make format
make test
deno run --allow-net mock_server.ts
deno run --allow-net --allow-env=LOCKDB_SERVICE_ID,LOCKDB_API_KEY,LOCKDB_SERVER_URL main.ts check sales --server-url="http://127.0.0.1:5678" --service-id="reports" --api-key="api-key"
Publishing
- Commit (and push) changes.
- Update
VERSION
in main.ts
. - Run
make publish VERSION=x.y.z
. That will publish to npm
and push a new tag, which will build binaries, and a new pre-release with them.