Compare commits

...

2 Commits

3 changed files with 48 additions and 35 deletions

View File

@ -1,41 +1,46 @@
import Axios, {AxiosError, AxiosRequestConfig} from "axios"; import Axios, { AxiosError, AxiosRequestConfig } from "axios";
import {S5Error} from "./client.js"; import { S5Error } from "./client.js";
export interface CancelablePromise<T> extends Promise<T> { export interface CancelablePromise<T> extends Promise<T> {
cancel: () => void; cancel: () => void;
} }
export const customInstance = <T>( export const customInstance = <T>(
config: AxiosRequestConfig, config: AxiosRequestConfig,
options?: AxiosRequestConfig, options?: AxiosRequestConfig,
): CancelablePromise<T> => { ): CancelablePromise<T> => {
const source = Axios.CancelToken.source(); const abort = new AbortController();
/* /*
Hack to ensure that the data is passed to the request as an option. Hack to ensure that the data is passed to the request as an option.
*/ */
if (options?.data) { if (options?.data) {
config = config || {}; config = config || {};
config.data = options.data; config.data = options.data;
delete config.data; delete config.data;
} }
const instance = Axios.create({baseURL: options?.baseURL}); const instance = Axios.create({ baseURL: options?.baseURL });
const promise = instance({ const promise = instance({
...config, signal: abort.signal,
...options, ...config,
cancelToken: source.token, ...options,
}).then(({data}) => data).catch((error) => { })
if (Axios.isCancel(error)) { .then(({ data }) => data)
return; .catch((error) => {
} if (Axios.isCancel(error)) {
throw new S5Error((error as AxiosError).message, (error as AxiosError).response?.status as number); return;
}) }
throw new S5Error(
(error as AxiosError).message,
(error as AxiosError).response?.status as number,
);
});
// @ts-ignore // @ts-ignore
promise.cancel = () => { promise.cancel = () => {
source.cancel("Query was cancelled"); abort.abort("Query was cancelled");
}; };
return promise as CancelablePromise<T>; return promise as CancelablePromise<T>;
}; };

View File

@ -71,13 +71,13 @@ import { blake3 } from "@noble/hashes/blake3";
import { base64urlDecode, base64urlEncode } from "./utils/encoding.js"; import { base64urlDecode, base64urlEncode } from "./utils/encoding.js";
export class S5Error extends Error { export class S5Error extends Error {
public statusCode: number; public statusCode: number;
constructor(message: string, statusCode: number) { constructor(message: string, statusCode: number) {
super(message); super(message);
this.name = "S5Error"; this.name = "S5Error";
this.statusCode = statusCode; this.statusCode = statusCode;
} }
} }
/** /**

View File

@ -18,6 +18,7 @@ export type CustomClientOptions = {
customCookie?: string; customCookie?: string;
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void;
onUploadProgress?: (progressEvent: AxiosProgressEvent) => void; onUploadProgress?: (progressEvent: AxiosProgressEvent) => void;
httpConfig?: AxiosRequestConfig;
}; };
export function optionsToConfig( export function optionsToConfig(
@ -29,7 +30,7 @@ export function optionsToConfig(
| CustomRegistryOptions | CustomRegistryOptions
)[] )[]
): AxiosRequestConfig { ): AxiosRequestConfig {
const config: AxiosRequestConfig = {}; let config: AxiosRequestConfig = {};
config.baseURL = client.portalUrl; config.baseURL = client.portalUrl;
@ -75,5 +76,12 @@ export function optionsToConfig(
config.headers = headers; config.headers = headers;
if (finalOptions?.httpConfig) {
config = {
...config,
...finalOptions.httpConfig,
};
}
return config; return config;
} }