feat(websub): wire real-time push notifications on email ingest

Pass ExecutionContext through the email processing chain so notifySubscribers
is called via ctx.waitUntil after a new email is stored.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Julien Herr
2026-05-21 23:08:19 +02:00
parent 6d221a07dd
commit d0764ddd8e
4 changed files with 10 additions and 2 deletions
+2 -1
View File
@@ -5,7 +5,7 @@ import { processEmail, RawAttachment } from "./email-processor";
export async function handleCloudflareEmail(
message: ForwardableEmailMessage,
env: Env,
_ctx: ExecutionContext,
ctx: ExecutionContext,
): Promise<void> {
try {
const email = await PostalMime.parse(message.raw);
@@ -41,6 +41,7 @@ export async function handleCloudflareEmail(
attachments: rawAttachments,
},
env,
ctx,
);
} catch (error) {
console.error("Error processing Cloudflare email:", error);
+5
View File
@@ -6,6 +6,7 @@ import {
FeedConfig,
FeedMetadata,
} from "../types";
import { notifySubscribers } from "../utils/websub";
export interface RawAttachment {
filename: string;
@@ -73,6 +74,7 @@ async function uploadAttachments(
export async function processEmail(
input: ProcessEmailInput,
env: Env,
ctx?: ExecutionContext,
): Promise<Response> {
const feedId = EmailParser.extractFeedId(input.toAddress);
if (!feedId) {
@@ -182,5 +184,8 @@ export async function processEmail(
]);
console.log(`Successfully processed email for feed ${feedId}`);
if (ctx) {
ctx.waitUntil(notifySubscribers(feedId, env));
}
return new Response("Email processed successfully", { status: 200 });
}
+2
View File
@@ -68,6 +68,7 @@ function toArrayBuffer(
export async function handleForwardEmail(
payload: ForwardEmailPayload,
env: Env,
ctx?: ExecutionContext,
): Promise<Response> {
const emailData = EmailParser.parseForwardEmailPayload(payload);
@@ -95,5 +96,6 @@ export async function handleForwardEmail(
attachments: rawAttachments,
},
env,
ctx,
);
}
+1 -1
View File
@@ -14,7 +14,7 @@ export async function handle(c: Context): Promise<Response> {
contentType: payload.html ? "HTML" : "Text",
});
return handleForwardEmail(payload, env);
return handleForwardEmail(payload, env, c.executionCtx);
} catch (error) {
console.error("Error processing email:", error);
return new Response("Error processing email", { status: 500 });