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.

1 lines 3.38 kB
{"version":3,"file":"getWebSocketUrl.mjs","names":["hostParts: string[]","pathname: string"],"sources":["../../common/getWebSocketUrl.ts"],"sourcesContent":["import { fromNodeProviderChain } from '@aws-sdk/credential-providers';\nimport { Credentials } from '@aws-sdk/types';\nimport * as aws4 from 'aws4';\n\n// \"\"wss://m6g3w6ttdh.execute-api.eu-west-1.amazonaws.com/prod\";\"\n\nexport async function getSignedWebSocketUrl(\n url: string,\n credentials?: Credentials\n) {\n let hostParts: string[];\n let pathname: string;\n\n if (!url) {\n throw new Error(`Missing websocket URL`);\n }\n\n try {\n new URL(url); //validate URL\n\n const urlParsed = parseUrl(url);\n pathname = urlParsed!.pathname!;\n hostParts = urlParsed!.host.split('.');\n } catch {\n throw new Error(`Invalid websocket URL ${url}`);\n }\n\n if (!credentials) {\n const credentialsProvider = fromNodeProviderChain();\n credentials = await credentialsProvider();\n }\n\n const AWS_REGION = hostParts[2]; // The region of your API-gateway\n const SOCKET_HOST = hostParts[0]; // Your API-gateway ID\n const ENV = pathname.replace(/^\\//, ''); // The stage of your target deployment\n const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n // const AWS_REGION = \"eu-west-1\"; // The region of your API-gateway\n // const SOCKET_HOST = \"m6g3w6ttdh\"; // Your API-gateway ID\n // const ENV = \"prod\"; // The stage of your target deployment\n // const WEBSOCKET_URL = `${SOCKET_HOST}.execute-api.${AWS_REGION}.amazonaws.com`; // Don't prepend with wss!\n\n // Get a signed path\n const { path } = aws4.sign(\n {\n method: 'GET',\n host: WEBSOCKET_URL,\n // path: `/${ENV}?X-Amz-Security-Token=${encodeURIComponent(\n // credentials!.SessionToken!\n // )}`,\n path: `/${ENV}`,\n service: 'execute-api',\n region: AWS_REGION,\n signQuery: true,\n },\n {\n accessKeyId: credentials.accessKeyId,\n secretAccessKey: credentials.secretAccessKey,\n sessionToken: credentials.sessionToken,\n }\n );\n\n const url2 = `wss://${WEBSOCKET_URL}${path}`;\n return url2;\n}\n\nfunction parseUrl(href: string) {\n const match = href.match(\n /^(wss?:)\\/\\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\\?[^#]*|)(#.*|)$/\n );\n return (\n match && {\n href,\n protocol: match[1],\n host: match[2],\n hostname: match[3],\n port: match[4],\n pathname: match[5],\n search: match[6],\n hash: match[7],\n }\n );\n}\n"],"mappings":";;;;;AAMA,eAAsB,sBACpB,KACA,aACA;CACA,IAAIA;CACJ,IAAIC;AAEJ,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,KAAI;AACF,MAAI,IAAI,IAAI;EAEZ,MAAM,YAAY,SAAS,IAAI;AAC/B,aAAW,UAAW;AACtB,cAAY,UAAW,KAAK,MAAM,IAAI;SAChC;AACN,QAAM,IAAI,MAAM,yBAAyB,MAAM;;AAGjD,KAAI,CAAC,YAEH,eAAc,MADc,uBAAuB,EACV;CAG3C,MAAM,aAAa,UAAU;CAC7B,MAAM,cAAc,UAAU;CAC9B,MAAM,MAAM,SAAS,QAAQ,OAAO,GAAG;CACvC,MAAM,gBAAgB,GAAG,YAAY,eAAe,WAAW;CAO/D,MAAM,EAAE,SAAS,KAAK,KACpB;EACE,QAAQ;EACR,MAAM;EAIN,MAAM,IAAI;EACV,SAAS;EACT,QAAQ;EACR,WAAW;EACZ,EACD;EACE,aAAa,YAAY;EACzB,iBAAiB,YAAY;EAC7B,cAAc,YAAY;EAC3B,CACF;AAGD,QADa,SAAS,gBAAgB;;AAIxC,SAAS,SAAS,MAAc;CAC9B,MAAM,QAAQ,KAAK,MACjB,0EACD;AACD,QACE,SAAS;EACP;EACA,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM;EACb"}