Code improvements

This commit is contained in:
James Brunton 2025-12-18 13:51:19 +00:00
parent 84d50da532
commit f872ba955d
7 changed files with 75 additions and 7 deletions

View File

@ -0,0 +1,10 @@
import { connectionModeService } from '@app/services/connectionModeService';
import { tauriBackendService } from '@app/services/tauriBackendService';
/**
* Desktop implementation for completing self-hosted deep link SSO.
*/
export async function completeSelfHostedDeepLink(serverUrl: string): Promise<void> {
await connectionModeService.switchToSelfHosted({ url: serverUrl });
await tauriBackendService.initializeExternalBackend();
}

View File

@ -109,7 +109,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
if (typeof window !== 'undefined' && (window as any).__TAURI__ && window.location.pathname.startsWith('/login')) {
try {
const { authService } = await import('@app/services/authService');
await authService.logout();
await authService.localClearAuth();
} catch (desktopErr) {
console.warn('[Auth] Failed to clear desktop auth state on login page init', desktopErr);
}

View File

@ -0,0 +1,25 @@
import { invoke, isTauri } from '@tauri-apps/api/core';
/**
* Desktop bridge used by self-hosted SSO deep links.
* Uses direct Tauri commands so we don't rely on desktop-specific path aliases.
*/
export async function completeSelfHostedDeepLink(serverUrl: string): Promise<void> {
if (!isTauri()) return;
const normalizedUrl = serverUrl.replace(/\/$/, '');
// Persist server config for desktop backend
try {
await invoke('set_connection_mode', { mode: 'selfhosted', serverConfig: { url: normalizedUrl } });
} catch (err) {
console.warn('[DesktopBridge] Failed to set connection mode', err);
}
// Ensure backend is started/pointing at the provided server
try {
await invoke('start_backend', { backendUrl: normalizedUrl });
} catch (err) {
console.warn('[DesktopBridge] Failed to start backend', err);
}
}

View File

@ -82,12 +82,8 @@ export default function AuthCallback() {
const parsed = JSON.parse(pending) as { serverUrl?: string } | null;
if (parsed?.serverUrl) {
try {
// Lazy-load desktop services only in Tauri runtime; TypeScript ignores missing types
// and Vite ignores analysis for these optional imports.
const { connectionModeService } = await import(/* @vite-ignore */ '../../desktop/services/connectionModeService');
const { tauriBackendService } = await import(/* @vite-ignore */ '../../desktop/services/tauriBackendService');
await connectionModeService.switchToSelfHosted({ url: parsed.serverUrl });
await tauriBackendService.initializeExternalBackend();
const { completeSelfHostedDeepLink } = await import('../desktopBridge');
await completeSelfHostedDeepLink(parsed.serverUrl);
} catch (innerErr) {
console.error('[AuthCallback] Desktop fallback services unavailable', innerErr);
}

View File

@ -0,0 +1,16 @@
/**
* Proprietary (web/SaaS) stub for the desktop auth service.
* Desktop build overrides @app/services/authService via tsconfig path order.
*/
export const authService = {
async localClearAuth(): Promise<void> {
try {
localStorage.removeItem('stirling_jwt');
} catch {
// ignore
}
},
async logout(): Promise<void> {
await this.localClearAuth();
},
};

View File

@ -0,0 +1,10 @@
/**
* Runtime-safe stub for desktop-only auth service.
* Proprietary (web/SaaS) build must not ship Tauri deps, so we expose just the
* minimal surface that desktop entry points dynamically import.
*/
export const authService = {
async localClearAuth(): Promise<void> {
// noop for web builds
},
};

View File

@ -0,0 +1,11 @@
// Desktop bridge stub for proprietary build
declare module '@desktop/bridge' {
export function completeSelfHostedDeepLink(serverUrl: string): Promise<void>;
}
// Desktop authService stub for proprietary build (no-op)
declare module '@app/services/authService' {
export const authService: {
localClearAuth: () => Promise<void>;
};
}