Skip to main content

Desktop Apps - Embedded Nexus

Documentation de l'intégration de Nexus embarqué.


🔌 Architecture


📦 Main Process

// electron/main/index.ts
import { app, BrowserWindow } from 'electron';
import { spawn } from 'child_process';

let mainWindow: BrowserWindow | null = null;
let nexusProcess: any = null;

async function startNexus() {
const nexusPath = join(__dirname, '../../genesis-nexus/main.ts');
nexusProcess = spawn('deno', ['run', '--allow-all', nexusPath], {
env: { ...process.env, NEXUS_EMBEDDED: 'true' },
});

nexusProcess.stdout.on('data', (data) => {
console.log(`Nexus: ${data}`);
});

nexusProcess.stderr.on('data', (data) => {
console.error(`Nexus Error: ${data}`);
});
}

app.whenReady().then(async () => {
await startNexus();
await createWindow();
});

🌉 IPC Communication

// electron/preload/index.ts
import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('genesisAPI', {
// Workflow
executeWorkflow: (workflowId: string, input: unknown) =>
ipcRenderer.invoke('workflow:execute', workflowId, input),

// Nexus
sendToNexus: (message: unknown) =>
ipcRenderer.invoke('nexus:send', message),

receiveFromNexus: (callback: (data: unknown) => void) => {
const subscription = (_: any, data: unknown) => callback(data);
ipcRenderer.on('nexus:message', subscription);
return () => ipcRenderer.removeListener('nexus:message', subscription);
},
});

🎨 Renderer

// src/hooks/use-nexus.ts
export function useNexus() {
const [connected, setConnected] = useState(false);

useEffect(() => {
const unsubscribe = window.genesisAPI.receiveFromNexus((data) => {
console.log('Received from Nexus:', data);
});

setConnected(true);

return unsubscribe;
}, []);

const sendToNexus = async (message: any) => {
return await window.genesisAPI.sendToNexus(message);
};

return { connected, sendToNexus };
}

Version : 1.0.0