import { Observable } from 'rxjs/Observable'; import { GroupedObservable } from 'rxjs/operator/groupBy'; export interface SingleRequest { resource: R; id: string; } interface BatchRequest extends SingleRequest { batchId: number; fallbackWhen: FallbackWhen; } export interface BatchedRequest { resource: R; ids: string[]; } /** * 指定某一个请求在 batch service 中使用 fallback 的策略 */ export declare const enum FallbackWhen { /** * 不使用 fallback */ Never = 0, /** * 当聚合请求发生错误时,使用 fallback */ Error = 1, /** * 当单个请求没有和其他请求发生聚合时,使用 fallback */ Alone = 2, /** * 当聚合请求发生错误或者单个请求没有发生聚合时,都使用 fallback */ Both = 3 } export interface BatchRequestMethod { = KeyofStringOnly, T = RM[K]>(resourceName: K, resourceId: string, fallback?: Observable, fallbackWhen?: FallbackWhen): Observable; (resourceName: string, resourceId: string, fallback?: Observable, fallbackWhen?: FallbackWhen): Observable; } export interface BatchConfig { bufferTime?: number; maxBufferCount?: number | ((resource: M) => number); bufferTimer?: (groupedRequests$: GroupedObservable>) => Observable; maxConcurrent?: number; } export declare type RequestMethod = (resource: K, ids: string[]) => Observable; export declare type GetMatched = (result: R, id: string, resource: KeyofStringOnly) => RM[typeof resource] | undefined | never; export declare type KeyofStringOnly = Extract; declare type StringObj = { [key: string]: any; }; export declare const batchService: (requestMethod: RequestMethod, R>, getMatched: GetMatched, { bufferTime: defaultBufferTime, maxBufferCount, bufferTimer, maxConcurrent }?: BatchConfig>) => BatchRequestMethod; export {};