@cdklabs/cdk-amazonmq
Version:
<!--BEGIN STABILITY BANNER-->
121 lines • 13.7 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.PHYSICAL_RESOURCE_ID_REFERENCE = void 0;
exports.decodeCall = decodeCall;
exports.respond = respond;
exports.safeParse = safeParse;
exports.filterKeys = filterKeys;
exports.startsWithOneOf = startsWithOneOf;
exports.flattenObj = flattenObj;
/**
* This file was created mostly for replicating this file: https://github.com/aws/aws-cdk/blob/main/packages/%40aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/utils.ts
* The reason for that is that the custom resource for interacting with RabbitMQ Management HTTP API has been intended to replicate the user experience of AwsCustomResource.
*/
/* eslint-disable import/no-extraneous-dependencies */
const https = require("https");
/**
* Serialized form of the physical resource id for use in the operation parameters
*/
exports.PHYSICAL_RESOURCE_ID_REFERENCE = "PHYSICAL:RESOURCEID:";
function decodeCall(call) {
if (!call) {
return undefined;
}
return JSON.parse(call);
}
function respond(event, responseStatus, reason, physicalResourceId, data) {
const responseBody = JSON.stringify({
Status: responseStatus,
Reason: reason,
PhysicalResourceId: physicalResourceId,
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
NoEcho: false,
Data: data,
});
// eslint-disable-next-line @typescript-eslint/no-require-imports
const parsedUrl = new URL(event.ResponseURL);
const requestOptions = {
hostname: parsedUrl.hostname,
path: `${parsedUrl.pathname}${parsedUrl.search}`,
port: parsedUrl.port || 443,
method: "PUT",
headers: {
"content-type": "",
"content-length": Buffer.byteLength(responseBody, "utf8"),
},
};
return new Promise((resolve, reject) => {
try {
// eslint-disable-next-line @typescript-eslint/no-require-imports
const request = https.request(requestOptions, (response) => {
response.setEncoding("utf8");
const responseData = [];
response.on("data", (chunk) => responseData.push(chunk));
response.on("end", () => {
resolve(responseData.join(""));
});
response.on("error", (e) => {
reject(e);
});
});
request.on("error", (e) => {
reject(e);
});
request.write(responseBody);
request.end();
}
catch (e) {
reject(e);
}
});
}
function safeParse(call) {
if (!call) {
return undefined;
}
return JSON.parse(call);
}
function filterKeys(object, pred) {
return Object.entries(object).reduce((acc, [k, v]) => (pred(k) ? { ...acc, [k]: v } : acc), {});
}
function startsWithOneOf(searchStrings) {
return function (string) {
for (const searchString of searchStrings) {
if (string.startsWith(searchString)) {
return true;
}
}
return false;
};
}
function flattenObj(ob) {
// The object which contains the
// final result
let result = {};
// loop through the object 'ob'
for (const i in ob) {
// We check the type of the i using
// typeof() function and recursively
// call the function again
if (typeof ob[i] === "object") {
const temp = flattenObj(ob[i]);
for (const j in temp) {
// Store temp in result
result[i + "." + j] = temp[j];
}
// eslint-disable-next-line brace-style
}
// Else store ob[i] in result directly
else {
result[i] = ob[i];
}
}
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmFiYml0bXEvY3VzdG9tLXJlc291cmNlL2hhbmRsZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7RUFHRTs7O0FBZ0JGLGdDQUtDO0FBRUQsMEJBc0RDO0FBRUQsOEJBS0M7QUFFRCxnQ0FLQztBQUVELDBDQVdDO0FBRUQsZ0NBeUJDO0FBaklEOzs7R0FHRztBQUVILHNEQUFzRDtBQUN0RCwrQkFBK0I7QUFHL0I7O0dBRUc7QUFDVSxRQUFBLDhCQUE4QixHQUFHLHNCQUFzQixDQUFDO0FBRXJFLFNBQWdCLFVBQVUsQ0FBQyxJQUF3QjtJQUNqRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFnQixPQUFPLENBQ3JCLEtBQWtELEVBQ2xELGNBQXNCLEVBQ3RCLE1BQWMsRUFDZCxrQkFBMEIsRUFDMUIsSUFBUztJQUVULE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxFQUFFLGNBQWM7UUFDdEIsTUFBTSxFQUFFLE1BQU07UUFDZCxrQkFBa0IsRUFBRSxrQkFBa0I7UUFDdEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1FBQzFDLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUM7SUFFSCxpRUFBaUU7SUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLFFBQVEsRUFBRSxT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QUFDLEVBQTBCO0lBQ25ELGdDQUFnQztJQUNoQyxlQUFlO0lBQ2YsSUFBSSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUV4QywrQkFBK0I7SUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQixtQ0FBbUM7UUFDbkMsb0NBQW9DO1FBQ3BDLDBCQUEwQjtRQUMxQixJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQix1QkFBdUI7Z0JBQ3ZCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsdUNBQXVDO1FBQ3pDLENBQUM7UUFFRCxzQ0FBc0M7YUFDakMsQ0FBQztZQUNKLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiovXG5cbi8qKlxuICogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIG1vc3RseSBmb3IgcmVwbGljYXRpbmcgdGhpcyBmaWxlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9tYWluL3BhY2thZ2VzLyU0MGF3cy1jZGsvY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzL2xpYi9jdXN0b20tcmVzb3VyY2VzL2F3cy1jdXN0b20tcmVzb3VyY2UtaGFuZGxlci91dGlscy50c1xuICogVGhlIHJlYXNvbiBmb3IgdGhhdCBpcyB0aGF0IHRoZSBjdXN0b20gcmVzb3VyY2UgZm9yIGludGVyYWN0aW5nIHdpdGggUmFiYml0TVEgTWFuYWdlbWVudCBIVFRQIEFQSSBoYXMgYmVlbiBpbnRlbmRlZCB0byByZXBsaWNhdGUgdGhlIHVzZXIgZXhwZXJpZW5jZSBvZiBBd3NDdXN0b21SZXNvdXJjZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJodHRwc1wiO1xuaW1wb3J0ICogYXMgQVdTTGFtYmRhIGZyb20gXCJhd3MtbGFtYmRhXCI7XG5cbi8qKlxuICogU2VyaWFsaXplZCBmb3JtIG9mIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBpZCBmb3IgdXNlIGluIHRoZSBvcGVyYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgY29uc3QgUEhZU0lDQUxfUkVTT1VSQ0VfSURfUkVGRVJFTkNFID0gXCJQSFlTSUNBTDpSRVNPVVJDRUlEOlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2FsbChjYWxsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoIWNhbGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBKU09OLnBhcnNlKGNhbGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uZChcbiAgZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsXG4gIHJlc3BvbnNlU3RhdHVzOiBzdHJpbmcsXG4gIHJlYXNvbjogc3RyaW5nLFxuICBwaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuKSB7XG4gIGNvbnN0IHJlc3BvbnNlQm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBTdGF0dXM6IHJlc3BvbnNlU3RhdHVzLFxuICAgIFJlYXNvbjogcmVhc29uLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gICAgTG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIE5vRWNobzogZmFsc2UsXG4gICAgRGF0YTogZGF0YSxcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChldmVudC5SZXNwb25zZVVSTCk7XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcGF0aDogYCR7cGFyc2VkVXJsLnBhdGhuYW1lfSR7cGFyc2VkVXJsLnNlYXJjaH1gLFxuICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0IHx8IDQ0MyxcbiAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJcIixcbiAgICAgIFwiY29udGVudC1sZW5ndGhcIjogQnVmZmVyLmJ5dGVMZW5ndGgocmVzcG9uc2VCb2R5LCBcInV0ZjhcIiksXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICByZXNwb25zZS5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgcmVzcG9uc2Uub24oXCJkYXRhXCIsIChjaHVuaykgPT4gcmVzcG9uc2VEYXRhLnB1c2goY2h1bmspKTtcbiAgICAgICAgcmVzcG9uc2Uub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2VEYXRhLmpvaW4oXCJcIikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2Uub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oXCJlcnJvclwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pO1xuICAgICAgcmVxdWVzdC53cml0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZShjYWxsPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIWNhbGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBKU09OLnBhcnNlKGNhbGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyS2V5cyhvYmplY3Q6IG9iamVjdCwgcHJlZDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3QpLnJlZHVjZShcbiAgICAoYWNjLCBbaywgdl0pID0+IChwcmVkKGspID8geyAuLi5hY2MsIFtrXTogdiB9IDogYWNjKSxcbiAgICB7fSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0c1dpdGhPbmVPZihcbiAgc2VhcmNoU3RyaW5nczogc3RyaW5nW10sXG4pOiAoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW4ge1xuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWFyY2hTdHJpbmcgb2Ygc2VhcmNoU3RyaW5ncykge1xuICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKHNlYXJjaFN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5PYmoob2I6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgLy8gVGhlIG9iamVjdCB3aGljaCBjb250YWlucyB0aGVcbiAgLy8gZmluYWwgcmVzdWx0XG4gIGxldCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvLyBsb29wIHRocm91Z2ggdGhlIG9iamVjdCAnb2InXG4gIGZvciAoY29uc3QgaSBpbiBvYikge1xuICAgIC8vIFdlIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBpIHVzaW5nXG4gICAgLy8gdHlwZW9mKCkgZnVuY3Rpb24gYW5kIHJlY3Vyc2l2ZWx5XG4gICAgLy8gY2FsbCB0aGUgZnVuY3Rpb24gYWdhaW5cbiAgICBpZiAodHlwZW9mIG9iW2ldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCB0ZW1wID0gZmxhdHRlbk9iaihvYltpXSk7XG4gICAgICBmb3IgKGNvbnN0IGogaW4gdGVtcCkge1xuICAgICAgICAvLyBTdG9yZSB0ZW1wIGluIHJlc3VsdFxuICAgICAgICByZXN1bHRbaSArIFwiLlwiICsgal0gPSB0ZW1wW2pdO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJyYWNlLXN0eWxlXG4gICAgfVxuXG4gICAgLy8gRWxzZSBzdG9yZSBvYltpXSBpbiByZXN1bHQgZGlyZWN0bHlcbiAgICBlbHNlIHtcbiAgICAgIHJlc3VsdFtpXSA9IG9iW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19