| 330 | const MAX_EMAIL_SIZE = 25 * 1024 * 1024; |
| 331 | |
| 332 | async function streamToArrayBuffer(stream: ReadableStream, streamSize: number) { |
| 333 | if (streamSize > MAX_EMAIL_SIZE) throw new Error(`Email too large: ${streamSize} bytes exceeds ${MAX_EMAIL_SIZE} byte limit`); |
| 334 | if (streamSize <= 0) throw new Error(`Invalid stream size: ${streamSize}`); |
| 335 | const result = new Uint8Array(streamSize); |
| 336 | let bytesRead = 0; |
| 337 | const reader = stream.getReader(); |
| 338 | while (true) { |
| 339 | const { done, value } = await reader.read(); |
| 340 | if (done) break; |
| 341 | if (bytesRead + value.length > streamSize) { reader.cancel(); throw new Error(`Stream exceeds declared size`); } |
| 342 | result.set(value, bytesRead); |
| 343 | bytesRead += value.length; |
| 344 | } |
| 345 | return result; |
| 346 | } |
| 347 | |
| 348 | async function receiveEmail(event: { raw: ReadableStream; rawSize: number }, env: Env, ctx: ExecutionContext) { |
| 349 | const rawEmail = await streamToArrayBuffer(event.raw, event.rawSize); |