@rxx/http
Version:
Http IO module for rxx.
446 lines • 39.9 kB
JavaScript
"use strict";
/**
* The MIT License (MIT)
* Copyright (c) Taketoshi Aono
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* @fileoverview
* @author Taketoshi Aono
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var core_1 = require("@rxx/core");
var rxjs_1 = require("rxjs");
var http_response_1 = require("./http-response");
var qs_1 = require("./qs");
var types_1 = require("./types");
var DEFAULT_ERROR_STATUS = 500;
/**
* Http request sender.
*/
var HttpHandler = /** @class */ (function (_super) {
tslib_1.__extends(HttpHandler, _super);
function HttpHandler(a) {
var _this = _super.call(this, a, {
request: ['get', 'post', 'put', 'delete', 'upload', 'patch'],
response: 'notifyResponse',
uploading: 'notifyUploading',
}) || this;
_this.history = [];
return _this;
}
Object.defineProperty(HttpHandler, "maxHistoryLength", {
set: function (length) {
this._maxHistoryLength = length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(HttpHandler, "maxHistoryLenght", {
get: function () {
return this._maxHistoryLength;
},
enumerable: true,
configurable: true
});
HttpHandler.prototype.clone = function () {
return new HttpHandler(this.advices);
};
/**
* Wait for request from observables.
* @override
* @param request Observable that send request.
*/
HttpHandler.prototype.subscribe = function (props) {
var _this = this;
var subscription = new rxjs_1.Subscription();
if (props.http) {
if (props.http instanceof rxjs_1.Observable) {
subscription.add(props.http.subscribe(function (args) {
if (Array.isArray(args)) {
args.forEach(function (_a) {
var type = _a.type, request = _a.request;
return _this.push(type, request);
});
}
else {
_this.push(args.type, args.request);
}
}, function (error) { return console.error(error); }));
}
else {
var _loop_1 = function (reqKey) {
var req = props.http[reqKey];
subscription.add(req.subscribe(function (config) { return _this.push(reqKey, config); }, function (error) { return console.error(error); }));
};
for (var reqKey in props.http) {
_loop_1(reqKey);
}
for (var reqKey in props.http) {
var req = props.http[reqKey];
if (req instanceof rxjs_1.ConnectableObservable && req['connect']) {
req.connect();
}
}
}
}
return subscription;
};
/**
* @inheritDoc
*/
HttpHandler.prototype.push = function (key, args) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var history_1, config, subjectsOK, subjectsNG, subjectsProgress, errorHandler, succeededHandler;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (key === 'RETRY') {
history_1 = this.history[this.history.length - (typeof args === 'number' ? args + 1 : 1)];
if (!history_1) {
return [2 /*return*/, new Promise(function (_, r) {
return r(new Error('Invlaid retry number specified.'));
})];
}
key = history_1.key;
args = history_1.args;
}
else {
if (this.history.length > HttpHandler._maxHistoryLength) {
this.history.shift();
}
this.history.push({ key: key, args: args });
}
if (!args) {
return [2 /*return*/, new Promise(function (_, r) { return r(new Error('Config required.')); })];
}
config = args;
subjectsOK = this.store.get(key).concat(this.store.get(key + "-ok"));
subjectsNG = this.store.get(key).concat(this.store.get(key + "-ng"));
subjectsProgress = this.store
.get(key)
.concat(this.store.get(key + "-uploading"));
errorHandler = function (config, err, result) {
var httpResponse = new http_response_1.HttpResponseImpl(false, err && err.status ? err.status : DEFAULT_ERROR_STATUS, {}, null, result);
var ret = config.reduce(httpResponse, _this.state);
_this.notifyResponse(config, key + "-ng", httpResponse, ret, subjectsNG);
};
succeededHandler = function (config, response, result) {
var headers = _this.processHeaders(response);
var httpResponse = new http_response_1.HttpResponseImpl(response.ok, response.status, headers, response.ok ? result : null, response.ok ? null : result);
var ret = config.reduce(httpResponse, _this.state);
_this.notifyResponse(config, key + "-ok", httpResponse, ret, subjectsOK);
};
if (!config.reduce) {
config.reduce = function (v) { return v; };
}
if (config.upload) {
return [2 /*return*/, this.upload(config, key).then(function (subject) {
_this.handleUploadResonse(subjectsOK, subjectsNG, subjectsProgress, subject, config, key);
})];
}
return [4 /*yield*/, this.handleResponse(config, key, function (res, ret) { return succeededHandler(config, res, ret); }, function (e, ret) { return errorHandler(config, e, ret); })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
HttpHandler.prototype.handleUploadResonse = function (subjectsOK, subjectsNG, subjectsUploading, subject, config, key) {
var _this = this;
var sub = subject.subscribe(function (e) {
if (e.type !== types_1.UploadEventType.PROGRESS) {
sub.unsubscribe();
var isComplete = e.type === types_1.UploadEventType.COMPLETE;
var contentType = e.xhr.getResponseHeader('Content-Type') || '';
var response = config.responseType === types_1.ResponseType.JSON ||
contentType.indexOf('application/json') > -1
? JSON.parse(e.xhr.responseText)
: e.xhr.responseText;
var headers = e.xhr.getAllResponseHeaders();
var headerArr = headers.split('\n');
var headerMap_1 = {};
headerArr.forEach(function (e) {
var _a = e.split(':'), key = _a[0], value = _a[1];
if (key && value) {
headerMap_1[key.trim()] = value.trim();
}
});
var httpResponse = new http_response_1.HttpResponseImpl(e.type === types_1.UploadEventType.COMPLETE && e.xhr.status < 400, e.xhr.status, headerMap_1, isComplete ? response : null, isComplete ? null : response);
var ret = config.reduce(httpResponse, _this.state);
_this.notifyResponse(config, httpResponse.ok ? key + "-ok" : key + "-ng", httpResponse, ret, isComplete ? subjectsOK : subjectsNG);
}
else {
var httpResponse = new http_response_1.HttpUploadProgressImpl(e.event, e.xhr);
_this.notifyUploading(config, key + "-uploading", httpResponse, subjectsUploading);
}
}, function (error) { return console.error(error); });
};
HttpHandler.prototype.notifyUploading = function (config, key, progress, subjects) {
var _this = this;
subjects.forEach(function (subject) {
return subject.next({ data: progress, state: _this.state });
});
this.subject && this.subject.notify({ type: key, payload: progress });
};
HttpHandler.prototype.notifyResponse = function (config, key, httpResponse, results, subjects) {
var _this = this;
subjects.forEach(function (subject) {
return subject.next({ data: results, state: _this.state });
});
this.subject && this.subject.notify({ type: key, payload: results });
};
HttpHandler.prototype.handleResponse = function (config, key, succeededHandler, errorHandler) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var res, u, resp, ret, err_1, resp, e, e_1;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 4, , 11]);
return [4 /*yield*/, (function () {
switch (config.method) {
case types_1.HttpMethod.GET:
return _this.get(config, key);
case types_1.HttpMethod.POST:
return _this.post(config, key);
case types_1.HttpMethod.PUT:
return _this.put(config, key);
case types_1.HttpMethod.PATCH:
return _this.patch(config, key);
case types_1.HttpMethod.DELETE:
return _this.delete(config, key);
default:
return _this.get(config, key);
}
})()];
case 1:
res = _a.sent();
if (!res.ok) {
throw res;
}
// For IE|Edge
if (!res.url) {
u = 'ur' + 'l';
try {
res[u] = config.url;
}
catch (e) { }
}
resp = this.getResponse(config, key, config.responseType, res);
if (!(resp && resp.then)) return [3 /*break*/, 3];
return [4 /*yield*/, resp];
case 2:
ret = _a.sent();
succeededHandler(res, ret);
_a.label = 3;
case 3: return [3 /*break*/, 11];
case 4:
err_1 = _a.sent();
if (!(err_1 && typeof err_1.json === 'function')) return [3 /*break*/, 9];
resp = this.getResponse(config, key, this.getResponseTypeFromHeader(err_1), err_1);
if (!(resp && resp.then)) return [3 /*break*/, 8];
_a.label = 5;
case 5:
_a.trys.push([5, 7, , 8]);
return [4 /*yield*/, resp];
case 6:
e = _a.sent();
errorHandler(err_1, e);
return [3 /*break*/, 8];
case 7:
e_1 = _a.sent();
errorHandler(err_1, e_1);
return [3 /*break*/, 8];
case 8: return [3 /*break*/, 10];
case 9:
errorHandler(err_1, err_1);
_a.label = 10;
case 10: return [3 /*break*/, 11];
case 11: return [2 /*return*/];
}
});
});
};
HttpHandler.prototype.processHeaders = function (res) {
var headers = {};
res.headers.forEach(function (v, k) { return (headers[k] = v); });
return headers;
};
HttpHandler.prototype.getFetcher = function () {
return fetch;
};
/**
* Send GET request.
* @data url Target url.
* @data data GET parameters.
* @returns Promise that return response.
*/
HttpHandler.prototype.get = function (_a, key) {
var url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, data = _a.data, mode = _a.mode;
return this.getFetcher()(data ? "" + url + qs_1.qs(data) : url, {
method: 'GET',
headers: headers,
mode: mode || 'same-origin',
});
};
/**
* Send POST request.
* @data url Target url.
* @data data POST body.
* @returns Promise that return response.
*/
HttpHandler.prototype.post = function (_a, key) {
var url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, _c = _a.data, data = _c === void 0 ? {} : _c, _d = _a.json, json = _d === void 0 ? true : _d, _e = _a.form, form = _e === void 0 ? false : _e, mode = _a.mode;
return this.getFetcher()(url, {
headers: headers,
method: 'POST',
mode: mode || 'same-origin',
body: json ? JSON.stringify(data) : form ? qs_1.qs(data) : data,
});
};
/**
* Send PUT request.
* @data url Target url.
* @data data PUT body.
* @returns Promise that return response.
*/
HttpHandler.prototype.put = function (_a, key) {
var url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, _c = _a.data, data = _c === void 0 ? {} : _c, _d = _a.json, json = _d === void 0 ? true : _d, _e = _a.form, form = _e === void 0 ? false : _e, mode = _a.mode;
return this.getFetcher()(url, {
headers: headers,
method: 'PUT',
mode: mode || 'same-origin',
body: json ? JSON.stringify(data) : form ? qs_1.qs(data) : data,
});
};
/**
* Send PATCH request.
* @data url Target url.
* @data data PUT body.
* @returns Promise that return response.
*/
HttpHandler.prototype.patch = function (_a, key) {
var url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, _c = _a.data, data = _c === void 0 ? {} : _c, _d = _a.json, json = _d === void 0 ? true : _d, _e = _a.form, form = _e === void 0 ? false : _e, mode = _a.mode;
return this.getFetcher()(url, {
headers: headers,
method: 'PATCH',
mode: mode || 'same-origin',
body: json ? JSON.stringify(data) : form ? qs_1.qs(data) : data,
});
};
/**
* Send DELETE request.
* @data url Target url.
* @data data PUT body.
* @returns Promise that return response.
*/
HttpHandler.prototype.delete = function (_a, key) {
var url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, _c = _a.data, data = _c === void 0 ? {} : _c, _d = _a.json, json = _d === void 0 ? true : _d, _e = _a.form, form = _e === void 0 ? false : _e, mode = _a.mode;
var req = {
headers: headers,
method: 'DELETE',
mode: mode || 'same-origin',
};
if (core_1.isDefined(data)) {
req.body = json ? JSON.stringify(data) : form ? qs_1.qs(data) : data;
}
return this.getFetcher()(url, req);
};
HttpHandler.prototype.upload = function (_a, key) {
var method = _a.method, url = _a.url, _b = _a.headers, headers = _b === void 0 ? {} : _b, _c = _a.data, data = _c === void 0 ? {} : _c, mode = _a.mode;
var xhr = new XMLHttpRequest();
var subject = new rxjs_1.Subject();
var events = {};
var addEvent = function (xhr, type, fn, dispose) {
if (dispose === void 0) { dispose = false; }
events[type] = function (e) {
if (dispose) {
for (var key_1 in events) {
xhr.removeEventListener(key_1, events[key_1]);
}
}
fn(e);
};
xhr.addEventListener(type, events[type], false);
};
if (xhr.upload) {
addEvent(xhr.upload, 'progress', function (e) {
return subject.next({ type: types_1.UploadEventType.PROGRESS, event: e, xhr: xhr });
});
}
addEvent(xhr, 'error', function (e) { return subject.next({ type: types_1.UploadEventType.ERROR, event: e, xhr: xhr }); }, true);
addEvent(xhr, 'abort', function (e) { return subject.next({ type: types_1.UploadEventType.ABORT, event: e, xhr: xhr }); }, true);
addEvent(xhr, 'load', function (e) {
if (!xhr.upload) {
subject.next({
type: types_1.UploadEventType.PROGRESS,
event: { total: 1, loaded: 1 },
xhr: xhr,
});
}
subject.next({ type: types_1.UploadEventType.COMPLETE, event: e, xhr: xhr });
}, true);
xhr.open(types_1.HttpMethod[method], url, true);
for (var key_2 in headers) {
xhr.setRequestHeader(key_2, headers[key_2]);
}
xhr.send(data);
return Promise.resolve(subject);
};
/**
* Get proper response from fetch response body.
* @param responseType The type of response. ex. ARRAY_BUFFER, BLOB, etc...
* @param res Http response.
* @returns
*/
HttpHandler.prototype.getResponse = function (config, key, responseType, res) {
switch (responseType) {
case types_1.ResponseType.ARRAY_BUFFER:
return res.arrayBuffer();
case types_1.ResponseType.BLOB:
return res.blob();
case types_1.ResponseType.FORM_DATA:
return res.formData();
case types_1.ResponseType.JSON:
return res.json();
case types_1.ResponseType.TEXT:
return res.text();
case types_1.ResponseType.STREAM:
return Promise.resolve(res.body);
default:
return res.text();
}
};
HttpHandler.prototype.getResponseTypeFromHeader = function (res) {
var mime = res.headers.get('content-type');
if (!mime || mime.indexOf('text/plain') > -1) {
return types_1.ResponseType.TEXT;
}
if (mime.indexOf('text/json') > -1 ||
mime.indexOf('application/json') > -1) {
return types_1.ResponseType.JSON;
}
if (/^(?:image|audio|video|(?:application\/zip)|(?:application\/octet-stream))/.test(mime)) {
return types_1.ResponseType.BLOB;
}
return types_1.ResponseType.TEXT;
};
HttpHandler.displayName = 'HttpHandler';
HttpHandler._maxHistoryLength = 10;
return HttpHandler;
}(core_1.StateHandler));
exports.HttpHandler = HttpHandler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCxrQ0FPbUI7QUFDbkIsNkJBQWdGO0FBQ2hGLGlEQUEyRTtBQUMzRSwyQkFBMEI7QUFDMUIsaUNBUWlCO0FBRWpCLElBQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBWWpDOztHQUVHO0FBQ0g7SUFBaUMsdUNBQVk7SUFlM0MscUJBQVksQ0FBVztRQUF2QixZQUNFLGtCQUFNLENBQUMsRUFBRTtZQUNQLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1lBQzVELFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsU0FBUyxFQUFFLGlCQUFpQjtTQUM3QixDQUFDLFNBQ0g7UUFSTyxhQUFPLEdBQXdDLEVBQUUsQ0FBQzs7SUFRMUQsQ0FBQztJQWhCRCxzQkFBa0IsK0JBQWdCO2FBQWxDLFVBQW1DLE1BQWM7WUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNsQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFrQiwrQkFBZ0I7YUFBbEM7WUFDRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxDQUFDOzs7T0FBQTtJQVlNLDJCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLCtCQUFTLEdBQWhCLFVBQWlCLEtBV2hCO1FBWEQsaUJBK0NDO1FBbkNDLElBQU0sWUFBWSxHQUFHLElBQUksbUJBQVksRUFBRSxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtZQUNkLElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxp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