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
JavaScript
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==