1+ import { runWithExponentialBackOff } from './utils' ;
2+
13const NO_DOCUMENT_ERROR = 'loadScript cannot be called when document does not exist' ;
24const NO_SRC_ERROR = 'loadScript cannot be called without a src' ;
35
@@ -11,34 +13,39 @@ type LoadScriptOptions = {
1113
1214export 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