@lighthouse/common 6.2.0-canary.50 → 6.2.0-canary.51
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.
|
@@ -95,16 +95,12 @@ async function requestImageTransformation(path, searchParamsObject) {
|
|
|
95
95
|
path,
|
|
96
96
|
searchParamsObject
|
|
97
97
|
});
|
|
98
|
-
|
|
99
|
-
// TODO: this needs to have queryStringParameters as an object of each of the params, which should be doable as the searchParams of the url
|
|
100
|
-
// the path needs to just be the raw path
|
|
101
|
-
|
|
102
98
|
const lambdaEvent = {
|
|
103
99
|
queryStringParameters: searchParamsObject,
|
|
104
100
|
requestContext: {
|
|
105
101
|
http: {
|
|
106
102
|
method: 'GET',
|
|
107
|
-
path: path
|
|
103
|
+
path: `/${path}`
|
|
108
104
|
}
|
|
109
105
|
}
|
|
110
106
|
};
|
|
@@ -180,7 +176,7 @@ function formatBase64Image({
|
|
|
180
176
|
* @returns {Object} - Object with { path: string, queryString: string }
|
|
181
177
|
* @example
|
|
182
178
|
* parseUrlString("https://example.cloudfront.net/abc123/folder/image.jpeg?width=100&height=100")
|
|
183
|
-
* // Returns: { path: "abc123/folder/image.jpeg", queryString: "width=100
|
|
179
|
+
* // Returns: { path: "abc123/folder/image.jpeg", queryString: "width=100,t=456", searchParamsObject: { width: "100", height: "100" } }
|
|
184
180
|
*/
|
|
185
181
|
function parseUrlString(urlString) {
|
|
186
182
|
if (!urlString || typeof urlString !== 'string') {
|
|
@@ -196,7 +192,8 @@ function parseUrlString(urlString) {
|
|
|
196
192
|
let queryString = url.searchParams.toString();
|
|
197
193
|
queryString = queryString ? queryString.replace(/&/g, ',') : '';
|
|
198
194
|
return {
|
|
199
|
-
path: url.pathname,
|
|
195
|
+
path: url.pathname.substring(1),
|
|
196
|
+
// Remove leading '/'
|
|
200
197
|
queryString,
|
|
201
198
|
searchParamsObject
|
|
202
199
|
};
|
|
@@ -125,15 +125,12 @@ function _requestImageTransformation() {
|
|
|
125
125
|
path: path,
|
|
126
126
|
searchParamsObject: searchParamsObject
|
|
127
127
|
});
|
|
128
|
-
|
|
129
|
-
// TODO: this needs to have queryStringParameters as an object of each of the params, which should be doable as the searchParams of the url
|
|
130
|
-
// the path needs to just be the raw path
|
|
131
128
|
lambdaEvent = {
|
|
132
129
|
queryStringParameters: searchParamsObject,
|
|
133
130
|
requestContext: {
|
|
134
131
|
http: {
|
|
135
132
|
method: 'GET',
|
|
136
|
-
path: path
|
|
133
|
+
path: "/".concat(path)
|
|
137
134
|
}
|
|
138
135
|
}
|
|
139
136
|
};
|
|
@@ -242,7 +239,7 @@ export function formatBase64Image(_ref3) {
|
|
|
242
239
|
* @returns {Object} - Object with { path: string, queryString: string }
|
|
243
240
|
* @example
|
|
244
241
|
* parseUrlString("https://example.cloudfront.net/abc123/folder/image.jpeg?width=100&height=100")
|
|
245
|
-
* // Returns: { path: "abc123/folder/image.jpeg", queryString: "width=100
|
|
242
|
+
* // Returns: { path: "abc123/folder/image.jpeg", queryString: "width=100,t=456", searchParamsObject: { width: "100", height: "100" } }
|
|
246
243
|
*/
|
|
247
244
|
function parseUrlString(urlString) {
|
|
248
245
|
if (!urlString || typeof urlString !== 'string') {
|
|
@@ -258,7 +255,8 @@ function parseUrlString(urlString) {
|
|
|
258
255
|
var queryString = url.searchParams.toString();
|
|
259
256
|
queryString = queryString ? queryString.replace(/&/g, ',') : '';
|
|
260
257
|
return {
|
|
261
|
-
path: url.pathname,
|
|
258
|
+
path: url.pathname.substring(1),
|
|
259
|
+
// Remove leading '/'
|
|
262
260
|
queryString: queryString,
|
|
263
261
|
searchParamsObject: searchParamsObject
|
|
264
262
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["validateBase64Image","AWS","REGION","process","env","AWS_REGION","lambda","Lambda","region","s3","S3","fetchImageForPdfGeneratorService","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","url","urlMatch","applicationId","_parseUrlString","path","queryString","searchParamsObject","transformedBucketImagePath","alreadyTransformedImage","fullDataUrl","transformerResponse","statusCode","_fullDataUrl","redirectLocation","newlyTransformedImage","_fullDataUrl2","_t","wrap","_context","prev","next","console","debug","Error","match","parseUrlString","concat","fetchResourceFromS3","bucketName","S3_BUCKET_IMAGE_TRANSFORMER_CACHE","key","sent","body","formatBase64Image","base64String","toString","abrupt","requestImageTransformation","headers","Location","stop","_x","apply","arguments","_x2","_x3","_requestImageTransformation","_callee2","lambdaEvent","params","result","response","errorMessage","_t2","_context2","queryStringParameters","requestContext","http","method","FunctionName","IMAGE_TRANSFORMER_ARN","InvocationType","Payload","JSON","stringify","invoke","promise","parse","message","error","_x4","_fetchResourceFromS","_callee3","_ref2","_t3","_context3","Bucket","Key","getObject","Body","contentType","ContentType","contentLength","ContentLength","lastModified","LastModified","etag","ETag","code","_ref3","imageType","toLowerCase","includes","base64Flag","isValid","urlString","URL","searchParams","forEach","value","replace","pathname"],"sources":["../../../src/helpers/fetch-image-for-pdf-generator-service/index.js"],"sourcesContent":["import { validateBase64Image } from '../image-validators'\nimport AWS from 'aws-sdk'\nconst REGION = process.env.AWS_REGION\n\nconst lambda = new AWS.Lambda({\n region: REGION,\n})\nconst s3 = new AWS.S3({\n region: REGION,\n})\n\nexport const fetchImageForPdfGeneratorService = async function (url) {\n console.debug(\n 'Fetching image via CloudFront For Serverless Pdf Generator Service'\n )\n\n if (!url) {\n throw new Error('URL is required to fetch image for PDF generator service')\n }\n\n const urlMatch = url && url.match(/([a-f0-9]{24})\\//)\n const applicationId = urlMatch && urlMatch[1]\n\n if (!applicationId) {\n throw new Error('Requestor has insufficient permissions')\n }\n\n const { path, queryString, searchParamsObject } = parseUrlString(url)\n\n const transformedBucketImagePath =\n path + (queryString ? `/${queryString}` : '')\n\n const alreadyTransformedImage = await fetchResourceFromS3({\n bucketName: `${process.env.S3_BUCKET_IMAGE_TRANSFORMER_CACHE}`,\n key: transformedBucketImagePath,\n })\n\n if (alreadyTransformedImage?.body) {\n const fullDataUrl = formatBase64Image({\n base64String: alreadyTransformedImage.body.toString('base64'),\n key: transformedBucketImagePath,\n })\n return fullDataUrl\n }\n\n const transformerResponse = await requestImageTransformation(\n path,\n searchParamsObject\n )\n\n const statusCode = transformerResponse.statusCode\n\n switch (statusCode) {\n case 200: {\n console.debug('Image transformation successful')\n\n const fullDataUrl = formatBase64Image({\n base64String: transformerResponse.body.toString('base64'),\n key: url,\n })\n\n return fullDataUrl\n }\n case 302: {\n console.debug(\n 'Image transformation successful but image is too big for lambda delivery, fetching directly from S3'\n )\n const redirectLocation = transformerResponse.headers.Location\n\n if (!redirectLocation) {\n throw new Error('Redirect response received but no location provided')\n }\n\n const newlyTransformedImage = await fetchResourceFromS3({\n bucketName: `${process.env.S3_BUCKET_IMAGE_TRANSFORMER_CACHE}`,\n key: transformedBucketImagePath,\n })\n console.debug('Image successfully fetched from S3 at:', redirectLocation)\n\n const fullDataUrl = formatBase64Image({\n base64String: newlyTransformedImage.body.toString('base64'),\n key: transformedBucketImagePath,\n })\n\n return fullDataUrl\n }\n case 400:\n throw new Error(\n `Bad request to image transformer: ${transformerResponse.body}`\n )\n case 403:\n throw new Error('Requested transformed image is too big')\n case 404:\n throw new Error('The requested image does not exist')\n case 500:\n throw new Error(\n `Image transformation failed: ${transformerResponse.body}`\n )\n default:\n throw new Error(\n `Unexpected response from image transformer: ${statusCode} - ${transformerResponse.body}`\n )\n }\n}\n\nexport async function requestImageTransformation(path, searchParamsObject) {\n if (!path) {\n throw new Error('Image Path is required for image transformation')\n }\n\n console.debug(\n 'ImageTransformation: Invoking image transformer lambda for path:',\n { path, searchParamsObject }\n )\n\n // TODO: this needs to have queryStringParameters as an object of each of the params, which should be doable as the searchParams of the url\n // the path needs to just be the raw path\n\n const lambdaEvent = {\n queryStringParameters: searchParamsObject,\n requestContext: {\n http: {\n method: 'GET',\n path: path,\n },\n },\n }\n\n const params = {\n FunctionName: process.env.IMAGE_TRANSFORMER_ARN,\n InvocationType: 'RequestResponse',\n Payload: JSON.stringify(lambdaEvent),\n }\n\n try {\n const result = await lambda.invoke(params).promise()\n\n const response = JSON.parse(result.Payload)\n\n return response\n } catch (error) {\n const errorMessage = `Failed to invoke image transformer lambda: ${error.message}`\n console.error(errorMessage, error)\n throw new Error(errorMessage)\n }\n}\n\nexport async function fetchResourceFromS3({ bucketName, key }) {\n console.debug(\n `Fetching resource from S3 Bucket: '${bucketName}' at path: '${key}'`\n )\n if (!bucketName || !key) {\n throw new Error(\n 'bucketName and key are required for S3 resource fetch ' +\n JSON.stringify({ bucketName, key })\n )\n }\n\n const params = {\n Bucket: bucketName,\n Key: key,\n }\n\n try {\n const result = await s3.getObject(params).promise()\n\n return {\n body: result.Body,\n contentType: result.ContentType,\n contentLength: result.ContentLength,\n lastModified: result.LastModified,\n etag: result.ETag,\n }\n } catch (error) {\n if (error.code !== 'NoSuchKey') {\n console.error('Failed to fetch image:', error)\n throw new Error(`Failed to fetch image: ${bucketName}/${key}`)\n }\n\n console.debug('Image not found in transformed bucket, invoking transformer')\n }\n}\n\nexport function formatBase64Image({ base64String, key }) {\n if (!key) {\n throw new Error('Key is required for image formatting')\n }\n\n const imageType = key.toLowerCase().includes('.png') ? 'png' : 'jpeg'\n const base64Flag = `data:image/${imageType};base64,`\n const fullDataUrl = `${base64Flag}${base64String}`\n\n // Validate the formatted data URL\n const isValid = validateBase64Image(fullDataUrl)\n if (!isValid) {\n throw new Error('InvalidImageError')\n }\n\n return fullDataUrl\n}\n\n/**\n * Parses a URL-like string into path and query parameters\n * @param {string} urlString - String like \"https://example.cloudfront.net/<applicationId>/<path>/filename.jpeg?width=100&height=100\"\n * @returns {Object} - Object with { path: string, queryString: string }\n * @example\n * parseUrlString(\"https://example.cloudfront.net/abc123/folder/image.jpeg?width=100&height=100\")\n * // Returns: { path: \"abc123/folder/image.jpeg\", queryString: \"width=100&t=456\" }\n */\nfunction parseUrlString(urlString) {\n if (!urlString || typeof urlString !== 'string') {\n throw new Error('URL string is required and must be a string')\n }\n\n // Extract the path after the domain\n const url = new URL(urlString)\n\n let searchParamsObject = {}\n url.searchParams.forEach((value, key) => {\n searchParamsObject[key] = value\n })\n\n let queryString = url.searchParams.toString()\n queryString = queryString ? queryString.replace(/&/g, ',') : ''\n\n return {\n path: url.pathname,\n queryString,\n searchParamsObject,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["validateBase64Image","AWS","REGION","process","env","AWS_REGION","lambda","Lambda","region","s3","S3","fetchImageForPdfGeneratorService","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","url","urlMatch","applicationId","_parseUrlString","path","queryString","searchParamsObject","transformedBucketImagePath","alreadyTransformedImage","fullDataUrl","transformerResponse","statusCode","_fullDataUrl","redirectLocation","newlyTransformedImage","_fullDataUrl2","_t","wrap","_context","prev","next","console","debug","Error","match","parseUrlString","concat","fetchResourceFromS3","bucketName","S3_BUCKET_IMAGE_TRANSFORMER_CACHE","key","sent","body","formatBase64Image","base64String","toString","abrupt","requestImageTransformation","headers","Location","stop","_x","apply","arguments","_x2","_x3","_requestImageTransformation","_callee2","lambdaEvent","params","result","response","errorMessage","_t2","_context2","queryStringParameters","requestContext","http","method","FunctionName","IMAGE_TRANSFORMER_ARN","InvocationType","Payload","JSON","stringify","invoke","promise","parse","message","error","_x4","_fetchResourceFromS","_callee3","_ref2","_t3","_context3","Bucket","Key","getObject","Body","contentType","ContentType","contentLength","ContentLength","lastModified","LastModified","etag","ETag","code","_ref3","imageType","toLowerCase","includes","base64Flag","isValid","urlString","URL","searchParams","forEach","value","replace","pathname","substring"],"sources":["../../../src/helpers/fetch-image-for-pdf-generator-service/index.js"],"sourcesContent":["import { validateBase64Image } from '../image-validators'\nimport AWS from 'aws-sdk'\nconst REGION = process.env.AWS_REGION\n\nconst lambda = new AWS.Lambda({\n region: REGION,\n})\nconst s3 = new AWS.S3({\n region: REGION,\n})\n\nexport const fetchImageForPdfGeneratorService = async function (url) {\n console.debug(\n 'Fetching image via CloudFront For Serverless Pdf Generator Service'\n )\n\n if (!url) {\n throw new Error('URL is required to fetch image for PDF generator service')\n }\n\n const urlMatch = url && url.match(/([a-f0-9]{24})\\//)\n const applicationId = urlMatch && urlMatch[1]\n\n if (!applicationId) {\n throw new Error('Requestor has insufficient permissions')\n }\n\n const { path, queryString, searchParamsObject } = parseUrlString(url)\n\n const transformedBucketImagePath =\n path + (queryString ? `/${queryString}` : '')\n\n const alreadyTransformedImage = await fetchResourceFromS3({\n bucketName: `${process.env.S3_BUCKET_IMAGE_TRANSFORMER_CACHE}`,\n key: transformedBucketImagePath,\n })\n\n if (alreadyTransformedImage?.body) {\n const fullDataUrl = formatBase64Image({\n base64String: alreadyTransformedImage.body.toString('base64'),\n key: transformedBucketImagePath,\n })\n return fullDataUrl\n }\n\n const transformerResponse = await requestImageTransformation(\n path,\n searchParamsObject\n )\n\n const statusCode = transformerResponse.statusCode\n\n switch (statusCode) {\n case 200: {\n console.debug('Image transformation successful')\n\n const fullDataUrl = formatBase64Image({\n base64String: transformerResponse.body.toString('base64'),\n key: url,\n })\n\n return fullDataUrl\n }\n case 302: {\n console.debug(\n 'Image transformation successful but image is too big for lambda delivery, fetching directly from S3'\n )\n const redirectLocation = transformerResponse.headers.Location\n\n if (!redirectLocation) {\n throw new Error('Redirect response received but no location provided')\n }\n\n const newlyTransformedImage = await fetchResourceFromS3({\n bucketName: `${process.env.S3_BUCKET_IMAGE_TRANSFORMER_CACHE}`,\n key: transformedBucketImagePath,\n })\n console.debug('Image successfully fetched from S3 at:', redirectLocation)\n\n const fullDataUrl = formatBase64Image({\n base64String: newlyTransformedImage.body.toString('base64'),\n key: transformedBucketImagePath,\n })\n\n return fullDataUrl\n }\n case 400:\n throw new Error(\n `Bad request to image transformer: ${transformerResponse.body}`\n )\n case 403:\n throw new Error('Requested transformed image is too big')\n case 404:\n throw new Error('The requested image does not exist')\n case 500:\n throw new Error(\n `Image transformation failed: ${transformerResponse.body}`\n )\n default:\n throw new Error(\n `Unexpected response from image transformer: ${statusCode} - ${transformerResponse.body}`\n )\n }\n}\n\nexport async function requestImageTransformation(path, searchParamsObject) {\n if (!path) {\n throw new Error('Image Path is required for image transformation')\n }\n\n console.debug(\n 'ImageTransformation: Invoking image transformer lambda for path:',\n { path, searchParamsObject }\n )\n\n const lambdaEvent = {\n queryStringParameters: searchParamsObject,\n requestContext: {\n http: {\n method: 'GET',\n path: `/${path}`,\n },\n },\n }\n\n const params = {\n FunctionName: process.env.IMAGE_TRANSFORMER_ARN,\n InvocationType: 'RequestResponse',\n Payload: JSON.stringify(lambdaEvent),\n }\n\n try {\n const result = await lambda.invoke(params).promise()\n\n const response = JSON.parse(result.Payload)\n\n return response\n } catch (error) {\n const errorMessage = `Failed to invoke image transformer lambda: ${error.message}`\n console.error(errorMessage, error)\n throw new Error(errorMessage)\n }\n}\n\nexport async function fetchResourceFromS3({ bucketName, key }) {\n console.debug(\n `Fetching resource from S3 Bucket: '${bucketName}' at path: '${key}'`\n )\n if (!bucketName || !key) {\n throw new Error(\n 'bucketName and key are required for S3 resource fetch ' +\n JSON.stringify({ bucketName, key })\n )\n }\n\n const params = {\n Bucket: bucketName,\n Key: key,\n }\n\n try {\n const result = await s3.getObject(params).promise()\n\n return {\n body: result.Body,\n contentType: result.ContentType,\n contentLength: result.ContentLength,\n lastModified: result.LastModified,\n etag: result.ETag,\n }\n } catch (error) {\n if (error.code !== 'NoSuchKey') {\n console.error('Failed to fetch image:', error)\n throw new Error(`Failed to fetch image: ${bucketName}/${key}`)\n }\n\n console.debug('Image not found in transformed bucket, invoking transformer')\n }\n}\n\nexport function formatBase64Image({ base64String, key }) {\n if (!key) {\n throw new Error('Key is required for image formatting')\n }\n\n const imageType = key.toLowerCase().includes('.png') ? 'png' : 'jpeg'\n const base64Flag = `data:image/${imageType};base64,`\n const fullDataUrl = `${base64Flag}${base64String}`\n\n // Validate the formatted data URL\n const isValid = validateBase64Image(fullDataUrl)\n if (!isValid) {\n throw new Error('InvalidImageError')\n }\n\n return fullDataUrl\n}\n\n/**\n * Parses a URL-like string into path and query parameters\n * @param {string} urlString - String like \"https://example.cloudfront.net/<applicationId>/<path>/filename.jpeg?width=100&height=100\"\n * @returns {Object} - Object with { path: string, queryString: string }\n * @example\n * parseUrlString(\"https://example.cloudfront.net/abc123/folder/image.jpeg?width=100&height=100\")\n * // Returns: { path: \"abc123/folder/image.jpeg\", queryString: \"width=100,t=456\", searchParamsObject: { width: \"100\", height: \"100\" } }\n */\nfunction parseUrlString(urlString) {\n if (!urlString || typeof urlString !== 'string') {\n throw new Error('URL string is required and must be a string')\n }\n\n // Extract the path after the domain\n const url = new URL(urlString)\n\n let searchParamsObject = {}\n url.searchParams.forEach((value, key) => {\n searchParamsObject[key] = value\n })\n\n let queryString = url.searchParams.toString()\n queryString = queryString ? queryString.replace(/&/g, ',') : ''\n\n return {\n path: url.pathname.substring(1), // Remove leading '/'\n queryString,\n searchParamsObject,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|