diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
| commit | 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch) | |
| tree | ed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts | |
| download | misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.tar.gz misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.zip | |
Diffstat (limited to 'Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts')
| -rw-r--r-- | Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts b/Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts new file mode 100644 index 0000000..786e0a6 --- /dev/null +++ b/Homework/cs5260/consumer/retrievers/S3WidgetRequestRetriever.ts @@ -0,0 +1,64 @@ +import { + DeleteObjectCommand, + GetObjectCommand, + ListObjectsV2Command, + S3Client, +} from "@aws-sdk/client-s3"; +import { WidgetRequestRetriever } from "."; +import { WidgetRequest } from "@/shared/schema"; +import { TracingLogger } from "@/consumer/log"; + +export class S3WidgetRequestRetriever implements WidgetRequestRetriever { + static LIST_KEY_MAX = 1; + private bucket: string; + private s3Client: S3Client; + private logger: TracingLogger; + + constructor(bucket: string, s3Client: S3Client, logger: TracingLogger) { + this.bucket = bucket; + this.s3Client = s3Client; + this.logger = logger; + } + + private async getWidgetRequest(key: string) { + const getCommand = new GetObjectCommand({ + Bucket: this.bucket, + Key: key, + }); + + const response = await this.s3Client.send(getCommand); + const body = await response.Body?.transformToString(); + + if (body && body.length) return WidgetRequest.parse(JSON.parse(body)); + } + + public async refreshRequests() { + // ListObjectsV2 returns keys in ascending lexicographical order + const listCommand = new ListObjectsV2Command({ + MaxKeys: S3WidgetRequestRetriever.LIST_KEY_MAX, + Bucket: this.bucket, + }); + const response = await this.s3Client.send(listCommand); + + const key = response.Contents && response.Contents[0]?.Key; + + if (!key) { + this.logger.info(`No more keys in Bucket=(${this.bucket}).`); + return []; + } + + const widgetRequest = await this.getWidgetRequest(key); + + const deleteWidgetRequest = new DeleteObjectCommand({ + Key: key, + Bucket: this.bucket, + }); + await this.s3Client.send(deleteWidgetRequest); + + if (!widgetRequest) { + this.logger.warn(`No valid widget at Key=(${key}).`); + return []; + } + return [widgetRequest]; + } +} |
