Created
December 5, 2018 21:08
-
-
Save ericvicenti/876e2df1103232f1fe6781c927e0eb63 to your computer and use it in GitHub Desktop.
Start server gracefully on unix socket
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require('fs'); | |
const net = require('net'); | |
async function isSocketInUse(socketPath) { | |
return new Promise((resolve, reject) => { | |
const clientSocket = new net.Socket(); | |
clientSocket.on('error', e => { | |
if (e.code === 'ECONNREFUSED') { | |
resolve(false); | |
} else { | |
reject(e); | |
} | |
}); | |
clientSocket.connect( | |
{ path: socketPath }, | |
() => { | |
clientSocket.unref(); | |
resolve(true); | |
} | |
); | |
}); | |
} | |
async function listen(server, listenLocation) { | |
return new Promise((resolve, reject) => { | |
server.listen(listenLocation, err => { | |
if (err) { | |
reject(err); | |
} else { | |
resolve(); | |
} | |
}); | |
}); | |
} | |
export default async function startServer(server, listenLocation) { | |
try { | |
await listen(server, listenLocation); | |
} catch (e) { | |
if (e.code !== 'EADDRINUSE') { | |
throw e; | |
} | |
if (await isSocketInUse(listenLocation)) { | |
throw e; | |
} | |
await fs.unlink(listenLocation); | |
await listen(server, listenLocation); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment