Open History to see the last commit
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});