swarthy/redis-semaphore

View on GitHub
src/RedisSemaphore.ts

Summary

Maintainability
A
0 mins
Test Coverage
import RedisMutex from './RedisMutex'
import { acquireSemaphore } from './semaphore/acquire'
import { refreshSemaphore } from './semaphore/refresh'
import { releaseSemaphore } from './semaphore/release'
import { LockOptions, RedisClient } from './types'

export default class RedisSemaphore extends RedisMutex {
  protected _kind = 'semaphore'
  protected _limit: number

  constructor(
    client: RedisClient,
    key: string,
    limit: number,
    options?: LockOptions
  ) {
    super(client, key, options)
    if (!limit) {
      throw new Error('"limit" is required')
    }
    if (typeof limit !== 'number') {
      throw new Error('"limit" must be a number')
    }
    this._key = `semaphore:${key}`
    this._limit = limit
  }

  protected async _refresh() {
    return await refreshSemaphore(
      this._client,
      this._key,
      this._limit,
      this._acquireOptions
    )
  }

  protected async _acquire() {
    return await acquireSemaphore(
      this._client,
      this._key,
      this._limit,
      this._acquireOptions
    )
  }

  protected async _release() {
    await releaseSemaphore(this._client, this._key, this._identifier)
  }
}