Commit 91f21743 authored by nanahira's avatar nanahira

add isFree

parent c7182d86
......@@ -206,6 +206,17 @@ export class Aragami {
return this.driver.lock(actualKeys, async () => await cb());
}
async isFree(keys: MayBeArray<string | any>) {
const keyMeta = makeArray(keys);
const actualKeys = (
await Promise.all(keyMeta.map((o) => this.getLockKeys(o)))
).flat();
if (!keys.length) {
return true;
}
return this.driver.isFree(actualKeys);
}
useLock<A extends any[], R>(
cb: (...args: A) => R,
keySource: (...args: A) => Awaitable<MayBeArray<string | any>>,
......
......@@ -47,6 +47,10 @@ export class BaseDriver {
return cb();
}
async isFree(keys: string[]): Promise<boolean> {
return true;
}
async destroy(): Promise<void> {}
async isQueueEmpty(key: string): Promise<boolean> {
......
......@@ -79,6 +79,10 @@ export class MemoryDriver extends BaseDriver {
return this.betterLock.acquire(keys, cb);
}
override async isFree(keys: string[]): Promise<boolean> {
return keys.every((key) => this.betterLock.canAcquire(key));
}
private queues = new Map<string, Buffer[]>();
private blockingGathers = new Map<string, ((buf: Buffer) => void)[]>();
......
......@@ -95,6 +95,13 @@ export class RedisDriver extends BaseDriver {
);
}
override async isFree(keys: string[]): Promise<boolean> {
const lockKeys = keys.map(
(key) => `${this.options.lock?.prefix || '_lock'}:${key}`,
);
return (await this.pool.use((r) => r.redis.exists(...lockKeys))) === 0;
}
quitted = false;
async destroy() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment