native-environment.ts 1.6 KB

123456789101112131415
  1. import {acquireServiceInstance} from '../../src/server/serviceInstance.js'
  2. import type {ApplicationRuntime} from '../../src/server/app.js'
  3. import {writeFileSync,realpathSync} from 'node:fs'
  4. import {join,resolve} from 'node:path'
  5. import {pathToFileURL} from 'node:url'
  6. import {spawn} from 'node:child_process'
  7. import electron from 'electron'
  8. export function nativeEnvironmentFixture(runtime:ApplicationRuntime,home:string,port:number){
  9. const instance=acquireServiceInstance(home,'0.4.3');instance.publish(`http://127.0.0.1:${port}`)
  10. runtime.app.middleware.unshift(instance.middleware(async()=>{},()=>true,ctx=>runtime.desktopEnvironments.bridge(ctx)))
  11. const main=join(home,'native-main.mjs'),dataRoot=join(home,'native-data')
  12. writeFileSync(main,`import {app} from 'electron';app.setPath('userData',${JSON.stringify(dataRoot)});app.whenReady().then(async()=>{const {DesktopEnvironmentHost}=await import(${JSON.stringify(pathToFileURL(resolve('desktop/environment-host.mjs')).href)});const {DesktopServiceManager}=await import(${JSON.stringify(pathToFileURL(resolve('desktop/service-manager.mjs')).href)});const manager=new DesktopServiceManager({home:${JSON.stringify(home)}});manager.root=${JSON.stringify(realpathSync(home))};globalThis.host=new DesktopEnvironmentHost({manager,root:${JSON.stringify(resolve('.desktop-build'))},dataRoot:${JSON.stringify(dataRoot)}});globalThis.host.start();app.on('window-all-closed',()=>{});});`)
  13. const child=spawn(String(electron),[main],{env:Object.fromEntries(Object.entries(process.env).filter(([key])=>key!=='ELECTRON_RUN_AS_NODE')),stdio:'ignore'})
  14. return ()=>{child.kill('SIGTERM');instance.release()}
  15. }