From 8bcc3da49ef8fdb55005d4475fac060a18d973e6 Mon Sep 17 00:00:00 2001 From: Nigel George Date: Fri, 15 Mar 2024 14:39:58 +0900 Subject: [PATCH] feat(retry): add 6x 500ms spaced retries --- services/youtrack/youtrack-issues.service.js | 33 +++++++++++++------- services/youtrack/youtrack-issues.tester.js | 5 ++- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/services/youtrack/youtrack-issues.service.js b/services/youtrack/youtrack-issues.service.js index bf201e3a11c01..2c6d7e4a58082 100644 --- a/services/youtrack/youtrack-issues.service.js +++ b/services/youtrack/youtrack-issues.service.js @@ -5,6 +5,10 @@ import { metric } from '../text-formatters.js' import { description } from './youtrack-helper.js' import YoutrackBase from './youtrack-base.js' +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)) +} + const schema = Joi.object({ count: Joi.number().required(), $type: Joi.equal('IssueCountResponse'), @@ -71,18 +75,25 @@ export default class YoutrackIssues extends YoutrackBase { }) } - async handle({ project }, { youtrack_url: baseUrl, query }) { - const data = await this.fetch({ - baseUrl, - query: `project: ${project} ${query}`, - }) - - if (data.count === -1) { - throw new InvalidResponse({ - prettyMessage: 'processing', - cacheSeconds: 10, + async handle({ project }, { youtrack_url: baseUrl, query = '' }) { + for (let i = 0; i < 6; i++) { + // 6 trials + const data = await this.fetch({ + baseUrl, + query: `project: ${project} ${query}`, }) + + if (data.count === -1) { + await sleep(500) + continue + } + + return this.constructor.render({ count: data.count }) } - return this.constructor.render({ count: data.count }) + + throw new InvalidResponse({ + prettyMessage: 'invalid', + cacheSeconds: 10, + }) } } diff --git a/services/youtrack/youtrack-issues.tester.js b/services/youtrack/youtrack-issues.tester.js index 58176d021a4bb..60aeecf3e7f6b 100644 --- a/services/youtrack/youtrack-issues.tester.js +++ b/services/youtrack/youtrack-issues.tester.js @@ -1,4 +1,3 @@ -import Joi from 'joi' import { createServiceTester } from '../tester.js' import { isMetric } from '../test-validators.js' @@ -10,14 +9,14 @@ t.create('Issues (DEMO) (Cloud)') ) .expectBadge({ label: 'issues', - message: Joi.alternatives().try(isMetric, 'processing', 'timeout'), + message: isMetric, }) t.create('Issues (DEMO) (Empty Query) (Cloud)') .get('/DEMO.json?youtrack_url=https://shields.youtrack.cloud') .expectBadge({ label: 'issues', - message: Joi.alternatives().try(isMetric, 'processing', 'timeout'), + message: isMetric, }) t.create('Issues (DEMO) (Invalid State) (Cloud Hosted)')