88 lines
3.9 KiB
JavaScript
Raw Normal View History

2022-07-12 09:00:22 +02:00
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
import { __awaiter, __extends, __generator } from "tslib";
import { BaseRequestPolicy, } from "./requestPolicy";
import { Constants } from "../util/constants";
import { delay } from "../util/utils";
var StatusCodes = Constants.HttpConstants.StatusCodes;
var DEFAULT_RETRY_COUNT = 3;
export function throttlingRetryPolicy(maxRetries) {
if (maxRetries === void 0) { maxRetries = DEFAULT_RETRY_COUNT; }
return {
create: function (nextPolicy, options) {
return new ThrottlingRetryPolicy(nextPolicy, options, maxRetries);
},
};
}
/**
* To learn more, please refer to
* https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
* https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
* https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
*/
var ThrottlingRetryPolicy = /** @class */ (function (_super) {
__extends(ThrottlingRetryPolicy, _super);
function ThrottlingRetryPolicy(nextPolicy, options, retryLimit) {
var _this = _super.call(this, nextPolicy, options) || this;
_this.retryLimit = retryLimit;
return _this;
}
ThrottlingRetryPolicy.prototype.sendRequest = function (httpRequest) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, this._nextPolicy.sendRequest(httpRequest.clone()).then(function (response) {
return _this.retry(httpRequest, response, 0);
})];
});
});
};
ThrottlingRetryPolicy.prototype.retry = function (httpRequest, httpResponse, retryCount) {
return __awaiter(this, void 0, void 0, function () {
var retryAfterHeader, delayInMs, res;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (httpResponse.status !== StatusCodes.TooManyRequests) {
return [2 /*return*/, httpResponse];
}
retryAfterHeader = httpResponse.headers.get(Constants.HeaderConstants.RETRY_AFTER);
if (!(retryAfterHeader && retryCount < this.retryLimit)) return [3 /*break*/, 3];
delayInMs = ThrottlingRetryPolicy.parseRetryAfterHeader(retryAfterHeader);
if (!delayInMs) return [3 /*break*/, 3];
return [4 /*yield*/, delay(delayInMs)];
case 1:
_a.sent();
return [4 /*yield*/, this._nextPolicy.sendRequest(httpRequest)];
case 2:
res = _a.sent();
return [2 /*return*/, this.retry(httpRequest, res, retryCount + 1)];
case 3: return [2 /*return*/, httpResponse];
}
});
});
};
ThrottlingRetryPolicy.parseRetryAfterHeader = function (headerValue) {
var retryAfterInSeconds = Number(headerValue);
if (Number.isNaN(retryAfterInSeconds)) {
return ThrottlingRetryPolicy.parseDateRetryAfterHeader(headerValue);
}
else {
return retryAfterInSeconds * 1000;
}
};
ThrottlingRetryPolicy.parseDateRetryAfterHeader = function (headerValue) {
try {
var now = Date.now();
var date = Date.parse(headerValue);
var diff = date - now;
return Number.isNaN(diff) ? undefined : diff;
}
catch (error) {
return undefined;
}
};
return ThrottlingRetryPolicy;
}(BaseRequestPolicy));
export { ThrottlingRetryPolicy };
//# sourceMappingURL=throttlingRetryPolicy.js.map