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
- Use opts.filter to skip socket files: filter: (s) => !isSocketSync(s)
- Back up only known file trees instead of whole runtime directories
- 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
- Exclude runtime/socket directories (/run, /var/run) from backups
- Add a filter that skips special file types on recursive copies
- Unlink stale sockets instead of trying to back them up
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.