diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 24c224507..cea63efd5 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -52,6 +52,7 @@ "defu": "^6.1.4", "exsolve": "^1.0.7", "fuse.js": "^7.1.0", + "get-port-please": "^3.2.0", "giget": "^2.0.0", "h3": "^1.15.3", "httpxy": "^0.1.7", diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index 5d5445b5d..efc2106fd 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -10,12 +10,13 @@ import { fork } from 'node:child_process' import process from 'node:process' import { defineCommand } from 'citty' +import { isSocketSupported } from 'get-port-please' import { createProxyServer } from 'httpxy' import { listen } from 'listhen' import { getArgs as getListhenArgs, parseArgs as parseListhenArgs } from 'listhen/cli' import { resolve } from 'pathe' import { satisfies } from 'semver' -import { isBun, isTest, provider } from 'std-env' +import { isBun, isTest } from 'std-env' import { initialize } from '../dev' import { renderError } from '../dev/error' @@ -135,7 +136,7 @@ const command = defineCommand({ const nuxtSocketEnv = process.env.NUXT_SOCKET ? process.env.NUXT_SOCKET === '1' : undefined - const useSocket = nuxtSocketEnv ?? (nuxtOptions._majorVersion === 4 && provider !== 'stackblitz') + const useSocket = nuxtSocketEnv ?? (nuxtOptions._majorVersion === 4 && await isSocketSupported()) const urls = await devProxy.listener.getURLs() // run initially in in no-fork mode diff --git a/packages/nuxi/src/dev/socket.ts b/packages/nuxi/src/dev/socket.ts index 36a204c9c..2d81d398d 100644 --- a/packages/nuxi/src/dev/socket.ts +++ b/packages/nuxi/src/dev/socket.ts @@ -1,20 +1,8 @@ import type { RequestListener } from 'node:http' -import { existsSync, unlinkSync } from 'node:fs' import { Server } from 'node:http' import process from 'node:process' -function generateSocketPath(prefix: string): string { - const timestamp = Date.now() - const random = Math.random().toString(36).slice(2, 8) - - if (process.platform === 'win32') { - // Windows named pipes - return `\\\\.\\pipe\\nuxt-${prefix}-${timestamp}-${random}` - } - - // Unix domain sockets - return `/tmp/nuxt-${prefix}-${timestamp}-${random}.sock` -} +import { cleanSocket, getSocketAddress } from 'get-port-please' export function formatSocketURL(socketPath: string, ssl = false): string { const protocol = ssl ? 'https' : 'http' @@ -45,17 +33,12 @@ export function parseSocketURL(url: string): { socketPath: string, protocol: 'ht } export async function createSocketListener(handler: RequestListener, ssl = false) { - const socketPath = generateSocketPath('nuxt-dev') + const socketPath = getSocketAddress({ + name: 'nuxt-dev', + random: true, + }) const server = new Server(handler) - - if (process.platform !== 'win32' && existsSync(socketPath)) { - try { - unlinkSync(socketPath) - } - catch { - // suppress errors if the socket file cannot be removed - } - } + await cleanSocket(socketPath) await new Promise(resolve => server.listen({ path: socketPath }, resolve)) const url = formatSocketURL(socketPath, ssl) return { @@ -71,15 +54,7 @@ export async function createSocketListener(handler: RequestListener, ssl = false await new Promise((resolve, reject) => server.close(err => err ? reject(err) : resolve())) } finally { - // Clean up socket file on Unix systems - if (process.platform !== 'win32') { - try { - unlinkSync(socketPath) - } - catch { - // suppress errors - } - } + await cleanSocket(socketPath) } }, getURLs: async () => [{ url, type: 'network' as const }], diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index f24db03b3..8c9373e3d 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -41,6 +41,7 @@ "defu": "^6.1.4", "exsolve": "^1.0.7", "fuse.js": "^7.1.0", + "get-port-please": "^3.2.0", "giget": "^2.0.0", "h3": "^1.15.3", "httpxy": "^0.1.7", @@ -62,7 +63,6 @@ "devDependencies": { "@nuxt/schema": "^3.17.6", "@types/node": "^22.16.0", - "get-port-please": "^3.2.0", "rollup": "^4.44.2", "rollup-plugin-visualizer": "^6.0.3", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ada66b46b..9cb319aa9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,6 +139,9 @@ importers: fuse.js: specifier: ^7.1.0 version: 7.1.0 + get-port-please: + specifier: ^3.2.0 + version: 3.2.0 giget: specifier: ^2.0.0 version: 2.0.0 @@ -241,6 +244,9 @@ importers: fuse.js: specifier: ^7.1.0 version: 7.1.0 + get-port-please: + specifier: ^3.2.0 + version: 3.2.0 giget: specifier: ^2.0.0 version: 2.0.0 @@ -299,9 +305,6 @@ importers: '@types/node': specifier: ^22.16.0 version: 22.16.0 - get-port-please: - specifier: ^3.2.0 - version: 3.2.0 rollup: specifier: ^4.44.2 version: 4.44.2