UNPKG

6.58 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
9exports.default = createRequest;
10
11var _lodash = require('lodash');
12
13var _lodash2 = _interopRequireDefault(_lodash);
14
15var _debug = require('debug');
16
17var _debug2 = _interopRequireDefault(_debug);
18
19var _constants = require('./constants');
20
21var _package = require('../package.json');
22
23var _errors = require('./errors');
24
25function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
27var fetch = !_constants.IN_BROWSER && typeof fetch === 'undefined' ? require('node-fetch') : window.fetch;
28
29var debug = (0, _debug2.default)('craft-ai:client');
30
31var USER_AGENT = 'craft-ai-client-js/' + _package.version + ' [' + (_constants.IN_BROWSER ? navigator.userAgent : 'Node.js ' + process.version) + ']';
32
33debug('Client user agent set to \'' + USER_AGENT + '\'');
34
35function parseBody(req, resBody) {
36 var resBodyUtf8 = void 0;
37 try {
38 resBodyUtf8 = resBody.toString('utf-8');
39 } catch (err) {
40 debug('Invalid response format from ' + req.method + ' ' + req.path + ': ' + resBody, err);
41 throw new _errors.CraftAiInternalError('Internal Error, the craft ai server responded in an invalid format.', {
42 request: req
43 });
44 }
45 var resBodyJson = void 0;
46 try {
47 if (resBodyUtf8.length > 0) {
48 resBodyJson = JSON.parse(resBodyUtf8);
49 } else {
50 resBodyJson = {};
51 }
52 } catch (err) {
53 debug('Invalid json response from ' + req.method + ' ' + req.path + ': ' + resBody, err);
54 throw new _errors.CraftAiInternalError('Internal Error, the craft ai server responded an invalid json document.', {
55 more: resBodyUtf8,
56 request: req
57 });
58 }
59 return resBodyJson;
60}
61
62function parseResponse(req, res, resBody) {
63 switch (res.status) {
64 case 200:
65 case 201:
66 case 204:
67 return {
68 body: parseBody(req, resBody),
69 nextPageUrl: res.headers.get('x-craft-ai-next-page-url')
70 };
71 case 202:
72 throw new _errors.CraftAiLongRequestTimeOutError({
73 message: parseBody(req, resBody).message,
74 request: req
75 });
76 case 401:
77 case 403:
78 throw new _errors.CraftAiCredentialsError({
79 message: parseBody(req, resBody).message,
80 request: req
81 });
82 case 400:
83 case 404:
84 throw new _errors.CraftAiBadRequestError({
85 message: parseBody(req, resBody).message,
86 request: req
87 });
88 case 413:
89 throw new _errors.CraftAiBadRequestError({
90 message: 'Given payload is too large',
91 request: req
92 });
93 case 500:
94 throw new _errors.CraftAiInternalError(parseBody(req, resBody).message, {
95 request: req
96 });
97 case 504:
98 throw new _errors.CraftAiInternalError({
99 message: 'Response has timed out',
100 request: req,
101 status: res.status
102 });
103 default:
104 throw new _errors.CraftAiUnknownError({
105 more: parseBody(req, resBody).message,
106 request: req,
107 status: res.status
108 });
109 }
110}
111
112function createHttpAgent() {
113 var proxy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
114
115 if (_constants.IN_BROWSER) {
116 return undefined;
117 } else if (proxy) {
118 var HttpProxyAgent = require('http-proxy-agent');
119
120 return new HttpProxyAgent(proxy);
121 } else {
122 var http = require('http');
123
124 return new http.Agent({
125 keepAlive: true
126 });
127 }
128}
129
130function createHttpsAgent() {
131 var proxy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
132
133 if (_constants.IN_BROWSER) {
134 return undefined;
135 } else if (proxy) {
136 var HttpsProxyAgent = require('https-proxy-agent');
137
138 return new HttpsProxyAgent(proxy);
139 } else {
140 var https = require('https');
141
142 return new https.Agent({
143 keepAlive: true
144 });
145 }
146}
147
148function createRequest(cfg) {
149 var defaultHeaders = {
150 'Authorization': 'Bearer ' + cfg.token,
151 'Content-Type': 'application/json; charset=utf-8',
152 'Accept': 'application/json'
153 };
154
155 if (!_constants.IN_BROWSER) {
156 // Don't set the user agent in browsers it can cause CORS issues
157 // e.g. Safari v10.1.2 (12603.3.8)
158 defaultHeaders['User-Agent'] = USER_AGENT;
159 }
160
161 var baseUrl = cfg.url + '/api/v1/' + cfg.owner + '/' + cfg.project;
162
163 var agent = baseUrl.slice(0, 5) === 'https' ? createHttpsAgent(cfg.proxy) : createHttpAgent(cfg.proxy);
164
165 return function (req) {
166 req = _lodash2.default.defaults(req || {}, {
167 agent: agent,
168 method: 'GET',
169 path: '',
170 body: undefined,
171 query: {},
172 headers: {}
173 });
174
175 req.url = req.url || '' + baseUrl + req.path;
176
177 var queryStr = (0, _lodash2.default)(req.query).map(function (value, key) {
178 return [key, value];
179 }).filter(function (_ref) {
180 var _ref2 = _slicedToArray(_ref, 2),
181 key = _ref2[0],
182 value = _ref2[1];
183
184 return !_lodash2.default.isUndefined(value);
185 }).map(function (keyVal) {
186 return keyVal.join('=');
187 }).join('&');
188
189 if (queryStr.length > 0) {
190 req.url += '?' + queryStr;
191 }
192 req.headers = _lodash2.default.defaults(req.headers, defaultHeaders);
193
194 req.body = req.body && JSON.stringify(req.body);
195
196 return fetch(req.url, req).catch(function (err) {
197 debug('Network error while executing ' + req.method + ' ' + req.path, err);
198 return Promise.reject(new _errors.CraftAiNetworkError({
199 more: err.message
200 }));
201 }).then(function (res) {
202 return res.text().catch(function (err) {
203 debug('Invalid response from ' + req.method + ' ' + req.path, err);
204
205 throw new _errors.CraftAiInternalError('Internal Error, the craft ai server responded an invalid response, see err.more for details.', {
206 request: req,
207 more: err.message
208 });
209 }).then(function (resBody) {
210 return parseResponse(req, res, resBody);
211 });
212 });
213 };
214}
\No newline at end of file