Add browser compatibility fixes for URL constructor and Node.js functions
This commit is contained in:
parent
192070ffae
commit
8df2a3a621
127
start.sh
127
start.sh
@ -577,9 +577,14 @@ window.ENTE_CONFIG = {
|
|||||||
PUBLIC_ALBUMS_URL: 'https://${CLOUDRON_APP_FQDN}/public'
|
PUBLIC_ALBUMS_URL: 'https://${CLOUDRON_APP_FQDN}/public'
|
||||||
};
|
};
|
||||||
|
|
||||||
// Next.js environment variables - add NEXT_PUBLIC_BASE_URL to help with URL construction
|
// Add Node.js polyfills for browser environment
|
||||||
window.process = window.process || {};
|
window.process = window.process || {};
|
||||||
window.process.env = window.process.env || {};
|
window.process.env = window.process.env || {};
|
||||||
|
window.process.nextTick = window.process.nextTick || function(fn) { setTimeout(fn, 0); };
|
||||||
|
window.process.browser = true;
|
||||||
|
window.Buffer = window.Buffer || (function() { return { isBuffer: function() { return false; } }; })();
|
||||||
|
|
||||||
|
// Next.js environment variables
|
||||||
window.process.env.NEXT_PUBLIC_BASE_URL = 'https://${CLOUDRON_APP_FQDN}';
|
window.process.env.NEXT_PUBLIC_BASE_URL = 'https://${CLOUDRON_APP_FQDN}';
|
||||||
window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
||||||
window.process.env.NEXT_PUBLIC_ENTE_PUBLIC_ALBUMS_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/public';
|
window.process.env.NEXT_PUBLIC_ENTE_PUBLIC_ALBUMS_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/public';
|
||||||
@ -587,7 +592,8 @@ window.process.env.NEXT_PUBLIC_REACT_APP_ENTE_ENDPOINT = 'https://${CLOUDRON_APP
|
|||||||
window.process.env.REACT_APP_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
window.process.env.REACT_APP_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
||||||
|
|
||||||
// Add logging to help with debugging
|
// Add logging to help with debugging
|
||||||
console.log('Ente runtime config loaded from runtime-config.js');
|
console.log('Ente runtime config loaded from runtime-config.js with polyfills');
|
||||||
|
console.log('process.nextTick available:', !!window.process.nextTick);
|
||||||
console.log('BASE_URL:', window.process.env.NEXT_PUBLIC_BASE_URL);
|
console.log('BASE_URL:', window.process.env.NEXT_PUBLIC_BASE_URL);
|
||||||
console.log('API_URL (final):', window.ENTE_CONFIG.API_URL);
|
console.log('API_URL (final):', window.ENTE_CONFIG.API_URL);
|
||||||
console.log('PUBLIC_ALBUMS_URL (final):', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
|
console.log('PUBLIC_ALBUMS_URL (final):', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
|
||||||
@ -596,6 +602,74 @@ EOF
|
|||||||
|
|
||||||
chmod 644 /app/data/web/runtime-config.js
|
chmod 644 /app/data/web/runtime-config.js
|
||||||
|
|
||||||
|
# Create a custom URL patch file to fix the URL constructor error
|
||||||
|
echo "==> Creating URL and SRP patch file"
|
||||||
|
cat << EOF > /app/data/web/ente-patches.js
|
||||||
|
(function() {
|
||||||
|
// Save original URL constructor
|
||||||
|
const originalURL = window.URL;
|
||||||
|
|
||||||
|
// Create a patched URL constructor
|
||||||
|
window.URL = function(url, base) {
|
||||||
|
try {
|
||||||
|
if (!url) {
|
||||||
|
throw new Error('Invalid URL: URL cannot be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix relative URLs
|
||||||
|
if (!url.match(/^https?:\/\//i)) {
|
||||||
|
if (url.startsWith('/')) {
|
||||||
|
url = window.location.origin + url;
|
||||||
|
} else {
|
||||||
|
url = window.location.origin + '/' + url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to construct with fixed URL
|
||||||
|
return new originalURL(url, base);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('URL construction error:', e, 'for URL:', url);
|
||||||
|
|
||||||
|
// Safe fallback - use the origin as a last resort
|
||||||
|
return new originalURL(window.location.origin);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Patch the SRP implementation for browser compatibility
|
||||||
|
if (window.process) {
|
||||||
|
// Add any missing process methods
|
||||||
|
window.process.nextTick = window.process.nextTick || function(fn) {
|
||||||
|
setTimeout(fn, 0);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add Buffer polyfill if needed
|
||||||
|
if (!window.Buffer) {
|
||||||
|
window.Buffer = {
|
||||||
|
from: function(data, encoding) {
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
if (encoding === 'hex') {
|
||||||
|
return {
|
||||||
|
data: data,
|
||||||
|
toString: function() { return data; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
data: data,
|
||||||
|
toString: function() { return data; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { data: data };
|
||||||
|
},
|
||||||
|
isBuffer: function() { return false; },
|
||||||
|
alloc: function() { return {}; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Ente URL and SRP patches applied successfully');
|
||||||
|
})();
|
||||||
|
EOF
|
||||||
|
|
||||||
# Create the static HTML files with scripts pre-injected
|
# Create the static HTML files with scripts pre-injected
|
||||||
for app_dir in photos accounts auth cast; do
|
for app_dir in photos accounts auth cast; do
|
||||||
# Create directory for our modified files
|
# Create directory for our modified files
|
||||||
@ -613,7 +687,7 @@ for app_dir in photos accounts auth cast; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Insert config scripts right after the opening head tag
|
# Insert config scripts right after the opening head tag
|
||||||
sed -i 's/<head>/<head>\n <script src="\/config.js" type="text\/javascript"><\/script>\n <script src="\/runtime-config.js" type="text\/javascript"><\/script>/' "/app/data/web/$app_dir/index.html"
|
sed -i 's/<head>/<head>\n <script src="\/polyfills.js" type="text\/javascript"><\/script>\n <script src="\/config.js" type="text\/javascript"><\/script>\n <script src="\/runtime-config.js" type="text\/javascript"><\/script>\n <script src="\/ente-patches.js" type="text\/javascript"><\/script>/' "/app/data/web/$app_dir/index.html"
|
||||||
else
|
else
|
||||||
# Create a minimal HTML file with the scripts included
|
# Create a minimal HTML file with the scripts included
|
||||||
echo "==> Creating minimal pre-configured index.html for $app_dir app with redirect"
|
echo "==> Creating minimal pre-configured index.html for $app_dir app with redirect"
|
||||||
@ -621,8 +695,10 @@ for app_dir in photos accounts auth cast; do
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
<script src="/polyfills.js" type="text/javascript"></script>
|
||||||
<script src="/config.js" type="text/javascript"></script>
|
<script src="/config.js" type="text/javascript"></script>
|
||||||
<script src="/runtime-config.js" type="text/javascript"></script>
|
<script src="/runtime-config.js" type="text/javascript"></script>
|
||||||
|
<script src="/ente-patches.js" type="text/javascript"></script>
|
||||||
<meta http-equiv="refresh" content="0;url=/app/web/$app_dir/index.html">
|
<meta http-equiv="refresh" content="0;url=/app/web/$app_dir/index.html">
|
||||||
<title>Ente $app_dir</title>
|
<title>Ente $app_dir</title>
|
||||||
</head>
|
</head>
|
||||||
@ -665,9 +741,14 @@ cat << EOF > /app/data/caddy/Caddyfile
|
|||||||
PUBLIC_ALBUMS_URL: 'https://${CLOUDRON_APP_FQDN}/public'
|
PUBLIC_ALBUMS_URL: 'https://${CLOUDRON_APP_FQDN}/public'
|
||||||
};
|
};
|
||||||
|
|
||||||
// Next.js environment variables
|
// Add Node.js polyfills for browser environment
|
||||||
window.process = window.process || {};
|
window.process = window.process || {};
|
||||||
window.process.env = window.process.env || {};
|
window.process.env = window.process.env || {};
|
||||||
|
window.process.nextTick = window.process.nextTick || function(fn) { setTimeout(fn, 0); };
|
||||||
|
window.process.browser = true;
|
||||||
|
window.Buffer = window.Buffer || (function() { return { isBuffer: function() { return false; } }; })();
|
||||||
|
|
||||||
|
// Next.js environment variables
|
||||||
window.process.env.NEXT_PUBLIC_BASE_URL = 'https://${CLOUDRON_APP_FQDN}';
|
window.process.env.NEXT_PUBLIC_BASE_URL = 'https://${CLOUDRON_APP_FQDN}';
|
||||||
window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
window.process.env.NEXT_PUBLIC_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
||||||
window.process.env.NEXT_PUBLIC_ENTE_PUBLIC_ALBUMS_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/public';
|
window.process.env.NEXT_PUBLIC_ENTE_PUBLIC_ALBUMS_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/public';
|
||||||
@ -675,6 +756,8 @@ cat << EOF > /app/data/caddy/Caddyfile
|
|||||||
window.process.env.REACT_APP_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
window.process.env.REACT_APP_ENTE_ENDPOINT = 'https://${CLOUDRON_APP_FQDN}/api';
|
||||||
|
|
||||||
// Make sure URLs are explicitly defined with full domain
|
// Make sure URLs are explicitly defined with full domain
|
||||||
|
console.log('Node.js polyfills loaded');
|
||||||
|
console.log('process.nextTick available:', !!window.process.nextTick);
|
||||||
console.log('BASE_URL:', window.process.env.NEXT_PUBLIC_BASE_URL);
|
console.log('BASE_URL:', window.process.env.NEXT_PUBLIC_BASE_URL);
|
||||||
console.log('Ente config loaded - API_URL:', window.ENTE_CONFIG.API_URL);
|
console.log('Ente config loaded - API_URL:', window.ENTE_CONFIG.API_URL);
|
||||||
console.log('Ente config loaded - PUBLIC_ALBUMS_URL:', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
|
console.log('Ente config loaded - PUBLIC_ALBUMS_URL:', window.ENTE_CONFIG.PUBLIC_ALBUMS_URL);
|
||||||
@ -686,6 +769,35 @@ cat << EOF > /app/data/caddy/Caddyfile
|
|||||||
file_server
|
file_server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Add before the root path section
|
||||||
|
handle /polyfills.js {
|
||||||
|
header Content-Type application/javascript
|
||||||
|
respond "
|
||||||
|
// Node.js polyfills for browsers
|
||||||
|
window.process = window.process || {};
|
||||||
|
window.process.env = window.process.env || {};
|
||||||
|
window.process.nextTick = window.process.nextTick || function(fn) { setTimeout(fn, 0); };
|
||||||
|
window.process.browser = true;
|
||||||
|
|
||||||
|
// Buffer polyfill
|
||||||
|
window.Buffer = window.Buffer || (function() {
|
||||||
|
return {
|
||||||
|
isBuffer: function() { return false; },
|
||||||
|
from: function(data) { return { data: data }; }
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
// URL polyfill helper
|
||||||
|
window.ensureValidURL = function(url) {
|
||||||
|
if (!url) return 'https://${CLOUDRON_APP_FQDN}';
|
||||||
|
if (url.startsWith('http://') || url.startsWith('https://')) return url;
|
||||||
|
return 'https://${CLOUDRON_APP_FQDN}' + (url.startsWith('/') ? url : '/' + url);
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('Polyfills loaded successfully');
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
# Root path serves the photos app
|
# Root path serves the photos app
|
||||||
handle / {
|
handle / {
|
||||||
# Special handling for index.html
|
# Special handling for index.html
|
||||||
@ -838,6 +950,13 @@ cat << EOF > /app/data/caddy/Caddyfile
|
|||||||
uri strip_prefix /public
|
uri strip_prefix /public
|
||||||
reverse_proxy 0.0.0.0:$PUBLIC_ALBUMS_PORT
|
reverse_proxy 0.0.0.0:$PUBLIC_ALBUMS_PORT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Serve Ente client patches
|
||||||
|
handle /ente-patches.js {
|
||||||
|
header Content-Type application/javascript
|
||||||
|
root * /app/data/web
|
||||||
|
file_server
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user