1import type * as Cloudflare from "alchemy/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 onFailure: (error) =>
13 Effect.gen(function* () {
14 // Decide this message's outcome before Alchemy acknowledges the batch.
15 // Cloudflare keeps the first ack/retry decision for each message.
16 message.retry();
17 yield* Effect.logWarning("FCM queue delivery failed; retrying message", {
18 messageId: message.id,
19 errorTag: error._tag,
20 });
21 }),
22 onSuccess: () => Effect.sync(() => message.ack()),
23 }),
24 );
25});