diff --git a/ts-backend/package-lock.json b/ts-backend/package-lock.json index 003ee87..3366237 100644 --- a/ts-backend/package-lock.json +++ b/ts-backend/package-lock.json @@ -12,6 +12,7 @@ "@octokit/graphql-schema": "^14.50.0", "@octokit/plugin-paginate-graphql": "^4.0.0", "@octokit/plugin-retry": "^6.0.1", + "@octokit/plugin-throttling": "^8.1.3", "@octokit/rest": "^20.0.2", "dotenv": "^16.4.1", "fs-extra": "^11.2.0", diff --git a/ts-backend/package.json b/ts-backend/package.json index 62e02f2..0eeb32f 100644 --- a/ts-backend/package.json +++ b/ts-backend/package.json @@ -52,6 +52,7 @@ "@octokit/graphql-schema": "^14.50.0", "@octokit/plugin-paginate-graphql": "^4.0.0", "@octokit/plugin-retry": "^6.0.1", + "@octokit/plugin-throttling": "^8.1.3", "@octokit/rest": "^20.0.2", "dotenv": "^16.4.1", "fs-extra": "^11.2.0", diff --git a/ts-backend/src/lib/octokit.ts b/ts-backend/src/lib/octokit.ts index 0db8b94..ff3a648 100644 --- a/ts-backend/src/lib/octokit.ts +++ b/ts-backend/src/lib/octokit.ts @@ -1,5 +1,6 @@ import { paginateGraphql } from "@octokit/plugin-paginate-graphql"; import { retry } from "@octokit/plugin-retry"; +import { throttling } from "@octokit/plugin-throttling"; import { Octokit } from "@octokit/rest"; /** @@ -9,9 +10,28 @@ import { Octokit } from "@octokit/rest"; */ export const personalOctokit = (token: string) => { // Not sure if plugin order matters - const ModifiedOctokit = Octokit.plugin(paginateGraphql, retry); + const ModifiedOctokit = Octokit.plugin(paginateGraphql, retry, throttling); return new ModifiedOctokit({ auth: token, + throttle: { + onRateLimit: (retryAfter, options, octokit, retryCount) => { + octokit.log.warn( + `Request quota exhausted for request ${options.method} ${options.url} - retrying in ${retryAfter} seconds` + ); + + if (retryCount < 1) { + // only retries once + octokit.log.info(`Retry attempt ${retryCount + 1}, retrying...`); + return true; + } + }, + onSecondaryRateLimit: (retryAfter, options, octokit) => { + // does not retry, only logs a warning + octokit.log.warn( + `SecondaryRateLimit detected for request ${options.method} ${options.url}` + ); + }, + }, }); };