Go to file
程广 a9bdbf1d4a 1.0.1 2025-11-17 15:52:09 +08:00
__tests__ ``` 2025-11-17 15:32:19 +08:00
.gitignore feat(init): 初始化项目结构和基础代码 2025-11-13 22:32:05 +08:00
LICENSE feat(init): 初始化项目结构和基础代码 2025-11-13 22:32:05 +08:00
README.md ``` 2025-11-17 15:50:15 +08:00
async-lock.js feat(init): 初始化项目结构和基础代码 2025-11-13 22:32:05 +08:00
file-lock.js feat(init): 初始化项目结构和基础代码 2025-11-13 22:32:05 +08:00
index.js ``` 2025-11-17 15:32:19 +08:00
jest.config.js feat(init): 初始化项目结构和基础代码 2025-11-13 22:32:05 +08:00
lock-client.js ``` 2025-11-17 15:50:15 +08:00
lock-client.namedpipe.js ``` 2025-11-17 15:32:19 +08:00
lock-client.tcp.js ``` 2025-11-17 15:32:19 +08:00
lock.js ``` 2025-11-17 15:32:19 +08:00
lock.namedpipe.js ``` 2025-11-17 15:32:19 +08:00
lock.tcp.js ``` 2025-11-17 15:32:19 +08:00
package.json 1.0.1 2025-11-17 15:52:09 +08:00

README.md

nlocks

A Node.js library providing asynchronous locking mechanisms including in-memory locks and file-based locks for coordinating access to resources across concurrent processes.

Features

  • AsyncLock: In-memory asynchronous lock for coordinating access to resources within a single process
  • FileLock: File-based lock for coordinating access to resources across multiple processes
  • TCPLock: TCP-based distributed lock for coordinating access to resources across multiple machines
  • Lightweight and easy to use
  • Promise-based API
  • Comprehensive test coverage

Installation

npm install nlocks

Usage

const { AsyncLock, FileLock } = require('nlocks');

const asyncLock = new AsyncLock();
const fileLock = new FileLock();

AsyncLock

An in-memory lock for synchronizing async operations within a single Node.js process:

const AsyncLock = require('nlocks/async-lock');

const lock = new AsyncLock();

async function protectedOperation() {
  await lock.acquire();
  try {
    // Your critical section code here
    console.log('Performing protected operation');
    await someAsyncWork();
  } finally {
    lock.release();
  }
}

FileLock

A file-based lock for synchronizing operations across multiple Node.js processes:

const FileLock = require('nlocks/file-lock');

const lock = new FileLock();

async function fileProtectedOperation() {
  await lock.acquire('/path/to/your/file.txt');
  try {
    // Your file operation code here
    console.log('Performing file operation');
    await someFileAsyncWork();
  } finally {
    lock.release('/path/to/your/file.txt');
  }
}

TCPLock

A TCP-based distributed lock for synchronizing operations across multiple machines:

Server side

const TCPLockServer = require('nlocks/lock.tcp');

// Create and start a TCP lock server
const server = new TCPLockServer({
  host: '0.0.0.0',  // Listen host
  port: 7301        // Listen port
});

server.start();

Client side

const TcpRwLock = require('nlocks/lock-client.tcp');

// Create a TCP lock client
const lock = new TcpRwLock('resource-name', {
  connect: {
    host: 'localhost',  // Server host
    port: 7301          // Server port
  }
});

async function tcpProtectedOperation() {
  await lock.connect();  // Connect to the lock server
  try {
    await lock.readLock();   // Acquire a read lock
    // Or use await lock.writeLock(); for a write lock
    
    // Your critical section code here
    console.log('Performing protected operation');
    await someAsyncWork();
  } finally {
    await lock.unlock();     // Release the lock
    await lock.close(); // Disconnect from server
  }
}

API

AsyncLock

  • new AsyncLock() - Creates a new AsyncLock instance
  • acquire(): Promise<void> - Acquires the lock
  • release(): void - Releases the lock

FileLock

  • new FileLock() - Creates a new FileLock instance
  • acquire(filePath): Promise<void> - Acquires a lock for the specified file path
  • release(filePath): void - Releases the lock for the specified file path

TCPLock

Server

  • new TCPLockServer(options) - Creates a new TCP lock server instance
    • options.host: Host to listen on (default: '0.0.0.0')
    • options.port: Port to listen on (default: 7301)
  • start(): void - Starts the lock server
  • stop(): void - Stops the lock server

Client

  • new TcpRwLock(resource, options) - Creates a new TCP lock client instance
    • resource: Name of the resource to lock
    • options.connect.host: Server hostname to connect to (default: 'localhost')
    • options.connect.port: Server port to connect to (default: 7301)
  • connect(): Promise<void> - Connects to the lock server
  • readLock(): Promise<void> - Acquires a read lock
  • writeLock(): Promise<void> - Acquires a write lock
  • unlock(): Promise<void> - Releases the currently held lock

Testing

Run the test suite with:

npm test

License

MIT