Skip to content

Commit 0d73a13

Browse files
authored
feat: add timeout and fallback to clientVersion (#464)
1 parent c78d9fa commit 0d73a13

File tree

1 file changed

+77
-14
lines changed

1 file changed

+77
-14
lines changed

dashboard-plugin/client-version.js

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,53 @@
1-
module.exports = ({ currentHost, remoteName, dashboardURL }) => {
1+
module.exports = ({
2+
currentHost,
3+
remoteName,
4+
dashboardURL,
5+
fallbackEntryURL,
6+
fallbackRemoteVar,
7+
dashboardTimeout,
8+
}) => {
9+
fallbackRemoteVar = fallbackRemoteVar || remoteName;
10+
fallbackEntryURL = fallbackEntryURL || '';
11+
if (!dashboardTimeout) {
12+
dashboardTimeout = -1;
13+
}
14+
if (typeof dashboardTimeout !== 'number' || isNaN(dashboardTimeout)) {
15+
throw new Error('Invalid dashboardTimeout');
16+
}
217
//language=JS
318
return `promise new Promise((resolve, reject) => {
4-
fetch("${dashboardURL}&currentHost=${currentHost}&remoteName=${remoteName}", {
19+
var timeoutSignal;
20+
let timeoutId = null;
21+
var dashboardTimeout = ${dashboardTimeout};
22+
if (dashboardTimeout > 0) {
23+
var timeoutAbort = new AbortController();
24+
timeoutSignal = timeoutAbort.signal;
25+
timeoutId = setTimeout(function () {
26+
timeoutAbort.abort();
27+
}, dashboardTimeout);
28+
}
29+
fetch('${dashboardURL}&currentHost=${currentHost}&remoteName=${remoteName}', {
530
headers: {
6-
"Content-Type": "application/json",
7-
Accept: "application/json",
31+
'Content-Type': 'application/json',
32+
Accept: 'application/json',
833
},
34+
signal: timeoutSignal,
935
})
36+
.finally(function () {
37+
if (timeoutId !== null) {
38+
clearTimeout(timeoutId);
39+
}
40+
})
1041
.then(function (res) {
11-
return res.json()
42+
return res.json();
1243
})
1344
.then(function (data) {
14-
var name = data.name + "_" + data.version;
45+
var name = data.name + '_' + data.version;
1546
var filename = data.version + '.remoteEntry.js';
16-
var url = new URL(filename, data.remoteURL)
17-
47+
var url = new URL(filename, data.remoteURL);
48+
1849
new Promise(function (resolve, reject) {
19-
var __webpack_error__ = new Error()
50+
var __webpack_error__ = new Error();
2051
if (typeof window[name] !== 'undefined') return resolve();
2152
__webpack_require__.l(
2253
url.href,
@@ -31,11 +62,43 @@ module.exports = ({ currentHost, remoteName, dashboardURL }) => {
3162
__webpack_error__.request = realSrc;
3263
reject(__webpack_error__);
3364
},
34-
name,
65+
name
3566
);
36-
}).then(function () {
37-
resolve(window[name])
38-
}).catch(reject)
67+
})
68+
.then(function () {
69+
resolve(window[name]);
70+
})
71+
.catch(reject);
3972
})
40-
})`;
73+
.catch(function (error) {
74+
var fallbackEntryURL = '${fallbackEntryURL}';
75+
if (!fallbackEntryURL) return Promise.reject(error);
76+
var name = '${fallbackRemoteVar}';
77+
var url = new URL(fallbackEntryURL);
78+
79+
new Promise(function (resolve, reject) {
80+
var __webpack_error__ = new Error();
81+
if (typeof window[name] !== 'undefined') return resolve();
82+
__webpack_require__.l(
83+
url.href,
84+
function (event) {
85+
if (typeof window[name] !== 'undefined') return resolve();
86+
var errorType = event && (event.type === 'load' ? 'missing' : event.type);
87+
var realSrc = event && event.target && event.target.src;
88+
__webpack_error__.message =
89+
'Loading script failed.\\n(' + errorType + ': ' + realSrc + ')';
90+
__webpack_error__.name = 'ScriptExternalLoadError';
91+
__webpack_error__.type = errorType;
92+
__webpack_error__.request = realSrc;
93+
reject(__webpack_error__);
94+
},
95+
name
96+
);
97+
})
98+
.then(function () {
99+
resolve(window[name]);
100+
})
101+
.catch(reject);
102+
});
103+
});`;
41104
};

0 commit comments

Comments
 (0)