Skip to content

Commit 31a88fb

Browse files
committed
add retry logic & a default ENV export...
1 parent 3dfe5da commit 31a88fb

File tree

1 file changed

+89
-28
lines changed

1 file changed

+89
-28
lines changed

packages/common/src/ENVIRONMENT_VARS.ts

Lines changed: 89 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

105166
export default ENV;

0 commit comments

Comments
 (0)