@webiny/aws-helpers 0.0.0-unstable.2af142b57e → 0.0.0-unstable.3bc8100a7f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/cloudfrontFunctions/cookies.d.ts +1 -1
  2. package/cloudfrontFunctions/cookies.js +3 -1
  3. package/cloudfrontFunctions/cookies.js.map +1 -1
  4. package/cloudfrontFunctions/headers.d.ts +1 -1
  5. package/cloudfrontFunctions/headers.js +4 -3
  6. package/cloudfrontFunctions/headers.js.map +1 -1
  7. package/cloudfrontFunctions/index.js +3 -1
  8. package/cloudfrontFunctions/index.js.map +1 -1
  9. package/cloudfrontFunctions/querystring.d.ts +1 -1
  10. package/cloudfrontFunctions/querystring.js +4 -2
  11. package/cloudfrontFunctions/querystring.js.map +1 -1
  12. package/cloudfrontFunctions/redirect.d.ts +1 -1
  13. package/cloudfrontFunctions/redirect.js +3 -1
  14. package/cloudfrontFunctions/redirect.js.map +1 -1
  15. package/cloudfrontFunctions/types.d.ts +6 -6
  16. package/cloudfrontFunctions/types.js +3 -1
  17. package/cloudfrontFunctions/types.js.map +1 -1
  18. package/cloudfrontFunctions/utils.d.ts +1 -1
  19. package/cloudfrontFunctions/utils.js +3 -1
  20. package/cloudfrontFunctions/utils.js.map +1 -1
  21. package/index.js +3 -1
  22. package/index.js.map +1 -1
  23. package/lambdaEdge/cookies.d.ts +1 -1
  24. package/lambdaEdge/cookies.js +3 -1
  25. package/lambdaEdge/cookies.js.map +1 -1
  26. package/lambdaEdge/headers.d.ts +1 -1
  27. package/lambdaEdge/headers.js +4 -3
  28. package/lambdaEdge/headers.js.map +1 -1
  29. package/lambdaEdge/index.js +3 -1
  30. package/lambdaEdge/index.js.map +1 -1
  31. package/lambdaEdge/redirect.d.ts +1 -1
  32. package/lambdaEdge/redirect.js +3 -1
  33. package/lambdaEdge/redirect.js.map +1 -1
  34. package/lambdaEdge/request.d.ts +1 -1
  35. package/lambdaEdge/request.js +3 -1
  36. package/lambdaEdge/request.js.map +1 -1
  37. package/lambdaEdge/response.d.ts +1 -1
  38. package/lambdaEdge/response.js +3 -1
  39. package/lambdaEdge/response.js.map +1 -1
  40. package/lambdaEdge/types.d.ts +8 -8
  41. package/lambdaEdge/types.js +3 -1
  42. package/lambdaEdge/types.js.map +1 -1
  43. package/lambdaEdge/utils.d.ts +1 -1
  44. package/lambdaEdge/utils.js +3 -1
  45. package/lambdaEdge/utils.js.map +1 -1
  46. package/package.json +9 -5
  47. package/stagedRollouts/functions/adminOriginRequest.js +3 -1
  48. package/stagedRollouts/functions/adminOriginRequest.js.map +1 -1
  49. package/stagedRollouts/functions/configOriginRequest.js +3 -1
  50. package/stagedRollouts/functions/configOriginRequest.js.map +1 -1
  51. package/stagedRollouts/functions/originRequest.js +3 -1
  52. package/stagedRollouts/functions/originRequest.js.map +1 -1
  53. package/stagedRollouts/functions/viewerRequest.js +5 -4
  54. package/stagedRollouts/functions/viewerRequest.js.map +1 -1
  55. package/stagedRollouts/functions/viewerResponse.js +4 -3
  56. package/stagedRollouts/functions/viewerResponse.js.map +1 -1
  57. package/stagedRollouts/utils/common.js +3 -1
  58. package/stagedRollouts/utils/common.js.map +1 -1
  59. package/stagedRollouts/utils/headerBlacklist.js +3 -1
  60. package/stagedRollouts/utils/headerBlacklist.js.map +1 -1
  61. package/stagedRollouts/utils/loadOriginPage.d.ts +1 -1
  62. package/stagedRollouts/utils/loadOriginPage.js +5 -1
  63. package/stagedRollouts/utils/loadOriginPage.js.map +1 -1
  64. package/stagedRollouts/utils/loadTrafficSplittingConfig.d.ts +2 -2
  65. package/stagedRollouts/utils/loadTrafficSplittingConfig.js +3 -1
  66. package/stagedRollouts/utils/loadTrafficSplittingConfig.js.map +1 -1
  67. package/stagedRollouts/utils/loadVariantOrigin.d.ts +2 -2
  68. package/stagedRollouts/utils/loadVariantOrigin.js +3 -1
  69. package/stagedRollouts/utils/loadVariantOrigin.js.map +1 -1
  70. package/stagedRollouts/utils/log.js +3 -1
  71. package/stagedRollouts/utils/log.js.map +1 -1
@@ -1,4 +1,4 @@
1
- import { CloudFrontResponse } from "./types";
1
+ import type { CloudFrontResponse } from "./types";
2
2
  export interface CookieParams {
3
3
  name: string;
4
4
  value: string;
@@ -23,4 +23,6 @@ export function setResponseCookie(response, cookie) {
23
23
  attributes: attrs
24
24
  };
25
25
  }
