@confluentinc/schemaregistry
Version:
Node.js client for Confluent Schema Registry
78 lines (77 loc) • 3.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports._AzureIMDSBearerToken = exports._AzureIMDSOAuthClient = exports._AzureIMDSOAuthClientBuilder = void 0;
const abstract_oauth_client_1 = require("./abstract-oauth-client");
const wreck_1 = __importDefault(require("@hapi/wreck"));
const TOKEN_EXPIRATION_THRESHOLD_PERCENTAGE = 0.8;
class AzureIMDSBearerToken {
constructor() {
this.access_token = undefined;
this.expires_in = undefined;
this.expires_on = undefined;
}
}
exports._AzureIMDSBearerToken = AzureIMDSBearerToken;
class AzureIMDSOAuthClientBuilder extends abstract_oauth_client_1._AbstractBearerTokenProviderBuilder {
constructor(bearerAuthCredentials) {
super(bearerAuthCredentials);
}
validate() {
super.validate();
if (!this.bearerAuthCredentials.issuerEndpointUrl &&
!this.bearerAuthCredentials.issuerEndpointQuery)
throw new Error(`Missing required configuration property: issuerEndpointQuery`);
}
build(maxRetries, retriesWaitMs, retriesMaxWaitMs) {
this.validate();
return new AzureIMDSOAuthClient(this.bearerAuthCredentials, maxRetries, retriesWaitMs, retriesMaxWaitMs);
}
}
exports._AzureIMDSOAuthClientBuilder = AzureIMDSOAuthClientBuilder;
class AzureIMDSOAuthClient extends abstract_oauth_client_1._AbstractOAuthClient {
constructor(bearerAuthCredentials, maxRetries, retriesWaitMs, retriesMaxWaitMs) {
super(bearerAuthCredentials, maxRetries, retriesWaitMs, retriesMaxWaitMs);
this.tokenEndpoint = bearerAuthCredentials.issuerEndpointUrl ||
AzureIMDSOAuthClient.DEFAULT_AZURE_IMDS_TOKEN_ENDPOINT;
if (bearerAuthCredentials.issuerEndpointQuery) {
const url = new URL(this.tokenEndpoint);
url.search = bearerAuthCredentials.issuerEndpointQuery;
url.hash = '';
this.tokenEndpoint = url.toString();
}
}
async fetchToken() {
const { payload } = await wreck_1.default.get(this.tokenEndpoint, {
headers: {
Metadata: 'true'
},
json: 'force',
timeout: 30000 // 30 seconds limit for each request
});
this.tokenObject = payload;
return this.getAccessTokenString();
}
tokenExpired() {
if (!this.tokenObject?.expires_in || !this.tokenObject?.expires_on)
return true;
const expiresIn = +this.tokenObject.expires_in;
let expiresOn = +this.tokenObject.expires_on;
if (isNaN(expiresIn) || isNaN(expiresOn))
return true;
const expiryWindow = expiresIn * 1000 * TOKEN_EXPIRATION_THRESHOLD_PERCENTAGE;
expiresOn = expiresOn * 1000;
return expiresOn < Date.now() + expiryWindow;
}
getAccessTokenString() {
const accessToken = this.tokenObject?.access_token;
if (typeof accessToken !== 'string') {
throw new Error('Access token is not available');
}
return accessToken;
}
}
exports._AzureIMDSOAuthClient = AzureIMDSOAuthClient;
AzureIMDSOAuthClient.DEFAULT_AZURE_IMDS_TOKEN_ENDPOINT = 'http://169.254.169.254/metadata/identity/oauth2/token';