cloudflare-email-kit
Version:
Easily handle emails on Cloudflare Workers.
88 lines (87 loc) • 2.22 kB
JavaScript
// src/kit.ts
var EmailKitCore = class {
name = "EmailKit";
middlewares = [];
use(middleware) {
if (typeof middleware === "function") {
this.middlewares.push({
name: middleware.name,
handle: middleware
});
} else {
this.middlewares.push(middleware);
}
return this;
}
async handle(ctx) {
const execute = async (index) => {
if (index < this.middlewares.length) {
let used = false;
const middleware = this.middlewares[index];
await middleware.handle(ctx, () => {
if (used) {
throw new Error(
`next() called multiple times in middleware ${middleware.name}`
);
}
used = true;
return execute(index + 1);
});
}
};
await execute(0);
}
};
var EmailKit = class extends EmailKitCore {
use(middleware) {
super.use(middleware);
return this;
}
async process(message) {
let _raw;
const ctx = {
message: {
raw: () => {
if (!_raw) {
_raw = stream2buffer(message.raw, message.rawSize);
}
return _raw;
},
size: message.rawSize,
headers: message.headers,
from: message.from,
to: message.to,
reject: message.setReject.bind(message),
forward: message.forward.bind(message),
reply: async (mime) => {
const { EmailMessage } = await import("cloudflare:email");
const msg = new EmailMessage(message.to, message.from, mime.asRaw());
return message.reply(msg);
},
isAuto() {
const auto = message.headers.get("Auto-Submitted") || "";
return ["auto-generated", "auto-replied", "auto-notified"].includes(auto);
}
}
};
return this.handle(ctx);
}
};
async function stream2buffer(stream, size) {
const result = new Uint8Array(size);
const reader = stream.getReader();
let bytes_read = 0;
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
result.set(value, bytes_read);
bytes_read += value.length;
}
return result;
}
export {
EmailKit,
EmailKitCore
};