UNPKG

serverless-spy

Version:

CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.

63 lines 8.25 kB
import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; import * as aws4 from 'aws4'; // ""wss://m6g3w6ttdh.execute-api.eu-west-1.amazonaws.com/prod";" export async function getSignedWebSocketUrl(url, credentials) { let hostParts; let pathname; if (!url) { throw new Error(`Missing websocket URL`); } try { new URL(url); //validate URL const urlParsed = parseUrl(url); pathname = urlParsed.pathname; hostParts = urlParsed.host.split('.'); } catch { throw new Error(`Invalid websocket URL ${url}`); } if (!credentials) { const credentialsProvider = fromNodeProviderChain(); credentials = await credentialsProvider(); } const AWS_REGION = hostParts[2]; // The region of your API-gateway const SOCKET_HOST = hostParts[0]; // Your API-gateway ID const ENV = pathname.replace(/^\//, ''); // The stage of your target deployment const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss! // const AWS_REGION = "eu-west-1"; // The region of your API-gateway // const SOCKET_HOST = "m6g3w6ttdh"; // Your API-gateway ID // const ENV = "prod"; // The stage of your target deployment // const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss! // Get a signed path const { path } = aws4.sign({ method: 'GET', host: WEBSOCKET_URL, // path: `/${ENV}?X-Amz-Security-Token=${encodeURIComponent( // credentials!.SessionToken! // )}`, path: `/${ENV}`, service: 'execute-api', region: AWS_REGION, signQuery: true, }, { accessKeyId: credentials.accessKeyId, secretAccessKey: credentials.secretAccessKey, sessionToken: credentials.sessionToken, }); const url2 = `wss://${WEBSOCKET_URL}${path}`; return url2; } function parseUrl(href) { const match = href.match(/^(wss?:)\/\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/); return (match && { href, protocol: match[1], host: match[2], hostname: match[3], port: match[4], pathname: match[5], search: match[6], hash: match[7], }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0V2ViU29ja2V0VXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29tbW9uL2dldFdlYlNvY2tldFVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV0RSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixpRUFBaUU7QUFFakUsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsR0FBVyxFQUNYLFdBQXlCO0lBRXpCLElBQUksU0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWdCLENBQUM7SUFFckIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWM7UUFFNUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLFFBQVEsR0FBRyxTQUFVLENBQUMsUUFBUyxDQUFDO1FBQ2hDLFNBQVMsR0FBRyxTQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sbUJBQW1CLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztRQUNwRCxXQUFXLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7SUFDbEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO0lBQ3hELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO0lBQy9FLE1BQU0sYUFBYSxHQUFHLEdBQUcsV0FBVyxnQkFBZ0IsVUFBVSxnQkFBZ0IsQ0FBQyxDQUFDLDBCQUEwQjtJQUMxRyxvRUFBb0U7SUFDcEUsMkRBQTJEO0lBQzNELDZEQUE2RDtJQUM3RCw2R0FBNkc7SUFFN0csb0JBQW9CO0lBQ3BCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUN4QjtRQUNFLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLGFBQWE7UUFDbkIsNERBQTREO1FBQzVELCtCQUErQjtRQUMvQixPQUFPO1FBQ1AsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2YsT0FBTyxFQUFFLGFBQWE7UUFDdEIsTUFBTSxFQUFFLFVBQVU7UUFDbEIsU0FBUyxFQUFFLElBQUk7S0FDaEIsRUFDRDtRQUNFLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztRQUNwQyxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWU7UUFDNUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO0tBQ3ZDLENBQ0YsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLFNBQVMsYUFBYSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzdDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDdEIseUVBQXlFLENBQzFFLENBQUM7SUFDRixPQUFPLENBQ0wsS0FBSyxJQUFJO1FBQ1AsSUFBSTtRQUNKLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2QsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZCxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNmLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tTm9kZVByb3ZpZGVyQ2hhaW4gfSBmcm9tICdAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyc7XG5pbXBvcnQgeyBDcmVkZW50aWFscyB9IGZyb20gJ0Bhd3Mtc2RrL3R5cGVzJztcbmltcG9ydCAqIGFzIGF3czQgZnJvbSAnYXdzNCc7XG5cbi8vIFwiXCJ3c3M6Ly9tNmczdzZ0dGRoLmV4ZWN1dGUtYXBpLmV1LXdlc3QtMS5hbWF6b25hd3MuY29tL3Byb2RcIjtcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmVkV2ViU29ja2V0VXJsKFxuICB1cmw6IHN0cmluZyxcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc1xuKSB7XG4gIGxldCBob3N0UGFydHM6IHN0cmluZ1tdO1xuICBsZXQgcGF0aG5hbWU6IHN0cmluZztcblxuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB3ZWJzb2NrZXQgVVJMYCk7XG4gIH1cblxuICB0cnkge1xuICAgIG5ldyBVUkwodXJsKTsgLy92YWxpZGF0ZSBVUkxcblxuICAgIGNvbnN0IHVybFBhcnNlZCA9IHBhcnNlVXJsKHVybCk7XG4gICAgcGF0aG5hbWUgPSB1cmxQYXJzZWQhLnBhdGhuYW1lITtcbiAgICBob3N0UGFydHMgPSB1cmxQYXJzZWQhLmhvc3Quc3BsaXQoJy4nKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBVUkwgJHt1cmx9YCk7XG4gIH1cblxuICBpZiAoIWNyZWRlbnRpYWxzKSB7XG4gICAgY29uc3QgY3JlZGVudGlhbHNQcm92aWRlciA9IGZyb21Ob2RlUHJvdmlkZXJDaGFpbigpO1xuICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgY3JlZGVudGlhbHNQcm92aWRlcigpO1xuICB9XG5cbiAgY29uc3QgQVdTX1JFR0lPTiA9IGhvc3RQYXJ0c1syXTsgLy8gVGhlIHJlZ2lvbiBvZiB5b3VyIEFQSS1nYXRld2F5XG4gIGNvbnN0IFNPQ0tFVF9IT1NUID0gaG9zdFBhcnRzWzBdOyAvLyBZb3VyIEFQSS1nYXRld2F5IElEXG4gIGNvbnN0IEVOViA9IHBhdGhuYW1lLnJlcGxhY2UoL15cXC8vLCAnJyk7IC8vIFRoZSBzdGFnZSBvZiB5b3VyIHRhcmdldCBkZXBsb3ltZW50XG4gIGNvbnN0IFdFQlNPQ0tFVF9VUkwgPSBgJHtTT0NLRVRfSE9TVH0uZXhlY3V0ZS1hcGkuJHtBV1NfUkVHSU9OfS5hbWF6b25hd3MuY29tYDsgLy8gRG9uJ3QgcHJlcGVuZCB3aXRoIHdzcyFcbiAgLy8gY29uc3QgQVdTX1JFR0lPTiA9IFwiZXUtd2VzdC0xXCI7IC8vIFRoZSByZWdpb24gb2YgeW91ciBBUEktZ2F0ZXdheVxuICAvLyBjb25zdCBTT0NLRVRfSE9TVCA9IFwibTZnM3c2dHRkaFwiOyAvLyBZb3VyIEFQSS1nYXRld2F5IElEXG4gIC8vIGNvbnN0IEVOViA9IFwicHJvZFwiOyAvLyBUaGUgc3RhZ2Ugb2YgeW91ciB0YXJnZXQgZGVwbG95bWVudFxuICAvLyBjb25zdCBXRUJTT0NLRVRfVVJMID0gYCR7U09DS0VUX0hPU1R9LmV4ZWN1dGUtYXBpLiR7QVdTX1JFR0lPTn0uYW1hem9uYXdzLmNvbWA7IC8vIERvbid0IHByZXBlbmQgd2l0aCB3c3MhXG5cbiAgLy8gR2V0IGEgc2lnbmVkIHBhdGhcbiAgY29uc3QgeyBwYXRoIH0gPSBhd3M0LnNpZ24oXG4gICAge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhvc3Q6IFdFQlNPQ0tFVF9VUkwsXG4gICAgICAvLyBwYXRoOiBgLyR7RU5WfT9YLUFtei1TZWN1cml0eS1Ub2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIC8vICAgY3JlZGVudGlhbHMhLlNlc3Npb25Ub2tlbiFcbiAgICAgIC8vICl9YCxcbiAgICAgIHBhdGg6IGAvJHtFTlZ9YCxcbiAgICAgIHNlcnZpY2U6ICdleGVjdXRlLWFwaScsXG4gICAgICByZWdpb246IEFXU19SRUdJT04sXG4gICAgICBzaWduUXVlcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBhY2Nlc3NLZXlJZDogY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQsXG4gICAgICBzZWNyZXRBY2Nlc3NLZXk6IGNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgIHNlc3Npb25Ub2tlbjogY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCB1cmwyID0gYHdzczovLyR7V0VCU09DS0VUX1VSTH0ke3BhdGh9YDtcbiAgcmV0dXJuIHVybDI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKGhyZWY6IHN0cmluZykge1xuICBjb25zdCBtYXRjaCA9IGhyZWYubWF0Y2goXG4gICAgL14od3NzPzopXFwvXFwvKChbXjovPyNdKikoPzo6KFswLTldKykpPykoWy9dezAsMX1bXj8jXSopKFxcP1teI10qfCkoIy4qfCkkL1xuICApO1xuICByZXR1cm4gKFxuICAgIG1hdGNoICYmIHtcbiAgICAgIGhyZWYsXG4gICAgICBwcm90b2NvbDogbWF0Y2hbMV0sXG4gICAgICBob3N0OiBtYXRjaFsyXSxcbiAgICAgIGhvc3RuYW1lOiBtYXRjaFszXSxcbiAgICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgICAgcGF0aG5hbWU6IG1hdGNoWzVdLFxuICAgICAgc2VhcmNoOiBtYXRjaFs2XSxcbiAgICAgIGhhc2g6IG1hdGNoWzddLFxuICAgIH1cbiAgKTtcbn1cbiJdfQ==