github-issue-tower-defence-management 2.63.4 → 2.63.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adapter/repositories/GitHubIssueCommentRepository.js +15 -0
- package/bin/adapter/repositories/GitHubIssueCommentRepository.js.map +1 -1
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +16 -9
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/bin/adapter/repositories/issue/RestIssueRepository.js +107 -29
- package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -1
- package/bin/adapter/repositories/issue/githubRateLimitRetry.js +148 -3
- package/bin/adapter/repositories/issue/githubRateLimitRetry.js.map +1 -1
- package/bin/adapter/repositories/issue/githubSecondaryRateLimitBreaker.js +126 -0
- package/bin/adapter/repositories/issue/githubSecondaryRateLimitBreaker.js.map +1 -0
- package/bin/domain/usecases/CliErrorReportUseCase.js +1 -1
- package/bin/domain/usecases/CliErrorReportUseCase.js.map +1 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +2 -5
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/types/adapter/repositories/GitHubIssueCommentRepository.d.ts.map +1 -1
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +7 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts +12 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -1
- package/types/adapter/repositories/issue/githubRateLimitRetry.d.ts +53 -1
- package/types/adapter/repositories/issue/githubRateLimitRetry.d.ts.map +1 -1
- package/types/adapter/repositories/issue/githubSecondaryRateLimitBreaker.d.ts +49 -0
- package/types/adapter/repositories/issue/githubSecondaryRateLimitBreaker.d.ts.map +1 -0
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
|
@@ -37,6 +37,7 @@ exports.RestIssueRepository = void 0;
|
|
|
37
37
|
const ky_1 = __importStar(require("ky"));
|
|
38
38
|
const BaseGitHubRepository_1 = require("../BaseGitHubRepository");
|
|
39
39
|
const githubRateLimitRetry_1 = require("./githubRateLimitRetry");
|
|
40
|
+
const githubSecondaryRateLimitBreaker_1 = require("./githubSecondaryRateLimitBreaker");
|
|
40
41
|
const commentDeduplication_1 = require("../commentDeduplication");
|
|
41
42
|
function isStringRecord(value) {
|
|
42
43
|
return typeof value === 'object' && value !== null;
|
|
@@ -59,6 +60,7 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
59
60
|
return { author: '', body: comment, createdAt: now, url: null };
|
|
60
61
|
}
|
|
61
62
|
}
|
|
63
|
+
this.checkBreakerOrThrow();
|
|
62
64
|
let result;
|
|
63
65
|
try {
|
|
64
66
|
result = await ky_1.default
|
|
@@ -69,6 +71,7 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
69
71
|
.json();
|
|
70
72
|
}
|
|
71
73
|
catch (e) {
|
|
74
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
72
75
|
if (e instanceof ky_1.HTTPError) {
|
|
73
76
|
let bodyText = '';
|
|
74
77
|
try {
|
|
@@ -93,13 +96,20 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
93
96
|
};
|
|
94
97
|
};
|
|
95
98
|
this.createNewIssue = async (owner, repo, title, body, assignees, labels) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
this.checkBreakerOrThrow();
|
|
100
|
+
try {
|
|
101
|
+
const response = await ky_1.default
|
|
102
|
+
.post(`https://api.github.com/repos/${owner}/${repo}/issues`, {
|
|
103
|
+
json: { title, body, assignees, labels },
|
|
104
|
+
headers: { Authorization: `token ${this.ghToken}` },
|
|
105
|
+
})
|
|
106
|
+
.json();
|
|
107
|
+
return response.number;
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
111
|
+
throw e;
|
|
112
|
+
}
|
|
103
113
|
};
|
|
104
114
|
this.getIssue = async (issueUrl) => {
|
|
105
115
|
const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
|
|
@@ -122,6 +132,7 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
122
132
|
};
|
|
123
133
|
};
|
|
124
134
|
this.updateIssue = async (issue) => {
|
|
135
|
+
this.checkBreakerOrThrow();
|
|
125
136
|
try {
|
|
126
137
|
await ky_1.default.patch(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}`, {
|
|
127
138
|
json: {
|
|
@@ -135,6 +146,7 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
135
146
|
});
|
|
136
147
|
}
|
|
137
148
|
catch (e) {
|
|
149
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
138
150
|
if (e instanceof ky_1.HTTPError) {
|
|
139
151
|
const bodyText = await e.response
|
|
140
152
|
.clone()
|
|
@@ -148,22 +160,37 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
148
160
|
}
|
|
149
161
|
};
|
|
150
162
|
this.updateIssueBody = async (issue, body) => {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
163
|
+
this.checkBreakerOrThrow();
|
|
164
|
+
try {
|
|
165
|
+
await ky_1.default.patch(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}`, {
|
|
166
|
+
json: { body },
|
|
167
|
+
headers: { Authorization: `token ${this.ghToken}` },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
172
|
+
throw e;
|
|
173
|
+
}
|
|
155
174
|
};
|
|
156
175
|
this.updateLabels = async (issue, labels) => {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
176
|
+
this.checkBreakerOrThrow();
|
|
177
|
+
try {
|
|
178
|
+
await ky_1.default.put(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}/labels`, {
|
|
179
|
+
json: { labels },
|
|
180
|
+
headers: {
|
|
181
|
+
Authorization: `token ${this.ghToken}`,
|
|
182
|
+
Accept: 'application/vnd.github.v3+json',
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
188
|
+
throw e;
|
|
189
|
+
}
|
|
164
190
|
return;
|
|
165
191
|
};
|
|
166
192
|
this.removeLabel = async (issue, label) => {
|
|
193
|
+
this.checkBreakerOrThrow();
|
|
167
194
|
try {
|
|
168
195
|
await ky_1.default.delete(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}/labels/${encodeURIComponent(label)}`, {
|
|
169
196
|
headers: {
|
|
@@ -173,6 +200,7 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
173
200
|
});
|
|
174
201
|
}
|
|
175
202
|
catch (e) {
|
|
203
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
176
204
|
if (e instanceof ky_1.HTTPError && e.response.status === 404) {
|
|
177
205
|
return;
|
|
178
206
|
}
|
|
@@ -190,13 +218,20 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
190
218
|
}
|
|
191
219
|
catch (e) {
|
|
192
220
|
if (e instanceof ky_1.HTTPError && e.response.status === 404) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
221
|
+
this.checkBreakerOrThrow();
|
|
222
|
+
try {
|
|
223
|
+
await ky_1.default.post(`https://api.github.com/repos/${org}/${repo}/labels`, {
|
|
224
|
+
json: { name: labelName, color: 'ededed' },
|
|
225
|
+
headers: {
|
|
226
|
+
Authorization: `token ${this.ghToken}`,
|
|
227
|
+
Accept: 'application/vnd.github.v3+json',
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
catch (postErr) {
|
|
232
|
+
await this.detectAndRecordSecondaryRateLimit(postErr);
|
|
233
|
+
throw postErr;
|
|
234
|
+
}
|
|
200
235
|
}
|
|
201
236
|
else {
|
|
202
237
|
throw e;
|
|
@@ -204,10 +239,17 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
204
239
|
}
|
|
205
240
|
};
|
|
206
241
|
this.updateAssigneeList = async (issue, assigneeList) => {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
242
|
+
this.checkBreakerOrThrow();
|
|
243
|
+
try {
|
|
244
|
+
await ky_1.default.patch(`https://api.github.com/repos/${issue.org}/${issue.repo}/issues/${issue.number}`, {
|
|
245
|
+
json: { assignees: assigneeList },
|
|
246
|
+
headers: { Authorization: `token ${this.ghToken}` },
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
await this.detectAndRecordSecondaryRateLimit(e);
|
|
251
|
+
throw e;
|
|
252
|
+
}
|
|
211
253
|
};
|
|
212
254
|
this.searchIssues = async (query) => {
|
|
213
255
|
const perPage = 100;
|
|
@@ -292,6 +334,42 @@ class RestIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
|
292
334
|
}
|
|
293
335
|
return comments;
|
|
294
336
|
}
|
|
337
|
+
get stateFilePath() {
|
|
338
|
+
return (0, githubSecondaryRateLimitBreaker_1.secondaryRateLimitStateFilePath)();
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Throws GitHubRateLimitError when the shared secondary rate-limit circuit
|
|
342
|
+
* breaker is open. Call before every content-creating request.
|
|
343
|
+
*/
|
|
344
|
+
checkBreakerOrThrow() {
|
|
345
|
+
const nowMs = Date.now();
|
|
346
|
+
const breaker = (0, githubSecondaryRateLimitBreaker_1.checkSecondaryRateLimitBreaker)(nowMs, this.stateFilePath);
|
|
347
|
+
if (breaker.isBlocked && breaker.resetTimeMs !== null) {
|
|
348
|
+
throw new githubRateLimitRetry_1.GitHubRateLimitError(`GitHub secondary rate limit is active until ${new Date(breaker.resetTimeMs).toISOString()}`, new Date(breaker.resetTimeMs).toISOString());
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* If `e` is an HTTPError caused by a secondary rate limit, records the block
|
|
353
|
+
* to the shared state file and re-throws as GitHubRateLimitError.
|
|
354
|
+
* Returns without throwing when `e` is not a secondary rate limit.
|
|
355
|
+
*/
|
|
356
|
+
async detectAndRecordSecondaryRateLimit(e) {
|
|
357
|
+
if (!(e instanceof ky_1.HTTPError))
|
|
358
|
+
return;
|
|
359
|
+
let bodyText = '';
|
|
360
|
+
try {
|
|
361
|
+
bodyText = await e.response.clone().text();
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
// ky 2.x may have already consumed the body
|
|
365
|
+
}
|
|
366
|
+
const nowMs = Date.now();
|
|
367
|
+
if (!(0, githubRateLimitRetry_1.isSecondaryRateLimit)(e.response.headers, bodyText))
|
|
368
|
+
return;
|
|
369
|
+
const backoffMs = (0, githubRateLimitRetry_1.computeSecondaryRateLimitBackoffMs)(e.response.headers, nowMs);
|
|
370
|
+
(0, githubSecondaryRateLimitBreaker_1.writeSecondaryRateLimitState)(nowMs + backoffMs, nowMs, this.stateFilePath);
|
|
371
|
+
throw new githubRateLimitRetry_1.GitHubRateLimitError(`HTTP ${e.response.status} GitHub API secondary rate limit exceeded`, new Date(nowMs + backoffMs).toISOString());
|
|
372
|
+
}
|
|
295
373
|
}
|
|
296
374
|
exports.RestIssueRepository = RestIssueRepository;
|
|
297
375
|
//# sourceMappingURL=RestIssueRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestIssueRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/RestIssueRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAmC;AACnC,kEAA+D;AAK/D,iEAIgC;AAChC,kEAGiC;AAOjC,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAc;IAEd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC,KAAK,CAChB,CAAC,IAAa,EAAE,EAAE,CAChB,cAAc,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CACjE,CAAC;AACJ,CAAC;AAcD,MAAa,mBACX,SAAQ,2CAAoB;IAD9B;;QAsDE,kBAAa,GAAG,KAAK,EACnB,QAAgB,EAChB,OAAe,EAMd,EAAE;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAExE,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAC5D,KAAK,EACL,IAAI,EACJ,WAAW,CACZ,CAAC;YACF,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,IAAA,8CAAuB,EAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC5D,OAAO,CAAC,IAAI,CACV,0DAA0D,kDAA2B,GAAG,KAAK,eAAe,QAAQ,EAAE,CACvH,CAAC;oBACF,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,IAAI,MAKH,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,YAAE;qBACd,IAAI,CACH,gCAAgC,KAAK,IAAI,IAAI,WAAW,WAAW,WAAW,EAC9E;oBACE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;oBACvB,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,EAAE;iBACpD,CACF;qBACA,IAAI,EAKD,CAAC;YACT,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,cAAS,EAAE,CAAC;oBAC3B,IAAI,QAAQ,GAAG,EAAE,CAAC;oBAClB,IAAI,CAAC;wBACH,QAAQ,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;oBAC7C,CAAC;oBAAC,MAAM,CAAC;wBACP,qEAAqE;wBACrE,2DAA2D;wBAC3D,mEAAmE;oBACrE,CAAC;oBACD,IACE,IAAA,0CAAmB,EAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EACpE,CAAC;wBACD,MAAM,IAAI,2CAAoB,CAC5B,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,iCAAiC,EAC1D,IAAA,+CAAwB,EAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7C,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;gBACtC,GAAG,EAAE,MAAM,CAAC,QAAQ;aACrB,CAAC;QACJ,CAAC,CAAC;QACF,mBAAc,GAAG,KAAK,EACpB,KAAa,EACb,IAAY,EACZ,KAAa,EACb,IAAY,EACZ,SAAmB,EACnB,MAAgB,EACC,EAAE;YACnB,MAAM,QAAQ,GAAG,MAAM,YAAE;iBACtB,IAAI,CAAC,gCAAgC,KAAK,IAAI,IAAI,SAAS,EAAE;gBAC5D,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;gBACxC,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,EAAE;aACpD,CAAC;iBACD,IAAI,EAAsB,CAAC;YAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC,CAAC;QACF,aAAQ,GAAG,KAAK,EACd,QAAgB,EASf,EAAE;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,YAAE;iBACtB,GAAG,CACF,gCAAgC,KAAK,IAAI,IAAI,WAAW,WAAW,EAAE,EACrE;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,EAAE;oBAChD,MAAM,EAAE,gCAAgC;iBACzC;aACF,CACF;iBACA,IAAI,EAQD,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClD,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC/D,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;aAChC,CAAC;QACJ,CAAC,CAAC;QACF,gBAAW,GAAG,KAAK,EAAE,KAAY,EAAE,EAAE;YACnC,IAAI,CAAC;gBACH,MAAM,YAAE,CAAC,KAAK,CACZ,gCAAgC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,EAAE,EAChF;oBACE,IAAI,EAAE;wBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;qBACnB;oBACD,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,EAAE;iBACpD,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,cAAS,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,QAAQ;yBAC9B,KAAK,EAAE;yBACP,IAAI,EAAE;yBACN,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnB,IACE,IAAA,0CAAmB,EAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,EACpE,CAAC;wBACD,MAAM,IAAI,2CAAoB,CAC5B,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,iCAAiC,EAC1D,IAAA,+CAAwB,EAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7C,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAC;QAEF,oBAAe,GAAG,KAAK,EACrB,KAA6C,EAC7C,IAAY,EACG,EAAE;YACjB,MAAM,YAAE,CAAC,KAAK,CACZ,gCAAgC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,EAAE,EAChF;gBACE,IAAI,EAAE,EAAE,IAAI,EAAE;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,EAAE;aACpD,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,iBAAY,GAAG,KAAK,EAClB,KAAY,EACZ,MAAuB,EACR,EAAE;YACjB,MAAM,YAAE,CAAC,GAAG,CACV,gCAAgC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,SAAS,EACvF;gBACE,IAAI,EAAE,EAAE,MAAM,EAAE;gBAChB,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE;oBACtC,MAAM,EAAE,gCAAgC;iBACzC;aACF,CACF,CAAC;YACF,OAAO;QACT,CAAC,CAAC;QAEF,gBAAW,GAAG,KAAK,EAAE,KAAY,EAAE,KAAa,EAAiB,EAAE;YACjE,IAAI,CAAC;gBACH,MAAM,YAAE,CAAC,MAAM,CACb,gCAAgC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACpH;oBACE,OAAO,EAAE;wBACP,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE;wBACtC,MAAM,EAAE,gCAAgC;qBACzC;iBACF,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,cAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxD,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAC;QAEF,qBAAgB,GAAG,KAAK,EACtB,GAAW,EACX,IAAY,EACZ,SAAiB,EACF,EAAE;YACjB,IAAI,CAAC;gBACH,MAAM,YAAE,CAAC,GAAG,CACV,gCAAgC,GAAG,IAAI,IAAI,WAAW,kBAAkB,CAAC,SAAS,CAAC,EAAE,EACrF;oBACE,OAAO,EAAE;wBACP,aAAa,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,EAAE;wBAChD,MAAM,EAAE,gCAAgC;qBACzC;iBACF,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,cAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxD,MAAM,YAAE,CAAC,IAAI,CAAC,gCAAgC,GAAG,IAAI,IAAI,SAAS,EAAE;wBAClE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;wBAC1C,OAAO,EAAE;4BACP,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE;4BACtC,MAAM,EAAE,gCAAgC;yBACzC;qBACF,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,CAAC;gBACV,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,uBAAkB,GAAG,KAAK,EACxB,KAA6C,EAC7C,YAA8B,EACf,EAAE;YACjB,MAAM,YAAE,CAAC,KAAK,CACZ,gCAAgC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,EAAE,EAChF;gBACE,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;gBACjC,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,EAAE;aACpD,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,iBAAY,GAAG,KAAK,EAAE,KAAa,EAA4B,EAAE;YAC/D,MAAM,OAAO,GAAG,GAAG,CAAC;YACpB,MAAM,YAAY,GAAG,EAAE,CAAC;YACxB,MAAM,cAAc,GAAoB,EAAE,CAAC;YAC3C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAG,MAAM,YAAE;qBACtB,GAAG,CAAC,sCAAsC,EAAE;oBAC3C,YAAY,EAAE;wBACZ,CAAC,EAAE,KAAK;wBACR,QAAQ,EAAE,OAAO;wBACjB,IAAI;wBACJ,eAAe,EAAE,MAAM;qBACxB;oBACD,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE;iBAC9D,CAAC;qBACD,IAAI,EAAwB,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,MAAM,EAAE,CAAC;wBACX,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBACpC,MAAM;gBACR,CAAC;YACH,CAAC;YACD,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;QAEM,uBAAkB,GAAG,CAC3B,IAA8B,EACR,EAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CACjC,mEAAmE,CACpE,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,GAAG,EAAE,IAAI,CAAC,QAAQ;gBAClB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS;oBACjC,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM;wBACrB,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,QAAQ;gBACd,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBACxD,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC5D,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAvWS,KAAK,CAAC,0BAA0B,CACtC,KAAa,EACb,IAAY,EACZ,WAAmB;QAEnB,MAAM,KAAK,GAAG,IAAI,IAAI,CACpB,IAAI,CAAC,GAAG,EAAE,GAAG,kDAA2B,CACzC,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,QAAQ,GAA6C,EAAE,CAAC;QAC9D,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE;YACtC,MAAM,EAAE,6BAA6B;SACtC,CAAC;QAEF,IAAI,GAAG,GACL,gCAAgC,KAAK,IAAI,IAAI,WAAW,WAAW,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAEjI,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;oBACrB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC9D,GAAG,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC/B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CAwTF;AA5WD,kDA4WC"}
|
|
1
|
+
{"version":3,"file":"RestIssueRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/RestIssueRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fetchWithGitHubRateLimitRetry = exports.computeBoundedBackoffMs = exports.computeRateLimitResetIso = exports.hasRateLimitSignals = exports.realSleep = exports.RATE_LIMIT_BASE_BACKOFF_MS = exports.RATE_LIMIT_TOTAL_BACKOFF_CAP_MS = exports.RATE_LIMIT_MAX_RETRIES = exports.GitHubRateLimitError = void 0;
|
|
3
|
+
exports.fetchWithGitHubRateLimitRetry = exports.computeBoundedBackoffMs = exports.computeRateLimitResetIso = exports.computeSecondaryRateLimitBackoffMs = exports.isSecondaryRateLimit = exports.hasRateLimitSignals = exports.realSleep = exports.SECONDARY_RATE_LIMIT_FLOOR_MS = exports.RATE_LIMIT_BASE_BACKOFF_MS = exports.RATE_LIMIT_TOTAL_BACKOFF_CAP_MS = exports.RATE_LIMIT_MAX_RETRIES = exports.GitHubRateLimitError = void 0;
|
|
4
|
+
const githubSecondaryRateLimitBreaker_1 = require("./githubSecondaryRateLimitBreaker");
|
|
4
5
|
class GitHubRateLimitError extends Error {
|
|
5
6
|
constructor(message, rateLimitResetAt = null) {
|
|
6
7
|
super(message);
|
|
@@ -12,7 +13,9 @@ exports.GitHubRateLimitError = GitHubRateLimitError;
|
|
|
12
13
|
exports.RATE_LIMIT_MAX_RETRIES = 3;
|
|
13
14
|
exports.RATE_LIMIT_TOTAL_BACKOFF_CAP_MS = 5000;
|
|
14
15
|
exports.RATE_LIMIT_BASE_BACKOFF_MS = 250;
|
|
16
|
+
exports.SECONDARY_RATE_LIMIT_FLOOR_MS = 60000;
|
|
15
17
|
const RATE_LIMIT_MESSAGE_PATTERN = /rate limit|secondary rate limit|abuse/i;
|
|
18
|
+
const SECONDARY_RATE_LIMIT_BODY_PATTERN = /secondary rate limit/i;
|
|
16
19
|
const realSleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
17
20
|
exports.realSleep = realSleep;
|
|
18
21
|
const parseNonNegativeIntegerHeader = (value) => {
|
|
@@ -39,6 +42,56 @@ const hasRateLimitSignals = (status, headers, bodyText) => {
|
|
|
39
42
|
return RATE_LIMIT_MESSAGE_PATTERN.test(bodyText);
|
|
40
43
|
};
|
|
41
44
|
exports.hasRateLimitSignals = hasRateLimitSignals;
|
|
45
|
+
/**
|
|
46
|
+
* Returns true when the response indicates a secondary (content-creation)
|
|
47
|
+
* rate limit, detected by two signals documented by GitHub:
|
|
48
|
+
* 1. Response body contains "secondary rate limit".
|
|
49
|
+
* 2. A retry-after header is present.
|
|
50
|
+
*
|
|
51
|
+
* Secondary rate limits require a minimum 60-second wait before any retry,
|
|
52
|
+
* which is incompatible with the 5-second primary-limit budget cap.
|
|
53
|
+
*
|
|
54
|
+
* Note: x-ratelimit-remaining=0 with a future x-ratelimit-reset and no
|
|
55
|
+
* retry-after is the primary hourly-quota exhaustion signature, NOT a
|
|
56
|
+
* secondary rate limit. That case is handled separately in
|
|
57
|
+
* fetchWithGitHubRateLimitRetry to avoid contaminating the shared circuit
|
|
58
|
+
* breaker state file with a primary-quota event.
|
|
59
|
+
*/
|
|
60
|
+
const isSecondaryRateLimit = (headers, bodyText) => {
|
|
61
|
+
// Signal 1: body explicitly names the secondary rate limit
|
|
62
|
+
if (SECONDARY_RATE_LIMIT_BODY_PATTERN.test(bodyText)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// Signal 2: retry-after header is present
|
|
66
|
+
if (headers.get('retry-after') !== null) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
};
|
|
71
|
+
exports.isSecondaryRateLimit = isSecondaryRateLimit;
|
|
72
|
+
/**
|
|
73
|
+
* Computes how long to wait before retrying after a secondary rate limit
|
|
74
|
+
* response. Respects retry-after and x-ratelimit-reset when present, and
|
|
75
|
+
* enforces a minimum of SECONDARY_RATE_LIMIT_FLOOR_MS (60 s) regardless of
|
|
76
|
+
* what the headers say, as required by the GitHub REST API documentation.
|
|
77
|
+
* The 5-second primary-limit budget cap does NOT apply here.
|
|
78
|
+
*/
|
|
79
|
+
const computeSecondaryRateLimitBackoffMs = (headers, nowMs) => {
|
|
80
|
+
// Prefer retry-after if the server provided one
|
|
81
|
+
const retryAfterSeconds = parseNonNegativeIntegerHeader(headers.get('retry-after'));
|
|
82
|
+
if (retryAfterSeconds !== null) {
|
|
83
|
+
return Math.max(retryAfterSeconds * 1000, exports.SECONDARY_RATE_LIMIT_FLOOR_MS);
|
|
84
|
+
}
|
|
85
|
+
// Fall back to computing the wait from x-ratelimit-reset
|
|
86
|
+
const resetEpochSeconds = parseNonNegativeIntegerHeader(headers.get('x-ratelimit-reset'));
|
|
87
|
+
if (resetEpochSeconds !== null) {
|
|
88
|
+
const waitMs = resetEpochSeconds * 1000 - nowMs;
|
|
89
|
+
return Math.max(waitMs, exports.SECONDARY_RATE_LIMIT_FLOOR_MS);
|
|
90
|
+
}
|
|
91
|
+
// No header guidance available: use the floor
|
|
92
|
+
return exports.SECONDARY_RATE_LIMIT_FLOOR_MS;
|
|
93
|
+
};
|
|
94
|
+
exports.computeSecondaryRateLimitBackoffMs = computeSecondaryRateLimitBackoffMs;
|
|
42
95
|
const computeRateLimitResetIso = (headers) => {
|
|
43
96
|
const resetEpochSeconds = parseNonNegativeIntegerHeader(headers.get('x-ratelimit-reset'));
|
|
44
97
|
if (resetEpochSeconds === null) {
|
|
@@ -58,20 +111,112 @@ const computeBoundedBackoffMs = (headers, attempt, elapsedMs) => {
|
|
|
58
111
|
return Math.min(requestedMs, remainingBudgetMs);
|
|
59
112
|
};
|
|
60
113
|
exports.computeBoundedBackoffMs = computeBoundedBackoffMs;
|
|
61
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Wraps a GitHub API request with rate-limit-aware retry logic.
|
|
116
|
+
*
|
|
117
|
+
* Two classes of rate limit are handled differently:
|
|
118
|
+
*
|
|
119
|
+
* Secondary rate limits (content-creation blocks) — detected by
|
|
120
|
+
* `isSecondaryRateLimit` — require a minimum 60-second wait which exceeds
|
|
121
|
+
* the primary-limit budget cap. When `retryOnSecondaryRateLimit` is false
|
|
122
|
+
* (the default, appropriate for interactive console operations) the function
|
|
123
|
+
* returns the error response immediately without retrying, so exactly one
|
|
124
|
+
* request is spent and the caller can surface the reset timestamp to the
|
|
125
|
+
* user. When true, up to RATE_LIMIT_MAX_RETRIES retries are performed with
|
|
126
|
+
* `computeSecondaryRateLimitBackoffMs` (60-second floor, no budget cap).
|
|
127
|
+
*
|
|
128
|
+
* Circuit breaker (content-creating requests only):
|
|
129
|
+
* When `isContentCreating` is true, the function checks a shared on-disk
|
|
130
|
+
* state file before issuing the request. If another process has already
|
|
131
|
+
* recorded an active secondary rate limit block, the request is not issued
|
|
132
|
+
* and a synthetic 403 response is returned immediately, naming the reset
|
|
133
|
+
* time. When a secondary rate limit is detected in a response, the block
|
|
134
|
+
* is written to the shared state file so every other process on the host
|
|
135
|
+
* benefits from the discovery.
|
|
136
|
+
*
|
|
137
|
+
* Primary rate limits follow the original sub-second exponential schedule
|
|
138
|
+
* bounded by RATE_LIMIT_TOTAL_BACKOFF_CAP_MS. Non-rate-limit failures are
|
|
139
|
+
* returned immediately without retrying.
|
|
140
|
+
*/
|
|
141
|
+
const fetchWithGitHubRateLimitRetry = async (request, sleep = exports.realSleep, now = Date.now, retryOnSecondaryRateLimit = false, isContentCreating = false, stateFilePath = (0, githubSecondaryRateLimitBreaker_1.secondaryRateLimitStateFilePath)()) => {
|
|
62
142
|
const startMs = now();
|
|
63
143
|
let attempt = 0;
|
|
64
144
|
for (;;) {
|
|
145
|
+
// Circuit breaker: before the first request attempt, check whether another
|
|
146
|
+
// process has already recorded a live secondary rate limit block. This
|
|
147
|
+
// prevents the fleet from hammering GitHub in parallel once one process
|
|
148
|
+
// has discovered the block. The check is limited to the first attempt so
|
|
149
|
+
// that the non-interactive retry path (retryOnSecondaryRateLimit: true)
|
|
150
|
+
// can honour its own recorded wait without blocking itself on a state it
|
|
151
|
+
// just wrote.
|
|
152
|
+
if (isContentCreating && attempt === 0) {
|
|
153
|
+
const nowBeforeMs = now();
|
|
154
|
+
const breaker = (0, githubSecondaryRateLimitBreaker_1.checkSecondaryRateLimitBreaker)(nowBeforeMs, stateFilePath);
|
|
155
|
+
if (breaker.isBlocked && breaker.resetTimeMs !== null) {
|
|
156
|
+
const resetIso = new Date(breaker.resetTimeMs).toISOString();
|
|
157
|
+
return new Response(JSON.stringify({
|
|
158
|
+
message: `GitHub secondary rate limit is active until ${resetIso}; retry later`,
|
|
159
|
+
}), { status: 403 });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
65
162
|
const response = await request();
|
|
66
163
|
if (response.ok) {
|
|
67
164
|
return response;
|
|
68
165
|
}
|
|
69
166
|
const bodyText = await response.clone().text();
|
|
167
|
+
const nowMs = now();
|
|
168
|
+
// Secondary rate limit detection and circuit-breaker writes are scoped to
|
|
169
|
+
// content-creating operations. Read operations (isContentCreating: false)
|
|
170
|
+
// fall directly through to the primary rate-limit handler so that a
|
|
171
|
+
// transient 429/retry-after on a read is still retried rather than
|
|
172
|
+
// silently dropped. Secondary rate limits are caused exclusively by
|
|
173
|
+
// content-creation activity, so detecting them on reads would produce
|
|
174
|
+
// false positives and contaminate the shared state file.
|
|
175
|
+
if (isContentCreating && (0, exports.isSecondaryRateLimit)(response.headers, bodyText)) {
|
|
176
|
+
// Record the block in the shared state file so other processes on this
|
|
177
|
+
// host can skip their pending content-creating requests immediately.
|
|
178
|
+
const backoffMs = (0, exports.computeSecondaryRateLimitBackoffMs)(response.headers, nowMs);
|
|
179
|
+
(0, githubSecondaryRateLimitBreaker_1.writeSecondaryRateLimitState)(nowMs + backoffMs, nowMs, stateFilePath);
|
|
180
|
+
if (!retryOnSecondaryRateLimit) {
|
|
181
|
+
// Interactive callers: fail immediately so the reset timestamp
|
|
182
|
+
// already present in the error message reaches the user without
|
|
183
|
+
// spending three more blocked requests across two seconds.
|
|
184
|
+
return response;
|
|
185
|
+
}
|
|
186
|
+
if (attempt >= exports.RATE_LIMIT_MAX_RETRIES) {
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
console.log(`GitHub returned ${response.status} (secondary rate limit). Backing off ${backoffMs}ms before retry ${attempt + 1}/${exports.RATE_LIMIT_MAX_RETRIES}.`);
|
|
190
|
+
await sleep(backoffMs);
|
|
191
|
+
attempt++;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Primary hourly-quota exhaustion: x-ratelimit-remaining is 0 with a
|
|
195
|
+
// future x-ratelimit-reset and no retry-after means the hourly quota is
|
|
196
|
+
// fully spent. The reset is up to 3,600 s away, making the 250/500/1000 ms
|
|
197
|
+
// sub-second backoff useless — four identical blocked requests are spent for
|
|
198
|
+
// no gain. Return immediately so the caller surfaces the reset time.
|
|
199
|
+
//
|
|
200
|
+
// Discriminator from the secondary case: secondary rate limits carry
|
|
201
|
+
// retry-after (signal 2) or an explicit secondary-rate-limit body phrase
|
|
202
|
+
// (signal 1) and are already handled above when isContentCreating is true.
|
|
203
|
+
// A response with neither — only remaining=0 and a future reset — is a
|
|
204
|
+
// primary exhaustion.
|
|
205
|
+
const quotaRemaining = parseNonNegativeIntegerHeader(response.headers.get('x-ratelimit-remaining'));
|
|
206
|
+
const resetEpoch = parseNonNegativeIntegerHeader(response.headers.get('x-ratelimit-reset'));
|
|
207
|
+
if (quotaRemaining === 0 &&
|
|
208
|
+
response.headers.get('retry-after') === null &&
|
|
209
|
+
resetEpoch !== null &&
|
|
210
|
+
resetEpoch * 1000 > nowMs) {
|
|
211
|
+
return response;
|
|
212
|
+
}
|
|
213
|
+
// Primary rate limit or other transient error: existing sub-second
|
|
214
|
+
// exponential schedule bounded by RATE_LIMIT_TOTAL_BACKOFF_CAP_MS.
|
|
70
215
|
if (attempt >= exports.RATE_LIMIT_MAX_RETRIES ||
|
|
71
216
|
!(0, exports.hasRateLimitSignals)(response.status, response.headers, bodyText)) {
|
|
72
217
|
return response;
|
|
73
218
|
}
|
|
74
|
-
const elapsedMs =
|
|
219
|
+
const elapsedMs = nowMs - startMs;
|
|
75
220
|
const backoffMs = (0, exports.computeBoundedBackoffMs)(response.headers, attempt, elapsedMs);
|
|
76
221
|
if (backoffMs <= 0) {
|
|
77
222
|
return response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubRateLimitRetry.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/githubRateLimitRetry.ts"],"names":[],"mappings":";;;AAAA,MAAa,oBAAqB,SAAQ,KAAK;IAI7C,YAAY,OAAe,EAAE,mBAAkC,IAAI;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,sBAAsB,CAAC;QAKrC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;CACF;AARD,oDAQC;AAEY,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,0BAA0B,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"githubRateLimitRetry.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/githubRateLimitRetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.checkSecondaryRateLimitBreaker = exports.writeSecondaryRateLimitState = exports.readSecondaryRateLimitState = exports.secondaryRateLimitStateFilePath = exports.STALE_STATE_MAX_AGE_MS = exports.SECONDARY_RATE_LIMIT_STATE_FILE_ENV_VAR = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const localStorageCacheDirectory_1 = require("../localStorageCacheDirectory");
|
|
40
|
+
/**
|
|
41
|
+
* Environment variable that overrides the path of the shared secondary rate
|
|
42
|
+
* limit state file. When absent the file lives under the TDPM cache
|
|
43
|
+
* directory so all processes on the host share the same path automatically.
|
|
44
|
+
*/
|
|
45
|
+
exports.SECONDARY_RATE_LIMIT_STATE_FILE_ENV_VAR = 'TDPM_GH_SECONDARY_RATE_LIMIT_STATE_FILE';
|
|
46
|
+
/**
|
|
47
|
+
* State older than this is treated as non-blocking. A crashed writer cannot
|
|
48
|
+
* wedge the fleet permanently beyond one hour.
|
|
49
|
+
*/
|
|
50
|
+
exports.STALE_STATE_MAX_AGE_MS = 60 * 60 * 1000; // 1 hour
|
|
51
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
52
|
+
const isSecondaryRateLimitState = (value) => {
|
|
53
|
+
if (!isRecord(value)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return (typeof value.resetTimeMs === 'number' &&
|
|
57
|
+
typeof value.detectedAtMs === 'number');
|
|
58
|
+
};
|
|
59
|
+
const secondaryRateLimitStateFilePath = () => process.env[exports.SECONDARY_RATE_LIMIT_STATE_FILE_ENV_VAR] ??
|
|
60
|
+
path.join((0, localStorageCacheDirectory_1.tdpmCacheDirectory)(), 'gh-secondary-rate-limit.json');
|
|
61
|
+
exports.secondaryRateLimitStateFilePath = secondaryRateLimitStateFilePath;
|
|
62
|
+
/**
|
|
63
|
+
* Reads the shared state file. Returns null on any I/O or parse error so
|
|
64
|
+
* the caller always falls back to the non-blocking path rather than
|
|
65
|
+
* crashing.
|
|
66
|
+
*/
|
|
67
|
+
const readSecondaryRateLimitState = (filePath = (0, exports.secondaryRateLimitStateFilePath)()) => {
|
|
68
|
+
try {
|
|
69
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
70
|
+
const parsed = JSON.parse(raw);
|
|
71
|
+
return isSecondaryRateLimitState(parsed) ? parsed : null;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.readSecondaryRateLimitState = readSecondaryRateLimitState;
|
|
78
|
+
/**
|
|
79
|
+
* Writes the state file atomically (temp-file then rename) so a concurrent
|
|
80
|
+
* reader never sees a partial file. Errors are swallowed: failure to write
|
|
81
|
+
* means other processes simply do not benefit from this detection, which
|
|
82
|
+
* degrades gracefully to the pre-breaker behaviour.
|
|
83
|
+
*/
|
|
84
|
+
const writeSecondaryRateLimitState = (resetTimeMs, detectedAtMs, filePath = (0, exports.secondaryRateLimitStateFilePath)()) => {
|
|
85
|
+
const state = { resetTimeMs, detectedAtMs };
|
|
86
|
+
const dir = path.dirname(filePath);
|
|
87
|
+
try {
|
|
88
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
89
|
+
const tmpPath = path.join(dir, `.gh-secondary-rate-limit-${process.pid}.tmp`);
|
|
90
|
+
fs.writeFileSync(tmpPath, JSON.stringify(state), { encoding: 'utf8' });
|
|
91
|
+
fs.renameSync(tmpPath, filePath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Best-effort: if the write fails, the breaker simply does not protect
|
|
95
|
+
// other processes for this block.
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.writeSecondaryRateLimitState = writeSecondaryRateLimitState;
|
|
99
|
+
/**
|
|
100
|
+
* Checks whether a previously recorded secondary rate limit block is still
|
|
101
|
+
* active.
|
|
102
|
+
*
|
|
103
|
+
* Returns { isBlocked: false } in every error or edge case:
|
|
104
|
+
* - State file is missing, unreadable, or malformed.
|
|
105
|
+
* - State file is stale (detectedAtMs more than one hour ago).
|
|
106
|
+
* - Reset time has already passed.
|
|
107
|
+
*
|
|
108
|
+
* This ensures a crashed or hung writer cannot wedge the fleet permanently.
|
|
109
|
+
*/
|
|
110
|
+
const checkSecondaryRateLimitBreaker = (nowMs, filePath = (0, exports.secondaryRateLimitStateFilePath)()) => {
|
|
111
|
+
const state = (0, exports.readSecondaryRateLimitState)(filePath);
|
|
112
|
+
if (state === null) {
|
|
113
|
+
return { isBlocked: false, resetTimeMs: null };
|
|
114
|
+
}
|
|
115
|
+
// Guard against a stale file left by a crashed writer
|
|
116
|
+
if (nowMs - state.detectedAtMs > exports.STALE_STATE_MAX_AGE_MS) {
|
|
117
|
+
return { isBlocked: false, resetTimeMs: null };
|
|
118
|
+
}
|
|
119
|
+
// Block has expired
|
|
120
|
+
if (nowMs >= state.resetTimeMs) {
|
|
121
|
+
return { isBlocked: false, resetTimeMs: null };
|
|
122
|
+
}
|
|
123
|
+
return { isBlocked: true, resetTimeMs: state.resetTimeMs };
|
|
124
|
+
};
|
|
125
|
+
exports.checkSecondaryRateLimitBreaker = checkSecondaryRateLimitBreaker;
|
|
126
|
+
//# sourceMappingURL=githubSecondaryRateLimitBreaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubSecondaryRateLimitBreaker.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/githubSecondaryRateLimitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const isGitHubRateLimitError = (error) => {
|
|
|
8
8
|
if (error.name === 'GitHubRateLimitError') {
|
|
9
9
|
return true;
|
|
10
10
|
}
|
|
11
|
-
return (
|
|
11
|
+
return (/:\s*(403|429)\b/.test(error.message) ||
|
|
12
12
|
/rate limit|secondary rate limit|abuse/i.test(error.message));
|
|
13
13
|
};
|
|
14
14
|
class CliErrorReportUseCase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliErrorReportUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/CliErrorReportUseCase.ts"],"names":[],"mappings":";;;AAOA,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAW,EAAE;IACzD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"CliErrorReportUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/CliErrorReportUseCase.ts"],"names":[],"mappings":"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"}
|