UNPKG

@typed/http

Version:

HTTP requests for node and browsers

47 lines 1.75 kB
import { Disposable } from '@typed/disposable'; import { withHttpManagement } from './withHttpManagement'; const headerSeparator = ': '; const newLineRegex = /[\r\n]+/; /** * Creates an Http Environment that works in browser and node. */ export function createHttpEnv(options) { const env = { http }; return options ? withHttpManagement(options, env) : env; } function http(url, options, callbacks) { const { success, failure } = callbacks; const { method = 'GET', headers, body } = options; const request = new XMLHttpRequest(); const disposable = 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