Skip to content
Source
Sign inSign up
Open History to see the last commit

FcmDeliveryQueueConsumer.ts

24 lines932 Bytes

1import type * as Cloudflare from "@alchemy.run/cloudflare";
2import * as Effect from "effect/Effect";
3​
4import * as FcmDeliveries from "./FcmDeliveries.ts";
5​
6export const processMessage = Effect.fn("relay.fcm_delivery_queue.process_message")(function* (
7 message: Cloudflare.Queues.Message<unknown>,
8) {
9 const deliveries = yield* FcmDeliveries.FcmDeliveries;
10 yield* deliveries.process(message.body).pipe(
11 Effect.matchEffect({
12 // The enclosing operation owns the span for this inline handler.
13 onFailure: Effect.fnUntraced(function* (error) {
14 // Cloudflare keeps the first ack/retry decision; decide before Alchemy acknowledges the batch.
15 message.retry();
16 yield* Effect.logWarning("FCM queue delivery failed; retrying message", {
17 messageId: message.id,
18 errorTag: error._tag,
19 });
20 }),
21 onSuccess: () => Effect.sync(() => message.ack()),
22 }),
23 );
24});