redis-semaphore
Advanced tools
Comparing version
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function acquireFairSemaphore(client: Redis, key: string, limit: number, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function acquireFairSemaphore(client: Redis.Redis | Redis.Cluster, key: string, limit: number, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; |
@@ -1,4 +0,4 @@ | ||
import { Redis } from 'ioredis'; | ||
export declare function acquire(client: Redis, key: string, limit: number, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function release(client: Redis, key: string, identifier: string): Promise<boolean>; | ||
export declare function refresh(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export declare function acquire(client: Redis.Redis | Redis.Cluster, key: string, limit: number, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function release(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<boolean>; | ||
export declare function refresh(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function refreshFairSemaphore(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function refreshFairSemaphore(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function releaseFairSemaphore(client: Redis, key: string, identifier: string): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function releaseFairSemaphore(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function acquireMutex(client: Redis, key: string, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function acquireMutex(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; |
@@ -1,4 +0,4 @@ | ||
import { Redis } from 'ioredis'; | ||
export declare function acquire(client: Redis, key: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function refresh(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
export declare function release(client: Redis, key: string, identifier: string): Promise<void>; | ||
import Redis from 'ioredis'; | ||
export declare function acquire(client: Redis.Redis | Redis.Cluster, key: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function refresh(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
export declare function release(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<void>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function refreshMutex(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function refreshMutex(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function releaseMutex(client: Redis, key: string, identifier: string): Promise<void>; | ||
import Redis from 'ioredis'; | ||
export default function releaseMutex(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<void>; |
@@ -5,3 +5,3 @@ /// <reference types="node" /> | ||
export default class RedisMutex { | ||
protected _client: Redis.Redis; | ||
protected _client: Redis.Redis | Redis.Cluster; | ||
protected _key: string; | ||
@@ -14,3 +14,3 @@ protected _identifier?: string; | ||
protected _refreshInterval?: NodeJS.Timeout; | ||
constructor(client: Redis.Redis, key: string, { lockTimeout, acquireTimeout, retryInterval, refreshInterval }?: TimeoutOptions); | ||
constructor(client: Redis.Redis | Redis.Cluster, key: string, { lockTimeout, acquireTimeout, retryInterval, refreshInterval }?: TimeoutOptions); | ||
protected _startRefresh(identifier: string): void; | ||
@@ -17,0 +17,0 @@ protected _stopRefresh(): void; |
@@ -22,3 +22,3 @@ "use strict"; | ||
} | ||
if (!(client instanceof ioredis_1.default)) { | ||
if (!(client instanceof ioredis_1.default || client instanceof ioredis_1.default.Cluster)) { | ||
throw new Error('"client" must be instance of ioredis client'); | ||
@@ -25,0 +25,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
import Redis from 'ioredis'; | ||
import { TimeoutOptions } from './misc'; | ||
@@ -6,3 +6,3 @@ import RedisMutex from './RedisMutex'; | ||
protected _limit: number; | ||
constructor(client: Redis, key: string, limit: number, { lockTimeout, acquireTimeout, retryInterval, refreshInterval }?: TimeoutOptions); | ||
constructor(client: Redis.Redis | Redis.Cluster, key: string, limit: number, { lockTimeout, acquireTimeout, retryInterval, refreshInterval }?: TimeoutOptions); | ||
protected _processRefresh(identifier: string): Promise<void>; | ||
@@ -9,0 +9,0 @@ acquire(): Promise<string>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function acquireSemaphore(client: Redis, key: string, limit: number, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function acquireSemaphore(client: Redis.Redis | Redis.Cluster, key: string, limit: number, identifier: string, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<boolean>; |
@@ -1,4 +0,4 @@ | ||
import { Redis } from 'ioredis'; | ||
export declare function acquire(client: Redis, key: string, limit: number, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function release(client: Redis, key: string, identifier: string): Promise<void>; | ||
export declare function refresh(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export declare function acquire(client: Redis.Redis | Redis.Cluster, key: string, limit: number, lockTimeout: number, acquireTimeout: number, retryInterval: number): Promise<string>; | ||
export declare function release(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<void>; | ||
export declare function refresh(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function refreshSemaphore(client: Redis, key: string, identifier: string, lockTimeout: number): Promise<boolean>; | ||
import Redis from 'ioredis'; | ||
export default function refreshSemaphore(client: Redis.Redis | Redis.Cluster, key: string, identifier: string, lockTimeout: number): Promise<boolean>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function releaseSemaphore(client: Redis, key: string, identifier: string): Promise<void>; | ||
import Redis from 'ioredis'; | ||
export default function releaseSemaphore(client: Redis.Redis | Redis.Cluster, key: string, identifier: string): Promise<void>; |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis'; | ||
export default function createEval(script: string, keysCount: number): (client: Redis, args: (string | number)[]) => Promise<any>; | ||
import Redis from 'ioredis'; | ||
export default function createEval(script: string, keysCount: number): (client: Redis.Redis | Redis.Cluster, args: (string | number)[]) => Promise<any>; |
@@ -10,3 +10,5 @@ "use strict"; | ||
function createSHA1(script) { | ||
return crypto_1.createHash('sha1').update(script, 'utf8').digest('hex'); | ||
return crypto_1.createHash('sha1') | ||
.update(script, 'utf8') | ||
.digest('hex'); | ||
} | ||
@@ -20,3 +22,2 @@ function isNoScriptError(err) { | ||
const baseSHAArgs = [sha1, keysCount]; | ||
const keysCountStr = '' + keysCount; // ... | ||
debug('creating script:', script, 'sha1:', sha1); | ||
@@ -27,3 +28,3 @@ return async function optimizedEval(client, args) { | ||
try { | ||
return await client.evalsha(sha1, keysCountStr, ...args); | ||
return await client.evalsha(sha1, keysCount, ...args); | ||
} | ||
@@ -30,0 +31,0 @@ catch (err) { |
{ | ||
"name": "redis-semaphore", | ||
"version": "2.0.1", | ||
"version": "2.1.0", | ||
"description": "Distributed mutex and semaphore based on Redis", | ||
@@ -11,2 +11,3 @@ "main": "lib/index.js", | ||
"dev": "mocha -w", | ||
"check-types": "tsc -b tsconfig.check-types.json", | ||
"build": "yarn build-commonjs", | ||
@@ -29,33 +30,33 @@ "build-commonjs": "rm -rf lib && yarn tsc -b tsconfig.build-commonjs.json", | ||
"devDependencies": { | ||
"@types/chai": "^4.2.11", | ||
"@types/chai-as-promised": "^7.1.2", | ||
"@types/chai": "^4.2.11", | ||
"@types/debug": "^4.1.5", | ||
"@types/ioredis": "^4.14.9", | ||
"@types/ioredis": "^4.16.1", | ||
"@types/mocha": "^7.0.2", | ||
"@types/node": "13.13.0", | ||
"@types/node": "13.13.5", | ||
"@types/sinon": "^9.0.0", | ||
"@types/sinon-chai": "^3.2.4", | ||
"@types/sinon": "^9.0.0", | ||
"@types/uuid": "^7.0.2", | ||
"@typescript-eslint/eslint-plugin": "2.28.0", | ||
"@typescript-eslint/parser": "2.28.0", | ||
"@types/uuid": "^7.0.3", | ||
"@typescript-eslint/eslint-plugin": "2.31.0", | ||
"@typescript-eslint/parser": "2.31.0", | ||
"babel-eslint": "^10.1.0", | ||
"benchmark": "^2.1.4", | ||
"chai": "4.2.0", | ||
"chai-as-promised": "7.1.1", | ||
"chai": "4.2.0", | ||
"coveralls": "^3.0.11", | ||
"coveralls": "^3.1.0", | ||
"eslint": "6.8.0", | ||
"eslint-config-inclusive": "1.2.7", | ||
"eslint-plugin-node": "11.1.0", | ||
"eslint": "6.8.0", | ||
"ioredis": "^4.16.2", | ||
"ioredis": "^4.16.3", | ||
"mocha": "7.1.2", | ||
"mocha-lcov-reporter": "^1.3.0", | ||
"mocha": "7.1.1", | ||
"nyc": "^15.0.1", | ||
"sinon": "9.0.2", | ||
"sinon-chai": "3.5.0", | ||
"sinon": "9.0.2", | ||
"snyk": "1.305.1", | ||
"ts-node": "^8.8.2", | ||
"snyk": "1.319.2", | ||
"ts-node": "^8.10.1", | ||
"typescript": "^3.8.3" | ||
}, | ||
"engines": { | ||
"node": ">= 8.0.0" | ||
"node": ">= 10.0.0" | ||
}, | ||
@@ -67,3 +68,3 @@ "peerDependencies": { | ||
"debug": "^4.1.1", | ||
"uuid": "^7.0.3" | ||
"uuid": "^8.0.0" | ||
}, | ||
@@ -70,0 +71,0 @@ "resolutions": { |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -39,3 +39,3 @@ import { createEval, delay } from '../utils/index' | ||
export default async function acquireFairSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -42,0 +42,0 @@ limit: number, |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
import { v4 as uuid4 } from 'uuid' | ||
@@ -14,3 +14,3 @@ | ||
export async function acquire( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -40,3 +40,7 @@ limit: number, | ||
export async function release(client: Redis, key: string, identifier: string) { | ||
export async function release( | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
identifier: string | ||
) { | ||
const finalKey = getKey(key) | ||
@@ -47,3 +51,3 @@ return await releaseSemaphore(client, finalKey, identifier) | ||
export async function refresh( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -50,0 +54,0 @@ identifier: string, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -34,3 +34,3 @@ import { createEval } from '../utils/index' | ||
export default async function refreshFairSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -37,0 +37,0 @@ identifier: string, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -20,3 +20,3 @@ import { createEval } from '../utils/index' | ||
export default async function releaseFairSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -23,0 +23,0 @@ identifier: string |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -9,3 +9,3 @@ import { delay } from '../utils/index' | ||
export default async function acquireMutex( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -12,0 +12,0 @@ identifier: string, |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
import { v4 as uuid4 } from 'uuid' | ||
@@ -14,3 +14,3 @@ | ||
export async function acquire( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -39,3 +39,3 @@ lockTimeout: number, | ||
export async function refresh( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -49,5 +49,9 @@ identifier: string, | ||
export async function release(client: Redis, key: string, identifier: string) { | ||
export async function release( | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
identifier: string | ||
) { | ||
const finalKey = getKey(key) | ||
return await releaseMutex(client, finalKey, identifier) | ||
} |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -21,3 +21,3 @@ import { createEval } from '../utils/index' | ||
export default async function refreshMutex( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -24,0 +24,0 @@ identifier: string, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -20,3 +20,3 @@ import { createEval } from '../utils/index' | ||
export default async function releaseMutex( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -23,0 +23,0 @@ identifier: string |
@@ -18,3 +18,3 @@ import createDebug from 'debug' | ||
export default class RedisMutex { | ||
protected _client: Redis.Redis | ||
protected _client: Redis.Redis | Redis.Cluster | ||
protected _key: string | ||
@@ -28,3 +28,3 @@ protected _identifier?: string | ||
constructor( | ||
client: Redis.Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -41,3 +41,3 @@ { | ||
} | ||
if (!(client instanceof Redis)) { | ||
if (!(client instanceof Redis || client instanceof Redis.Cluster)) { | ||
throw new Error('"client" must be instance of ioredis client') | ||
@@ -44,0 +44,0 @@ } |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -14,3 +14,3 @@ import LostLockError from './errors/LostLockError' | ||
constructor( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -17,0 +17,0 @@ limit: number, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -29,3 +29,3 @@ import { createEval, delay } from '../utils/index' | ||
export default async function acquireSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -32,0 +32,0 @@ limit: number, |
@@ -1,2 +0,2 @@ | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
import { v4 as uuid4 } from 'uuid' | ||
@@ -14,3 +14,3 @@ | ||
export async function acquire( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -40,3 +40,7 @@ limit: number, | ||
export async function release(client: Redis, key: string, identifier: string) { | ||
export async function release( | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
identifier: string | ||
) { | ||
const finalKey = getKey(key) | ||
@@ -47,3 +51,3 @@ return await releaseSemaphore(client, finalKey, identifier) | ||
export async function refresh( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -50,0 +54,0 @@ identifier: string, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -25,3 +25,3 @@ import { createEval } from '../utils/index' | ||
export default async function refreshSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -28,0 +28,0 @@ identifier: string, |
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -7,3 +7,3 @@ const debug = createDebug('redis-semaphore:semaphore:release') | ||
export default async function releaseSemaphore( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
key: string, | ||
@@ -10,0 +10,0 @@ identifier: string |
import { createHash } from 'crypto' | ||
import createDebug from 'debug' | ||
import { Redis } from 'ioredis' | ||
import Redis from 'ioredis' | ||
@@ -8,3 +8,5 @@ const debug = createDebug('redis-semaphore:eval') | ||
function createSHA1(script: string) { | ||
return createHash('sha1').update(script, 'utf8').digest('hex') | ||
return createHash('sha1') | ||
.update(script, 'utf8') | ||
.digest('hex') | ||
} | ||
@@ -20,6 +22,5 @@ | ||
const baseSHAArgs = [sha1, keysCount] | ||
const keysCountStr = '' + keysCount // ... | ||
debug('creating script:', script, 'sha1:', sha1) | ||
return async function optimizedEval( | ||
client: Redis, | ||
client: Redis.Redis | Redis.Cluster, | ||
args: Array<number | string> | ||
@@ -30,3 +31,3 @@ ) { | ||
try { | ||
return await client.evalsha(sha1, keysCountStr, ...args) | ||
return await client.evalsha(sha1, keysCount, ...args) | ||
} catch (err) { | ||
@@ -33,0 +34,0 @@ if (isNoScriptError(err)) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
308278
0.31%2026
0.7%+ Added
- Removed
Updated