bypass rate limit

This commit is contained in:
Namrata Jha
2021-12-22 09:59:18 +00:00
committed by GitHub
parent e6a9d9c802
commit 508f6970a5
4 changed files with 58 additions and 31 deletions
+25 -14
View File
@@ -27,7 +27,7 @@ exports.deleteVersions = exports.finalIds = exports.getVersionIds = void 0;
const rxjs_1 = __nccwpck_require__(5805); const rxjs_1 = __nccwpck_require__(5805);
const version_1 = __nccwpck_require__(4428); const version_1 = __nccwpck_require__(4428);
const operators_1 = __nccwpck_require__(7801); const operators_1 = __nccwpck_require__(7801);
const RATE_LIMIT = 99; //const RATE_LIMIT = 99
let totalCount; let totalCount;
function getVersionIds(owner, repo, packageName, numVersions, cursor, token) { function getVersionIds(owner, repo, packageName, numVersions, cursor, token) {
return version_1.getOldestVersions(owner, repo, packageName, numVersions, cursor, token).pipe(operators_1.expand(value => value.paginate return version_1.getOldestVersions(owner, repo, packageName, numVersions, cursor, token).pipe(operators_1.expand(value => value.paginate
@@ -41,40 +41,44 @@ function finalIds(input) {
} }
if (input.hasOldestVersionQueryInfo()) { if (input.hasOldestVersionQueryInfo()) {
if (input.minVersionsToKeep < 0) { if (input.minVersionsToKeep < 0) {
/*
input.numOldVersionsToDelete = input.numOldVersionsToDelete =
input.numOldVersionsToDelete < RATE_LIMIT input.numOldVersionsToDelete < RATE_LIMIT
? input.numOldVersionsToDelete ? input.numOldVersionsToDelete
: RATE_LIMIT; : RATE_LIMIT*/
console.log(`input.numOldVersionsToDelete: ${input.numOldVersionsToDelete}`);
return getVersionIds(input.owner, input.repo, input.packageName, input.numOldVersionsToDelete, '', input.token).pipe(operators_1.map(value => { return getVersionIds(input.owner, input.repo, input.packageName, input.numOldVersionsToDelete, '', input.token).pipe(operators_1.map(value => {
value = value.filter(info => !input.ignoreVersions.test(info.version));
const temp = input.numOldVersionsToDelete; const temp = input.numOldVersionsToDelete;
input.numOldVersionsToDelete = input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0 input.numOldVersionsToDelete - value.length <= 0
? 0 ? 0
: input.numOldVersionsToDelete - value.length; : input.numOldVersionsToDelete - value.length;
input.numDeleted += value.filter(info => !input.ignoreVersions.test(info.version)).length; console.log(`temp: ${temp}, numOldeVersions: ${input.numOldVersionsToDelete}`);
return value return value.map(info => info.id).slice(0, temp);
.filter(info => !input.ignoreVersions.test(info.version))
.map(info => info.id)
.slice(0, temp);
})); }));
} }
else { else {
return getVersionIds(input.owner, input.repo, input.packageName, RATE_LIMIT, '', input.token).pipe(operators_1.map(value => { return getVersionIds(input.owner, input.repo, input.packageName, 100, '', input.token).pipe(operators_1.map(value => {
totalCount = totalCount =
totalCount - totalCount -
value.filter(info => input.ignoreVersions.test(info.version)).length; value.filter(info => input.ignoreVersions.test(info.version)).length;
value = value.filter(info => !input.ignoreVersions.test(info.version)); value = value.filter(info => !input.ignoreVersions.test(info.version));
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted; let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted;
toDelete = toDelete > value.length ? value.length : toDelete; toDelete = toDelete > value.length ? value.length : toDelete;
/*
if (toDelete > 0 && input.numDeleted < RATE_LIMIT) { if (toDelete > 0 && input.numDeleted < RATE_LIMIT) {
// using input.numDeleted to keep track of deleted and remaining packages // using input.numDeleted to keep track of deleted and remaining packages
if (input.numDeleted + toDelete > 99) { if (input.numDeleted + toDelete > 99) {
toDelete = RATE_LIMIT - input.numDeleted; toDelete = RATE_LIMIT - input.numDeleted
input.numDeleted = RATE_LIMIT; input.numDeleted = RATE_LIMIT
} } else {
else { input.numDeleted = input.numDeleted + toDelete
input.numDeleted = input.numDeleted + toDelete;
} }
return value.map(info => info.id).slice(0, toDelete)
} else return []*/
if (toDelete > 0) {
input.numDeleted += toDelete;
return value.map(info => info.id).slice(0, toDelete); return value.map(info => info.id).slice(0, toDelete);
} }
else else
@@ -177,6 +181,7 @@ exports.deletePackageVersions = exports.deletePackageVersion = void 0;
const rxjs_1 = __nccwpck_require__(5805); const rxjs_1 = __nccwpck_require__(5805);
const operators_1 = __nccwpck_require__(7801); const operators_1 = __nccwpck_require__(7801);
const graphql_1 = __nccwpck_require__(6320); const graphql_1 = __nccwpck_require__(6320);
let deleted = 0;
const mutation = ` const mutation = `
mutation deletePackageVersion($packageVersionId: String!) { mutation deletePackageVersion($packageVersionId: String!) {
deletePackageVersion(input: {packageVersionId: $packageVersionId}) { deletePackageVersion(input: {packageVersionId: $packageVersionId}) {
@@ -184,6 +189,11 @@ const mutation = `
} }
}`; }`;
function deletePackageVersion(packageVersionId, token) { function deletePackageVersion(packageVersionId, token) {
if (deleted === 99) {
console.log(`reaching rate limit`);
operators_1.delay(5000);
}
deleted += 1;
return rxjs_1.from(graphql_1.graphql(token, mutation, { return rxjs_1.from(graphql_1.graphql(token, mutation, {
packageVersionId, packageVersionId,
headers: { headers: {
@@ -202,6 +212,7 @@ function deletePackageVersions(packageVersionIds, token) {
return rxjs_1.of(true); return rxjs_1.of(true);
} }
const deletes = packageVersionIds.map(id => deletePackageVersion(id, token).pipe(operators_1.tap(result => { const deletes = packageVersionIds.map(id => deletePackageVersion(id, token).pipe(operators_1.tap(result => {
console.log(`versions Deleted 0 : ${deleted}`);
if (result) { if (result) {
console.log(`version with id: ${id}, deleted`); console.log(`version with id: ${id}, deleted`);
} }
@@ -282,7 +293,7 @@ function queryForOldestVersions(owner, repo, packageName, numVersions, startCurs
owner, owner,
repo, repo,
package: packageName, package: packageName,
last: numVersions, last: numVersions > 100 ? 100 : numVersions,
headers: { headers: {
Accept: 'application/vnd.github.packages-preview+json' Accept: 'application/vnd.github.packages-preview+json'
} }
+18 -10
View File
@@ -3,7 +3,7 @@ import {EMPTY, Observable, of, throwError} from 'rxjs'
import {deletePackageVersions, getOldestVersions, VersionInfo} from './version' import {deletePackageVersions, getOldestVersions, VersionInfo} from './version'
import {concatMap, map, expand, tap} from 'rxjs/operators' import {concatMap, map, expand, tap} from 'rxjs/operators'
const RATE_LIMIT = 99 //const RATE_LIMIT = 99
let totalCount: number let totalCount: number
export function getVersionIds( export function getVersionIds(
@@ -45,10 +45,14 @@ export function finalIds(input: Input): Observable<string[]> {
} }
if (input.hasOldestVersionQueryInfo()) { if (input.hasOldestVersionQueryInfo()) {
if (input.minVersionsToKeep < 0) { if (input.minVersionsToKeep < 0) {
/*
input.numOldVersionsToDelete = input.numOldVersionsToDelete =
input.numOldVersionsToDelete < RATE_LIMIT input.numOldVersionsToDelete < RATE_LIMIT
? input.numOldVersionsToDelete ? input.numOldVersionsToDelete
: RATE_LIMIT : RATE_LIMIT*/
console.log(
`input.numOldVersionsToDelete: ${input.numOldVersionsToDelete}`
)
return getVersionIds( return getVersionIds(
input.owner, input.owner,
input.repo, input.repo,
@@ -58,18 +62,16 @@ export function finalIds(input: Input): Observable<string[]> {
input.token input.token
).pipe( ).pipe(
map(value => { map(value => {
value = value.filter(info => !input.ignoreVersions.test(info.version))
const temp = input.numOldVersionsToDelete const temp = input.numOldVersionsToDelete
input.numOldVersionsToDelete = input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0 input.numOldVersionsToDelete - value.length <= 0
? 0 ? 0
: input.numOldVersionsToDelete - value.length : input.numOldVersionsToDelete - value.length
input.numDeleted += value.filter( console.log(
info => !input.ignoreVersions.test(info.version) `temp: ${temp}, numOldeVersions: ${input.numOldVersionsToDelete}`
).length )
return value return value.map(info => info.id).slice(0, temp)
.filter(info => !input.ignoreVersions.test(info.version))
.map(info => info.id)
.slice(0, temp)
}) })
) )
} else { } else {
@@ -77,7 +79,7 @@ export function finalIds(input: Input): Observable<string[]> {
input.owner, input.owner,
input.repo, input.repo,
input.packageName, input.packageName,
RATE_LIMIT, 100,
'', '',
input.token input.token
).pipe( ).pipe(
@@ -88,6 +90,7 @@ export function finalIds(input: Input): Observable<string[]> {
value = value.filter(info => !input.ignoreVersions.test(info.version)) value = value.filter(info => !input.ignoreVersions.test(info.version))
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted
toDelete = toDelete > value.length ? value.length : toDelete toDelete = toDelete > value.length ? value.length : toDelete
/*
if (toDelete > 0 && input.numDeleted < RATE_LIMIT) { if (toDelete > 0 && input.numDeleted < RATE_LIMIT) {
// using input.numDeleted to keep track of deleted and remaining packages // using input.numDeleted to keep track of deleted and remaining packages
if (input.numDeleted + toDelete > 99) { if (input.numDeleted + toDelete > 99) {
@@ -97,6 +100,11 @@ export function finalIds(input: Input): Observable<string[]> {
input.numDeleted = input.numDeleted + toDelete input.numDeleted = input.numDeleted + toDelete
} }
return value.map(info => info.id).slice(0, toDelete) return value.map(info => info.id).slice(0, toDelete)
} else return []*/
if (toDelete > 0) {
input.numDeleted += toDelete
return value.map(info => info.id).slice(0, toDelete)
} else return [] } else return []
}) })
) )
+9 -1
View File
@@ -1,8 +1,10 @@
import {from, Observable, merge, throwError, of} from 'rxjs' import {from, Observable, merge, throwError, of} from 'rxjs'
import {catchError, map, tap} from 'rxjs/operators' import {catchError, delay, map, tap} from 'rxjs/operators'
import {GraphQlQueryResponse} from '@octokit/graphql/dist-types/types' import {GraphQlQueryResponse} from '@octokit/graphql/dist-types/types'
import {graphql} from './graphql' import {graphql} from './graphql'
let deleted = 0
export interface DeletePackageVersionMutationResponse { export interface DeletePackageVersionMutationResponse {
deletePackageVersion: { deletePackageVersion: {
success: boolean success: boolean
@@ -20,6 +22,11 @@ export function deletePackageVersion(
packageVersionId: string, packageVersionId: string,
token: string token: string
): Observable<boolean> { ): Observable<boolean> {
if (deleted === 99) {
console.log(`reaching rate limit`)
delay(5000)
}
deleted += 1
return from( return from(
graphql(token, mutation, { graphql(token, mutation, {
packageVersionId, packageVersionId,
@@ -51,6 +58,7 @@ export function deletePackageVersions(
const deletes = packageVersionIds.map(id => const deletes = packageVersionIds.map(id =>
deletePackageVersion(id, token).pipe( deletePackageVersion(id, token).pipe(
tap(result => { tap(result => {
console.log(`versions Deleted 0 : ${deleted}`)
if (result) { if (result) {
console.log(`version with id: ${id}, deleted`) console.log(`version with id: ${id}, deleted`)
} else { } else {
+1 -1
View File
@@ -101,7 +101,7 @@ export function queryForOldestVersions(
owner, owner,
repo, repo,
package: packageName, package: packageName,
last: numVersions, last: numVersions > 100 ? 100 : numVersions,
headers: { headers: {
Accept: 'application/vnd.github.packages-preview+json' Accept: 'application/vnd.github.packages-preview+json'
} }