@typed/http
Version:
HTTP requests for node and browsers
28 lines • 976 B
JavaScript
import { Disposable } from '@typed/disposable';
import { Left, Right } from '@typed/either';
import { Resume } from '@typed/env';
import { isValidStatus } from './isValidStatus';
export function* http(url, options = {}) {
return yield ({ http }) => Resume.create((f) => {
let hasLoaded = false;
const ifNotLoaded = (f) => (...args) => {
if (!hasLoaded) {
hasLoaded = true;
return f(...args);
}
return Disposable.None;
};
return http(url, options, {
success: ifNotLoaded((response) => f(handleSuccess(response))),
failure: ifNotLoaded((error) => f(Left.of(error))),
});
});
}
function handleSuccess(response) {
if (isValidStatus(response)) {
return Right.of(response);
}
const errorMessage = response.responseText || response.statusText;
return Left.of(new Error(errorMessage));
}
//# sourceMappingURL=http.js.map