@@ -10,6 +10,12 @@ export const LOADING_ERROR = {
1010 PROXY_FAILED : 2 ,
1111}
1212
13+ const PROXY_STARTING_STATES = new Set ( [ 'starting' , 'stopped' , 'restarting' ] )
14+ const PROXY_POLL_INTERVAL_MS = 1500
15+ const PROXY_POLL_TIMEOUT_MS = 30000
16+
17+ const sleep = ( ms ) => new Promise ( ( resolve ) => setTimeout ( resolve , ms ) )
18+
1319export const isCollaboraConfigured = ( ) => {
1420 const collaboraCapabilities = getCapabilities ( ) ?. collabora
1521 return isBuiltinCodeServerUsed ( ) || collaboraCapabilities . length !== 0
@@ -26,43 +32,46 @@ export const checkCollaboraConfiguration = async () => {
2632 }
2733}
2834
29- let proxyStatusCheckRetry = 0
30- export const checkProxyStatus = async ( _resolve , _reject ) => {
35+ export const checkProxyStatus = async ( ) => {
3136 const wopiUrl = getCapabilities ( ) ?. config ?. wopi_url
3237 if ( wopiUrl . indexOf ( 'proxy.php' ) === - 1 ) {
3338 return true
3439 }
3540
3641 const url = wopiUrl . slice ( 0 , wopiUrl . indexOf ( 'proxy.php' ) + 'proxy.php' . length )
3742 const proxyStatusUrl = url + '?status'
43+ const deadline = Date . now ( ) + PROXY_POLL_TIMEOUT_MS
44+
45+ while ( Date . now ( ) < deadline ) {
46+ let result
47+ try {
48+ result = await axios . get ( proxyStatusUrl )
49+ } catch ( e ) {
50+ await sleep ( PROXY_POLL_INTERVAL_MS )
51+ continue
52+ }
3853
39- const checkProxyStatusCallback = async ( resolve , reject ) => {
40- const result = await axios . get ( proxyStatusUrl )
41- if ( ! result || ! result ?. data ?. status ) {
42- reject ( 'Failed to contact status endpoint' )
54+ const status = result ?. data ?. status
55+ if ( ! status ) {
56+ await sleep ( PROXY_POLL_INTERVAL_MS )
57+ continue
4358 }
4459
45- if ( result . data . status === 'OK' ) {
46- return resolve ( true )
60+ if ( status === 'OK' ) {
61+ return true
4762 }
48- if ( result . data . status === 'error' ) {
49- return reject ( t ( 'richdocuments' , 'Built-in CODE server failed to start' ) )
63+
64+ if ( status === 'error' ) {
65+ throw Error ( LOADING_ERROR . PROXY_FAILED )
5066 }
5167
52- if ( proxyStatusCheckRetry < 3 && ( result . data . status === 'starting' || result . data . status === 'stopped' || result . data . status === 'restarting' ) ) {
53- setTimeout ( ( ) => {
54- proxyStatusCheckRetry ++
55- checkProxyStatus ( resolve , reject )
56- } )
57- } else {
58- reject ( 'Maximum retries reached' )
68+ if ( PROXY_STARTING_STATES . has ( status ) ) {
69+ await sleep ( PROXY_POLL_INTERVAL_MS )
70+ continue
5971 }
6072
73+ await sleep ( PROXY_POLL_INTERVAL_MS )
6174 }
6275
63- if ( _reject && _resolve ) {
64- return checkProxyStatusCallback ( _reject , _resolve )
65- } else {
66- return new Promise ( checkProxyStatusCallback )
67- }
76+ throw Error ( t ( 'richdocuments' , 'Starting the built-in CODE server is taking longer than expected' ) )
6877}
0 commit comments