UNPKG

ngx-uploadx

Version:
70 lines 11.3 kB
import { InjectionToken } from '@angular/core'; function createXhr() { return new XMLHttpRequest(); } function releaseXhr(_xhr) { _xhr = null; } export class UploadxAjax { buildXhr; constructor(buildXhr) { this.buildXhr = buildXhr; } request = ({ method = 'GET', data = null, headers = {}, url, responseType, signal, onUploadProgress, timeout = 0, withCredentials = false, validateStatus = status => status < 400 && status >= 200 }) => { return new Promise((resolve, reject) => { const xhr = this.buildXhr(); const abortListener = () => xhr && xhr.readyState !== xhr.DONE && xhr.abort(); signal?.addEventListener('abort', abortListener, { once: true }); xhr.open(method, url, true); xhr.timeout = timeout; withCredentials && (xhr.withCredentials = true); if (responseType && responseType !== 'json') { xhr.responseType = responseType; } Object.keys(headers).forEach(key => xhr.setRequestHeader(key, String(headers[key]))); xhr.upload.onprogress = onUploadProgress || null; xhr.onerror = xhr.ontimeout = xhr.onabort = evt => { releaseXhr(xhr); signal?.removeEventListener('abort', abortListener); return reject({ error: evt.type, url, method }); }; xhr.onload = () => { const response = { data: this.getResponseBody(xhr, responseType), status: xhr.status, headers: this.getResponseHeaders(xhr) }; releaseXhr(xhr); signal?.removeEventListener('abort', abortListener); return validateStatus(response.status) ? resolve(response) : reject(response); }; xhr.send(data); }); }; getResponseHeaders(xhr) { const rows = xhr.getAllResponseHeaders().split(/[\r\n]+/); return rows.reduce((headers, current) => { const [name, value] = current.split(': '); name && (headers[name.toLowerCase()] = value); return headers; }, {}); } getResponseBody(xhr, responseType) { let body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response; if (responseType === 'json' && body && typeof body === 'string') { try { body = JSON.parse(body); } catch { } } return body; } } export const UPLOADX_AJAX = new InjectionToken('uploadx.ajax', { factory: () => new UploadxAjax(createXhr), providedIn: 'root' }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91cGxvYWR4L2xpYi9hamF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFxQi9DLFNBQVMsU0FBUztJQUNoQixPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWE7SUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLE9BQU8sV0FBVztJQUNGO0lBQXBCLFlBQW9CLFFBQThCO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQXNCO0lBQUcsQ0FBQztJQUV0RCxPQUFPLEdBQUcsQ0FBYSxFQUNyQixNQUFNLEdBQUcsS0FBSyxFQUNkLElBQUksR0FBRyxJQUFJLEVBQ1gsT0FBTyxHQUFHLEVBQUUsRUFDWixHQUFHLEVBQ0gsWUFBWSxFQUNaLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsT0FBTyxHQUFHLENBQUMsRUFDWCxlQUFlLEdBQUcsS0FBSyxFQUN2QixjQUFjLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQ3RDLEVBQTRCLEVBQUU7UUFDaEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENB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T0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDO2dCQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUF5QixJQUFJLGNBQWMsQ0FBQyxjQUFjLEVBQUU7SUFDbkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUN6QyxVQUFVLEVBQUUsTUFBTTtDQUNuQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFqYXhSZXF1ZXN0Q29uZmlnIGV4dGVuZHMgUmVxdWVzdE9wdGlvbnMge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBbeDogc3RyaW5nXTogYW55O1xuXG4gIGRhdGE/OiBCb2R5SW5pdCB8IG51bGw7XG4gIHVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFqYXhSZXNwb25zZTxUPiB7XG4gIGRhdGE6IFQ7XG4gIHN0YXR1czogbnVtYmVyO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFqYXgge1xuICByZXF1ZXN0OiA8VCA9IHN0cmluZz4oY29uZmlnOiBBamF4UmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxBamF4UmVzcG9uc2U8VD4+O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVYaHIoKTogWE1MSHR0cFJlcXVlc3Qge1xuICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VYaHIoX3hocjogdW5rbm93bik6IHZvaWQge1xuICBfeGhyID0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFVwbG9hZHhBamF4IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZFhocjogKCkgPT4gWE1MSHR0cFJlcXVlc3QpIHt9XG5cbiAgcmVxdWVzdCA9IDxUID0gc3RyaW5nPih7XG4gICAgbWV0aG9kID0gJ0dFVCcsXG4gICAgZGF0YSA9IG51bGwsXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIHVybCxcbiAgICByZXNwb25zZVR5cGUsXG4gICAgc2lnbmFsLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgdGltZW91dCA9IDAsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gZmFsc2UsXG4gICAgdmFsaWRhdGVTdGF0dXMgPSBzdGF0dXMgPT4gc3RhdHVzIDwgNDAwICYmIHN0YXR1cyA+PSAyMDBcbiAgfTogQWpheFJlcXVlc3RDb25maWcpOiBQcm9taXNlPEFqYXhSZXNwb25zZTxUPj4gPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSB0aGlzLmJ1aWxkWGhyKCk7XG4gICAgICBjb25zdCBhYm9ydExpc3RlbmVyID0gKCkgPT4geGhyICYmIHhoci5yZWFkeVN0YXRlICE9PSB4aHIuRE9ORSAmJiB4aHIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydExpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICB4aHIudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICB3aXRoQ3JlZGVudGlhbHMgJiYgKHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlKTtcbiAgICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgU3RyaW5nKGhlYWRlcnNba2V5XSkpKTtcbiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IG9uVXBsb2FkUHJvZ3Jlc3MgfHwgbnVsbDtcbiAgICAgIHhoci5vbmVycm9yID1cbiAgICAgICAgeGhyLm9udGltZW91dCA9XG4gICAgICAgIHhoci5vbmFib3J0ID1cbiAgICAgICAgICBldnQgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZVhocih4aHIpO1xuICAgICAgICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0TGlzdGVuZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdCh7IGVycm9yOiBldnQudHlwZSwgdXJsLCBtZXRob2QgfSk7XG4gICAgICAgICAgfTtcbiAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgIGRhdGE6IHRoaXMuZ2V0UmVzcG9uc2VCb2R5PFQ+KHhociwgcmVzcG9uc2VUeXBlKSxcbiAgICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRSZXNwb25zZUhlYWRlcnMoeGhyKVxuICAgICAgICB9O1xuICAgICAgICByZWxlYXNlWGhyKHhocik7XG4gICAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykgPyByZXNvbHZlKHJlc3BvbnNlKSA6IHJlamVjdChyZXNwb25zZSk7XG4gICAgICB9O1xuICAgICAgeGhyLnNlbmQoZGF0YSBhcyBYTUxIdHRwUmVxdWVzdEJvZHlJbml0KTtcbiAgICB9KTtcbiAgfTtcblxuICBnZXRSZXNwb25zZUhlYWRlcnMoeGhyOiBYTUxIdHRwUmVxdWVzdCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJvd3MgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoL1tcXHJcXG5dKy8pO1xuICAgIHJldHVybiByb3dzLnJlZHVjZSgoaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY3VycmVudCkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGN1cnJlbnQuc3BsaXQoJzogJyk7XG4gICAgICBuYW1lICYmIChoZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZSk7XG4gICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBnZXRSZXNwb25zZUJvZHk8VD4oeGhyOiBYTUxIdHRwUmVxdWVzdCwgcmVzcG9uc2VUeXBlPzogc3RyaW5nKTogVCB7XG4gICAgbGV0IGJvZHkgPSB0eXBlb2YgeGhyLnJlc3BvbnNlID09PSAndW5kZWZpbmVkJyA/IHhoci5yZXNwb25zZVRleHQgOiB4aHIucmVzcG9uc2U7XG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFVQTE9BRFhfQUpBWDogSW5qZWN0aW9uVG9rZW48QWpheD4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ3VwbG9hZHguYWpheCcsIHtcbiAgZmFjdG9yeTogKCkgPT4gbmV3IFVwbG9hZHhBamF4KGNyZWF0ZVhociksXG4gIHByb3ZpZGVkSW46ICdyb290J1xufSk7XG4iXX0=