import { ApiClass, APIOptionsDefaults, ConfigOptions, EndpointFn, ResponseFullData } from "./public/RapixCore"; export type RapixRichResponse = ResponseFullData export type RapixResponse = { response: T __original: any, __reqTime: number, __resTime: number, __ping: number, __cached: boolean } export interface RapixProps { onSuccess: (callback?: (data: RapixResponse, fullResponse: RapixRichResponse) => any) => RapixProps, onError: (callback?: (data: RapixResponse, fullResponse: RapixRichResponse) => any) => RapixProps, always: (response?: any) => RapixProps, abort: () => {}, then: (onSuccess?: (data: E, fullResponse: RapixRichResponse) => any, onError?: (data: E, fullResponse: RapixRichResponse) => any) => RapixProps } type FunctionWithProps = T extends (props: infer P) => any ? (params?: P) => RapixProps : never; type ResponseMap = { [F in keyof C]: FunctionWithProps; }; export function rapix>(props: { settings: (params?: any) => ConfigOptions, collection: C }): ResponseMap { return new ApiClass({ ...APIOptionsDefaults, ...props }).collection as ResponseMap; } export function cascade(props: Array<(prevCallResponse?: any) => RapixProps>, callbacks?: [(success: any, error?: any) => void]): Promise { let countCalls = 0; let successes = 0; let results: any[] = []; return new Promise((resolve, reject) => { function checkResults() { if (countCalls === props.length) { if (countCalls === successes) { resolve(results); } else { reject(results) } } } function makeCall(number: number, params?: any) { let successResponse: any; props[number](params).onSuccess((r: any) => { if (callbacks && typeof callbacks[number] === "function") callbacks[number](r) successResponse = r; successes++; results.push(r); if (typeof props[number + 1] === "function") { makeCall(number + 1, successResponse); } }).onError((e: any) => { if (callbacks && typeof callbacks[number] === "function") callbacks[number](undefined, e) results.push(e); reject(results); }).always(() => { countCalls++; checkResults(); }); } makeCall(0); }) }