in firestore-send-email/functions/src/index.ts [239:292]
async function deliver(
payload: QueuePayload,
ref: FirebaseFirestore.DocumentReference
): Promise<any> {
logs.attemptingDelivery(ref);
const update = {
"delivery.attempts": admin.firestore.FieldValue.increment(1),
"delivery.endTime": admin.firestore.FieldValue.serverTimestamp(),
"delivery.error": null,
"delivery.leaseExpireTime": null,
};
try {
payload = await preparePayload(payload);
if (!payload.to.length && !payload.cc.length && !payload.bcc.length) {
throw new Error(
"Failed to deliver email. Expected at least 1 recipient."
);
}
const result = await transport.sendMail(
Object.assign(payload.message, {
from: payload.from || config.defaultFrom,
replyTo: payload.replyTo || config.defaultReplyTo,
to: payload.to,
cc: payload.cc,
bcc: payload.bcc,
headers: payload.headers || {},
})
);
const info = {
messageId: result.messageId || null,
accepted: result.accepted || [],
rejected: result.rejected || [],
pending: result.pending || [],
response: result.response || null,
};
update["delivery.state"] = "SUCCESS";
update["delivery.info"] = info;
logs.delivered(ref, info);
} catch (e) {
update["delivery.state"] = "ERROR";
update["delivery.error"] = e.toString();
logs.deliveryError(ref, e);
}
// Wrapping in transaction to allow for automatic retries (#48)
return admin.firestore().runTransaction((transaction) => {
transaction.update(ref, update);
return Promise.resolve();
});
}