@aspan-corporation/ac-shared 1.2.1 → 1.2.3

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 CHANGED
@@ -90,7 +90,7 @@ var processMeta = async ({
90
90
  meta,
91
91
  metaTableName,
92
92
  size,
93
- logger,
93
+ logger: logger2,
94
94
  locationService,
95
95
  dynamoDBService
96
96
  }) => {
@@ -109,7 +109,7 @@ var processMeta = async ({
109
109
  throw Error("Can not resolve geo data");
110
110
  }
111
111
  } catch (error) {
112
- logger.error("Error fetching geo data", {
112
+ logger2.error("Error fetching geo data", {
113
113
  message: error instanceof Error ? error.message : ""
114
114
  });
115
115
  }
@@ -131,8 +131,8 @@ var processMeta = async ({
131
131
  key: "ac:tau:" + tag.key,
132
132
  value: tag.value
133
133
  }));
134
- logger.debug("metaData", { newTags });
135
- logger.debug("trying to read existing metadata");
134
+ logger2.debug("metaData", { newTags });
135
+ logger2.debug("trying to read existing metadata");
136
136
  const getResponse = await dynamoDBService.getCommand({
137
137
  TableName: metaTableName,
138
138
  Key: {
@@ -140,9 +140,9 @@ var processMeta = async ({
140
140
  }
141
141
  });
142
142
  const oldTags = getResponse.Item?.tags;
143
- logger.debug("existing tags", { getResponse });
144
- const reconciledTags = reconcileTags({ newTags, oldTags }, logger);
145
- logger.debug("result", { reconciledTags });
143
+ logger2.debug("existing tags", { getResponse });
144
+ const reconciledTags = reconcileTags({ newTags, oldTags }, logger2);
145
+ logger2.debug("result", { reconciledTags });
146
146
  const updateResponse = await dynamoDBService.updateCommand({
147
147
  TableName: metaTableName,
148
148
  Key: {
@@ -154,13 +154,13 @@ var processMeta = async ({
154
154
  },
155
155
  ReturnValues: "ALL_NEW"
156
156
  });
157
- logger.debug("sent UpdateCommand", { updateResponse });
157
+ logger2.debug("sent UpdateCommand", { updateResponse });
158
158
  };
159
- var reconcileTags = ({ oldTags = [], newTags = [] }, logger) => oldTags.reduce((acc, cur) => {
159
+ var reconcileTags = ({ oldTags = [], newTags = [] }, logger2) => oldTags.reduce((acc, cur) => {
160
160
  if (acc.find((element) => element.key === cur.key)) {
161
161
  return acc;
162
162
  } else {
163
- logger.debug("added", cur);
163
+ logger2.debug("added", cur);
164
164
  return [...acc, cur];
165
165
  }
166
166
  }, newTags);
@@ -202,12 +202,12 @@ var S3Service = class {
202
202
  logger;
203
203
  client;
204
204
  constructor({
205
- logger,
205
+ logger: logger2,
206
206
  client,
207
207
  assumeRoleCommandOutput,
208
208
  region
209
209
  }) {
210
- this.logger = logger;
210
+ this.logger = logger2;
211
211
  if (client) {
212
212
  this.client = client;
213
213
  } else {
@@ -303,12 +303,12 @@ var DynamoDBService = class {
303
303
  client;
304
304
  documentClient;
305
305
  constructor({
306
- logger,
306
+ logger: logger2,
307
307
  client,
308
308
  assumeRoleCommandOutput,
309
309
  region
310
310
  }) {
311
- this.logger = logger;
311
+ this.logger = logger2;
312
312
  if (client) {
313
313
  this.client = client;
314
314
  } else {
@@ -353,12 +353,12 @@ var SSMService = class {
353
353
  logger;
354
354
  client;
355
355
  constructor({
356
- logger,
356
+ logger: logger2,
357
357
  client,
358
358
  assumeRoleCommandOutput,
359
359
  region
360
360
  }) {
361
- this.logger = logger;
361
+ this.logger = logger2;
362
362
  if (client) {
363
363
  this.client = client;
364
364
  } else {
@@ -392,12 +392,12 @@ var SQSService = class {
392
392
  logger;
393
393
  client;
394
394
  constructor({
395
- logger,
395
+ logger: logger2,
396
396
  client,
397
397
  assumeRoleCommandOutput,
398
398
  region
399
399
  }) {
400
- this.logger = logger;
400
+ this.logger = logger2;
401
401
  if (client) {
402
402
  this.client = client;
403
403
  } else {
@@ -436,12 +436,12 @@ var STSService = class {
436
436
  logger;
437
437
  client;
438
438
  constructor({
439
- logger,
439
+ logger: logger2,
440
440
  region,
441
441
  client
442
442
  }) {
443
- if (logger) {
444
- this.logger = logger;
443
+ if (logger2) {
444
+ this.logger = logger2;
445
445
  } else {
446
446
  this.logger = new Logger();
447
447
  this.logger.appendKeys({ scope: "STSService" });
@@ -477,12 +477,12 @@ var LocationService = class {
477
477
  logger;
478
478
  client;
479
479
  constructor({
480
- logger,
480
+ logger: logger2,
481
481
  client,
482
482
  assumeRoleCommandOutput,
483
483
  region
484
484
  }) {
485
- this.logger = logger;
485
+ this.logger = logger2;
486
486
  if (client) {
487
487
  this.client = client;
488
488
  } else {
@@ -504,9 +504,197 @@ var LocationService = class {
504
504
  }
505
505
  };
506
506
 
507
- // src/lambda/sharedUtils.ts
507
+ // src/lambda/index.ts
508
508
  import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
509
509
  import { IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
510
+
511
+ // node_modules/@middy/core/index.js
512
+ import { Readable } from "node:stream";
513
+ import { pipeline } from "node:stream/promises";
514
+ import { setTimeout } from "node:timers/promises";
515
+ var defaultLambdaHandler = () => {
516
+ };
517
+ var defaultPlugin = {
518
+ timeoutEarlyInMillis: 5,
519
+ timeoutEarlyResponse: () => {
520
+ throw new Error("Timeout");
521
+ },
522
+ streamifyResponse: false
523
+ // Deprecate need for this when AWS provides a flag for when it's looking for it
524
+ };
525
+ var middy = (lambdaHandler = defaultLambdaHandler, plugin = {}) => {
526
+ if (typeof lambdaHandler !== "function") {
527
+ plugin = lambdaHandler;
528
+ lambdaHandler = defaultLambdaHandler;
529
+ }
530
+ plugin = {
531
+ ...defaultPlugin,
532
+ ...plugin
533
+ };
534
+ plugin.timeoutEarly = plugin.timeoutEarlyInMillis > 0;
535
+ plugin.beforePrefetch?.();
536
+ const beforeMiddlewares = [];
537
+ const afterMiddlewares = [];
538
+ const onErrorMiddlewares = [];
539
+ const middyHandler = (event = {}, context = {}) => {
540
+ plugin.requestStart?.();
541
+ const request = {
542
+ event,
543
+ context,
544
+ response: void 0,
545
+ error: void 0,
546
+ internal: plugin.internal ?? {}
547
+ };
548
+ return runRequest(request, [
549
+ ...beforeMiddlewares
550
+ ], lambdaHandler, [
551
+ ...afterMiddlewares
552
+ ], [
553
+ ...onErrorMiddlewares
554
+ ], plugin);
555
+ };
556
+ const middy2 = plugin.streamifyResponse ? awslambda.streamifyResponse(async (event, responseStream, context) => {
557
+ const handlerResponse = await middyHandler(event, context);
558
+ let handlerBody = handlerResponse;
559
+ if (handlerResponse.statusCode) {
560
+ handlerBody = handlerResponse.body ?? "";
561
+ responseStream = awslambda.HttpResponseStream.from(responseStream, handlerResponse);
562
+ }
563
+ let handlerStream;
564
+ if (handlerBody._readableState) {
565
+ handlerStream = handlerBody;
566
+ } else if (typeof handlerBody === "string") {
567
+ function* iterator(input) {
568
+ const size = 16384;
569
+ let position = 0;
570
+ const length = input.length;
571
+ while (position < length) {
572
+ yield input.substring(position, position + size);
573
+ position += size;
574
+ }
575
+ }
576
+ handlerStream = Readable.from(iterator(handlerBody));
577
+ }
578
+ if (!handlerStream) {
579
+ throw new Error("handler response not a ReadableStream");
580
+ }
581
+ await pipeline(handlerStream, responseStream);
582
+ }) : middyHandler;
583
+ middy2.use = (middlewares) => {
584
+ if (!Array.isArray(middlewares)) {
585
+ middlewares = [
586
+ middlewares
587
+ ];
588
+ }
589
+ for (const middleware of middlewares) {
590
+ const { before, after, onError } = middleware;
591
+ if (!before && !after && !onError) {
592
+ throw new Error('Middleware must be an object containing at least one key among "before", "after", "onError"');
593
+ }
594
+ if (before)
595
+ middy2.before(before);
596
+ if (after)
597
+ middy2.after(after);
598
+ if (onError)
599
+ middy2.onError(onError);
600
+ }
601
+ return middy2;
602
+ };
603
+ middy2.before = (beforeMiddleware) => {
604
+ beforeMiddlewares.push(beforeMiddleware);
605
+ return middy2;
606
+ };
607
+ middy2.after = (afterMiddleware) => {
608
+ afterMiddlewares.unshift(afterMiddleware);
609
+ return middy2;
610
+ };
611
+ middy2.onError = (onErrorMiddleware) => {
612
+ onErrorMiddlewares.unshift(onErrorMiddleware);
613
+ return middy2;
614
+ };
615
+ middy2.handler = (replaceLambdaHandler) => {
616
+ lambdaHandler = replaceLambdaHandler;
617
+ return middy2;
618
+ };
619
+ return middy2;
620
+ };
621
+ var runRequest = async (request, beforeMiddlewares, lambdaHandler, afterMiddlewares, onErrorMiddlewares, plugin) => {
622
+ let timeoutAbort;
623
+ const timeoutEarly = plugin.timeoutEarly && request.context.getRemainingTimeInMillis;
624
+ try {
625
+ await runMiddlewares(request, beforeMiddlewares, plugin);
626
+ if (typeof request.response === "undefined") {
627
+ plugin.beforeHandler?.();
628
+ const handlerAbort = new AbortController();
629
+ if (timeoutEarly)
630
+ timeoutAbort = new AbortController();
631
+ request.response = await Promise.race([
632
+ lambdaHandler(request.event, request.context, {
633
+ signal: handlerAbort.signal
634
+ }),
635
+ timeoutEarly ? setTimeout(request.context.getRemainingTimeInMillis() - plugin.timeoutEarlyInMillis, void 0, {
636
+ signal: timeoutAbort.signal
637
+ }).then(() => {
638
+ handlerAbort.abort();
639
+ return plugin.timeoutEarlyResponse();
640
+ }) : Promise.race([])
641
+ ]);
642
+ timeoutAbort?.abort();
643
+ plugin.afterHandler?.();
644
+ await runMiddlewares(request, afterMiddlewares, plugin);
645
+ }
646
+ } catch (e) {
647
+ timeoutAbort?.abort();
648
+ request.response = void 0;
649
+ request.error = e;
650
+ try {
651
+ await runMiddlewares(request, onErrorMiddlewares, plugin);
652
+ } catch (e2) {
653
+ e2.originalError = request.error;
654
+ request.error = e2;
655
+ throw request.error;
656
+ }
657
+ if (typeof request.response === "undefined")
658
+ throw request.error;
659
+ } finally {
660
+ await plugin.requestEnd?.(request);
661
+ }
662
+ return request.response;
663
+ };
664
+ var runMiddlewares = async (request, middlewares, plugin) => {
665
+ for (const nextMiddleware of middlewares) {
666
+ plugin.beforeMiddleware?.(nextMiddleware.name);
667
+ const res = await nextMiddleware(request);
668
+ plugin.afterMiddleware?.(nextMiddleware.name);
669
+ if (typeof res !== "undefined") {
670
+ request.response = res;
671
+ return;
672
+ }
673
+ }
674
+ };
675
+ var core_default = middy;
676
+
677
+ // src/lambda/index.ts
678
+ import { Logger as Logger2 } from "@aws-lambda-powertools/logger";
679
+ import { Tracer } from "@aws-lambda-powertools/tracer";
680
+ import { Metrics } from "@aws-lambda-powertools/metrics";
681
+ import { injectLambdaContext } from "@aws-lambda-powertools/logger/middleware";
682
+ import { captureLambdaHandler } from "@aws-lambda-powertools/tracer/middleware";
683
+ import { logMetrics } from "@aws-lambda-powertools/metrics/middleware";
684
+ var withMiddlewares = (handler) => core_default(handler).use(injectLambdaContext(logger)).use(captureLambdaHandler(tracer)).use(logMetrics(metrics)).use({
685
+ before: async (request) => {
686
+ logger.setCorrelationId(
687
+ request.context.awsRequestId || "no-aws-request-id"
688
+ );
689
+ logger.logEventIfEnabled(request.event);
690
+ request.context.logger = logger;
691
+ request.context.tracer = tracer;
692
+ request.context.metrics = metrics;
693
+ }
694
+ });
695
+ var logger = new Logger2();
696
+ var tracer = new Tracer();
697
+ var metrics = new Metrics();
510
698
  var getPersistenceStore = () => {
511
699
  return new DynamoDBPersistenceLayer({
512
700
  tableName: assertEnvVar("AC_IDEMPOTENCY_TABLE_NAME")
@@ -549,7 +737,11 @@ export {
549
737
  getThumbsKey,
550
738
  isAllowedExtension,
551
739
  isAllowedVideoExtension,
740
+ logger,
741
+ metrics,
552
742
  normalizeErrorMessage,
553
- processMeta
743
+ processMeta,
744
+ tracer,
745
+ withMiddlewares
554
746
  };
555
747
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/services/s3.ts", "../src/utils/assertUtils.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/sharedUtils.ts"],
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\";\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"],
5
- "mappings": "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",
6
- "names": ["assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert", "assert"]
3
+ "sources": ["../src/services/s3.ts", "../src/utils/assertUtils.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"],
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"]
7
7
  }
@@ -1 +1,37 @@
1
- export * from "./sharedUtils.js";
1
+ import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
2
+ import { IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
3
+ import { DynamoDBService, LocationService, S3Service, SQSService, SSMService, STSService } from "../services/index.js";
4
+ import middy from "@middy/core";
5
+ import { Logger } from "@aws-lambda-powertools/logger";
6
+ import { Tracer } from "@aws-lambda-powertools/tracer";
7
+ import { Metrics } from "@aws-lambda-powertools/metrics";
8
+ import type { Context } from "aws-lambda";
9
+ export declare const withMiddlewares: (handler: middy.MiddyfiedHandler) => middy.MiddyfiedHandler<any, any, Error, any>;
10
+ export declare const logger: Logger;
11
+ export declare const tracer: Tracer;
12
+ export declare const metrics: Metrics;
13
+ export declare const getPersistenceStore: () => DynamoDBPersistenceLayer;
14
+ export declare const getIdempotencyConfig: (eventKeyJmesPath: string) => IdempotencyConfig;
15
+ export declare const SQS_IDEMPOTENCY_OPTIONS: {
16
+ persistenceStore: DynamoDBPersistenceLayer;
17
+ config: IdempotencyConfig;
18
+ };
19
+ export type AcServicesContext = {
20
+ dynamoDBService?: DynamoDBService;
21
+ locationService?: LocationService;
22
+ s3Service?: S3Service;
23
+ sqsService?: SQSService;
24
+ ssmService?: SSMService;
25
+ stsService?: STSService;
26
+ sourceS3Service?: S3Service;
27
+ destinationS3Service?: S3Service;
28
+ };
29
+ declare module "@middy/core" {
30
+ interface MiddyRequest<TEvent = unknown, TResult = unknown, TContext extends Context = Context> {
31
+ context: TContext & {
32
+ logger: Logger;
33
+ tracer: Tracer;
34
+ metrics: Metrics;
35
+ };
36
+ }
37
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aspan-corporation/ac-shared",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "main": "lib/index.js",
@@ -1,6 +0,0 @@
1
- import { Metrics } from "@aws-lambda-powertools/metrics";
2
- import { Tracer } from "@aws-lambda-powertools/tracer";
3
- import { Logger } from "@aws-lambda-powertools/logger";
4
- export declare const logger: Logger;
5
- export declare const tracer: Tracer;
6
- export declare const metrics: Metrics;
@@ -1,19 +0,0 @@
1
- import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/dynamodb";
2
- import { IdempotencyConfig } from "@aws-lambda-powertools/idempotency";
3
- import { DynamoDBService, LocationService, S3Service, SQSService, SSMService, STSService } from "../services/index.js";
4
- export declare const getPersistenceStore: () => DynamoDBPersistenceLayer;
5
- export declare const getIdempotencyConfig: (eventKeyJmesPath: string) => IdempotencyConfig;
6
- export declare const SQS_IDEMPOTENCY_OPTIONS: {
7
- persistenceStore: DynamoDBPersistenceLayer;
8
- config: IdempotencyConfig;
9
- };
10
- export type AcServicesContext = {
11
- dynamoDBService?: DynamoDBService;
12
- locationService?: LocationService;
13
- s3Service?: S3Service;
14
- sqsService?: SQSService;
15
- ssmService?: SSMService;
16
- stsService?: STSService;
17
- sourceS3Service?: S3Service;
18
- destinationS3Service?: S3Service;
19
- };
@@ -1,2 +0,0 @@
1
- import middy from "@middy/core";
2
- export declare const withMiddlewares: (handler: middy.MiddyfiedHandler) => middy.MiddyfiedHandler<any, any, Error, any>;