diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index ac90aaf86a..f5ef864ef2 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -56,6 +56,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", + "p-throttle": "^4.1.1", "uuid": "^11.0.0" }, "devDependencies": { diff --git a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts index ee2caf7ffd..9ab116a400 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/lib/BitbucketServerClient.ts @@ -19,6 +19,19 @@ import { getBitbucketServerRequestOptions, } from '@backstage/integration'; import { BitbucketServerProject, BitbucketServerRepository } from './types'; +import pThrottle from 'p-throttle'; + +const throttle = pThrottle({ + limit: 1, + interval: 500, +}); + +const throttledFetch = throttle( + async (url: fetch.RequestInfo, options?: fetch.RequestInit) => { + console.log(JSON.stringify(url)); + return await fetch(url, options); + }, +); /** * A client for interacting with a Bitbucket Server instance @@ -65,7 +78,7 @@ export class BitbucketServerClient { path: string; }): Promise { const base = new URL(this.config.apiBaseUrl); - return fetch( + return throttledFetch( `${base.protocol}//${base.host}/projects/${options.projectKey}/repos/${options.repo}/raw/${options.path}`, getBitbucketServerRequestOptions(this.config), ); @@ -76,7 +89,7 @@ export class BitbucketServerClient { repo: string; }): Promise { const request = `${this.config.apiBaseUrl}/projects/${options.projectKey}/repos/${options.repo}`; - const response = await fetch( + const response = await throttledFetch( request, getBitbucketServerRequestOptions(this.config), ); @@ -117,16 +130,17 @@ export class BitbucketServerClient { } private async request(req: Request): Promise { - return fetch(req, getBitbucketServerRequestOptions(this.config)).then( - (response: Response) => { - if (!response.ok) { - throw new Error( - `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, - ); - } - return response; - }, - ); + return throttledFetch( + req, + getBitbucketServerRequestOptions(this.config), + ).then((response: Response) => { + if (!response.ok) { + throw new Error( + `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`, + ); + } + return response; + }); } } diff --git a/yarn.lock b/yarn.lock index 2c40b37ad1..d315dc0104 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5876,6 +5876,7 @@ __metadata: "@backstage/plugin-catalog-node": "workspace:^" luxon: ^3.0.0 msw: ^1.0.0 + p-throttle: ^4.1.1 uuid: ^11.0.0 languageName: unknown linkType: soft