@aspan-corporation/ac-shared 1.2.3 → 1.2.6
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/lib/index.js +110 -31
- package/lib/index.js.map +4 -4
- package/lib/lambda/index.d.ts +13 -14
- package/lib/utils/index.d.ts +1 -1
- package/package.json +2 -1
- package/lib/utils/assertUtils.d.ts +0 -2
package/lib/index.js
CHANGED
|
@@ -10,17 +10,8 @@ import { Upload } from "@aws-sdk/lib-storage";
|
|
|
10
10
|
import assert3 from "node:assert/strict";
|
|
11
11
|
import { PassThrough } from "node:stream";
|
|
12
12
|
|
|
13
|
-
// src/utils/
|
|
14
|
-
import
|
|
15
|
-
var assertEnvVar = (envVar) => {
|
|
16
|
-
assert(process.env[envVar], `${envVar} is not set`);
|
|
17
|
-
return process.env[envVar];
|
|
18
|
-
};
|
|
19
|
-
var assertString = (value) => {
|
|
20
|
-
assert(typeof value === "string", "Value is not a string");
|
|
21
|
-
assert(value.length > 0, "Value is empty");
|
|
22
|
-
return value;
|
|
23
|
-
};
|
|
13
|
+
// src/utils/index.ts
|
|
14
|
+
import assert2 from "node:assert/strict";
|
|
24
15
|
|
|
25
16
|
// src/utils/normalizeErrorMessage.ts
|
|
26
17
|
var normalizeErrorMessage = (error) => {
|
|
@@ -84,7 +75,7 @@ var getObjectWithAssumeRoleCommandOutputAttribute = (assumeRoleCommandOutput) =>
|
|
|
84
75
|
var getObjectWithStackAttribute = (error) => error && error instanceof Error ? { stack: error.stack } : {};
|
|
85
76
|
|
|
86
77
|
// src/utils/processMeta.ts
|
|
87
|
-
import
|
|
78
|
+
import assert from "node:assert/strict";
|
|
88
79
|
var processMeta = async ({
|
|
89
80
|
id,
|
|
90
81
|
meta,
|
|
@@ -171,7 +162,7 @@ var extractMetaFromKey = (key) => {
|
|
|
171
162
|
let firstToken = void 0;
|
|
172
163
|
try {
|
|
173
164
|
const folder = key.split("/").at(-2);
|
|
174
|
-
|
|
165
|
+
assert(typeof folder === "string");
|
|
175
166
|
firstToken = folder.split(".")[0];
|
|
176
167
|
} catch (error) {
|
|
177
168
|
}
|
|
@@ -196,6 +187,12 @@ var extractMetaFromKey = (key) => {
|
|
|
196
187
|
];
|
|
197
188
|
};
|
|
198
189
|
|
|
190
|
+
// src/utils/index.ts
|
|
191
|
+
var assertEnvVar = (envVar) => {
|
|
192
|
+
assert2(process.env[envVar], `${envVar} is not set`);
|
|
193
|
+
return process.env[envVar];
|
|
194
|
+
};
|
|
195
|
+
|
|
199
196
|
// src/services/s3.ts
|
|
200
197
|
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
201
198
|
var S3Service = class {
|
|
@@ -505,13 +502,19 @@ var LocationService = class {
|
|
|
505
502
|
};
|
|
506
503
|
|
|
507
504
|
// src/lambda/index.ts
|
|
508
|
-
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
|
|
509
505
|
import { IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
|
|
506
|
+
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
|
|
507
|
+
import { Logger as Logger2 } from "@aws-lambda-powertools/logger";
|
|
508
|
+
import { injectLambdaContext } from "@aws-lambda-powertools/logger/middleware";
|
|
509
|
+
import { Metrics } from "@aws-lambda-powertools/metrics";
|
|
510
|
+
import { logMetrics } from "@aws-lambda-powertools/metrics/middleware";
|
|
511
|
+
import { Tracer } from "@aws-lambda-powertools/tracer";
|
|
512
|
+
import { captureLambdaHandler } from "@aws-lambda-powertools/tracer/middleware";
|
|
510
513
|
|
|
511
514
|
// node_modules/@middy/core/index.js
|
|
512
515
|
import { Readable } from "node:stream";
|
|
513
516
|
import { pipeline } from "node:stream/promises";
|
|
514
|
-
import { setTimeout } from "node:timers/promises";
|
|
517
|
+
import { setTimeout as setTimeout2 } from "node:timers/promises";
|
|
515
518
|
var defaultLambdaHandler = () => {
|
|
516
519
|
};
|
|
517
520
|
var defaultPlugin = {
|
|
@@ -632,7 +635,7 @@ var runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewa
|
|
|
632
635
|
lambdaHandler(request.event, request.context, {
|
|
633
636
|
signal: handlerAbort.signal
|
|
634
637
|
}),
|
|
635
|
-
timeoutEarly ?
|
|
638
|
+
timeoutEarly ? setTimeout2(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, void 0, {
|
|
636
639
|
signal: timeoutAbort.signal
|
|
637
640
|
}).then(() => {
|
|
638
641
|
handlerAbort.abort();
|
|
@@ -675,26 +678,103 @@ var runMiddlewares = async (request, middlewares, plugin) => {
|
|
|
675
678
|
var core_default = middy;
|
|
676
679
|
|
|
677
680
|
// src/lambda/index.ts
|
|
678
|
-
import {
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
681
|
+
import { randomUUID } from "node:crypto";
|
|
682
|
+
|
|
683
|
+
// node_modules/@middy/util/index.js
|
|
684
|
+
var jsonSafeParse = (text, reviver) => {
|
|
685
|
+
if (typeof text !== "string")
|
|
686
|
+
return text;
|
|
687
|
+
const firstChar = text[0];
|
|
688
|
+
if (firstChar !== "{" && firstChar !== "[" && firstChar !== '"')
|
|
689
|
+
return text;
|
|
690
|
+
try {
|
|
691
|
+
return JSON.parse(text, reviver);
|
|
692
|
+
} catch (_e) {
|
|
693
|
+
}
|
|
694
|
+
return text;
|
|
695
|
+
};
|
|
696
|
+
var normalizeHttpResponse = (request) => {
|
|
697
|
+
let { response } = request;
|
|
698
|
+
if (typeof response === "undefined") {
|
|
699
|
+
response = {};
|
|
700
|
+
} else if (typeof response?.statusCode === "undefined" && typeof response?.body === "undefined" && typeof response?.headers === "undefined") {
|
|
701
|
+
response = { statusCode: 200, body: response };
|
|
702
|
+
}
|
|
703
|
+
response.statusCode ??= 500;
|
|
704
|
+
response.headers ??= {};
|
|
705
|
+
request.response = response;
|
|
706
|
+
return response;
|
|
707
|
+
};
|
|
708
|
+
|
|
709
|
+
// node_modules/@middy/http-error-handler/index.js
|
|
710
|
+
var defaults = {
|
|
711
|
+
logger: console.error,
|
|
712
|
+
// TODO v7 change to pass in request
|
|
713
|
+
fallbackMessage: void 0
|
|
714
|
+
};
|
|
715
|
+
var httpErrorHandlerMiddleware = (opts = {}) => {
|
|
716
|
+
const options = { ...defaults, ...opts };
|
|
717
|
+
const httpErrorHandlerMiddlewareOnError = async (request) => {
|
|
718
|
+
if (request.response !== void 0)
|
|
719
|
+
return;
|
|
720
|
+
if (typeof options.logger === "function") {
|
|
721
|
+
options.logger(request.error);
|
|
722
|
+
}
|
|
723
|
+
if (request.error.statusCode && request.error.expose === void 0) {
|
|
724
|
+
request.error.expose = request.error.statusCode < 500;
|
|
725
|
+
}
|
|
726
|
+
if (!request.error.expose || !request.error.statusCode) {
|
|
727
|
+
request.error = {
|
|
728
|
+
statusCode: 500,
|
|
729
|
+
message: options.fallbackMessage,
|
|
730
|
+
expose: true
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
if (request.error.expose) {
|
|
734
|
+
normalizeHttpResponse(request);
|
|
735
|
+
const { statusCode, message, headers } = request.error;
|
|
736
|
+
request.response = {
|
|
737
|
+
...request.response,
|
|
738
|
+
statusCode,
|
|
739
|
+
headers: {
|
|
740
|
+
...request.response.headers,
|
|
741
|
+
...headers
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
if (message) {
|
|
745
|
+
const headerContentType = typeof jsonSafeParse(message) === "string" ? "text/plain" : "application/json";
|
|
746
|
+
request.response.body = message;
|
|
747
|
+
request.response.headers["Content-Type"] = headerContentType;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
};
|
|
751
|
+
return {
|
|
752
|
+
onError: httpErrorHandlerMiddlewareOnError
|
|
753
|
+
};
|
|
754
|
+
};
|
|
755
|
+
var http_error_handler_default = httpErrorHandlerMiddleware;
|
|
756
|
+
|
|
757
|
+
// src/lambda/index.ts
|
|
758
|
+
var logger = new Logger2();
|
|
759
|
+
var tracer = new Tracer();
|
|
760
|
+
var metrics = new Metrics();
|
|
761
|
+
var withMiddlewares = (handler) => core_default(handler).use(injectLambdaContext(logger)).use(captureLambdaHandler(tracer)).use(logMetrics(metrics, { captureColdStartMetric: true })).use({
|
|
685
762
|
before: async (request) => {
|
|
686
|
-
logger.
|
|
687
|
-
request.context.awsRequestId ||
|
|
688
|
-
|
|
763
|
+
if (!logger.getCorrelationId()) {
|
|
764
|
+
logger.setCorrelationId(request.context.awsRequestId || randomUUID());
|
|
765
|
+
}
|
|
689
766
|
logger.logEventIfEnabled(request.event);
|
|
690
767
|
request.context.logger = logger;
|
|
691
768
|
request.context.tracer = tracer;
|
|
692
769
|
request.context.metrics = metrics;
|
|
693
770
|
}
|
|
694
|
-
})
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
771
|
+
}).use({
|
|
772
|
+
onError: async ({ error, context }) => {
|
|
773
|
+
context.logger.error("Error handled by middleware", {
|
|
774
|
+
error
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
}).use(http_error_handler_default());
|
|
698
778
|
var getPersistenceStore = () => {
|
|
699
779
|
return new DynamoDBPersistenceLayer({
|
|
700
780
|
tableName: assertEnvVar("AC_IDEMPOTENCY_TABLE_NAME")
|
|
@@ -727,7 +807,6 @@ export {
|
|
|
727
807
|
THUMBNAIL_RESOLUTIONS,
|
|
728
808
|
THUMBS_EXTENSION,
|
|
729
809
|
assertEnvVar,
|
|
730
|
-
assertString,
|
|
731
810
|
getEncodedVideoKey,
|
|
732
811
|
getIdempotencyConfig,
|
|
733
812
|
getKeyExtension,
|
package/lib/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/services/s3.ts", "../src/utils/
|
|
4
|
-
"sourcesContent": ["import {\n GetObjectCommand,\n GetObjectCommandInput,\n HeadObjectCommand,\n HeadObjectCommandInput,\n ListObjectsV2Command,\n ListObjectsV2CommandInput,\n PutObjectCommand,\n PutObjectCommandInput,\n PutObjectCommandOutput,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport { Upload } from \"@aws-sdk/lib-storage\";\nimport assert from \"node:assert/strict\";\nimport { PassThrough } from \"node:stream\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class S3Service {\n logger: Logger;\n client: S3Client;\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: S3Client;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new S3Client({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n createS3UploadStream(putObjectCommandInput: PutObjectCommandInput) {\n this.logger.debug(\"upload stream started\", { putObjectCommandInput });\n\n const pass = new PassThrough();\n\n const parallelUploads = new Upload({\n client: this.client,\n params: {\n ...putObjectCommandInput,\n Body: pass\n }\n });\n\n const donePromise = parallelUploads\n .done()\n .then(() => this.logger.debug(\"upload stream finished\"))\n .catch((err) => {\n this.logger.error(\"upload stream error\", err);\n pass.destroy(err);\n });\n\n return { stream: pass, done: donePromise };\n }\n\n async createS3DownloadStream(getObjectCommandInput: GetObjectCommandInput) {\n this.logger.debug(\"download stream started\", { getObjectCommandInput });\n\n const item = await this.client.send(\n new GetObjectCommand(getObjectCommandInput)\n );\n\n this.logger.debug(\"download stream finished\");\n\n return item.Body;\n }\n\n async listObjectsV2(listObjectsV2CommandInput: ListObjectsV2CommandInput) {\n this.logger.debug(\"listObjectsV2\", { listObjectsV2CommandInput });\n return await this.client.send(\n new ListObjectsV2Command(listObjectsV2CommandInput)\n );\n }\n\n async getObject(\n getObjectCommandInput: GetObjectCommandInput\n ): Promise<Buffer> {\n this.logger.debug(\"getObject\", { getObjectCommandInput });\n\n const stream = await this.createS3DownloadStream(getObjectCommandInput);\n\n return Buffer.from(await stream.transformToByteArray());\n }\n\n async getSignedUrl(\n getObjectCommandInput: GetObjectCommandInput\n ): Promise<string> {\n this.logger.debug(\"getSignedUrl\", { getObjectCommandInput });\n\n const signedUrl = await getSignedUrl(\n this.client,\n new GetObjectCommand(getObjectCommandInput),\n { expiresIn: 3600 }\n );\n\n return signedUrl;\n }\n\n async putObject(\n putObjectCommandInput: PutObjectCommandInput\n ): Promise<PutObjectCommandOutput> {\n this.logger.debug(\"putObject\", { putObjectCommandInput });\n\n return await this.client.send(new PutObjectCommand(putObjectCommandInput));\n }\n\n async headObject(headObjectCommandInput: HeadObjectCommandInput) {\n this.logger.debug(\"headObject\", { headObjectCommandInput });\n return await this.client.send(\n new HeadObjectCommand(headObjectCommandInput)\n );\n }\n\n async checkIfObjectExists(\n headObjectCommandInput: HeadObjectCommandInput\n ): Promise<boolean> {\n this.logger.debug(\"checkIfObjectExists\", { headObjectCommandInput });\n\n try {\n await this.headObject(headObjectCommandInput);\n return true;\n } catch (error) {\n if (error.name === \"NotFound\") {\n return false;\n }\n throw error;\n }\n }\n}\n", "import assert from \"node:assert/strict\";\n\nexport const assertEnvVar = (envVar: string): string => {\n assert(process.env[envVar], `${envVar} is not set`);\n return process.env[envVar];\n};\n\nexport const assertString = (value: string | undefined): string => {\n assert(typeof value === \"string\", \"Value is not a string\");\n assert(value.length > 0, \"Value is empty\");\n return value;\n};\n", "export const normalizeErrorMessage = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n } else if (typeof error === \"string\") {\n return error;\n } else if (typeof error === \"object\" && error !== null) {\n return JSON.stringify(error);\n } else {\n return String(error);\n }\n};\n", "import { extname } from \"node:path\";\n\nexport const JPEG_EXTENSION = \"jpeg\";\nexport const JPG_EXTENSION = \"jpg\";\nexport const HEIC_EXTENSION = \"heic\";\nexport const MOV_EXTENSION = \"mov\";\nexport const THUMBS_EXTENSION = JPG_EXTENSION;\nexport const ENCODED_VIDEO_EXTENSION = \"mp4\";\nexport const ALLOWED_EXTENSIONS = [\n JPEG_EXTENSION,\n JPG_EXTENSION,\n HEIC_EXTENSION\n];\nexport const ALLOWED_VIDEO_EXTENSIONS = [MOV_EXTENSION];\n\nexport const THUMBNAIL_RESOLUTIONS = [\n [200, 200],\n [1180, 820]\n];\n\nexport const getThumbsKey = ({\n key,\n width,\n height\n}: {\n key: string;\n width: number;\n height: number;\n}) => {\n return `${key\n .split(\".\")\n .slice(0, -1)\n .join(\".\")}.${width}x${height}.${THUMBS_EXTENSION}`;\n};\n\nexport const getEncodedVideoKey = ({ key }: { key: string }) => {\n return `${key.split(\".\").slice(0, -1).join(\".\")}.${ENCODED_VIDEO_EXTENSION}`;\n};\n\nexport const getKeyExtension = (key: string) =>\n extname(key).slice(1).toLowerCase();\n\nexport const isAllowedExtension = (key: string) => {\n const ext = getKeyExtension(key);\n return ALLOWED_EXTENSIONS.includes(ext);\n};\n\nexport const isAllowedVideoExtension = (key: string) => {\n const ext = getKeyExtension(key);\n return ALLOWED_VIDEO_EXTENSIONS.includes(ext);\n};\n", "import { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\n\nexport const getObjectWithAssumeRoleCommandOutputAttribute = (\n assumeRoleCommandOutput?: AssumeRoleCommandOutput\n) =>\n assumeRoleCommandOutput\n ? {\n credentials: {\n accessKeyId: assumeRoleCommandOutput?.Credentials?.AccessKeyId,\n secretAccessKey:\n assumeRoleCommandOutput?.Credentials?.SecretAccessKey,\n sessionToken: assumeRoleCommandOutput?.Credentials?.SessionToken\n }\n }\n : {};\n\nexport const getObjectWithStackAttribute = (error: any) =>\n error && error instanceof Error ? { stack: error.stack } : {};\n", "import { DynamoDBService, LocationService } from \"../services/index.js\";\nimport type { SearchForPositionResult } from \"@aws-sdk/client-location\";\nimport assert from \"node:assert/strict\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\nimport { getKeyExtension } from \"./thumbsKey.js\";\n\ntype ExtractMetadataParams = {\n id: string;\n meta: Array<{ key: string; value: string }>;\n logger: Logger;\n locationService: LocationService;\n dynamoDBService: DynamoDBService;\n metaTableName: string;\n size: number;\n};\n\ntype Tag = { key: string; value: string };\n\n/**\n * 1. read <id>\n * 2. if <id> doesn't exist then use PutCommand\n * 3. if it does exist then match new tags and old tags\n * 4. add all old tags that are not present in new tags,\n *\n */\nexport const processMeta = async ({\n id,\n meta,\n metaTableName,\n size,\n logger,\n locationService,\n dynamoDBService\n}: ExtractMetadataParams) => {\n // expand location data\n const latitude = Number(meta.find((tag) => tag.key === \"latitude\")?.value);\n const longitude = Number(meta.find((tag) => tag.key === \"longitude\")?.value);\n\n let geoPositionResult: SearchForPositionResult | undefined;\n if (!Number.isNaN(longitude) && !Number.isNaN(latitude)) {\n try {\n const res = await locationService.searchPlaceIndexForPositionCommand({\n IndexName: \"TauPlaceIndex\",\n Position: [longitude, latitude]\n });\n\n if (res?.Results && res?.Results?.length > 0) {\n geoPositionResult = res?.Results[0];\n } else {\n throw Error(\"Can not resolve geo data\");\n }\n } catch (error) {\n logger.error(\"Error fetching geo data\", {\n message: error instanceof Error ? error.message : \"\"\n });\n }\n }\n\n const newTags = [\n ...meta,\n ...(meta.find((tag) => tag.key === \"dateCreated\")\n ? []\n : extractMetaFromKey(id)),\n { key: \"extension\", value: getKeyExtension(id) },\n { key: \"size\", value: String(size) },\n { key: \"sizeMb\", value: String(Math.round(size / 1024 ** 2)) },\n ...(geoPositionResult?.Place?.Label\n ? [{ key: \"label\", value: geoPositionResult?.Place?.Label }]\n : []),\n ...(geoPositionResult?.Place?.Country\n ? [{ key: \"country\", value: geoPositionResult?.Place?.Country }]\n : []),\n ...(geoPositionResult?.Place?.Region\n ? [{ key: \"region\", value: geoPositionResult?.Place?.Region }]\n : []),\n ...(geoPositionResult?.Place?.SubRegion\n ? [{ key: \"subRegion\", value: geoPositionResult?.Place?.SubRegion }]\n : []),\n ...(geoPositionResult?.Place?.Municipality\n ? [{ key: \"municipality\", value: geoPositionResult?.Place?.Municipality }]\n : []),\n ...(geoPositionResult?.Place?.Neighborhood\n ? [{ key: \"neighborhood\", value: geoPositionResult?.Place?.Neighborhood }]\n : []),\n ...(geoPositionResult?.Place?.PostalCode\n ? [{ key: \"postalCode\", value: geoPositionResult?.Place?.PostalCode }]\n : [])\n ].map((tag) => ({\n key: \"ac:tau:\" + tag.key,\n value: tag.value\n }));\n\n logger.debug(\"metaData\", { newTags });\n\n logger.debug(\"trying to read existing metadata\");\n const getResponse = await dynamoDBService.getCommand({\n TableName: metaTableName,\n Key: {\n id\n }\n });\n const oldTags: Tag[] = getResponse.Item?.tags;\n logger.debug(\"existing tags\", { getResponse });\n\n const reconciledTags = reconcileTags({ newTags, oldTags }, logger);\n logger.debug(\"result\", { reconciledTags });\n\n const updateResponse = await dynamoDBService.updateCommand({\n TableName: metaTableName,\n Key: {\n id\n },\n UpdateExpression: \"set tags = :tags\",\n ExpressionAttributeValues: {\n \":tags\": reconciledTags\n },\n ReturnValues: \"ALL_NEW\"\n });\n\n logger.debug(\"sent UpdateCommand\", { updateResponse });\n};\n\nconst reconcileTags = (\n { oldTags = [], newTags = [] }: { newTags: Tag[]; oldTags: Tag[] },\n logger: Logger\n) =>\n oldTags.reduce((acc, cur) => {\n if (acc.find((element) => element.key === cur.key)) {\n return acc;\n } else {\n logger.debug(\"added\", cur);\n\n return [...acc, cur];\n }\n }, newTags);\n\nconst SUBSTRING_ANSI_DATES_BEGIN_WITH = \"20\";\n\nconst extractMetaFromKey = (key: string | undefined | null): Array<Tag> => {\n if (!key) return [];\n\n let firstToken: string | undefined = undefined;\n try {\n const folder = key.split(\"/\").at(-2);\n assert(typeof folder === \"string\");\n firstToken = folder.split(\".\")[0];\n } catch (error) {}\n\n if (\n firstToken === undefined ||\n firstToken.length !== 8 ||\n !firstToken.startsWith(SUBSTRING_ANSI_DATES_BEGIN_WITH)\n )\n return [];\n\n const year = Number(firstToken.substring(0, 4));\n const month = Number(firstToken.substring(4, 6)) - 1;\n const day = Number(firstToken.substring(6));\n\n if (isNaN(year) || isNaN(month) || isNaN(day)) return [];\n\n // mon starts from 0\n // day starts from 1\n if (year < 2000 || month < 1 || month > 11 || day < 1 || day > 31) return [];\n\n const dateCreatedBin = new Date(year, month, day);\n\n return [\n { key: \"dateCreated\", value: dateCreatedBin.toISOString() },\n { key: \"yearCreated\", value: dateCreatedBin.getFullYear().toString() },\n { key: \"dayCreated\", value: dateCreatedBin.getDate().toString() },\n {\n key: \"monthCreated\",\n value: (dateCreatedBin.getMonth() + 1).toString()\n }\n ];\n};\n", "import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n GetCommandInput,\n GetCommandOutput,\n PutCommand,\n PutCommandInput,\n PutCommandOutput,\n QueryCommand,\n QueryCommandInput,\n QueryCommandOutput,\n UpdateCommand,\n UpdateCommandInput,\n UpdateCommandOutput\n} from \"@aws-sdk/lib-dynamodb\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class DynamoDBService {\n logger: Logger;\n client: DynamoDBClient;\n documentClient: DynamoDBDocumentClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: DynamoDBClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new DynamoDBClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n\n this.documentClient = DynamoDBDocumentClient.from(this.client);\n }\n\n async getCommand(\n getCommandInput: GetCommandInput\n ): Promise<GetCommandOutput> {\n return await this.documentClient.send(new GetCommand(getCommandInput));\n }\n\n async updateCommand(\n updateCommandInput: UpdateCommandInput\n ): Promise<UpdateCommandOutput> {\n return await this.documentClient.send(\n new UpdateCommand(updateCommandInput)\n );\n }\n\n async queryCommand(\n queryCommandInput: QueryCommandInput\n ): Promise<QueryCommandOutput> {\n return await this.documentClient.send(new QueryCommand(queryCommandInput));\n }\n\n async putCommand(\n putCommandInput: PutCommandInput\n ): Promise<PutCommandOutput> {\n return await this.documentClient.send(new PutCommand(putCommandInput));\n }\n\n async checkIfItemExists(\n checkInput: Pick<GetCommandInput, \"TableName\" | \"Key\">\n ): Promise<boolean> {\n const result = await this.getCommand(checkInput);\n\n return !!result.Item;\n }\n}\n", "import {\n GetParameterCommand,\n GetParameterCommandInput,\n GetParameterCommandOutput,\n PutParameterCommand,\n PutParameterCommandInput,\n PutParameterCommandOutput,\n SSMClient\n} from \"@aws-sdk/client-ssm\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class SSMService {\n logger: Logger;\n client: SSMClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: SSMClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new SSMClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async getParameter(\n params: GetParameterCommandInput\n ): Promise<GetParameterCommandOutput> {\n return await this.client.send(new GetParameterCommand(params));\n }\n\n async putParameter(\n params: PutParameterCommandInput\n ): Promise<PutParameterCommandOutput> {\n return await this.client.send(new PutParameterCommand(params));\n }\n}\n", "import {\n DeleteMessageCommand,\n DeleteMessageCommandInput,\n DeleteMessageCommandOutput,\n ReceiveMessageCommand,\n ReceiveMessageCommandInput,\n ReceiveMessageCommandOutput,\n SQSClient,\n SendMessageBatchCommand,\n SendMessageBatchCommandInput,\n SendMessageBatchCommandOutput,\n SendMessageCommand,\n SendMessageCommandInput,\n SendMessageCommandOutput\n} from \"@aws-sdk/client-sqs\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class SQSService {\n logger: Logger;\n client: SQSClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: SQSClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new SQSClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async sendMessage(\n params: SendMessageCommandInput\n ): Promise<SendMessageCommandOutput> {\n return await this.client.send(new SendMessageCommand(params));\n }\n\n async sendMessageBatch(\n params: SendMessageBatchCommandInput\n ): Promise<SendMessageBatchCommandOutput> {\n return await this.client.send(new SendMessageBatchCommand(params));\n }\n\n async receiveMessage(\n params: ReceiveMessageCommandInput\n ): Promise<ReceiveMessageCommandOutput> {\n return await this.client.send(new ReceiveMessageCommand(params));\n }\n\n async deleteMessage(\n params: DeleteMessageCommandInput\n ): Promise<DeleteMessageCommandOutput> {\n return await this.client.send(new DeleteMessageCommand(params));\n }\n}\n", "import {\n AssumeRoleCommand,\n AssumeRoleCommandInput,\n GetCallerIdentityCommand,\n STSClient\n} from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class STSService {\n logger: Logger;\n client: STSClient;\n\n constructor({\n logger,\n region,\n client\n }: {\n logger: Logger;\n region?: string;\n client?: STSClient;\n }) {\n if (logger) {\n this.logger = logger;\n } else {\n this.logger = new Logger();\n this.logger.appendKeys({ scope: \"STSService\" });\n }\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new STSClient({\n region\n });\n }\n }\n\n async getCallerIdentity() {\n this.logger.debug(\"getCallerIdentity\");\n\n return await this.client.send(new GetCallerIdentityCommand({}));\n }\n\n async assumeRole(assumeRoleCommandInput: AssumeRoleCommandInput) {\n this.logger.debug(\"assumeRole\", { assumeRoleCommandInput });\n\n return await this.client.send(\n new AssumeRoleCommand(assumeRoleCommandInput)\n );\n }\n}\n", "import {\n LocationClient,\n SearchPlaceIndexForPositionCommand,\n SearchPlaceIndexForPositionCommandInput,\n SearchPlaceIndexForPositionCommandOutput\n} from \"@aws-sdk/client-location\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class LocationService {\n logger: Logger;\n client: LocationClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: LocationClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new LocationClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async searchPlaceIndexForPositionCommand(\n searchPlaceIndexForPositionCommandInput: SearchPlaceIndexForPositionCommandInput\n ): Promise<SearchPlaceIndexForPositionCommandOutput> {\n return await this.client.send(\n new SearchPlaceIndexForPositionCommand(\n searchPlaceIndexForPositionCommandInput\n )\n );\n }\n}\n", "import { DynamoDBPersistenceLayer } from \"@aws-lambda-powertools/idempotency/dynamodb\";\nimport { IdempotencyConfig } from \"@aws-lambda-powertools/idempotency\";\nimport {\n DynamoDBService,\n LocationService,\n S3Service,\n SQSService,\n SSMService,\n STSService\n} from \"../services/index.js\";\nimport { assertEnvVar } from \"../utils/assertUtils.js\";\nimport middy from \"@middy/core\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\nimport { Tracer } from \"@aws-lambda-powertools/tracer\";\nimport { Metrics } from \"@aws-lambda-powertools/metrics\";\nimport type { Context } from \"aws-lambda\";\nimport { injectLambdaContext } from \"@aws-lambda-powertools/logger/middleware\";\nimport { captureLambdaHandler } from \"@aws-lambda-powertools/tracer/middleware\";\nimport { logMetrics } from \"@aws-lambda-powertools/metrics/middleware\";\n\nexport const withMiddlewares = (handler: middy.MiddyfiedHandler) =>\n middy(handler)\n .use(injectLambdaContext(logger))\n .use(captureLambdaHandler(tracer))\n .use(logMetrics(metrics))\n .use({\n before: async (request) => {\n logger.setCorrelationId(\n request.context.awsRequestId || \"no-aws-request-id\"\n );\n logger.logEventIfEnabled(request.event);\n\n request.context.logger = logger;\n request.context.tracer = tracer;\n request.context.metrics = metrics;\n }\n });\n\nexport const logger = new Logger();\n\nexport const tracer = new Tracer();\n\nexport const metrics = new Metrics();\n\nexport const getPersistenceStore = () => {\n return new DynamoDBPersistenceLayer({\n tableName: assertEnvVar(\"AC_IDEMPOTENCY_TABLE_NAME\")\n });\n};\n\nexport const getIdempotencyConfig = (eventKeyJmesPath: string) => {\n return new IdempotencyConfig({\n eventKeyJmesPath\n });\n};\n\nexport const SQS_IDEMPOTENCY_OPTIONS = {\n persistenceStore: getPersistenceStore(),\n config: getIdempotencyConfig(\"messageId\")\n};\n\nexport type AcServicesContext = {\n dynamoDBService?: DynamoDBService;\n locationService?: LocationService;\n s3Service?: S3Service;\n sqsService?: SQSService;\n ssmService?: SSMService;\n stsService?: STSService;\n sourceS3Service?: S3Service;\n destinationS3Service?: S3Service;\n};\n\ndeclare module \"@middy/core\" {\n interface MiddyRequest<\n TEvent = unknown,\n TResult = unknown,\n TContext extends Context = Context\n > {\n context: TContext & {\n logger: Logger;\n tracer: Tracer;\n metrics: Metrics;\n };\n }\n}\n", "/* global awslambda */ import { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { setTimeout } from 'node:timers/promises';\nconst defaultLambdaHandler = ()=>{};\nconst defaultPlugin = {\n timeoutEarlyInMillis: 5,\n timeoutEarlyResponse: ()=>{\n throw new Error('Timeout');\n },\n streamifyResponse: false // Deprecate need for this when AWS provides a flag for when it's looking for it\n};\nconst middy = (lambdaHandler = defaultLambdaHandler, plugin = {})=>{\n // Allow base handler to be set using .handler()\n if (typeof lambdaHandler !== 'function') {\n plugin = lambdaHandler;\n lambdaHandler = defaultLambdaHandler;\n }\n plugin = {\n ...defaultPlugin,\n ...plugin\n };\n plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0;\n plugin.beforePrefetch?.();\n const beforeMiddlewares = [];\n const afterMiddlewares = [];\n const onErrorMiddlewares = [];\n const middyHandler = (event = {}, context = {})=>{\n plugin.requestStart?.();\n const request = {\n event,\n context,\n response: undefined,\n error: undefined,\n internal: plugin.internal ?? {}\n };\n return runRequest(request, [\n ...beforeMiddlewares\n ], lambdaHandler, [\n ...afterMiddlewares\n ], [\n ...onErrorMiddlewares\n ], plugin);\n };\n const middy = plugin.streamifyResponse ? awslambda.streamifyResponse(async (event, responseStream, context)=>{\n const handlerResponse = await middyHandler(event, context);\n let handlerBody = handlerResponse;\n if (handlerResponse.statusCode) {\n handlerBody = handlerResponse.body ?? '';\n responseStream = awslambda.HttpResponseStream.from(responseStream, handlerResponse);\n }\n // Source @datastream/core (MIT)\n let handlerStream;\n if (handlerBody._readableState) {\n handlerStream = handlerBody;\n } else if (typeof handlerBody === 'string') {\n function* iterator(input) {\n const size = 16384 // 16 * 1024 // Node.js default\n ;\n let position = 0;\n const length = input.length;\n while(position < length){\n yield input.substring(position, position + size);\n position += size;\n }\n }\n handlerStream = Readable.from(iterator(handlerBody));\n }\n if (!handlerStream) {\n throw new Error('handler response not a ReadableStream');\n }\n await pipeline(handlerStream, responseStream);\n }) : middyHandler;\n middy.use = (middlewares)=>{\n if (!Array.isArray(middlewares)) {\n middlewares = [\n middlewares\n ];\n }\n for (const middleware of middlewares){\n const { before, after, onError } = middleware;\n if (!before && !after && !onError) {\n throw new Error('Middleware must be an object containing at least one key among \"before\", \"after\", \"onError\"');\n }\n if (before) middy.before(before);\n if (after) middy.after(after);\n if (onError) middy.onError(onError);\n }\n return middy;\n };\n // Inline Middlewares\n middy.before = (beforeMiddleware)=>{\n beforeMiddlewares.push(beforeMiddleware);\n return middy;\n };\n middy.after = (afterMiddleware)=>{\n afterMiddlewares.unshift(afterMiddleware);\n return middy;\n };\n middy.onError = (onErrorMiddleware)=>{\n onErrorMiddlewares.unshift(onErrorMiddleware);\n return middy;\n };\n middy.handler = (replaceLambdaHandler)=>{\n lambdaHandler = replaceLambdaHandler;\n return middy;\n };\n return middy;\n};\nconst runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewares, onErrorMiddlewares, plugin)=>{\n let timeoutAbort;\n const timeoutEarly = plugin.timeoutEarly && request.context.getRemainingTimeInMillis // disable when AWS context missing (tests, containers)\n ;\n try {\n await runMiddlewares(request, beforeMiddlewares, plugin);\n // Check if before stack hasn't exit early\n if (typeof request.response === 'undefined') {\n plugin.beforeHandler?.();\n const handlerAbort = new AbortController();\n if (timeoutEarly) timeoutAbort = new AbortController();\n request.response = await Promise.race([\n lambdaHandler(request.event, request.context, {\n signal: handlerAbort.signal\n }),\n timeoutEarly ? setTimeout(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, undefined, {\n signal: timeoutAbort.signal\n }).then(()=>{\n handlerAbort.abort();\n return plugin.timeoutEarlyResponse();\n }) : Promise.race([])\n ]);\n timeoutAbort?.abort() // lambdaHandler may not be a promise\n ;\n plugin.afterHandler?.();\n await runMiddlewares(request, afterMiddlewares, plugin);\n }\n } catch (e) {\n timeoutAbort?.abort() // timeout should be aborted on errors\n ;\n // Reset response changes made by after stack before error thrown\n request.response = undefined;\n request.error = e;\n try {\n await runMiddlewares(request, onErrorMiddlewares, plugin);\n } catch (e) {\n // Save error that wasn't handled\n e.originalError = request.error;\n request.error = e;\n throw request.error;\n }\n // Catch if onError stack hasn't handled the error\n if (typeof request.response === 'undefined') throw request.error;\n } finally{\n await plugin.requestEnd?.(request);\n }\n return request.response;\n};\nconst runMiddlewares = async (request, middlewares, plugin)=>{\n for (const nextMiddleware of middlewares){\n plugin.beforeMiddleware?.(nextMiddleware.name);\n const res = await nextMiddleware(request);\n plugin.afterMiddleware?.(nextMiddleware.name);\n // short circuit chaining and respond early\n if (typeof res !== 'undefined') {\n request.response = res;\n return;\n }\n }\n};\nexport default middy;\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["assert", "assert", "logger", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "logger", "assert", "middy", "e", "Logger"]
|
|
3
|
+
"sources": ["../src/services/s3.ts", "../src/utils/index.ts", "../src/utils/normalizeErrorMessage.ts", "../src/utils/thumbsKey.ts", "../src/utils/helpers.ts", "../src/utils/processMeta.ts", "../src/services/dynamoDB.ts", "../src/services/ssm.ts", "../src/services/sqs.ts", "../src/services/sts.ts", "../src/services/location.ts", "../src/lambda/index.ts", "../node_modules/@middy/core/index.js", "../node_modules/@middy/util/index.js", "../node_modules/@middy/http-error-handler/index.js"],
|
|
4
|
+
"sourcesContent": ["import {\n GetObjectCommand,\n GetObjectCommandInput,\n HeadObjectCommand,\n HeadObjectCommandInput,\n ListObjectsV2Command,\n ListObjectsV2CommandInput,\n PutObjectCommand,\n PutObjectCommandInput,\n PutObjectCommandOutput,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport { Upload } from \"@aws-sdk/lib-storage\";\nimport assert from \"node:assert/strict\";\nimport { PassThrough } from \"node:stream\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class S3Service {\n logger: Logger;\n client: S3Client;\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: S3Client;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new S3Client({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n createS3UploadStream(putObjectCommandInput: PutObjectCommandInput) {\n this.logger.debug(\"upload stream started\", { putObjectCommandInput });\n\n const pass = new PassThrough();\n\n const parallelUploads = new Upload({\n client: this.client,\n params: {\n ...putObjectCommandInput,\n Body: pass\n }\n });\n\n const donePromise = parallelUploads\n .done()\n .then(() => this.logger.debug(\"upload stream finished\"))\n .catch((err) => {\n this.logger.error(\"upload stream error\", err);\n pass.destroy(err);\n });\n\n return { stream: pass, done: donePromise };\n }\n\n async createS3DownloadStream(getObjectCommandInput: GetObjectCommandInput) {\n this.logger.debug(\"download stream started\", { getObjectCommandInput });\n\n const item = await this.client.send(\n new GetObjectCommand(getObjectCommandInput)\n );\n\n this.logger.debug(\"download stream finished\");\n\n return item.Body;\n }\n\n async listObjectsV2(listObjectsV2CommandInput: ListObjectsV2CommandInput) {\n this.logger.debug(\"listObjectsV2\", { listObjectsV2CommandInput });\n return await this.client.send(\n new ListObjectsV2Command(listObjectsV2CommandInput)\n );\n }\n\n async getObject(\n getObjectCommandInput: GetObjectCommandInput\n ): Promise<Buffer> {\n this.logger.debug(\"getObject\", { getObjectCommandInput });\n\n const stream = await this.createS3DownloadStream(getObjectCommandInput);\n\n return Buffer.from(await stream.transformToByteArray());\n }\n\n async getSignedUrl(\n getObjectCommandInput: GetObjectCommandInput\n ): Promise<string> {\n this.logger.debug(\"getSignedUrl\", { getObjectCommandInput });\n\n const signedUrl = await getSignedUrl(\n this.client,\n new GetObjectCommand(getObjectCommandInput),\n { expiresIn: 3600 }\n );\n\n return signedUrl;\n }\n\n async putObject(\n putObjectCommandInput: PutObjectCommandInput\n ): Promise<PutObjectCommandOutput> {\n this.logger.debug(\"putObject\", { putObjectCommandInput });\n\n return await this.client.send(new PutObjectCommand(putObjectCommandInput));\n }\n\n async headObject(headObjectCommandInput: HeadObjectCommandInput) {\n this.logger.debug(\"headObject\", { headObjectCommandInput });\n return await this.client.send(\n new HeadObjectCommand(headObjectCommandInput)\n );\n }\n\n async checkIfObjectExists(\n headObjectCommandInput: HeadObjectCommandInput\n ): Promise<boolean> {\n this.logger.debug(\"checkIfObjectExists\", { headObjectCommandInput });\n\n try {\n await this.headObject(headObjectCommandInput);\n return true;\n } catch (error) {\n if (error.name === \"NotFound\") {\n return false;\n }\n throw error;\n }\n }\n}\n", "import assert from \"node:assert/strict\";\n\nexport const assertEnvVar = (envVar: string): string => {\n assert(process.env[envVar], `${envVar} is not set`);\n return process.env[envVar];\n};\n\nexport * from \"./normalizeErrorMessage.js\";\nexport * from \"./thumbsKey.js\";\nexport * from \"./helpers.js\";\nexport * from \"./processMeta.js\";\n", "export const normalizeErrorMessage = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n } else if (typeof error === \"string\") {\n return error;\n } else if (typeof error === \"object\" && error !== null) {\n return JSON.stringify(error);\n } else {\n return String(error);\n }\n};\n", "import { extname } from \"node:path\";\n\nexport const JPEG_EXTENSION = \"jpeg\";\nexport const JPG_EXTENSION = \"jpg\";\nexport const HEIC_EXTENSION = \"heic\";\nexport const MOV_EXTENSION = \"mov\";\nexport const THUMBS_EXTENSION = JPG_EXTENSION;\nexport const ENCODED_VIDEO_EXTENSION = \"mp4\";\nexport const ALLOWED_EXTENSIONS = [\n JPEG_EXTENSION,\n JPG_EXTENSION,\n HEIC_EXTENSION\n];\nexport const ALLOWED_VIDEO_EXTENSIONS = [MOV_EXTENSION];\n\nexport const THUMBNAIL_RESOLUTIONS = [\n [200, 200],\n [1180, 820]\n];\n\nexport const getThumbsKey = ({\n key,\n width,\n height\n}: {\n key: string;\n width: number;\n height: number;\n}) => {\n return `${key\n .split(\".\")\n .slice(0, -1)\n .join(\".\")}.${width}x${height}.${THUMBS_EXTENSION}`;\n};\n\nexport const getEncodedVideoKey = ({ key }: { key: string }) => {\n return `${key.split(\".\").slice(0, -1).join(\".\")}.${ENCODED_VIDEO_EXTENSION}`;\n};\n\nexport const getKeyExtension = (key: string) =>\n extname(key).slice(1).toLowerCase();\n\nexport const isAllowedExtension = (key: string) => {\n const ext = getKeyExtension(key);\n return ALLOWED_EXTENSIONS.includes(ext);\n};\n\nexport const isAllowedVideoExtension = (key: string) => {\n const ext = getKeyExtension(key);\n return ALLOWED_VIDEO_EXTENSIONS.includes(ext);\n};\n", "import { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\n\nexport const getObjectWithAssumeRoleCommandOutputAttribute = (\n assumeRoleCommandOutput?: AssumeRoleCommandOutput\n) =>\n assumeRoleCommandOutput\n ? {\n credentials: {\n accessKeyId: assumeRoleCommandOutput?.Credentials?.AccessKeyId,\n secretAccessKey:\n assumeRoleCommandOutput?.Credentials?.SecretAccessKey,\n sessionToken: assumeRoleCommandOutput?.Credentials?.SessionToken\n }\n }\n : {};\n\nexport const getObjectWithStackAttribute = (error: any) =>\n error && error instanceof Error ? { stack: error.stack } : {};\n", "import { DynamoDBService, LocationService } from \"../services/index.js\";\nimport type { SearchForPositionResult } from \"@aws-sdk/client-location\";\nimport assert from \"node:assert/strict\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\nimport { getKeyExtension } from \"./thumbsKey.js\";\n\ntype ExtractMetadataParams = {\n id: string;\n meta: Array<{ key: string; value: string }>;\n logger: Logger;\n locationService: LocationService;\n dynamoDBService: DynamoDBService;\n metaTableName: string;\n size: number;\n};\n\ntype Tag = { key: string; value: string };\n\n/**\n * 1. read <id>\n * 2. if <id> doesn't exist then use PutCommand\n * 3. if it does exist then match new tags and old tags\n * 4. add all old tags that are not present in new tags,\n *\n */\nexport const processMeta = async ({\n id,\n meta,\n metaTableName,\n size,\n logger,\n locationService,\n dynamoDBService\n}: ExtractMetadataParams) => {\n // expand location data\n const latitude = Number(meta.find((tag) => tag.key === \"latitude\")?.value);\n const longitude = Number(meta.find((tag) => tag.key === \"longitude\")?.value);\n\n let geoPositionResult: SearchForPositionResult | undefined;\n if (!Number.isNaN(longitude) && !Number.isNaN(latitude)) {\n try {\n const res = await locationService.searchPlaceIndexForPositionCommand({\n IndexName: \"TauPlaceIndex\",\n Position: [longitude, latitude]\n });\n\n if (res?.Results && res?.Results?.length > 0) {\n geoPositionResult = res?.Results[0];\n } else {\n throw Error(\"Can not resolve geo data\");\n }\n } catch (error) {\n logger.error(\"Error fetching geo data\", {\n message: error instanceof Error ? error.message : \"\"\n });\n }\n }\n\n const newTags = [\n ...meta,\n ...(meta.find((tag) => tag.key === \"dateCreated\")\n ? []\n : extractMetaFromKey(id)),\n { key: \"extension\", value: getKeyExtension(id) },\n { key: \"size\", value: String(size) },\n { key: \"sizeMb\", value: String(Math.round(size / 1024 ** 2)) },\n ...(geoPositionResult?.Place?.Label\n ? [{ key: \"label\", value: geoPositionResult?.Place?.Label }]\n : []),\n ...(geoPositionResult?.Place?.Country\n ? [{ key: \"country\", value: geoPositionResult?.Place?.Country }]\n : []),\n ...(geoPositionResult?.Place?.Region\n ? [{ key: \"region\", value: geoPositionResult?.Place?.Region }]\n : []),\n ...(geoPositionResult?.Place?.SubRegion\n ? [{ key: \"subRegion\", value: geoPositionResult?.Place?.SubRegion }]\n : []),\n ...(geoPositionResult?.Place?.Municipality\n ? [{ key: \"municipality\", value: geoPositionResult?.Place?.Municipality }]\n : []),\n ...(geoPositionResult?.Place?.Neighborhood\n ? [{ key: \"neighborhood\", value: geoPositionResult?.Place?.Neighborhood }]\n : []),\n ...(geoPositionResult?.Place?.PostalCode\n ? [{ key: \"postalCode\", value: geoPositionResult?.Place?.PostalCode }]\n : [])\n ].map((tag) => ({\n key: \"ac:tau:\" + tag.key,\n value: tag.value\n }));\n\n logger.debug(\"metaData\", { newTags });\n\n logger.debug(\"trying to read existing metadata\");\n const getResponse = await dynamoDBService.getCommand({\n TableName: metaTableName,\n Key: {\n id\n }\n });\n const oldTags: Tag[] = getResponse.Item?.tags;\n logger.debug(\"existing tags\", { getResponse });\n\n const reconciledTags = reconcileTags({ newTags, oldTags }, logger);\n logger.debug(\"result\", { reconciledTags });\n\n const updateResponse = await dynamoDBService.updateCommand({\n TableName: metaTableName,\n Key: {\n id\n },\n UpdateExpression: \"set tags = :tags\",\n ExpressionAttributeValues: {\n \":tags\": reconciledTags\n },\n ReturnValues: \"ALL_NEW\"\n });\n\n logger.debug(\"sent UpdateCommand\", { updateResponse });\n};\n\nconst reconcileTags = (\n { oldTags = [], newTags = [] }: { newTags: Tag[]; oldTags: Tag[] },\n logger: Logger\n) =>\n oldTags.reduce((acc, cur) => {\n if (acc.find((element) => element.key === cur.key)) {\n return acc;\n } else {\n logger.debug(\"added\", cur);\n\n return [...acc, cur];\n }\n }, newTags);\n\nconst SUBSTRING_ANSI_DATES_BEGIN_WITH = \"20\";\n\nconst extractMetaFromKey = (key: string | undefined | null): Array<Tag> => {\n if (!key) return [];\n\n let firstToken: string | undefined = undefined;\n try {\n const folder = key.split(\"/\").at(-2);\n assert(typeof folder === \"string\");\n firstToken = folder.split(\".\")[0];\n } catch (error) {}\n\n if (\n firstToken === undefined ||\n firstToken.length !== 8 ||\n !firstToken.startsWith(SUBSTRING_ANSI_DATES_BEGIN_WITH)\n )\n return [];\n\n const year = Number(firstToken.substring(0, 4));\n const month = Number(firstToken.substring(4, 6)) - 1;\n const day = Number(firstToken.substring(6));\n\n if (isNaN(year) || isNaN(month) || isNaN(day)) return [];\n\n // mon starts from 0\n // day starts from 1\n if (year < 2000 || month < 1 || month > 11 || day < 1 || day > 31) return [];\n\n const dateCreatedBin = new Date(year, month, day);\n\n return [\n { key: \"dateCreated\", value: dateCreatedBin.toISOString() },\n { key: \"yearCreated\", value: dateCreatedBin.getFullYear().toString() },\n { key: \"dayCreated\", value: dateCreatedBin.getDate().toString() },\n {\n key: \"monthCreated\",\n value: (dateCreatedBin.getMonth() + 1).toString()\n }\n ];\n};\n", "import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n GetCommandInput,\n GetCommandOutput,\n PutCommand,\n PutCommandInput,\n PutCommandOutput,\n QueryCommand,\n QueryCommandInput,\n QueryCommandOutput,\n UpdateCommand,\n UpdateCommandInput,\n UpdateCommandOutput\n} from \"@aws-sdk/lib-dynamodb\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class DynamoDBService {\n logger: Logger;\n client: DynamoDBClient;\n documentClient: DynamoDBDocumentClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: DynamoDBClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new DynamoDBClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n\n this.documentClient = DynamoDBDocumentClient.from(this.client);\n }\n\n async getCommand(\n getCommandInput: GetCommandInput\n ): Promise<GetCommandOutput> {\n return await this.documentClient.send(new GetCommand(getCommandInput));\n }\n\n async updateCommand(\n updateCommandInput: UpdateCommandInput\n ): Promise<UpdateCommandOutput> {\n return await this.documentClient.send(\n new UpdateCommand(updateCommandInput)\n );\n }\n\n async queryCommand(\n queryCommandInput: QueryCommandInput\n ): Promise<QueryCommandOutput> {\n return await this.documentClient.send(new QueryCommand(queryCommandInput));\n }\n\n async putCommand(\n putCommandInput: PutCommandInput\n ): Promise<PutCommandOutput> {\n return await this.documentClient.send(new PutCommand(putCommandInput));\n }\n\n async checkIfItemExists(\n checkInput: Pick<GetCommandInput, \"TableName\" | \"Key\">\n ): Promise<boolean> {\n const result = await this.getCommand(checkInput);\n\n return !!result.Item;\n }\n}\n", "import {\n GetParameterCommand,\n GetParameterCommandInput,\n GetParameterCommandOutput,\n PutParameterCommand,\n PutParameterCommandInput,\n PutParameterCommandOutput,\n SSMClient\n} from \"@aws-sdk/client-ssm\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class SSMService {\n logger: Logger;\n client: SSMClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: SSMClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new SSMClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async getParameter(\n params: GetParameterCommandInput\n ): Promise<GetParameterCommandOutput> {\n return await this.client.send(new GetParameterCommand(params));\n }\n\n async putParameter(\n params: PutParameterCommandInput\n ): Promise<PutParameterCommandOutput> {\n return await this.client.send(new PutParameterCommand(params));\n }\n}\n", "import {\n DeleteMessageCommand,\n DeleteMessageCommandInput,\n DeleteMessageCommandOutput,\n ReceiveMessageCommand,\n ReceiveMessageCommandInput,\n ReceiveMessageCommandOutput,\n SQSClient,\n SendMessageBatchCommand,\n SendMessageBatchCommandInput,\n SendMessageBatchCommandOutput,\n SendMessageCommand,\n SendMessageCommandInput,\n SendMessageCommandOutput\n} from \"@aws-sdk/client-sqs\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class SQSService {\n logger: Logger;\n client: SQSClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: SQSClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new SQSClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async sendMessage(\n params: SendMessageCommandInput\n ): Promise<SendMessageCommandOutput> {\n return await this.client.send(new SendMessageCommand(params));\n }\n\n async sendMessageBatch(\n params: SendMessageBatchCommandInput\n ): Promise<SendMessageBatchCommandOutput> {\n return await this.client.send(new SendMessageBatchCommand(params));\n }\n\n async receiveMessage(\n params: ReceiveMessageCommandInput\n ): Promise<ReceiveMessageCommandOutput> {\n return await this.client.send(new ReceiveMessageCommand(params));\n }\n\n async deleteMessage(\n params: DeleteMessageCommandInput\n ): Promise<DeleteMessageCommandOutput> {\n return await this.client.send(new DeleteMessageCommand(params));\n }\n}\n", "import {\n AssumeRoleCommand,\n AssumeRoleCommandInput,\n GetCallerIdentityCommand,\n STSClient\n} from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class STSService {\n logger: Logger;\n client: STSClient;\n\n constructor({\n logger,\n region,\n client\n }: {\n logger: Logger;\n region?: string;\n client?: STSClient;\n }) {\n if (logger) {\n this.logger = logger;\n } else {\n this.logger = new Logger();\n this.logger.appendKeys({ scope: \"STSService\" });\n }\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new STSClient({\n region\n });\n }\n }\n\n async getCallerIdentity() {\n this.logger.debug(\"getCallerIdentity\");\n\n return await this.client.send(new GetCallerIdentityCommand({}));\n }\n\n async assumeRole(assumeRoleCommandInput: AssumeRoleCommandInput) {\n this.logger.debug(\"assumeRole\", { assumeRoleCommandInput });\n\n return await this.client.send(\n new AssumeRoleCommand(assumeRoleCommandInput)\n );\n }\n}\n", "import {\n LocationClient,\n SearchPlaceIndexForPositionCommand,\n SearchPlaceIndexForPositionCommandInput,\n SearchPlaceIndexForPositionCommandOutput\n} from \"@aws-sdk/client-location\";\nimport { AssumeRoleCommandOutput } from \"@aws-sdk/client-sts\";\nimport assert from \"node:assert/strict\";\nimport { getObjectWithAssumeRoleCommandOutputAttribute } from \"../utils/index.js\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\n\nexport class LocationService {\n logger: Logger;\n client: LocationClient;\n\n constructor({\n logger,\n client,\n assumeRoleCommandOutput,\n region\n }: {\n logger: Logger;\n client?: LocationClient;\n assumeRoleCommandOutput?: AssumeRoleCommandOutput;\n region?: string;\n }) {\n this.logger = logger;\n\n if (client) {\n this.client = client;\n } else {\n assert(region, \"Region must be provided if client is not passed\");\n this.client = new LocationClient({\n region,\n ...getObjectWithAssumeRoleCommandOutputAttribute(\n assumeRoleCommandOutput\n )\n });\n }\n }\n\n async searchPlaceIndexForPositionCommand(\n searchPlaceIndexForPositionCommandInput: SearchPlaceIndexForPositionCommandInput\n ): Promise<SearchPlaceIndexForPositionCommandOutput> {\n return await this.client.send(\n new SearchPlaceIndexForPositionCommand(\n searchPlaceIndexForPositionCommandInput\n )\n );\n }\n}\n", "import { IdempotencyConfig } from \"@aws-lambda-powertools/idempotency\";\nimport { DynamoDBPersistenceLayer } from \"@aws-lambda-powertools/idempotency/dynamodb\";\nimport { Logger } from \"@aws-lambda-powertools/logger\";\nimport { injectLambdaContext } from \"@aws-lambda-powertools/logger/middleware\";\nimport { Metrics } from \"@aws-lambda-powertools/metrics\";\nimport { logMetrics } from \"@aws-lambda-powertools/metrics/middleware\";\nimport { Tracer } from \"@aws-lambda-powertools/tracer\";\nimport { captureLambdaHandler } from \"@aws-lambda-powertools/tracer/middleware\";\nimport middy from \"@middy/core\";\nimport type { Handler } from \"aws-lambda\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n DynamoDBService,\n LocationService,\n S3Service,\n SQSService,\n SSMService,\n STSService\n} from \"../services/index.js\";\nimport { assertEnvVar } from \"../utils/index.js\";\nimport httpErrorHandler from \"@middy/http-error-handler\";\n\nexport const logger = new Logger();\n\nexport const tracer = new Tracer();\n\nexport const metrics = new Metrics();\n\nexport const withMiddlewares = (handler: Handler) =>\n middy(handler)\n .use(injectLambdaContext(logger))\n .use(captureLambdaHandler(tracer))\n .use(logMetrics(metrics, { captureColdStartMetric: true }))\n .use({\n before: async (request) => {\n if (!logger.getCorrelationId()) {\n logger.setCorrelationId(request.context.awsRequestId || randomUUID());\n }\n logger.logEventIfEnabled(request.event);\n\n request.context.logger = logger;\n request.context.tracer = tracer;\n request.context.metrics = metrics;\n }\n })\n .use({\n onError: async ({ error, context }) => {\n context.logger.error(\"Error handled by middleware\", {\n error\n });\n }\n })\n .use(httpErrorHandler());\n\nexport const getPersistenceStore = () => {\n return new DynamoDBPersistenceLayer({\n tableName: assertEnvVar(\"AC_IDEMPOTENCY_TABLE_NAME\")\n });\n};\n\nexport const getIdempotencyConfig = (eventKeyJmesPath: string) => {\n return new IdempotencyConfig({\n eventKeyJmesPath\n });\n};\n\nexport const SQS_IDEMPOTENCY_OPTIONS = {\n persistenceStore: getPersistenceStore(),\n config: getIdempotencyConfig(\"messageId\")\n};\n\nexport type AcServices = {\n dynamoDBService?: DynamoDBService;\n locationService?: LocationService;\n s3Service?: S3Service;\n sqsService?: SQSService;\n ssmService?: SSMService;\n stsService?: STSService;\n sourceS3Service?: S3Service;\n destinationS3Service?: S3Service;\n};\n\ndeclare module \"aws-lambda\" {\n interface Context {\n logger: Logger;\n tracer: Tracer;\n metrics: Metrics;\n\n acServices?: AcServices;\n }\n}\n", "/* global awslambda */ import { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { setTimeout } from 'node:timers/promises';\nconst defaultLambdaHandler = ()=>{};\nconst defaultPlugin = {\n timeoutEarlyInMillis: 5,\n timeoutEarlyResponse: ()=>{\n throw new Error('Timeout');\n },\n streamifyResponse: false // Deprecate need for this when AWS provides a flag for when it's looking for it\n};\nconst middy = (lambdaHandler = defaultLambdaHandler, plugin = {})=>{\n // Allow base handler to be set using .handler()\n if (typeof lambdaHandler !== 'function') {\n plugin = lambdaHandler;\n lambdaHandler = defaultLambdaHandler;\n }\n plugin = {\n ...defaultPlugin,\n ...plugin\n };\n plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0;\n plugin.beforePrefetch?.();\n const beforeMiddlewares = [];\n const afterMiddlewares = [];\n const onErrorMiddlewares = [];\n const middyHandler = (event = {}, context = {})=>{\n plugin.requestStart?.();\n const request = {\n event,\n context,\n response: undefined,\n error: undefined,\n internal: plugin.internal ?? {}\n };\n return runRequest(request, [\n ...beforeMiddlewares\n ], lambdaHandler, [\n ...afterMiddlewares\n ], [\n ...onErrorMiddlewares\n ], plugin);\n };\n const middy = plugin.streamifyResponse ? awslambda.streamifyResponse(async (event, responseStream, context)=>{\n const handlerResponse = await middyHandler(event, context);\n let handlerBody = handlerResponse;\n if (handlerResponse.statusCode) {\n handlerBody = handlerResponse.body ?? '';\n responseStream = awslambda.HttpResponseStream.from(responseStream, handlerResponse);\n }\n // Source @datastream/core (MIT)\n let handlerStream;\n if (handlerBody._readableState) {\n handlerStream = handlerBody;\n } else if (typeof handlerBody === 'string') {\n function* iterator(input) {\n const size = 16384 // 16 * 1024 // Node.js default\n ;\n let position = 0;\n const length = input.length;\n while(position < length){\n yield input.substring(position, position + size);\n position += size;\n }\n }\n handlerStream = Readable.from(iterator(handlerBody));\n }\n if (!handlerStream) {\n throw new Error('handler response not a ReadableStream');\n }\n await pipeline(handlerStream, responseStream);\n }) : middyHandler;\n middy.use = (middlewares)=>{\n if (!Array.isArray(middlewares)) {\n middlewares = [\n middlewares\n ];\n }\n for (const middleware of middlewares){\n const { before, after, onError } = middleware;\n if (!before && !after && !onError) {\n throw new Error('Middleware must be an object containing at least one key among \"before\", \"after\", \"onError\"');\n }\n if (before) middy.before(before);\n if (after) middy.after(after);\n if (onError) middy.onError(onError);\n }\n return middy;\n };\n // Inline Middlewares\n middy.before = (beforeMiddleware)=>{\n beforeMiddlewares.push(beforeMiddleware);\n return middy;\n };\n middy.after = (afterMiddleware)=>{\n afterMiddlewares.unshift(afterMiddleware);\n return middy;\n };\n middy.onError = (onErrorMiddleware)=>{\n onErrorMiddlewares.unshift(onErrorMiddleware);\n return middy;\n };\n middy.handler = (replaceLambdaHandler)=>{\n lambdaHandler = replaceLambdaHandler;\n return middy;\n };\n return middy;\n};\nconst runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewares, onErrorMiddlewares, plugin)=>{\n let timeoutAbort;\n const timeoutEarly = plugin.timeoutEarly && request.context.getRemainingTimeInMillis // disable when AWS context missing (tests, containers)\n ;\n try {\n await runMiddlewares(request, beforeMiddlewares, plugin);\n // Check if before stack hasn't exit early\n if (typeof request.response === 'undefined') {\n plugin.beforeHandler?.();\n const handlerAbort = new AbortController();\n if (timeoutEarly) timeoutAbort = new AbortController();\n request.response = await Promise.race([\n lambdaHandler(request.event, request.context, {\n signal: handlerAbort.signal\n }),\n timeoutEarly ? setTimeout(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, undefined, {\n signal: timeoutAbort.signal\n }).then(()=>{\n handlerAbort.abort();\n return plugin.timeoutEarlyResponse();\n }) : Promise.race([])\n ]);\n timeoutAbort?.abort() // lambdaHandler may not be a promise\n ;\n plugin.afterHandler?.();\n await runMiddlewares(request, afterMiddlewares, plugin);\n }\n } catch (e) {\n timeoutAbort?.abort() // timeout should be aborted on errors\n ;\n // Reset response changes made by after stack before error thrown\n request.response = undefined;\n request.error = e;\n try {\n await runMiddlewares(request, onErrorMiddlewares, plugin);\n } catch (e) {\n // Save error that wasn't handled\n e.originalError = request.error;\n request.error = e;\n throw request.error;\n }\n // Catch if onError stack hasn't handled the error\n if (typeof request.response === 'undefined') throw request.error;\n } finally{\n await plugin.requestEnd?.(request);\n }\n return request.response;\n};\nconst runMiddlewares = async (request, middlewares, plugin)=>{\n for (const nextMiddleware of middlewares){\n plugin.beforeMiddleware?.(nextMiddleware.name);\n const res = await nextMiddleware(request);\n plugin.afterMiddleware?.(nextMiddleware.name);\n // short circuit chaining and respond early\n if (typeof res !== 'undefined') {\n request.response = res;\n return;\n }\n }\n};\nexport default middy;\n\n", "export const createPrefetchClient = (options) => {\n\tconst { awsClientOptions } = options;\n\tconst client = new options.AwsClient(awsClientOptions);\n\n\t// AWS XRay\n\tif (options.awsClientCapture) {\n\t\tif (options.disablePrefetch) {\n\t\t\treturn options.awsClientCapture(client);\n\t\t}\n\t\tconsole.warn(\"Unable to apply X-Ray outside of handler invocation scope.\");\n\t}\n\n\treturn client;\n};\n\nexport const createClient = async (options, request) => {\n\tlet awsClientCredentials = {};\n\n\t// Role Credentials\n\tif (options.awsClientAssumeRole) {\n\t\tif (!request) {\n\t\t\tthrow new Error(\"Request required when assuming role\", {\n\t\t\t\tcause: { package: \"@middy/util\" },\n\t\t\t});\n\t\t}\n\t\tawsClientCredentials = await getInternal(\n\t\t\t{ credentials: options.awsClientAssumeRole },\n\t\t\trequest,\n\t\t);\n\t}\n\n\tawsClientCredentials = {\n\t\t...awsClientCredentials,\n\t\t...options.awsClientOptions,\n\t};\n\n\treturn createPrefetchClient({\n\t\t...options,\n\t\tawsClientOptions: awsClientCredentials,\n\t});\n};\n\nexport const canPrefetch = (options = {}) => {\n\treturn !options.awsClientAssumeRole && !options.disablePrefetch;\n};\n\n// Internal Context\nexport const getInternal = async (variables, request) => {\n\tif (!variables || !request) return {};\n\tlet keys = [];\n\tlet values = [];\n\tif (variables === true) {\n\t\tkeys = values = Object.keys(request.internal);\n\t} else if (typeof variables === \"string\") {\n\t\tkeys = values = [variables];\n\t} else if (Array.isArray(variables)) {\n\t\tkeys = values = variables;\n\t} else if (typeof variables === \"object\") {\n\t\tkeys = Object.keys(variables);\n\t\tvalues = Object.values(variables);\n\t}\n\tconst promises = [];\n\tfor (const internalKey of values) {\n\t\t// 'internal.key.sub_value' -> { [key]: internal.key.sub_value }\n\t\tconst pathOptionKey = internalKey.split(\".\");\n\t\tconst rootOptionKey = pathOptionKey.shift();\n\t\tlet valuePromise = request.internal[rootOptionKey];\n\t\tif (!isPromise(valuePromise)) {\n\t\t\tvaluePromise = Promise.resolve(valuePromise);\n\t\t}\n\t\tpromises.push(\n\t\t\tvaluePromise.then((value) =>\n\t\t\t\tpathOptionKey.reduce((p, c) => p?.[c], value),\n\t\t\t),\n\t\t);\n\t}\n\t// ensure promise has resolved by the time it's needed\n\t// If one of the promises throws it will bubble up to @middy/core\n\tvalues = await Promise.allSettled(promises);\n\tconst errors = values\n\t\t.filter((res) => res.status === \"rejected\")\n\t\t.map((res) => res.reason);\n\tif (errors.length) {\n\t\tthrow new Error(\"Failed to resolve internal values\", {\n\t\t\tcause: { package: \"@middy/util\", data: errors },\n\t\t});\n\t}\n\tconst obj = {};\n\tfor (let i = keys.length; i--; ) {\n\t\tobj[sanitizeKey(keys[i])] = values[i].value;\n\t}\n\treturn obj;\n};\n\nconst isPromise = (promise) => typeof promise?.then === \"function\";\n\nconst sanitizeKeyPrefixLeadingNumber = /^([0-9])/;\nconst sanitizeKeyRemoveDisallowedChar = /[^a-zA-Z0-9]+/g;\nexport const sanitizeKey = (key) => {\n\treturn key\n\t\t.replace(sanitizeKeyPrefixLeadingNumber, \"_$1\")\n\t\t.replace(sanitizeKeyRemoveDisallowedChar, \"_\");\n};\n\n// fetch Cache\nconst cache = {}; // key: { value:{fetchKey:Promise}, expiry }\nexport const processCache = (\n\toptions,\n\tmiddlewareFetch = () => undefined,\n\trequest = {},\n) => {\n\tlet { cacheKey, cacheKeyExpiry, cacheExpiry } = options;\n\tcacheExpiry = cacheKeyExpiry?.[cacheKey] ?? cacheExpiry;\n\tconst now = Date.now();\n\tif (cacheExpiry) {\n\t\tconst cached = getCache(cacheKey);\n\t\tconst unexpired = cached.expiry && (cacheExpiry < 0 || cached.expiry > now);\n\n\t\tif (unexpired) {\n\t\t\tif (cached.modified) {\n\t\t\t\tconst value = middlewareFetch(request, cached.value);\n\t\t\t\tObject.assign(cached.value, value);\n\t\t\t\tcache[cacheKey] = { value: cached.value, expiry: cached.expiry };\n\t\t\t\treturn cache[cacheKey];\n\t\t\t}\n\t\t\treturn { ...cached, cache: true };\n\t\t}\n\t}\n\tconst value = middlewareFetch(request);\n\t// secrets-manager can override to unix timestamp\n\tconst expiry = cacheExpiry > 86400000 ? cacheExpiry : now + cacheExpiry;\n\tconst duration = cacheExpiry > 86400000 ? cacheExpiry - now : cacheExpiry;\n\tif (cacheExpiry) {\n\t\tconst refresh =\n\t\t\tduration > 0\n\t\t\t\t? setTimeout(\n\t\t\t\t\t\t() => processCache(options, middlewareFetch, request),\n\t\t\t\t\t\tduration,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\tcache[cacheKey] = { value, expiry, refresh };\n\t}\n\treturn { value, expiry };\n};\n\nexport const catchInvalidSignatureException = (e, client, command) => {\n\tif (e.__type === \"InvalidSignatureException\") {\n\t\treturn client.send(command);\n\t}\n\tthrow e;\n};\n\nexport const getCache = (key) => {\n\tif (!cache[key]) return {};\n\treturn cache[key];\n};\n\n// Used to remove parts of a cache\nexport const modifyCache = (cacheKey, value) => {\n\tif (!cache[cacheKey]) return;\n\tclearTimeout(cache[cacheKey]?.refresh);\n\tcache[cacheKey] = { ...cache[cacheKey], value, modified: true };\n};\n\nexport const clearCache = (inputKeys = null) => {\n\tlet keys = inputKeys;\n\tkeys ??= Object.keys(cache);\n\tif (!Array.isArray(keys)) {\n\t\tkeys = [keys];\n\t}\n\tfor (const cacheKey of keys) {\n\t\tclearTimeout(cache[cacheKey]?.refresh);\n\t\tcache[cacheKey] = undefined;\n\t}\n};\n\nexport const jsonSafeParse = (text, reviver) => {\n\tif (typeof text !== \"string\") return text;\n\tconst firstChar = text[0];\n\tif (firstChar !== \"{\" && firstChar !== \"[\" && firstChar !== '\"') return text;\n\ttry {\n\t\treturn JSON.parse(text, reviver);\n\t} catch (_e) {}\n\n\treturn text;\n};\n\nexport const jsonSafeStringify = (value, replacer, space) => {\n\ttry {\n\t\treturn JSON.stringify(value, replacer, space);\n\t} catch (_e) {}\n\n\treturn value;\n};\n\nexport const normalizeHttpResponse = (request) => {\n\tlet { response } = request;\n\tif (typeof response === \"undefined\") {\n\t\tresponse = {};\n\t} else if (\n\t\ttypeof response?.statusCode === \"undefined\" &&\n\t\ttypeof response?.body === \"undefined\" &&\n\t\ttypeof response?.headers === \"undefined\"\n\t) {\n\t\tresponse = { statusCode: 200, body: response };\n\t}\n\tresponse.statusCode ??= 500;\n\tresponse.headers ??= {};\n\trequest.response = response;\n\treturn response;\n};\n\nconst createErrorRegexp = /[^a-zA-Z]/g;\nexport class HttpError extends Error {\n\tconstructor(code, optionalMessage, optionalOptions = {}) {\n\t\tlet message = optionalMessage;\n\t\tlet options = optionalOptions;\n\t\tif (message && typeof message !== \"string\") {\n\t\t\toptions = message;\n\t\t\tmessage = undefined;\n\t\t}\n\t\tmessage ??= httpErrorCodes[code];\n\t\tsuper(message, options);\n\n\t\tconst name = httpErrorCodes[code].replace(createErrorRegexp, \"\");\n\t\tthis.name = name.substr(-5) !== \"Error\" ? `${name}Error` : name;\n\n\t\tthis.status = this.statusCode = code; // setting `status` for backwards compatibility w/ `http-errors`\n\t\tthis.expose = options.expose ?? code < 500;\n\t}\n}\n\nexport const createError = (code, message, properties = {}) => {\n\treturn new HttpError(code, message, properties);\n};\n\nconst httpErrorCodes = {\n\t100: \"Continue\",\n\t101: \"Switching Protocols\",\n\t102: \"Processing\",\n\t103: \"Early Hints\",\n\t200: \"OK\",\n\t201: \"Created\",\n\t202: \"Accepted\",\n\t203: \"Non-Authoritative Information\",\n\t204: \"No Content\",\n\t205: \"Reset Content\",\n\t206: \"Partial Content\",\n\t207: \"Multi-Status\",\n\t208: \"Already Reported\",\n\t226: \"IM Used\",\n\t300: \"Multiple Choices\",\n\t301: \"Moved Permanently\",\n\t302: \"Found\",\n\t303: \"See Other\",\n\t304: \"Not Modified\",\n\t305: \"Use Proxy\",\n\t306: \"(Unused)\",\n\t307: \"Temporary Redirect\",\n\t308: \"Permanent Redirect\",\n\t400: \"Bad Request\",\n\t401: \"Unauthorized\",\n\t402: \"Payment Required\",\n\t403: \"Forbidden\",\n\t404: \"Not Found\",\n\t405: \"Method Not Allowed\",\n\t406: \"Not Acceptable\",\n\t407: \"Proxy Authentication Required\",\n\t408: \"Request Timeout\",\n\t409: \"Conflict\",\n\t410: \"Gone\",\n\t411: \"Length Required\",\n\t412: \"Precondition Failed\",\n\t413: \"Payload Too Large\",\n\t414: \"URI Too Long\",\n\t415: \"Unsupported Media Type\",\n\t416: \"Range Not Satisfiable\",\n\t417: \"Expectation Failed\",\n\t418: \"I'm a teapot\",\n\t421: \"Misdirected Request\",\n\t422: \"Unprocessable Entity\",\n\t423: \"Locked\",\n\t424: \"Failed Dependency\",\n\t425: \"Unordered Collection\",\n\t426: \"Upgrade Required\",\n\t428: \"Precondition Required\",\n\t429: \"Too Many Requests\",\n\t431: \"Request Header Fields Too Large\",\n\t451: \"Unavailable For Legal Reasons\",\n\t500: \"Internal Server Error\",\n\t501: \"Not Implemented\",\n\t502: \"Bad Gateway\",\n\t503: \"Service Unavailable\",\n\t504: \"Gateway Timeout\",\n\t505: \"HTTP Version Not Supported\",\n\t506: \"Variant Also Negotiates\",\n\t507: \"Insufficient Storage\",\n\t508: \"Loop Detected\",\n\t509: \"Bandwidth Limit Exceeded\",\n\t510: \"Not Extended\",\n\t511: \"Network Authentication Required\",\n};\n", "import { jsonSafeParse, normalizeHttpResponse } from \"@middy/util\";\n\nconst defaults = {\n\tlogger: console.error, // TODO v7 change to pass in request\n\tfallbackMessage: undefined,\n};\n\nconst httpErrorHandlerMiddleware = (opts = {}) => {\n\tconst options = { ...defaults, ...opts };\n\n\tconst httpErrorHandlerMiddlewareOnError = async (request) => {\n\t\tif (request.response !== undefined) return;\n\t\tif (typeof options.logger === \"function\") {\n\t\t\toptions.logger(request.error);\n\t\t}\n\n\t\t// Set default expose value, only passes in when there is an override\n\t\tif (request.error.statusCode && request.error.expose === undefined) {\n\t\t\trequest.error.expose = request.error.statusCode < 500;\n\t\t}\n\n\t\t// Non-http error OR expose set to false\n\t\tif (!request.error.expose || !request.error.statusCode) {\n\t\t\trequest.error = {\n\t\t\t\tstatusCode: 500,\n\t\t\t\tmessage: options.fallbackMessage,\n\t\t\t\texpose: true,\n\t\t\t};\n\t\t}\n\n\t\tif (request.error.expose) {\n\t\t\tnormalizeHttpResponse(request);\n\t\t\tconst { statusCode, message, headers } = request.error;\n\n\t\t\trequest.response = {\n\t\t\t\t...request.response,\n\t\t\t\tstatusCode,\n\t\t\t\theaders: {\n\t\t\t\t\t...request.response.headers,\n\t\t\t\t\t...headers,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (message) {\n\t\t\t\tconst headerContentType =\n\t\t\t\t\ttypeof jsonSafeParse(message) === \"string\"\n\t\t\t\t\t\t? \"text/plain\"\n\t\t\t\t\t\t: \"application/json\";\n\t\t\t\trequest.response.body = message;\n\t\t\t\trequest.response.headers[\"Content-Type\"] = headerContentType;\n\t\t\t}\n\t\t}\n\t};\n\n\treturn {\n\t\tonError: httpErrorHandlerMiddlewareOnError,\n\t};\n};\nexport default httpErrorHandlerMiddleware;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["assert", "assert", "logger", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "assert", "logger", "assert", "logger", "assert", "Logger", "setTimeout", "middy", "e", "Logger"]
|
|
7
7
|
}
|
package/lib/lambda/index.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
|
|
2
1
|
import { IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
|
|
3
|
-
import {
|
|
4
|
-
import middy from "@middy/core";
|
|
2
|
+
import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
|
|
5
3
|
import { Logger } from "@aws-lambda-powertools/logger";
|
|
6
|
-
import { Tracer } from "@aws-lambda-powertools/tracer";
|
|
7
4
|
import { Metrics } from "@aws-lambda-powertools/metrics";
|
|
8
|
-
import
|
|
9
|
-
|
|
5
|
+
import { Tracer } from "@aws-lambda-powertools/tracer";
|
|
6
|
+
import middy from "@middy/core";
|
|
7
|
+
import type { Handler } from "aws-lambda";
|
|
8
|
+
import { DynamoDBService, LocationService, S3Service, SQSService, SSMService, STSService } from "../services/index.js";
|
|
10
9
|
export declare const logger: Logger;
|
|
11
10
|
export declare const tracer: Tracer;
|
|
12
11
|
export declare const metrics: Metrics;
|
|
12
|
+
export declare const withMiddlewares: (handler: Handler) => middy.MiddyfiedHandler<any, any, Error, any>;
|
|
13
13
|
export declare const getPersistenceStore: () => DynamoDBPersistenceLayer;
|
|
14
14
|
export declare const getIdempotencyConfig: (eventKeyJmesPath: string) => IdempotencyConfig;
|
|
15
15
|
export declare const SQS_IDEMPOTENCY_OPTIONS: {
|
|
16
16
|
persistenceStore: DynamoDBPersistenceLayer;
|
|
17
17
|
config: IdempotencyConfig;
|
|
18
18
|
};
|
|
19
|
-
export type
|
|
19
|
+
export type AcServices = {
|
|
20
20
|
dynamoDBService?: DynamoDBService;
|
|
21
21
|
locationService?: LocationService;
|
|
22
22
|
s3Service?: S3Service;
|
|
@@ -26,12 +26,11 @@ export type AcServicesContext = {
|
|
|
26
26
|
sourceS3Service?: S3Service;
|
|
27
27
|
destinationS3Service?: S3Service;
|
|
28
28
|
};
|
|
29
|
-
declare module "
|
|
30
|
-
interface
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
29
|
+
declare module "aws-lambda" {
|
|
30
|
+
interface Context {
|
|
31
|
+
logger: Logger;
|
|
32
|
+
tracer: Tracer;
|
|
33
|
+
metrics: Metrics;
|
|
34
|
+
acServices?: AcServices;
|
|
36
35
|
}
|
|
37
36
|
}
|
package/lib/utils/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aspan-corporation/ac-shared",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.6",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"@aws-sdk/lib-storage": "^3.893.0",
|
|
36
36
|
"@aws-sdk/s3-request-presigner": "^3.893.0",
|
|
37
37
|
"@middy/core": "^4.7.0",
|
|
38
|
+
"@middy/http-error-handler": "^6.4.5",
|
|
38
39
|
"aws-lambda": "^1.0.7"
|
|
39
40
|
},
|
|
40
41
|
"publishConfig": {
|