UNPKG

cloudflare-email

Version:

Easily handle incoming and outgoing emails on Cloudflare Workers.

86 lines (83 loc) 2.43 kB
// 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) */