Skip to content

Commit 752ce9b

Browse files
authored
fix(shared): Retry with exponential backoff if loadScript fails (#4349)
1 parent 0df6b9b commit 752ce9b

File tree

2 files changed

+36
-23
lines changed

2 files changed

+36
-23
lines changed

.changeset/forty-laws-swim.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@clerk/clerk-js": patch
3+
"@clerk/shared": patch
4+
---
5+
6+
Retry with exponential backoff if loadScript fails to load the script

packages/shared/src/loadScript.ts

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { runWithExponentialBackOff } from './utils';
2+
13
const NO_DOCUMENT_ERROR = 'loadScript cannot be called when document does not exist';
24
const NO_SRC_ERROR = 'loadScript cannot be called without a src';
35

@@ -11,34 +13,39 @@ type LoadScriptOptions = {
1113

1214
export async function loadScript(src = '', opts: LoadScriptOptions): Promise<HTMLScriptElement> {
1315
const { async, defer, beforeLoad, crossOrigin, nonce } = opts || {};
14-
return new Promise((resolve, reject) => {
15-
if (!src) {
16-
reject(NO_SRC_ERROR);
17-
}
1816

19-
if (!document || !document.body) {
20-
reject(NO_DOCUMENT_ERROR);
21-
}
17+
const load = () => {
18+
return new Promise<HTMLScriptElement>((resolve, reject) => {
19+
if (!src) {
20+
reject(NO_SRC_ERROR);
21+
}
2222

23-
const script = document.createElement('script');
23+
if (!document || !document.body) {
24+
reject(NO_DOCUMENT_ERROR);
25+
}
2426

25-
crossOrigin && script.setAttribute('crossorigin', crossOrigin);
26-
script.async = async || false;
27-
script.defer = defer || false;
27+
const script = document.createElement('script');
2828

29-
script.addEventListener('load', () => {
30-
script.remove();
31-
resolve(script);
32-
});
29+
crossOrigin && script.setAttribute('crossorigin', crossOrigin);
30+
script.async = async || false;
31+
script.defer = defer || false;
32+
33+
script.addEventListener('load', () => {
34+
script.remove();
35+
resolve(script);
36+
});
37+
38+
script.addEventListener('error', () => {
39+
script.remove();
40+
reject();
41+
});
3342

34-
script.addEventListener('error', () => {
35-
script.remove();
36-
reject();
43+
script.src = src;
44+
script.nonce = nonce;
45+
beforeLoad?.(script);
46+
document.body.appendChild(script);
3747
});
48+
};
3849

39-
script.src = src;
40-
script.nonce = nonce;
41-
beforeLoad?.(script);
42-
document.body.appendChild(script);
43-
});
50+
return runWithExponentialBackOff(load, { shouldRetry: (_, iterations) => iterations < 5 });
4451
}

0 commit comments

Comments
 (0)