Hello, I want put my email into R2. Now I convert message.raw
stream to ArrayBuffer, then save ArrayBuffer to R2.
async function streamToArrayBuffer(stream, streamSize) {
let result = new Uint8Array(streamSize);
let bytesRead = 0;
const reader = stream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
result.set(value, bytesRead);
bytesRead += value.length;
}
return result;
}
export default {
async email(message, env, ctx) {
console.log(message.to);
const rawEmail = await streamToArrayBuffer(message.raw, message.rawSize);
await env.r2.put(`${message.to}/${message.from}-${new Date().getTime()}.eml`, rawEmail,{customMetadata:{
from:message.from,
time:new Date().getTime(),
}});
}
}
It cost more CPU time instreamToArrayBuffer
function, I think I can do it like await env.MY_BUCKET.put(key, request.body);
.
But when I put message.raw
into R2 directly, I got TypeError: Provided readable stream must have a known length (request/response body or readable half of FixedLengthStream)
. How can I fix it?thanks