| 1 | import { handleCallback } from '@vercel/queue';
|
| 2 | import { z } from 'zod';
|
| 3 | import { HostedRepository } from '../packages/persistence/src/hosted.js';
|
| 4 |
|
| 5 | const repository = process.env.DATABASE_URL
|
| 6 | ? new HostedRepository(process.env.DATABASE_URL)
|
| 7 | : undefined;
|
| 8 | const QueueMessageSchema = z.object({ messageId: z.string().uuid() });
|
| 9 |
|
| 10 | export const POST = handleCallback<{ messageId: string }>(
|
| 11 | async (message, metadata) => {
|
| 12 | if (!repository) throw new Error('Hosted persistence is not configured');
|
| 13 | const value = QueueMessageSchema.parse(message);
|
| 14 | if (metadata.deliveryCount > 10) {
|
| 15 | await repository.abandonGatewayDelivery(
|
| 16 | value.messageId,
|
| 17 | `Automatic delivery abandoned after ${metadata.deliveryCount} attempts`,
|
| 18 | );
|
| 19 | return;
|
| 20 | }
|
| 21 | await repository.deliverGatewayMessage(value.messageId);
|
| 22 | },
|
| 23 | {
|
| 24 | visibilityTimeoutSeconds: 30,
|
| 25 | retry: (_error, metadata) => ({
|
| 26 | afterSeconds: Math.min(300, 2 ** Math.min(metadata.deliveryCount, 6) * 5),
|
| 27 | }),
|
| 28 | },
|
| 29 | );
|