UNPKG

@cdklabs/cdk-amazonmq

Version:
121 lines 13.7 kB
"use strict"; /* 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