Skip to content

Commit

Permalink
add axios request timeout option (#1139)
Browse files Browse the repository at this point in the history
* add axios request timeout option

* add option to include both notifyOnError and timeout
  • Loading branch information
jczhong84 authored Feb 1, 2023
1 parent c8bc89a commit dfb210b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 17 deletions.
40 changes: 29 additions & 11 deletions querybook/webapp/lib/datasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ export interface ICancelablePromise<T> extends Promise<T> {
}

type UrlOrOptions = string | AxiosRequestConfig;
interface DatasourceOptions {
notifyOnError?: boolean;
timeout?: number;
}

function handleRequestException(error: any, notifyOnError?: boolean) {
console.error(error);

if (notifyOnError) {
toast.error(formatError(error));
}
Expand All @@ -26,10 +32,11 @@ function syncDatasource<T>(
method: Method,
urlOrOptions: UrlOrOptions,
data?: Record<string, unknown>,
notifyOnError?: boolean
options: DatasourceOptions = {}
): ICancelablePromise<{ data: T }> {
const url =
typeof urlOrOptions === 'string' ? urlOrOptions : urlOrOptions['url'];
const { notifyOnError = false, timeout = 0 } = options;

let cancel: Canceler;
const defaultConfig: AxiosRequestConfig = {
Expand All @@ -40,6 +47,7 @@ function syncDatasource<T>(
},
method,
cancelToken: new axios.CancelToken((c) => (cancel = c)),
timeout, // 0 is the default value which means no timeout
};

if (data) {
Expand Down Expand Up @@ -79,39 +87,49 @@ function syncDatasource<T>(
function fetchDatasource<T>(
urlOrOptions: UrlOrOptions,
data?: Record<string, unknown>,
notifyOnError = false
options: DatasourceOptions = {
notifyOnError: false,
}
) {
return syncDatasource<T>('GET', urlOrOptions, data, notifyOnError);
return syncDatasource<T>('GET', urlOrOptions, data, options);
}

function saveDatasource<T>(
urlOrOptions: UrlOrOptions,
data?: Record<string, unknown>,
notifyOnError = true
options: DatasourceOptions = {
notifyOnError: true,
}
) {
return syncDatasource<T>('POST', urlOrOptions, data, notifyOnError);
return syncDatasource<T>('POST', urlOrOptions, data, options);
}

function updateDatasource<T>(
urlOrOptions: UrlOrOptions,
data?: Record<string, unknown>,
notifyOnError = true
options: DatasourceOptions = {
notifyOnError: true,
}
) {
return syncDatasource<T>('PUT', urlOrOptions, data, notifyOnError);
return syncDatasource<T>('PUT', urlOrOptions, data, options);
}

function deleteDatasource<T = null>(
urlOrOptions: UrlOrOptions,
data?: Record<string, unknown>,
notifyOnError = true
options: DatasourceOptions = {
notifyOnError: true,
}
) {
return syncDatasource<T>('DELETE', urlOrOptions, data, notifyOnError);
return syncDatasource<T>('DELETE', urlOrOptions, data, options);
}

export function uploadDatasource<T = null>(
url: string,
data: Record<string, any>,
notifyOnError = true
options: DatasourceOptions = {
notifyOnError: true,
}
) {
const formData = new FormData();
for (const [key, value] of Object.entries(data)) {
Expand All @@ -135,7 +153,7 @@ export function uploadDatasource<T = null>(
},
data: formData,
};
return syncDatasource<T>('POST', urlOptions, null, notifyOnError);
return syncDatasource<T>('POST', urlOptions, null, options);
}

export default {
Expand Down
4 changes: 4 additions & 0 deletions querybook/webapp/lib/utils/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ export function formatError(error: any): string {
return formatRateLimitError(error.response.headers);
}
}

if (error.message) {
return error.message;
}
} else {
// unknown error, maybe syntax?
}
Expand Down
21 changes: 15 additions & 6 deletions querybook/webapp/resource/queryExecution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,19 +160,28 @@ export const TemplatedQueryResource = {
var_config: varConfig,
engine_id: engineId,
},
false
{
notifyOnError: false,
}
),

validateQuery: (
query: string,
engineId: number,
templatedVariables: TDataDocMetaVariables
) =>
ds.save<IQueryValidationResult[]>('/query/validate/', {
query,
var_config: templatedVariables,
engine_id: engineId,
}),
ds.save<IQueryValidationResult[]>(
'/query/validate/',
{
query,
var_config: templatedVariables,
engine_id: engineId,
},
{
notifyOnError: true,
timeout: 5000, // timeouts in 5s
}
),

getAllQueryTranspilers: () =>
ds.fetch<IQueryTranspiler[]>('/query/transpile/'),
Expand Down

0 comments on commit dfb210b

Please sign in to comment.