softkave-js-utils
Version:
JavaScript & Typescript utility functions, types, and classes
54 lines (53 loc) • 2.3 kB
TypeScript
import { ValueOf } from 'type-fest';
import { AnyFn, OrPromise, PartialRecord } from '../types.js';
import { ListenableResource } from './ListenableResource.js';
import { DisposableResource } from './disposables.js';
declare const kLockQueueItemState: {
readonly waiting: "w";
readonly waitingOnResolve: "wr";
};
type LockQueueItemState = ValueOf<typeof kLockQueueItemState>;
interface LockQueueItem {
state: LockQueueItemState;
resolveFn: AnyFn;
}
interface ILockWaiter {
remaining: number;
resolveFn: AnyFn;
timeoutId?: unknown;
}
type LocksMap = PartialRecord<string, ListenableResource<LockQueueItem>[]>;
export declare class LockStore implements DisposableResource {
protected locks: LocksMap;
protected waiters: Array<ILockWaiter>;
run<TFn extends AnyFn>(name: string, fn: TFn): Promise<Awaited<ReturnType<TFn>>>;
has(name: string): boolean;
wait(params: {
name: string;
remaining?: number;
timeoutMs?: number;
}): Promise<void>;
dispose(): void;
protected __run(name: string, item: ListenableResource<LockQueueItem>, fn: AnyFn): Promise<any>;
protected queue(name: string): ListenableResource<LockQueueItem>;
protected acquire(name: string, item: ListenableResource<LockQueueItem>): Promise<void>;
protected release(name: string): void;
protected execNext: (name: string) => void;
protected execLockItem: (item?: LockQueueItem) => boolean;
protected getLockQueue<TInitQueue extends boolean = true, TResult = TInitQueue extends true ? ListenableResource<LockQueueItem>[] : ListenableResource<LockQueueItem>[] | undefined>(name: string, init: TInitQueue): TResult;
}
export declare class LockableResource<T> {
protected locks: LockStore;
protected resource: T;
protected name: string;
constructor(locks: LockStore, resource: T, name?: string);
run(fn: AnyFn<[T], OrPromise<T | void>>): Promise<void>;
}
interface ISingleInstanceRunnerMakeOptions<TFn extends AnyFn> {
instanceSpecifier: (...args: Parameters<TFn>) => string;
fn: TFn;
}
export declare class SingleInstanceRunner {
static make<TFn extends AnyFn>(locks: LockStore, opts: ISingleInstanceRunnerMakeOptions<TFn>): (...args: Parameters<TFn>) => Promise<Awaited<ReturnType<TFn>>>;
}
export {};