Skip to content

Commit 90b4b2b

Browse files
committed
add retry
1 parent c1ea1f4 commit 90b4b2b

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

components/campaign_monitor/campaign_monitor.app.mjs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,37 @@ export default {
105105
_baseUrl() {
106106
return "https://api.createsend.com/api/v3.3";
107107
},
108-
_makeRequest(opts = {}) {
108+
async _makeRequest(opts = {}) {
109109
const {
110110
$ = this,
111111
path,
112112
...otherOpts
113113
} = opts;
114-
return axios($, {
115-
...otherOpts,
116-
url: `${this._baseUrl()}${path}`,
117-
headers: {
118-
Authorization: `Bearer ${this.$auth.oauth_access_token}`,
119-
},
120-
});
114+
const requestFn = async () => {
115+
return await axios($, {
116+
...otherOpts,
117+
url: `${this._baseUrl()}${path}`,
118+
headers: {
119+
Authorization: `Bearer ${this.$auth.oauth_access_token}`,
120+
},
121+
});
122+
};
123+
return await this.retryWithExponentialBackoff(requestFn);
124+
},
125+
// The API has been observed to occasionally return -
126+
// {"Code":120,"Message":"Invalid OAuth Token"}
127+
// Retry if a 401 Unauthorized or 429 (Rate limit exceeded)
128+
// status is returned
129+
async retryWithExponentialBackoff(requestFn, retries = 3, backoff = 500) {
130+
try {
131+
return await requestFn();
132+
} catch (error) {
133+
if (retries > 0 && (error.response?.status === 401 || error.response?.status === 429)) {
134+
await new Promise((resolve) => setTimeout(resolve, backoff));
135+
return this.retryWithExponentialBackoff(requestFn, retries - 1, backoff * 2);
136+
}
137+
throw error;
138+
}
121139
},
122140
listClients(opts = {}) {
123141
return this._makeRequest({

0 commit comments

Comments
 (0)