GithubHelp home page GithubHelp logo

martinheidegger / flexlock Goto Github PK

View Code? Open in Web Editor NEW
5.0 3.0 1.0 178 KB

A memory-efficient, in-memory, flexible, Promise-based locking library without dependencies.

License: MIT License

JavaScript 100.00%
javascript lock process multithreading mutex mutex-lock mutex-synchronisation

flexlock's Introduction

flexlock

Build Status JavaScript Style Guide Maintainability Test Coverage

flexlock is a small, memory-concious, flexible, Promise-based locking library without dependencies.

npm i flexlock --save

It is similar to other in-memory locking library like mutexify, mutex-js, await-lock, and many more, but with more flexibility in how to use it. This makes it sturdier and more practical in many cases.

simple API when that suffices

const createLock = require('flexlock/createLock') // require('flexlock').createLock works too

const lock = createLock()

lock(async () => {
  // done before the next block
})
lock(async () => {
  // done after the previous block
})

Timeouts in case anther lock never returns

lock(() => new Promise()) // This never releases the lock
lock(async () => {}, 500)
  .catch(err => {
    err.code === 'ETIMEOUT'
  })

Propagation of errors and results

async function business () {
  try {
    const important = await lock(async () => {
      // do your thing
      return important
    })
    // You can use the important data here.
  } catch (err) {
    // Woops, something happened!
  }
}

Dedicated locks for more readable async code

async function business () {
  const unlock = await lock()
  // do your thing
  unlock()
}

release handlers both once and globally

const lock = createLock(() => {
  // called every time the lock is released
})

lock.released(function () {
  // called once, next time the lock is released
})

await lock.released() // Promise API available as well

Namespace support for multiple lockers

const createLocker = require('flexlock/createLocker') // require('flexlock').createLocker works too

const lock = createLocker()

async function business (id, content) {
  await lock(id, async () => {
    // do your thing, locked to this id!
  })
}

Implementation note: The locker will use createLock per id. It will keep the created lock until all locks for that id are released. Then it will pass the lock to the garbage collector.

License

MIT

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.