particle-api-js 9.4.1 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.circleci/config.yml +7 -5
  2. package/CHANGELOG.md +11 -0
  3. package/{test/EventStream-e2e-browser.html → EventStream-e2e-browser.html} +0 -1
  4. package/{test/EventStream-e2e-node.js → EventStream-e2e-node.js} +2 -3
  5. package/README.md +2 -2
  6. package/RELEASE.md +1 -1
  7. package/dist/particle.min.js +1 -399
  8. package/dist/particle.min.js.map +1 -1
  9. package/docs/api.md +5223 -115
  10. package/fs.js +2 -0
  11. package/karma.conf.js +18 -6
  12. package/package.json +23 -26
  13. package/src/Agent.js +407 -0
  14. package/src/Client.js +170 -0
  15. package/src/Defaults.js +7 -0
  16. package/src/EventStream.js +263 -0
  17. package/src/Library.js +33 -0
  18. package/src/Particle.js +2644 -0
  19. package/test/Agent.integration.js +5 -4
  20. package/test/Agent.spec.js +174 -291
  21. package/test/Client.spec.js +7 -7
  22. package/test/Defaults.spec.js +2 -2
  23. package/test/EventStream.spec.js +6 -4
  24. package/test/FakeAgent.js +2 -2
  25. package/test/Library.spec.js +2 -2
  26. package/test/Particle.integration.js +7 -7
  27. package/test/Particle.spec.js +332 -18
  28. package/test/fixtures/index.js +4 -18
  29. package/test/support/FixtureHttpServer.js +5 -3
  30. package/test/test-setup.js +5 -5
  31. package/tsconfig.json +14 -0
  32. package/webpack.config.js +45 -0
  33. package/.babelrc +0 -4
  34. package/lib/Agent.js +0 -516
  35. package/lib/Agent.js.map +0 -1
  36. package/lib/Client.js +0 -312
  37. package/lib/Client.js.map +0 -1
  38. package/lib/Defaults.js +0 -14
  39. package/lib/Defaults.js.map +0 -1
  40. package/lib/EventStream.js +0 -335
  41. package/lib/EventStream.js.map +0 -1
  42. package/lib/Library.js +0 -67
  43. package/lib/Library.js.map +0 -1
  44. package/lib/Particle.js +0 -3248
  45. package/lib/Particle.js.map +0 -1
  46. package/lib/superagent-binary-parser.js +0 -20
  47. package/lib/superagent-binary-parser.js.map +0 -1
  48. package/test/Client.integration.js +0 -69
  49. package/test/fixtures/tarball.tar.gz +0 -0
  50. package/test/fixtures/test-library-publish-0.0.1.tar.gz +0 -0
  51. package/test/fixtures/test-library-publish-0.0.2.tar.gz +0 -0
