| 1 | import { QueueClient } 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 | const queue = new QueueClient();
|
| 10 |
|
| 11 | export default queue.handleNodeCallback<{ messageId: string }>(
|
| 12 | async (message, metadata) => {
|
| 13 | if (!repository) throw new Error('Hosted persistence is not configured');
|
| 14 | const value = QueueMessageSchema.parse(message);
|
| 15 | if (metadata.deliveryCount > 10) {
|
| 16 | await repository.abandonGatewayDelivery(
|
| 17 | value.messageId,
|
| 18 | `Automatic delivery abandoned after ${metadata.deliveryCount} attempts`,
|
| 19 | );
|
| 20 | return;
|
| 21 | }
|
| 22 | await repository.deliverGatewayMessage(value.messageId);
|
| 23 | },
|
| 24 | {
|
| 25 | visibilityTimeoutSeconds: 30,
|
| 26 | retry: (_error, metadata) => ({
|
| 27 | afterSeconds: Math.min(300, 2 ** Math.min(metadata.deliveryCount, 6) * 5),
|
| 28 | }),
|
| 29 | },
|
| 30 | );
|