@cdklabs/cdk-amazonmq
Version:
<!--BEGIN STABILITY BANNER-->
112 lines • 14.4 kB
JavaScript
;
/*
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.request = void 0;
/**
* This file is effectively a thin wrapper on the Node https module that is used to interact with RabbitMQ Management HTTP API
*/
/* eslint-disable import/no-extraneous-dependencies */
const https = require("https");
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
const smClient = new client_secrets_manager_1.SecretsManagerClient({});
/**
* Make a request to the RabbitMQ Management HTTP API.
*
* @param options the options for the request
* @returns the response from the RabbitMQ Management HTTP API
*/
const request = async (options) => {
validateOptions(options);
const { credentials } = options;
if (credentials === undefined) {
throw new Error("CREDENTIALS");
}
const { SecretString } = await smClient.send(new client_secrets_manager_1.GetSecretValueCommand({
SecretId: credentials,
}));
if (SecretString === undefined) {
throw new Error("SecretString");
}
// WARN: in order to interact with the RabbitMQ Management HTTP API we need to work with a plaintext password
// Never log this password!
const { username, password } = JSON.parse(SecretString);
const url = new URL(options.url);
const input = {
rabbitUrl: url,
username: username,
password: password,
path: options.path,
method: options.method ?? "GET",
payload: options.payload,
};
const { payload } = await httpsRequest(input);
return payload;
};
exports.request = request;
/**
* Validates the options for the RabbitMQ Management HTTP API call. The purpose of this method is to narrow down the potential targets of the custom resource (and the AWS Lambda).
* @param options
*/
function validateOptions(options) {
// A rudimentary test verifying if the API call starts with /api (as there are no other paths allowed for the RabbitMQ Management HTTP API).
// This limits the paths able to be used
if (!options.path.startsWith("/api")) {
throw new Error(`There is no RabbitMQ Management HTTP API call that does not start with '/api'. Received ${options.url}`);
}
}
/**
* Make a request to the RabbitMQ Management HTTP API.
*
* @param input the input for the request
* @returns the response from the RabbitMQ Management HTTP API
*/
const httpsRequest = (input) => {
const { rabbitUrl, path, method, username, password, payload } = input;
const options = {
hostname: rabbitUrl.hostname,
port: 443,
path,
method,
headers: {
"Content-Type": "application/json",
Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`,
},
};
return new Promise((resolve, reject) => {
const req = https.request({ ...options }, (res) => {
res.setEncoding("utf8");
let rawData = "";
res.on("data", (chunk) => {
rawData += chunk;
});
res.on("end", () => {
try {
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
resolve({
headers: res.headers,
statusCode: res.statusCode,
payload: rawData !== "" ? JSON.parse(rawData) : undefined,
});
}
else {
reject(new Error(`Request failed with status code ${res.statusCode}: ${rawData}`));
}
}
catch (e) {
reject(e);
}
});
});
req.on("error", (e) => {
reject(e);
});
if (payload !== undefined) {
req.write(JSON.stringify(payload));
}
req.end();
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFiYml0bXEtbWFuYWdlbWVudC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmFiYml0bXEvY3VzdG9tLXJlc291cmNlL2hhbmRsZXIvcmFiYml0bXEtbWFuYWdlbWVudC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7RUFHRTs7O0FBRUY7O0dBRUc7QUFFSCxzREFBc0Q7QUFDdEQsK0JBQStCO0FBRS9CLDRFQUd5QztBQUd6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLDZDQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBSTlDOzs7OztHQUtHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQStCLEVBQUUsRUFBRTtJQUMvRCxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekIsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVoQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUMxQyxJQUFJLDhDQUFxQixDQUFDO1FBQ3hCLFFBQVEsRUFBRSxXQUFXO0tBQ3RCLENBQUMsQ0FDSCxDQUFDO0lBRUYsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsNkdBQTZHO0lBQzdHLGlDQUFpQztJQUNqQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUdyRCxDQUFDO0lBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sS0FBSyxHQUEw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QUFDLENBQUMsQ0FBQztRQUVILEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuKi9cblxuLyoqXG4gKiBUaGlzIGZpbGUgaXMgZWZmZWN0aXZlbHkgYSB0aGluIHdyYXBwZXIgb24gdGhlIE5vZGUgaHR0cHMgbW9kdWxlIHRoYXQgaXMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIFJhYmJpdE1RIE1hbmFnZW1lbnQgSFRUUCBBUElcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJodHRwc1wiO1xuXG5pbXBvcnQge1xuICBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsXG4gIFNlY3JldHNNYW5hZ2VyQ2xpZW50LFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuaW1wb3J0IHsgSHR0cE1ldGhvZCwgUmFiYml0QXBpQ2FsbCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IHNtQ2xpZW50ID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KHt9KTtcblxudHlwZSBSYWJiaXRNcVJlcXVlc3RPcHRpb25zID0gUmFiYml0QXBpQ2FsbDtcblxuLyoqXG4gKiBNYWtlIGEgcmVxdWVzdCB0byB0aGUgUmFiYml0TVEgTWFuYWdlbWVudCBIVFRQIEFQSS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHRoZSByZXNwb25zZSBmcm9tIHRoZSBSYWJiaXRNUSBNYW5hZ2VtZW50IEhUVFAgQVBJXG4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0ID0gYXN5bmMgKG9wdGlvbnM6IFJhYmJpdE1xUmVxdWVzdE9wdGlvbnMpID0+IHtcbiAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHsgY3JlZGVudGlhbHMgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKGNyZWRlbnRpYWxzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDUkVERU5USUFMU1wiKTtcbiAgfVxuXG4gIGNvbnN0IHsgU2VjcmV0U3RyaW5nIH0gPSBhd2FpdCBzbUNsaWVudC5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IGNyZWRlbnRpYWxzLFxuICAgIH0pLFxuICApO1xuXG4gIGlmIChTZWNyZXRTdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNlY3JldFN0cmluZ1wiKTtcbiAgfVxuXG4gIC8vIFdBUk46IGluIG9yZGVyIHRvIGludGVyYWN0IHdpdGggdGhlIFJhYmJpdE1RIE1hbmFnZW1lbnQgSFRUUCBBUEkgd2UgbmVlZCB0byB3b3JrIHdpdGggYSBwbGFpbnRleHQgcGFzc3dvcmRcbiAgLy8gICAgICAgTmV2ZXIgbG9nIHRoaXMgcGFzc3dvcmQhXG4gIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSBKU09OLnBhcnNlKFNlY3JldFN0cmluZykgYXMge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgfTtcblxuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMudXJsKTtcblxuICBjb25zdCBpbnB1dDogUmFiYml0QXBpUmVxdWVzdElucHV0ID0ge1xuICAgIHJhYmJpdFVybDogdXJsLFxuICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QgPz8gXCJHRVRcIixcbiAgICBwYXlsb2FkOiBvcHRpb25zLnBheWxvYWQsXG4gIH07XG5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBhd2FpdCBodHRwc1JlcXVlc3QoaW5wdXQpO1xuXG4gIHJldHVybiBwYXlsb2FkO1xufTtcblxudHlwZSBSYWJiaXRBcGlSZXF1ZXN0SW5wdXQgPSB7XG4gIHJhYmJpdFVybDogVVJMO1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG1ldGhvZD86IEh0dHBNZXRob2Q7XG4gIHBheWxvYWQ/OiB7fTtcbn07XG5cbmV4cG9ydCB0eXBlIFJhYmJpdEFwaVJlc3BvbnNlPFRSZXNwb25zZT4gPSB7XG4gIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHN0YXR1c0NvZGU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcGF5bG9hZD86IFRSZXNwb25zZTtcbn07XG5cbnR5cGUgUmFiYml0QXBpUmVxdWVzdCA9IDxUUmVzcG9uc2UgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgaW5wdXQ6IFJhYmJpdEFwaVJlcXVlc3RJbnB1dCxcbikgPT4gUHJvbWlzZTxSYWJiaXRBcGlSZXNwb25zZTxUUmVzcG9uc2U+PjtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG9wdGlvbnMgZm9yIHRoZSBSYWJiaXRNUSBNYW5hZ2VtZW50IEhUVFAgQVBJIGNhbGwuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIG5hcnJvdyBkb3duIHRoZSBwb3RlbnRpYWwgdGFyZ2V0cyBvZiB0aGUgY3VzdG9tIHJlc291cmNlIChhbmQgdGhlIEFXUyBMYW1iZGEpLlxuICogQHBhcmFtIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnM6IFJhYmJpdE1xUmVxdWVzdE9wdGlvbnMpIHtcbiAgLy8gQSBydWRpbWVudGFyeSB0ZXN0IHZlcmlmeWluZyBpZiB0aGUgQVBJIGNhbGwgc3RhcnRzIHdpdGggL2FwaSAoYXMgdGhlcmUgYXJlIG5vIG90aGVyIHBhdGhzIGFsbG93ZWQgZm9yIHRoZSBSYWJiaXRNUSBNYW5hZ2VtZW50IEhUVFAgQVBJKS5cbiAgLy8gVGhpcyBsaW1pdHMgdGhlIHBhdGhzIGFibGUgdG8gYmUgdXNlZFxuICBpZiAoIW9wdGlvbnMucGF0aC5zdGFydHNXaXRoKFwiL2FwaVwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBpcyBubyBSYWJiaXRNUSBNYW5hZ2VtZW50IEhUVFAgQVBJIGNhbGwgdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoICcvYXBpJy4gUmVjZWl2ZWQgJHtvcHRpb25zLnVybH1gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIGEgcmVxdWVzdCB0byB0aGUgUmFiYml0TVEgTWFuYWdlbWVudCBIVFRQIEFQSS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMgdGhlIHJlc3BvbnNlIGZyb20gdGhlIFJhYmJpdE1RIE1hbmFnZW1lbnQgSFRUUCBBUElcbiAqL1xuY29uc3QgaHR0cHNSZXF1ZXN0OiBSYWJiaXRBcGlSZXF1ZXN0ID0gPFRSZXNwb25zZSA9IHt9PihcbiAgaW5wdXQ6IFJhYmJpdEFwaVJlcXVlc3RJbnB1dCxcbikgPT4ge1xuICBjb25zdCB7IHJhYmJpdFVybCwgcGF0aCwgbWV0aG9kLCB1c2VybmFtZSwgcGFzc3dvcmQsIHBheWxvYWQgfSA9IGlucHV0O1xuXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHJhYmJpdFVybC5ob3N0bmFtZSxcbiAgICBwb3J0OiA0NDMsXG4gICAgcGF0aCxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gKS50b1N0cmluZyhcbiAgICAgICAgXCJiYXNlNjRcIixcbiAgICAgICl9YCxcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxSYWJiaXRBcGlSZXNwb25zZTxUUmVzcG9uc2U+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gaHR0cHMucmVxdWVzdCh7IC4uLm9wdGlvbnMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgICAgIGxldCByYXdEYXRhID0gXCJcIjtcbiAgICAgIHJlcy5vbihcImRhdGFcIiwgKGNodW5rKSA9PiB7XG4gICAgICAgIHJhd0RhdGEgKz0gY2h1bms7XG4gICAgICB9KTtcbiAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICYmIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXJzIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgICBwYXlsb2FkOlxuICAgICAgICAgICAgICAgIHJhd0RhdGEgIT09IFwiXCIgPyAoSlNPTi5wYXJzZShyYXdEYXRhKSBhcyBUUmVzcG9uc2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICR7cmVzLnN0YXR1c0NvZGV9OiAke3Jhd0RhdGF9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJlcS5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG5cbiAgICBpZiAocGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgIH1cblxuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59O1xuIl19