package/.babelrc DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "presets": ["es2015"],
3
- "plugins": ["add-module-exports", "transform-runtime"]
4
- }
package/lib/Agent.js DELETED
@@ -1,516 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
-
7
- var _keys = require('babel-runtime/core-js/object/keys');
8
-
9
- var _keys2 = _interopRequireDefault(_keys);
10
-
11
- var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
12
-
13
- var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
14
-
15
- var _entries = require('babel-runtime/core-js/object/entries');
16
-
17
- var _entries2 = _interopRequireDefault(_entries);
18
-
19
- var _getIterator2 = require('babel-runtime/core-js/get-iterator');
20
-
21
- var _getIterator3 = _interopRequireDefault(_getIterator2);
22
-
23
- var _assign = require('babel-runtime/core-js/object/assign');
24
-
25
- var _assign2 = _interopRequireDefault(_assign);
26
-
27
- var _promise = require('babel-runtime/core-js/promise');
28
-
29
- var _promise2 = _interopRequireDefault(_promise);
30
-
31
- var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
32
-
33
- var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
34
-
35
- var _createClass2 = require('babel-runtime/helpers/createClass');
36
-
37
- var _createClass3 = _interopRequireDefault(_createClass2);
38
-
39
- var _superagent = require('superagent');
40
-
41
- var _superagent2 = _interopRequireDefault(_superagent);
42
-
43
- var _superagentPrefix = require('superagent-prefix');
44
-
45
- var _superagentPrefix2 = _interopRequireDefault(_superagentPrefix);
46
-
47
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
-
49
- /*
50
- ******************************************************************************
51
- Copyright (c) 2016 Particle Industries, Inc. All rights reserved.
52
-
53
- This program is free software; you can redistribute it and/or
54
- modify it under the terms of the GNU Lesser General Public
55
- License as published by the Free Software Foundation, either
56
- version 3 of the License, or (at your option) any later version.
57
-
58
- This program is distributed in the hope that it will be useful,
59
- but WITHOUT ANY WARRANTY; without even the implied warranty of
60
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
61
- Lesser General Public License for more details.
62
-
63
- You should have received a copy of the GNU Lesser General Public
64
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
65
- ******************************************************************************
66
- */
67
-
68
- var Agent = function () {
69
- function Agent(baseUrl) {
70
- (0, _classCallCheck3.default)(this, Agent);
71
-
72
- this.setBaseUrl(baseUrl);
73
- }
74
-
75
- (0, _createClass3.default)(Agent, [{
76
- key: 'setBaseUrl',
77
- value: function setBaseUrl(baseUrl) {
78
- this.prefix = (0, _superagentPrefix2.default)(baseUrl);
79
- }
80
- }, {
81
- key: 'get',
82
- value: function get(_ref) {
83
- var uri = _ref.uri,
84
- auth = _ref.auth,
85
- headers = _ref.headers,
86
- query = _ref.query,
87
- context = _ref.context;
88
-
89
- return this.request({ uri: uri, method: 'get', auth: auth, headers: headers, query: query, context: context });
90
- }
91
- }, {
92
- key: 'head',
93
- value: function head(_ref2) {
94
- var uri = _ref2.uri,
95
- auth = _ref2.auth,
96
- headers = _ref2.headers,
97
- query = _ref2.query,
98
- context = _ref2.context;
99
-
100
- return this.request({ uri: uri, method: 'head', auth: auth, headers: headers, query: query, context: context });
101
- }
102
- }, {
103
- key: 'post',
104
- value: function post(_ref3) {
105
- var uri = _ref3.uri,
106
- headers = _ref3.headers,
107
- data = _ref3.data,
108
- auth = _ref3.auth,
109
- context = _ref3.context;
110
-
111
- return this.request({ uri: uri, method: 'post', auth: auth, headers: headers, data: data, context: context });
112
- }
113
- }, {
114
- key: 'put',
115
- value: function put(_ref4) {
116
- var uri = _ref4.uri,
117
- auth = _ref4.auth,
118
- headers = _ref4.headers,
119
- data = _ref4.data,
120
- context = _ref4.context;
121
-
122
- return this.request({ uri: uri, method: 'put', auth: auth, headers: headers, data: data, context: context });
123
- }
124
- }, {
125
- key: 'delete',
126
- value: function _delete(_ref5) {
127
- var uri = _ref5.uri,
128
- auth = _ref5.auth,
129
- headers = _ref5.headers,
130
- data = _ref5.data,
131
- context = _ref5.context;
132
-
133
- return this.request({ uri: uri, method: 'delete', auth: auth, headers: headers, data: data, context: context });
134
- }
135
-
136
- /**
137
- *
138
- * @param {String} uri The URI to request
139
- * @param {String} method The method used to request the URI, should be in uppercase.
140
- * @param {Object} headers Key/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.
141
- * @param {String} data Arbitrary data to send as the body.
142
- * @param {Object} auth Authorization
143
- * @param {String} query Query parameters
144
- * @param {Object} form Form fields
145
- * @param {Object} files array of file names and file content
146
- * @parma {Object} context the invocation context, describing the tool and project.
147
- * @return {Promise} A promise. fulfilled with {body, statusCode}, rejected with { statusCode, errorDescription, error, body }
148
- */
149
-
150
- }, {
151
- key: 'request',
152
- value: function request(_ref6) {
153
- var uri = _ref6.uri,
154
- method = _ref6.method,
155
- _ref6$headers = _ref6.headers,
156
- headers = _ref6$headers === undefined ? undefined : _ref6$headers,
157
- _ref6$data = _ref6.data,
158
- data = _ref6$data === undefined ? undefined : _ref6$data,
159
- auth = _ref6.auth,
160
- _ref6$query = _ref6.query,
161
- query = _ref6$query === undefined ? undefined : _ref6$query,
162
- _ref6$form = _ref6.form,
163
- form = _ref6$form === undefined ? undefined : _ref6$form,
164
- _ref6$files = _ref6.files,
165
- files = _ref6$files === undefined ? undefined : _ref6$files,
166
- _ref6$context = _ref6.context,
167
- context = _ref6$context === undefined ? undefined : _ref6$context,
168
- _ref6$raw = _ref6.raw,
169
- raw = _ref6$raw === undefined ? false : _ref6$raw;
170
-
171
- var requestFiles = this._sanitizeFiles(files);
172
- return this._request({ uri: uri, method: method, headers: headers, data: data, auth: auth, query: query, form: form, context: context, files: requestFiles, raw: raw });
173
- }
174
-
175
- /**
176
- *
177
- * @param {String} uri The URI to request
178
- * @param {String} method The method used to request the URI, should be in uppercase.
179
- * @param {Object} headers Key/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.
180
- * @param {String} data Arbitrary data to send as the body.
181
- * @param {Object} auth Authorization
182
- * @param {String} query Query parameters
183
- * @param {Object} form Form fields
184
- * @param {Object} files array of file names and file content
185
- * @param {Object} context the invocation context
186
- * @return {Promise} A promise. fulfilled with {body, statusCode}, rejected with { statusCode, errorDescription, error, body }
187
- */
188
-
189
- }, {
190
- key: '_request',
191
- value: function _request(_ref7) {
192
- var uri = _ref7.uri,
193
- method = _ref7.method,
194
- headers = _ref7.headers,
195
- data = _ref7.data,
196
- auth = _ref7.auth,
197
- query = _ref7.query,
198
- form = _ref7.form,
199
- files = _ref7.files,
200
- context = _ref7.context,
201
- raw = _ref7.raw;
202
-
203
- var req = this._buildRequest({ uri: uri, method: method, headers: headers, data: data, auth: auth, query: query, form: form, context: context, files: files });
204
-
205
- if (raw) {
206
- return req;
207
- }
208
- return this._promiseResponse(req);
209
- }
210
-
211
- /**
212
- * Promises to send the request and retreive the response.
213
- * @param {Request} req The request to send
214
- * @returns {Promise} The promise to send the request and retrieve the response.
215
- * @private
216
- */
217
-
218
- }, {
219
- key: '_promiseResponse',
220
- value: function _promiseResponse(req) {
221
- var _this = this;
222
-
223
- return new _promise2.default(function (fulfill, reject) {
224
- return _this._sendRequest(req, fulfill, reject);
225
- });
226
- }
227
-
228
- /**
229
- * Sends the given request, calling the fulfill or reject methods for success/failure.
230
- * @param {object} request The request to send
231
- * @param {function} fulfill Called on success with the response
232
- * @param {function} reject Called on failure with the failure reason.
233
- * @private
234
- * @returns {undefined} Nothing
235
- */
236
-
237
- }, {
238
- key: '_sendRequest',
239
- value: function _sendRequest(request, fulfill, reject) {
240
- request.end(function (error, res) {
241
- var body = res && res.body;
242
- if (error) {
243
- var uri = request.url;
244
- var statusCode = error.status;
245
- var errorDescription = (statusCode ? 'HTTP error ' + statusCode : 'Network error') + ' from ' + uri;
246
- var shortErrorDescription = void 0;
247
- if (body && body.error_description) {
248
- errorDescription += ' - ' + body.error_description;
249
- shortErrorDescription = body.error_description;
250
- }
251
- var reason = new Error(errorDescription);
252
- (0, _assign2.default)(reason, { statusCode: statusCode, errorDescription: errorDescription, shortErrorDescription: shortErrorDescription, error: error, body: body });
253
- reject(reason);
254
- } else {
255
- fulfill({
256
- body: body,
257
- statusCode: res.statusCode
258
- });
259
- }
260
- });
261
- }
262
- }, {
263
- key: '_buildRequest',
264
- value: function _buildRequest(_ref8) {
265
- var uri = _ref8.uri,
266
- method = _ref8.method,
267
- headers = _ref8.headers,
268
- data = _ref8.data,
269
- auth = _ref8.auth,
270
- query = _ref8.query,
271
- form = _ref8.form,
272
- files = _ref8.files,
273
- context = _ref8.context,
274
- _ref8$makerequest = _ref8.makerequest,
275
- makerequest = _ref8$makerequest === undefined ? _superagent2.default : _ref8$makerequest;
276
-
277
- var req = makerequest(method, uri);
278
- if (this.prefix) {
279
- req.use(this.prefix);
280
- }
281
- this._authorizationHeader(req, auth);
282
- if (context) {
283
- this._applyContext(req, context);
284
- }
285
- if (query) {
286
- req.query(query);
287
- }
288
- if (headers) {
289
- req.set(headers);
290
- }
291
- if (files) {
292
- var _iteratorNormalCompletion = true;
293
- var _didIteratorError = false;
294
- var _iteratorError = undefined;
295
-
296
- try {
297
- for (var _iterator = (0, _getIterator3.default)((0, _entries2.default)(files)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
298
- var _step$value = (0, _slicedToArray3.default)(_step.value, 2),
299
- name = _step$value[0],
300
- file = _step$value[1];
301
-
302
- // API for Form Data is different in Node and in browser
303
- var options = {
304
- filepath: file.path
305
- };
306
- if (this.isForBrowser(makerequest)) {
307
- options = file.path;
308
- }
309
- req.attach(name, file.data, options);
310
- }
311
- } catch (err) {
312
- _didIteratorError = true;
313
- _iteratorError = err;
314
- } finally {
315
- try {
316
- if (!_iteratorNormalCompletion && _iterator.return) {
317
- _iterator.return();
318
- }
319
- } finally {
320
- if (_didIteratorError) {
321
- throw _iteratorError;
322
- }
323
- }
324
- }
325
-
326
- if (form) {
327
- var _iteratorNormalCompletion2 = true;
328
- var _didIteratorError2 = false;
329
- var _iteratorError2 = undefined;
330
-
331
- try {
332
- for (var _iterator2 = (0, _getIterator3.default)((0, _entries2.default)(form)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
333
- var _step2$value = (0, _slicedToArray3.default)(_step2.value, 2),
334
- name = _step2$value[0],
335
- value = _step2$value[1];
336
-
337
- req.field(name, value);
338
- }
339
- } catch (err) {
340
- _didIteratorError2 = true;
341
- _iteratorError2 = err;
342
- } finally {
343
- try {
344
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
345
- _iterator2.return();
346
- }
347
- } finally {
348
- if (_didIteratorError2) {
349
- throw _iteratorError2;
350
- }
351
- }
352
- }
353
- }
354
- } else if (form) {
355
- req.type('form');
356
- req.send(form);
357
- } else if (data) {
358
- req.send(data);
359
- }
360
- return req;
361
- }
362
- }, {
363
- key: 'isForBrowser',
364
- value: function isForBrowser() {
365
- var makerequest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _superagent2.default;
366
-
367
- // superagent only has the getXHR method in the browser version
368
- return !!makerequest.getXHR;
369
- }
370
- }, {
371
- key: '_applyContext',
372
- value: function _applyContext(req, context) {
373
- if (context.tool) {
374
- this._addToolContext(req, context.tool);
375
- }
376
- if (context.project) {
377
- this._addProjectContext(req, context.project);
378
- }
379
- }
380
- }, {
381
- key: '_addToolContext',
382
- value: function _addToolContext(req, tool) {
383
- var value = '';
384
- if (tool.name) {
385
- value += this._toolIdent(tool);
386
- if (tool.components) {
387
- var _iteratorNormalCompletion3 = true;
388
- var _didIteratorError3 = false;
389
- var _iteratorError3 = undefined;
390
-
391
- try {
392
- for (var _iterator3 = (0, _getIterator3.default)(tool.components), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
393
- var component = _step3.value;
394
-
395
- value += ', ' + this._toolIdent(component);
396
- }
397
- } catch (err) {
398
- _didIteratorError3 = true;
399
- _iteratorError3 = err;
400
- } finally {
401
- try {
402
- if (!_iteratorNormalCompletion3 && _iterator3.return) {
403
- _iterator3.return();
404
- }
405
- } finally {
406
- if (_didIteratorError3) {
407
- throw _iteratorError3;
408
- }
409
- }
410
- }
411
- }
412
- }
413
- if (value) {
414
- req.set('X-Particle-Tool', value);
415
- }
416
- }
417
- }, {
418
- key: '_toolIdent',
419
- value: function _toolIdent(tool) {
420
- return this._nameAtVersion(tool.name, tool.version);
421
- }
422
- }, {
423
- key: '_nameAtVersion',
424
- value: function _nameAtVersion(name, version) {
425
- var value = '';
426
- if (name) {
427
- value += name;
428
- if (version) {
429
- value += '@' + version;
430
- }
431
- }
432
- return value;
433
- }
434
- }, {
435
- key: '_addProjectContext',
436
- value: function _addProjectContext(req, project) {
437
- var value = this._buildSemicolonSeparatedProperties(project, 'name');
438
- if (value) {
439
- req.set('X-Particle-Project', value);
440
- }
441
- }
442
-
443
- /**
444
- * Creates a string like primaryPropertyValue; name=value; name1=value
445
- * from the properties of an object.
446
- * @param {object} obj The object to create the string from
447
- * @param {string} primaryProperty The name of the primary property which is the default value and must be defined.
448
- * @private
449
- * @return {string} The formatted string representing the object properties and the default property.
450
- */
451
-
452
- }, {
453
- key: '_buildSemicolonSeparatedProperties',
454
- value: function _buildSemicolonSeparatedProperties(obj, primaryProperty) {
455
- var value = '';
456
- if (obj[primaryProperty]) {
457
- value += obj[primaryProperty];
458
- for (var prop in obj) {
459
- if (prop !== primaryProperty && obj.hasOwnProperty(prop)) {
460
- value += '; ' + prop + '=' + obj[prop];
461
- }
462
- }
463
- }
464
- return value;
465
- }
466
-
467
- /**
468
- * Adds an authorization header.
469
- * @param {Request} req The request to add the authorization header to.
470
- * @param {object|string} auth The authorization. Either a string authorization bearer token,
471
- * or a username/password object.
472
- * @returns {Request} req The original request.
473
- */
474
-
475
- }, {
476
- key: '_authorizationHeader',
477
- value: function _authorizationHeader(req, auth) {
478
- if (auth) {
479
- if (auth.username !== undefined) {
480
- req.auth(auth.username, auth.password);
481
- } else {
482
- req.set({ Authorization: 'Bearer ' + auth });
483
- }
484
- }
485
- return req;
486
- }
487
-
488
- /**
489
- *
490
- * @param {Array} files converts the file names to file, file1, file2.
491
- * @returns {object} the renamed files.
492
- */
493
-
494
- }, {
495
- key: '_sanitizeFiles',
496
- value: function _sanitizeFiles(files) {
497
- var requestFiles = void 0;
498
- if (files) {
499
- requestFiles = {};
500
- (0, _keys2.default)(files).forEach(function (k, i) {
501
- var name = i ? 'file' + (i + 1) : 'file';
502
- requestFiles[name] = {
503
- data: files[k],
504
- path: k
505
- };
506
- });
507
- }
508
- return requestFiles;
509
- }
510
- }]);
511
- return Agent;
512
- }();
513
-
514
- exports.default = Agent;
515
- module.exports = exports['default'];
516
- //# sourceMappingURL=Agent.js.map
package/lib/Agent.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Agent.js"],"names":["Agent","baseUrl","setBaseUrl","prefix","uri","auth","headers","query","context","request","method","data","undefined","form","files","raw","requestFiles","_sanitizeFiles","_request","req","_buildRequest","_promiseResponse","fulfill","reject","_sendRequest","end","error","res","body","url","statusCode","status","errorDescription","shortErrorDescription","error_description","reason","Error","makerequest","use","_authorizationHeader","_applyContext","set","name","file","options","filepath","path","isForBrowser","attach","value","field","type","send","getXHR","tool","_addToolContext","project","_addProjectContext","_toolIdent","components","component","_nameAtVersion","version","_buildSemicolonSeparatedProperties","obj","primaryProperty","prop","hasOwnProperty","username","password","Authorization","forEach","k","i"],"mappings":"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","file":"Agent.js","sourcesContent":["/*\n ******************************************************************************\n Copyright (c) 2016 Particle Industries, Inc. All rights reserved.\n\n This program is free software; you can redistribute it and/or\n modify it under the terms of the GNU Lesser General Public\n License as published by the Free Software Foundation, either\n version 3 of the License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public\n License along with this program; if not, see <http://www.gnu.org/licenses/>.\n ******************************************************************************\n */\n\nimport request from 'superagent';\nimport prefix from 'superagent-prefix';\n\nexport default class Agent {\n\tconstructor(baseUrl){\n\t\tthis.setBaseUrl(baseUrl);\n\t}\n\n\tsetBaseUrl(baseUrl) {\n\t\tthis.prefix = prefix(baseUrl);\n\t}\n\n\tget({ uri, auth, headers, query, context }){\n\t\treturn this.request({ uri, method: 'get', auth, headers, query, context });\n\t}\n\n\thead({ uri, auth, headers, query, context }){\n\t\treturn this.request({ uri, method: 'head', auth, headers, query, context });\n\t}\n\n\tpost({ uri, headers, data, auth, context }){\n\t\treturn this.request({ uri, method: 'post', auth, headers, data, context });\n\t}\n\n\tput({ uri, auth, headers, data, context }){\n\t\treturn this.request({ uri, method: 'put', auth, headers, data, context });\n\t}\n\n\tdelete({ uri, auth, headers, data, context }){\n\t\treturn this.request({ uri, method: 'delete', auth, headers, data, context });\n\t}\n\n\n\t/**\n\t *\n\t * @param {String} uri The URI to request\n\t * @param {String} method The method used to request the URI, should be in uppercase.\n\t * @param {Object} headers Key/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {String} data Arbitrary data to send as the body.\n\t * @param {Object} auth Authorization\n\t * @param {String} query Query parameters\n\t * @param {Object} form Form fields\n\t * @param {Object} files array of file names and file content\n\t * @parma {Object} context the invocation context, describing the tool and project.\n\t * @return {Promise} A promise. fulfilled with {body, statusCode}, rejected with { statusCode, errorDescription, error, body }\n\t */\n\trequest({\n\t\turi,\n\t\tmethod,\n\t\theaders = undefined,\n\t\tdata = undefined,\n\t\tauth,\n\t\tquery = undefined,\n\t\tform = undefined,\n\t\tfiles = undefined,\n\t\tcontext = undefined,\n\t\traw = false\n\t}){\n\t\tconst requestFiles = this._sanitizeFiles(files);\n\t\treturn this._request({ uri, method, headers, data, auth, query, form, context, files: requestFiles, raw });\n\t}\n\n\t/**\n\t *\n\t * @param {String} uri The URI to request\n\t * @param {String} method The method used to request the URI, should be in uppercase.\n\t * @param {Object} headers Key/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {String} data Arbitrary data to send as the body.\n\t * @param {Object} auth Authorization\n\t * @param {String} query Query parameters\n\t * @param {Object} form Form fields\n\t * @param {Object} files array of file names and file content\n\t * @param {Object} context the invocation context\n\t * @return {Promise} A promise. fulfilled with {body, statusCode}, rejected with { statusCode, errorDescription, error, body }\n\t */\n\t_request({ uri, method, headers, data, auth, query, form, files, context, raw }){\n\t\tconst req = this._buildRequest({ uri, method, headers, data, auth, query, form, context, files });\n\n\t\tif (raw){\n\t\t\treturn req;\n\t\t}\n\t\treturn this._promiseResponse(req);\n\t}\n\n\t/**\n\t * Promises to send the request and retreive the response.\n\t * @param {Request} req The request to send\n\t * @returns {Promise} The promise to send the request and retrieve the response.\n\t * @private\n\t */\n\t_promiseResponse(req){\n\t\treturn new Promise((fulfill, reject) => this._sendRequest(req, fulfill, reject));\n\t}\n\n\t/**\n\t * Sends the given request, calling the fulfill or reject methods for success/failure.\n\t * @param {object} request The request to send\n\t * @param {function} fulfill Called on success with the response\n\t * @param {function} reject Called on failure with the failure reason.\n\t * @private\n\t * @returns {undefined} Nothing\n\t */\n\t_sendRequest(request, fulfill, reject){\n\t\trequest.end((error, res) => {\n\t\t\tconst body = res && res.body;\n\t\t\tif (error){\n\t\t\t\tconst uri = request.url;\n\t\t\t\tconst statusCode = error.status;\n\t\t\t\tlet errorDescription = `${statusCode ? 'HTTP error ' + statusCode : 'Network error'} from ${uri}`;\n\t\t\t\tlet shortErrorDescription;\n\t\t\t\tif (body && body.error_description){\n\t\t\t\t\terrorDescription += ' - ' + body.error_description;\n\t\t\t\t\tshortErrorDescription = body.error_description;\n\t\t\t\t}\n\t\t\t\tconst reason = new Error(errorDescription);\n\t\t\t\tObject.assign(reason, { statusCode, errorDescription, shortErrorDescription, error, body });\n\t\t\t\treject(reason);\n\t\t\t} else {\n\t\t\t\tfulfill({\n\t\t\t\t\tbody: body,\n\t\t\t\t\tstatusCode: res.statusCode\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t_buildRequest({ uri, method, headers, data, auth, query, form, files, context, makerequest = request }){\n\t\tconst req = makerequest(method, uri);\n\t\tif (this.prefix){\n\t\t\treq.use(this.prefix);\n\t\t}\n\t\tthis._authorizationHeader(req, auth);\n\t\tif (context){\n\t\t\tthis._applyContext(req, context);\n\t\t}\n\t\tif (query){\n\t\t\treq.query(query);\n\t\t}\n\t\tif (headers){\n\t\t\treq.set(headers);\n\t\t}\n\t\tif (files){\n\t\t\tfor (let [name, file] of Object.entries(files)){\n\t\t\t\t// API for Form Data is different in Node and in browser\n\t\t\t\tlet options = {\n\t\t\t\t\tfilepath: file.path\n\t\t\t\t};\n\t\t\t\tif (this.isForBrowser(makerequest)){\n\t\t\t\t\toptions = file.path;\n\t\t\t\t}\n\t\t\t\treq.attach(name, file.data, options);\n\t\t\t}\n\t\t\tif (form){\n\t\t\t\tfor (let [name, value] of Object.entries(form)){\n\t\t\t\t\treq.field(name, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (form){\n\t\t\treq.type('form');\n\t\t\treq.send(form);\n\t\t} else if (data){\n\t\t\treq.send(data);\n\t\t}\n\t\treturn req;\n\t}\n\n\tisForBrowser(makerequest = request){\n\t\t// superagent only has the getXHR method in the browser version\n\t\treturn !!makerequest.getXHR;\n\t}\n\n\t_applyContext(req, context){\n\t\tif (context.tool){\n\t\t\tthis._addToolContext(req, context.tool);\n\t\t}\n\t\tif (context.project){\n\t\t\tthis._addProjectContext(req, context.project);\n\t\t}\n\t}\n\n\t_addToolContext(req, tool){\n\t\tlet value = '';\n\t\tif (tool.name){\n\t\t\tvalue += this._toolIdent(tool);\n\t\t\tif (tool.components){\n\t\t\t\tfor (let component of tool.components){\n\t\t\t\t\tvalue += ', '+this._toolIdent(component);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (value){\n\t\t\treq.set('X-Particle-Tool', value);\n\t\t}\n\t}\n\n\t_toolIdent(tool){\n\t\treturn this._nameAtVersion(tool.name, tool.version);\n\t}\n\n\t_nameAtVersion(name, version){\n\t\tlet value = '';\n\t\tif (name){\n\t\t\tvalue += name;\n\t\t\tif (version){\n\t\t\t\tvalue += '@'+version;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\n\t_addProjectContext(req, project){\n\t\tlet value = this._buildSemicolonSeparatedProperties(project, 'name');\n\t\tif (value){\n\t\t\treq.set('X-Particle-Project', value);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a string like primaryPropertyValue; name=value; name1=value\n\t * from the properties of an object.\n\t * @param {object} obj The object to create the string from\n\t * @param {string} primaryProperty The name of the primary property which is the default value and must be defined.\n\t * @private\n\t * @return {string} The formatted string representing the object properties and the default property.\n\t */\n\t_buildSemicolonSeparatedProperties(obj, primaryProperty){\n\t\tlet value = '';\n\t\tif (obj[primaryProperty]){\n\t\t\tvalue += obj[primaryProperty];\n\t\t\tfor (let prop in obj){\n\t\t\t\tif (prop!==primaryProperty && obj.hasOwnProperty(prop)){\n\t\t\t\t\tvalue += '; '+prop+'='+obj[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Adds an authorization header.\n\t * @param {Request} req The request to add the authorization header to.\n\t * @param {object|string} auth The authorization. Either a string authorization bearer token,\n\t * or a username/password object.\n\t * @returns {Request} req The original request.\n\t */\n\t_authorizationHeader(req, auth){\n\t\tif (auth){\n\t\t\tif (auth.username !== undefined){\n\t\t\t\treq.auth(auth.username, auth.password);\n\t\t\t} else {\n\t\t\t\treq.set({ Authorization: `Bearer ${auth}` });\n\t\t\t}\n\t\t}\n\t\treturn req;\n\t}\n\n\t/**\n\t *\n\t * @param {Array} files converts the file names to file, file1, file2.\n\t * @returns {object} the renamed files.\n\t */\n\t_sanitizeFiles(files){\n\t\tlet requestFiles;\n\t\tif (files){\n\t\t\trequestFiles = {};\n\t\t\tObject.keys(files).forEach((k, i) => {\n\t\t\t\tconst name = i ? `file${i + 1}` : 'file';\n\t\t\t\trequestFiles[name] = {\n\t\t\t\t\tdata: files[k],\n\t\t\t\t\tpath: k\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\treturn requestFiles;\n\t}\n}\n\n"]}