diff --git a/express-zod-api/src/graceful-helpers.ts b/express-zod-api/src/graceful-helpers.ts index 02b41da53..717dc36d1 100644 --- a/express-zod-api/src/graceful-helpers.ts +++ b/express-zod-api/src/graceful-helpers.ts @@ -32,8 +32,8 @@ export const isEncrypted = (socket: Socket): boolean => export const weAreClosed: http.RequestListener = ({}, res) => void (!res.headersSent && res.setHeader("connection", "close")); -export const closeAsync = (server: Server) => - new Promise( - (resolve, reject) => - void server.close((error) => (error ? reject(error) : resolve())), - ); +export const closeAsync = (server: Server) => { + const { promise, resolve, reject } = Promise.withResolvers(); + server.close((error) => (error ? reject(error) : resolve())); + return promise; +}; diff --git a/express-zod-api/src/middleware.ts b/express-zod-api/src/middleware.ts index 2755e9c81..33e6477b0 100644 --- a/express-zod-api/src/middleware.ts +++ b/express-zod-api/src/middleware.ts @@ -122,14 +122,15 @@ export class ExpressMiddleware< } = {}, ) { super({ - handler: async ({ request, response }) => - new Promise((resolve, reject) => { - const next = (err?: unknown) => { - if (err && err instanceof Error) return reject(transformer(err)); - resolve(provider(request as R, response as S)); - }; - nativeMw(request as R, response as S, next)?.catch(next); - }), + handler: async ({ request, response }) => { + const { promise, resolve, reject } = Promise.withResolvers(); + const next = (err?: unknown) => { + if (err && err instanceof Error) return reject(transformer(err)); + resolve(provider(request as R, response as S)); + }; + nativeMw(request as R, response as S, next)?.catch(next); + return promise; + }, }); } } diff --git a/express-zod-api/tests/graceful-shutdown.spec.ts b/express-zod-api/tests/graceful-shutdown.spec.ts index e8824f2a9..b8b5a275d 100644 --- a/express-zod-api/tests/graceful-shutdown.spec.ts +++ b/express-zod-api/tests/graceful-shutdown.spec.ts @@ -8,26 +8,28 @@ import { givePort } from "../../tools/ports"; import { signCert } from "./ssl-helpers"; describe("monitor()", () => { - const makeHttpServer = (handler: http.RequestListener) => - new Promise<[http.Server, number]>((resolve) => { - const subject = http.createServer(handler); - const port = givePort(); - subject.listen(port, () => resolve([subject, port])); - }); + const makeHttpServer = (handler: http.RequestListener) => { + const { promise, resolve } = Promise.withResolvers<[http.Server, number]>(); + const subject = http.createServer(handler); + const port = givePort(); + subject.listen(port, () => resolve([subject, port])); + return promise; + }; - const makeHttpsServer = (handler: http.RequestListener) => - new Promise<[https.Server, number]>((resolve) => { - const subject = https.createServer(signCert(), handler); - const port = givePort(); - subject.listen(port, () => resolve([subject, port])); - }); + const makeHttpsServer = (handler: http.RequestListener) => { + const { promise, resolve } = + Promise.withResolvers<[https.Server, number]>(); + const subject = https.createServer(signCert(), handler); + const port = givePort(); + subject.listen(port, () => resolve([subject, port])); + return promise; + }; - const getConnections = (server: http.Server) => - new Promise((resolve, reject) => { - server.getConnections((err, count) => - err ? reject(err) : resolve(count), - ); - }); + const getConnections = (server: http.Server) => { + const { promise, resolve, reject } = Promise.withResolvers(); + server.getConnections((err, count) => (err ? reject(err) : resolve(count))); + return promise; + }; test( "shuts down HTTP server with no connections",