@typed/http
Version:
HTTP requests for node and browsers
51 lines • 1.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHttpEnv = void 0;
const disposable_1 = require("@typed/disposable");
const withHttpManagement_1 = require("./withHttpManagement");
const headerSeparator = ': ';
const newLineRegex = /[\r\n]+/;
/**
* Creates an Http Environment that works in browser and node.
*/
function createHttpEnv(options) {
const env = { http };
return options ? withHttpManagement_1.withHttpManagement(options, env) : env;
}
exports.createHttpEnv = createHttpEnv;
function http(url, options, callbacks) {
const { success, failure } = callbacks;
const { method = 'GET', headers, body } = options;
const request = new XMLHttpRequest();
const disposable = disposable_1.Disposable.lazy();
request.onerror = () => disposable.addDisposable(failure(new Error(request.statusText)));
request.addEventListener('load', () => {
const headers = request.getAllResponseHeaders();
// Convert the header string into an array
// of individual headers
const arr = headers.trim().split(newLineRegex);
// Create a map of header names to values
const headerMap = {};
arr.forEach((line) => {
const parts = line.split(headerSeparator);
const header = parts.shift();
const value = parts.join(headerSeparator);
headerMap[header] = value;
});
disposable.addDisposable(success({
responseText: request.responseText,
status: request.status,
statusText: request.statusText,
headers: headerMap,
}));
});
request.open(method, url);
if (headers) {
Object.keys(headers).forEach((header) => {
request.setRequestHeader(header, headers[header] || '');
});
}
request.send(body);
return disposable;
}
//# sourceMappingURL=createHttpEnv.js.map