26
- }
26
+ }
27
+
28
+ //# sourceMappingURL=cookies.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["setResponseCookie","response","cookie","cookies","current","name","attrs","maxAge","multivalue","push","value","attributes"],"sources":["cookies.ts"],"sourcesContent":["import { CloudFrontResponse } from \"./types\";\n\nexport interface CookieParams {\n name: string;\n value: string;\n maxAge?: number;\n}\n\n/** Sets cookie for the HTTP response */\nexport function setResponseCookie(response: CloudFrontResponse, cookie: CookieParams) {\n const cookies = response.cookies || (response.cookies = {});\n\n const current = cookies[cookie.name];\n let attrs = `Secure; Path=/;`;\n\n if (cookie.maxAge) {\n attrs += ` Max-Age=${cookie.maxAge};`;\n }\n\n if (current) {\n // If there is already the same cookie set in a response,\n // we add another entry using `multivalue`.\n // This is how you set multiple same cookies in CloudFront Functions.\n // It DOES make sense to set the same cookie multiple times,\n // for example when dealing with SameSite issue (https://web.dev/samesite-cookies-explained/)\n const multivalue = current.multivalue ?? (current.multivalue = []);\n multivalue.push({\n value: cookie.value,\n attributes: attrs\n });\n } else {\n cookies[cookie.name] = {\n value: cookie.value,\n attributes: attrs\n };\n }\n}\n"],"mappings":"AAQA;AACA,OAAO,SAASA,iBAAiB,CAACC,QAA4B,EAAEC,MAAoB,EAAE;EAClF,MAAMC,OAAO,GAAGF,QAAQ,CAACE,OAAO,KAAKF,QAAQ,CAACE,OAAO,GAAG,CAAC,CAAC,CAAC;EAE3D,MAAMC,OAAO,GAAGD,OAAO,CAACD,MAAM,CAACG,IAAI,CAAC;EACpC,IAAIC,KAAK,GAAI,iBAAgB;EAE7B,IAAIJ,MAAM,CAACK,MAAM,EAAE;IACfD,KAAK,IAAK,YAAWJ,MAAM,CAACK,MAAO,GAAE;EACzC;EAEA,IAAIH,OAAO,EAAE;IACT;IACA;IACA;IACA;IACA;IACA,MAAMI,UAAU,GAAGJ,OAAO,CAACI,UAAU,KAAKJ,OAAO,CAACI,UAAU,GAAG,EAAE,CAAC;IAClEA,UAAU,CAACC,IAAI,CAAC;MACZC,KAAK,EAAER,MAAM,CAACQ,KAAK;MACnBC,UAAU,EAAEL;IAChB,CAAC,CAAC;EACN,CAAC,MAAM;IACHH,OAAO,CAACD,MAAM,CAACG,IAAI,CAAC,GAAG;MACnBK,KAAK,EAAER,MAAM,CAACQ,KAAK;MACnBC,UAAU,EAAEL;IAChB,CAAC;EACL;AACJ"}
1
+ {"version":3,"names":["setResponseCookie","response","cookie","cookies","current","name","attrs","maxAge","multivalue","push","value","attributes"],"sources":["cookies.ts"],"sourcesContent":["import type { CloudFrontResponse } from \"./types\";\n\nexport interface CookieParams {\n name: string;\n value: string;\n maxAge?: number;\n}\n\n/** Sets cookie for the HTTP response */\nexport function setResponseCookie(response: CloudFrontResponse, cookie: CookieParams) {\n const cookies = response.cookies || (response.cookies = {});\n\n const current = cookies[cookie.name];\n let attrs = `Secure; Path=/;`;\n\n if (cookie.maxAge) {\n attrs += ` Max-Age=${cookie.maxAge};`;\n }\n\n if (current) {\n // If there is already the same cookie set in a response,\n // we add another entry using `multivalue`.\n // This is how you set multiple same cookies in CloudFront Functions.\n // It DOES make sense to set the same cookie multiple times,\n // for example when dealing with SameSite issue (https://web.dev/samesite-cookies-explained/)\n const multivalue = current.multivalue ?? (current.multivalue = []);\n multivalue.push({\n value: cookie.value,\n attributes: attrs\n });\n } else {\n cookies[cookie.name] = {\n value: cookie.value,\n attributes: attrs\n };\n }\n}\n"],"mappings":"AAQA;AACA,OAAO,SAASA,iBAAiBA,CAACC,QAA4B,EAAEC,MAAoB,EAAE;EAClF,MAAMC,OAAO,GAAGF,QAAQ,CAACE,OAAO,KAAKF,QAAQ,CAACE,OAAO,GAAG,CAAC,CAAC,CAAC;EAE3D,MAAMC,OAAO,GAAGD,OAAO,CAACD,MAAM,CAACG,IAAI,CAAC;EACpC,IAAIC,KAAK,GAAG,iBAAiB;EAE7B,IAAIJ,MAAM,CAACK,MAAM,EAAE;IACfD,KAAK,IAAI,YAAYJ,MAAM,CAACK,MAAM,GAAG;EACzC;EAEA,IAAIH,OAAO,EAAE;IACT;IACA;IACA;IACA;IACA;IACA,MAAMI,UAAU,GAAGJ,OAAO,CAACI,UAAU,KAAKJ,OAAO,CAACI,UAAU,GAAG,EAAE,CAAC;IAClEA,UAAU,CAACC,IAAI,CAAC;MACZC,KAAK,EAAER,MAAM,CAACQ,KAAK;MACnBC,UAAU,EAAEL;IAChB,CAAC,CAAC;EACN,CAAC,MAAM;IACHH,OAAO,CAACD,MAAM,CAACG,IAAI,CAAC,GAAG;MACnBK,KAAK,EAAER,MAAM,CAACQ,KAAK;MACnBC,UAAU,EAAEL;IAChB,CAAC;EACL;AACJ","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontHeaders, Header } from "./types";
1
+ import type { CloudFrontHeaders, Header } from "./types";
2
2
  export declare function getHeader(headers: CloudFrontHeaders, header: string): string | undefined;
3
3
  export declare function setHeader(headers: CloudFrontHeaders, header: Header): void;
4
4
  export declare function setHeaders(headers: CloudFrontHeaders, headersToSet: Header[]): void;
@@ -1,6 +1,5 @@
1
1
  export function getHeader(headers, header) {
2
- var _headers$header;
3
- return (_headers$header = headers[header]) === null || _headers$header === void 0 ? void 0 : _headers$header.value;
2
+ return headers[header]?.value;
4
3
  }
5
4
  export function setHeader(headers, header) {
6
5
  headers[header.key] = {
@@ -22,4 +21,6 @@ export function setNoCacheHeaders(headers) {
22
21
  headers["expires"] = {
23
22
  value: "0"
24
23
  };
25
- }
24
+ }
25
+
26
+ //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getHeader","headers","header","value","setHeader","key","setHeaders","headersToSet","i","length","setNoCacheHeaders"],"sources":["headers.ts"],"sourcesContent":["import { CloudFrontHeaders, Header } from \"./types\";\n\nexport function getHeader(headers: CloudFrontHeaders, header: string) {\n return headers[header]?.value;\n}\n\nexport function setHeader(headers: CloudFrontHeaders, header: Header) {\n headers[header.key] = {\n value: header.value\n };\n}\n\nexport function setHeaders(headers: CloudFrontHeaders, headersToSet: Header[]) {\n for (let i = 0; i < headersToSet.length; i++) {\n setHeader(headers, headersToSet[i]);\n }\n}\n\nexport function setNoCacheHeaders(headers: CloudFrontHeaders) {\n headers[\"cache-control\"] = { value: \"no-cache, no-store, must-revalidate\" };\n headers[\"pragma\"] = { value: \"no-cache\" };\n headers[\"expires\"] = { value: \"0\" };\n}\n"],"mappings":"AAEA,OAAO,SAASA,SAAS,CAACC,OAA0B,EAAEC,MAAc,EAAE;EAAA;EAClE,0BAAOD,OAAO,CAACC,MAAM,CAAC,oDAAf,gBAAiBC,KAAK;AACjC;AAEA,OAAO,SAASC,SAAS,CAACH,OAA0B,EAAEC,MAAc,EAAE;EAClED,OAAO,CAACC,MAAM,CAACG,GAAG,CAAC,GAAG;IAClBF,KAAK,EAAED,MAAM,CAACC;EAClB,CAAC;AACL;AAEA,OAAO,SAASG,UAAU,CAACL,OAA0B,EAAEM,YAAsB,EAAE;EAC3E,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,YAAY,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;IAC1CJ,SAAS,CAACH,OAAO,EAAEM,YAAY,CAACC,CAAC,CAAC,CAAC;EACvC;AACJ;AAEA,OAAO,SAASE,iBAAiB,CAACT,OAA0B,EAAE;EAC1DA,OAAO,CAAC,eAAe,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAsC,CAAC;EAC3EF,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAW,CAAC;EACzCF,OAAO,CAAC,SAAS,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAI,CAAC;AACvC"}
1
+ {"version":3,"names":["getHeader","headers","header","value","setHeader","key","setHeaders","headersToSet","i","length","setNoCacheHeaders"],"sources":["headers.ts"],"sourcesContent":["import type { CloudFrontHeaders, Header } from \"./types\";\n\nexport function getHeader(headers: CloudFrontHeaders, header: string) {\n return headers[header]?.value;\n}\n\nexport function setHeader(headers: CloudFrontHeaders, header: Header) {\n headers[header.key] = {\n value: header.value\n };\n}\n\nexport function setHeaders(headers: CloudFrontHeaders, headersToSet: Header[]) {\n for (let i = 0; i < headersToSet.length; i++) {\n setHeader(headers, headersToSet[i]);\n }\n}\n\nexport function setNoCacheHeaders(headers: CloudFrontHeaders) {\n headers[\"cache-control\"] = { value: \"no-cache, no-store, must-revalidate\" };\n headers[\"pragma\"] = { value: \"no-cache\" };\n headers[\"expires\"] = { value: \"0\" };\n}\n"],"mappings":"AAEA,OAAO,SAASA,SAASA,CAACC,OAA0B,EAAEC,MAAc,EAAE;EAClE,OAAOD,OAAO,CAACC,MAAM,CAAC,EAAEC,KAAK;AACjC;AAEA,OAAO,SAASC,SAASA,CAACH,OAA0B,EAAEC,MAAc,EAAE;EAClED,OAAO,CAACC,MAAM,CAACG,GAAG,CAAC,GAAG;IAClBF,KAAK,EAAED,MAAM,CAACC;EAClB,CAAC;AACL;AAEA,OAAO,SAASG,UAAUA,CAACL,OAA0B,EAAEM,YAAsB,EAAE;EAC3E,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,YAAY,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;IAC1CJ,SAAS,CAACH,OAAO,EAAEM,YAAY,CAACC,CAAC,CAAC,CAAC;EACvC;AACJ;AAEA,OAAO,SAASE,iBAAiBA,CAACT,OAA0B,EAAE;EAC1DA,OAAO,CAAC,eAAe,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAsC,CAAC;EAC3EF,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAW,CAAC;EACzCF,OAAO,CAAC,SAAS,CAAC,GAAG;IAAEE,KAAK,EAAE;EAAI,CAAC;AACvC","ignoreList":[]}
@@ -3,4 +3,6 @@ export * from "./headers";
3
3
  export * from "./querystring";
4
4
  export * from "./redirect";
5
5
  export * from "./types";
6
- export * from "./utils";
6
+ export * from "./utils";
7
+
8
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./cookies\";\nexport * from \"./headers\";\nexport * from \"./querystring\";\nexport * from \"./redirect\";\nexport * from \"./types\";\nexport * from \"./utils\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./cookies\";\nexport * from \"./headers\";\nexport * from \"./querystring\";\nexport * from \"./redirect\";\nexport * from \"./types\";\nexport * from \"./utils\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import { CloudFrontQuery } from "./types";
1
+ import type { CloudFrontQuery } from "./types";
2
2
  export declare function stringifyQuery(query: CloudFrontQuery): string;
@@ -5,7 +5,7 @@ export function stringifyQuery(query) {
5
5
  if (!value) {
6
6
  continue;
7
7
  }
8
- qs = appendQueryString(qs, key, value === null || value === void 0 ? void 0 : value.value);
8
+ qs = appendQueryString(qs, key, value?.value);
9
9
  if (value.multivalue) {
10
10
  for (let i = 0; i < value.multivalue.length; i++) {
11
11
  qs = appendQueryString(qs, key, value.multivalue[i].value);
@@ -26,4 +26,6 @@ function appendQueryString(qs, key, value) {
26
26
  }
27
27
  qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
28
28
  return qs;
29
- }
29
+ }
30
+
31
+ //# sourceMappingURL=querystring.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["stringifyQuery","query","qs","key","Object","keys","value","appendQueryString","multivalue","i","length","encodeURIComponent"],"sources":["querystring.ts"],"sourcesContent":["import { CloudFrontQuery } from \"./types\";\n\nexport function stringifyQuery(query: CloudFrontQuery) {\n let qs = \"\";\n\n for (const key of Object.keys(query)) {\n const value = query[key];\n if (!value) {\n continue;\n }\n\n qs = appendQueryString(qs, key, value?.value);\n\n if (value.multivalue) {\n for (let i = 0; i < value.multivalue.length; i++) {\n qs = appendQueryString(qs, key, value.multivalue[i].value);\n }\n }\n }\n\n if (qs) {\n qs = \"?\" + qs;\n }\n\n return qs;\n}\n\nfunction appendQueryString(qs: string, key: string, value: string | null) {\n if (value === null) {\n return qs;\n }\n\n if (qs.length) {\n qs += \"&\";\n }\n\n qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n\n return qs;\n}\n"],"mappings":"AAEA,OAAO,SAASA,cAAc,CAACC,KAAsB,EAAE;EACnD,IAAIC,EAAE,GAAG,EAAE;EAEX,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC,EAAE;IAClC,MAAMK,KAAK,GAAGL,KAAK,CAACE,GAAG,CAAC;IACxB,IAAI,CAACG,KAAK,EAAE;MACR;IACJ;IAEAJ,EAAE,GAAGK,iBAAiB,CAACL,EAAE,EAAEC,GAAG,EAAEG,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEA,KAAK,CAAC;IAE7C,IAAIA,KAAK,CAACE,UAAU,EAAE;MAClB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,CAACE,UAAU,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;QAC9CP,EAAE,GAAGK,iBAAiB,CAACL,EAAE,EAAEC,GAAG,EAAEG,KAAK,CAACE,UAAU,CAACC,CAAC,CAAC,CAACH,KAAK,CAAC;MAC9D;IACJ;EACJ;EAEA,IAAIJ,EAAE,EAAE;IACJA,EAAE,GAAG,GAAG,GAAGA,EAAE;EACjB;EAEA,OAAOA,EAAE;AACb;AAEA,SAASK,iBAAiB,CAACL,EAAU,EAAEC,GAAW,EAAEG,KAAoB,EAAE;EACtE,IAAIA,KAAK,KAAK,IAAI,EAAE;IAChB,OAAOJ,EAAE;EACb;EAEA,IAAIA,EAAE,CAACQ,MAAM,EAAE;IACXR,EAAE,IAAI,GAAG;EACb;EAEAA,EAAE,IAAK,GAAES,kBAAkB,CAACR,GAAG,CAAE,IAAGQ,kBAAkB,CAACL,KAAK,CAAE,EAAC;EAE/D,OAAOJ,EAAE;AACb"}
1
+ {"version":3,"names":["stringifyQuery","query","qs","key","Object","keys","value","appendQueryString","multivalue","i","length","encodeURIComponent"],"sources":["querystring.ts"],"sourcesContent":["import type { CloudFrontQuery } from \"./types\";\n\nexport function stringifyQuery(query: CloudFrontQuery) {\n let qs = \"\";\n\n for (const key of Object.keys(query)) {\n const value = query[key];\n if (!value) {\n continue;\n }\n\n qs = appendQueryString(qs, key, value?.value);\n\n if (value.multivalue) {\n for (let i = 0; i < value.multivalue.length; i++) {\n qs = appendQueryString(qs, key, value.multivalue[i].value);\n }\n }\n }\n\n if (qs) {\n qs = \"?\" + qs;\n }\n\n return qs;\n}\n\nfunction appendQueryString(qs: string, key: string, value: string | null) {\n if (value === null) {\n return qs;\n }\n\n if (qs.length) {\n qs += \"&\";\n }\n\n qs += `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n\n return qs;\n}\n"],"mappings":"AAEA,OAAO,SAASA,cAAcA,CAACC,KAAsB,EAAE;EACnD,IAAIC,EAAE,GAAG,EAAE;EAEX,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC,EAAE;IAClC,MAAMK,KAAK,GAAGL,KAAK,CAACE,GAAG,CAAC;IACxB,IAAI,CAACG,KAAK,EAAE;MACR;IACJ;IAEAJ,EAAE,GAAGK,iBAAiB,CAACL,EAAE,EAAEC,GAAG,EAAEG,KAAK,EAAEA,KAAK,CAAC;IAE7C,IAAIA,KAAK,CAACE,UAAU,EAAE;MAClB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,KAAK,CAACE,UAAU,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;QAC9CP,EAAE,GAAGK,iBAAiB,CAACL,EAAE,EAAEC,GAAG,EAAEG,KAAK,CAACE,UAAU,CAACC,CAAC,CAAC,CAACH,KAAK,CAAC;MAC9D;IACJ;EACJ;EAEA,IAAIJ,EAAE,EAAE;IACJA,EAAE,GAAG,GAAG,GAAGA,EAAE;EACjB;EAEA,OAAOA,EAAE;AACb;AAEA,SAASK,iBAAiBA,CAACL,EAAU,EAAEC,GAAW,EAAEG,KAAoB,EAAE;EACtE,IAAIA,KAAK,KAAK,IAAI,EAAE;IAChB,OAAOJ,EAAE;EACb;EAEA,IAAIA,EAAE,CAACQ,MAAM,EAAE;IACXR,EAAE,IAAI,GAAG;EACb;EAEAA,EAAE,IAAI,GAAGS,kBAAkB,CAACR,GAAG,CAAC,IAAIQ,kBAAkB,CAACL,KAAK,CAAC,EAAE;EAE/D,OAAOJ,EAAE;AACb","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontQuery, CloudFrontResponse } from "./types";
1
+ import type { CloudFrontQuery, CloudFrontResponse } from "./types";
2
2
  interface RedirectParams {
3
3
  url: string;
4
4
  query?: CloudFrontQuery;
@@ -17,4 +17,6 @@ export function redirectResponse(params) {
17
17
  setNoCacheHeaders(response.headers);
18
18
  }
19
19
  return response;
20
- }
20
+ }
21
+
22
+ //# sourceMappingURL=redirect.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["setNoCacheHeaders","stringifyQuery","redirectResponse","params","query","permanent","status","response","statusCode","statusDescription","headers","location","value","url"],"sources":["redirect.ts"],"sourcesContent":["import { CloudFrontQuery, CloudFrontResponse } from \"./types\";\nimport { setNoCacheHeaders } from \"./headers\";\nimport { stringifyQuery } from \"./querystring\";\n\ninterface RedirectParams {\n url: string;\n query?: CloudFrontQuery;\n status?: number;\n}\n\nexport function redirectResponse(params: RedirectParams) {\n const query = params.query ? stringifyQuery(params.query) : \"\";\n const permanent = params.status === 301;\n\n const response: CloudFrontResponse = {\n statusCode: params.status || 302,\n statusDescription: params.status === 301 ? \"Moved permanently\" : \"Found\",\n headers: {\n location: { value: params.url + query }\n }\n };\n\n if (!permanent) {\n // For temporary redirects make sure they won't be cached.\n setNoCacheHeaders(response.headers);\n }\n\n return response;\n}\n"],"mappings":"AACA,SAASA,iBAAiB;AAC1B,SAASC,cAAc;AAQvB,OAAO,SAASC,gBAAgB,CAACC,MAAsB,EAAE;EACrD,MAAMC,KAAK,GAAGD,MAAM,CAACC,KAAK,GAAGH,cAAc,CAACE,MAAM,CAACC,KAAK,CAAC,GAAG,EAAE;EAC9D,MAAMC,SAAS,GAAGF,MAAM,CAACG,MAAM,KAAK,GAAG;EAEvC,MAAMC,QAA4B,GAAG;IACjCC,UAAU,EAAEL,MAAM,CAACG,MAAM,IAAI,GAAG;IAChCG,iBAAiB,EAAEN,MAAM,CAACG,MAAM,KAAK,GAAG,GAAG,mBAAmB,GAAG,OAAO;IACxEI,OAAO,EAAE;MACLC,QAAQ,EAAE;QAAEC,KAAK,EAAET,MAAM,CAACU,GAAG,GAAGT;MAAM;IAC1C;EACJ,CAAC;EAED,IAAI,CAACC,SAAS,EAAE;IACZ;IACAL,iBAAiB,CAACO,QAAQ,CAACG,OAAO,CAAC;EACvC;EAEA,OAAOH,QAAQ;AACnB"}
1
+ {"version":3,"names":["setNoCacheHeaders","stringifyQuery","redirectResponse","params","query","permanent","status","response","statusCode","statusDescription","headers","location","value","url"],"sources":["redirect.ts"],"sourcesContent":["import type { CloudFrontQuery, CloudFrontResponse } from \"./types\";\nimport { setNoCacheHeaders } from \"./headers\";\nimport { stringifyQuery } from \"./querystring\";\n\ninterface RedirectParams {\n url: string;\n query?: CloudFrontQuery;\n status?: number;\n}\n\nexport function redirectResponse(params: RedirectParams) {\n const query = params.query ? stringifyQuery(params.query) : \"\";\n const permanent = params.status === 301;\n\n const response: CloudFrontResponse = {\n statusCode: params.status || 302,\n statusDescription: params.status === 301 ? \"Moved permanently\" : \"Found\",\n headers: {\n location: { value: params.url + query }\n }\n };\n\n if (!permanent) {\n // For temporary redirects make sure they won't be cached.\n setNoCacheHeaders(response.headers);\n }\n\n return response;\n}\n"],"mappings":"AACA,SAASA,iBAAiB;AAC1B,SAASC,cAAc;AAQvB,OAAO,SAASC,gBAAgBA,CAACC,MAAsB,EAAE;EACrD,MAAMC,KAAK,GAAGD,MAAM,CAACC,KAAK,GAAGH,cAAc,CAACE,MAAM,CAACC,KAAK,CAAC,GAAG,EAAE;EAC9D,MAAMC,SAAS,GAAGF,MAAM,CAACG,MAAM,KAAK,GAAG;EAEvC,MAAMC,QAA4B,GAAG;IACjCC,UAAU,EAAEL,MAAM,CAACG,MAAM,IAAI,GAAG;IAChCG,iBAAiB,EAAEN,MAAM,CAACG,MAAM,KAAK,GAAG,GAAG,mBAAmB,GAAG,OAAO;IACxEI,OAAO,EAAE;MACLC,QAAQ,EAAE;QAAEC,KAAK,EAAET,MAAM,CAACU,GAAG,GAAGT;MAAM;IAC1C;EACJ,CAAC;EAED,IAAI,CAACC,SAAS,EAAE;IACZ;IACAL,iBAAiB,CAACO,QAAQ,CAACG,OAAO,CAAC;EACvC;EAEA,OAAOH,QAAQ;AACnB","ignoreList":[]}
@@ -11,15 +11,15 @@ export interface ResponseCookie extends SingleValue {
11
11
  * In principle you may have multiple same headers and cookies in one request or response.
12
12
  * This is a wrapper interface for simpler use.
13
13
  */
14
- export declare type MultiValue<T> = T & {
14
+ export type MultiValue<T> = T & {
15
15
  /** Additional values for the same item (for example multiple values for the same cookie.) */
16
16
  multivalue?: T[];
17
17
  };
18
- export declare type MultiValueDictionary<T> = Record<string, MultiValue<T> | undefined>;
19
- export declare type CloudFrontHeaders = MultiValueDictionary<SingleValue>;
20
- export declare type CloudFrontRequestCookies = MultiValueDictionary<SingleValue>;
21
- export declare type CloudFrontResponseCookies = MultiValueDictionary<ResponseCookie>;
22
- export declare type CloudFrontQuery = MultiValueDictionary<SingleValue>;
18
+ export type MultiValueDictionary<T> = Record<string, MultiValue<T> | undefined>;
19
+ export type CloudFrontHeaders = MultiValueDictionary<SingleValue>;
20
+ export type CloudFrontRequestCookies = MultiValueDictionary<SingleValue>;
21
+ export type CloudFrontResponseCookies = MultiValueDictionary<ResponseCookie>;
22
+ export type CloudFrontQuery = MultiValueDictionary<SingleValue>;
23
23
  /**
24
24
  * Interface type for request in CloudFront Functions
25
25
  * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html
@@ -1 +1,3 @@
1
- export {};
1
+ export {};
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// These are types for CloudFront Functions.\n// They differ from Lambda@Edge types.\n// See also: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n\nexport interface SingleValue {\n value: string;\n}\n\nexport interface Header extends SingleValue {\n key: string;\n}\n\nexport interface ResponseCookie extends SingleValue {\n attributes?: string;\n}\n\n/**\n * In principle you may have multiple same headers and cookies in one request or response.\n * This is a wrapper interface for simpler use.\n */\nexport type MultiValue<T> = T & {\n /** Additional values for the same item (for example multiple values for the same cookie.) */\n multivalue?: T[];\n};\n\nexport type MultiValueDictionary<T> = Record<string, MultiValue<T> | undefined>;\n\nexport type CloudFrontHeaders = MultiValueDictionary<SingleValue>;\nexport type CloudFrontRequestCookies = MultiValueDictionary<SingleValue>;\nexport type CloudFrontResponseCookies = MultiValueDictionary<ResponseCookie>;\nexport type CloudFrontQuery = MultiValueDictionary<SingleValue>;\n\n/**\n * Interface type for request in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontRequest {\n method: string;\n uri: string;\n querystring?: CloudFrontQuery;\n headers: CloudFrontHeaders;\n cookies?: CloudFrontRequestCookies;\n}\n\n/**\n * Interface type for response in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontResponse {\n statusCode: number;\n statusDescription?: string;\n headers: CloudFrontHeaders;\n cookies?: CloudFrontResponseCookies;\n}\n\n/**\n * Interface type for request event in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontRequestEvent {\n version: string;\n context: {\n eventType: \"viewer-request\";\n };\n viewer: {\n ip: string;\n };\n request: CloudFrontRequest;\n}\n\n/**\n * Interface type for response event in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontResponseEvent {\n version: string;\n context: {\n eventType: \"viewer-response\";\n };\n viewer: {\n ip: string;\n };\n response: CloudFrontResponse;\n request: CloudFrontRequest;\n}\n\nexport interface CloudFrontRequestHandler {\n (event: CloudFrontRequestEvent): CloudFrontRequest | CloudFrontResponse;\n}\n\nexport interface CloudFrontResponseHandler {\n (event: CloudFrontResponseEvent): CloudFrontResponse;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// These are types for CloudFront Functions.\n// They differ from Lambda@Edge types.\n// See also: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n\nexport interface SingleValue {\n value: string;\n}\n\nexport interface Header extends SingleValue {\n key: string;\n}\n\nexport interface ResponseCookie extends SingleValue {\n attributes?: string;\n}\n\n/**\n * In principle you may have multiple same headers and cookies in one request or response.\n * This is a wrapper interface for simpler use.\n */\nexport type MultiValue<T> = T & {\n /** Additional values for the same item (for example multiple values for the same cookie.) */\n multivalue?: T[];\n};\n\nexport type MultiValueDictionary<T> = Record<string, MultiValue<T> | undefined>;\n\nexport type CloudFrontHeaders = MultiValueDictionary<SingleValue>;\nexport type CloudFrontRequestCookies = MultiValueDictionary<SingleValue>;\nexport type CloudFrontResponseCookies = MultiValueDictionary<ResponseCookie>;\nexport type CloudFrontQuery = MultiValueDictionary<SingleValue>;\n\n/**\n * Interface type for request in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontRequest {\n method: string;\n uri: string;\n querystring?: CloudFrontQuery;\n headers: CloudFrontHeaders;\n cookies?: CloudFrontRequestCookies;\n}\n\n/**\n * Interface type for response in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontResponse {\n statusCode: number;\n statusDescription?: string;\n headers: CloudFrontHeaders;\n cookies?: CloudFrontResponseCookies;\n}\n\n/**\n * Interface type for request event in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontRequestEvent {\n version: string;\n context: {\n eventType: \"viewer-request\";\n };\n viewer: {\n ip: string;\n };\n request: CloudFrontRequest;\n}\n\n/**\n * Interface type for response event in CloudFront Functions\n * see: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html\n */\nexport interface CloudFrontResponseEvent {\n version: string;\n context: {\n eventType: \"viewer-response\";\n };\n viewer: {\n ip: string;\n };\n response: CloudFrontResponse;\n request: CloudFrontRequest;\n}\n\nexport interface CloudFrontRequestHandler {\n (event: CloudFrontRequestEvent): CloudFrontRequest | CloudFrontResponse;\n}\n\nexport interface CloudFrontResponseHandler {\n (event: CloudFrontResponseEvent): CloudFrontResponse;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontRequestHandler, CloudFrontResponseHandler } from "./types";
1
+ import type { CloudFrontRequestHandler, CloudFrontResponseHandler } from "./types";
2
2
  /**
3
3
  * Helper function to easier define CloudFront Function request handler.
4
4
  *
@@ -18,4 +18,6 @@ export function defineCloudfrontFunctionRequestHandler(handler) {
18
18
  **/
19
19
  export function defineCloudfrontFunctionResponseHandler(handler) {
20
20
  global.handler = handler;
21
- }
21
+ }
22
+
23
+ //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineCloudfrontFunctionRequestHandler","handler","global","defineCloudfrontFunctionResponseHandler"],"sources":["utils.ts"],"sourcesContent":["import { CloudFrontRequestHandler, CloudFrontResponseHandler } from \"./types\";\n\ndeclare const global: typeof globalThis & {\n // CloudFront Functions use global handler value, not exports.\n handler: Function;\n};\n\n/**\n * Helper function to easier define CloudFront Function request handler.\n *\n * Lambdas use exports, but CloudFront Functions use a global `handler` variable.\n * This way you only have to run the function within your handler script,\n * and you are provided with working handler and full typing.\n **/\nexport function defineCloudfrontFunctionRequestHandler(handler: CloudFrontRequestHandler) {\n global.handler = handler;\n}\n\n/**\n * Helper function to easier define CloudFront Function response handler.\n *\n * Lambdas use exports, but CloudFront Functions use a global `handler` variable.\n * This way you only have to run the function within your handler script,\n * and you are provided with working handler and full typing.\n **/\nexport function defineCloudfrontFunctionResponseHandler(handler: CloudFrontResponseHandler) {\n global.handler = handler;\n}\n"],"mappings":"AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,sCAAsC,CAACC,OAAiC,EAAE;EACtFC,MAAM,CAACD,OAAO,GAAGA,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,uCAAuC,CAACF,OAAkC,EAAE;EACxFC,MAAM,CAACD,OAAO,GAAGA,OAAO;AAC5B"}
1
+ {"version":3,"names":["defineCloudfrontFunctionRequestHandler","handler","global","defineCloudfrontFunctionResponseHandler"],"sources":["utils.ts"],"sourcesContent":["import type { CloudFrontRequestHandler, CloudFrontResponseHandler } from \"./types\";\n\ndeclare const global: typeof globalThis & {\n // CloudFront Functions use global handler value, not exports.\n /**\n * We will leave the Function for now.\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n handler: Function;\n};\n\n/**\n * Helper function to easier define CloudFront Function request handler.\n *\n * Lambdas use exports, but CloudFront Functions use a global `handler` variable.\n * This way you only have to run the function within your handler script,\n * and you are provided with working handler and full typing.\n **/\nexport function defineCloudfrontFunctionRequestHandler(handler: CloudFrontRequestHandler) {\n global.handler = handler;\n}\n\n/**\n * Helper function to easier define CloudFront Function response handler.\n *\n * Lambdas use exports, but CloudFront Functions use a global `handler` variable.\n * This way you only have to run the function within your handler script,\n * and you are provided with working handler and full typing.\n **/\nexport function defineCloudfrontFunctionResponseHandler(handler: CloudFrontResponseHandler) {\n global.handler = handler;\n}\n"],"mappings":"AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,sCAAsCA,CAACC,OAAiC,EAAE;EACtFC,MAAM,CAACD,OAAO,GAAGA,OAAO;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,uCAAuCA,CAACF,OAAkC,EAAE;EACxFC,MAAM,CAACD,OAAO,GAAGA,OAAO;AAC5B","ignoreList":[]}
package/index.js CHANGED
@@ -1 +1,3 @@
1
- export * from "./lambdaEdge";
1
+ export * from "./lambdaEdge";
2
+
3
+ //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./lambdaEdge\";\n"],"mappings":"AAAA"}
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./lambdaEdge\";\n"],"mappings":"AAAA","ignoreList":[]}
@@ -1,3 +1,3 @@
1
- import { CloudFrontRequest, CloudFrontResponse } from "./types";
1
+ import type { CloudFrontRequest, CloudFrontResponse } from "./types";
2
2
  export declare function getRequestCookies(request: CloudFrontRequest): Record<string, string | undefined>;
3
3
  export declare function setResponseCookie(response: CloudFrontResponse, cookie: string): void;
@@ -18,4 +18,6 @@ export function setResponseCookie(response, cookie) {
18
18
  cookies.push({
19
19
  value: cookie
20
20
  });
21
- }
21
+ }
22
+
23
+ //# sourceMappingURL=cookies.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getHeader","getRequestCookies","request","header","headers","cookies","cookiesArray","decodeURIComponent","split","cookie","name","value","trim","setResponseCookie","response","push"],"sources":["cookies.ts"],"sourcesContent":["import { getHeader } from \"./headers\";\nimport { CloudFrontRequest, CloudFrontResponse } from \"./types\";\n\nexport function getRequestCookies(request: CloudFrontRequest) {\n const header = getHeader(request.headers, \"cookie\");\n const cookies: Record<string, string | undefined> = {};\n\n if (!header) {\n return cookies;\n }\n\n const cookiesArray = decodeURIComponent(header).split(\";\");\n\n for (const cookie of cookiesArray) {\n const [name, value] = cookie.trim().split(\"=\");\n cookies[name] = value;\n }\n\n return cookies;\n}\n\nexport function setResponseCookie(response: CloudFrontResponse, cookie: string) {\n const headers = response.headers;\n const cookies = headers[\"set-cookie\"] || (headers[\"set-cookie\"] = []);\n\n cookies.push({\n value: cookie\n });\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAGlB,OAAO,SAASC,iBAAiB,CAACC,OAA0B,EAAE;EAC1D,MAAMC,MAAM,GAAGH,SAAS,CAACE,OAAO,CAACE,OAAO,EAAE,QAAQ,CAAC;EACnD,MAAMC,OAA2C,GAAG,CAAC,CAAC;EAEtD,IAAI,CAACF,MAAM,EAAE;IACT,OAAOE,OAAO;EAClB;EAEA,MAAMC,YAAY,GAAGC,kBAAkB,CAACJ,MAAM,CAAC,CAACK,KAAK,CAAC,GAAG,CAAC;EAE1D,KAAK,MAAMC,MAAM,IAAIH,YAAY,EAAE;IAC/B,MAAM,CAACI,IAAI,EAAEC,KAAK,CAAC,GAAGF,MAAM,CAACG,IAAI,EAAE,CAACJ,KAAK,CAAC,GAAG,CAAC;IAC9CH,OAAO,CAACK,IAAI,CAAC,GAAGC,KAAK;EACzB;EAEA,OAAON,OAAO;AAClB;AAEA,OAAO,SAASQ,iBAAiB,CAACC,QAA4B,EAAEL,MAAc,EAAE;EAC5E,MAAML,OAAO,GAAGU,QAAQ,CAACV,OAAO;EAChC,MAAMC,OAAO,GAAGD,OAAO,CAAC,YAAY,CAAC,KAAKA,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;EAErEC,OAAO,CAACU,IAAI,CAAC;IACTJ,KAAK,EAAEF;EACX,CAAC,CAAC;AACN"}
1
+ {"version":3,"names":["getHeader","getRequestCookies","request","header","headers","cookies","cookiesArray","decodeURIComponent","split","cookie","name","value","trim","setResponseCookie","response","push"],"sources":["cookies.ts"],"sourcesContent":["import { getHeader } from \"./headers\";\nimport type { CloudFrontRequest, CloudFrontResponse } from \"./types\";\n\nexport function getRequestCookies(request: CloudFrontRequest) {\n const header = getHeader(request.headers, \"cookie\");\n const cookies: Record<string, string | undefined> = {};\n\n if (!header) {\n return cookies;\n }\n\n const cookiesArray = decodeURIComponent(header).split(\";\");\n\n for (const cookie of cookiesArray) {\n const [name, value] = cookie.trim().split(\"=\");\n cookies[name] = value;\n }\n\n return cookies;\n}\n\nexport function setResponseCookie(response: CloudFrontResponse, cookie: string) {\n const headers = response.headers;\n const cookies = headers[\"set-cookie\"] || (headers[\"set-cookie\"] = []);\n\n cookies.push({\n value: cookie\n });\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAGlB,OAAO,SAASC,iBAAiBA,CAACC,OAA0B,EAAE;EAC1D,MAAMC,MAAM,GAAGH,SAAS,CAACE,OAAO,CAACE,OAAO,EAAE,QAAQ,CAAC;EACnD,MAAMC,OAA2C,GAAG,CAAC,CAAC;EAEtD,IAAI,CAACF,MAAM,EAAE;IACT,OAAOE,OAAO;EAClB;EAEA,MAAMC,YAAY,GAAGC,kBAAkB,CAACJ,MAAM,CAAC,CAACK,KAAK,CAAC,GAAG,CAAC;EAE1D,KAAK,MAAMC,MAAM,IAAIH,YAAY,EAAE;IAC/B,MAAM,CAACI,IAAI,EAAEC,KAAK,CAAC,GAAGF,MAAM,CAACG,IAAI,CAAC,CAAC,CAACJ,KAAK,CAAC,GAAG,CAAC;IAC9CH,OAAO,CAACK,IAAI,CAAC,GAAGC,KAAK;EACzB;EAEA,OAAON,OAAO;AAClB;AAEA,OAAO,SAASQ,iBAAiBA,CAACC,QAA4B,EAAEL,MAAc,EAAE;EAC5E,MAAML,OAAO,GAAGU,QAAQ,CAACV,OAAO;EAChC,MAAMC,OAAO,GAAGD,OAAO,CAAC,YAAY,CAAC,KAAKA,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;EAErEC,OAAO,CAACU,IAAI,CAAC;IACTJ,KAAK,EAAEF;EACX,CAAC,CAAC;AACN","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontHeaders } from "./types";
1
+ import type { CloudFrontHeaders } from "./types";
2
2
  export declare function setHeader(headers: CloudFrontHeaders, header: {
3
3
  key: string;
4
4
  value: string;
@@ -2,6 +2,7 @@ export function setHeader(headers, header) {
2
2
  headers[header.key] = [header];
3
3
  }
4
4
  export function getHeader(headers, header) {
5
- var _headers$header;
6
- return headers === null || headers === void 0 ? void 0 : (_headers$header = headers[header]) === null || _headers$header === void 0 ? void 0 : _headers$header[0].value;
7
- }
5
+ return headers?.[header]?.[0].value;
6
+ }
7
+
8
+ //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["setHeader","headers","header","key","getHeader","value"],"sources":["headers.ts"],"sourcesContent":["import { CloudFrontHeaders } from \"./types\";\n\nexport function setHeader(headers: CloudFrontHeaders, header: { key: string; value: string }) {\n headers[header.key] = [header];\n}\n\nexport function getHeader(headers: CloudFrontHeaders | undefined, header: string) {\n return headers?.[header]?.[0].value;\n}\n"],"mappings":"AAEA,OAAO,SAASA,SAAS,CAACC,OAA0B,EAAEC,MAAsC,EAAE;EAC1FD,OAAO,CAACC,MAAM,CAACC,GAAG,CAAC,GAAG,CAACD,MAAM,CAAC;AAClC;AAEA,OAAO,SAASE,SAAS,CAACH,OAAsC,EAAEC,MAAc,EAAE;EAAA;EAC9E,OAAOD,OAAO,aAAPA,OAAO,0CAAPA,OAAO,CAAGC,MAAM,CAAC,oDAAjB,gBAAoB,CAAC,CAAC,CAACG,KAAK;AACvC"}
1
+ {"version":3,"names":["setHeader","headers","header","key","getHeader","value"],"sources":["headers.ts"],"sourcesContent":["import type { CloudFrontHeaders } from \"./types\";\n\nexport function setHeader(headers: CloudFrontHeaders, header: { key: string; value: string }) {\n headers[header.key] = [header];\n}\n\nexport function getHeader(headers: CloudFrontHeaders | undefined, header: string) {\n return headers?.[header]?.[0].value;\n}\n"],"mappings":"AAEA,OAAO,SAASA,SAASA,CAACC,OAA0B,EAAEC,MAAsC,EAAE;EAC1FD,OAAO,CAACC,MAAM,CAACC,GAAG,CAAC,GAAG,CAACD,MAAM,CAAC;AAClC;AAEA,OAAO,SAASE,SAASA,CAACH,OAAsC,EAAEC,MAAc,EAAE;EAC9E,OAAOD,OAAO,GAAGC,MAAM,CAAC,GAAG,CAAC,CAAC,CAACG,KAAK;AACvC","ignoreList":[]}
@@ -4,4 +4,6 @@ export * from "./redirect";
4
4
  export * from "./request";
5
5
  export * from "./response";
6
6
  export * from "./types";
7
- export * from "./utils";
7
+ export * from "./utils";
8
+
9
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./cookies\";\nexport * from \"./headers\";\nexport * from \"./redirect\";\nexport * from \"./request\";\nexport * from \"./response\";\nexport * from \"./types\";\nexport * from \"./utils\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./cookies\";\nexport * from \"./headers\";\nexport * from \"./redirect\";\nexport * from \"./request\";\nexport * from \"./response\";\nexport * from \"./types\";\nexport * from \"./utils\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontResponse } from "./types";
1
+ import type { CloudFrontResponse } from "./types";
2
2
  interface RedirectParams {
3
3
  url: string;
4
4
  query?: string;
@@ -27,4 +27,6 @@ export function redirectResponse(params) {
27
27
  });
28
28
  }
29
29
  return response;
30
- }
30
+ }
31
+
32
+ //# sourceMappingURL=redirect.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["setHeader","redirectResponse","params","query","permanent","status","response","String","statusDescription","headers","key","value","url"],"sources":["redirect.ts"],"sourcesContent":["import { CloudFrontResponse } from \"./types\";\nimport { setHeader } from \"./headers\";\n\ninterface RedirectParams {\n url: string;\n query?: string;\n status?: number;\n}\n\nexport function redirectResponse(params: RedirectParams): CloudFrontResponse {\n const query = params.query || \"\";\n const permanent = params.status === 301;\n\n const response: CloudFrontResponse = {\n status: String(params.status || 302),\n statusDescription: permanent ? \"Moved permanently\" : \"Found\",\n headers: {}\n };\n\n setHeader(response.headers, {\n key: \"location\",\n value: params.url + query\n });\n\n if (!permanent) {\n // for temporary redirects make sure they won't be cached\n setHeader(response.headers, {\n key: \"cache-control\",\n value: \"no-cache, no-store, must-revalidate\"\n });\n setHeader(response.headers, {\n key: \"pragma\",\n value: \"no-cache\"\n });\n setHeader(response.headers, {\n key: \"expires\",\n value: \"0\"\n });\n }\n\n return response;\n}\n"],"mappings":"AACA,SAASA,SAAS;AAQlB,OAAO,SAASC,gBAAgB,CAACC,MAAsB,EAAsB;EACzE,MAAMC,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAI,EAAE;EAChC,MAAMC,SAAS,GAAGF,MAAM,CAACG,MAAM,KAAK,GAAG;EAEvC,MAAMC,QAA4B,GAAG;IACjCD,MAAM,EAAEE,MAAM,CAACL,MAAM,CAACG,MAAM,IAAI,GAAG,CAAC;IACpCG,iBAAiB,EAAEJ,SAAS,GAAG,mBAAmB,GAAG,OAAO;IAC5DK,OAAO,EAAE,CAAC;EACd,CAAC;EAEDT,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;IACxBC,GAAG,EAAE,UAAU;IACfC,KAAK,EAAET,MAAM,CAACU,GAAG,GAAGT;EACxB,CAAC,CAAC;EAEF,IAAI,CAACC,SAAS,EAAE;IACZ;IACAJ,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,eAAe;MACpBC,KAAK,EAAE;IACX,CAAC,CAAC;IACFX,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,QAAQ;MACbC,KAAK,EAAE;IACX,CAAC,CAAC;IACFX,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,SAAS;MACdC,KAAK,EAAE;IACX,CAAC,CAAC;EACN;EAEA,OAAOL,QAAQ;AACnB"}
1
+ {"version":3,"names":["setHeader","redirectResponse","params","query","permanent","status","response","String","statusDescription","headers","key","value","url"],"sources":["redirect.ts"],"sourcesContent":["import type { CloudFrontResponse } from \"./types\";\nimport { setHeader } from \"./headers\";\n\ninterface RedirectParams {\n url: string;\n query?: string;\n status?: number;\n}\n\nexport function redirectResponse(params: RedirectParams): CloudFrontResponse {\n const query = params.query || \"\";\n const permanent = params.status === 301;\n\n const response: CloudFrontResponse = {\n status: String(params.status || 302),\n statusDescription: permanent ? \"Moved permanently\" : \"Found\",\n headers: {}\n };\n\n setHeader(response.headers, {\n key: \"location\",\n value: params.url + query\n });\n\n if (!permanent) {\n // for temporary redirects make sure they won't be cached\n setHeader(response.headers, {\n key: \"cache-control\",\n value: \"no-cache, no-store, must-revalidate\"\n });\n setHeader(response.headers, {\n key: \"pragma\",\n value: \"no-cache\"\n });\n setHeader(response.headers, {\n key: \"expires\",\n value: \"0\"\n });\n }\n\n return response;\n}\n"],"mappings":"AACA,SAASA,SAAS;AAQlB,OAAO,SAASC,gBAAgBA,CAACC,MAAsB,EAAsB;EACzE,MAAMC,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAI,EAAE;EAChC,MAAMC,SAAS,GAAGF,MAAM,CAACG,MAAM,KAAK,GAAG;EAEvC,MAAMC,QAA4B,GAAG;IACjCD,MAAM,EAAEE,MAAM,CAACL,MAAM,CAACG,MAAM,IAAI,GAAG,CAAC;IACpCG,iBAAiB,EAAEJ,SAAS,GAAG,mBAAmB,GAAG,OAAO;IAC5DK,OAAO,EAAE,CAAC;EACd,CAAC;EAEDT,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;IACxBC,GAAG,EAAE,UAAU;IACfC,KAAK,EAAET,MAAM,CAACU,GAAG,GAAGT;EACxB,CAAC,CAAC;EAEF,IAAI,CAACC,SAAS,EAAE;IACZ;IACAJ,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,eAAe;MACpBC,KAAK,EAAE;IACX,CAAC,CAAC;IACFX,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,QAAQ;MACbC,KAAK,EAAE;IACX,CAAC,CAAC;IACFX,SAAS,CAACM,QAAQ,CAACG,OAAO,EAAE;MACxBC,GAAG,EAAE,SAAS;MACdC,KAAK,EAAE;IACX,CAAC,CAAC;EACN;EAEA,OAAOL,QAAQ;AACnB","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import { CloudFrontRequest } from "./types";
1
+ import type { CloudFrontRequest } from "./types";
2
2
  export declare function setDomainOrigin(request: CloudFrontRequest, domain: string): void;
@@ -16,4 +16,6 @@ export function setDomainOrigin(request, domain) {
16
16
  key: "host",
17
17
  value: domain
18
18
  });
19
- }
19
+ }
20
+
21
+ //# sourceMappingURL=request.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["setHeader","setDomainOrigin","request","domain","origin","custom","domainName","port","protocol","path","sslProtocols","readTimeout","keepaliveTimeout","customHeaders","headers","key","value"],"sources":["request.ts"],"sourcesContent":["import { setHeader } from \"./headers\";\nimport { CloudFrontRequest } from \"./types\";\n\nexport function setDomainOrigin(request: CloudFrontRequest, domain: string) {\n request.origin = {\n custom: {\n domainName: domain,\n port: 443,\n protocol: \"https\",\n path: \"\",\n sslProtocols: [\"TLSv1\", \"TLSv1.1\", \"TLSv1.2\"],\n readTimeout: 5,\n keepaliveTimeout: 5,\n customHeaders: {}\n }\n };\n\n setHeader(request.headers, {\n key: \"host\",\n value: domain\n });\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAGlB,OAAO,SAASC,eAAe,CAACC,OAA0B,EAAEC,MAAc,EAAE;EACxED,OAAO,CAACE,MAAM,GAAG;IACbC,MAAM,EAAE;MACJC,UAAU,EAAEH,MAAM;MAClBI,IAAI,EAAE,GAAG;MACTC,QAAQ,EAAE,OAAO;MACjBC,IAAI,EAAE,EAAE;MACRC,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;MAC7CC,WAAW,EAAE,CAAC;MACdC,gBAAgB,EAAE,CAAC;MACnBC,aAAa,EAAE,CAAC;IACpB;EACJ,CAAC;EAEDb,SAAS,CAACE,OAAO,CAACY,OAAO,EAAE;IACvBC,GAAG,EAAE,MAAM;IACXC,KAAK,EAAEb;EACX,CAAC,CAAC;AACN"}
1
+ {"version":3,"names":["setHeader","setDomainOrigin","request","domain","origin","custom","domainName","port","protocol","path","sslProtocols","readTimeout","keepaliveTimeout","customHeaders","headers","key","value"],"sources":["request.ts"],"sourcesContent":["import { setHeader } from \"./headers\";\nimport type { CloudFrontRequest } from \"./types\";\n\nexport function setDomainOrigin(request: CloudFrontRequest, domain: string) {\n request.origin = {\n custom: {\n domainName: domain,\n port: 443,\n protocol: \"https\",\n path: \"\",\n sslProtocols: [\"TLSv1\", \"TLSv1.1\", \"TLSv1.2\"],\n readTimeout: 5,\n keepaliveTimeout: 5,\n customHeaders: {}\n }\n };\n\n setHeader(request.headers, {\n key: \"host\",\n value: domain\n });\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAGlB,OAAO,SAASC,eAAeA,CAACC,OAA0B,EAAEC,MAAc,EAAE;EACxED,OAAO,CAACE,MAAM,GAAG;IACbC,MAAM,EAAE;MACJC,UAAU,EAAEH,MAAM;MAClBI,IAAI,EAAE,GAAG;MACTC,QAAQ,EAAE,OAAO;MACjBC,IAAI,EAAE,EAAE;MACRC,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;MAC7CC,WAAW,EAAE,CAAC;MACdC,gBAAgB,EAAE,CAAC;MACnBC,aAAa,EAAE,CAAC;IACpB;EACJ,CAAC;EAEDb,SAAS,CAACE,OAAO,CAACY,OAAO,EAAE;IACvBC,GAAG,EAAE,MAAM;IACXC,KAAK,EAAEb;EACX,CAAC,CAAC;AACN","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import { CloudFrontResultResponse } from "./types";
1
+ import type { CloudFrontResultResponse } from "./types";
2
2
  export declare function notFoundResponse(message?: string): CloudFrontResultResponse;
@@ -4,4 +4,6 @@ export function notFoundResponse(message) {
4
4
  statusDescription: "Not found",
5
5
  body: message || "Not found"
6
6
  };
7
- }
7
+ }
8
+
9
+ //# sourceMappingURL=response.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["notFoundResponse","message","status","statusDescription","body"],"sources":["response.ts"],"sourcesContent":["import { CloudFrontResultResponse } from \"./types\";\n\nexport function notFoundResponse(message?: string): CloudFrontResultResponse {\n return {\n status: \"404\",\n statusDescription: \"Not found\",\n body: message || \"Not found\"\n };\n}\n"],"mappings":"AAEA,OAAO,SAASA,gBAAgB,CAACC,OAAgB,EAA4B;EACzE,OAAO;IACHC,MAAM,EAAE,KAAK;IACbC,iBAAiB,EAAE,WAAW;IAC9BC,IAAI,EAAEH,OAAO,IAAI;EACrB,CAAC;AACL"}
1
+ {"version":3,"names":["notFoundResponse","message","status","statusDescription","body"],"sources":["response.ts"],"sourcesContent":["import type { CloudFrontResultResponse } from \"./types\";\n\nexport function notFoundResponse(message?: string): CloudFrontResultResponse {\n return {\n status: \"404\",\n statusDescription: \"Not found\",\n body: message || \"Not found\"\n };\n}\n"],"mappings":"AAEA,OAAO,SAASA,gBAAgBA,CAACC,OAAgB,EAA4B;EACzE,OAAO;IACHC,MAAM,EAAE,KAAK;IACbC,iBAAiB,EAAE,WAAW;IAC9BC,IAAI,EAAEH,OAAO,IAAI;EACrB,CAAC;AACL","ignoreList":[]}
@@ -1,10 +1,10 @@
1
- import * as awsLambda from "aws-lambda";
2
- export declare type CloudFrontEvent = awsLambda.CloudFrontEvent;
3
- export declare type CloudFrontRequest = awsLambda.CloudFrontRequest;
4
- export declare type CloudFrontRequestEvent = awsLambda.CloudFrontRequestEvent;
5
- export declare type CloudFrontResponse = awsLambda.CloudFrontResponse & {
1
+ import type { CloudFrontEvent as BaseCloudFrontEvent, CloudFrontRequest as BaseCloudFrontRequest, CloudFrontRequestEvent as BaseCloudFrontRequestEvent, CloudFrontResponse as BaseCloudFrontResponse, CloudFrontResponseEvent as BaseCloudFrontResponseEvent, CloudFrontResultResponse as BaseCloudFrontResultResponse, CloudFrontHeaders as BaseCloudFrontHeaders } from "aws-lambda";
2
+ export type CloudFrontEvent = BaseCloudFrontEvent;
3
+ export type CloudFrontRequest = BaseCloudFrontRequest;
4
+ export type CloudFrontRequestEvent = BaseCloudFrontRequestEvent;
5
+ export type CloudFrontResponse = BaseCloudFrontResponse & {
6
6
  body?: string;
7
7
  };
8
- export declare type CloudFrontResponseEvent = awsLambda.CloudFrontResponseEvent;
9
- export declare type CloudFrontResultResponse = awsLambda.CloudFrontResultResponse;
10
- export declare type CloudFrontHeaders = awsLambda.CloudFrontHeaders;
8
+ export type CloudFrontResponseEvent = BaseCloudFrontResponseEvent;
9
+ export type CloudFrontResultResponse = BaseCloudFrontResultResponse;
10
+ export type CloudFrontHeaders = BaseCloudFrontHeaders;
@@ -1 +1,3 @@
1
- export {};
1
+ export {};
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import * as awsLambda from \"aws-lambda\";\n\n// We have to re-export types one by one.\n// Otherwise `aws-lambda` will land in JS output.\n\nexport type CloudFrontEvent = awsLambda.CloudFrontEvent;\nexport type CloudFrontRequest = awsLambda.CloudFrontRequest;\nexport type CloudFrontRequestEvent = awsLambda.CloudFrontRequestEvent;\nexport type CloudFrontResponse = awsLambda.CloudFrontResponse & { body?: string };\nexport type CloudFrontResponseEvent = awsLambda.CloudFrontResponseEvent;\nexport type CloudFrontResultResponse = awsLambda.CloudFrontResultResponse;\nexport type CloudFrontHeaders = awsLambda.CloudFrontHeaders;\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {\n CloudFrontEvent as BaseCloudFrontEvent,\n CloudFrontRequest as BaseCloudFrontRequest,\n CloudFrontRequestEvent as BaseCloudFrontRequestEvent,\n CloudFrontResponse as BaseCloudFrontResponse,\n CloudFrontResponseEvent as BaseCloudFrontResponseEvent,\n CloudFrontResultResponse as BaseCloudFrontResultResponse,\n CloudFrontHeaders as BaseCloudFrontHeaders\n} from \"aws-lambda\";\n\nexport type CloudFrontEvent = BaseCloudFrontEvent;\nexport type CloudFrontRequest = BaseCloudFrontRequest;\nexport type CloudFrontRequestEvent = BaseCloudFrontRequestEvent;\nexport type CloudFrontResponse = BaseCloudFrontResponse & { body?: string };\nexport type CloudFrontResponseEvent = BaseCloudFrontResponseEvent;\nexport type CloudFrontResultResponse = BaseCloudFrontResultResponse;\nexport type CloudFrontHeaders = BaseCloudFrontHeaders;\n"],"mappings":"","ignoreList":[]}
@@ -1,3 +1,3 @@
1
- import { CloudFrontRequestHandler, CloudFrontResponseHandler } from "aws-lambda";
1
+ import type { CloudFrontRequestHandler, CloudFrontResponseHandler } from "aws-lambda";
2
2
  export declare function defineLambdaEdgeRequestHandler(handler: CloudFrontRequestHandler): CloudFrontRequestHandler;
