feat(testing): add test for app > listen (#4971)
* feat(testing): add test for app > listen * Update test/unit/node/app.test.ts * refactor: modernize listen fn in app * wip * fix: update error message * fixup: remove console.log * fixup: use clearAllMocks once in beforeAll * fix: move chmod after socket listen * fixup: formatting * Update src/node/app.ts Co-authored-by: Jonathan Yu <jonathan@coder.com> * Update src/node/app.ts Co-authored-by: Asher <ash@coder.com> Co-authored-by: Jonathan Yu <jonathan@coder.com> Co-authored-by: Asher <ash@coder.com>
This commit is contained in:
@ -22,40 +22,35 @@ export interface App extends Disposable {
|
||||
server: http.Server
|
||||
}
|
||||
|
||||
const listen = (server: http.Server, { host, port, socket, "socket-mode": mode }: ListenOptions) => {
|
||||
return new Promise<void>(async (resolve, reject) => {
|
||||
export const listen = async (server: http.Server, { host, port, socket, "socket-mode": mode }: ListenOptions) => {
|
||||
if (socket) {
|
||||
try {
|
||||
await fs.unlink(socket)
|
||||
} catch (error: any) {
|
||||
handleArgsSocketCatchError(error)
|
||||
}
|
||||
}
|
||||
await new Promise<void>(async (resolve, reject) => {
|
||||
server.on("error", reject)
|
||||
|
||||
const onListen = () => {
|
||||
// Promise resolved earlier so this is an unrelated error.
|
||||
server.off("error", reject)
|
||||
server.on("error", (err) => util.logError(logger, "http server error", err))
|
||||
|
||||
if (socket && mode) {
|
||||
fs.chmod(socket, mode)
|
||||
.then(resolve)
|
||||
.catch((err) => {
|
||||
util.logError(logger, "socket chmod", err)
|
||||
reject(err)
|
||||
})
|
||||
} else {
|
||||
resolve()
|
||||
}
|
||||
resolve()
|
||||
}
|
||||
|
||||
if (socket) {
|
||||
try {
|
||||
await fs.unlink(socket)
|
||||
} catch (error: any) {
|
||||
handleArgsSocketCatchError(error)
|
||||
}
|
||||
|
||||
server.listen(socket, onListen)
|
||||
} else {
|
||||
// [] is the correct format when using :: but Node errors with them.
|
||||
server.listen(port, host.replace(/^\[|\]$/g, ""), onListen)
|
||||
}
|
||||
})
|
||||
|
||||
// NOTE@jsjoeio: we need to chmod after the server is finished
|
||||
// listening. Otherwise, the socket may not have been created yet.
|
||||
if (socket && mode) {
|
||||
await fs.chmod(socket, mode)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -138,6 +133,6 @@ export const handleServerError = (resolved: boolean, err: Error, reject: (err: E
|
||||
*/
|
||||
export const handleArgsSocketCatchError = (error: any) => {
|
||||
if (!isNodeJSErrnoException(error) || error.code !== "ENOENT") {
|
||||
logger.error(error.message ? error.message : error)
|
||||
throw Error(error.message ? error.message : error)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user