antongolub/push-it-to-the-limit

View on GitHub
src/main/ts/interface.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
export type IAny = any
export type IBasicDelay = number
export type IComplexDelay = {
  period: number,
  count: number
}
export type TimeoutID = ReturnType<typeof setTimeout>
export type IMixedDelays = Array<IBasicDelay | IComplexDelay>
export type INormalizedDelays = Array<IComplexDelay>
export type IDelay = number
export type ITarget = (...args: IAny[]) => IAny
export type ILimit = IComplexDelay & {
  ttl: number,
  rest: number,
  timeout?: TimeoutID
}
export type ILimitStack = Array<ILimit>

export type ICall = {
  fail: () => void,
  complete: () => void
}
export type ICallStack = Array<ICall>

export type IResolve = (value: IAny) => void
export type IReject = (value: IAny) => void

export type IControlled<T = Record<any, any>> = T & {
  (...args: IAny[]): Promise<IAny>,
  flush(): void,
  cancel(): void
}
export type ILodashOpts = {
  leading?: boolean,
  trailing?: boolean,
  maxWait?: IBasicDelay
}

export type IOrder = 'fifo' | 'lifo'

export interface ILimiter {
  limits: ILimitStack,
  getNextDelay(): number,
  reset(): void,
  resetTtl(): void,
  decrease(): void,
  isAllowed(): boolean,
  getNextQueueSize(): number,
}

export type IWrapperOpts = {
  delay: IDelay | IComplexDelay,
  limit?: ILimit | ILimitStack,
  context?: IAny,
  rejectOnCancel?: boolean,
  order?: IOrder,
  limiter?: ILimiter
} & ILodashOpts

export type IWrapper = (fn: ITarget, opts: IWrapperOpts) => IControlled
export type IExposedWrapper = {
  (fn: ITarget, opts: IWrapperOpts): IControlled,
  (fn: ITarget, delay: IDelay, opts?: ILodashOpts): IControlled,
  (fn: ITarget, delay: IComplexDelay, opts?: ILodashOpts): IControlled,
  (fn: ITarget, limit: ILimitStack | ILimit, opts?: ILodashOpts): IControlled,
}

export type Nullable<T> = T | null

export type NotAlwaysDefined<T> = T | undefined

export type Optional<T> = Nullable<T> | NotAlwaysDefined<T>