3
3
  export declare function defineLambdaEdgeResponseHandler(handler: CloudFrontResponseHandler): CloudFrontResponseHandler;
@@ -3,4 +3,6 @@ export function defineLambdaEdgeRequestHandler(handler) {
3
3
  }
4
4
  export function defineLambdaEdgeResponseHandler(handler) {
5
5
  return handler;
6
- }
6
+ }
7
+
8
+ //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineLambdaEdgeRequestHandler","handler","defineLambdaEdgeResponseHandler"],"sources":["utils.ts"],"sourcesContent":["import { CloudFrontRequestHandler, CloudFrontResponseHandler } from \"aws-lambda\";\n\nexport function defineLambdaEdgeRequestHandler(handler: CloudFrontRequestHandler) {\n return handler;\n}\n\nexport function defineLambdaEdgeResponseHandler(handler: CloudFrontResponseHandler) {\n return handler;\n}\n"],"mappings":"AAEA,OAAO,SAASA,8BAA8B,CAACC,OAAiC,EAAE;EAC9E,OAAOA,OAAO;AAClB;AAEA,OAAO,SAASC,+BAA+B,CAACD,OAAkC,EAAE;EAChF,OAAOA,OAAO;AAClB"}
1
+ {"version":3,"names":["defineLambdaEdgeRequestHandler","handler","defineLambdaEdgeResponseHandler"],"sources":["utils.ts"],"sourcesContent":["import type { CloudFrontRequestHandler, CloudFrontResponseHandler } from \"aws-lambda\";\n\nexport function defineLambdaEdgeRequestHandler(handler: CloudFrontRequestHandler) {\n return handler;\n}\n\nexport function defineLambdaEdgeResponseHandler(handler: CloudFrontResponseHandler) {\n return handler;\n}\n"],"mappings":"AAEA,OAAO,SAASA,8BAA8BA,CAACC,OAAiC,EAAE;EAC9E,OAAOA,OAAO;AAClB;AAEA,OAAO,SAASC,+BAA+BA,CAACD,OAAkC,EAAE;EAChF,OAAOA,OAAO;AAClB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/aws-helpers",
3
- "version": "0.0.0-unstable.2af142b57e",
3
+ "version": "0.0.0-unstable.3bc8100a7f",
4
4
  "types": "dist/index.d.ts",
5
5
  "exports": {
6
6
  ".": {
@@ -25,14 +25,18 @@
25
25
  "access": "public",
26
26
  "directory": "dist"
27
27
  },
28
- "gitHead": "2af142b57e7cdc433f5098b3b6d43ae6caa5d54e",
28
+ "gitHead": "3bc8100a7f1fb3a8d6a3454a2765f8ef377c279e",
29
29
  "dependencies": {
30
- "@types/aws-lambda": "8.10.110",
31
- "cheerio": "1.0.0-rc.12",
30
+ "@types/aws-lambda": "8.10.145",
31
+ "cheerio": "1.1.2",
32
32
  "srcset": "4.0.0"
33
33
  },
34
+ "scripts": {
35
+ "build": "node ../cli/bin.js run build",
36
+ "watch": "node ../cli/bin.js run watch"
37
+ },
34
38
  "devDependencies": {
35
- "@webiny/project-utils": "^0.0.0-unstable.2af142b57e"
39
+ "@webiny/project-utils": "0.0.0-unstable.3bc8100a7f"
36
40
  },
37
41
  "sideEffects": false,
38
42
  "adio": {
@@ -25,4 +25,6 @@ export default defineLambdaEdgeRequestHandler(async event => {
25
25
  console.error(e);
26
26
  throw e;
27
27
  }
28
- });
28
+ });
29
+
30
+ //# sourceMappingURL=adminOriginRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineLambdaEdgeRequestHandler","setDomainOrigin","pointsToFile","loadOriginPage","loadVariantOrigin","event","result","cf","Records","request","variant","uri","domain","e","console","error"],"sources":["adminOriginRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge\";\n\nimport { pointsToFile } from \"../utils/common\";\nimport { loadOriginPage } from \"../utils/loadOriginPage\";\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n try {\n const result = await loadVariantOrigin(event);\n\n if (\"variant\" in result) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n const variant = result.variant;\n\n // For file requests we just pass the request to proper origin.\n if (pointsToFile(request.uri)) {\n setDomainOrigin(request, variant.domain);\n return request;\n }\n\n // For pages we make a custom HTTP request to the origin and transform page properly.\n // For example we change asset URLs to be absolute.\n return await loadOriginPage(variant.domain, request.uri);\n }\n return result;\n } catch (e) {\n console.error(e);\n throw e;\n }\n});\n"],"mappings":"AAAA,SAASA,8BAA8B,EAAEC,eAAe;AAExD,SAASC,YAAY;AACrB,SAASC,cAAc;AACvB,SAASC,iBAAiB;AAE1B,eAAeJ,8BAA8B,CAAC,MAAMK,KAAK,IAAI;EACzD,IAAI;IACA,MAAMC,MAAM,GAAG,MAAMF,iBAAiB,CAACC,KAAK,CAAC;IAE7C,IAAI,SAAS,IAAIC,MAAM,EAAE;MACrB,MAAMC,EAAE,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;MAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;MAC1B,MAAMC,OAAO,GAAGJ,MAAM,CAACI,OAAO;;MAE9B;MACA,IAAIR,YAAY,CAACO,OAAO,CAACE,GAAG,CAAC,EAAE;QAC3BV,eAAe,CAACQ,OAAO,EAAEC,OAAO,CAACE,MAAM,CAAC;QACxC,OAAOH,OAAO;MAClB;;MAEA;MACA;MACA,OAAO,MAAMN,cAAc,CAACO,OAAO,CAACE,MAAM,EAAEH,OAAO,CAACE,GAAG,CAAC;IAC5D;IACA,OAAOL,MAAM;EACjB,CAAC,CAAC,OAAOO,CAAC,EAAE;IACRC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,MAAMA,CAAC;EACX;AACJ,CAAC,CAAC"}
1
+ {"version":3,"names":["defineLambdaEdgeRequestHandler","setDomainOrigin","pointsToFile","loadOriginPage","loadVariantOrigin","event","result","cf","Records","request","variant","uri","domain","e","console","error"],"sources":["adminOriginRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge\";\n\nimport { pointsToFile } from \"../utils/common\";\nimport { loadOriginPage } from \"../utils/loadOriginPage\";\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n try {\n const result = await loadVariantOrigin(event);\n\n if (\"variant\" in result) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n const variant = result.variant;\n\n // For file requests we just pass the request to proper origin.\n if (pointsToFile(request.uri)) {\n setDomainOrigin(request, variant.domain);\n return request;\n }\n\n // For pages we make a custom HTTP request to the origin and transform page properly.\n // For example we change asset URLs to be absolute.\n return await loadOriginPage(variant.domain, request.uri);\n }\n return result;\n } catch (e) {\n console.error(e);\n throw e;\n }\n});\n"],"mappings":"AAAA,SAASA,8BAA8B,EAAEC,eAAe;AAExD,SAASC,YAAY;AACrB,SAASC,cAAc;AACvB,SAASC,iBAAiB;AAE1B,eAAeJ,8BAA8B,CAAC,MAAMK,KAAK,IAAI;EACzD,IAAI;IACA,MAAMC,MAAM,GAAG,MAAMF,iBAAiB,CAACC,KAAK,CAAC;IAE7C,IAAI,SAAS,IAAIC,MAAM,EAAE;MACrB,MAAMC,EAAE,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;MAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;MAC1B,MAAMC,OAAO,GAAGJ,MAAM,CAACI,OAAO;;MAE9B;MACA,IAAIR,YAAY,CAACO,OAAO,CAACE,GAAG,CAAC,EAAE;QAC3BV,eAAe,CAACQ,OAAO,EAAEC,OAAO,CAACE,MAAM,CAAC;QACxC,OAAOH,OAAO;MAClB;;MAEA;MACA;MACA,OAAO,MAAMN,cAAc,CAACO,OAAO,CAACE,MAAM,EAAEH,OAAO,CAACE,GAAG,CAAC;IAC5D;IACA,OAAOL,MAAM;EACjB,CAAC,CAAC,OAAOO,CAAC,EAAE;IACRC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,MAAMA,CAAC;EACX;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -49,4 +49,6 @@ function loadConfigJson(event) {
49
49
  });
