UNPKG

6.83 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 parseBulk(req, res, resBody) {
63 if (_lodash2.default.isArray(JSON.parse(resBody))) {
64 return { body: parseBody(req, resBody) };
65 } else {
66 throw new _errors.CraftAiBadRequestError({
67 message: parseBody(req, resBody).message,
68 request: req
69 });
70 }
71}
72
73function parseResponse(req, res, resBody) {
74 switch (res.status) {
75 case 200:
76 case 201:
77 case 204:
78 return {
79 body: parseBody(req, resBody),
80 nextPageUrl: res.headers.get('x-craft-ai-next-page-url')
81 };
82 case 202:
83 throw new _errors.CraftAiLongRequestTimeOutError({
84 message: parseBody(req, resBody).message,
85 request: req
86 });
87 case 207:
88 return parseBulk(req, res, resBody);
89 case 401:
90 case 403:
91 throw new _errors.CraftAiCredentialsError({
92 message: parseBody(req, resBody).message,
93 request: req
94 });
95 case 400:
96 case 404:
97 return parseBulk(req, res, resBody);
98 case 413:
99 throw new _errors.CraftAiBadRequestError({
100 message: 'Given payload is too large',
101 request: req
102 });
103 case 500:
104 throw new _errors.CraftAiInternalError(parseBody(req, resBody).message, {
105 request: req
106 });
107 case 504:
108 throw new _errors.CraftAiInternalError({
109 message: 'Response has timed out',
110 request: req,
111 status: res.status
112 });
113 default:
114 throw new _errors.CraftAiUnknownError({
115 more: parseBody(req, resBody).message,
116 request: req,
117 status: res.status
118 });
119 }
120}
121
122function createHttpAgent() {
123 var proxy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
124
125 if (_constants.IN_BROWSER) {
126 return undefined;
127 } else if (proxy) {
128 var HttpProxyAgent = require('http-proxy-agent');
129
130 return new HttpProxyAgent(proxy);
131 } else {
132 var http = require('http');
133
134 return new http.Agent({
135 keepAlive: true
136 });
137 }
138}
139
140function createHttpsAgent() {
141 var proxy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
142
143 if (_constants.IN_BROWSER) {
144 return undefined;
145 } else if (proxy) {
146 var HttpsProxyAgent = require('https-proxy-agent');
147
148 return new HttpsProxyAgent(proxy);
149 } else {
150 var https = require('https');
151
152 return new https.Agent({
153 keepAlive: true
154 });
155 }
156}
157
158function createRequest(cfg) {
159 var defaultHeaders = {
160 'Authorization': 'Bearer ' + cfg.token,
161 'Content-Type': 'application/json; charset=utf-8',
162 'Accept': 'application/json'
163 };
164
165 if (!_constants.IN_BROWSER) {
166 // Don't set the user agent in browsers it can cause CORS issues
167 // e.g. Safari v10.1.2 (12603.3.8)
168 defaultHeaders['User-Agent'] = USER_AGENT;
169 }
170
171 var baseUrl = cfg.url + '/api/v1/' + cfg.owner + '/' + cfg.project;
172
173 var agent = baseUrl.slice(0, 5) === 'https' ? createHttpsAgent(cfg.proxy) : createHttpAgent(cfg.proxy);
174
175 return function (req) {
176 req = _lodash2.default.defaults(req || {}, {
177 agent: agent,
178 method: 'GET',
179 path: '',
180 body: undefined,
181 query: {},
182 headers: {}
183 });
184
185 req.url = req.url || '' + baseUrl + req.path;
186
187 var queryStr = (0, _lodash2.default)(req.query).map(function (value, key) {
188 return [key, value];
189 }).filter(function (_ref) {
190 var _ref2 = _slicedToArray(_ref, 2),
191 key = _ref2[0],
192 value = _ref2[1];
193
194 return !_lodash2.default.isUndefined(value);
195 }).map(function (keyVal) {
196 return keyVal.join('=');
197 }).join('&');
198
199 if (queryStr.length > 0) {
200 req.url += '?' + queryStr;
201 }
202 req.headers = _lodash2.default.defaults(req.headers, defaultHeaders);
203
204 req.body = req.body && JSON.stringify(req.body);
205
206 return fetch(req.url, req).catch(function (err) {
207 debug('Network error while executing ' + req.method + ' ' + req.path, err);
208 return Promise.reject(new _errors.CraftAiNetworkError({
209 more: err.message
210 }));
211 }).then(function (res) {
212 return res.text().catch(function (err) {
213 debug('Invalid response from ' + req.method + ' ' + req.path, err);
214
215 throw new _errors.CraftAiInternalError('Internal Error, the craft ai server responded an invalid response, see err.more for details.', {
216 request: req,
217 more: err.message
218 });
219 }).then(function (resBody) {
220 return parseResponse(req, res, resBody);
221 });
222 });
223 };
224}
\No newline at end of file