From 0ebdb48b2877be63a1c6cc3338e76e1948031ba6 Mon Sep 17 00:00:00 2001 From: dosexe Date: Tue, 17 Jun 2025 19:23:36 +0800 Subject: [PATCH 1/2] * add resolvePayloadStoreConfig --- .../s3-payload-store/lib/S3PayloadStore.ts | 22 ++++++++++++++ .../test/store/S3PayloadStore.spec.ts | 29 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/s3-payload-store/lib/S3PayloadStore.ts b/packages/s3-payload-store/lib/S3PayloadStore.ts index 49e280c8..fcf1b7d1 100644 --- a/packages/s3-payload-store/lib/S3PayloadStore.ts +++ b/packages/s3-payload-store/lib/S3PayloadStore.ts @@ -5,6 +5,28 @@ import type { S3 } from '@aws-sdk/client-s3' import { NoSuchKey } from '@aws-sdk/client-s3' import type { PayloadStoreTypes, SerializedPayload } from '@message-queue-toolkit/core' +export type S3AwareDependencies = { s3?: S3 } +export type MessageQueuePayloadOffloadingConfig = { + s3PayloadOffloadingBucket?: string + messageSizeThreshold: number +} + +export function resolvePayloadStoreConfig( + dependencies: S3AwareDependencies, + config?: MessageQueuePayloadOffloadingConfig, +) { + if (!config?.s3PayloadOffloadingBucket) return undefined + if (!dependencies.s3) throw new Error('AWS S3 client is required for payload offloading') + + return { + store: new S3PayloadStore( + { s3: dependencies.s3 }, + { bucketName: config.s3PayloadOffloadingBucket }, + ), + messageSizeThreshold: config.messageSizeThreshold, + } +} + export type S3PayloadStoreDependencies = { s3: S3 } diff --git a/packages/s3-payload-store/test/store/S3PayloadStore.spec.ts b/packages/s3-payload-store/test/store/S3PayloadStore.spec.ts index 87b70a1f..844305d1 100644 --- a/packages/s3-payload-store/test/store/S3PayloadStore.spec.ts +++ b/packages/s3-payload-store/test/store/S3PayloadStore.spec.ts @@ -3,7 +3,7 @@ import { Readable } from 'node:stream' import { S3 } from '@aws-sdk/client-s3' import { beforeAll, beforeEach, describe, expect, it } from 'vitest' -import { S3PayloadStore } from '../../lib/S3PayloadStore.ts' +import { S3PayloadStore, resolvePayloadStoreConfig } from '../../lib/S3PayloadStore.ts' import { assertEmptyBucket, getObjectContent, objectExists } from '../utils/s3Utils.ts' import { streamToString } from '../utils/streamUtils.ts' import { TEST_AWS_CONFIG } from '../utils/testS3Config.ts' @@ -88,4 +88,31 @@ describe('S3PayloadStore', () => { await expect(store.deletePayload('non-existing-key')).resolves.not.toThrow() }) }) + describe('resolvePayloadStoreConfig', () => { + it('should return undefined if s3PayloadOffloadingBucket is not set', () => { + const result = resolvePayloadStoreConfig({ s3: {} as any }) + expect(result).toBeUndefined() + }) + it('should throw an error if S3 is not defined', () => { + expect(() => + resolvePayloadStoreConfig( + { s3: undefined }, + { + s3PayloadOffloadingBucket: 'test-bucket', + messageSizeThreshold: 1, + }, + ), + ).toThrowError('AWS S3 client is required for payload offloading') + }) + it('should payload store config', () => { + const result = resolvePayloadStoreConfig( + { s3: {} as any }, + { s3PayloadOffloadingBucket: 'test-bucket', messageSizeThreshold: 1 }, + ) + expect(result).toEqual({ + store: expect.any(S3PayloadStore), + messageSizeThreshold: 1, + }) + }) + }) }) From 8adad14a41687e22c946cb017fa8583dfab08f29 Mon Sep 17 00:00:00 2001 From: dosexe Date: Tue, 17 Jun 2025 19:47:32 +0800 Subject: [PATCH 2/2] * raise version --- packages/s3-payload-store/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/s3-payload-store/package.json b/packages/s3-payload-store/package.json index 7404d4e6..f1945c40 100644 --- a/packages/s3-payload-store/package.json +++ b/packages/s3-payload-store/package.json @@ -1,6 +1,6 @@ { "name": "@message-queue-toolkit/s3-payload-store", - "version": "2.0.0", + "version": "2.1.0", "private": false, "license": "MIT", "description": "AWS S3-based message store implementation for message-queue-toolkit",