f-intercept
Version:
a thin wrapper around the fetch api to provide you with a subscribe function to intercept 401 status responses, uses @export-mike/efetch for caching etags
80 lines (58 loc) • 2.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.onUnauth = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
var _fEtag = require('f-etag');
var _fEtag2 = _interopRequireDefault(_fEtag);
var _isomorphicFetch = require('isomorphic-fetch');
var _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);
var _curry = require('curry');
var _curry2 = _interopRequireDefault(_curry);
var _url = require('url');
var _url2 = _interopRequireDefault(_url);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var subscribers = {};
var UNAUTH = 401;
var intercept = function intercept(base, path, options, response) {
// interception
if (response.status && response.status === UNAUTH) {
var subscribersForBase = subscribers[base];
if (subscribersForBase) {
try {
subscribersForBase.forEach(function (cb) {
return cb(response.clone());
});
} catch (e) {
// we dont want this error going up the parent chain in userland as its a different chain
if (process.NODE_ENV !== 'production') {
console.error('Unhandled Exception in onUnauth subscriber', e); // eslint-disable-line
}
}
}
}
// continue promise chain
return response;
};
var f = function f(base, path, options) {
if ((typeof base === 'undefined' ? 'undefined' : _typeof(base)) === 'object' && !base.etagCaching) {
var fetchFn = base.globalFetch ? fetch : _isomorphicFetch2.default;
return fetchFn(_url2.default.resolve(base.base, path), options).then((0, _curry2.default)(intercept)(base.base, path, options));
}
return (0, _fEtag2.default)(_url2.default.resolve(base, path), options).then((0, _curry2.default)(intercept)(base, path, options));
};
var onUnauth = exports.onUnauth = function onUnauth(base, cb) {
var subscribersForBase = subscribers[base];
if (!subscribersForBase) {
subscribers[base] = [cb];
}
subscribersForBase = subscribers[base];
subscribersForBase.push(cb);
return function () {
subscribersForBase = subscribersForBase.filter(function (s) {
return s !== cb;
});
};
};
exports.default = (0, _curry2.default)(f);