denoland/deno · error · NodeSystemError

ERR_FS_CP_SOCKET

ERR_FS_CP_SOCKET

Error message

Cannot copy a socket file

What it means

When the native cp validation resolves a path (src, dest, or a symlink target under dereference:true) to a Unix domain socket, throwCpError maps kind 'SOCKET' to ERR_FS_CP_SOCKET ('Cannot copy a socket file'). fs.cp deliberately refuses sockets because they have no content to copy.

Source

Thrown at ext/node/polyfills/_fs/cp/cp.ts:100

      });
    case "EEXIST":
      throw new ERR_FS_CP_EEXIST({
        message: err.message,
        path: err.path,
        syscall: "cp",
        errno: EEXIST,
        code: "EEXIST",
      });
    case "EISDIR":
      throw new ERR_FS_EISDIR({
        message: err.message,
        path: err.path,
        syscall: "cp",
        errno: EISDIR,
        code: "EISDIR",
      });
    case "SOCKET":
      throw new ERR_FS_CP_SOCKET({
        message: err.message,
        path: err.path,
        syscall: "cp",
        errno: EINVAL,
        code: "EINVAL",
      });
    case "FIFO":
      throw new ERR_FS_CP_FIFO_PIPE({
        message: err.message,
        path: err.path,
        syscall: "cp",
        errno: EINVAL,
        code: "EINVAL",
      });
    case "UNKNOWN":
      throw new ERR_FS_CP_UNKNOWN({
        message: err.message,
        path: err.path,

View on GitHub (pinned to 89f33cbef2)

Solutions

  1. Use opts.filter to skip socket files: filter: (s) => !isSocketSync(s)
  2. Back up only known file trees instead of whole runtime directories
  3. If a stale socket blocks the copy, remove it (sockets are not data)

Example fix

// before
await fsp.cp('/var/run/app', '/backup/app', { recursive: true, dereference: true });

// after
await fsp.cp('/var/run/app', '/backup/app', {
  recursive: true,
  dereference: true,
  filter: (s) => (fs.lstatSync(s).isSocket?.() ?? false) === false,
});
Defensive patterns

Strategy: validation

Validate before calling

const filter = (s) => { const st = fs.lstatSync(s); return !(st.isSocket?.() ?? false); };
await fsp.cp(src, dest, { recursive: true, dereference: true, filter });

Type guard

function isSocketPath(p) { try { return fs.lstatSync(p).isSocket(); } catch { return false; } }

Try / catch

try { await fsp.cp(src, dest, { recursive: true, dereference: true }); } catch (e) { if (e.code === 'ERR_FS_CP_SOCKET') { /* exclude socket and retry */ } else throw e; }

Prevention

When it happens

Trigger: await fsp.cp('/var/run/app', '/backup/app') where /var/run/app is a .sock socket; recursive copy of a runtime directory containing docker.sock or postgres socket files with dereference enabled.

Common situations: Backing up /var/run, /tmp, or state directories that contain live sockets; copying node_modules or runtime dirs where a dev server left its socket.

Related errors


AI-assisted analysis of denoland/deno@89f33cbef2 (2026-08-16). Data as JSON: /api/errors/d3bbd8e218fd4d64. Report an issue: GitHub.