| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // PWA
- if ('serviceWorker' in navigator) {
- window.addEventListener('load', function() {
- navigator.serviceWorker.register('/pwa-service-worker.js');
- });
- }
- // Import board converter for on-demand conversion
- import '/client/lib/boardConverter';
- import '/client/components/boardConversionProgress';
- // Import migration manager and progress UI
- import '/client/lib/migrationManager';
- import '/client/components/migrationProgress';
- // Import cron settings
- import '/client/components/settings/cronSettings';
- // Mirror Meteor login token into a cookie for server-side file route auth
- // This enables cookie-based auth for /cdn/storage/* without leaking ROOT_URL
- // Token already lives in localStorage; cookie adds same-origin send-on-request semantics
- Meteor.startup(() => {
- const COOKIE_NAME = 'meteor_login_token';
- const cookieAttrs = () => {
- const attrs = ['Path=/', 'SameSite=Lax'];
- try {
- if (window.location && window.location.protocol === 'https:') {
- attrs.push('Secure');
- }
- } catch (_) {}
- return attrs.join('; ');
- };
- const setCookie = (name, value) => {
- if (!value) return;
- document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; ${cookieAttrs()}`;
- };
- const clearCookie = (name) => {
- document.cookie = `${encodeURIComponent(name)}=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; ${cookieAttrs()}`;
- };
- const syncCookie = () => {
- try {
- const token = Accounts && typeof Accounts._storedLoginToken === 'function' ? Accounts._storedLoginToken() : null;
- if (token) setCookie(COOKIE_NAME, token); else clearCookie(COOKIE_NAME);
- } catch (e) {
- // ignore
- }
- };
- // Initial sync on startup
- syncCookie();
- // Keep cookie in sync on login/logout
- if (Accounts && typeof Accounts.onLogin === 'function') Accounts.onLogin(syncCookie);
- if (Accounts && typeof Accounts.onLogout === 'function') Accounts.onLogout(syncCookie);
- // Sync across tabs/windows when localStorage changes
- window.addEventListener('storage', (ev) => {
- if (ev && typeof ev.key === 'string' && ev.key.indexOf('Meteor.loginToken') !== -1) {
- syncCookie();
- }
- });
- });
|