add retry for sending mail *sigh*

This commit is contained in:
Thomas Ruoff
2020-11-11 23:24:43 +01:00
parent 7630f56b70
commit 460510e52b
4 changed files with 53 additions and 7 deletions

View File

@@ -2,6 +2,7 @@ import { Booking } from '../db/booking'
import { getBaseURL } from '../helpers/url' import { getBaseURL } from '../helpers/url'
import { daysFormatFrontend } from './date' import { daysFormatFrontend } from './date'
import { generateCalendarEntry } from './ical' import { generateCalendarEntry } from './ical'
import { retryWithDelay } from './retryWithDelay'
const SENDGRID_API_KEY = process.env.SENDGRID_API_KEY const SENDGRID_API_KEY = process.env.SENDGRID_API_KEY
const ADMIN_EMAIL = process.env.ADMIN_EMAIL const ADMIN_EMAIL = process.env.ADMIN_EMAIL
@@ -195,12 +196,17 @@ async function sendMail({
}, },
body: JSON.stringify(data), body: JSON.stringify(data),
} }
const resp = await fetch(SENDGRID_URL, fetchOptions)
const bodyText = await resp.text()
if (!resp.ok) { return retryWithDelay({
throw new Error( run: async () => {
`Unable to send mail, status ${resp.status} ${resp.statusText}, ${bodyText}` const resp = await fetch(SENDGRID_URL, fetchOptions)
) const bodyText = await resp.text()
}
if (!resp.ok) {
throw new Error(
`Failed to send mail with status ${resp.status}: ${bodyText}`
)
}
},
})
} }

20
helpers/retryWithDelay.ts Normal file
View File

@@ -0,0 +1,20 @@
import pRetry from 'p-retry'
export function retryWithDelay<T>({
run,
delay = 1000,
}: {
run: () => Promise<T>
delay?: number
}) {
return pRetry(run, {
retries: 2,
onFailedAttempt: (error) => {
console.info(
`Attempt ${error.attemptNumber}: ${error.message}. ${error.retriesLeft} retries left`
)
return new Promise((resolve) => setTimeout(resolve, delay))
},
})
}

19
package-lock.json generated
View File

@@ -2796,6 +2796,11 @@
"integrity": "sha512-QZ8EMG2P3230GQNEMXtSJq8v8zJkJqs8xpbohMbBefYG7i1MX2YzOsDoBWF2dpq36mrkXpoNgmmeVnXIT0DYtw==", "integrity": "sha512-QZ8EMG2P3230GQNEMXtSJq8v8zJkJqs8xpbohMbBefYG7i1MX2YzOsDoBWF2dpq36mrkXpoNgmmeVnXIT0DYtw==",
"dev": true "dev": true
}, },
"@types/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
"integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
},
"@types/stack-utils": { "@types/stack-utils": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
@@ -9454,6 +9459,15 @@
"aggregate-error": "^3.0.0" "aggregate-error": "^3.0.0"
} }
}, },
"p-retry": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz",
"integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==",
"requires": {
"@types/retry": "^0.12.0",
"retry": "^0.12.0"
}
},
"p-try": { "p-try": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -10783,6 +10797,11 @@
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
}, },
"retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
"integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
},
"rework": { "rework": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",

View File

@@ -16,6 +16,7 @@
"mongoose": "^5.10.13", "mongoose": "^5.10.13",
"next": "^10.0.1", "next": "^10.0.1",
"next-iron-session": "^4.1.10", "next-iron-session": "^4.1.10",
"p-retry": "^4.2.0",
"react": "^17.0.1", "react": "^17.0.1",
"react-calendar": "^3.2.0", "react-calendar": "^3.2.0",
"react-dom": "^17.0.1", "react-dom": "^17.0.1",