azure-devops-node-api
Version:
Node client for Azure DevOps and TFS REST APIs
72 lines (71 loc) • 3.75 kB
JavaScript
;
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AdoRestClient = exports.AdoHttpClient = void 0;
const RateLimitUtils_1 = require("./RateLimitUtils");
const rm = require("typed-rest-client/RestClient");
const hm = require("typed-rest-client/HttpClient");
/**
* AdoHttpClient that extracts rate limit headers and attaches them to the response object
*/
class AdoHttpClient extends hm.HttpClient {
request(verb, requestUrl, data, headers) {
const _super = Object.create(null, {
request: { get: () => super.request }
});
var _a;
return __awaiter(this, void 0, void 0, function* () {
const res = yield _super.request.call(this, verb, requestUrl, data, headers);
const resHeaders = (_a = res === null || res === void 0 ? void 0 : res.message) === null || _a === void 0 ? void 0 : _a.headers;
RateLimitUtils_1.extractRateLimitHeaders(resHeaders, res);
return res;
});
}
}
exports.AdoHttpClient = AdoHttpClient;
/**
* AdoRestClient that extracts rate limit headers and attaches them to the response/result objects
*/
class AdoRestClient extends rm.RestClient {
processResponse(res, options) {
const _super = Object.create(null, {
processResponse: { get: () => super.processResponse }
});
var _a;
return __awaiter(this, void 0, void 0, function* () {
const headers = (_a = res === null || res === void 0 ? void 0 : res.message) === null || _a === void 0 ? void 0 : _a.headers;
try {
const response = yield _super.processResponse.call(this, res, options);
if (response && response.result && typeof response.result === 'object') {
RateLimitUtils_1.extractRateLimitHeaders(headers, response.result);
// For collection responses (e.g., { count, value: [...] }), also attach to the array
if (Array.isArray(response.result.value)) {
RateLimitUtils_1.extractRateLimitHeaders(headers, response.result.value);
}
}
return response;
}
catch (err) {
// Use the original response headers captured before super.processResponse,
// because the base implementation may not populate err.responseHeaders
// when the response body is not valid JSON (e.g., HTML error pages on 429).
RateLimitUtils_1.extractRateLimitHeaders(headers, err);
if ((err === null || err === void 0 ? void 0 : err.result) && typeof err.result === 'object') {
RateLimitUtils_1.extractRateLimitHeaders(headers, err.result);
}
return Promise.reject(err);
}
});
}
}
exports.AdoRestClient = AdoRestClient;