Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit 396b8dc

Browse files
authored
fix(lambda-at-edge, nextjs-component): fix triggering regeneration when sqs queue has custom name (#1595)
1 parent 70917d9 commit 396b8dc

File tree

6 files changed

+30
-9
lines changed

6 files changed

+30
-9
lines changed

packages/libs/lambda-at-edge/src/build.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type BuildOptions = {
4848
baseDir?: string;
4949
cleanupDotNext?: boolean;
5050
assetIgnorePatterns?: string[];
51+
regenerationQueueName?: string;
5152
};
5253

5354
const defaultBuildOptions = {
@@ -64,7 +65,8 @@ const defaultBuildOptions = {
6465
resolve: undefined,
6566
baseDir: process.cwd(),
6667
cleanupDotNext: true,
67-
assetIgnorePatterns: []
68+
assetIgnorePatterns: [],
69+
regenerationQueueName: undefined
6870
};
6971

7072
class Builder {
@@ -754,8 +756,11 @@ class Builder {
754756
await this.readPublicFiles(assetIgnorePatterns)
755757
);
756758

757-
const { enableHTTPCompression, logLambdaExecutionTimes } =
758-
this.buildOptions;
759+
const {
760+
enableHTTPCompression,
761+
logLambdaExecutionTimes,
762+
regenerationQueueName
763+
} = this.buildOptions;
759764

760765
const apiBuildManifest = {
761766
...apiManifest,
@@ -764,7 +769,8 @@ class Builder {
764769
const defaultBuildManifest = {
765770
...pageManifest,
766771
enableHTTPCompression,
767-
logLambdaExecutionTimes
772+
logLambdaExecutionTimes,
773+
regenerationQueueName
768774
};
769775
const imageBuildManifest = {
770776
...imageManifest,

packages/libs/lambda-at-edge/src/default-handler.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,19 @@ const handleOriginResponse = async ({
299299
staticRoute?.page &&
300300
staticRegenerationResponse.secondsRemainingUntilRevalidation === 0
301301
) {
302+
const regenerationQueueName =
303+
manifest.regenerationQueueName ?? `${bucketName}.fifo`; // if queue name not specified, we used [bucketName].fifo as used in deployment
304+
305+
if (!regenerationQueueName) {
306+
throw new Error("Regeneration queue name is undefined.");
307+
}
308+
302309
const { throttle } = await triggerStaticRegeneration({
303310
basePath,
304311
request,
305312
response,
306-
pagePath: staticRoute.page
313+
pagePath: staticRoute.page,
314+
queueName: regenerationQueueName
307315
});
308316

309317
// Occasionally we will get rate-limited by the Queue (in the event we

packages/libs/lambda-at-edge/src/lib/triggerStaticRegeneration.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ interface TriggerStaticRegenerationOptions {
66
response: AWSLambda.CloudFrontResponse;
77
basePath: string | undefined;
88
pagePath: string;
9+
queueName: string;
910
}
1011

1112
export const triggerStaticRegeneration = async (
1213
options: TriggerStaticRegenerationOptions
1314
): Promise<{ throttle: boolean }> => {
1415
const { region } = options.request.origin?.s3 || {};
1516
const bucketName = s3BucketNameFromEventRequest(options.request);
17+
const queueName = options.queueName;
1618

1719
if (!bucketName) {
1820
throw new Error("Expected bucket name to be defined");
@@ -39,7 +41,7 @@ export const triggerStaticRegeneration = async (
3941
try {
4042
await sqs.send(
4143
new SendMessageCommand({
42-
QueueUrl: `https://sqs.${region}.amazonaws.com/${bucketName}.fifo`,
44+
QueueUrl: `https://sqs.${region}.amazonaws.com/${queueName}`,
4345
MessageBody: JSON.stringify(regenerationEvent), // This is not used, however it is a required property
4446
// We only want to trigger the regeneration once for every previous
4547
// update. This will prevent the case where this page is being

packages/libs/lambda-at-edge/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export type OriginRequestApiHandlerManifest = ApiManifest & {
1313
export type OriginRequestDefaultHandlerManifest = PageManifest & {
1414
logLambdaExecutionTimes?: boolean;
1515
enableHTTPCompression?: boolean;
16+
regenerationQueueName?: string;
1617
};
1718

1819
export type OriginRequestImageHandlerManifest = {

packages/libs/lambda-at-edge/tests/utils/triggerStaticRegeneration.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ describe("triggerStaticRegeneration()", () => {
2727
headers: { etag: [{ key: "Etag", value: "123" }] },
2828
status: "200",
2929
statusDescription: "ok"
30-
} as AWSLambda.CloudFrontResponse
30+
} as AWSLambda.CloudFrontResponse,
31+
queueName: "my-bucket.fifo",
32+
pagePath: "/"
3133
};
3234

3335
class RequestThrottledException extends Error {
@@ -112,7 +114,8 @@ describe("triggerStaticRegeneration()", () => {
112114
region: "us-east-1",
113115
bucketName: "my-bucket",
114116
cloudFrontEventRequest: options.request,
115-
basePath: ""
117+
basePath: "",
118+
pagePath: "/"
116119
}),
117120
MessageDeduplicationId: expected,
118121
MessageGroupId: "index.html"

packages/serverless-components/nextjs-component/src/component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@ class NextjsComponent extends Component {
255255
authentication: inputs.authentication ?? undefined,
256256
baseDir: buildConfig.baseDir,
257257
cleanupDotNext: buildConfig.cleanupDotNext,
258-
assetIgnorePatterns: buildConfig.assetIgnorePatterns
258+
assetIgnorePatterns: buildConfig.assetIgnorePatterns,
259+
regenerationQueueName: inputs.sqs?.name
259260
},
260261
nextStaticPath
261262
);

0 commit comments

Comments
 (0)