alova
Version:
The Request Toolkit For Ultimate Efficiency
206 lines (191 loc) • 6.95 kB
TypeScript
import { AlovaGenerics, AlovaOptions, AlovaRequestAdapter, Method, StatesHook } from 'alova';
import adapterFetch from 'alova/fetch';
/**
* Unifiedly obtain the type of AlovaRequestAdapter
*/
export type AlovaRequestAdapterUnified<
RA extends
| AlovaRequestAdapter<any, any, any>
| ((...args: any[]) => AlovaRequestAdapter<any, any, any>) = AlovaRequestAdapter<any, any, any>
> = RA extends AlovaRequestAdapter<any, any, any> ? RA : ReturnType<RA>;
// transform types StateHook and AlovaRequestAdapter to an AlovaGenerics
export type StateHookAdapter2AG<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> =
Parameters<RA>[1] extends Method<AlovaGenerics<infer R, infer T, infer RC, infer RE, infer RH>>
? AlovaGenerics<R, T, RC, RE, RH, any, any, SH extends StatesHook<infer SE> ? SE : unknown>
: never;
export type AlovaResponded<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> = NonNullable<
AlovaOptions<StateHookAdapter2AG<SH, RA>>['responded']
>;
export type MetaMatches = Record<string, any>;
export type ResponseInterceptHandler<RA extends AlovaRequestAdapter<any, any, any>, RESULT = Promise<void>> = (
response: ReturnType<ReturnType<RA>['response']> extends Promise<infer RE> ? RE : never,
method: Parameters<RA>[1]
) => RESULT;
export type ResponseErrorInterceptHandler<RA extends AlovaRequestAdapter<any, any, any>, RESULT = Promise<void>> = (
error: any,
method: Parameters<RA>[1]
) => RESULT;
export type ResponseAuthorizationInterceptor<RA extends AlovaRequestAdapter<any, any, any>> =
| ResponseInterceptHandler<RA, void | Promise<void>>
| {
metaMatches?: MetaMatches;
handler: ResponseInterceptHandler<RA, void | Promise<void>>;
};
export type RequestHandler<RA extends AlovaRequestAdapter<any, any, any>, RESULT = Promise<void>> = (
method: Parameters<RA>[1]
) => RESULT;
export interface TokenAuthenticationOptions<RA extends AlovaRequestAdapter<any, any, any>> {
/**
* Ignore intercepted methods
*/
visitorMeta?: MetaMatches;
/**
* Login request interceptor
*/
login?: ResponseAuthorizationInterceptor<RA>;
/**
* Logout request interceptor
*/
logout?: ResponseAuthorizationInterceptor<RA>;
/**
* Assign token callback function, requests for login ID and visitor ID will not trigger this function
* @param method method instance
*/
assignToken?: <AG extends AlovaGenerics>(method: Method<AG>) => void | Promise<void>;
}
export interface ClientTokenAuthenticationOptions<RA extends AlovaRequestAdapter<any, any, any>>
extends TokenAuthenticationOptions<RA> {
/**
* Determine whether the token has expired in the interceptor before the request, and refresh the token
*/
refreshToken?: {
/**
* Determine whether the token has expired
*/
isExpired: RequestHandler<RA, boolean | Promise<boolean>>;
/**
* Refresh token
*/
handler: RequestHandler<RA>;
/**
* Customize the method meta that matches the refresh token
*/
metaMatches?: MetaMatches;
};
}
export type AlovaBeforeRequest<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> = (
method: Method<StateHookAdapter2AG<SH, RA>>
) => void | Promise<void>;
type BeforeRequestType<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> = (
originalBeforeRequest?: AlovaBeforeRequest<SH, RA>
) => AlovaBeforeRequest<SH, RA>;
type ResponseType<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> = (
originalResponded?: AlovaResponded<SH, RA>
) => AlovaResponded<SH, RA>;
export interface TokenAuthenticationResult<SH extends StatesHook<any>, RA extends AlovaRequestAdapter<any, any, any>> {
onAuthRequired: BeforeRequestType<SH, RA>;
onResponseRefreshToken: ResponseType<SH, RA>;
waitingList: {
method: Method<StateHookAdapter2AG<SH, RA>>;
resolve: () => void;
}[];
}
export interface ServerTokenAuthenticationOptions<RA extends AlovaRequestAdapter<any, any, any>>
extends TokenAuthenticationOptions<RA> {
/**
* Determine whether the token has expired in the request success interceptor and refresh the token
*/
refreshTokenOnSuccess?: {
/**
* Determine whether the token has expired
*/
isExpired: ResponseInterceptHandler<RA, boolean | Promise<boolean>>;
/**
* Refresh token
*/
handler: ResponseInterceptHandler<RA>;
/**
* Customize the method meta that matches the refresh token
*/
metaMatches?: MetaMatches;
};
/**
* Determine whether the token has expired in the request failure interceptor and refresh the token
*/
refreshTokenOnError?: {
/**
* Determine whether the token has expired
*/
isExpired: ResponseErrorInterceptHandler<RA, boolean | Promise<boolean>>;
/**
* Refresh token
*/
handler: ResponseErrorInterceptHandler<RA>;
/**
* Customize the method meta that matches the refresh token
*/
metaMatches?: MetaMatches;
};
}
/**
* Create a client-side token authentication interceptor
* @example
* ```js
* const { onAuthRequired, onResponseRefreshToken } = createClientTokenAuthentication(\/* ... *\/);
* const alova = createAlova({
* // ...
* beforeRequest: onAuthRequired(method => {
* // ...
* }),
* responded: onResponseRefreshToken({
* onSuccess(response, method) {
* // ...
* },
* onError(error, method) {
* // ...
* },
* })
* });
* ```
* @param options Configuration parameters
* @returns token authentication interceptor function
*/
export declare function createClientTokenAuthentication<
SH extends StatesHook<any>,
RA extends
| AlovaRequestAdapter<any, any, any>
| ((...args: any[]) => AlovaRequestAdapter<any, any, any>) = typeof adapterFetch
>(
options: ClientTokenAuthenticationOptions<AlovaRequestAdapterUnified<RA>>
): TokenAuthenticationResult<SH, AlovaRequestAdapterUnified<RA>>;
/**
* Create a server-side token authentication interceptor
* @example
* ```js
* const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication(\/* ... *\/);
* const alova = createAlova({
* // ...
* beforeRequest: onAuthRequired(method => {
* // ...
* }),
* responded: onResponseRefreshToken({
* onSuccess(response, method) {
* // ...
* },
* onError(error, method) {
* // ...
* },
* })
* });
* ```
* @param options Configuration parameters
* @returns token authentication interceptor function
*/
export declare function createServerTokenAuthentication<
SH extends StatesHook<any>,
RA extends
| AlovaRequestAdapter<any, any, any>
| ((...args: any[]) => AlovaRequestAdapter<any, any, any>) = typeof adapterFetch
>(
options: ServerTokenAuthenticationOptions<AlovaRequestAdapterUnified<RA>>
): TokenAuthenticationResult<SH, AlovaRequestAdapterUnified<RA>>;