UNPKG

softkave-js-utils

Version:

JavaScript & Typescript utility functions, types, and classes

54 lines (53 loc) 2.3 kB
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 {};