particle-api-js 9.4.0 → 10.0.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.
package/lib/Agent.js.map CHANGED
@@ -1 +1 @@
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"]}
1
+ {"version":3,"sources":["../src/Agent.js"],"names":["Agent","baseUrl","setBaseUrl","uri","auth","headers","query","context","request","method","data","undefined","form","files","isBuffer","requestFiles","_sanitizeFiles","requestParams","_buildRequest","_promiseResponse","makerequest","status","then","resp","ok","text","err","objError","JSON","parse","response","blob","json","body","arrayBuffer","isForBrowser","Buffer","from","statusCode","catch","error","errorType","errorDescription","shortErrorDescription","error_description","reason","Error","actualUri","queryParams","stringify","hasParams","includes","userAgentHeader","name","version","repository","url","contentTypeHeader","_getFromData","finalHeaders","_getAuthorizationHeader","_getContextHeaders","window","formData","file","path","fileData","nodeFormData","_getNodeFormData","append","value","createReadStream","filepath","_getToolContext","tool","_getProjectContext","project","_toolIdent","components","component","_nameAtVersion","_buildSemicolonSeparatedProperties","obj","primaryProperty","prop","hasOwnProperty","Authorization","encoded","btoa","username","password","toString","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 fetch from 'node-fetch';\nimport FormData from 'form-data';\nimport qs from 'qs';\nimport fs from '../fs';\nimport packageJson from '../package.json';\n\n/**\n * The object returned for a basic request\n * @typedef {object} JSONResponse\n * @property {number} statusCode\tThe HTTP response status\n * @property {object} body\t\tThe endpoint's response parsed as a JSON\n */\n\n/**\n * The possible response from an API request\n * @typedef {JSONResponse|Buffer|arrayBuffer} RequestResponse\tThe type is based on\n * the request config and whether is on browser or node\n */\n\n/**\n * The error object generated in case of a failed request\n * @typedef {object} RequestError\n * @property {number} statusCode\tThe HTTP response status\n * @property {string} errorDescription\tDetails on what caused the failed request\n * @property {string} shortErrorDescription\tSummarized version of the fail reason\n * @property {object} body\t\tThe response object from the request\n * @property {object} error\t\tThe error object from the request\n */\n\nexport default class Agent {\n\tconstructor(baseUrl){\n\t\tthis.setBaseUrl(baseUrl);\n\t}\n\n\tsetBaseUrl(baseUrl) {\n\t\tthis.baseUrl = baseUrl;\n\t}\n\n\t/**\n\t * Make a GET request\n\t * @param {string} uri\t\tThe URI to request\n\t * @param {string} [auth]\tAuthorization token to use\n\t * @param {object} [headers]\tKey/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {object} [query] Key/Value pairs of query params\n\t * @param {object} [context]\tThe invocation context, describing the tool and project\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t */\n\tget({ uri, auth, headers, query, context }) {\n\t\treturn this.request({ uri, method: 'get', auth, headers, query, context });\n\t}\n\n\t/**\n\t * Make a HEAD request\n\t * @param {string} uri\t\tThe URI to request\n\t * @param {string} [auth]\tAuthorization token to use\n\t * @param {object} [headers]\tKey/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {object} [query] Key/Value pairs of query params\n\t * @param {object} [context]\tThe invocation context, describing the tool and project\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t */\n\thead({ uri, auth, headers, query, context }) {\n\t\treturn this.request({ uri, method: 'head', auth, headers, query, context });\n\t}\n\n\t/**\n\t * Make a POST request\n\t * @param {string} uri\t\tThe URI to request\n\t * @param {string} [auth]\tAuthorization token to use\n\t * @param {object} [headers]\tKey/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {object} [data] Payload to send in the request body in JSON format\n\t * @param {object} [context]\tThe invocation context, describing the tool and project\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t */\n\tpost({ uri, headers, data, auth, context }) {\n\t\treturn this.request({ uri, method: 'post', auth, headers, data, context });\n\t}\n\n\t/**\n\t * Make a PUT request\n\t * @param {string} uri\t\tThe URI to request\n\t * @param {string} [auth]\tAuthorization token to use\n\t * @param {object} [headers]\tKey/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {object} [data] Payload to send in the request body in JSON format\n\t * @param {object} [context]\tThe invocation context, describing the tool and project\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t */\n\tput({ uri, auth, headers, data, context }) {\n\t\treturn this.request({ uri, method: 'put', auth, headers, data, context });\n\t}\n\n\t/**\n\t * Make a DELETE request\n\t * @param {string} uri\t\tThe URI to request\n\t * @param {string} [auth]\tAuthorization token to use\n\t * @param {object} [headers]\tKey/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {object} [data] Payload to send in the request body in JSON format\n\t * @param {object} [context]\tThe invocation context, describing the tool and project\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t */\n\tdelete({ uri, auth, headers, data, context }) {\n\t\treturn this.request({ uri, method: 'delete', auth, headers, data, context });\n\t}\n\n\t/**\n\t *\n\t * @param {Object} config\t\tAn obj with all the possible request configurations\n\t * @param {String} config.uri\t\tThe URI to request\n\t * @param {String} config.method The method used to request the URI, should be in uppercase.\n\t * @param {Object} config.headers Key/Value pairs like `{ 'X-FOO': 'foo', X-BAR: 'bar' }` to send as headers.\n\t * @param {Object} config.data Arbitrary data to send as the body.\n\t * @param {Object} config.auth Authorization\n\t * @param {String} config.query Query parameters\n\t * @param {Object} config.form Form fields\n\t * @param {Object} config.files array of file names and file content\n\t * @param {Object} config.context the invocation context, describing the tool and project.\n\t * @param {boolean} config.isBuffer\tIndicate if the response should be treated as Buffer instead of JSON\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\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\tisBuffer = false\n\t}){\n\t\tconst requestFiles = this._sanitizeFiles(files);\n\t\tconst requestParams = this._buildRequest({ uri, method, headers, data, auth, query, form, context, files: requestFiles });\n\t\treturn this._promiseResponse(requestParams, isBuffer);\n\t}\n\n\t/**\n\t * Promises to send the request and retreive the response.\n\t * @param {[string, object]} requestParams\tFirst argument is the URI to request, the second one are the options.\n\t * @param {boolean} isBuffer Indicate if the response body should be returned as a Buffer (Node) / ArrayBuffer (browser) instead of JSON\n\t * @param {Fetch} [makerequest] The fetch function to use. Override for testing.\n\t * @returns {Promise<RequestResponse, RequestError>} A promise that resolves with either the requested data or an error object\n\t * @private\n\t */\n\t_promiseResponse(requestParams, isBuffer, makerequest = fetch) {\n\t\tlet status;\n\t\treturn makerequest(...requestParams)\n\t\t\t.then((resp) => {\n\t\t\t\tstatus = resp.status;\n\t\t\t\tif (!resp.ok) {\n\t\t\t\t\treturn resp.text().then((err) => {\n\t\t\t\t\t\tconst objError = JSON.parse(err);\n\t\t\t\t\t\t// particle-commnds/src/cmd/api expects response.text. to be a string\n\t\t\t\t\t\tconst response = Object.assign(resp, { text: err });\n\t\t\t\t\t\tthrow Object.assign(objError, { response });\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (status === 204) { // Can't do resp.json() since there is no body to parse\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\tif (isBuffer) {\n\t\t\t\t\treturn resp.blob();\n\t\t\t\t}\n\t\t\t\treturn resp.json();\n\t\t\t}).then((body) => {\n\t\t\t\tif (isBuffer) {\n\t\t\t\t\treturn body.arrayBuffer().then((arrayBuffer) => {\n\t\t\t\t\t\tif (!this.isForBrowser()) {\n\t\t\t\t\t\t\treturn Buffer.from(arrayBuffer);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn arrayBuffer;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tbody,\n\t\t\t\t\tstatusCode: status\n\t\t\t\t};\n\t\t\t}).catch((error) => {\n\t\t\t\tconst errorType = status ? `HTTP error ${status}` : 'Network error';\n\t\t\t\tlet errorDescription = `${errorType} from ${requestParams[0]}`;\n\t\t\t\tlet shortErrorDescription;\n\t\t\t\tif (error.error_description) { // Fetch responded with ok false\n\t\t\t\t\terrorDescription = `${errorDescription} - ${error.error_description}`;\n\t\t\t\t\tshortErrorDescription = error.error_description;\n\t\t\t\t}\n\t\t\t\tconst reason = new Error(errorDescription);\n\t\t\t\tObject.assign(reason, {\n\t\t\t\t\tstatusCode: status,\n\t\t\t\t\terrorDescription,\n\t\t\t\t\tshortErrorDescription,\n\t\t\t\t\terror,\n\t\t\t\t\tbody: error\n\t\t\t\t});\n\t\t\t\tthrow reason;\n\t\t\t});\n\t}\n\n\t_buildRequest({ uri, method, headers, data, auth, query, form, files, context }){\n\t\tlet actualUri = uri;\n\t\tif (this.baseUrl && uri[0] === '/') {\n\t\t\tactualUri = `${this.baseUrl}${uri}`;\n\t\t}\n\t\tif (query) {\n\t\t\tconst queryParams = qs.stringify(query);\n\t\t\tconst hasParams = actualUri.includes('?');\n\t\t\tactualUri = `${actualUri}${hasParams ? '&' : '?'}${queryParams}`;\n\t\t}\n\n\t\tconst userAgentHeader = { 'User-Agent': `${packageJson.name}/${packageJson.version} (${packageJson.repository.url})` };\n\t\tlet body;\n\t\tlet contentTypeHeader;\n\t\tif (files){\n\t\t\tcontentTypeHeader = {}; // Needed to allow fetch create its own\n\t\t\tbody = this._getFromData(files, form);\n\t\t} else if (form){\n\t\t\tcontentTypeHeader = { 'Content-Type': 'application/x-www-form-urlencoded' };\n\t\t\tbody = qs.stringify(form);\n\t\t} else if (data){\n\t\t\tcontentTypeHeader = { 'Content-Type': 'application/json' };\n\t\t\tbody = JSON.stringify(data);\n\t\t}\n\t\tconst finalHeaders = Object.assign({},\n\t\t\tuserAgentHeader,\n\t\t\tcontentTypeHeader,\n\t\t\tthis._getAuthorizationHeader(auth),\n\t\t\tthis._getContextHeaders(context),\n\t\t\theaders\n\t\t);\n\n\t\treturn [actualUri, { method, body, headers: finalHeaders }];\n\t}\n\n\tisForBrowser() {\n\t\treturn typeof window !== 'undefined';\n\t}\n\n\t_getFromData(files, form) {\n\t\tconst formData = new FormData();\n\t\tfor (let [name, file] of Object.entries(files)){\n\t\t\tlet path = file.path;\n\t\t\tlet fileData = file.data;\n\t\t\tif (!this.isForBrowser()) {\n\t\t\t\tconst nodeFormData = this._getNodeFormData(file);\n\t\t\t\tpath = nodeFormData.path;\n\t\t\t\tfileData = nodeFormData.file;\n\t\t\t}\n\t\t\tformData.append(name, fileData, path);\n\t\t}\n\t\tif (form){\n\t\t\tfor (let [name, value] of Object.entries(form)){\n\t\t\t\tformData.append(name, value);\n\t\t\t}\n\t\t}\n\t\treturn formData;\n\t}\n\n\t_getNodeFormData(file) {\n\t\tlet fileData = file.data;\n\t\tif (typeof file.data === 'string') {\n\t\t\tfileData = fs.createReadStream(file.data);\n\t\t}\n\t\treturn {\n\t\t\tfile: fileData,\n\t\t\tpath: { filepath: file.path } // Different API for nodejs\n\t\t};\n\t}\n\n\t_getContextHeaders(context = {}) {\n\t\treturn Object.assign({},\n\t\t\tthis._getToolContext(context.tool),\n\t\t\tthis._getProjectContext(context.project)\n\t\t);\n\t}\n\n\t_getToolContext(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\treturn { 'X-Particle-Tool': value };\n\t\t}\n\t\treturn {};\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_getProjectContext(project = {}){\n\t\tlet value = this._buildSemicolonSeparatedProperties(project, 'name');\n\t\tif (value){\n\t\t\treturn { 'X-Particle-Project': value };\n\t\t}\n\t\treturn {};\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 {string} auth The authorization bearer token.\n\t * @returns {object} The original request.\n\t */\n\t_getAuthorizationHeader(auth){\n\t\tif (!auth) {\n\t\t\treturn {};\n\t\t}\n\t\tif (typeof auth === 'string') {\n\t\t\treturn { Authorization: `Bearer ${auth}` };\n\t\t}\n\t\tlet encoded;\n\t\tif (this.isForBrowser()) {\n\t\t\tencoded = btoa(`${auth.username}:${auth.password}`);\n\t\t} else {\n\t\t\tencoded = Buffer.from(`${auth.username}:${auth.password}`)\n\t\t\t\t.toString('base64');\n\t\t}\n\t\treturn { Authorization: `Basic ${encoded}` };\n\t}\n\n\t/**\n\t *\n\t * @param {Object} 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"]}