Skip to content

winrey/front-lock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Ā 

History

37 Commits
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 
Ā 

Repository files navigation

front-lock

An useful async lockšŸ” for frontend (web).

No need for Database.

Also available on node.js. (But it doesn't work on the node.js program who use multi-process)

äø­ę–‡ę–‡ę”£

Install

npm install front-lock

or

yarn add front-lock

Usage

lock

RECOMMEND
Simple to use:

import { lock } from 'front-lock'

lock("lock-name", async () => {
    // Do something async in the lock
    if (!userInfo) {
      userInfo = await login()
    }

})

Do something after lock:

import { lock } from 'front-lock'

lock("another-lock-name", async () => {
  // Do something async in lock
  await xxxx
}).then(() => {
  // Do something after lock
  // ...
}).catch(err => {
  // catch error in lock (and function provided in lock)
  // ...
})

If you need the return value (and you can also use await):

import { lock } from 'front-lock'

(async () => {
  const value = await lock("lock-name", async () => {
      // Do something async in lock
      return await 123
  })
  console.log(value)
  // > 123
})()

If you have difficult to name it, you can use symbol:

import { lock } from 'front-lock'

lock(Symbol(), new Promise(resolve => {
  // You can also use Promise here
  resolve(123)
}))

Also support to set timeout

import {
  lock, wait, Lock,
  TicketUnvalidError
} from 'front-lock'

// You can also use Lock to create lock
const myLock = new Lock()

lock(myLock, async () => {
    // Do something async in lock
    wait(2000)
}, { timeout: 1000, continueExcute: false }).catch(err => {
  if (err instanceof TicketUnvalidError) {
    // handle this timeout Error when lock function return (if you set {continueExcute: false})
    // ......
  }
  // handle other Error
  // ......
})

Lock

If you want to more flexible, you can use Lock class directly. See more details in the code.

import {
  wait, Lock,
} from 'front-lock'

// You can also use lock to create lock
const lock = new Lock()

(async () => {
  // At the start of the async code you need to lock
  const ticket = await lock.lock()
  // you can also set timeout here
  // const ticket = await lock.lock(5000)
  try {
    // do something async
    // .......
    await wait(1000)
  } finally {
    // At the end of the code you need to lock
    // you should make sure the unlock function will run in any situation, or set a timeout.
    await lock.unlock(ticket)
  }


})()

todo

  • Trans to Typescript
  • Write Test
  • Test Multi-lock Situation
  • Add Timeout
  • Test Timeout
  • Test Error
  • Support Worker