UNPKG

@bitblit/ratchet-epsilon-common

Version:

Tiny adapter to simplify building API gateway Lambda APIS

56 lines 2.98 kB
import { AwsSqsSnsBackgroundManager } from './aws-sqs-sns-background-manager.js'; import { Logger } from '@bitblit/ratchet-common/logger/logger'; import { ErrorRatchet } from '@bitblit/ratchet-common/lang/error-ratchet'; import { StringRatchet } from '@bitblit/ratchet-common/lang/string-ratchet'; export class AwsLargePayloadS3SqsSnsBackgroundManager extends AwsSqsSnsBackgroundManager { _s3; pathPrefix; static LARGE_MESSAGE_SIZE_THRESHOLD = 250_000; static LARGE_MESSAGE_S3_PATH_META_KEY = 'S3_STORAGE_KEY'; constructor(_awsConfig, _sqs, _sns, _s3, pathPrefix = '') { super(_awsConfig, _sqs, _sns); this._s3 = _s3; this.pathPrefix = pathPrefix; if (!_s3) { ErrorRatchet.throwFormattedErr('Cannot start - no s3Client provided'); } if (!StringRatchet.trimToNull(_s3.getDefaultBucket())) { ErrorRatchet.throwFormattedErr('Cannot start - no default bucket provided'); } if (!pathPrefix && pathPrefix.endsWith('/')) { ErrorRatchet.throwFormattedErr('Path prefix may not end with /'); } } backgroundManagerName = 'AwsLargePayloadS3SqsSnsBackgroundManager'; get s3() { return this._s3; } async wrapEntryForInternal(entry, overrideTraceId, overrideTraceDepth) { const rval = await super.wrapEntryForInternal(entry, overrideTraceId, overrideTraceDepth); const payloadApproximateSize = Buffer.byteLength(JSON.stringify(rval), 'utf-8'); if (payloadApproximateSize > AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_SIZE_THRESHOLD) { Logger.info('Message payload is above LARGE_MESSAGE_SIZE_THRESHOLD. Uploading to s3.'); rval.meta = rval.meta || {}; const pathToData = await this.writeMessageToS3(rval.guid, rval.data); rval.meta[AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_S3_PATH_META_KEY] = pathToData; rval.data = undefined; } return rval; } async writeMessageToS3(guid, entry) { let s3FilePath = StringRatchet.trimToNull(this.pathPrefix) ? this.pathPrefix + '/' : ''; s3FilePath += guid + '.json'; await this.s3.writeObjectToCacheFile(s3FilePath, entry); return s3FilePath; } async modifyPayloadPreProcess(entry) { if (entry?.meta?.[AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_S3_PATH_META_KEY]) { Logger.silly('Restoring large data from %s', entry.meta[AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_S3_PATH_META_KEY]); const parsed = await this._s3.fetchCacheFileAsObject(entry.meta[AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_S3_PATH_META_KEY]); entry.data = parsed; delete entry.meta[AwsLargePayloadS3SqsSnsBackgroundManager.LARGE_MESSAGE_S3_PATH_META_KEY]; } return entry; } } //# sourceMappingURL=aws-large-payload-s3-sqs-sns-background-manager.js.map