@webiny/aws-helpers 6.3.0-beta.4 → 6.4.0-beta.0
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.
- package/cloudfrontFunctions/cookies.js +15 -24
- package/cloudfrontFunctions/cookies.js.map +1 -1
- package/cloudfrontFunctions/headers.js +19 -20
- package/cloudfrontFunctions/headers.js.map +1 -1
- package/cloudfrontFunctions/index.js +0 -2
- package/cloudfrontFunctions/querystring.js +14 -24
- package/cloudfrontFunctions/querystring.js.map +1 -1
- package/cloudfrontFunctions/redirect.js +15 -17
- package/cloudfrontFunctions/redirect.js.map +1 -1
- package/cloudfrontFunctions/types.js +0 -3
- package/cloudfrontFunctions/utils.js +6 -19
- package/cloudfrontFunctions/utils.js.map +1 -1
- package/index.js +0 -2
- package/lambdaEdge/cookies.js +16 -17
- package/lambdaEdge/cookies.js.map +1 -1
- package/lambdaEdge/headers.js +7 -4
- package/lambdaEdge/headers.js.map +1 -1
- package/lambdaEdge/index.js +0 -2
- package/lambdaEdge/redirect.js +26 -26
- package/lambdaEdge/redirect.js.map +1 -1
- package/lambdaEdge/request.js +22 -17
- package/lambdaEdge/request.js.map +1 -1
- package/lambdaEdge/response.js +7 -6
- package/lambdaEdge/response.js.map +1 -1
- package/lambdaEdge/types.js +0 -3
- package/lambdaEdge/utils.js +5 -4
- package/lambdaEdge/utils.js.map +1 -1
- package/package.json +3 -3
- package/rslib-runtime.js +14 -0
- package/rslib-runtime.js.map +1 -0
- package/stagedRollouts/functions/adminOriginRequest.js +18 -22
- package/stagedRollouts/functions/adminOriginRequest.js.map +1 -1
- package/stagedRollouts/functions/configOriginRequest.js +44 -46
- package/stagedRollouts/functions/configOriginRequest.js.map +1 -1
- package/stagedRollouts/functions/originRequest.js +11 -10
- package/stagedRollouts/functions/originRequest.js.map +1 -1
- package/stagedRollouts/functions/viewerRequest.js +15 -35
- package/stagedRollouts/functions/viewerRequest.js.map +1 -1
- package/stagedRollouts/functions/viewerResponse.js +8 -10
- package/stagedRollouts/functions/viewerResponse.js.map +1 -1
- package/stagedRollouts/utils/common.js +5 -4
- package/stagedRollouts/utils/common.js.map +1 -1
- package/stagedRollouts/utils/headerBlacklist.js +27 -13
- package/stagedRollouts/utils/headerBlacklist.js.map +1 -1
- package/stagedRollouts/utils/loadOriginPage.js +70 -91
- package/stagedRollouts/utils/loadOriginPage.js.map +1 -1
- package/stagedRollouts/utils/loadTrafficSplittingConfig.js +35 -51
- package/stagedRollouts/utils/loadTrafficSplittingConfig.js.map +1 -1
- package/stagedRollouts/utils/loadVariantOrigin.js +41 -60
- package/stagedRollouts/utils/loadVariantOrigin.js.map +1 -1
- package/stagedRollouts/utils/log.js +3 -6
- package/stagedRollouts/utils/log.js.map +1 -1
- package/cloudfrontFunctions/index.js.map +0 -1
- package/cloudfrontFunctions/types.js.map +0 -1
- package/index.js.map +0 -1
- package/lambdaEdge/index.js.map +0 -1
- package/lambdaEdge/types.js.map +0 -1
|
@@ -2,29 +2,25 @@ import { defineLambdaEdgeRequestHandler, setDomainOrigin } from "../../lambdaEdg
|
|
|
2
2
|
import { pointsToFile } from "../utils/common.js";
|
|
3
3
|
import { loadOriginPage } from "../utils/loadOriginPage.js";
|
|
4
4
|
import { loadVariantOrigin } from "../utils/loadVariantOrigin.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
const adminOriginRequest = defineLambdaEdgeRequestHandler(async (event)=>{
|
|
6
|
+
try {
|
|
7
|
+
const result = await loadVariantOrigin(event);
|
|
8
|
+
if ("variant" in result) {
|
|
9
|
+
const cf = event.Records[0].cf;
|
|
10
|
+
const request = cf.request;
|
|
11
|
+
const variant = result.variant;
|
|
12
|
+
if (pointsToFile(request.uri)) {
|
|
13
|
+
setDomainOrigin(request, variant.domain);
|
|
14
|
+
return request;
|
|
15
|
+
}
|
|
16
|
+
return await loadOriginPage(variant.domain, request.uri);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
} catch (e) {
|
|
20
|
+
console.error(e);
|
|
21
|
+
throw e;
|
|
22
22
|
}
|
|
23
|
-
return result;
|
|
24
|
-
} catch (e) {
|
|
25
|
-
console.error(e);
|
|
26
|
-
throw e;
|
|
27
|
-
}
|
|
28
23
|
});
|
|
24
|
+
export default adminOriginRequest;
|
|
29
25
|
|
|
30
26
|
//# sourceMappingURL=adminOriginRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/functions/adminOriginRequest.js","sources":["../../../src/stagedRollouts/functions/adminOriginRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge/index.js\";\n\nimport { pointsToFile } from \"../utils/common.js\";\nimport { loadOriginPage } from \"../utils/loadOriginPage.js\";\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin.js\";\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"],"names":["defineLambdaEdgeRequestHandler","event","result","loadVariantOrigin","cf","request","variant","pointsToFile","setDomainOrigin","loadOriginPage","e","console"],"mappings":";;;;AAMA,2BAAeA,+BAA+B,OAAMC;IAChD,IAAI;QACA,MAAMC,SAAS,MAAMC,kBAAkBF;QAEvC,IAAI,aAAaC,QAAQ;YACrB,MAAME,KAAKH,MAAM,OAAO,CAAC,EAAE,CAAC,EAAE;YAC9B,MAAMI,UAAUD,GAAG,OAAO;YAC1B,MAAME,UAAUJ,OAAO,OAAO;YAG9B,IAAIK,aAAaF,QAAQ,GAAG,GAAG;gBAC3BG,gBAAgBH,SAASC,QAAQ,MAAM;gBACvC,OAAOD;YACX;YAIA,OAAO,MAAMI,eAAeH,QAAQ,MAAM,EAAED,QAAQ,GAAG;QAC3D;QACA,OAAOH;IACX,EAAE,OAAOQ,GAAG;QACRC,QAAQ,KAAK,CAACD;QACd,MAAMA;IACV;AACJ"}
|
|
@@ -1,54 +1,52 @@
|
|
|
1
1
|
import { defineLambdaEdgeRequestHandler, setHeader } from "../../lambdaEdge/index.js";
|
|
2
2
|
import { get } from "https";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
3
|
+
const configOriginRequest = defineLambdaEdgeRequestHandler(async (event)=>{
|
|
4
|
+
try {
|
|
5
|
+
const configJson = await loadConfigJson(event);
|
|
6
|
+
const response = {
|
|
7
|
+
status: "200",
|
|
8
|
+
statusDescription: "OK",
|
|
9
|
+
headers: {},
|
|
10
|
+
body: configJson
|
|
11
|
+
};
|
|
12
|
+
setHeader(response.headers, {
|
|
13
|
+
key: "Content-Type",
|
|
14
|
+
value: "application/json"
|
|
15
|
+
});
|
|
16
|
+
setHeader(response.headers, {
|
|
17
|
+
key: "Cache-Control",
|
|
18
|
+
value: "public, max-age=31536000"
|
|
19
|
+
});
|
|
20
|
+
return response;
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.error(e);
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
25
25
|
});
|
|
26
26
|
function loadConfigJson(event) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
body: e.message
|
|
49
|
-
});
|
|
27
|
+
return new Promise((resolve, reject)=>{
|
|
28
|
+
let dataString = "";
|
|
29
|
+
const domain = event.Records[0].cf.config.distributionDomainName;
|
|
30
|
+
const req = get({
|
|
31
|
+
hostname: domain,
|
|
32
|
+
port: 443,
|
|
33
|
+
path: "/_config.json"
|
|
34
|
+
}, function(res) {
|
|
35
|
+
res.on("data", (chunk)=>{
|
|
36
|
+
dataString += chunk;
|
|
37
|
+
});
|
|
38
|
+
res.on("end", ()=>{
|
|
39
|
+
resolve(dataString);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
req.on("error", (e)=>{
|
|
43
|
+
reject({
|
|
44
|
+
statusCode: 500,
|
|
45
|
+
body: e.message
|
|
46
|
+
});
|
|
47
|
+
});
|
|
50
48
|
});
|
|
51
|
-
});
|
|
52
49
|
}
|
|
50
|
+
export default configOriginRequest;
|
|
53
51
|
|
|
54
52
|
//# sourceMappingURL=configOriginRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/functions/configOriginRequest.js","sources":["../../../src/stagedRollouts/functions/configOriginRequest.ts"],"sourcesContent":["import type { CloudFrontRequestEvent, CloudFrontResponse } from \"~/lambdaEdge/index.js\";\nimport { defineLambdaEdgeRequestHandler, setHeader } from \"~/lambdaEdge/index.js\";\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"],"names":["defineLambdaEdgeRequestHandler","event","configJson","loadConfigJson","response","setHeader","e","console","Promise","resolve","reject","dataString","domain","req","get","res","chunk"],"mappings":";;AAKA,4BAAeA,+BAA+B,OAAMC;IAChD,IAAI;QACA,MAAMC,aAAa,MAAMC,eAAeF;QACxC,MAAMG,WAA+B;YACjC,QAAQ;YACR,mBAAmB;YACnB,SAAS,CAAC;YACV,MAAMF;QACV;QAEAG,UAAUD,SAAS,OAAO,EAAE;YACxB,KAAK;YACL,OAAO;QACX;QAEAC,UAAUD,SAAS,OAAO,EAAE;YACxB,KAAK;YACL,OAAO;QACX;QAEA,OAAOA;IACX,EAAE,OAAOE,GAAG;QACRC,QAAQ,KAAK,CAACD;QACd,MAAMA;IACV;AACJ;AAEA,SAASH,eAAeF,KAA6B;IACjD,OAAO,IAAIO,QAAgB,CAACC,SAASC;QACjC,IAAIC,aAAa;QAGjB,MAAMC,SAASX,MAAM,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB;QAEhE,MAAMY,MAAMC,IACR;YACI,UAAUF;YACV,MAAM;YAEN,MAAM;QACV,GACA,SAAUG,GAAG;YACTA,IAAI,EAAE,CAAC,QAAQC,CAAAA;gBACXL,cAAcK;YAClB;YACAD,IAAI,EAAE,CAAC,OAAO;gBACVN,QAAQE;YACZ;QACJ;QAGJE,IAAI,EAAE,CAAC,SAASP,CAAAA;YACZI,OAAO;gBACH,YAAY;gBACZ,MAAMJ,EAAE,OAAO;YACnB;QACJ;IACJ;AACJ"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { defineLambdaEdgeRequestHandler, setDomainOrigin } from "../../lambdaEdge/index.js";
|
|
2
2
|
import { loadVariantOrigin } from "../utils/loadVariantOrigin.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
const originRequest = defineLambdaEdgeRequestHandler(async (event)=>{
|
|
4
|
+
const result = await loadVariantOrigin(event);
|
|
5
|
+
if ("variant" in result) {
|
|
6
|
+
const cf = event.Records[0].cf;
|
|
7
|
+
const request = cf.request;
|
|
8
|
+
const variant = result.variant;
|
|
9
|
+
setDomainOrigin(request, variant.domain);
|
|
10
|
+
return request;
|
|
11
|
+
}
|
|
12
|
+
return result;
|
|
13
13
|
});
|
|
14
|
+
export default originRequest;
|
|
14
15
|
|
|
15
16
|
//# sourceMappingURL=originRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/functions/originRequest.js","sources":["../../../src/stagedRollouts/functions/originRequest.ts"],"sourcesContent":["import { defineLambdaEdgeRequestHandler, setDomainOrigin } from \"~/lambdaEdge/index.js\";\n\nimport { loadVariantOrigin } from \"../utils/loadVariantOrigin.js\";\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"],"names":["defineLambdaEdgeRequestHandler","event","result","loadVariantOrigin","cf","request","variant","setDomainOrigin"],"mappings":";;AAIA,sBAAeA,+BAA+B,OAAMC;IAChD,MAAMC,SAAS,MAAMC,kBAAkBF;IAEvC,IAAI,aAAaC,QAAQ;QACrB,MAAME,KAAKH,MAAM,OAAO,CAAC,EAAE,CAAC,EAAE;QAC9B,MAAMI,UAAUD,GAAG,OAAO;QAC1B,MAAME,UAAUJ,OAAO,OAAO;QAE9BK,gBAAgBF,SAASC,QAAQ,MAAM;QACvC,OAAOD;IACX;IAEA,OAAOH;AACX"}
|
|
@@ -1,42 +1,22 @@
|
|
|
1
1
|
import { defineCloudfrontFunctionRequestHandler } from "../../cloudfrontFunctions/index.js";
|
|
2
2
|
import { variantFixedKey, variantRandomKey } from "../utils/common.js";
|
|
3
|
-
defineCloudfrontFunctionRequestHandler(event
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
defineCloudfrontFunctionRequestHandler((event)=>{
|
|
4
|
+
const request = event.request;
|
|
5
|
+
const variantFixed = request.cookies?.[variantFixedKey]?.value || request.headers[variantFixedKey]?.value;
|
|
6
|
+
if (variantFixed) {
|
|
7
|
+
request.headers[variantFixedKey] = {
|
|
8
|
+
value: variantFixed
|
|
9
|
+
};
|
|
10
|
+
delete request.headers[variantRandomKey];
|
|
11
|
+
return request;
|
|
12
|
+
}
|
|
13
|
+
let variantRandom = Number(request.cookies?.[variantRandomKey]?.value);
|
|
14
|
+
if (isNaN(variantRandom) || variantRandom < 1 || variantRandom > 100) variantRandom = Math.floor(100 * Math.random() + 1);
|
|
15
|
+
variantRandom -= variantRandom % 5;
|
|
16
|
+
request.headers[variantRandomKey] = {
|
|
17
|
+
value: variantRandom.toString()
|
|
12
18
|
};
|
|
13
|
-
|
|
14
|
-
// If variant is explicitly selected, remove any random header a user may have passed.
|
|
15
|
-
// We want to have either one or another for better cache hit rate.
|
|
16
|
-
delete request.headers[variantRandomKey];
|
|
17
19
|
return request;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Otherwise we try to retrieve randomized number from user cookie.
|
|
21
|
-
// This random value will be passed further to the origin request to select based on config.
|
|
22
|
-
let variantRandom = Number(request.cookies?.[variantRandomKey]?.value);
|
|
23
|
-
if (isNaN(variantRandom) || variantRandom < 1 || variantRandom > 100) {
|
|
24
|
-
// If no value is present we simply randomize one.
|
|
25
|
-
// This formula gives you an integer 1-100 (inclusive).
|
|
26
|
-
// This way we have exactly 100 possible values.
|
|
27
|
-
// Math.random() return values in range [0, 1) - 0 inclusive, 1 exclusive.
|
|
28
|
-
// So we need to adjust it a litte bit to achieve what we want.
|
|
29
|
-
variantRandom = Math.floor(Math.random() * 100 + 1);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Adjust random value to a specific interval optimize caching.
|
|
33
|
-
// Less possible values means less separate cache entries in CDN an better cache hit ratio.
|
|
34
|
-
// TODO this value can set during deployment, to allow users to decide on trade-off between better caching and finer traffic splitting
|
|
35
|
-
variantRandom -= variantRandom % 5;
|
|
36
|
-
request.headers[variantRandomKey] = {
|
|
37
|
-
value: variantRandom.toString()
|
|
38
|
-
};
|
|
39
|
-
return request;
|
|
40
20
|
});
|
|
41
21
|
|
|
42
22
|
//# sourceMappingURL=viewerRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/functions/viewerRequest.js","sources":["../../../src/stagedRollouts/functions/viewerRequest.ts"],"sourcesContent":["import { defineCloudfrontFunctionRequestHandler } from \"~/cloudfrontFunctions/index.js\";\n\nimport { variantFixedKey, variantRandomKey } from \"../utils/common.js\";\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"],"names":["defineCloudfrontFunctionRequestHandler","event","request","variantFixed","variantFixedKey","variantRandomKey","variantRandom","Number","isNaN","Math"],"mappings":";;AAIAA,uCAAuCC,CAAAA;IACnC,MAAMC,UAAUD,MAAM,OAAO;IAG7B,MAAME,eACFD,QAAQ,OAAO,EAAE,CAACE,gBAAgB,EAAE,SAASF,QAAQ,OAAO,CAACE,gBAAgB,EAAE;IACnF,IAAID,cAAc;QAEdD,QAAQ,OAAO,CAACE,gBAAgB,GAAG;YAC/B,OAAOD;QACX;QAIA,OAAOD,QAAQ,OAAO,CAACG,iBAAiB;QACxC,OAAOH;IACX;IAIA,IAAII,gBAAgBC,OAAOL,QAAQ,OAAO,EAAE,CAACG,iBAAiB,EAAE;IAChE,IAAIG,MAAMF,kBAAkBA,gBAAgB,KAAKA,gBAAgB,KAM7DA,gBAAgBG,KAAK,KAAK,CAACA,AAAgB,MAAhBA,KAAK,MAAM,KAAW;IAMrDH,iBAAiBA,gBAAgB;IAEjCJ,QAAQ,OAAO,CAACG,iBAAiB,GAAG;QAChC,OAAOC,cAAc,QAAQ;IACjC;IAEA,OAAOJ;AACX"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { defineCloudfrontFunctionResponseHandler, setResponseCookie } from "../../cloudfrontFunctions/index.js";
|
|
2
2
|
import { variantRandomKey } from "../utils/common.js";
|
|
3
|
-
defineCloudfrontFunctionResponseHandler(event
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
value: variantRandom
|
|
3
|
+
defineCloudfrontFunctionResponseHandler((event)=>{
|
|
4
|
+
const request = event.request;
|
|
5
|
+
const response = event.response;
|
|
6
|
+
const variantRandom = request.headers[variantRandomKey]?.value;
|
|
7
|
+
if (variantRandom) setResponseCookie(response, {
|
|
8
|
+
name: variantRandomKey,
|
|
9
|
+
value: variantRandom
|
|
11
10
|
});
|
|
12
|
-
|
|
13
|
-
return response;
|
|
11
|
+
return response;
|
|
14
12
|
});
|
|
15
13
|
|
|
16
14
|
//# sourceMappingURL=viewerResponse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/functions/viewerResponse.js","sources":["../../../src/stagedRollouts/functions/viewerResponse.ts"],"sourcesContent":["import {\n defineCloudfrontFunctionResponseHandler,\n setResponseCookie\n} from \"~/cloudfrontFunctions/index.js\";\n\nimport { variantRandomKey } from \"../utils/common.js\";\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"],"names":["defineCloudfrontFunctionResponseHandler","event","request","response","variantRandom","variantRandomKey","setResponseCookie"],"mappings":";;AAOAA,wCAAwCC,CAAAA;IACpC,MAAMC,UAAUD,MAAM,OAAO;IAC7B,MAAME,WAAWF,MAAM,QAAQ;IAE/B,MAAMG,gBAAgBF,QAAQ,OAAO,CAACG,iBAAiB,EAAE;IACzD,IAAID,eACAE,kBAAkBH,UAAU;QACxB,MAAME;QACN,OAAOD;IACX;IAGJ,OAAOD;AACX"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
const variantFixedKey = "webiny-variant-fixed";
|
|
2
|
+
const variantRandomKey = "webiny-variant-random";
|
|
3
|
+
function pointsToFile(uri) {
|
|
4
|
+
return /\/[^/]+\.[^/]+$/.test(uri);
|
|
5
5
|
}
|
|
6
|
+
export { pointsToFile, variantFixedKey, variantRandomKey };
|
|
6
7
|
|
|
7
8
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/utils/common.js","sources":["../../../src/stagedRollouts/utils/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"],"names":["variantFixedKey","variantRandomKey","pointsToFile","uri"],"mappings":"AAAO,MAAMA,kBAAkB;AACxB,MAAMC,mBAAmB;AAEzB,SAASC,aAAaC,GAAW;IACpC,OAAO,kBAAkB,IAAI,CAACA;AAClC"}
|
|
@@ -1,17 +1,31 @@
|
|
|
1
1
|
const blacklistedHeaders = new Set([
|
|
2
|
-
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
"connection",
|
|
3
|
+
"expect",
|
|
4
|
+
"keep-Alive",
|
|
5
|
+
"proxy-authenticate",
|
|
6
|
+
"proxy-authorization",
|
|
7
|
+
"proxy-connection",
|
|
8
|
+
"trailer",
|
|
9
|
+
"upgrade",
|
|
10
|
+
"x-accel-buffering",
|
|
11
|
+
"x-accel-charset",
|
|
12
|
+
"x-accel-limit-rate",
|
|
13
|
+
"x-accel-redirect",
|
|
14
|
+
"x-cache",
|
|
15
|
+
"x-forwarded-proto",
|
|
16
|
+
"x-real-op",
|
|
17
|
+
"content-length",
|
|
18
|
+
"transfer-encoding",
|
|
19
|
+
"via"
|
|
20
|
+
]);
|
|
21
|
+
const blacklistedHeadersRegex = [
|
|
22
|
+
/^x-amz-cf-/,
|
|
23
|
+
/^x-edge-/
|
|
24
|
+
];
|
|
25
|
+
function isHeaderBlacklisted(header) {
|
|
26
|
+
header = header.toLocaleLowerCase();
|
|
27
|
+
return blacklistedHeaders.has(header) || blacklistedHeadersRegex.some((r)=>r.test(header));
|
|
15
28
|
}
|
|
29
|
+
export { isHeaderBlacklisted };
|
|
16
30
|
|
|
17
31
|
//# sourceMappingURL=headerBlacklist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"stagedRollouts/utils/headerBlacklist.js","sources":["../../../src/stagedRollouts/utils/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"],"names":["blacklistedHeaders","Set","blacklistedHeadersRegex","isHeaderBlacklisted","header","r"],"mappings":"AAAA,MAAMA,qBAAqB,IAAIC,IAAI;IAE/B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;CACH;AAED,MAAMC,0BAA0B;IAAC;IAAc;CAAW;AAMnD,SAASC,oBAAoBC,MAAc;IAC9CA,SAASA,OAAO,iBAAiB;IACjC,OAAOJ,mBAAmB,GAAG,CAACI,WAAWF,wBAAwB,IAAI,CAACG,CAAAA,IAAKA,EAAE,IAAI,CAACD;AACtF"}
|
|
@@ -3,103 +3,82 @@ import { load } from "cheerio";
|
|
|
3
3
|
import { parseSrcset, stringifySrcset } from "srcset";
|
|
4
4
|
import { isHeaderBlacklisted } from "./headerBlacklist.js";
|
|
5
5
|
import { logDebug } from "./log.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
response.headers[header] = [{
|
|
50
|
-
key: header,
|
|
51
|
-
value: value
|
|
52
|
-
}];
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
logDebug(`Page parsed`);
|
|
56
|
-
resolve(response);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
req.on("error", e => {
|
|
60
|
-
reject({
|
|
61
|
-
statusCode: 500,
|
|
62
|
-
body: e.message
|
|
63
|
-
});
|
|
6
|
+
function loadOriginPage(domain, path) {
|
|
7
|
+
return new Promise((resolve, reject)=>{
|
|
8
|
+
logDebug(`Pulling page from ${domain}${path}`);
|
|
9
|
+
let responseBody = "";
|
|
10
|
+
const req = get({
|
|
11
|
+
hostname: domain,
|
|
12
|
+
port: 443,
|
|
13
|
+
path: path
|
|
14
|
+
}, (res)=>{
|
|
15
|
+
res.on("data", (chunk)=>responseBody += chunk);
|
|
16
|
+
res.on("end", ()=>{
|
|
17
|
+
logDebug("Parsing page");
|
|
18
|
+
const html = parseHtml(responseBody, domain);
|
|
19
|
+
const response = {
|
|
20
|
+
body: html,
|
|
21
|
+
status: "200",
|
|
22
|
+
statusDescription: "ok",
|
|
23
|
+
headers: {}
|
|
24
|
+
};
|
|
25
|
+
for (const header of Object.keys(res.headers)){
|
|
26
|
+
if (isHeaderBlacklisted(header)) continue;
|
|
27
|
+
const value = res.headers[header];
|
|
28
|
+
if (Array.isArray(value)) response.headers[header] = value.map((h)=>({
|
|
29
|
+
key: header,
|
|
30
|
+
value: h
|
|
31
|
+
}));
|
|
32
|
+
else if (value) response.headers[header] = [
|
|
33
|
+
{
|
|
34
|
+
key: header,
|
|
35
|
+
value: value
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
logDebug("Page parsed");
|
|
40
|
+
resolve(response);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
req.on("error", (e)=>{
|
|
44
|
+
reject({
|
|
45
|
+
statusCode: 500,
|
|
46
|
+
body: e.message
|
|
47
|
+
});
|
|
48
|
+
});
|
|
64
49
|
});
|
|
65
|
-
});
|
|
66
50
|
}
|
|
67
51
|
function parseHtml(html, domain) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
52
|
+
const doc = load(html);
|
|
53
|
+
const host = `https://${domain}`;
|
|
54
|
+
doc("head > link").each((_i, el)=>{
|
|
55
|
+
prefixUrl(el, "href", host);
|
|
56
|
+
});
|
|
57
|
+
doc("script").each((_i, el)=>{
|
|
58
|
+
prefixUrl(el, "src", host);
|
|
59
|
+
});
|
|
60
|
+
doc("body").find("img").each((_i, el)=>{
|
|
61
|
+
prefixUrl(el, "src", host);
|
|
62
|
+
const srcset = el.attribs["srcset"];
|
|
63
|
+
if (srcset) {
|
|
64
|
+
const srcsetParsed = parseSrcset(srcset);
|
|
65
|
+
const srcsetRebased = srcsetParsed.map((src)=>{
|
|
66
|
+
if (src.url.startsWith("/")) return {
|
|
67
|
+
url: host + src.url,
|
|
68
|
+
density: src.density,
|
|
69
|
+
width: src.width
|
|
70
|
+
};
|
|
71
|
+
return src;
|
|
72
|
+
});
|
|
73
|
+
el.attribs["srcset"] = stringifySrcset(srcsetRebased);
|
|
90
74
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
el.attribs["srcset"] = stringifySrcset(srcsetRebased);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
return doc.html();
|
|
75
|
+
});
|
|
76
|
+
return doc.html();
|
|
97
77
|
}
|
|
98
78
|
function prefixUrl(el, attr, host) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
el.attribs[attr] = host + href;
|
|
102
|
-
}
|
|
79
|
+
const href = el.attribs[attr];
|
|
80
|
+
if (href && href.startsWith("/")) el.attribs[attr] = host + href;
|
|
103
81
|
}
|
|
82
|
+
export { loadOriginPage };
|
|
104
83
|
|
|
105
84
|
//# sourceMappingURL=loadOriginPage.js.map
|