cloudflare-email
Version:
Easily handle incoming and outgoing emails on Cloudflare Workers.
86 lines (83 loc) • 2.43 kB
JavaScript
// src/utils.ts
import debug from "debug";
import { createMimeMessage } from "mimetext/browser";
var log = debug("cloudflare-email:utils");
function respond(message) {
const msg = createMimeMessage();
msg.setHeader("In-Reply-To", message.headers.get("Message-ID") ?? "");
msg.setSender(message.to);
msg.setRecipient(message.from);
const subject = message.headers.get("Subject");
if (subject) {
msg.setSubject(
subject.substring(0, 3).toLowerCase() === "re:" ? subject : `Re: ${subject}`
);
}
return msg;
}
function mailbox(address) {
return createMimeMessage().setSender(address);
}
function ab2str(buffer) {
log("Converting ArrayBuffer to string", buffer.byteLength);
const bytes = new Uint8Array(buffer);
let binary = "";
for (let i = 0; i < bytes.length; i++) {
binary += String.fromCharCode(bytes[i]);
}
return binary;
}
function ab2b64(buffer) {
log("Converting ArrayBuffer to base64", buffer.byteLength);
return btoa(ab2str(buffer));
}
function ab27bit(buffer) {
log("Converting ArrayBuffer to 7bit", buffer.byteLength);
const bytes = new Uint8Array(buffer);
let bit_idx = 0;
const output_length = Math.ceil(bytes.length * 8 / 7);
let result = "";
for (let output_idx = 0; output_idx < output_length; output_idx++) {
let byte_idx = Math.floor(bit_idx / 8);
let bit_offset = bit_idx % 8;
bit_idx += 7;
let data = bit_offset === 0 ? bytes[byte_idx] >> 1 : bytes[byte_idx] << bit_offset - 1;
if (bit_offset > 1) {
data |= bytes[byte_idx + 1] >> 9 - bit_offset;
}
result += String.fromCharCode(data & 127);
}
return result;
}
// src/middleware/size-guard.ts
var SizeGuard = class {
/**
* @param max_size The maximum size of a message in bytes.
*/
constructor(max_size) {
this.max_size = max_size;
}
name = "Size Guard";
async handle(ctx, next) {
var _a, _b;
if (ctx.message.size > this.max_size) {
(_b = (_a = ctx.message).reject) == null ? void 0 : _b.call(_a, `Message size too large: ${ctx.message.size} > ${this.max_size}`);
} else {
await next();
}
}
};
// src/index.ts
export * from "cloudflare-email-kit";
export * from "cloudflare-email-mailchannels";
export * from "cloudflare-email-router";
export * from "mimetext/browser";
export {
SizeGuard,
ab27bit,
ab2b64,
ab2str,
mailbox,
respond
};
/** @license MIT (https://github.com/muratgozel/MIMEText) */