UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.

67 lines (65 loc) 3.16 kB
/** * Can open the network server in the browser * @param {string} command * @param {import('../types').needleMeta | null} config * @param {import('../types').userSettings} userSettings */ export const needleServer = (command, config, userSettings) => { const shouldOpenBrowser = userSettings.openBrowser === true; /** * @type {import("vite").UserConfig} */ return { name: 'needle:server', config(config) { // if this plugin is used to open the browser we want to make sure "open" in the vite config is set to false if (shouldOpenBrowser) { console.log("[needle:server] Setting 'open: false' in vite server config because 'openBrowser' is enabled in needlePlugins") return { ...config, server: { ...config.server, open: false } } } }, /** * @param {import("vite").ViteDevServer} server */ async configureServer(server) { if (shouldOpenBrowser) { console.log('[needle:server] Waiting for server...') const i = setInterval(() => { // https://github.com/vitejs/vite/blob/e861168f476b8cb278f599a0341076b0511c5264/packages/vite/src/node/preview.ts#L231 const resolvedUrls = server.resolvedUrls; if (resolvedUrls) { // stop trying when the urls are resolved clearInterval(i); let urlToOpen = null; // check if the network urls are available and attempt to open the first one const networkUrls = resolvedUrls.network; if (Array.isArray(networkUrls) && networkUrls.length > 0) { const networkUrl = networkUrls[0]; // perhaps we can just use the vite code here: https://github.com/vitejs/vite/blob/e861168f476b8cb278f599a0341076b0511c5264/packages/vite/src/node/server/openBrowser.ts#L72 console.log('[needle:server] Opening network URL: ' + networkUrl) urlToOpen = networkUrl; } else { const local = resolvedUrls.local; if (local?.length) { console.log('[needle:server] Opening local URL: ' + local) urlToOpen = local; } } import("open") .then((mod) => { mod.default(urlToOpen); }) .catch((err) => console.error("ERR: [needle:server] 'open' package not found - please make sure to install 'open' in your package.json\n", err)); } }, 100) } }, } };