@@ -35,71 +35,132 @@ declare global {
3535 __SKUILDER_ENV__ : Environment | undefined ;
3636 }
3737}
38- let ENV : Environment = {
39- COUCHDB_SERVER_URL : '' ,
38+
39+ // Default fallback values if all else fails
40+ const defaultEnv : Environment = {
41+ COUCHDB_SERVER_URL : 'localhost:5984/' ,
4042 COUCHDB_SERVER_PROTOCOL : 'http' ,
41- EXPRESS_SERVER_URL : '' ,
43+ EXPRESS_SERVER_URL : 'localhost:3000/ ' ,
4244 EXPRESS_SERVER_PROTOCOL : 'http' ,
4345 DEBUG : false ,
4446 MOCK : false ,
4547} ;
4648
47- if ( typeof window !== 'undefined' && window . __SKUILDER_ENV__ ) {
48- console . log ( 'Using existing ENV from global scope' ) ;
49- ENV = window . __SKUILDER_ENV__ ;
50- } else {
51- // Try to load from Vite environment if available
49+ // Function to load environment variables from Vite
50+ function loadFromVite ( ) : Partial < Environment > {
51+ const result : Partial < Environment > = { } ;
52+
5253 try {
5354 // Use typeof check to avoid issues in non-Vite environments
5455 if ( typeof import . meta !== 'undefined' && 'env' in import . meta) {
5556 const env = ( import . meta as any ) . env ;
5657
5758 if ( env . VITE_COUCHDB_SERVER ) {
58- ENV . COUCHDB_SERVER_URL = env . VITE_COUCHDB_SERVER ;
59+ result . COUCHDB_SERVER_URL = env . VITE_COUCHDB_SERVER ;
5960 }
6061
6162 if ( env . VITE_COUCHDB_PROTOCOL ) {
62- ENV . COUCHDB_SERVER_PROTOCOL = env . VITE_COUCHDB_PROTOCOL as ProtocolString ;
63+ result . COUCHDB_SERVER_PROTOCOL = env . VITE_COUCHDB_PROTOCOL as ProtocolString ;
6364 }
6465
6566 if ( env . VITE_EXPRESS_SERVER ) {
66- ENV . EXPRESS_SERVER_URL = env . VITE_EXPRESS_SERVER ;
67+ result . EXPRESS_SERVER_URL = env . VITE_EXPRESS_SERVER ;
6768 }
6869
6970 if ( env . VITE_EXPRESS_PROTOCOL ) {
70- ENV . EXPRESS_SERVER_PROTOCOL = env . VITE_EXPRESS_PROTOCOL as ProtocolString ;
71+ result . EXPRESS_SERVER_PROTOCOL = env . VITE_EXPRESS_PROTOCOL as ProtocolString ;
7172 }
7273
7374 if ( env . VITE_DEBUG !== undefined ) {
74- ENV . DEBUG = env . VITE_DEBUG === 'true' ;
75+ result . DEBUG = env . VITE_DEBUG === 'true' ;
7576 }
7677
7778 if ( env . VITE_MOCK !== undefined ) {
78- ENV . MOCK = env . VITE_MOCK === 'true' ;
79+ result . MOCK = env . VITE_MOCK === 'true' ;
7980 }
8081 }
8182 } catch ( e ) {
8283 console . warn ( 'Unable to load environment variables from Vite:' , e ) ;
8384 }
84- // Store in global scope if in browser environment
85- if ( typeof window !== 'undefined' && ENV . COUCHDB_SERVER_URL && ENV . EXPRESS_SERVER_URL ) {
86- window . __SKUILDER_ENV__ = ENV ;
87- console . log ( 'ENV initialized and stored in global scope' ) ;
8885
89- console . log ( `ENV init:` ) ;
86+ return result ;
87+ }
88+
89+ // Function to validate if environment is properly loaded
90+ function isValidEnv ( env : Environment ) : boolean {
91+ return Boolean ( env . COUCHDB_SERVER_URL && env . EXPRESS_SERVER_URL ) ;
92+ }
9093
91- console . log ( ` COUCHDB_SERVER_URL: ${ ENV . COUCHDB_SERVER_URL } ` ) ;
92- console . log ( ` COUCHDB_SERVER_PROTOCOL: ${ ENV . COUCHDB_SERVER_PROTOCOL } ` ) ;
93- console . log ( ` EXPRESS_SERVER_URL: ${ ENV . EXPRESS_SERVER_URL } ` ) ;
94- console . log ( ` EXPRESS_SERVER_PROTOCOL: ${ ENV . EXPRESS_SERVER_PROTOCOL } ` ) ;
95- console . log ( ` DEBUG: ${ ENV . DEBUG } ` ) ;
96- console . log ( ` MOCK: ${ ENV . MOCK } ` ) ;
94+ // Initialize ENV with a blocking retry mechanism if needed
95+ let ENV : Environment ;
96+
97+ // First check if we have a global instance already
98+ if (
99+ typeof window !== 'undefined' &&
100+ window . __SKUILDER_ENV__ &&
101+ isValidEnv ( window . __SKUILDER_ENV__ )
102+ ) {
103+ console . log ( 'Using existing ENV from global scope' ) ;
104+ ENV = window . __SKUILDER_ENV__ ;
105+ } else {
106+ // Try loading with a blocking retry if in browser environment
107+ if ( typeof window !== 'undefined' ) {
108+ let viteEnv = loadFromVite ( ) ;
109+
110+ // If initial load didn't succeed, do a blocking retry
111+ if ( ! viteEnv . COUCHDB_SERVER_URL || ! viteEnv . EXPRESS_SERVER_URL ) {
112+ console . warn ( 'Initial ENV load incomplete, performing blocking retries...' ) ;
113+
114+ // Synchronous retries with exponential backoff
115+ const maxRetries = 5 ;
116+ let retryCount = 0 ;
117+ let baseDelay = 20 ; // ms
118+
119+ while (
120+ retryCount < maxRetries &&
121+ ( ! viteEnv . COUCHDB_SERVER_URL || ! viteEnv . EXPRESS_SERVER_URL )
122+ ) {
123+ // Create a delay using a synchronous approach
124+ const delay = baseDelay * Math . pow ( 2 , retryCount ) ;
125+ const startTime = Date . now ( ) ;
126+ while ( Date . now ( ) - startTime < delay ) {
127+ // Empty blocking loop
128+ }
129+
130+ retryCount ++ ;
131+ console . log ( `Retry ${ retryCount } /${ maxRetries } for ENV initialization...` ) ;
132+ viteEnv = loadFromVite ( ) ;
133+ }
134+
135+ if ( ! viteEnv . COUCHDB_SERVER_URL || ! viteEnv . EXPRESS_SERVER_URL ) {
136+ console . error ( 'ENV initialization failed after retries, using defaults' ) ;
137+ // Use default values if all retries fail
138+ ENV = { ...defaultEnv } ;
139+ } else {
140+ console . log ( 'ENV successfully initialized after retries' ) ;
141+ ENV = { ...defaultEnv , ...viteEnv } ;
142+ }
143+ } else {
144+ ENV = { ...defaultEnv , ...viteEnv } ;
145+ }
146+
147+ // Store in global scope
148+ window . __SKUILDER_ENV__ = ENV ;
149+ console . log ( 'ENV initialized and stored in global scope' ) ;
97150 } else {
98- console . warn ( 'ENV initialization failed' ) ;
151+ // Node.js environment (SSR or build)
152+ const viteEnv = loadFromVite ( ) ;
153+ ENV = { ...defaultEnv , ...viteEnv } ;
99154 }
100155}
101156
102- // if (ENV.DEBUG) {
103- // }
157+ // Log the initialized environment
158+ console . log ( `ENV init:` ) ;
159+ console . log ( ` COUCHDB_SERVER_URL: ${ ENV . COUCHDB_SERVER_URL } ` ) ;
160+ console . log ( ` COUCHDB_SERVER_PROTOCOL: ${ ENV . COUCHDB_SERVER_PROTOCOL } ` ) ;
161+ console . log ( ` EXPRESS_SERVER_URL: ${ ENV . EXPRESS_SERVER_URL } ` ) ;
162+ console . log ( ` EXPRESS_SERVER_PROTOCOL: ${ ENV . EXPRESS_SERVER_PROTOCOL } ` ) ;
163+ console . log ( ` DEBUG: ${ ENV . DEBUG } ` ) ;
164+ console . log ( ` MOCK: ${ ENV . MOCK } ` ) ;
104165
105166export default ENV ;
0 commit comments