50
50
  });
51
51
  });
52
- }
52
+ }
53
+
54
+ //# sourceMappingURL=configOriginRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineLambdaEdgeRequestHandler","setHeader","get","event","configJson","loadConfigJson","response","status","statusDescription","headers","body","key","value","e","console","error","Promise","resolve","reject","dataString","domain","Records","cf","config","distributionDomainName","req","hostname","port","path","res","on","chunk","statusCode","message"],"sources":["configOriginRequest.ts"],"sourcesContent":["import {\n CloudFrontRequestEvent,\n CloudFrontResponse,\n defineLambdaEdgeRequestHandler,\n setHeader\n} from \"~/lambdaEdge\";\n\nimport { get } from \"https\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n try {\n const configJson = await loadConfigJson(event);\n const response: CloudFrontResponse = {\n status: \"200\",\n statusDescription: \"OK\",\n headers: {},\n body: configJson\n };\n\n setHeader(response.headers, {\n key: \"Content-Type\",\n value: \"application/json\"\n });\n\n setHeader(response.headers, {\n key: \"Cache-Control\",\n value: \"public, max-age=31536000\"\n });\n\n return response;\n } catch (e) {\n console.error(e);\n throw e;\n }\n});\n\nfunction loadConfigJson(event: CloudFrontRequestEvent) {\n return new Promise<string>((resolve, reject) => {\n let dataString = \"\";\n\n // Retrieve domain of the CloudFront distribution.\n const domain = event.Records[0].cf.config.distributionDomainName;\n\n const req = get(\n {\n hostname: domain,\n port: 443,\n // TODO: we will call WCP instead of a static file here\n path: \"/_config.json\"\n },\n function (res) {\n res.on(\"data\", chunk => {\n dataString += chunk;\n });\n res.on(\"end\", () => {\n resolve(dataString);\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n"],"mappings":"AAAA,SAGIA,8BAA8B,EAC9BC,SAAS;AAGb,SAASC,GAAG,QAAQ,OAAO;AAE3B,eAAeF,8BAA8B,CAAC,MAAMG,KAAK,IAAI;EACzD,IAAI;IACA,MAAMC,UAAU,GAAG,MAAMC,cAAc,CAACF,KAAK,CAAC;IAC9C,MAAMG,QAA4B,GAAG;MACjCC,MAAM,EAAE,KAAK;MACbC,iBAAiB,EAAE,IAAI;MACvBC,OAAO,EAAE,CAAC,CAAC;MACXC,IAAI,EAAEN;IACV,CAAC;IAEDH,SAAS,CAACK,QAAQ,CAACG,OAAO,EAAE;MACxBE,GAAG,EAAE,cAAc;MACnBC,KAAK,EAAE;IACX,CAAC,CAAC;IAEFX,SAAS,CAACK,QAAQ,CAACG,OAAO,EAAE;MACxBE,GAAG,EAAE,eAAe;MACpBC,KAAK,EAAE;IACX,CAAC,CAAC;IAEF,OAAON,QAAQ;EACnB,CAAC,CAAC,OAAOO,CAAC,EAAE;IACRC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,MAAMA,CAAC;EACX;AACJ,CAAC,CAAC;AAEF,SAASR,cAAc,CAACF,KAA6B,EAAE;EACnD,OAAO,IAAIa,OAAO,CAAS,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5C,IAAIC,UAAU,GAAG,EAAE;;IAEnB;IACA,MAAMC,MAAM,GAAGjB,KAAK,CAACkB,OAAO,CAAC,CAAC,CAAC,CAACC,EAAE,CAACC,MAAM,CAACC,sBAAsB;IAEhE,MAAMC,GAAG,GAAGvB,GAAG,CACX;MACIwB,QAAQ,EAAEN,MAAM;MAChBO,IAAI,EAAE,GAAG;MACT;MACAC,IAAI,EAAE;IACV,CAAC,EACD,UAAUC,GAAG,EAAE;MACXA,GAAG,CAACC,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAI;QACpBZ,UAAU,IAAIY,KAAK;MACvB,CAAC,CAAC;MACFF,GAAG,CAACC,EAAE,CAAC,KAAK,EAAE,MAAM;QAChBb,OAAO,CAACE,UAAU,CAAC;MACvB,CAAC,CAAC;IACN,CAAC,CACJ;IAEDM,GAAG,CAACK,EAAE,CAAC,OAAO,EAAEjB,CAAC,IAAI;MACjBK,MAAM,CAAC;QACHc,UAAU,EAAE,GAAG;QACftB,IAAI,EAAEG,CAAC,CAACoB;MACZ,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;AACN"}
1
+ {"version":3,"names":["defineLambdaEdgeRequestHandler","setHeader","get","event","configJson","loadConfigJson","response","status","statusDescription","headers","body","key","value","e","console","error","Promise","resolve","reject","dataString","domain","Records","cf","config","distributionDomainName","req","hostname","port","path","res","on","chunk","statusCode","message"],"sources":["configOriginRequest.ts"],"sourcesContent":["import type { CloudFrontRequestEvent, CloudFrontResponse } from \"~/lambdaEdge\";\nimport { defineLambdaEdgeRequestHandler, setHeader } from \"~/lambdaEdge\";\n\nimport { get } from \"https\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n try {\n const configJson = await loadConfigJson(event);\n const response: CloudFrontResponse = {\n status: \"200\",\n statusDescription: \"OK\",\n headers: {},\n body: configJson\n };\n\n setHeader(response.headers, {\n key: \"Content-Type\",\n value: \"application/json\"\n });\n\n setHeader(response.headers, {\n key: \"Cache-Control\",\n value: \"public, max-age=31536000\"\n });\n\n return response;\n } catch (e) {\n console.error(e);\n throw e;\n }\n});\n\nfunction loadConfigJson(event: CloudFrontRequestEvent) {\n return new Promise<string>((resolve, reject) => {\n let dataString = \"\";\n\n // Retrieve domain of the CloudFront distribution.\n const domain = event.Records[0].cf.config.distributionDomainName;\n\n const req = get(\n {\n hostname: domain,\n port: 443,\n // TODO: we will call WCP instead of a static file here\n path: \"/_config.json\"\n },\n function (res) {\n res.on(\"data\", chunk => {\n dataString += chunk;\n });\n res.on(\"end\", () => {\n resolve(dataString);\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n"],"mappings":"AACA,SAASA,8BAA8B,EAAEC,SAAS;AAElD,SAASC,GAAG,QAAQ,OAAO;AAE3B,eAAeF,8BAA8B,CAAC,MAAMG,KAAK,IAAI;EACzD,IAAI;IACA,MAAMC,UAAU,GAAG,MAAMC,cAAc,CAACF,KAAK,CAAC;IAC9C,MAAMG,QAA4B,GAAG;MACjCC,MAAM,EAAE,KAAK;MACbC,iBAAiB,EAAE,IAAI;MACvBC,OAAO,EAAE,CAAC,CAAC;MACXC,IAAI,EAAEN;IACV,CAAC;IAEDH,SAAS,CAACK,QAAQ,CAACG,OAAO,EAAE;MACxBE,GAAG,EAAE,cAAc;MACnBC,KAAK,EAAE;IACX,CAAC,CAAC;IAEFX,SAAS,CAACK,QAAQ,CAACG,OAAO,EAAE;MACxBE,GAAG,EAAE,eAAe;MACpBC,KAAK,EAAE;IACX,CAAC,CAAC;IAEF,OAAON,QAAQ;EACnB,CAAC,CAAC,OAAOO,CAAC,EAAE;IACRC,OAAO,CAACC,KAAK,CAACF,CAAC,CAAC;IAChB,MAAMA,CAAC;EACX;AACJ,CAAC,CAAC;AAEF,SAASR,cAAcA,CAACF,KAA6B,EAAE;EACnD,OAAO,IAAIa,OAAO,CAAS,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5C,IAAIC,UAAU,GAAG,EAAE;;IAEnB;IACA,MAAMC,MAAM,GAAGjB,KAAK,CAACkB,OAAO,CAAC,CAAC,CAAC,CAACC,EAAE,CAACC,MAAM,CAACC,sBAAsB;IAEhE,MAAMC,GAAG,GAAGvB,GAAG,CACX;MACIwB,QAAQ,EAAEN,MAAM;MAChBO,IAAI,EAAE,GAAG;MACT;MACAC,IAAI,EAAE;IACV,CAAC,EACD,UAAUC,GAAG,EAAE;MACXA,GAAG,CAACC,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAI;QACpBZ,UAAU,IAAIY,KAAK;MACvB,CAAC,CAAC;MACFF,GAAG,CAACC,EAAE,CAAC,KAAK,EAAE,MAAM;QAChBb,OAAO,CAACE,UAAU,CAAC;MACvB,CAAC,CAAC;IACN,CACJ,CAAC;IAEDM,GAAG,CAACK,EAAE,CAAC,OAAO,EAAEjB,CAAC,IAAI;MACjBK,MAAM,CAAC;QACHc,UAAU,EAAE,GAAG;QACftB,IAAI,EAAEG,CAAC,CAACoB;MACZ,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;AACN","ignoreList":[]}
@@ -10,4 +10,6 @@ export default defineLambdaEdgeRequestHandler(async event => {
10
10
  return request;
11
11
  }
12
12
  return result;
13
- });
13
+ });
14
+
15
+ //# sourceMappingURL=originRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineLambdaEdgeRequestHandler","setDomainOrigin","loadVariantOrigin","event","result","cf","Records","request","variant","domain"],"sources":["originRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge\";\n\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n const result = await loadVariantOrigin(event);\n\n if (\"variant\" in result) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n const variant = result.variant;\n\n setDomainOrigin(request, variant.domain);\n return request;\n }\n\n return result;\n});\n"],"mappings":"AAAA,SAASA,8BAA8B,EAAEC,eAAe;AAExD,SAASC,iBAAiB;AAE1B,eAAeF,8BAA8B,CAAC,MAAMG,KAAK,IAAI;EACzD,MAAMC,MAAM,GAAG,MAAMF,iBAAiB,CAACC,KAAK,CAAC;EAE7C,IAAI,SAAS,IAAIC,MAAM,EAAE;IACrB,MAAMC,EAAE,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;IAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;IAC1B,MAAMC,OAAO,GAAGJ,MAAM,CAACI,OAAO;IAE9BP,eAAe,CAACM,OAAO,EAAEC,OAAO,CAACC,MAAM,CAAC;IACxC,OAAOF,OAAO;EAClB;EAEA,OAAOH,MAAM;AACjB,CAAC,CAAC"}
1
+ {"version":3,"names":["defineLambdaEdgeRequestHandler","setDomainOrigin","loadVariantOrigin","event","result","cf","Records","request","variant","domain"],"sources":["originRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge\";\n\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin\";\n\nexport default defineLambdaEdgeRequestHandler(async event => {\n const result = await loadVariantOrigin(event);\n\n if (\"variant\" in result) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n const variant = result.variant;\n\n setDomainOrigin(request, variant.domain);\n return request;\n }\n\n return result;\n});\n"],"mappings":"AAAA,SAASA,8BAA8B,EAAEC,eAAe;AAExD,SAASC,iBAAiB;AAE1B,eAAeF,8BAA8B,CAAC,MAAMG,KAAK,IAAI;EACzD,MAAMC,MAAM,GAAG,MAAMF,iBAAiB,CAACC,KAAK,CAAC;EAE7C,IAAI,SAAS,IAAIC,MAAM,EAAE;IACrB,MAAMC,EAAE,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;IAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;IAC1B,MAAMC,OAAO,GAAGJ,MAAM,CAACI,OAAO;IAE9BP,eAAe,CAACM,OAAO,EAAEC,OAAO,CAACC,MAAM,CAAC;IACxC,OAAOF,OAAO;EAClB;EAEA,OAAOH,MAAM;AACjB,CAAC,CAAC","ignoreList":[]}
@@ -1,11 +1,10 @@
1
1
  import { defineCloudfrontFunctionRequestHandler } from "../../cloudfrontFunctions";
