12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- const DEFAULT_RETRY_AFTER = 60 * 1000;
- function parseRetryAfterHeader(header, now = Date.now()) {
- const headerDelay = parseInt(`${header}`, 10);
- if (!isNaN(headerDelay)) {
- return headerDelay * 1000;
- }
- const headerDate = Date.parse(`${header}`);
- if (!isNaN(headerDate)) {
- return headerDate - now;
- }
- return DEFAULT_RETRY_AFTER;
- }
- function disabledUntil(limits, category) {
- return limits[category] || limits.all || 0;
- }
- function isRateLimited(limits, category, now = Date.now()) {
- return disabledUntil(limits, category) > now;
- }
- function updateRateLimits(
- limits,
- { statusCode, headers },
- now = Date.now(),
- ) {
- const updatedRateLimits = {
- ...limits,
- };
-
-
- const rateLimitHeader = headers && headers['x-sentry-rate-limits'];
- const retryAfterHeader = headers && headers['retry-after'];
- if (rateLimitHeader) {
-
- for (const limit of rateLimitHeader.trim().split(',')) {
- const [retryAfter, categories] = limit.split(':', 2);
- const headerDelay = parseInt(retryAfter, 10);
- const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000;
- if (!categories) {
- updatedRateLimits.all = now + delay;
- } else {
- for (const category of categories.split(';')) {
- updatedRateLimits[category] = now + delay;
- }
- }
- }
- } else if (retryAfterHeader) {
- updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);
- } else if (statusCode === 429) {
- updatedRateLimits.all = now + 60 * 1000;
- }
- return updatedRateLimits;
- }
- export { DEFAULT_RETRY_AFTER, disabledUntil, isRateLimited, parseRetryAfterHeader, updateRateLimits };
|