import * as api from './api'; import { ApiMethods } from './api-methods'; import { MiddlewareOn } from './api-middleware'; declare type PropType = T[PropT]; declare type Predicate = PropType, '_'>; declare type ClassType = new (...args: unknown[]) => T; export declare type ErrorHandler = (error: Error, ctx?: Record) => unknown; export declare type TdLibConfig = Omit; export declare type PlainObjectToModelTransformer = (plainObject: TdObject) => ClassType | TdObject; export declare type MiddlewareFn = (ctx: ContextT, next: () => Promise) => any; export declare type Middleware = { middleware: () => MiddlewareFn; } | MiddlewareFn; export declare type NextFn = () => any; export interface Deferred { promise: Promise; resolve: () => unknown; reject: (error: Error) => unknown; } export interface Composer { middleware(): MiddlewareFn; on(predicateTypes: string | string[], ...fns: Middleware[]): void; use(...fns: Middleware[]): void; } export interface Config extends TdLibConfig { provider: ProviderT; context?: Record | ((ctx: Context) => Record); models?: PlainObjectToModelTransformer; databaseEncryptionKey?: string; logVerbosityLevel?: number; name?: string; token?: string; } export interface Instance { readonly api: ApiMethods; readonly config: Config; readonly provider: ProviderT; readonly name: string; handleError: ErrorHandler; readonly on: MiddlewareOn; catch(handler: (error: Error) => void): void; emit(update: UpdateT): Promise; use(...fns: Middleware<(ApiResponse | UpdateContext)>[]): void; } export interface ApiRequest { method: string; params: ParamsT; } export interface ApiRequestOptions { state?: Record; } export interface ApiResponse extends ContextState { _: Predicate | 'error'; request: ApiRequest; response: ResultT | api.ErrorUnion; airgram: Instance; } export interface TdProvider { initialize(handleUpdate: (update: TdObject) => Promise, handleError: (error: Error | string) => void, models?: PlainObjectToModelTransformer): void; send(request: ApiRequest): Promise; } export interface BaseTdObject { _: string; } export interface TdObject extends BaseTdObject { [key: string]: TdObject | TdObject[] | number | number[] | string | string[] | boolean | boolean[] | undefined; } export declare type SetStateFn = (nextState: Record) => void; export declare type GetStateFn = () => Record; export interface ContextState { setState: SetStateFn; getState: GetStateFn; } export interface UpdateContext extends ContextState { _: Predicate; update: UpdateT; airgram: Instance; } export declare type Context = (ApiResponse | UpdateContext) & T; export {};