| 1 | import type * as Cloudflare from "alchemy/Cloudflare"; |
| 2 | import * as Effect from "effect/Effect"; |
| 3 | |
| 4 | import * as FcmDeliveries from "./FcmDeliveries.ts"; |
| 5 | |
| 6 | export 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 | }); |