diff --git a/package-lock.json b/package-lock.json index 1a370c0..06daef9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jira-client", - "version": "8.2.0", + "version": "9.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jira-client", - "version": "8.2.0", + "version": "9.0.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.0", diff --git a/package.json b/package.json index 2749675..6b52aec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "jira-client", - "version": "8.2.2", + "name": "@nazarethk7/jira-client", + "version": "9.0.0", "description": "Wrapper for the JIRA API", "author": "Steven Surowiec ", "contributors": [ @@ -9,10 +9,10 @@ "Matt Smith ", "Anson Wayman " ], - "homepage": "http://github.com/jira-node/node-jira-client", + "homepage": "https://github.com/nazarethk/node-jira-client", "repository": { "type": "git", - "url": "http://github.com/jira-node/node-jira-client" + "url": "https://github.com/nazarethk/node-jira-client" }, "engine": { "node": ">=10.0.0" @@ -35,7 +35,9 @@ "lint": "eslint ./", "test": "npm run lint && mocha --require @babel/register && npm run docs-build", "prepublishOnly": "npm run build && npm run docs-build", - "release": "release" + "release:patch": "npm version patch && npm run build && npm publish", + "release:minor": "npm version minor && npm run build && npm publish", + "release:major": "npm version major && npm run build && npm publish" }, "devDependencies": { "@babel/cli": "^7.6.0", diff --git a/src/jira.js b/src/jira.js index 9844d0d..89908dd 100644 --- a/src/jira.js +++ b/src/jira.js @@ -4,22 +4,45 @@ import url from 'url'; // eslint-disable-next-line no-underscore-dangle const _request = require('postman-request'); -function request(uri, options) { +async function wait(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +function request(uri, options, retry = true) { return new Promise((resolve, reject) => { - _request(uri, options, (err, httpResponse) => { + _request(uri, options, async (err, httpResponse) => { if (err) { reject(err); - } else { - if (httpResponse.statusCode >= 400) { - reject(httpResponse.body); + } else if (httpResponse.statusCode >= 400) { + if ( + (httpResponse.headers['retry-after'] || httpResponse.statusCode === 429) + && retry + ) { + await wait(parseInt(httpResponse.headers['retry-after'], 10) * 1000); + try { + const result = await request(uri, options, false); + resolve(result); + } catch (retryError) { + reject(retryError); + } + } else { + // eslint-disable-next-line prefer-promise-reject-errors + reject({ + body: httpResponse.body, + headers: httpResponse.headers, + statusCode: httpResponse.statusCode, + }); } - + } else { // for compatibility with request-promise resolve(httpResponse.body); } }); }); } + /** * @name JiraApi * @class @@ -677,7 +700,7 @@ export default class JiraApi { */ searchJira(searchString, optional = {}) { return this.doRequest(this.makeRequestHeader(this.makeUri({ - pathname: '/search', + pathname: '/search/jql', }), { method: 'POST', followAllRedirects: true,