@kiwicom/smart-faq
Version:
Smart FAQ
267 lines (218 loc) • 7.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fetchQuery = fetchQuery;
exports.default = exports.ERROR_FORBIDDEN = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _relayRuntime = require("relay-runtime");
var _idx = _interopRequireDefault(require("idx"));
var _v = _interopRequireDefault(require("uuid/v4"));
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
var _CustomerSupportPhonesQuery = _interopRequireDefault(require("./../../fallbacks/CustomerSupportPhonesQuery.json"));
var _translationUtils = require("../helpers/translationUtils");
var _tracker = require("../cuckoo/tracker");
// @noflow
var fallbacks = {};
fallbacks["CustomerSupportPhonesQuery"] = _CustomerSupportPhonesQuery.default;
require('isomorphic-fetch'); // used when smart FAQ installed as dependency
var uri = 'https://graphql.kiwi.com';
var cache = new _relayRuntime.QueryResponseCache({
size: 200,
ttl: 30 * 60 * 1000
});
var ERROR_FORBIDDEN = 'Forbidden 403';
exports.ERROR_FORBIDDEN = ERROR_FORBIDDEN;
var getFallbackData = function getFallbackData(error, operation) {
if (operation.name in fallbacks) {
return fallbacks[operation.name];
} else {
throw error;
}
};
var handleForbiddenError = function handleForbiddenError(json) {
if (json.errors && json.errors.length > 0 && json.errors.some(function (error) {
return (0, _idx.default)(error, function (_) {
return _.extensions.proxy.statusCode;
}) === '403';
})) {
throw new Error(ERROR_FORBIDDEN);
}
};
var composeRequestBody = function composeRequestBody(operation, variables) {
return JSON.stringify({
query: operation.text,
// GraphQL text from input
variables: variables,
operationName: operation.name
});
};
var composeRequest = function composeRequest(headers, operation, variables) {
var body = composeRequestBody(operation, variables);
return [process.env.GRAPHQL_URI || uri, {
method: 'POST',
headers: headers,
body: body
}];
};
function fetchQuery(_x, _x2, _x3) {
return _fetchQuery.apply(this, arguments);
}
function _fetchQuery() {
_fetchQuery = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee2(headers, operation, variables) {
var fallbackData, response, errorMetadata, json, errors, metadata;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
fallbackData = null;
response = null;
errorMetadata = {
variables: variables,
operationName: operation.name,
requestId: headers['X-Request-ID'],
locale: headers['Accept-Language']
};
_context2.prev = 3;
_context2.next = 6;
return fetch.apply(void 0, (0, _toConsumableArray2.default)(composeRequest(headers, operation, variables)));
case 6:
response = _context2.sent;
_context2.next = 13;
break;
case 9:
_context2.prev = 9;
_context2.t0 = _context2["catch"](3);
(0, _tracker.error)('GraphQL network', _context2.t0, (0, _objectSpread2.default)({}, errorMetadata, {
errorMessage: _context2.t0.message
}));
fallbackData = getFallbackData(_context2.t0, operation);
case 13:
json = fallbackData;
if (json) {
_context2.next = 18;
break;
}
_context2.next = 17;
return response.json();
case 17:
json = _context2.sent;
case 18:
handleForbiddenError(json);
if (json.errors) {
errors = function () {
try {
return JSON.stringify(json.errors);
} catch (e) {
// this would really suck!
console.error(e); // eslint-disable-line no-console
return {
parseError: e.message
};
}
}();
metadata = (0, _objectSpread2.default)({}, errorMetadata, {
errors: errors
});
(0, _tracker.error)('GraphQL error', null, metadata);
}
return _context2.abrupt("return", json);
case 21:
case "end":
return _context2.stop();
}
}
}, _callee2, this, [[3, 9]]);
}));
return _fetchQuery.apply(this, arguments);
}
var buildQueryFetcher = function buildQueryFetcher() {
var token
/*: string*/
= arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var kwAuthToken
/*: string*/
= arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
var locale
/*: string*/
= arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _translationUtils.DEFAULT_LOCALE;
return (
/*#__PURE__*/
function () {
var _ref = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee(operation, variables, cacheConfig) {
var forceFetch, isQuery, cachedData, headers, json;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
forceFetch = cacheConfig.force;
isQuery = operation.operationKind === 'query';
if (!(!forceFetch && isQuery)) {
_context.next = 6;
break;
}
cachedData = cache.get(operation.text, variables);
if (!cachedData) {
_context.next = 6;
break;
}
return _context.abrupt("return", cachedData);
case 6:
headers = {
'Content-Type': 'application/json',
'Accept-Language': locale,
'KW-Auth-Token': kwAuthToken,
Authorization: token,
'X-Client': 'SmartFAQ',
'X-Request-ID': (0, _v.default)()
};
_context.next = 9;
return fetchQuery(headers, operation, variables);
case 9:
json = _context.sent;
if (!forceFetch && isQuery) {
cache.set(operation.text, variables, json);
}
return _context.abrupt("return", json);
case 12:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function (_x4, _x5, _x6) {
return _ref.apply(this, arguments);
};
}()
);
};
var getStore = (0, _memoizeOne.default)(function (records) {
return new _relayRuntime.Store(new _relayRuntime.RecordSource(records));
}, function () {
return true;
});
var createEnvironment = function createEnvironment(token
/*: ?string*/
, kwAuthToken
/*: ?string*/
, locale
/*: ?string*/
, records
/*: ?Object*/
) {
return new _relayRuntime.Environment({
network: _relayRuntime.Network.create(buildQueryFetcher(token, kwAuthToken, locale)),
store: getStore(records)
});
};
var _default = createEnvironment;
exports.default = _default;
;