Skip to content

Commit

Permalink
Merge pull request #119 from EyeSeeTea/development
Browse files Browse the repository at this point in the history
  • Loading branch information
SferaDev authored Jan 20, 2022
2 parents 9dc5038 + 2f98c0b commit 220a609
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 39 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@eyeseetea/d2-api",
"description": "Typed wrapper over DHIS2 API",
"version": "1.10.0",
"version": "1.10.1",
"license": "GPL-3.0",
"author": "EyeSeeTea team",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion src/api/dataStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export class DataStore {
.map(validateResponse);
} else {
const voidResponse = { ...response, data: validateResponse(response) };
return D2ApiResponse.build({ response: Promise.resolve(voidResponse) });
return D2ApiResponse.build({ response: () => Promise.resolve(voidResponse) });
}
});
}
Expand Down
4 changes: 2 additions & 2 deletions src/api/system.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,12 @@ export class System {
`/system/taskSummaries/${jobType}/${id}`
);

return response;
return response();
};

return D2ApiResponse.build({
cancel: _.noop,
response: prepareResponse(),
response: () => prepareResponse(),
});
}

Expand Down
14 changes: 8 additions & 6 deletions src/data/AxiosHttpClientRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ export class AxiosHttpClientRepository implements HttpClientRepository {

request<Data>(options: HttpRequest): CancelableResponse<Data> {
const { token: cancelToken, cancel } = axios.CancelToken.source();
const axiosResponse = this.instance({ ...options, cancelToken });

const response: Promise<HttpResponse<Data>> = axiosResponse.then(res => ({
status: res.status,
data: res.data as Data,
headers: res.headers,
}));
const response: () => Promise<HttpResponse<Data>> = () => {
const axiosResponse = this.instance({ ...options, cancelToken });
return axiosResponse.then(res => ({
status: res.status,
data: res.data as Data,
headers: res.headers,
}));
};

return CancelableResponse.build({ cancel, response: response });
}
Expand Down
32 changes: 17 additions & 15 deletions src/data/FetchHttpClientRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,23 @@ export class FetchHttpClientRepository implements HttpClientRepository {

// Fetch API has no timeout mechanism, implement with a setTimeout + controller.abort
const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : null;
const fetchResponse = fetch(fullUrl, fetchOptions);

const response: Promise<HttpResponse<Data>> = fetchResponse
.then(async res => {
const headers = getHeadersRecord(res.headers);
const data = await getResponseData(res, responseDataType);

if (!validateStatus(res.status)) raiseHttpError(options, res, data);
return { status: res.status, data: data as Data, headers };
})
.catch(error => {
if (error.request) throw error;
throw new HttpError(error.toString(), { request: options });
})
.finally(() => (timeoutId !== null ? clearTimeout(timeoutId) : null));

const response: () => Promise<HttpResponse<Data>> = () => {
const fetchResponse = fetch(fullUrl, fetchOptions);
return fetchResponse
.then(async res => {
const headers = getHeadersRecord(res.headers);
const data = await getResponseData(res, responseDataType);

if (!validateStatus(res.status)) raiseHttpError(options, res, data);
return { status: res.status, data: data as Data, headers };
})
.catch(error => {
if (error.request) throw error;
throw new HttpError(error.toString(), { request: options });
})
.finally(() => (timeoutId !== null ? clearTimeout(timeoutId) : null));
};

return CancelableResponse.build({ response, cancel: () => controller.abort() });
}
Expand Down
30 changes: 16 additions & 14 deletions src/repositories/CancelableResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,31 @@ import Axios from "axios";
import { HttpResponse } from "./HttpClientRepository";

export class CancelableResponse<Data> {
constructor(public cancel: Canceler, public response: Promise<HttpResponse<Data>>) {}
constructor(public cancel: Canceler, public response: () => Promise<HttpResponse<Data>>) {}

static build<BuildData>(options: {
cancel?: Canceler;
response: Promise<HttpResponse<BuildData>>;
response: () => Promise<HttpResponse<BuildData>>;
}): CancelableResponse<BuildData> {
const { cancel, response } = options;
return new CancelableResponse(cancel || noop, response);
}

getData() {
return this.response.then(({ data }) => data);
return this.response().then(({ data }) => data);
}

map<MappedData>(
mapper: (response: HttpResponse<Data>) => MappedData
): CancelableResponse<MappedData> {
const { cancel, response } = this;
const mappedResponse = response.then(
(response_: HttpResponse<Data>): HttpResponse<MappedData> => ({
...response_,
data: mapper(response_),
})
);
const mappedResponse = () =>
response().then(
(response_: HttpResponse<Data>): HttpResponse<MappedData> => ({
...response_,
data: mapper(response_),
})
);

return new CancelableResponse<MappedData>(cancel, mappedResponse);
}
Expand All @@ -36,11 +37,12 @@ export class CancelableResponse<Data> {
const { cancel, response } = this;
let cancel2: Canceler | undefined;

const mappedResponse = response.then(response_ => {
const res2 = mapper(response_);
cancel2 = res2.cancel;
return res2.response;
});
const mappedResponse: () => Promise<HttpResponse<MappedData>> = () =>
response().then(response_ => {
const res2 = mapper(response_);
cancel2 = res2.cancel;
return res2.response();
});

function cancelAll() {
cancel();
Expand Down

0 comments on commit 220a609

Please sign in to comment.