alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
64 lines (53 loc) • 1.49 kB
text/typescript
import { $inject } from "alepha";
import { DateTimeProvider, type Timeout } from "alepha/datetime";
import { $logger } from "alepha/logger";
import type { LockProvider } from "./LockProvider.ts";
/**
* A simple in-memory store provider.
*/
export class MemoryLockProvider implements LockProvider {
protected readonly dateTimeProvider = $inject(DateTimeProvider);
protected readonly log = $logger();
/**
* The in-memory store.
*/
protected store: Record<string, string> = {};
/**
* Timeouts used to expire keys.
*/
protected storeTimeout: Record<string, Timeout> = {};
public async set(
key: string,
value: string,
nx?: boolean,
px?: number,
): Promise<string> {
if (nx && this.store[key] != null) {
return this.store[key];
}
if (px) {
this.ttl(key, px);
}
this.store[key] = value;
return this.store[key];
}
public async del(...keys: string[]): Promise<void> {
for (const key of keys) {
delete this.store[key];
if (this.storeTimeout[key] != null) {
this.storeTimeout[key].clear();
delete this.storeTimeout[key];
}
}
}
protected ttl(key: string, ms: number): void {
if (this.storeTimeout[key] != null) {
this.storeTimeout[key].clear();
delete this.storeTimeout[key];
}
this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {
delete this.store[key];
delete this.storeTimeout[key];
}, ms);
}
}