@shagital/atomic-lock
Version:
Universal atomic locking with pluggable drivers (Redis, SQLite, File, Memory)
93 lines (79 loc) • 2.23 kB
text/typescript
import { Redis } from 'ioredis'
/**
* Type definitions for atomic-lock
*/
export interface LockOptions {
expiryInSeconds?: number
maxRetries?: number
circuitBreakerThreshold?: number
circuitBreakerResetTime?: number
maxFailureEntries?: number
}
export interface CircuitBreakerStats {
isOpen: boolean
failureCount: number
lastFailure?: number
nextAttemptAt?: number
}
export interface LockInfo {
key: string
value: string
expiresAt: number
createdAt?: number
}
export interface LockDriver {
tryAcquire(key: string, lockValue: string, expiryInSeconds: number): Promise<boolean>
tryAcquireMultiple(keys: string[], lockValue: string, expiryInSeconds: number): Promise<boolean>
release(key: string, lockValue: string): Promise<boolean>
releaseMultiple(keys: string[], lockValue: string): Promise<number>
exists?(key: string): Promise<boolean>
getLockInfo?(key: string): Promise<LockInfo | null>
cleanup?(): Promise<void>
close?(): Promise<void>
}
export interface RedisConnectionOptions {
host?: string
port?: number
password?: string
username?: string
db?: number
family?: 4 | 6
connectTimeout?: number
commandTimeout?: number
retryDelayOnFailover?: number
maxRetriesPerRequest?: number | null
lazyConnect?: boolean
keepAlive?: number
keyPrefix?: string
}
export interface RedisConfig {
// Option 1: Pass existing Redis client instance
client?: Redis
// Option 2: Redis URL (redis://user:pass@host:port/db)
url?: string
// Option 3: Individual connection parameters
host?: string
port?: number
password?: string
username?: string
db?: number
// Additional ioredis options
options?: RedisConnectionOptions
}
export interface FileConfig {
lockDir: string
cleanupInterval?: number
}
export interface SQLiteConfig {
db: any // SQLite database instance or connection string
}
export interface MemoryConfig {
// No specific config needed for memory driver
}
export interface DriverConfig {
driver: 'redis' | 'file' | 'sqlite' | 'memory'
redis?: RedisConfig
file?: FileConfig
sqlite?: SQLiteConfig
memory?: MemoryConfig
}