From 12f053b5a7fe5a64c99e38225895ad730bbef01d Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Wed, 29 Jan 2025 22:40:36 -0600 Subject: [PATCH 01/17] build a generalizable setup for async sqs handling --- src/api/build.js | 74 ++++++---- src/api/package.json | 5 + src/api/sqs/handlers.ts | 16 +++ src/api/sqs/index.ts | 60 +++++++++ src/api/sqs/logger.ts | 2 + src/common/types/sqsMessage.ts | 58 ++++++++ yarn.lock | 239 +++++++++++++++++++++++++++++++-- 7 files changed, 417 insertions(+), 37 deletions(-) create mode 100644 src/api/sqs/handlers.ts create mode 100644 src/api/sqs/index.ts create mode 100644 src/api/sqs/logger.ts create mode 100644 src/common/types/sqsMessage.ts diff --git a/src/api/build.js b/src/api/build.js index f24c8100..8d264981 100644 --- a/src/api/build.js +++ b/src/api/build.js @@ -1,39 +1,55 @@ import esbuild from "esbuild"; import { resolve } from "path"; + +const commonParams = { + bundle: true, + format: "esm", + minify: true, + outExtension: { ".js": ".mjs" }, + loader: { + ".png": "file", + ".pkpass": "file", + ".json": "file", + }, // File loaders + target: "es2022", // Target ES2022 + sourcemap: false, + platform: "node", + external: ["aws-sdk", "moment-timezone", "passkit-generator", "fastify"], + alias: { + 'moment-timezone': resolve(process.cwd(), '../../node_modules/moment-timezone/builds/moment-timezone-with-data-10-year-range.js') + }, + banner: { + js: ` + import path from 'path'; + import { fileURLToPath } from 'url'; + import { createRequire as topLevelCreateRequire } from 'module'; + const require = topLevelCreateRequire(import.meta.url); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + `.trim(), + }, // Banner for compatibility with CommonJS +} esbuild .build({ - entryPoints: ["api/lambda.js"], // Entry file - bundle: true, - format: "esm", - minify: true, + ...commonParams, + entryPoints: ["api/index.js"], outdir: "../../dist/lambda/", - outExtension: { ".js": ".mjs" }, - loader: { - ".png": "file", - ".pkpass": "file", - ".json": "file", - }, // File loaders - target: "es2022", // Target ES2022 - sourcemap: false, - platform: "node", - external: ["aws-sdk", "moment-timezone", "passkit-generator", "fastify"], - alias: { - 'moment-timezone': resolve(process.cwd(), '../../node_modules/moment-timezone/builds/moment-timezone-with-data-10-year-range.js') - }, - banner: { - js: ` - import path from 'path'; - import { fileURLToPath } from 'url'; - import { createRequire as topLevelCreateRequire } from 'module'; - const require = topLevelCreateRequire(import.meta.url); - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - `.trim(), - }, // Banner for compatibility with CommonJS }) - .then(() => console.log("Build completed successfully!")) + .then(() => console.log("API server build completed successfully!")) + .catch((error) => { + console.error("API server build failed:", error); + process.exit(1); + }); + + esbuild + .build({ + ...commonParams, + entryPoints: ["api/sqs/index.js"], + outdir: "../../dist/sqsConsumer/", + }) + .then(() => console.log("SQS consumer build completed successfully!")) .catch((error) => { - console.error("Build failed:", error); + console.error("SQS consumer build failed:", error); process.exit(1); }); diff --git a/src/api/package.json b/src/api/package.json index 765b03b7..5a90f370 100644 --- a/src/api/package.json +++ b/src/api/package.json @@ -25,6 +25,9 @@ "@fastify/aws-lambda": "^5.0.0", "@fastify/caching": "^9.0.1", "@fastify/cors": "^10.0.1", + "@middy/core": "^6.0.0", + "@middy/event-normalizer": "^6.0.0", + "@middy/sqs-partial-batch-failure": "^6.0.0", "@touch4it/ical-timezones": "^1.9.0", "base64-arraybuffer": "^1.0.2", "discord.js": "^14.15.3", @@ -39,6 +42,7 @@ "moment-timezone": "^0.5.45", "node-cache": "^5.1.2", "passkit-generator": "^3.3.1", + "pino": "^9.6.0", "pluralize": "^8.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.2", @@ -46,6 +50,7 @@ }, "devDependencies": { "@tsconfig/node22": "^22.0.0", + "@types/aws-lambda": "^8.10.147", "nodemon": "^3.1.9" } } diff --git a/src/api/sqs/handlers.ts b/src/api/sqs/handlers.ts new file mode 100644 index 00000000..494cbb1f --- /dev/null +++ b/src/api/sqs/handlers.ts @@ -0,0 +1,16 @@ +import { AvailableSQSFunctions } from "common/types/sqsMessage.js"; +import { SQSHandlerFunction } from "./index.js"; + +export const emailMembershipPassHandler: SQSHandlerFunction< + AvailableSQSFunctions.EmailMembershipPass +> = async (payload, metadata, logger) => { + logger.error("Not implemented yet!"); + return; +}; + +export const pingHandler: SQSHandlerFunction< + AvailableSQSFunctions.Ping +> = async (payload, metadata, logger) => { + logger.error("Not implemented yet!"); + return; +}; diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts new file mode 100644 index 00000000..baafc105 --- /dev/null +++ b/src/api/sqs/index.ts @@ -0,0 +1,60 @@ +import middy from "@middy/core"; +import eventNormalizerMiddleware from "@middy/event-normalizer"; +import sqsPartialBatchFailure from "@middy/sqs-partial-batch-failure"; +import { Context, SQSEvent } from "aws-lambda"; +import { + parseSQSPayload, + SQSPayload, + sqsPayloadSchemas, + AvailableSQSFunctions, + SQSMessageMetadata, +} from "../../common/types/sqsMessage.js"; +import { logger } from "./logger.js"; +import { z, ZodError } from "zod"; +import pino from "pino"; +import { emailMembershipPassHandler, pingHandler } from "./handlers.js"; + +export type SQSFunctionPayloadTypes = { + [K in keyof typeof sqsPayloadSchemas]: SQSHandlerFunction; +}; + +export type SQSHandlerFunction = ( + payload: z.infer<(typeof sqsPayloadSchemas)[T]>["payload"], + metadata: SQSMessageMetadata, + logger: pino.Logger, +) => Promise; + +const handlers: SQSFunctionPayloadTypes = { + [AvailableSQSFunctions.EmailMembershipPass]: emailMembershipPassHandler, + [AvailableSQSFunctions.Ping]: pingHandler, +}; + +export const handler = middy() + .use(eventNormalizerMiddleware()) + .use(sqsPartialBatchFailure()) + .handler((event: SQSEvent, context: Context, { signal }) => { + const recordsPromises = event.Records.map(async (record, index) => { + try { + let parsedBody = parseSQSPayload(record.body); + if (parsedBody instanceof ZodError) { + logger.error( + { sqsMessageId: record.messageId }, + parsedBody.toString(), + ); + } + parsedBody = parsedBody as SQSPayload; + const childLogger = logger.child({ + sqsMessageId: record.messageId, + metadata: parsedBody.metadata, + }); + childLogger.info("Processing started."); + const func = handlers[parsedBody.function] as SQSHandlerFunction< + typeof parsedBody.function + >; + return func(parsedBody.payload, parsedBody.metadata, childLogger); + } catch (e: any) { + logger.error({ sqsMessageId: record.messageId }, e.toString()); + } + }); + return Promise.allSettled(recordsPromises); + }); diff --git a/src/api/sqs/logger.ts b/src/api/sqs/logger.ts new file mode 100644 index 00000000..36c2d586 --- /dev/null +++ b/src/api/sqs/logger.ts @@ -0,0 +1,2 @@ +import { pino } from "pino"; +export const logger = pino(); diff --git a/src/common/types/sqsMessage.ts b/src/common/types/sqsMessage.ts new file mode 100644 index 00000000..2eaf80b2 --- /dev/null +++ b/src/common/types/sqsMessage.ts @@ -0,0 +1,58 @@ +import { z, ZodError, ZodType } from "zod"; + +export enum AvailableSQSFunctions { + Ping = "pong", + EmailMembershipPass = "emailMembershipPass", +} + +const sqsMessageMetadataSchema = z.object({ + taskId: z.string().min(1), + reqId: z.string().min(1), + initiator: z.string().min(1), +}); + +export type SQSMessageMetadata = z.infer; + +const baseSchema = z.object({ + metadata: sqsMessageMetadataSchema, +}); + +const createSQSSchema = >( + func: T, + payloadSchema: P +) => + baseSchema.extend({ + function: z.literal(func), + payload: payloadSchema, + }); + +export const sqsPayloadSchemas = { + [AvailableSQSFunctions.Ping]: createSQSSchema(AvailableSQSFunctions.Ping, z.object({})), + [AvailableSQSFunctions.EmailMembershipPass]: createSQSSchema( + AvailableSQSFunctions.EmailMembershipPass, + z.object({ email: z.string().email() }) + ), +} as const; + +export const sqsPayloadSchema = z.discriminatedUnion( + "function", + [ + sqsPayloadSchemas[AvailableSQSFunctions.Ping], + sqsPayloadSchemas[AvailableSQSFunctions.EmailMembershipPass], + ] as const +); + +export type SQSPayload = z.infer; + +export type SQSFunctionPayloadTypes = { + [K in keyof typeof sqsPayloadSchemas]: z.infer<(typeof sqsPayloadSchemas)[K]>; +}; + +export function parseSQSPayload(json: unknown): SQSPayload | ZodError { + const parsed = sqsPayloadSchema.safeParse(json); + if (parsed.success) { + return parsed.data; + } else { + return parsed.error; + } +} diff --git a/yarn.lock b/yarn.lock index 02fc88e3..84f7971e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2186,6 +2186,28 @@ dependencies: "@types/mdx" "^2.0.0" +"@middy/core@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@middy/core/-/core-6.0.0.tgz#f1ecbe9809816cc8f5d08a69311861f0103387d6" + integrity sha512-EFsvMkyFfaIu3Uzye26w2NzycwMAbh/99XlhRH9p240y/YKA0nlQ7itE8y7lBJOJ/clj1qu9evQeLfaiWhJAFg== + +"@middy/event-normalizer@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@middy/event-normalizer/-/event-normalizer-6.0.0.tgz#9415cc1bbce466f54f16acd3f0bf8bf2f005efa2" + integrity sha512-JUHCrTME9fQR3ipSc65KW+DLEz/cqfQ63+j9BzHj2SRm6aSAjQIl/br4hds/0VMdMWQKiwL7nEEfWAGpqX6Ddw== + dependencies: + "@middy/util" "6.0.0" + +"@middy/sqs-partial-batch-failure@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@middy/sqs-partial-batch-failure/-/sqs-partial-batch-failure-6.0.0.tgz#c844611c5f9e0c8c5b4358bb8f0b7788676708f2" + integrity sha512-/8uhEibYvoJz2K83hgHFv2wCUxHuR3jGE7vqDL7PrQ4UtgQIJaFqvyKUzn8K+kfrV33EMtkSmI4SoZ3dbzwKWA== + +"@middy/util@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@middy/util/-/util-6.0.0.tgz#dddada0cfa40dcdfc0b41bd116a58ae14a3212a8" + integrity sha512-V2/gJ4wE6TtMJNAnUTm3VRdgNyLI6zdNLy3MzhrJOwxiUslG1OSShE1IUYR0cmzMOm5w/Y2p3+OIRXRqKUVHYQ== + "@napi-rs/canvas-android-arm64@0.1.65": version "0.1.65" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.65.tgz#b42f2a2f67cb32ad6669e53561987d58384e791f" @@ -3731,6 +3753,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== +"@types/aws-lambda@^8.10.147": + version "8.10.147" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.147.tgz#dc5c89aa32f47a9b35e52c32630545c83afa6f2f" + integrity sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew== + "@types/babel__core@^7.18.0", "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -4602,6 +4629,11 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4621,6 +4653,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -4682,6 +4723,14 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -4738,6 +4787,14 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== +canvas@^3.0.0-rc2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.1.0.tgz#6cdf094b859fef8e39b0e2c386728a376f1727b2" + integrity sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg== + dependencies: + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4821,6 +4878,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -5145,6 +5207,13 @@ decimal.js@^10.4.3: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -5217,6 +5286,11 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -5371,6 +5445,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.15.0: version "5.18.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" @@ -6030,6 +6111,11 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect-type@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" @@ -6332,6 +6418,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6441,6 +6532,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6698,6 +6794,11 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -6744,7 +6845,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7606,6 +7707,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7625,11 +7731,16 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7688,6 +7799,11 @@ nanoid@^3.3.7, nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7721,6 +7837,18 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" +node-abi@^3.3.0: + version "3.73.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.73.0.tgz#4459ea77e71969edba8588387eecb05e2c2cff3b" + integrity sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-cache@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" @@ -7879,7 +8007,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8033,6 +8161,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path2d@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.2.2.tgz#cc85d61ed7827e7863a2ee36713d4b5315a3d85d" + integrity sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ== + pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -8043,7 +8176,15 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -pdfjs-dist@4.8.69, pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69: +pdfjs-dist@4.8.69: + version "4.8.69" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz#61ea5d66863d49b40e5eacbd4070341175bdda2e" + integrity sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ== + optionalDependencies: + canvas "^3.0.0-rc2" + path2d "^0.2.1" + +pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82: version "4.10.38" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== @@ -8082,7 +8223,7 @@ pino-std-serializers@^7.0.0: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== -pino@^9.0.0: +pino@^9.0.0, pino@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/pino/-/pino-9.6.0.tgz#6bc628159ba0cc81806d286718903b7fc6b13169" integrity sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg== @@ -8226,6 +8367,24 @@ postcss@^8.4.43: picocolors "^1.1.1" source-map-js "^1.2.1" +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8306,6 +8465,14 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -8348,7 +8515,7 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -rc@^1.0.1, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -8506,6 +8673,15 @@ react-transition-group@4.4.5: dependencies: loose-envify "^1.1.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8788,7 +8964,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8856,6 +9032,11 @@ semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5: + version "7.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c" + integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== + semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -9011,6 +9192,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -9248,6 +9443,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -9521,6 +9723,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -9927,7 +10150,7 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== From 2129bdf6f0f7a374ac5c9114898ff5cef498707d Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Wed, 29 Jan 2025 22:53:05 -0600 Subject: [PATCH 02/17] setup sqs queues --- cloudformation/main.yml | 33 +++++++++++++++++++++++++++++++++ cloudformation/sqs.yml | 35 +++++++++++++++++++++++++++++++++++ src/api/sqs/logger.ts | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 cloudformation/sqs.yml diff --git a/cloudformation/main.yml b/cloudformation/main.yml index 09e64220..bf0a4b54 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -83,6 +83,14 @@ Resources: LambdaFunctionName: !Sub ${ApplicationPrefix}-lambda LogRetentionDays: !FindInMap [General, !Ref RunEnvironment, LogRetentionDays] + AppSQSQueues: + Type: AWS::Serverless::Application + Properties: + Location: ./sqs.yml + Parameters: + QueueName: !Sub ${ApplicationPrefix}-sqs + + IcalDomainProxy: Type: AWS::Serverless::Application Properties: @@ -149,6 +157,31 @@ Resources: Path: /{proxy+} Method: ANY + AppSqsLambdaFunction: + Type: AWS::Serverless::Function + DependsOn: + - AppLogGroups + Properties: + Architectures: [arm64] + CodeUri: ../dist/sqsConsumer + AutoPublishAlias: live + Runtime: nodejs22.x + Description: !Sub "${ApplicationFriendlyName} SQS Lambda" + FunctionName: !Sub ${ApplicationPrefix}-sqs-lambda + Handler: index.handler + MemorySize: 512 + Role: !GetAtt AppSecurityRoles.Outputs.MainFunctionRoleArn + Timeout: 900 + LoggingConfig: + LogGroup: !Sub /aws/lambda/${LambdaFunctionName} + Environment: + Variables: + RunEnvironment: !Ref RunEnvironment + VpcConfig: + Ipv6AllowedForDualStack: !If [ShouldAttachVpc, True, !Ref AWS::NoValue] + SecurityGroupIds: !If [ShouldAttachVpc, !FindInMap [EnvironmentToCidr, !Ref RunEnvironment, SecurityGroupIds], !Ref AWS::NoValue] + SubnetIds: !If [ShouldAttachVpc, !FindInMap [EnvironmentToCidr, !Ref RunEnvironment, SubnetIds], !Ref AWS::NoValue] + IamGroupRolesTable: Type: 'AWS::DynamoDB::Table' DeletionPolicy: "Retain" diff --git a/cloudformation/sqs.yml b/cloudformation/sqs.yml new file mode 100644 index 00000000..211ccdb5 --- /dev/null +++ b/cloudformation/sqs.yml @@ -0,0 +1,35 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Stack SQS Queues +Transform: AWS::Serverless-2016-10-31 +Parameters: + QueueName: + Type: String + AllowedPattern: ^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$ +Resources: + AppDLQ: + Type: AWS::SQS::Queue + Properties: + QueueName: !Sub ${QueueName}-dlq + AppQueue: + Type: AWS::SQS::Queue + Properties: + QueueName: !Ref QueueName + RedrivePolicy: + deadLetterTargetArn: + Fn::GetAtt: + - "AppDLQ" + - "Arn" + +Outputs: + MainQueueArn: + Description: Main Queue Arn + Value: + Fn::GetAtt: + - AppQueue + - Arn + DLQArn: + Description: Dead-letter Queue Arn + Value: + Fn::GetAtt: + - AppDLQ + - Arn diff --git a/src/api/sqs/logger.ts b/src/api/sqs/logger.ts index 36c2d586..4991cb22 100644 --- a/src/api/sqs/logger.ts +++ b/src/api/sqs/logger.ts @@ -1,2 +1,2 @@ import { pino } from "pino"; -export const logger = pino(); +export const logger = pino().child({ context: "sqsHandler" }); From 46613f736973bde8453a5fa91a0a16a93174530c Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Wed, 29 Jan 2025 22:56:10 -0600 Subject: [PATCH 03/17] fix cfn --- cloudformation/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudformation/main.yml b/cloudformation/main.yml index bf0a4b54..f74583cf 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -173,7 +173,7 @@ Resources: Role: !GetAtt AppSecurityRoles.Outputs.MainFunctionRoleArn Timeout: 900 LoggingConfig: - LogGroup: !Sub /aws/lambda/${LambdaFunctionName} + LogGroup: !Sub /aws/lambda/${ApplicationPrefix}-lambda Environment: Variables: RunEnvironment: !Ref RunEnvironment From 72720d89c8aef608a30a04e818db3117cd017b6c Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Wed, 29 Jan 2025 23:45:07 -0600 Subject: [PATCH 04/17] fix missing max recieve count --- cloudformation/sqs.yml | 1 + yarn.lock | 210 ++--------------------------------------- 2 files changed, 8 insertions(+), 203 deletions(-) diff --git a/cloudformation/sqs.yml b/cloudformation/sqs.yml index 211ccdb5..cf4b4d7c 100644 --- a/cloudformation/sqs.yml +++ b/cloudformation/sqs.yml @@ -19,6 +19,7 @@ Resources: Fn::GetAtt: - "AppDLQ" - "Arn" + maxReceiveCount: 3 Outputs: MainQueueArn: diff --git a/yarn.lock b/yarn.lock index 84f7971e..b409416a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4629,11 +4629,6 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4653,15 +4648,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -4723,14 +4709,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -4787,14 +4765,6 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== -canvas@^3.0.0-rc2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.1.0.tgz#6cdf094b859fef8e39b0e2c386728a376f1727b2" - integrity sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg== - dependencies: - node-addon-api "^7.0.0" - prebuild-install "^7.1.1" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4878,11 +4848,6 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -5207,13 +5172,6 @@ decimal.js@^10.4.3: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -5286,11 +5244,6 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -5445,13 +5398,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enhanced-resolve@^5.15.0: version "5.18.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" @@ -6111,11 +6057,6 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - expect-type@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" @@ -6418,11 +6359,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6532,11 +6468,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6794,11 +6725,6 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -6845,7 +6771,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7707,11 +7633,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7731,16 +7652,11 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7799,11 +7715,6 @@ nanoid@^3.3.7, nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== -napi-build-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" - integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7837,18 +7748,6 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" -node-abi@^3.3.0: - version "3.73.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.73.0.tgz#4459ea77e71969edba8588387eecb05e2c2cff3b" - integrity sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg== - dependencies: - semver "^7.3.5" - -node-addon-api@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" - integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== - node-cache@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" @@ -8007,7 +7906,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8161,11 +8060,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path2d@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.2.2.tgz#cc85d61ed7827e7863a2ee36713d4b5315a3d85d" - integrity sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ== - pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -8176,15 +8070,7 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -pdfjs-dist@4.8.69: - version "4.8.69" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz#61ea5d66863d49b40e5eacbd4070341175bdda2e" - integrity sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ== - optionalDependencies: - canvas "^3.0.0-rc2" - path2d "^0.2.1" - -pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82: +pdfjs-dist@4.8.69, pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69: version "4.10.38" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== @@ -8367,24 +8253,6 @@ postcss@^8.4.43: picocolors "^1.1.1" source-map-js "^1.2.1" -prebuild-install@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" - integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^2.0.0" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8465,14 +8333,6 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -8515,7 +8375,7 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -8673,15 +8533,6 @@ react-transition-group@4.4.5: dependencies: loose-envify "^1.1.0" -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8964,7 +8815,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9032,11 +8883,6 @@ semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: - version "7.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c" - integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== - semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -9192,20 +9038,6 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -9443,13 +9275,6 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -9723,27 +9548,6 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" - integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10150,7 +9954,7 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== From cbe7abce504792c8abe715207abf473b6706782d Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 00:48:17 -0600 Subject: [PATCH 05/17] fix build entrypoints --- src/api/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/build.js b/src/api/build.js index 8d264981..0a92b87a 100644 --- a/src/api/build.js +++ b/src/api/build.js @@ -33,7 +33,7 @@ const commonParams = { esbuild .build({ ...commonParams, - entryPoints: ["api/index.js"], + entryPoints: ["api/lambda.js", "api/index.js"], outdir: "../../dist/lambda/", }) .then(() => console.log("API server build completed successfully!")) From 2e87ccc46101bbcc4493950f3ed02c51e164ade2 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 01:03:26 -0600 Subject: [PATCH 06/17] create the appropriate roles --- Makefile | 1 + cloudformation/iam.yml | 2 ++ cloudformation/main.yml | 7 +++++++ src/api/build.js | 3 ++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d0a1af8e..c292711d 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ build: src/ cloudformation/ docs/ yarn -D VITE_BUILD_HASH=$(GIT_HASH) yarn build cp -r src/api/resources/ dist/api/resources + rm -rf dist/lambda/sqs sam build --template-file cloudformation/main.yml local: diff --git a/cloudformation/iam.yml b/cloudformation/iam.yml index c468b871..b92e50a7 100644 --- a/cloudformation/iam.yml +++ b/cloudformation/iam.yml @@ -16,6 +16,8 @@ Resources: ApiLambdaIAMRole: Type: AWS::IAM::Role Properties: + ManagedPolicyArns: + - arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole AssumeRolePolicyDocument: Version: '2012-10-17' Statement: diff --git a/cloudformation/main.yml b/cloudformation/main.yml index f74583cf..4ccc0ab0 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -182,6 +182,13 @@ Resources: SecurityGroupIds: !If [ShouldAttachVpc, !FindInMap [EnvironmentToCidr, !Ref RunEnvironment, SecurityGroupIds], !Ref AWS::NoValue] SubnetIds: !If [ShouldAttachVpc, !FindInMap [EnvironmentToCidr, !Ref RunEnvironment, SubnetIds], !Ref AWS::NoValue] + SQSLambdaEventMapping: + Type: AWS::Lambda::EventSourceMapping + Properties: + BatchSize: 5 + EventSourceArn: !GetAtt AppSecurityRoles.Outputs.MainQueueArn + FunctionName: !Sub ${ApplicationPrefix}-sqs-lambda + IamGroupRolesTable: Type: 'AWS::DynamoDB::Table' DeletionPolicy: "Retain" diff --git a/src/api/build.js b/src/api/build.js index 0a92b87a..42324d5d 100644 --- a/src/api/build.js +++ b/src/api/build.js @@ -33,8 +33,9 @@ const commonParams = { esbuild .build({ ...commonParams, - entryPoints: ["api/lambda.js", "api/index.js"], + entryPoints: ["api/lambda.js"], outdir: "../../dist/lambda/", + external: [...commonParams.external, "sqs/*"], }) .then(() => console.log("API server build completed successfully!")) .catch((error) => { From 5d469c3443e29e7c2bd9ba20e1983c543d72df7d Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 10:21:42 -0600 Subject: [PATCH 07/17] fix cfn Signed-off-by: Dev Singh --- cloudformation/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudformation/main.yml b/cloudformation/main.yml index 4ccc0ab0..c65601bc 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -186,7 +186,7 @@ Resources: Type: AWS::Lambda::EventSourceMapping Properties: BatchSize: 5 - EventSourceArn: !GetAtt AppSecurityRoles.Outputs.MainQueueArn + EventSourceArn: !GetAtt AppSQSQueues.Outputs.MainQueueArn FunctionName: !Sub ${ApplicationPrefix}-sqs-lambda IamGroupRolesTable: From f2a78995681e672b224ba731c4c4f4e85487684f Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 10:25:28 -0600 Subject: [PATCH 08/17] enable partial batch item failures Signed-off-by: Dev Singh --- cloudformation/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cloudformation/main.yml b/cloudformation/main.yml index c65601bc..314fb2ac 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -188,6 +188,8 @@ Resources: BatchSize: 5 EventSourceArn: !GetAtt AppSQSQueues.Outputs.MainQueueArn FunctionName: !Sub ${ApplicationPrefix}-sqs-lambda + FunctionResponseTypes: + - ReportBatchItemFailures IamGroupRolesTable: Type: 'AWS::DynamoDB::Table' From 4e1aeff03dc180929778c835a9335c2a9bdc14a6 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 10:46:36 -0600 Subject: [PATCH 09/17] fix consumer Signed-off-by: Dev Singh --- cloudformation/main.yml | 29 +++++++++++++++++++++++++++-- cloudformation/sqs.yml | 4 ++++ src/api/sqs/index.ts | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/cloudformation/main.yml b/cloudformation/main.yml index 314fb2ac..943ea326 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -22,6 +22,14 @@ Parameters: Default: false Type: String AllowedValues: [true, false] + SqsLambdaTimeout: + Description: How long the SQS lambda is permitted to run (in seconds) + Default: 300 + Type: Number + SqsMessageTimeout: + Description: MessageVisibilityTimeout for the SQS Lambda queue (should be at least 6xSqsLambdaTimeout) + Default: 1800 + Type: Number Conditions: IsProd: !Equals [!Ref RunEnvironment, 'prod'] @@ -89,7 +97,7 @@ Resources: Location: ./sqs.yml Parameters: QueueName: !Sub ${ApplicationPrefix}-sqs - + MessageTimeout: !Ref SqsMessageTimeout IcalDomainProxy: Type: AWS::Serverless::Application @@ -171,7 +179,7 @@ Resources: Handler: index.handler MemorySize: 512 Role: !GetAtt AppSecurityRoles.Outputs.MainFunctionRoleArn - Timeout: 900 + Timeout: !Ref SqsLambdaTimeout LoggingConfig: LogGroup: !Sub /aws/lambda/${ApplicationPrefix}-lambda Environment: @@ -390,6 +398,23 @@ Resources: - Name: 'ApiName' Value: !Sub ${ApplicationPrefix}-gateway + + AppDLQMessagesAlarm: + Type: 'AWS::CloudWatch::Alarm' + Condition: IsProd + Properties: + AlarmName: !Sub ${ApplicationPrefix}-sqs-dlq + AlarmDescription: 'Items are present in the application DLQ, meaning some messages failed to process.' + Namespace: 'AWS/SQS' + MetricName: 'ApproximateNumberOfMessagesVisible' + Statistic: 'SUM' + Period: '60' + EvaluationPeriods: '1' + ComparisonOperator: 'GreaterThanThreshold' + Threshold: '0' + AlarmActions: + - !Ref AlertSNSArn + APILambdaPermission: Type: AWS::Lambda::Permission Properties: diff --git a/cloudformation/sqs.yml b/cloudformation/sqs.yml index cf4b4d7c..6689e706 100644 --- a/cloudformation/sqs.yml +++ b/cloudformation/sqs.yml @@ -5,15 +5,19 @@ Parameters: QueueName: Type: String AllowedPattern: ^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$ + MessageTimeout: + Type: Number Resources: AppDLQ: Type: AWS::SQS::Queue Properties: QueueName: !Sub ${QueueName}-dlq + VisibilityTimeout: !Ref MessageTimeout AppQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref QueueName + VisibilityTimeout: !Ref MessageTimeout RedrivePolicy: deadLetterTargetArn: Fn::GetAtt: diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts index baafc105..44212aa5 100644 --- a/src/api/sqs/index.ts +++ b/src/api/sqs/index.ts @@ -54,6 +54,7 @@ export const handler = middy() return func(parsedBody.payload, parsedBody.metadata, childLogger); } catch (e: any) { logger.error({ sqsMessageId: record.messageId }, e.toString()); + throw e; } }); return Promise.allSettled(recordsPromises); From ee1ccaf620d46c2fb421ab4f22a5c738636eb00b Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Thu, 30 Jan 2025 10:55:12 -0600 Subject: [PATCH 10/17] fix alarm metric Signed-off-by: Dev Singh --- cloudformation/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudformation/main.yml b/cloudformation/main.yml index 943ea326..5416da78 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -407,7 +407,7 @@ Resources: AlarmDescription: 'Items are present in the application DLQ, meaning some messages failed to process.' Namespace: 'AWS/SQS' MetricName: 'ApproximateNumberOfMessagesVisible' - Statistic: 'SUM' + Statistic: 'Sum' Period: '60' EvaluationPeriods: '1' ComparisonOperator: 'GreaterThanThreshold' From c569f56ed038713f07b5fe179b908914672e712f Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 13:14:04 -0600 Subject: [PATCH 11/17] setup basic driver --- src/api/build.js | 2 +- src/api/package.json | 1 + src/api/sqs/driver.ts | 27 +++++++++++ src/api/sqs/index.ts | 5 ++ src/common/config.ts | 3 ++ src/common/types/sqsMessage.ts | 2 +- yarn.lock | 86 ++++++++++++++++++++++++++++++++++ 7 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/api/sqs/driver.ts diff --git a/src/api/build.js b/src/api/build.js index 42324d5d..cb6dff64 100644 --- a/src/api/build.js +++ b/src/api/build.js @@ -46,7 +46,7 @@ esbuild esbuild .build({ ...commonParams, - entryPoints: ["api/sqs/index.js"], + entryPoints: ["api/sqs/index.js", "api/sqs/driver.js"], outdir: "../../dist/sqsConsumer/", }) .then(() => console.log("SQS consumer build completed successfully!")) diff --git a/src/api/package.json b/src/api/package.json index 5a90f370..741a2689 100644 --- a/src/api/package.json +++ b/src/api/package.json @@ -18,6 +18,7 @@ "@aws-sdk/client-dynamodb": "^3.624.0", "@aws-sdk/client-secrets-manager": "^3.624.0", "@aws-sdk/client-ses": "^3.734.0", + "@aws-sdk/client-sqs": "^3.738.0", "@aws-sdk/client-sts": "^3.726.0", "@aws-sdk/util-dynamodb": "^3.624.0", "@azure/msal-node": "^2.16.1", diff --git a/src/api/sqs/driver.ts b/src/api/sqs/driver.ts new file mode 100644 index 00000000..5737a3f2 --- /dev/null +++ b/src/api/sqs/driver.ts @@ -0,0 +1,27 @@ +import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { environmentConfig, genericConfig } from "common/config.js"; +import { parseSQSPayload } from "common/types/sqsMessage.js"; + +const queueUrl = environmentConfig["dev"].SqsQueueUrl; +const sqsClient = new SQSClient({ + region: genericConfig.AwsRegion, +}); + +const payload = parseSQSPayload({ + function: "ping", + payload: {}, + metadata: { + taskId: "0", + reqId: "1", + initiator: "dsingh14@illinois.edu", + }, +}); +if (!payload) { + throw new Error("not valid"); +} +const command = new SendMessageCommand({ + QueueUrl: queueUrl, + MessageBody: JSON.stringify(payload), +}); + +await sqsClient.send(command); diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts index 44212aa5..97aa6483 100644 --- a/src/api/sqs/index.ts +++ b/src/api/sqs/index.ts @@ -13,6 +13,7 @@ import { logger } from "./logger.js"; import { z, ZodError } from "zod"; import pino from "pino"; import { emailMembershipPassHandler, pingHandler } from "./handlers.js"; +import { ValidationError } from "common/errors/index.js"; export type SQSFunctionPayloadTypes = { [K in keyof typeof sqsPayloadSchemas]: SQSHandlerFunction; @@ -41,11 +42,15 @@ export const handler = middy() { sqsMessageId: record.messageId }, parsedBody.toString(), ); + throw new ValidationError({ + message: "Could not parse SQS payload", + }); } parsedBody = parsedBody as SQSPayload; const childLogger = logger.child({ sqsMessageId: record.messageId, metadata: parsedBody.metadata, + function: parsedBody.function, }); childLogger.info("Processing started."); const func = handlers[parsedBody.function] as SQSHandlerFunction< diff --git a/src/common/config.ts b/src/common/config.ts index 3800c37f..6973a1e8 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -16,6 +16,7 @@ export type ConfigType = { PasskitSerialNumber: string; MembershipApiEndpoint: string; EmailDomain: string; + SqsQueueUrl: string; }; type GenericConfigType = { @@ -74,6 +75,7 @@ const environmentConfig: EnvironmentConfigType = { PasskitSerialNumber: "0", MembershipApiEndpoint: "https://infra-membership-api.aws.qa.acmuiuc.org/api/v1/checkMembership", EmailDomain: "aws.qa.acmuiuc.org", + SqsQueueUrl: "https://sqs.us-east-1.amazonaws.com/427040638965/infra-core-api-sqs" }, prod: { AzureRoleMapping: { AutonomousWriters: [AppRoles.EVENTS_MANAGER] }, @@ -88,6 +90,7 @@ const environmentConfig: EnvironmentConfigType = { PasskitSerialNumber: "0", MembershipApiEndpoint: "https://infra-membership-api.aws.acmuiuc.org/api/v1/checkMembership", EmailDomain: "acm.illinois.edu", + SqsQueueUrl: "https://sqs.us-east-1.amazonaws.com/298118738376/infra-core-api-sqs" } }; diff --git a/src/common/types/sqsMessage.ts b/src/common/types/sqsMessage.ts index 2eaf80b2..6ef16a43 100644 --- a/src/common/types/sqsMessage.ts +++ b/src/common/types/sqsMessage.ts @@ -1,7 +1,7 @@ import { z, ZodError, ZodType } from "zod"; export enum AvailableSQSFunctions { - Ping = "pong", + Ping = "ping", EmailMembershipPass = "emailMembershipPass", } diff --git a/yarn.lock b/yarn.lock index b409416a..48c55dd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -199,6 +199,53 @@ "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" +"@aws-sdk/client-sqs@^3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.738.0.tgz#7a0021937ecba7c32feec07bf51becea00581cb0" + integrity sha512-wGxZNV0m0NM+IXub61vkwoq3KD88joG45aYpS4+2ADnZLxnUe/Md1AH+ZMznIv5ZAppCXso7S0Tis3LLK85IGw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-sdk-sqs" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/md5-js" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sso-oidc@3.721.0": version "3.721.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.721.0.tgz#a53b954e5b0112cd253d82b0f68264827e7d36ca" @@ -754,6 +801,24 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-node@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.738.0.tgz#0a470fc4d2e791c26da57261b8b14f07de43cd74" + integrity sha512-3MuREsazwBxghKb2sQQHvie+uuK4dX4/ckFYiSoffzJQd0YHxaGxf8cr4NOSCQCUesWu8D3Y0SzlnHGboVSkpA== + dependencies: + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-ini" "3.734.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.716.0": version "3.716.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.716.0.tgz#a8a7b9416cb28c0e2ef601a2713342533619ce4c" @@ -973,6 +1038,18 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" +"@aws-sdk/middleware-sdk-sqs@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.734.0.tgz#65282e8312ae2c6d9c1387533c587c950b71b8af" + integrity sha512-WetobEBbOFt4WutMYNnhkqNG8FDU9ZTLQ7gY0tGdhUKzHo0h/k9TPRZc8WUeKqacZ7gMWMNOjY251izockqWsQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-user-agent@3.721.0": version "3.721.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.721.0.tgz#2a5fbfb63d42a79b4f4b9d94e5aefa66b4e57ddd" @@ -2687,6 +2764,15 @@ dependencies: tslib "^2.6.2" +"@smithy/md5-js@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.1.tgz#d7622e94dc38ecf290876fcef04369217ada8f07" + integrity sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A== + dependencies: + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/middleware-content-length@^3.0.13": version "3.0.13" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz#6e08fe52739ac8fb3996088e0f8837e4b2ea187f" From b7062b344c656d32fdf140d0d57862490663318b Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 16:31:41 -0600 Subject: [PATCH 12/17] move membership pass creation into SQS queue --- package.json | 4 +- src/api/functions/entraId.ts | 14 +++--- src/api/functions/mobileWallet.ts | 28 ++++++++---- src/api/routes/iam.ts | 15 +++++-- src/api/routes/mobileWallet.ts | 74 +++++++++++++++++-------------- src/api/sqs/driver.ts | 1 - src/api/sqs/handlers.ts | 45 +++++++++++++++++-- src/api/sqs/index.ts | 21 +++++++-- src/api/types.d.ts | 2 + src/common/config.ts | 2 +- src/common/types/sqsMessage.ts | 12 ++--- 11 files changed, 148 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index 16c772bf..5ca759c1 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "scripts": { "build": "yarn workspaces run build && yarn lockfile-manage", "dev": "concurrently --names 'api,ui' 'yarn workspace infra-core-api run dev' 'yarn workspace infra-core-ui run dev'", - "lockfile-manage": "synp --with-workspace --source-file yarn.lock && cp package-lock.json dist/lambda/ && cp src/api/package.lambda.json dist/lambda/package.json && rm package-lock.json", + "lockfile-manage": "synp --with-workspace --source-file yarn.lock && cp package-lock.json dist/lambda/ && cp package-lock.json dist/sqsConsumer/ && cp src/api/package.lambda.json dist/lambda/package.json && cp src/api/package.lambda.json dist/sqsConsumer/package.json && rm package-lock.json", "prettier": "yarn workspaces run prettier && prettier --check tests/**/*.ts", "prettier:write": "yarn workspaces run prettier:write && prettier --write tests/**/*.ts", "lint": "yarn workspaces run lint", @@ -81,4 +81,4 @@ "resolutions": { "pdfjs-dist": "^4.8.69" } -} +} \ No newline at end of file diff --git a/src/api/functions/entraId.ts b/src/api/functions/entraId.ts index 6524c53b..547fe505 100644 --- a/src/api/functions/entraId.ts +++ b/src/api/functions/entraId.ts @@ -21,6 +21,8 @@ import { } from "../../common/types/iam.js"; import { FastifyInstance } from "fastify"; import { UserProfileDataBase } from "common/types/msGraphApi.js"; +import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; function validateGroupId(groupId: string): boolean { const groupIdPattern = /^[a-zA-Z0-9-]+$/; // Adjust the pattern as needed @@ -28,15 +30,13 @@ function validateGroupId(groupId: string): boolean { } export async function getEntraIdToken( - fastify: FastifyInstance, + clients: { smClient: SecretsManagerClient; dynamoClient: DynamoDBClient }, clientId: string, scopes: string[] = ["https://graph.microsoft.com/.default"], ) { const secretApiConfig = - (await getSecretValue( - fastify.secretsManagerClient, - genericConfig.ConfigSecretName, - )) || {}; + (await getSecretValue(clients.smClient, genericConfig.ConfigSecretName)) || + {}; if ( !secretApiConfig.entra_id_private_key || !secretApiConfig.entra_id_thumbprint @@ -50,7 +50,7 @@ export async function getEntraIdToken( "base64", ).toString("utf8"); const cachedToken = await getItemFromCache( - fastify.dynamoClient, + clients.dynamoClient, "entra_id_access_token", ); if (cachedToken) { @@ -80,7 +80,7 @@ export async function getEntraIdToken( date.setTime(date.getTime() - 30000); if (result?.accessToken) { await insertItemIntoCache( - fastify.dynamoClient, + clients.dynamoClient, "entra_id_access_token", { token: result?.accessToken }, date, diff --git a/src/api/functions/mobileWallet.ts b/src/api/functions/mobileWallet.ts index b16f99b3..7cf73882 100644 --- a/src/api/functions/mobileWallet.ts +++ b/src/api/functions/mobileWallet.ts @@ -1,5 +1,10 @@ import { getSecretValue } from "../plugins/auth.js"; -import { genericConfig, SecretConfig } from "../../common/config.js"; +import { + ConfigType, + genericConfig, + GenericConfigType, + SecretConfig, +} from "../../common/config.js"; import { InternalServerError, UnauthorizedError, @@ -12,6 +17,9 @@ import strip from "../resources/MembershipPass.pkpass/strip.png"; import pass from "../resources/MembershipPass.pkpass/pass.js"; import { PKPass } from "passkit-generator"; import { promises as fs } from "fs"; +import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; +import { RunEnvironment } from "common/roles.js"; +import pino from "pino"; function trim(s: string) { return (s || "").replace(/^\s+|\s+$/g, ""); @@ -25,9 +33,11 @@ function convertName(name: string): string { } export async function issueAppleWalletMembershipCard( - app: FastifyInstance, - request: FastifyRequest, + clients: { smClient: SecretsManagerClient }, + environmentConfig: ConfigType, + runEnvironment: RunEnvironment, email: string, + logger: pino.Logger, name?: string, ) { if (!email.endsWith("@illinois.edu")) { @@ -37,7 +47,7 @@ export async function issueAppleWalletMembershipCard( }); } const secretApiConfig = (await getSecretValue( - app.secretsManagerClient, + clients.smClient, genericConfig.ConfigSecretName, )) as SecretConfig; if (!secretApiConfig) { @@ -57,7 +67,7 @@ export async function issueAppleWalletMembershipCard( secretApiConfig.apple_signing_cert_base64, "base64", ).toString("utf-8"); - pass["passTypeIdentifier"] = app.environmentConfig["PasskitIdentifier"]; + pass["passTypeIdentifier"] = environmentConfig["PasskitIdentifier"]; const pkpass = new PKPass( { @@ -73,13 +83,13 @@ export async function issueAppleWalletMembershipCard( }, { // logoText: app.runEnvironment === "dev" ? "INVALID Membership Pass" : "Membership Pass", - serialNumber: app.environmentConfig["PasskitSerialNumber"], + serialNumber: environmentConfig["PasskitSerialNumber"], }, ); pkpass.setBarcodes({ altText: email.split("@")[0], format: "PKBarcodeFormatPDF417", - message: app.runEnvironment === "dev" ? `INVALID${email}INVALID` : email, + message: runEnvironment === "dev" ? `INVALID${email}INVALID` : email, }); const iat = new Date().toLocaleDateString("en-US", { day: "2-digit", @@ -93,7 +103,7 @@ export async function issueAppleWalletMembershipCard( value: convertName(name), }); } - if (app.runEnvironment === "prod") { + if (runEnvironment === "prod") { pkpass.backFields.push({ label: "Verification URL", key: "iss", @@ -109,7 +119,7 @@ export async function issueAppleWalletMembershipCard( pkpass.backFields.push({ label: "Pass Created On", key: "iat", value: iat }); pkpass.backFields.push({ label: "Membership ID", key: "id", value: email }); const buffer = pkpass.getAsBuffer(); - request.log.info( + logger.info( { type: "audit", actor: email, target: email }, "Created membership verification pass", ); diff --git a/src/api/routes/iam.ts b/src/api/routes/iam.ts index 8c6a77e5..15de1c56 100644 --- a/src/api/routes/iam.ts +++ b/src/api/routes/iam.ts @@ -160,7 +160,10 @@ const iamRoutes: FastifyPluginAsync = async (fastify, _options) => { async (request, reply) => { const emails = request.body.emails; const entraIdToken = await getEntraIdToken( - fastify, + { + smClient: fastify.secretsManagerClient, + dynamoClient: fastify.dynamoClient, + }, fastify.environmentConfig.AadValidClientId, ); if (!entraIdToken) { @@ -247,7 +250,10 @@ const iamRoutes: FastifyPluginAsync = async (fastify, _options) => { }); } const entraIdToken = await getEntraIdToken( - fastify, + { + smClient: fastify.secretsManagerClient, + dynamoClient: fastify.dynamoClient, + }, fastify.environmentConfig.AadValidClientId, ); const addResults = await Promise.allSettled( @@ -371,7 +377,10 @@ const iamRoutes: FastifyPluginAsync = async (fastify, _options) => { }); } const entraIdToken = await getEntraIdToken( - fastify, + { + smClient: fastify.secretsManagerClient, + dynamoClient: fastify.dynamoClient, + }, fastify.environmentConfig.AadValidClientId, ); const response = await listGroupMembers(entraIdToken, groupId); diff --git a/src/api/routes/mobileWallet.ts b/src/api/routes/mobileWallet.ts index 0a8083b6..78f47c7d 100644 --- a/src/api/routes/mobileWallet.ts +++ b/src/api/routes/mobileWallet.ts @@ -1,21 +1,28 @@ import { FastifyPluginAsync } from "fastify"; -import { issueAppleWalletMembershipCard } from "../functions/mobileWallet.js"; import { - EntraFetchError, + InternalServerError, UnauthenticatedError, - UnauthorizedError, ValidationError, } from "../../common/errors/index.js"; -import { generateMembershipEmailCommand } from "../functions/ses.js"; import { z } from "zod"; -import { getEntraIdToken, getUserProfile } from "../functions/entraId.js"; import { checkPaidMembership } from "../functions/membership.js"; +import { AvailableSQSFunctions, SQSPayload } from "common/types/sqsMessage.js"; +import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { genericConfig } from "common/config.js"; +import { zodToJsonSchema } from "zod-to-json-schema"; + +const queuedResponseJsonSchema = zodToJsonSchema( + z.object({ + queueId: z.string().uuid(), + }), +); const mobileWalletRoute: FastifyPluginAsync = async (fastify, _options) => { fastify.post<{ Querystring: { email: string } }>( "/membership", { schema: { + response: { 202: queuedResponseJsonSchema }, querystring: { type: "object", properties: { @@ -53,37 +60,36 @@ const mobileWalletRoute: FastifyPluginAsync = async (fastify, _options) => { message: `${request.query.email} is not a paid member.`, }); } - const entraIdToken = await getEntraIdToken( - fastify, - fastify.environmentConfig.AadValidClientId, - ); - - const userProfile = await getUserProfile( - entraIdToken, - request.query.email, - ); - - const item = await issueAppleWalletMembershipCard( - fastify, - request, - request.query.email, - userProfile.displayName, - ); - const emailCommand = generateMembershipEmailCommand( - request.query.email, - `membership@${fastify.environmentConfig.EmailDomain}`, - item, + const sqsPayload: SQSPayload = + { + function: AvailableSQSFunctions.EmailMembershipPass, + metadata: { + initiator: "public", + reqId: request.id, + }, + payload: { + email: request.query.email, + }, + }; + if (!fastify.sqsClient) { + fastify.sqsClient = new SQSClient({ + region: genericConfig.AwsRegion, + }); + } + const result = await fastify.sqsClient.send( + new SendMessageCommand({ + QueueUrl: fastify.environmentConfig.SqsQueueUrl, + MessageBody: JSON.stringify(sqsPayload), + }), ); - if ( - fastify.runEnvironment === "dev" && - request.query.email === "testinguser@illinois.edu" - ) { - return reply - .status(202) - .send({ message: "OK (skipped sending email)" }); + if (!result.MessageId) { + request.log.error(result); + throw new InternalServerError({ + message: "Could not add job to queue.", + }); } - await fastify.sesClient.send(emailCommand); - reply.status(202).send({ message: "OK" }); + request.log.info(`Queued job to SQS with message ID ${result.MessageId}`); + reply.status(202).send({ queueId: result.MessageId }); }, ); }; diff --git a/src/api/sqs/driver.ts b/src/api/sqs/driver.ts index 5737a3f2..faf682b3 100644 --- a/src/api/sqs/driver.ts +++ b/src/api/sqs/driver.ts @@ -11,7 +11,6 @@ const payload = parseSQSPayload({ function: "ping", payload: {}, metadata: { - taskId: "0", reqId: "1", initiator: "dsingh14@illinois.edu", }, diff --git a/src/api/sqs/handlers.ts b/src/api/sqs/handlers.ts index 494cbb1f..57967af3 100644 --- a/src/api/sqs/handlers.ts +++ b/src/api/sqs/handlers.ts @@ -1,10 +1,49 @@ import { AvailableSQSFunctions } from "common/types/sqsMessage.js"; -import { SQSHandlerFunction } from "./index.js"; +import { + currentEnvironmentConfig, + runEnvironment, + SQSHandlerFunction, +} from "./index.js"; +import { getEntraIdToken, getUserProfile } from "api/functions/entraId.js"; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { environmentConfig, genericConfig } from "common/config.js"; +import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; +import { issueAppleWalletMembershipCard } from "api/functions/mobileWallet.js"; +import { generateMembershipEmailCommand } from "api/functions/ses.js"; +import { SESClient } from "@aws-sdk/client-ses"; export const emailMembershipPassHandler: SQSHandlerFunction< AvailableSQSFunctions.EmailMembershipPass -> = async (payload, metadata, logger) => { - logger.error("Not implemented yet!"); +> = async (payload, _metadata, logger) => { + const email = payload.email; + const commonConfig = { region: genericConfig.AwsRegion }; + const clients = { + smClient: new SecretsManagerClient(commonConfig), + dynamoClient: new DynamoDBClient(commonConfig), + sesClient: new SESClient(commonConfig), + }; + const entraIdToken = await getEntraIdToken( + clients, + currentEnvironmentConfig.AadValidClientId, + ); + const userProfile = await getUserProfile(entraIdToken, email); + const pkpass = await issueAppleWalletMembershipCard( + clients, + environmentConfig[runEnvironment], + runEnvironment, + email, + logger, + userProfile.displayName, + ); + const emailCommand = generateMembershipEmailCommand( + email, + `membership@${environmentConfig[runEnvironment].EmailDomain}`, + pkpass, + ); + if (runEnvironment === "dev" && email === "testinguser@illinois.edu") { + return; + } + await clients.sesClient.send(emailCommand); return; }; diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts index 97aa6483..f216e468 100644 --- a/src/api/sqs/index.ts +++ b/src/api/sqs/index.ts @@ -4,16 +4,21 @@ import sqsPartialBatchFailure from "@middy/sqs-partial-batch-failure"; import { Context, SQSEvent } from "aws-lambda"; import { parseSQSPayload, - SQSPayload, sqsPayloadSchemas, AvailableSQSFunctions, SQSMessageMetadata, + AnySQSPayload, } from "../../common/types/sqsMessage.js"; import { logger } from "./logger.js"; import { z, ZodError } from "zod"; import pino from "pino"; import { emailMembershipPassHandler, pingHandler } from "./handlers.js"; import { ValidationError } from "common/errors/index.js"; +import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; +import { SESClient } from "@aws-sdk/client-ses"; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { RunEnvironment } from "common/roles.js"; +import { environmentConfig } from "common/config.js"; export type SQSFunctionPayloadTypes = { [K in keyof typeof sqsPayloadSchemas]: SQSHandlerFunction; @@ -29,6 +34,8 @@ const handlers: SQSFunctionPayloadTypes = { [AvailableSQSFunctions.EmailMembershipPass]: emailMembershipPassHandler, [AvailableSQSFunctions.Ping]: pingHandler, }; +export const runEnvironment = process.env.RunEnvironment as RunEnvironment; +export const currentEnvironmentConfig = environmentConfig[runEnvironment]; export const handler = middy() .use(eventNormalizerMiddleware()) @@ -46,17 +53,23 @@ export const handler = middy() message: "Could not parse SQS payload", }); } - parsedBody = parsedBody as SQSPayload; + parsedBody = parsedBody as AnySQSPayload; const childLogger = logger.child({ sqsMessageId: record.messageId, metadata: parsedBody.metadata, function: parsedBody.function, }); - childLogger.info("Processing started."); const func = handlers[parsedBody.function] as SQSHandlerFunction< typeof parsedBody.function >; - return func(parsedBody.payload, parsedBody.metadata, childLogger); + childLogger.info(`Starting handler for ${parsedBody.function}...`); + const result = func( + parsedBody.payload, + parsedBody.metadata, + childLogger, + ); + childLogger.info(`Finished handler for ${parsedBody.function}.`); + return result; } catch (e: any) { logger.error({ sqsMessageId: record.messageId }, e.toString()); throw e; diff --git a/src/api/types.d.ts b/src/api/types.d.ts index 252b40bf..bc675a33 100644 --- a/src/api/types.d.ts +++ b/src/api/types.d.ts @@ -6,6 +6,7 @@ import NodeCache from "node-cache"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; import { SESClient } from "@aws-sdk/client-ses"; +import { SQSClient } from "@aws-sdk/client-sqs"; declare module "fastify" { interface FastifyInstance { authenticate: ( @@ -27,6 +28,7 @@ declare module "fastify" { nodeCache: NodeCache; dynamoClient: DynamoDBClient; sesClient: SESClient; + sqsClient?: SQSClient; secretsManagerClient: SecretsManagerClient; } interface FastifyRequest { diff --git a/src/common/config.ts b/src/common/config.ts index 6973a1e8..75bcb4b9 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -19,7 +19,7 @@ export type ConfigType = { SqsQueueUrl: string; }; -type GenericConfigType = { +export type GenericConfigType = { EventsDynamoTableName: string; CacheDynamoTableName: string; ConfigSecretName: string; diff --git a/src/common/types/sqsMessage.ts b/src/common/types/sqsMessage.ts index 6ef16a43..524d9853 100644 --- a/src/common/types/sqsMessage.ts +++ b/src/common/types/sqsMessage.ts @@ -6,7 +6,6 @@ export enum AvailableSQSFunctions { } const sqsMessageMetadataSchema = z.object({ - taskId: z.string().min(1), reqId: z.string().min(1), initiator: z.string().min(1), }); @@ -42,13 +41,14 @@ export const sqsPayloadSchema = z.discriminatedUnion( ] as const ); -export type SQSPayload = z.infer; -export type SQSFunctionPayloadTypes = { - [K in keyof typeof sqsPayloadSchemas]: z.infer<(typeof sqsPayloadSchemas)[K]>; -}; +export type SQSPayload = z.infer< + (typeof sqsPayloadSchemas)[T] +>; -export function parseSQSPayload(json: unknown): SQSPayload | ZodError { +export type AnySQSPayload = z.infer; + +export function parseSQSPayload(json: unknown): AnySQSPayload | ZodError { const parsed = sqsPayloadSchema.safeParse(json); if (parsed.success) { return parsed.data; From 520a0039139a2420e34011d17c4c1b13067ac289 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 16:58:13 -0600 Subject: [PATCH 13/17] move sqs unit tests --- package.json | 2 +- src/api/routes/mobileWallet.ts | 7 ++- src/api/sqs/handlers.ts | 11 +++-- src/api/sqs/index.ts | 6 +-- tests/unit/mobileWallet.test.ts | 10 +---- tests/unit/sqs/emailMembershipPass.test.ts | 50 ++++++++++++++++++++++ 6 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 tests/unit/sqs/emailMembershipPass.test.ts diff --git a/package.json b/package.json index 5ca759c1..c5d82ac1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "lint": "yarn workspaces run lint", "prepare": "node .husky/install.mjs || true", "typecheck": "yarn workspaces run typecheck", - "test:unit": "vitest run tests/unit --config tests/unit/vitest.config.ts && yarn workspace infra-core-ui run test:unit", + "test:unit": "cross-env RunEnvironment='dev' vitest run tests/unit --config tests/unit/vitest.config.ts && yarn workspace infra-core-ui run test:unit", "test:unit-ui": "yarn test:unit --ui", "test:unit-watch": "vitest tests/unit", "test:live": "vitest tests/live", diff --git a/src/api/routes/mobileWallet.ts b/src/api/routes/mobileWallet.ts index 78f47c7d..343563d5 100644 --- a/src/api/routes/mobileWallet.ts +++ b/src/api/routes/mobileWallet.ts @@ -6,9 +6,12 @@ import { } from "../../common/errors/index.js"; import { z } from "zod"; import { checkPaidMembership } from "../functions/membership.js"; -import { AvailableSQSFunctions, SQSPayload } from "common/types/sqsMessage.js"; +import { + AvailableSQSFunctions, + SQSPayload, +} from "../../common/types/sqsMessage.js"; import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; -import { genericConfig } from "common/config.js"; +import { genericConfig } from "../../common/config.js"; import { zodToJsonSchema } from "zod-to-json-schema"; const queuedResponseJsonSchema = zodToJsonSchema( diff --git a/src/api/sqs/handlers.ts b/src/api/sqs/handlers.ts index 57967af3..511125e9 100644 --- a/src/api/sqs/handlers.ts +++ b/src/api/sqs/handlers.ts @@ -4,12 +4,15 @@ import { runEnvironment, SQSHandlerFunction, } from "./index.js"; -import { getEntraIdToken, getUserProfile } from "api/functions/entraId.js"; +import { + getEntraIdToken, + getUserProfile, +} from "../../api/functions/entraId.js"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { environmentConfig, genericConfig } from "common/config.js"; +import { environmentConfig, genericConfig } from "../../common/config.js"; import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; -import { issueAppleWalletMembershipCard } from "api/functions/mobileWallet.js"; -import { generateMembershipEmailCommand } from "api/functions/ses.js"; +import { issueAppleWalletMembershipCard } from "../../api/functions/mobileWallet.js"; +import { generateMembershipEmailCommand } from "../../api/functions/ses.js"; import { SESClient } from "@aws-sdk/client-ses"; export const emailMembershipPassHandler: SQSHandlerFunction< diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts index f216e468..08fecf96 100644 --- a/src/api/sqs/index.ts +++ b/src/api/sqs/index.ts @@ -13,12 +13,12 @@ import { logger } from "./logger.js"; import { z, ZodError } from "zod"; import pino from "pino"; import { emailMembershipPassHandler, pingHandler } from "./handlers.js"; -import { ValidationError } from "common/errors/index.js"; +import { ValidationError } from "../../common/errors/index.js"; import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; import { SESClient } from "@aws-sdk/client-ses"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { RunEnvironment } from "common/roles.js"; -import { environmentConfig } from "common/config.js"; +import { RunEnvironment } from "../../common/roles.js"; +import { environmentConfig } from "../../common/config.js"; export type SQSFunctionPayloadTypes = { [K in keyof typeof sqsPayloadSchemas]: SQSHandlerFunction; diff --git a/tests/unit/mobileWallet.test.ts b/tests/unit/mobileWallet.test.ts index 6fb20c92..e9eb2fce 100644 --- a/tests/unit/mobileWallet.test.ts +++ b/tests/unit/mobileWallet.test.ts @@ -1,12 +1,6 @@ -import { afterAll, expect, test, beforeEach, vi } from "vitest"; +import { afterAll, expect, test, beforeEach, vi, describe } from "vitest"; import init from "../../src/api/index.js"; -import { describe } from "node:test"; import { EntraFetchError } from "../../src/common/errors/index.js"; -import { mockClient } from "aws-sdk-client-mock"; -import { issueAppleWalletMembershipCard } from "../../src/api/functions/mobileWallet.js"; -import { SendRawEmailCommand, SESClient } from "@aws-sdk/client-ses"; - -const sesMock = mockClient(SESClient); vi.mock("../../src/api/functions/membership.js", () => { return { @@ -70,13 +64,11 @@ describe("Mobile wallet pass issuance", async () => { await response.json(); }); test("Test that passes will be issued for members", async () => { - sesMock.on(SendRawEmailCommand).resolvesOnce({}).rejects(); const response = await app.inject({ method: "POST", url: "/api/v1/mobileWallet/membership?email=valid@illinois.edu", }); expect(response.statusCode).toBe(202); - expect(issueAppleWalletMembershipCard).toHaveBeenCalledOnce(); }); afterAll(async () => { await app.close(); diff --git a/tests/unit/sqs/emailMembershipPass.test.ts b/tests/unit/sqs/emailMembershipPass.test.ts new file mode 100644 index 00000000..1cdb25ed --- /dev/null +++ b/tests/unit/sqs/emailMembershipPass.test.ts @@ -0,0 +1,50 @@ +import { expect, test, beforeEach, vi } from "vitest"; +vi.mock("../../../src/api/functions/mobileWallet.js", () => ({ + issueAppleWalletMembershipCard: vi.fn().mockResolvedValue(new ArrayBuffer()), +})) + +vi.mock("../../../src/api/functions/entraId.js", () => ({ + getEntraIdToken: vi.fn().mockResolvedValue("atokenofalltime"), + getUserProfile: vi.fn().mockImplementation(async (_token: string, email: string) => { + console.log('getUserProfile called with:', email); + if (email === "valid@illinois.edu") { + return { displayName: "John Doe" }; + } + throw new EntraFetchError({ + message: "User not found", + email, + }); + }), + resolveEmailToOid: vi.fn().mockResolvedValue("12345"), +})); + +vi.mock("../../api/functions/mobileWallet.js", () => ({ + issueAppleWalletMembershipCard: vi.fn().mockResolvedValue(new ArrayBuffer(0)), +})); + +vi.stubEnv("RunEnvironment", 'dev'); + +import { describe } from "node:test"; +import { emailMembershipPassHandler } from "../../../src/api/sqs/handlers.js"; +import { EntraFetchError } from "../../../src/common/errors/index.js"; +import { getEntraIdToken, getUserProfile } from "../../../src/api/functions/entraId.js"; +import { issueAppleWalletMembershipCard } from "../../../src/api/functions/mobileWallet.js"; + +describe("Mobile wallet pass issuance (SQS function)", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("Test that passes will be issued for members", async () => { + const email = 'valid@illinois.edu'; + const logger = { info: vi.fn() } as any; + await emailMembershipPassHandler( + { email }, + { reqId: '1', initiator: '1' }, + logger + ); + expect(getEntraIdToken).toHaveBeenCalled(); + expect(issueAppleWalletMembershipCard).toHaveBeenCalledOnce(); + expect(getUserProfile).toHaveBeenCalledWith("atokenofalltime", email); + }); +}); From 6e39c96a195cfb81e6ed550de27a58d3ce581c99 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 17:05:36 -0600 Subject: [PATCH 14/17] fix unit test --- tests/unit/mobileWallet.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/unit/mobileWallet.test.ts b/tests/unit/mobileWallet.test.ts index e9eb2fce..70ae9855 100644 --- a/tests/unit/mobileWallet.test.ts +++ b/tests/unit/mobileWallet.test.ts @@ -1,6 +1,16 @@ import { afterAll, expect, test, beforeEach, vi, describe } from "vitest"; import init from "../../src/api/index.js"; import { EntraFetchError } from "../../src/common/errors/index.js"; +import { + GetSecretValueCommand, + SecretsManagerClient, +} from "@aws-sdk/client-secrets-manager"; +import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { mockClient } from "aws-sdk-client-mock"; +import { secretJson } from "./secret.testdata.js"; + +const smMock = mockClient(SecretsManagerClient); +const sqsMock = mockClient(SQSClient); vi.mock("../../src/api/functions/membership.js", () => { return { @@ -64,10 +74,12 @@ describe("Mobile wallet pass issuance", async () => { await response.json(); }); test("Test that passes will be issued for members", async () => { + sqsMock.on(SendMessageCommand).resolvesOnce({}); const response = await app.inject({ method: "POST", url: "/api/v1/mobileWallet/membership?email=valid@illinois.edu", }); + expect(sqsMock.calls.length).toBe(1); expect(response.statusCode).toBe(202); }); afterAll(async () => { @@ -76,5 +88,8 @@ describe("Mobile wallet pass issuance", async () => { beforeEach(() => { (app as any).nodeCache.flushAll(); vi.clearAllMocks(); + smMock.on(GetSecretValueCommand).resolves({ + SecretString: secretJson, + }); }); }); From 26bba3a5e061378b6655cd7a9490ff10ffce1548 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 18:05:23 -0600 Subject: [PATCH 15/17] fix mobilewallet route test --- src/api/package.json | 1 + tests/unit/mobileWallet.test.ts | 15 +-- yarn.lock | 215 ++++++++++++++++++++++++++++++-- 3 files changed, 214 insertions(+), 17 deletions(-) diff --git a/src/api/package.json b/src/api/package.json index 741a2689..96a61a2d 100644 --- a/src/api/package.json +++ b/src/api/package.json @@ -45,6 +45,7 @@ "passkit-generator": "^3.3.1", "pino": "^9.6.0", "pluralize": "^8.0.0", + "uuid": "^11.0.5", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.2", "zod-validation-error": "^3.3.1" diff --git a/tests/unit/mobileWallet.test.ts b/tests/unit/mobileWallet.test.ts index 70ae9855..7921ced1 100644 --- a/tests/unit/mobileWallet.test.ts +++ b/tests/unit/mobileWallet.test.ts @@ -8,6 +8,7 @@ import { import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; import { mockClient } from "aws-sdk-client-mock"; import { secretJson } from "./secret.testdata.js"; +import { v4 as uuidv4 } from "uuid"; const smMock = mockClient(SecretsManagerClient); const sqsMock = mockClient(SQSClient); @@ -47,14 +48,6 @@ vi.mock("../../src/api/functions/entraId.js", () => { }; }); -vi.mock("../../src/api/functions/mobileWallet.js", () => { - return { - issueAppleWalletMembershipCard: vi.fn().mockImplementation(async () => { - return new ArrayBuffer(); - }), - }; -}); - const app = await init(); describe("Mobile wallet pass issuance", async () => { test("Test that passes will not be issued for non-emails", async () => { @@ -74,13 +67,15 @@ describe("Mobile wallet pass issuance", async () => { await response.json(); }); test("Test that passes will be issued for members", async () => { - sqsMock.on(SendMessageCommand).resolvesOnce({}); + const queueId = uuidv4(); + sqsMock.on(SendMessageCommand).resolves({ MessageId: queueId }); const response = await app.inject({ method: "POST", url: "/api/v1/mobileWallet/membership?email=valid@illinois.edu", }); - expect(sqsMock.calls.length).toBe(1); expect(response.statusCode).toBe(202); + const body = await response.json(); + expect(body).toEqual({ queueId }); }); afterAll(async () => { await app.close(); diff --git a/yarn.lock b/yarn.lock index 48c55dd1..d5530c93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4715,6 +4715,11 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4734,6 +4739,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -4795,6 +4809,14 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -4851,6 +4873,14 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== +canvas@^3.0.0-rc2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.1.0.tgz#6cdf094b859fef8e39b0e2c386728a376f1727b2" + integrity sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg== + dependencies: + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4934,6 +4964,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -5258,6 +5293,13 @@ decimal.js@^10.4.3: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -5330,6 +5372,11 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -5484,6 +5531,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.15.0: version "5.18.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" @@ -6143,6 +6197,11 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect-type@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" @@ -6445,6 +6504,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6554,6 +6618,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6811,6 +6880,11 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -6857,7 +6931,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7719,6 +7793,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7738,11 +7817,16 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7801,6 +7885,11 @@ nanoid@^3.3.7, nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7834,6 +7923,18 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" +node-abi@^3.3.0: + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-cache@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" @@ -7992,7 +8093,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8146,6 +8247,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path2d@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.2.2.tgz#cc85d61ed7827e7863a2ee36713d4b5315a3d85d" + integrity sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ== + pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -8156,7 +8262,15 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -pdfjs-dist@4.8.69, pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69: +pdfjs-dist@4.8.69: + version "4.8.69" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz#61ea5d66863d49b40e5eacbd4070341175bdda2e" + integrity sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ== + optionalDependencies: + canvas "^3.0.0-rc2" + path2d "^0.2.1" + +pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82: version "4.10.38" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== @@ -8339,6 +8453,24 @@ postcss@^8.4.43: picocolors "^1.1.1" source-map-js "^1.2.1" +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8419,6 +8551,14 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -8461,7 +8601,7 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -rc@^1.0.1, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -8619,6 +8759,15 @@ react-transition-group@4.4.5: dependencies: loose-envify "^1.1.0" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8901,7 +9050,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8969,6 +9118,11 @@ semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5: + version "7.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c" + integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== + semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -9124,6 +9278,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -9361,6 +9529,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -9634,6 +9809,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10040,7 +10236,7 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -10066,6 +10262,11 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== +uuid@^11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" + integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" From 52e5e419e5f2ea3a546396ab105aef97a3341fd1 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 18:18:01 -0600 Subject: [PATCH 16/17] cleanup --- package.json | 2 +- src/api/index.ts | 6 - src/api/sqs/handlers.ts | 5 +- src/api/sqs/index.ts | 5 +- src/api/types.d.ts | 3 +- tests/unit/sqs/emailMembershipPass.test.ts | 50 ----- yarn.lock | 212 +-------------------- 7 files changed, 13 insertions(+), 270 deletions(-) delete mode 100644 tests/unit/sqs/emailMembershipPass.test.ts diff --git a/package.json b/package.json index c5d82ac1..a49ba8eb 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@typescript-eslint/parser": "^8.0.1", "@vitejs/plugin-react": "^4.3.1", "@vitest/ui": "^2.0.5", - "aws-sdk-client-mock": "^4.0.1", + "aws-sdk-client-mock": "^4.1.0", "concurrently": "^9.1.2", "cross-env": "^7.0.3", "esbuild": "^0.23.0", diff --git a/src/api/index.ts b/src/api/index.ts index ebe512b6..6a378a55 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -21,7 +21,6 @@ import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts"; import NodeCache from "node-cache"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; -import { SESClient } from "@aws-sdk/client-ses"; import mobileWalletRoute from "./routes/mobileWallet.js"; dotenv.config(); @@ -37,10 +36,6 @@ async function init() { region: genericConfig.AwsRegion, }); - const sesClient = new SESClient({ - region: genericConfig.AwsRegion, - }); - const app: FastifyInstance = fastify({ logger: { level: process.env.LOG_LEVEL || "info", @@ -88,7 +83,6 @@ async function init() { app.nodeCache = new NodeCache({ checkperiod: 30 }); app.dynamoClient = dynamoClient; app.secretsManagerClient = secretsManagerClient; - app.sesClient = sesClient; app.addHook("onRequest", (req, _, done) => { req.startTime = now(); const hostname = req.hostname; diff --git a/src/api/sqs/handlers.ts b/src/api/sqs/handlers.ts index 511125e9..50ef3f14 100644 --- a/src/api/sqs/handlers.ts +++ b/src/api/sqs/handlers.ts @@ -23,7 +23,6 @@ export const emailMembershipPassHandler: SQSHandlerFunction< const clients = { smClient: new SecretsManagerClient(commonConfig), dynamoClient: new DynamoDBClient(commonConfig), - sesClient: new SESClient(commonConfig), }; const entraIdToken = await getEntraIdToken( clients, @@ -46,8 +45,8 @@ export const emailMembershipPassHandler: SQSHandlerFunction< if (runEnvironment === "dev" && email === "testinguser@illinois.edu") { return; } - await clients.sesClient.send(emailCommand); - return; + const sesClient = new SESClient(commonConfig); + return await sesClient.send(emailCommand); }; export const pingHandler: SQSHandlerFunction< diff --git a/src/api/sqs/index.ts b/src/api/sqs/index.ts index 08fecf96..95328255 100644 --- a/src/api/sqs/index.ts +++ b/src/api/sqs/index.ts @@ -14,9 +14,6 @@ import { z, ZodError } from "zod"; import pino from "pino"; import { emailMembershipPassHandler, pingHandler } from "./handlers.js"; import { ValidationError } from "../../common/errors/index.js"; -import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; -import { SESClient } from "@aws-sdk/client-ses"; -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { RunEnvironment } from "../../common/roles.js"; import { environmentConfig } from "../../common/config.js"; @@ -28,7 +25,7 @@ export type SQSHandlerFunction = ( payload: z.infer<(typeof sqsPayloadSchemas)[T]>["payload"], metadata: SQSMessageMetadata, logger: pino.Logger, -) => Promise; +) => Promise; const handlers: SQSFunctionPayloadTypes = { [AvailableSQSFunctions.EmailMembershipPass]: emailMembershipPassHandler, diff --git a/src/api/types.d.ts b/src/api/types.d.ts index bc675a33..20ee16aa 100644 --- a/src/api/types.d.ts +++ b/src/api/types.d.ts @@ -5,8 +5,8 @@ import { ConfigType } from "../common/config.js"; import NodeCache from "node-cache"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { SecretsManagerClient } from "@aws-sdk/client-secrets-manager"; -import { SESClient } from "@aws-sdk/client-ses"; import { SQSClient } from "@aws-sdk/client-sqs"; + declare module "fastify" { interface FastifyInstance { authenticate: ( @@ -27,7 +27,6 @@ declare module "fastify" { environmentConfig: ConfigType; nodeCache: NodeCache; dynamoClient: DynamoDBClient; - sesClient: SESClient; sqsClient?: SQSClient; secretsManagerClient: SecretsManagerClient; } diff --git a/tests/unit/sqs/emailMembershipPass.test.ts b/tests/unit/sqs/emailMembershipPass.test.ts deleted file mode 100644 index 1cdb25ed..00000000 --- a/tests/unit/sqs/emailMembershipPass.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { expect, test, beforeEach, vi } from "vitest"; -vi.mock("../../../src/api/functions/mobileWallet.js", () => ({ - issueAppleWalletMembershipCard: vi.fn().mockResolvedValue(new ArrayBuffer()), -})) - -vi.mock("../../../src/api/functions/entraId.js", () => ({ - getEntraIdToken: vi.fn().mockResolvedValue("atokenofalltime"), - getUserProfile: vi.fn().mockImplementation(async (_token: string, email: string) => { - console.log('getUserProfile called with:', email); - if (email === "valid@illinois.edu") { - return { displayName: "John Doe" }; - } - throw new EntraFetchError({ - message: "User not found", - email, - }); - }), - resolveEmailToOid: vi.fn().mockResolvedValue("12345"), -})); - -vi.mock("../../api/functions/mobileWallet.js", () => ({ - issueAppleWalletMembershipCard: vi.fn().mockResolvedValue(new ArrayBuffer(0)), -})); - -vi.stubEnv("RunEnvironment", 'dev'); - -import { describe } from "node:test"; -import { emailMembershipPassHandler } from "../../../src/api/sqs/handlers.js"; -import { EntraFetchError } from "../../../src/common/errors/index.js"; -import { getEntraIdToken, getUserProfile } from "../../../src/api/functions/entraId.js"; -import { issueAppleWalletMembershipCard } from "../../../src/api/functions/mobileWallet.js"; - -describe("Mobile wallet pass issuance (SQS function)", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - test("Test that passes will be issued for members", async () => { - const email = 'valid@illinois.edu'; - const logger = { info: vi.fn() } as any; - await emailMembershipPassHandler( - { email }, - { reqId: '1', initiator: '1' }, - logger - ); - expect(getEntraIdToken).toHaveBeenCalled(); - expect(issueAppleWalletMembershipCard).toHaveBeenCalledOnce(); - expect(getUserProfile).toHaveBeenCalledWith("atokenofalltime", email); - }); -}); diff --git a/yarn.lock b/yarn.lock index d5530c93..0166b7b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4650,7 +4650,7 @@ avvio@^9.0.0: "@fastify/error" "^4.0.0" fastq "^1.17.1" -aws-sdk-client-mock@^4.0.1: +aws-sdk-client-mock@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-4.1.0.tgz#ae1950b2277f8e65f9a039975d79ff9fffab39e3" integrity sha512-h/tOYTkXEsAcV3//6C1/7U4ifSpKyJvb6auveAepqqNJl6TdZaPFEtKjBQNf8UxQdDP850knB2i/whq4zlsxJw== @@ -4715,11 +4715,6 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4739,15 +4734,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -4809,14 +4795,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -4873,14 +4851,6 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== -canvas@^3.0.0-rc2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.1.0.tgz#6cdf094b859fef8e39b0e2c386728a376f1727b2" - integrity sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg== - dependencies: - node-addon-api "^7.0.0" - prebuild-install "^7.1.1" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4964,11 +4934,6 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -5293,13 +5258,6 @@ decimal.js@^10.4.3: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -5372,11 +5330,6 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -5531,13 +5484,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enhanced-resolve@^5.15.0: version "5.18.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" @@ -6197,11 +6143,6 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - expect-type@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" @@ -6504,11 +6445,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6618,11 +6554,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6880,11 +6811,6 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -6931,7 +6857,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7793,11 +7719,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7817,16 +7738,11 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7885,11 +7801,6 @@ nanoid@^3.3.7, nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== -napi-build-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" - integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7923,18 +7834,6 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" -node-abi@^3.3.0: - version "3.74.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" - integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== - dependencies: - semver "^7.3.5" - -node-addon-api@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" - integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== - node-cache@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" @@ -8093,7 +7992,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8247,11 +8146,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path2d@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.2.2.tgz#cc85d61ed7827e7863a2ee36713d4b5315a3d85d" - integrity sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ== - pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -8262,15 +8156,7 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -pdfjs-dist@4.8.69: - version "4.8.69" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz#61ea5d66863d49b40e5eacbd4070341175bdda2e" - integrity sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ== - optionalDependencies: - canvas "^3.0.0-rc2" - path2d "^0.2.1" - -pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82: +pdfjs-dist@4.8.69, pdfjs-dist@^4.5.136, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69: version "4.10.38" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== @@ -8453,24 +8339,6 @@ postcss@^8.4.43: picocolors "^1.1.1" source-map-js "^1.2.1" -prebuild-install@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" - integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^2.0.0" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8551,14 +8419,6 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -8601,7 +8461,7 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -8759,15 +8619,6 @@ react-transition-group@4.4.5: dependencies: loose-envify "^1.1.0" -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9050,7 +8901,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9118,11 +8969,6 @@ semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: - version "7.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c" - integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== - semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" @@ -9278,20 +9124,6 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -9529,13 +9361,6 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -9809,27 +9634,6 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" - integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10236,7 +10040,7 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== From eac708a765f586285d7698c0e7e300638c2f3bcf Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 31 Jan 2025 19:42:57 -0600 Subject: [PATCH 17/17] fix iam --- cloudformation/iam.yml | 10 ++++++++++ cloudformation/main.yml | 1 + 2 files changed, 11 insertions(+) diff --git a/cloudformation/iam.yml b/cloudformation/iam.yml index b92e50a7..abb3c1a2 100644 --- a/cloudformation/iam.yml +++ b/cloudformation/iam.yml @@ -12,6 +12,8 @@ Parameters: AllowedPattern: ^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$ SesEmailDomain: Type: String + SqsQueueArn: + Type: String Resources: ApiLambdaIAMRole: Type: AWS::IAM::Role @@ -43,6 +45,14 @@ Resources: ses:Recipients: - "*@illinois.edu" PolicyName: ses-membership + - PolicyDocument: + Version: '2012-10-17' + Statement: + - Action: + - sqs:SendMessage + Effect: Allow + Resource: !Ref SqsQueueArn + PolicyName: lambda-sqs - PolicyDocument: Version: '2012-10-17' Statement: diff --git a/cloudformation/main.yml b/cloudformation/main.yml index 5416da78..295d10a8 100644 --- a/cloudformation/main.yml +++ b/cloudformation/main.yml @@ -82,6 +82,7 @@ Resources: RunEnvironment: !Ref RunEnvironment LambdaFunctionName: !Sub ${ApplicationPrefix}-lambda SesEmailDomain: !FindInMap [General, !Ref RunEnvironment, SesDomain] + SqsQueueArn: !GetAtt AppSQSQueues.Outputs.MainQueueArn AppLogGroups: Type: AWS::Serverless::Application