2
2
  import { variantFixedKey, variantRandomKey } from "../utils/common";
3
3
  defineCloudfrontFunctionRequestHandler(event => {
4
- var _request$cookies, _request$cookies$vari, _request$headers$vari, _request$cookies2, _request$cookies2$var;
5
4
  const request = event.request;
6
5
 
7
6
  // Try to get stage name from cookie or header.
8
- const variantFixed = ((_request$cookies = request.cookies) === null || _request$cookies === void 0 ? void 0 : (_request$cookies$vari = _request$cookies[variantFixedKey]) === null || _request$cookies$vari === void 0 ? void 0 : _request$cookies$vari.value) || ((_request$headers$vari = request.headers[variantFixedKey]) === null || _request$headers$vari === void 0 ? void 0 : _request$headers$vari.value);
7
+ const variantFixed = request.cookies?.[variantFixedKey]?.value || request.headers[variantFixedKey]?.value;
9
8
  if (variantFixed) {
10
9
  // If there is a fixed variant set, we just pass it further to origin request handler.
11
10
  request.headers[variantFixedKey] = {
@@ -20,7 +19,7 @@ defineCloudfrontFunctionRequestHandler(event => {
20
19
 
21
20
  // Otherwise we try to retrieve randomized number from user cookie.
22
21
  // This random value will be passed further to the origin request to select based on config.
23
- let variantRandom = Number((_request$cookies2 = request.cookies) === null || _request$cookies2 === void 0 ? void 0 : (_request$cookies2$var = _request$cookies2[variantRandomKey]) === null || _request$cookies2$var === void 0 ? void 0 : _request$cookies2$var.value);
22
+ let variantRandom = Number(request.cookies?.[variantRandomKey]?.value);
24
23
  if (isNaN(variantRandom) || variantRandom < 1 || variantRandom > 100) {
25
24
  // If no value is present we simply randomize one.
26
25
  // This formula gives you an integer 1-100 (inclusive).
@@ -38,4 +37,6 @@ defineCloudfrontFunctionRequestHandler(event => {
38
37
  value: variantRandom.toString()
39
38
  };
40
39
  return request;
41
- });
40
+ });
41
+
42
+ //# sourceMappingURL=viewerRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineCloudfrontFunctionRequestHandler","variantFixedKey","variantRandomKey","event","request","variantFixed","cookies","value","headers","variantRandom","Number","isNaN","Math","floor","random","toString"],"sources":["viewerRequest.ts"],"sourcesContent":["import { defineCloudfrontFunctionRequestHandler } from \"~/cloudfrontFunctions\";\n\nimport { variantFixedKey, variantRandomKey } from \"../utils/common\";\n\ndefineCloudfrontFunctionRequestHandler(event => {\n const request = event.request;\n\n // Try to get stage name from cookie or header.\n const variantFixed =\n request.cookies?.[variantFixedKey]?.value || request.headers[variantFixedKey]?.value;\n if (variantFixed) {\n // If there is a fixed variant set, we just pass it further to origin request handler.\n request.headers[variantFixedKey] = {\n value: variantFixed\n };\n\n // If variant is explicitly selected, remove any random header a user may have passed.\n // We want to have either one or another for better cache hit rate.\n delete request.headers[variantRandomKey];\n return request;\n }\n\n // Otherwise we try to retrieve randomized number from user cookie.\n // This random value will be passed further to the origin request to select based on config.\n let variantRandom = Number(request.cookies?.[variantRandomKey]?.value);\n if (isNaN(variantRandom) || variantRandom < 1 || variantRandom > 100) {\n // If no value is present we simply randomize one.\n // This formula gives you an integer 1-100 (inclusive).\n // This way we have exactly 100 possible values.\n // Math.random() return values in range [0, 1) - 0 inclusive, 1 exclusive.\n // So we need to adjust it a litte bit to achieve what we want.\n variantRandom = Math.floor(Math.random() * 100 + 1);\n }\n\n // Adjust random value to a specific interval optimize caching.\n // Less possible values means less separate cache entries in CDN an better cache hit ratio.\n // TODO this value can set during deployment, to allow users to decide on trade-off between better caching and finer traffic splitting\n variantRandom -= variantRandom % 5;\n\n request.headers[variantRandomKey] = {\n value: variantRandom.toString()\n };\n\n return request;\n});\n"],"mappings":"AAAA,SAASA,sCAAsC;AAE/C,SAASC,eAAe,EAAEC,gBAAgB;AAE1CF,sCAAsC,CAACG,KAAK,IAAI;EAAA;EAC5C,MAAMC,OAAO,GAAGD,KAAK,CAACC,OAAO;;EAE7B;EACA,MAAMC,YAAY,GACd,qBAAAD,OAAO,CAACE,OAAO,8EAAf,iBAAkBL,eAAe,CAAC,0DAAlC,sBAAoCM,KAAK,+BAAIH,OAAO,CAACI,OAAO,CAACP,eAAe,CAAC,0DAAhC,sBAAkCM,KAAK;EACxF,IAAIF,YAAY,EAAE;IACd;IACAD,OAAO,CAACI,OAAO,CAACP,eAAe,CAAC,GAAG;MAC/BM,KAAK,EAAEF;IACX,CAAC;;IAED;IACA;IACA,OAAOD,OAAO,CAACI,OAAO,CAACN,gBAAgB,CAAC;IACxC,OAAOE,OAAO;EAClB;;EAEA;EACA;EACA,IAAIK,aAAa,GAAGC,MAAM,sBAACN,OAAO,CAACE,OAAO,+EAAf,kBAAkBJ,gBAAgB,CAAC,0DAAnC,sBAAqCK,KAAK,CAAC;EACtE,IAAII,KAAK,CAACF,aAAa,CAAC,IAAIA,aAAa,GAAG,CAAC,IAAIA,aAAa,GAAG,GAAG,EAAE;IAClE;IACA;IACA;IACA;IACA;IACAA,aAAa,GAAGG,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;EACvD;;EAEA;EACA;EACA;EACAL,aAAa,IAAIA,aAAa,GAAG,CAAC;EAElCL,OAAO,CAACI,OAAO,CAACN,gBAAgB,CAAC,GAAG;IAChCK,KAAK,EAAEE,aAAa,CAACM,QAAQ;EACjC,CAAC;EAED,OAAOX,OAAO;AAClB,CAAC,CAAC"}
1
+ {"version":3,"names":["defineCloudfrontFunctionRequestHandler","variantFixedKey","variantRandomKey","event","request","variantFixed","cookies","value","headers","variantRandom","Number","isNaN","Math","floor","random","toString"],"sources":["viewerRequest.ts"],"sourcesContent":["import { defineCloudfrontFunctionRequestHandler } from \"~/cloudfrontFunctions\";\n\nimport { variantFixedKey, variantRandomKey } from \"../utils/common\";\n\ndefineCloudfrontFunctionRequestHandler(event => {\n const request = event.request;\n\n // Try to get stage name from cookie or header.\n const variantFixed =\n request.cookies?.[variantFixedKey]?.value || request.headers[variantFixedKey]?.value;\n if (variantFixed) {\n // If there is a fixed variant set, we just pass it further to origin request handler.\n request.headers[variantFixedKey] = {\n value: variantFixed\n };\n\n // If variant is explicitly selected, remove any random header a user may have passed.\n // We want to have either one or another for better cache hit rate.\n delete request.headers[variantRandomKey];\n return request;\n }\n\n // Otherwise we try to retrieve randomized number from user cookie.\n // This random value will be passed further to the origin request to select based on config.\n let variantRandom = Number(request.cookies?.[variantRandomKey]?.value);\n if (isNaN(variantRandom) || variantRandom < 1 || variantRandom > 100) {\n // If no value is present we simply randomize one.\n // This formula gives you an integer 1-100 (inclusive).\n // This way we have exactly 100 possible values.\n // Math.random() return values in range [0, 1) - 0 inclusive, 1 exclusive.\n // So we need to adjust it a litte bit to achieve what we want.\n variantRandom = Math.floor(Math.random() * 100 + 1);\n }\n\n // Adjust random value to a specific interval optimize caching.\n // Less possible values means less separate cache entries in CDN an better cache hit ratio.\n // TODO this value can set during deployment, to allow users to decide on trade-off between better caching and finer traffic splitting\n variantRandom -= variantRandom % 5;\n\n request.headers[variantRandomKey] = {\n value: variantRandom.toString()\n };\n\n return request;\n});\n"],"mappings":"AAAA,SAASA,sCAAsC;AAE/C,SAASC,eAAe,EAAEC,gBAAgB;AAE1CF,sCAAsC,CAACG,KAAK,IAAI;EAC5C,MAAMC,OAAO,GAAGD,KAAK,CAACC,OAAO;;EAE7B;EACA,MAAMC,YAAY,GACdD,OAAO,CAACE,OAAO,GAAGL,eAAe,CAAC,EAAEM,KAAK,IAAIH,OAAO,CAACI,OAAO,CAACP,eAAe,CAAC,EAAEM,KAAK;EACxF,IAAIF,YAAY,EAAE;IACd;IACAD,OAAO,CAACI,OAAO,CAACP,eAAe,CAAC,GAAG;MAC/BM,KAAK,EAAEF;IACX,CAAC;;IAED;IACA;IACA,OAAOD,OAAO,CAACI,OAAO,CAACN,gBAAgB,CAAC;IACxC,OAAOE,OAAO;EAClB;;EAEA;EACA;EACA,IAAIK,aAAa,GAAGC,MAAM,CAACN,OAAO,CAACE,OAAO,GAAGJ,gBAAgB,CAAC,EAAEK,KAAK,CAAC;EACtE,IAAII,KAAK,CAACF,aAAa,CAAC,IAAIA,aAAa,GAAG,CAAC,IAAIA,aAAa,GAAG,GAAG,EAAE;IAClE;IACA;IACA;IACA;IACA;IACAA,aAAa,GAAGG,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;EACvD;;EAEA;EACA;EACA;EACAL,aAAa,IAAIA,aAAa,GAAG,CAAC;EAElCL,OAAO,CAACI,OAAO,CAACN,gBAAgB,CAAC,GAAG;IAChCK,KAAK,EAAEE,aAAa,CAACM,QAAQ,CAAC;EAClC,CAAC;EAED,OAAOX,OAAO;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -1,10 +1,9 @@
1
1
  import { defineCloudfrontFunctionResponseHandler, setResponseCookie } from "../../cloudfrontFunctions";
2
2
  import { variantRandomKey } from "../utils/common";
3
3
  defineCloudfrontFunctionResponseHandler(event => {
4
- var _request$headers$vari;
5
4
  const request = event.request;
6
5
  const response = event.response;
7
- const variantRandom = (_request$headers$vari = request.headers[variantRandomKey]) === null || _request$headers$vari === void 0 ? void 0 : _request$headers$vari.value;
6
+ const variantRandom = request.headers[variantRandomKey]?.value;
8
7
  if (variantRandom) {
9
8
  setResponseCookie(response, {
10
9
  name: variantRandomKey,
@@ -12,4 +11,6 @@ defineCloudfrontFunctionResponseHandler(event => {
12
11
  });
13
12
  }
14
13
  return response;
15
- });
14
+ });
15
+
16
+ //# sourceMappingURL=viewerResponse.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["defineCloudfrontFunctionResponseHandler","setResponseCookie","variantRandomKey","event","request","response","variantRandom","headers","value","name"],"sources":["viewerResponse.ts"],"sourcesContent":["import { defineCloudfrontFunctionResponseHandler, setResponseCookie } from \"~/cloudfrontFunctions\";\n\nimport { variantRandomKey } from \"../utils/common\";\n\ndefineCloudfrontFunctionResponseHandler(event => {\n const request = event.request;\n const response = event.response;\n\n const variantRandom = request.headers[variantRandomKey]?.value;\n if (variantRandom) {\n setResponseCookie(response, {\n name: variantRandomKey,\n value: variantRandom\n });\n }\n\n return response;\n});\n"],"mappings":"AAAA,SAASA,uCAAuC,EAAEC,iBAAiB;AAEnE,SAASC,gBAAgB;AAEzBF,uCAAuC,CAACG,KAAK,IAAI;EAAA;EAC7C,MAAMC,OAAO,GAAGD,KAAK,CAACC,OAAO;EAC7B,MAAMC,QAAQ,GAAGF,KAAK,CAACE,QAAQ;EAE/B,MAAMC,aAAa,4BAAGF,OAAO,CAACG,OAAO,CAACL,gBAAgB,CAAC,0DAAjC,sBAAmCM,KAAK;EAC9D,IAAIF,aAAa,EAAE;IACfL,iBAAiB,CAACI,QAAQ,EAAE;MACxBI,IAAI,EAAEP,gBAAgB;MACtBM,KAAK,EAAEF;IACX,CAAC,CAAC;EACN;EAEA,OAAOD,QAAQ;AACnB,CAAC,CAAC"}
1
+ {"version":3,"names":["defineCloudfrontFunctionResponseHandler","setResponseCookie","variantRandomKey","event","request","response","variantRandom","headers","value","name"],"sources":["viewerResponse.ts"],"sourcesContent":["import { defineCloudfrontFunctionResponseHandler, setResponseCookie } from \"~/cloudfrontFunctions\";\n\nimport { variantRandomKey } from \"../utils/common\";\n\ndefineCloudfrontFunctionResponseHandler(event => {\n const request = event.request;\n const response = event.response;\n\n const variantRandom = request.headers[variantRandomKey]?.value;\n if (variantRandom) {\n setResponseCookie(response, {\n name: variantRandomKey,\n value: variantRandom\n });\n }\n\n return response;\n});\n"],"mappings":"AAAA,SAASA,uCAAuC,EAAEC,iBAAiB;AAEnE,SAASC,gBAAgB;AAEzBF,uCAAuC,CAACG,KAAK,IAAI;EAC7C,MAAMC,OAAO,GAAGD,KAAK,CAACC,OAAO;EAC7B,MAAMC,QAAQ,GAAGF,KAAK,CAACE,QAAQ;EAE/B,MAAMC,aAAa,GAAGF,OAAO,CAACG,OAAO,CAACL,gBAAgB,CAAC,EAAEM,KAAK;EAC9D,IAAIF,aAAa,EAAE;IACfL,iBAAiB,CAACI,QAAQ,EAAE;MACxBI,IAAI,EAAEP,gBAAgB;MACtBM,KAAK,EAAEF;IACX,CAAC,CAAC;EACN;EAEA,OAAOD,QAAQ;AACnB,CAAC,CAAC","ignoreList":[]}
@@ -2,4 +2,6 @@ export const variantFixedKey = "webiny-variant-fixed";
2
2
  export const variantRandomKey = "webiny-variant-random";
3
3
  export function pointsToFile(uri) {
4
4
  return /\/[^/]+\.[^/]+$/.test(uri);
5
- }
5
+ }
6
+
7
+ //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["variantFixedKey","variantRandomKey","pointsToFile","uri","test"],"sources":["common.ts"],"sourcesContent":["export const variantFixedKey = \"webiny-variant-fixed\";\nexport const variantRandomKey = \"webiny-variant-random\";\n\nexport function pointsToFile(uri: string) {\n return /\\/[^/]+\\.[^/]+$/.test(uri);\n}\n"],"mappings":"AAAA,OAAO,MAAMA,eAAe,GAAG,sBAAsB;AACrD,OAAO,MAAMC,gBAAgB,GAAG,uBAAuB;AAEvD,OAAO,SAASC,YAAY,CAACC,GAAW,EAAE;EACtC,OAAO,iBAAiB,CAACC,IAAI,CAACD,GAAG,CAAC;AACtC"}
1
+ {"version":3,"names":["variantFixedKey","variantRandomKey","pointsToFile","uri","test"],"sources":["common.ts"],"sourcesContent":["export const variantFixedKey = \"webiny-variant-fixed\";\nexport const variantRandomKey = \"webiny-variant-random\";\n\nexport function pointsToFile(uri: string) {\n return /\\/[^/]+\\.[^/]+$/.test(uri);\n}\n"],"mappings":"AAAA,OAAO,MAAMA,eAAe,GAAG,sBAAsB;AACrD,OAAO,MAAMC,gBAAgB,GAAG,uBAAuB;AAEvD,OAAO,SAASC,YAAYA,CAACC,GAAW,EAAE;EACtC,OAAO,iBAAiB,CAACC,IAAI,CAACD,GAAG,CAAC;AACtC","ignoreList":[]}
@@ -12,4 +12,6 @@ const blacklistedHeadersRegex = [/^x-amz-cf-/, /^x-edge-/];
12
12
  export function isHeaderBlacklisted(header) {
13
13
  header = header.toLocaleLowerCase();
14
14
  return blacklistedHeaders.has(header) || blacklistedHeadersRegex.some(r => r.test(header));
15
- }
15
+ }
16
+
17
+ //# sourceMappingURL=headerBlacklist.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["blacklistedHeaders","Set","blacklistedHeadersRegex","isHeaderBlacklisted","header","toLocaleLowerCase","has","some","r","test"],"sources":["headerBlacklist.ts"],"sourcesContent":["const blacklistedHeaders = new Set([\n // blacklisted headers\n \"connection\",\n \"expect\",\n \"keep-Alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"trailer\",\n \"upgrade\",\n \"x-accel-buffering\",\n \"x-accel-charset\",\n \"x-accel-limit-rate\",\n \"x-accel-redirect\",\n \"x-cache\",\n \"x-forwarded-proto\",\n \"x-real-op\",\n // readonly headers\n \"content-length\",\n \"transfer-encoding\",\n \"via\"\n]);\n\nconst blacklistedHeadersRegex = [/^x-amz-cf-/, /^x-edge-/];\n\n/**\n * Some headers cannot be modified with lambda edge.\n * Source: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html\n */\nexport function isHeaderBlacklisted(header: string) {\n header = header.toLocaleLowerCase();\n return blacklistedHeaders.has(header) || blacklistedHeadersRegex.some(r => r.test(header));\n}\n"],"mappings":"AAAA,MAAMA,kBAAkB,GAAG,IAAIC,GAAG,CAAC;AAC/B;AACA,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,mBAAmB,EACnB,WAAW;AACX;AACA,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,CACR,CAAC;AAEF,MAAMC,uBAAuB,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;;AAE1D;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmB,CAACC,MAAc,EAAE;EAChDA,MAAM,GAAGA,MAAM,CAACC,iBAAiB,EAAE;EACnC,OAAOL,kBAAkB,CAACM,GAAG,CAACF,MAAM,CAAC,IAAIF,uBAAuB,CAACK,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,CAACL,MAAM,CAAC,CAAC;AAC9F"}
1
+ {"version":3,"names":["blacklistedHeaders","Set","blacklistedHeadersRegex","isHeaderBlacklisted","header","toLocaleLowerCase","has","some","r","test"],"sources":["headerBlacklist.ts"],"sourcesContent":["const blacklistedHeaders = new Set([\n // blacklisted headers\n \"connection\",\n \"expect\",\n \"keep-Alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"trailer\",\n \"upgrade\",\n \"x-accel-buffering\",\n \"x-accel-charset\",\n \"x-accel-limit-rate\",\n \"x-accel-redirect\",\n \"x-cache\",\n \"x-forwarded-proto\",\n \"x-real-op\",\n // readonly headers\n \"content-length\",\n \"transfer-encoding\",\n \"via\"\n]);\n\nconst blacklistedHeadersRegex = [/^x-amz-cf-/, /^x-edge-/];\n\n/**\n * Some headers cannot be modified with lambda edge.\n * Source: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html\n */\nexport function isHeaderBlacklisted(header: string) {\n header = header.toLocaleLowerCase();\n return blacklistedHeaders.has(header) || blacklistedHeadersRegex.some(r => r.test(header));\n}\n"],"mappings":"AAAA,MAAMA,kBAAkB,GAAG,IAAIC,GAAG,CAAC;AAC/B;AACA,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,mBAAmB,EACnB,WAAW;AACX;AACA,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,CACR,CAAC;AAEF,MAAMC,uBAAuB,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;;AAE1D;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAACC,MAAc,EAAE;EAChDA,MAAM,GAAGA,MAAM,CAACC,iBAAiB,CAAC,CAAC;EACnC,OAAOL,kBAAkB,CAACM,GAAG,CAACF,MAAM,CAAC,IAAIF,uBAAuB,CAACK,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,CAACL,MAAM,CAAC,CAAC;AAC9F","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontResponse } from "../../lambdaEdge";
1
+ import type { CloudFrontResponse } from "../../lambdaEdge";
2
2
  /**
3
3
  * Load HTML from origin and perform transformation of URLs to absolute
4
4
  * @param domain Domain of the origin cloudfront
@@ -4,6 +4,8 @@ import { parse as parseSrcset, stringify as stringifySrcset } from "srcset";
4
4
  import { isHeaderBlacklisted } from "./headerBlacklist";
5
5
  import { logDebug } from "./log";
6
6
 
7
+ // TODO cheerio does not have Element type, so we define it here
8
+
7
9
  /**
8
10
  * Load HTML from origin and perform transformation of URLs to absolute
9
11
  * @param domain Domain of the origin cloudfront
@@ -98,4 +100,6 @@ function prefixUrl(el, attr, host) {
98
100
  if (href && href.startsWith("/")) {
99
101
  el.attribs[attr] = host + href;
100
102
  }
101
- }
103
+ }
104
+
105
+ //# sourceMappingURL=loadOriginPage.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["get","load","parse","parseSrcset","stringify","stringifySrcset","isHeaderBlacklisted","logDebug","loadOriginPage","domain","path","Promise","resolve","reject","responseBody","req","hostname","port","res","on","chunk","html","parseHtml","response","body","status","statusDescription","headers","header","Object","keys","value","Array","isArray","map","h","key","e","statusCode","message","doc","host","each","_i","el","prefixUrl","find","srcset","attribs","srcsetParsed","srcsetRebased","src","url","startsWith","density","width","attr","href"],"sources":["loadOriginPage.ts"],"sourcesContent":["import { CloudFrontResponse } from \"~/lambdaEdge\";\nimport { get } from \"https\";\nimport { load, Element } from \"cheerio\";\nimport { parse as parseSrcset, stringify as stringifySrcset, SrcSetDefinition } from \"srcset\";\nimport { isHeaderBlacklisted } from \"./headerBlacklist\";\nimport { logDebug } from \"./log\";\n\n/**\n * Load HTML from origin and perform transformation of URLs to absolute\n * @param domain Domain of the origin cloudfront\n * @param path Path of the file we want to retrieve\n * @returns Response object\n */\nexport function loadOriginPage(domain: string, path: string) {\n return new Promise<CloudFrontResponse>((resolve, reject) => {\n logDebug(`Pulling page from ${domain}${path}`);\n let responseBody = \"\";\n const req = get(\n {\n hostname: domain,\n port: 443,\n path: path\n },\n res => {\n res.on(\"data\", chunk => (responseBody += chunk));\n res.on(\"end\", () => {\n logDebug(`Parsing page`);\n const html = parseHtml(responseBody, domain);\n const response: CloudFrontResponse = {\n body: html,\n status: \"200\",\n statusDescription: \"ok\",\n headers: {}\n };\n\n // Rewrite headers from the HTTP response\n for (const header of Object.keys(res.headers)) {\n // We cannot set any header we want.\n // CloudFront is restricting us from setting or changing some headers.\n if (isHeaderBlacklisted(header)) {\n continue;\n }\n\n const value = res.headers[header];\n if (Array.isArray(value)) {\n response.headers[header] = value.map(h => ({\n key: header,\n value: h\n }));\n } else if (value) {\n response.headers[header] = [\n {\n key: header,\n value: value\n }\n ];\n }\n }\n\n logDebug(`Page parsed`);\n resolve(response);\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n\nfunction parseHtml(html: string, domain: string) {\n const doc = load(html);\n const host = `https://${domain}`;\n\n doc(\"head > link\").each((_i, el) => {\n prefixUrl(el, \"href\", host);\n });\n\n doc(\"script\").each((_i, el) => {\n prefixUrl(el, \"src\", host);\n });\n\n doc(\"body\")\n .find(\"img\")\n .each((_i, el) => {\n prefixUrl(el, \"src\", host);\n\n // Handle also srcset property for responsive images.\n const srcset = el.attribs[\"srcset\"];\n if (srcset) {\n const srcsetParsed = parseSrcset(srcset);\n const srcsetRebased = srcsetParsed.map<SrcSetDefinition>(src => {\n if (src.url.startsWith(\"/\")) {\n return {\n url: host + src.url,\n density: src.density,\n width: src.width\n };\n }\n\n return src;\n });\n\n el.attribs[\"srcset\"] = stringifySrcset(srcsetRebased);\n }\n });\n\n return doc.html();\n}\n\nfunction prefixUrl(el: Element, attr: string, host: string) {\n const href = el.attribs[attr];\n if (href && href.startsWith(\"/\")) {\n el.attribs[attr] = host + href;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["get","load","parse","parseSrcset","stringify","stringifySrcset","isHeaderBlacklisted","logDebug","loadOriginPage","domain","path","Promise","resolve","reject","responseBody","req","hostname","port","res","on","chunk","html","parseHtml","response","body","status","statusDescription","headers","header","Object","keys","value","Array","isArray","map","h","key","e","statusCode","message","doc","host","each","_i","el","prefixUrl","find","srcset","attribs","srcsetParsed","srcsetRebased","src","url","startsWith","density","width","attr","href"],"sources":["loadOriginPage.ts"],"sourcesContent":["import type { CloudFrontResponse } from \"~/lambdaEdge\";\nimport { get } from \"https\";\nimport { load } from \"cheerio\";\nimport type { SrcSetDefinition } from \"srcset\";\nimport { parse as parseSrcset, stringify as stringifySrcset } from \"srcset\";\nimport { isHeaderBlacklisted } from \"./headerBlacklist\";\nimport { logDebug } from \"./log\";\n\n// TODO cheerio does not have Element type, so we define it here\ninterface Element {\n attribs: {\n [key: string]: string;\n };\n}\n\n/**\n * Load HTML from origin and perform transformation of URLs to absolute\n * @param domain Domain of the origin cloudfront\n * @param path Path of the file we want to retrieve\n * @returns Response object\n */\nexport function loadOriginPage(domain: string, path: string) {\n return new Promise<CloudFrontResponse>((resolve, reject) => {\n logDebug(`Pulling page from ${domain}${path}`);\n let responseBody = \"\";\n const req = get(\n {\n hostname: domain,\n port: 443,\n path: path\n },\n res => {\n res.on(\"data\", chunk => (responseBody += chunk));\n res.on(\"end\", () => {\n logDebug(`Parsing page`);\n const html = parseHtml(responseBody, domain);\n const response: CloudFrontResponse = {\n body: html,\n status: \"200\",\n statusDescription: \"ok\",\n headers: {}\n };\n\n // Rewrite headers from the HTTP response\n for (const header of Object.keys(res.headers)) {\n // We cannot set any header we want.\n // CloudFront is restricting us from setting or changing some headers.\n if (isHeaderBlacklisted(header)) {\n continue;\n }\n\n const value = res.headers[header];\n if (Array.isArray(value)) {\n response.headers[header] = value.map(h => ({\n key: header,\n value: h\n }));\n } else if (value) {\n response.headers[header] = [\n {\n key: header,\n value: value\n }\n ];\n }\n }\n\n logDebug(`Page parsed`);\n resolve(response);\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n\nfunction parseHtml(html: string, domain: string) {\n const doc = load(html);\n const host = `https://${domain}`;\n\n doc(\"head > link\").each((_i, el) => {\n prefixUrl(el, \"href\", host);\n });\n\n doc(\"script\").each((_i, el) => {\n prefixUrl(el, \"src\", host);\n });\n\n doc(\"body\")\n .find(\"img\")\n .each((_i, el) => {\n prefixUrl(el, \"src\", host);\n\n // Handle also srcset property for responsive images.\n const srcset = el.attribs[\"srcset\"];\n if (srcset) {\n const srcsetParsed = parseSrcset(srcset);\n const srcsetRebased = srcsetParsed.map<SrcSetDefinition>(src => {\n if (src.url.startsWith(\"/\")) {\n return {\n url: host + src.url,\n density: src.density,\n width: src.width\n };\n }\n\n return src;\n });\n\n el.attribs[\"srcset\"] = stringifySrcset(srcsetRebased);\n }\n });\n\n return doc.html();\n}\n\nfunction prefixUrl(el: Element, attr: string, host: string) {\n const href = el.attribs[attr];\n if (href && href.startsWith(\"/\")) {\n el.attribs[attr] = host + href;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,9 @@
1
- import { CloudFrontRequestEvent } from "../../lambdaEdge";
1
+ import type { CloudFrontRequestEvent } from "../../lambdaEdge";
2
2
  export interface VariantConfig {
3
3
  domain: string;
4
4
  weight: number;
5
5
  }
6
- export declare type GatewayConfig = Record<string, VariantConfig>;
6
+ export type GatewayConfig = Record<string, VariantConfig>;
7
7
  /**
8
8
  * Loads traffic splitting config.
9
9
  * It will, however not call WCP directly, but serve it from a locally cached file,
@@ -58,4 +58,6 @@ function loadConfigCore(domain) {
58
58
  function isCacheExpired(timestamp) {
59
59
  const ttl = 60 * 1000; // 1 minute
60
60
  return Date.now() - timestamp > ttl;
61
- }
61
+ }
62
+
63
+ //# sourceMappingURL=loadTrafficSplittingConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["get","logDebug","configPath","configCache","Map","loadTrafficSplittingConfig","event","domain","Records","cf","config","distributionDomainName","isCacheExpired","timestamp","loadConfigCore","Date","now","set","Promise","resolve","reject","dataString","req","hostname","port","path","res","on","chunk","JSON","parse","e","statusCode","body","message","ttl"],"sources":["loadTrafficSplittingConfig.ts"],"sourcesContent":["import { get } from \"https\";\nimport { CloudFrontRequestEvent } from \"~/lambdaEdge\";\nimport { logDebug } from \"./log\";\n\n// Config file has a fixed URL within CDN, so it can be properly cached.\n// This way we achieve better performance, because CDN does not have to call WCP API for config every time,\n// but it can use it's own cache for a lookup.\nconst configPath = \"/_config\";\n\n// Config is locally cached within live lambda for a short time (1 minute).\n// Config must be cached per domain.\n// Otherwise cache will spill over different apps, because we may share this lambda.\nconst configCache = new Map<string, GatewayConfigCache>();\n\ninterface GatewayConfigCache {\n config: GatewayConfig;\n timestamp: number;\n}\n\nexport interface VariantConfig {\n domain: string;\n weight: number;\n}\n\nexport type GatewayConfig = Record<string, VariantConfig>;\n\n/**\n * Loads traffic splitting config.\n * It will, however not call WCP directly, but serve it from a locally cached file,\n * as explained here https://www.notion.so/webiny/How-traffic-config-is-cached-2c8db57ca2b547a2b2fb1adf378cd191\n */\nexport async function loadTrafficSplittingConfig(event: CloudFrontRequestEvent) {\n // Retrieve domain of the CloudFront distribution.\n // We need it to make sure we cache config per application.\n // For example API and website could share the same lambda instance.\n // So we cache it separately for each domain (each CloudFront).\n const domain = event.Records[0].cf.config.distributionDomainName;\n\n let config = configCache.get(domain);\n if (!config || isCacheExpired(config.timestamp)) {\n logDebug(\"No config in cache\");\n config = {\n config: await loadConfigCore(domain),\n timestamp: Date.now()\n };\n\n configCache.set(domain, config);\n }\n\n return config.config;\n}\n\nfunction loadConfigCore(domain: string) {\n return new Promise<GatewayConfig>((resolve, reject) => {\n let dataString = \"\";\n\n const req = get(\n {\n hostname: domain,\n port: 443,\n path: configPath\n },\n function (res) {\n res.on(\"data\", chunk => {\n dataString += chunk;\n });\n res.on(\"end\", () => {\n resolve(JSON.parse(dataString));\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n\nfunction isCacheExpired(timestamp: number) {\n const ttl = 60 * 1000; // 1 minute\n return Date.now() - timestamp > ttl;\n}\n"],"mappings":"AAAA,SAASA,GAAG,QAAQ,OAAO;AAE3B,SAASC,QAAQ;;AAEjB;AACA;AACA;AACA,MAAMC,UAAU,GAAG,UAAU;;AAE7B;AACA;AACA;AACA,MAAMC,WAAW,GAAG,IAAIC,GAAG,EAA8B;AAczD;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,0BAA0B,CAACC,KAA6B,EAAE;EAC5E;EACA;EACA;EACA;EACA,MAAMC,MAAM,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,CAACC,EAAE,CAACC,MAAM,CAACC,sBAAsB;EAEhE,IAAID,MAAM,GAAGP,WAAW,CAACH,GAAG,CAACO,MAAM,CAAC;EACpC,IAAI,CAACG,MAAM,IAAIE,cAAc,CAACF,MAAM,CAACG,SAAS,CAAC,EAAE;IAC7CZ,QAAQ,CAAC,oBAAoB,CAAC;IAC9BS,MAAM,GAAG;MACLA,MAAM,EAAE,MAAMI,cAAc,CAACP,MAAM,CAAC;MACpCM,SAAS,EAAEE,IAAI,CAACC,GAAG;IACvB,CAAC;IAEDb,WAAW,CAACc,GAAG,CAACV,MAAM,EAAEG,MAAM,CAAC;EACnC;EAEA,OAAOA,MAAM,CAACA,MAAM;AACxB;AAEA,SAASI,cAAc,CAACP,MAAc,EAAE;EACpC,OAAO,IAAIW,OAAO,CAAgB,CAACC,OAAO,EAAEC,MAAM,KAAK;IACnD,IAAIC,UAAU,GAAG,EAAE;IAEnB,MAAMC,GAAG,GAAGtB,GAAG,CACX;MACIuB,QAAQ,EAAEhB,MAAM;MAChBiB,IAAI,EAAE,GAAG;MACTC,IAAI,EAAEvB;IACV,CAAC,EACD,UAAUwB,GAAG,EAAE;MACXA,GAAG,CAACC,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAI;QACpBP,UAAU,IAAIO,KAAK;MACvB,CAAC,CAAC;MACFF,GAAG,CAACC,EAAE,CAAC,KAAK,EAAE,MAAM;QAChBR,OAAO,CAACU,IAAI,CAACC,KAAK,CAACT,UAAU,CAAC,CAAC;MACnC,CAAC,CAAC;IACN,CAAC,CACJ;IAEDC,GAAG,CAACK,EAAE,CAAC,OAAO,EAAEI,CAAC,IAAI;MACjBX,MAAM,CAAC;QACHY,UAAU,EAAE,GAAG;QACfC,IAAI,EAAEF,CAAC,CAACG;MACZ,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;AACN;AAEA,SAAStB,cAAc,CAACC,SAAiB,EAAE;EACvC,MAAMsB,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;EACvB,OAAOpB,IAAI,CAACC,GAAG,EAAE,GAAGH,SAAS,GAAGsB,GAAG;AACvC"}
1
+ {"version":3,"names":["get","logDebug","configPath","configCache","Map","loadTrafficSplittingConfig","event","domain","Records","cf","config","distributionDomainName","isCacheExpired","timestamp","loadConfigCore","Date","now","set","Promise","resolve","reject","dataString","req","hostname","port","path","res","on","chunk","JSON","parse","e","statusCode","body","message","ttl"],"sources":["loadTrafficSplittingConfig.ts"],"sourcesContent":["import { get } from \"https\";\nimport type { CloudFrontRequestEvent } from \"~/lambdaEdge\";\nimport { logDebug } from \"./log\";\n\n// Config file has a fixed URL within CDN, so it can be properly cached.\n// This way we achieve better performance, because CDN does not have to call WCP API for config every time,\n// but it can use it's own cache for a lookup.\nconst configPath = \"/_config\";\n\n// Config is locally cached within live lambda for a short time (1 minute).\n// Config must be cached per domain.\n// Otherwise cache will spill over different apps, because we may share this lambda.\nconst configCache = new Map<string, GatewayConfigCache>();\n\ninterface GatewayConfigCache {\n config: GatewayConfig;\n timestamp: number;\n}\n\nexport interface VariantConfig {\n domain: string;\n weight: number;\n}\n\nexport type GatewayConfig = Record<string, VariantConfig>;\n\n/**\n * Loads traffic splitting config.\n * It will, however not call WCP directly, but serve it from a locally cached file,\n * as explained here https://www.notion.so/webiny/How-traffic-config-is-cached-2c8db57ca2b547a2b2fb1adf378cd191\n */\nexport async function loadTrafficSplittingConfig(event: CloudFrontRequestEvent) {\n // Retrieve domain of the CloudFront distribution.\n // We need it to make sure we cache config per application.\n // For example API and website could share the same lambda instance.\n // So we cache it separately for each domain (each CloudFront).\n const domain = event.Records[0].cf.config.distributionDomainName;\n\n let config = configCache.get(domain);\n if (!config || isCacheExpired(config.timestamp)) {\n logDebug(\"No config in cache\");\n config = {\n config: await loadConfigCore(domain),\n timestamp: Date.now()\n };\n\n configCache.set(domain, config);\n }\n\n return config.config;\n}\n\nfunction loadConfigCore(domain: string) {\n return new Promise<GatewayConfig>((resolve, reject) => {\n let dataString = \"\";\n\n const req = get(\n {\n hostname: domain,\n port: 443,\n path: configPath\n },\n function (res) {\n res.on(\"data\", chunk => {\n dataString += chunk;\n });\n res.on(\"end\", () => {\n resolve(JSON.parse(dataString));\n });\n }\n );\n\n req.on(\"error\", e => {\n reject({\n statusCode: 500,\n body: e.message\n });\n });\n });\n}\n\nfunction isCacheExpired(timestamp: number) {\n const ttl = 60 * 1000; // 1 minute\n return Date.now() - timestamp > ttl;\n}\n"],"mappings":"AAAA,SAASA,GAAG,QAAQ,OAAO;AAE3B,SAASC,QAAQ;;AAEjB;AACA;AACA;AACA,MAAMC,UAAU,GAAG,UAAU;;AAE7B;AACA;AACA;AACA,MAAMC,WAAW,GAAG,IAAIC,GAAG,CAA6B,CAAC;AAczD;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,0BAA0BA,CAACC,KAA6B,EAAE;EAC5E;EACA;EACA;EACA;EACA,MAAMC,MAAM,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,CAACC,EAAE,CAACC,MAAM,CAACC,sBAAsB;EAEhE,IAAID,MAAM,GAAGP,WAAW,CAACH,GAAG,CAACO,MAAM,CAAC;EACpC,IAAI,CAACG,MAAM,IAAIE,cAAc,CAACF,MAAM,CAACG,SAAS,CAAC,EAAE;IAC7CZ,QAAQ,CAAC,oBAAoB,CAAC;IAC9BS,MAAM,GAAG;MACLA,MAAM,EAAE,MAAMI,cAAc,CAACP,MAAM,CAAC;MACpCM,SAAS,EAAEE,IAAI,CAACC,GAAG,CAAC;IACxB,CAAC;IAEDb,WAAW,CAACc,GAAG,CAACV,MAAM,EAAEG,MAAM,CAAC;EACnC;EAEA,OAAOA,MAAM,CAACA,MAAM;AACxB;AAEA,SAASI,cAAcA,CAACP,MAAc,EAAE;EACpC,OAAO,IAAIW,OAAO,CAAgB,CAACC,OAAO,EAAEC,MAAM,KAAK;IACnD,IAAIC,UAAU,GAAG,EAAE;IAEnB,MAAMC,GAAG,GAAGtB,GAAG,CACX;MACIuB,QAAQ,EAAEhB,MAAM;MAChBiB,IAAI,EAAE,GAAG;MACTC,IAAI,EAAEvB;IACV,CAAC,EACD,UAAUwB,GAAG,EAAE;MACXA,GAAG,CAACC,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAI;QACpBP,UAAU,IAAIO,KAAK;MACvB,CAAC,CAAC;MACFF,GAAG,CAACC,EAAE,CAAC,KAAK,EAAE,MAAM;QAChBR,OAAO,CAACU,IAAI,CAACC,KAAK,CAACT,UAAU,CAAC,CAAC;MACnC,CAAC,CAAC;IACN,CACJ,CAAC;IAEDC,GAAG,CAACK,EAAE,CAAC,OAAO,EAAEI,CAAC,IAAI;MACjBX,MAAM,CAAC;QACHY,UAAU,EAAE,GAAG;QACfC,IAAI,EAAEF,CAAC,CAACG;MACZ,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;AACN;AAEA,SAAStB,cAAcA,CAACC,SAAiB,EAAE;EACvC,MAAMsB,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;EACvB,OAAOpB,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGH,SAAS,GAAGsB,GAAG;AACvC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { CloudFrontRequestEvent } from "../../lambdaEdge";
1
+ import type { CloudFrontRequestEvent } from "../../lambdaEdge";
2
2
  export declare function loadVariantOrigin(event: CloudFrontRequestEvent): Promise<import("aws-lambda").CloudFrontRequest | import("aws-lambda").CloudFrontResultResponse | {
3
- variant: import("./loadTrafficSplittingConfig").VariantConfig;
3
+ variant: import("../utils/loadTrafficSplittingConfig").VariantConfig;
4
4
  }>;
@@ -65,4 +65,6 @@ function getRandomVariant(config, random) {
65
65
  }
66
66
  }
67
67
  return;
68
- }
68
+ }
69
+
70
+ //# sourceMappingURL=loadVariantOrigin.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getHeader","notFoundResponse","variantFixedKey","variantRandomKey","loadTrafficSplittingConfig","logDebug","loadVariantOrigin","event","cf","Records","request","config","variantFixed","headers","variantConfig","variant","variantRandom","Number","isNaN","getRandomVariant","random","totalWeight","variants","Object","keys","weight"],"sources":["loadVariantOrigin.ts"],"sourcesContent":["import { CloudFrontRequestEvent, getHeader, notFoundResponse } from \"~/lambdaEdge\";\n\nimport { variantFixedKey, variantRandomKey } from \"../utils/common\";\nimport { GatewayConfig, loadTrafficSplittingConfig } from \"../utils/loadTrafficSplittingConfig\";\nimport { logDebug } from \"./log\";\n\nexport async function loadVariantOrigin(event: CloudFrontRequestEvent) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n\n const config = await loadTrafficSplittingConfig(event);\n\n const variantFixed = getHeader(request.headers, variantFixedKey);\n if (variantFixed) {\n const variantConfig = config[variantFixed];\n if (variantConfig) {\n return { variant: variantConfig };\n } else {\n return notFoundResponse(`No variant ${variantFixed} found`);\n }\n }\n\n const variantRandom = Number(getHeader(request.headers, variantRandomKey));\n if (isNaN(variantRandom)) {\n logDebug(\"No random variant passed, passing the request\");\n // Random variant header should be always present.\n // It it's not, something bad happened, so we just pass request further.\n return request;\n }\n\n logDebug(`Variant random ${variantRandom}`);\n\n const variantConfig = getRandomVariant(config, variantRandom);\n if (!variantConfig) {\n // If no variant is matching the random value, just return 404.\n // This should happen only if there is really not a single variant serving traffic.\n logDebug(`No variant is found`);\n return notFoundResponse(`No variant is found`);\n }\n\n return { variant: variantConfig };\n}\n\nfunction getRandomVariant(config: GatewayConfig, random: number) {\n let totalWeight = 0;\n\n const variants = Object.keys(config);\n for (const variant of variants) {\n const variantConfig = config[variant];\n if (variantConfig.weight) {\n // do not count bad or negative weights\n totalWeight += variantConfig.weight;\n }\n }\n\n if (totalWeight <= 0 || random < 0) {\n return;\n }\n\n // Normalize random value to total weight of traffic splitting rates.\n random = (random * totalWeight) / 100;\n\n for (const variant of variants) {\n const variantConfig = config[variant];\n if (!variantConfig.weight) {\n continue;\n }\n\n if (random <= variantConfig.weight) {\n logDebug(`Variant ${variant} selected`);\n return config[variant];\n } else {\n random -= variantConfig.weight;\n }\n }\n\n return;\n}\n"],"mappings":"AAAA,SAAiCA,SAAS,EAAEC,gBAAgB;AAE5D,SAASC,eAAe,EAAEC,gBAAgB;AAC1C,SAAwBC,0BAA0B;AAClD,SAASC,QAAQ;AAEjB,OAAO,eAAeC,iBAAiB,CAACC,KAA6B,EAAE;EACnE,MAAMC,EAAE,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;EAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;EAE1B,MAAMC,MAAM,GAAG,MAAMP,0BAA0B,CAACG,KAAK,CAAC;EAEtD,MAAMK,YAAY,GAAGZ,SAAS,CAACU,OAAO,CAACG,OAAO,EAAEX,eAAe,CAAC;EAChE,IAAIU,YAAY,EAAE;IACd,MAAME,aAAa,GAAGH,MAAM,CAACC,YAAY,CAAC;IAC1C,IAAIE,aAAa,EAAE;MACf,OAAO;QAAEC,OAAO,EAAED;MAAc,CAAC;IACrC,CAAC,MAAM;MACH,OAAOb,gBAAgB,CAAE,cAAaW,YAAa,QAAO,CAAC;IAC/D;EACJ;EAEA,MAAMI,aAAa,GAAGC,MAAM,CAACjB,SAAS,CAACU,OAAO,CAACG,OAAO,EAAEV,gBAAgB,CAAC,CAAC;EAC1E,IAAIe,KAAK,CAACF,aAAa,CAAC,EAAE;IACtBX,QAAQ,CAAC,+CAA+C,CAAC;IACzD;IACA;IACA,OAAOK,OAAO;EAClB;EAEAL,QAAQ,CAAE,kBAAiBW,aAAc,EAAC,CAAC;EAE3C,MAAMF,aAAa,GAAGK,gBAAgB,CAACR,MAAM,EAAEK,aAAa,CAAC;EAC7D,IAAI,CAACF,aAAa,EAAE;IAChB;IACA;IACAT,QAAQ,CAAE,qBAAoB,CAAC;IAC/B,OAAOJ,gBAAgB,CAAE,qBAAoB,CAAC;EAClD;EAEA,OAAO;IAAEc,OAAO,EAAED;EAAc,CAAC;AACrC;AAEA,SAASK,gBAAgB,CAACR,MAAqB,EAAES,MAAc,EAAE;EAC7D,IAAIC,WAAW,GAAG,CAAC;EAEnB,MAAMC,QAAQ,GAAGC,MAAM,CAACC,IAAI,CAACb,MAAM,CAAC;EACpC,KAAK,MAAMI,OAAO,IAAIO,QAAQ,EAAE;IAC5B,MAAMR,aAAa,GAAGH,MAAM,CAACI,OAAO,CAAC;IACrC,IAAID,aAAa,CAACW,MAAM,EAAE;MACtB;MACAJ,WAAW,IAAIP,aAAa,CAACW,MAAM;IACvC;EACJ;EAEA,IAAIJ,WAAW,IAAI,CAAC,IAAID,MAAM,GAAG,CAAC,EAAE;IAChC;EACJ;;EAEA;EACAA,MAAM,GAAIA,MAAM,GAAGC,WAAW,GAAI,GAAG;EAErC,KAAK,MAAMN,OAAO,IAAIO,QAAQ,EAAE;IAC5B,MAAMR,aAAa,GAAGH,MAAM,CAACI,OAAO,CAAC;IACrC,IAAI,CAACD,aAAa,CAACW,MAAM,EAAE;MACvB;IACJ;IAEA,IAAIL,MAAM,IAAIN,aAAa,CAACW,MAAM,EAAE;MAChCpB,QAAQ,CAAE,WAAUU,OAAQ,WAAU,CAAC;MACvC,OAAOJ,MAAM,CAACI,OAAO,CAAC;IAC1B,CAAC,MAAM;MACHK,MAAM,IAAIN,aAAa,CAACW,MAAM;IAClC;EACJ;EAEA;AACJ"}
1
+ {"version":3,"names":["getHeader","notFoundResponse","variantFixedKey","variantRandomKey","loadTrafficSplittingConfig","logDebug","loadVariantOrigin","event","cf","Records","request","config","variantFixed","headers","variantConfig","variant","variantRandom","Number","isNaN","getRandomVariant","random","totalWeight","variants","Object","keys","weight"],"sources":["loadVariantOrigin.ts"],"sourcesContent":["import type { CloudFrontRequestEvent } from \"~/lambdaEdge\";\nimport { getHeader, notFoundResponse } from \"~/lambdaEdge\";\n\nimport { variantFixedKey, variantRandomKey } from \"../utils/common\";\nimport type { GatewayConfig } from \"../utils/loadTrafficSplittingConfig\";\nimport { loadTrafficSplittingConfig } from \"../utils/loadTrafficSplittingConfig\";\nimport { logDebug } from \"./log\";\n\nexport async function loadVariantOrigin(event: CloudFrontRequestEvent) {\n const cf = event.Records[0].cf;\n const request = cf.request;\n\n const config = await loadTrafficSplittingConfig(event);\n\n const variantFixed = getHeader(request.headers, variantFixedKey);\n if (variantFixed) {\n const variantConfig = config[variantFixed];\n if (variantConfig) {\n return { variant: variantConfig };\n } else {\n return notFoundResponse(`No variant ${variantFixed} found`);\n }\n }\n\n const variantRandom = Number(getHeader(request.headers, variantRandomKey));\n if (isNaN(variantRandom)) {\n logDebug(\"No random variant passed, passing the request\");\n // Random variant header should be always present.\n // It it's not, something bad happened, so we just pass request further.\n return request;\n }\n\n logDebug(`Variant random ${variantRandom}`);\n\n const variantConfig = getRandomVariant(config, variantRandom);\n if (!variantConfig) {\n // If no variant is matching the random value, just return 404.\n // This should happen only if there is really not a single variant serving traffic.\n logDebug(`No variant is found`);\n return notFoundResponse(`No variant is found`);\n }\n\n return { variant: variantConfig };\n}\n\nfunction getRandomVariant(config: GatewayConfig, random: number) {\n let totalWeight = 0;\n\n const variants = Object.keys(config);\n for (const variant of variants) {\n const variantConfig = config[variant];\n if (variantConfig.weight) {\n // do not count bad or negative weights\n totalWeight += variantConfig.weight;\n }\n }\n\n if (totalWeight <= 0 || random < 0) {\n return;\n }\n\n // Normalize random value to total weight of traffic splitting rates.\n random = (random * totalWeight) / 100;\n\n for (const variant of variants) {\n const variantConfig = config[variant];\n if (!variantConfig.weight) {\n continue;\n }\n\n if (random <= variantConfig.weight) {\n logDebug(`Variant ${variant} selected`);\n return config[variant];\n } else {\n random -= variantConfig.weight;\n }\n }\n\n return;\n}\n"],"mappings":"AACA,SAASA,SAAS,EAAEC,gBAAgB;AAEpC,SAASC,eAAe,EAAEC,gBAAgB;AAE1C,SAASC,0BAA0B;AACnC,SAASC,QAAQ;AAEjB,OAAO,eAAeC,iBAAiBA,CAACC,KAA6B,EAAE;EACnE,MAAMC,EAAE,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,CAACD,EAAE;EAC9B,MAAME,OAAO,GAAGF,EAAE,CAACE,OAAO;EAE1B,MAAMC,MAAM,GAAG,MAAMP,0BAA0B,CAACG,KAAK,CAAC;EAEtD,MAAMK,YAAY,GAAGZ,SAAS,CAACU,OAAO,CAACG,OAAO,EAAEX,eAAe,CAAC;EAChE,IAAIU,YAAY,EAAE;IACd,MAAME,aAAa,GAAGH,MAAM,CAACC,YAAY,CAAC;IAC1C,IAAIE,aAAa,EAAE;MACf,OAAO;QAAEC,OAAO,EAAED;MAAc,CAAC;IACrC,CAAC,MAAM;MACH,OAAOb,gBAAgB,CAAC,cAAcW,YAAY,QAAQ,CAAC;IAC/D;EACJ;EAEA,MAAMI,aAAa,GAAGC,MAAM,CAACjB,SAAS,CAACU,OAAO,CAACG,OAAO,EAAEV,gBAAgB,CAAC,CAAC;EAC1E,IAAIe,KAAK,CAACF,aAAa,CAAC,EAAE;IACtBX,QAAQ,CAAC,+CAA+C,CAAC;IACzD;IACA;IACA,OAAOK,OAAO;EAClB;EAEAL,QAAQ,CAAC,kBAAkBW,aAAa,EAAE,CAAC;EAE3C,MAAMF,aAAa,GAAGK,gBAAgB,CAACR,MAAM,EAAEK,aAAa,CAAC;EAC7D,IAAI,CAACF,aAAa,EAAE;IAChB;IACA;IACAT,QAAQ,CAAC,qBAAqB,CAAC;IAC/B,OAAOJ,gBAAgB,CAAC,qBAAqB,CAAC;EAClD;EAEA,OAAO;IAAEc,OAAO,EAAED;EAAc,CAAC;AACrC;AAEA,SAASK,gBAAgBA,CAACR,MAAqB,EAAES,MAAc,EAAE;EAC7D,IAAIC,WAAW,GAAG,CAAC;EAEnB,MAAMC,QAAQ,GAAGC,MAAM,CAACC,IAAI,CAACb,MAAM,CAAC;EACpC,KAAK,MAAMI,OAAO,IAAIO,QAAQ,EAAE;IAC5B,MAAMR,aAAa,GAAGH,MAAM,CAACI,OAAO,CAAC;IACrC,IAAID,aAAa,CAACW,MAAM,EAAE;MACtB;MACAJ,WAAW,IAAIP,aAAa,CAACW,MAAM;IACvC;EACJ;EAEA,IAAIJ,WAAW,IAAI,CAAC,IAAID,MAAM,GAAG,CAAC,EAAE;IAChC;EACJ;;EAEA;EACAA,MAAM,GAAIA,MAAM,GAAGC,WAAW,GAAI,GAAG;EAErC,KAAK,MAAMN,OAAO,IAAIO,QAAQ,EAAE;IAC5B,MAAMR,aAAa,GAAGH,MAAM,CAACI,OAAO,CAAC;IACrC,IAAI,CAACD,aAAa,CAACW,MAAM,EAAE;MACvB;IACJ;IAEA,IAAIL,MAAM,IAAIN,aAAa,CAACW,MAAM,EAAE;MAChCpB,QAAQ,CAAC,WAAWU,OAAO,WAAW,CAAC;MACvC,OAAOJ,MAAM,CAACI,OAAO,CAAC;IAC1B,CAAC,MAAM;MACHK,MAAM,IAAIN,aAAa,CAACW,MAAM;IAClC;EACJ;EAEA;AACJ","ignoreList":[]}
@@ -4,4 +4,6 @@ export function logDebug(...args) {
4
4
  if (process.env.DEBUG === "true") {
5
5
  console.log(...args);
6
6
  }
7
- }
7
+ }
8
+
9
+ //# sourceMappingURL=log.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["logDebug","args","process","env","DEBUG","console","log"],"sources":["log.ts"],"sourcesContent":["export function logDebug(...args: any[]) {\n // If DEBUG variable is not set during build,\n // this function should be minified to an empty one and removed completely from the bundle.\n if (process.env.DEBUG === \"true\") {\n console.log(...args);\n }\n}\n"],"mappings":"AAAA,OAAO,SAASA,QAAQ,CAAC,GAAGC,IAAW,EAAE;EACrC;EACA;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,KAAK,KAAK,MAAM,EAAE;IAC9BC,OAAO,CAACC,GAAG,CAAC,GAAGL,IAAI,CAAC;EACxB;AACJ"}
1
+ {"version":3,"names":["logDebug","args","process","env","DEBUG","console","log"],"sources":["log.ts"],"sourcesContent":["export function logDebug(...args: any[]) {\n // If DEBUG variable is not set during build,\n // this function should be minified to an empty one and removed completely from the bundle.\n if (process.env.DEBUG === \"true\") {\n console.log(...args);\n }\n}\n"],"mappings":"AAAA,OAAO,SAASA,QAAQA,CAAC,GAAGC,IAAW,EAAE;EACrC;EACA;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,KAAK,KAAK,MAAM,EAAE;IAC9BC,OAAO,CAACC,GAAG,CAAC,GAAGL,IAAI,CAAC;EACxB;AACJ","ignoreList":[]}