diff --git a/expf.config.json b/expf.config.json index 22cf65c..2d0ef2d 100644 --- a/expf.config.json +++ b/expf.config.json @@ -1,3 +1,3 @@ { - "write": false + "write": true } diff --git a/package-lock.json b/package-lock.json index e8d7e4c..8ace9ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,10 @@ "./servers/*", "./perf/load/*", "./perf/bench/*" - ] + ], + "dependencies": { + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.74.0" + } }, "node_modules/@assemblyscript/loader": { "version": "0.19.23", @@ -472,6 +475,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.9", "dev": true, @@ -1211,6 +1220,16 @@ "node": ">= 0.8" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/distributions": { "version": "2.2.0", "license": "MIT", @@ -2489,6 +2508,12 @@ "version": "0.5.10", "license": "MIT" }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "license": "MIT" + }, "node_modules/http2-wrapper": { "version": "1.0.3", "license": "MIT", @@ -3174,6 +3199,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.54.0", "license": "MIT", @@ -4659,6 +4705,15 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "license": "MIT", @@ -4670,6 +4725,311 @@ "version": "1.1.0", "license": "MIT" }, + "node_modules/uwebsockets-express": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/uwebsockets-express/-/uwebsockets-express-1.3.13.tgz", + "integrity": "sha512-EGv0q/D5KhV/V6CjlUalWfzKrcTihLPyQjnImR3hngviWg/UHtKX+SOI0+5lOLr+QjjfOHrKwc1jkXedAtMOmw==", + "license": "MIT", + "dependencies": { + "express": "^4.18.1", + "http-status-codes": "^2.1.4", + "mime": "^2.5.2", + "path-to-regexp": "^0.1.7" + } + }, + "node_modules/uwebsockets-express/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/uwebsockets-express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/uwebsockets-express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/uwebsockets-express/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/uwebsockets-express/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/uwebsockets-express/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uwebsockets-express/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uwebsockets-express/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uwebsockets-express/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uwebsockets-express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/uwebsockets-express/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uwebsockets-express/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uwebsockets-express/node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uwebsockets-express/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uwebsockets-express/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uWebSockets.js": { + "version": "20.49.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#442087c0a01bf146acb7386910739ec81df06700", + "license": "Apache-2.0" + }, "node_modules/vary": { "version": "1.1.2", "license": "MIT", @@ -4980,7 +5340,9 @@ "license": "ISC", "dependencies": { "@expressjs/perf-requests": "file:../../../packages/requests", - "@expressjs/perf-servers-express-helloworld": "file:../../../servers/express-helloworld" + "@expressjs/perf-servers-express-helloworld": "file:../../../servers/express-helloworld", + "uwebsockets-express": "1.3.13", + "uWebSockets.js": "uNetworking/uWebSockets.js#v20.51.0" } }, "perf/load/extended-query": { diff --git a/package.json b/package.json index 9e7f635..4fee65c 100644 --- a/package.json +++ b/package.json @@ -24,5 +24,8 @@ "./servers/*", "./perf/load/*", "./perf/bench/*" - ] + ], + "dependencies": { + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.74.0" + } } diff --git a/packages/cli/bin/expf.mjs b/packages/cli/bin/expf.mjs index 0f2cd71..d054aaa 100644 --- a/packages/cli/bin/expf.mjs +++ b/packages/cli/bin/expf.mjs @@ -61,6 +61,11 @@ const { values, positionals } = parseArgs({ 'force-rebuild': { type: 'boolean' + }, + + uws: { + type: 'boolean', + default: false } } }); diff --git a/packages/cli/load.mjs b/packages/cli/load.mjs index 4d07126..ef68e1c 100644 --- a/packages/cli/load.mjs +++ b/packages/cli/load.mjs @@ -22,12 +22,22 @@ export function help (opts = {}) { --config=./expf.config.json --[no-]write --[no-]parallel + --uws Enable uWebSockets.js via uwebsockets-express + (auto-selects v1.3.13 for Express 4, v2.0.0 for Express 5) Runners: - @expressjs/perf-runner-vanilla: local docker based runner - Flags: --force-rebuild - @expressjs/perf-runner-nsolid: local docker based runner with nsolid - Flags: --force-rebuild + + Examples: + + # Express 5 (default) with uWebSockets.js + expf load --uws + + # Express 4 with uWebSockets.js + expf load --uws --overrides='{"express":"4.21.2"}' ` } diff --git a/packages/runner-local/server.mjs b/packages/runner-local/server.mjs index 3fa3386..c0aedde 100644 --- a/packages/runner-local/server.mjs +++ b/packages/runner-local/server.mjs @@ -8,7 +8,13 @@ export async function startServer (cwd, opts = {}) { } return new Promise((resolve, reject) => { const test = fileURLToPath(import.meta.resolve(opts.test)); - const cp = execFile(process.execPath, [ test ], { cwd }); + const cp = execFile(process.execPath, [ test ], { + cwd, + env: { + ...process.env, + ...(opts.uws ? { USE_UWS: '1' } : {}) + } + }); const server = { metadata: { diff --git a/packages/runner-local/setup.mjs b/packages/runner-local/setup.mjs index b2da817..f52f2e8 100644 --- a/packages/runner-local/setup.mjs +++ b/packages/runner-local/setup.mjs @@ -56,17 +56,48 @@ export async function setup (cwd, opts = {}) { } })).default; - // Apply overrides - if (opts.overrides) { + // Apply overrides and uws dependencies + const needsModification = opts.overrides || opts.uws; + if (needsModification) { await rename(pkgPath, pkgBakPath); // Imports are immutable const _pkg = { - ...pkg, - overrides: { + ...pkg + }; + + // Apply overrides + if (opts.overrides) { + _pkg.overrides = { ...(pkg.overrides ?? {}), ...opts.overrides + }; + } + + // Add uwebsockets-express dependencies when --uws is enabled + if (opts.uws) { + // Use explicit version from overrides if provided, otherwise auto-detect + let uwsExpressVersion = opts.overrides?.['uwebsockets-express']; + + if (!uwsExpressVersion) { + // Determine uwebsockets-express version based on express version + const expressVersion = opts.overrides?.express || pkg.dependencies?.express || ''; + // Handle semver ranges like ^4, ~4, 4.x, 4.21.2, etc. + const isExpress4 = /^[~^]?4|^4\./.test(expressVersion); + uwsExpressVersion = isExpress4 ? '1.3.13' : '2.0.0'; } - }; + + _pkg.dependencies = { + ...(pkg.dependencies ?? {}), + 'uWebSockets.js': 'uNetworking/uWebSockets.js#v20.51.0', + 'uwebsockets-express': uwsExpressVersion + }; + + // Remove uwebsockets-express from overrides to avoid conflict with dependency + if (_pkg.overrides?.['uwebsockets-express']) { + delete _pkg.overrides['uwebsockets-express']; + } + } + await writeFile(pkgPath, JSON.stringify(_pkg, null, 2)); } diff --git a/servers/express-body-parser/index.js b/servers/express-body-parser/index.js index 4cda340..7ae668a 100644 --- a/servers/express-body-parser/index.js +++ b/servers/express-body-parser/index.js @@ -2,7 +2,16 @@ const start = process.hrtime(); const express = require('express'); const expressVersion = require('express/package.json').version; -const app = express(); +let app; +if (process.env.USE_UWS) { + const uWS = require('uWebSockets.js'); + const expressify = require('uwebsockets-express').default; + const uwsApp = uWS.App(); + app = expressify(uwsApp); +} else { + app = express(); +} + app.use(express.json()); app.use(express.urlencoded()); app.use(express.text()); diff --git a/servers/express-extended-query/index.js b/servers/express-extended-query/index.js index b6ab3d0..fa1d554 100644 --- a/servers/express-extended-query/index.js +++ b/servers/express-extended-query/index.js @@ -1,7 +1,16 @@ const start = process.hrtime(); -const express = require('express'); -const app = express(); +let app; +if (process.env.USE_UWS) { + const uWS = require('uWebSockets.js'); + const expressify = require('uwebsockets-express').default; + const uwsApp = uWS.App(); + app = expressify(uwsApp); +} else { + const express = require('express'); + app = express(); +} + app.set('query parser', 'extended'); app.get('*path', (req, res) => { res.status(200).json({ diff --git a/servers/express-helloworld/index.js b/servers/express-helloworld/index.js index 331e810..e948b51 100644 --- a/servers/express-helloworld/index.js +++ b/servers/express-helloworld/index.js @@ -1,8 +1,17 @@ const start = process.hrtime(); -const express = require('express'); const expressVersion = require('express/package.json').version; -const app = express(); +let app; +if (process.env.USE_UWS) { + const uWS = require('uWebSockets.js'); + const expressify = require('uwebsockets-express').default; + const uwsApp = uWS.App(); + app = expressify(uwsApp); +} else { + const express = require('express'); + app = express(); +} + app.get(expressVersion.startsWith('4.') ? '*' : '*path', (req, res) => { res.status(200).json({ hello: 'world!', diff --git a/servers/express-todo/server.js b/servers/express-todo/server.js index 8278ed0..854670d 100644 --- a/servers/express-todo/server.js +++ b/servers/express-todo/server.js @@ -8,9 +8,18 @@ const morgan = require('morgan'); const bodyParser = require('body-parser'); const crypto = require('crypto'); -const app = express(); const PORT = process.env.PORT || 3000; +let app; +if (process.env.USE_UWS) { + const uWS = require('uWebSockets.js'); + const expressify = require('uwebsockets-express').default; + const uwsApp = uWS.App(); + app = expressify(uwsApp); +} else { + app = express(); +} + // Middleware stack app.use(helmet()); app.use(cors()); @@ -423,10 +432,11 @@ app.use((req, res) => { }); // Start server -const server = app.listen(PORT, (err) => { - if (err) { - console.error(`Error starting server: ${err.message}`) - process.exit(1) +app.listen(PORT, (token) => { + // uwebsockets-express passes a token, express passes nothing or an error + if (process.env.USE_UWS && !token) { + console.error(`Error starting server on port ${PORT}`); + process.exit(1); } console.log(`Todo API server listening on port ${PORT}`); console.log(`PID: ${process.pid}`); @@ -434,12 +444,4 @@ const server = app.listen(PORT, (err) => { console.log(`startup: ${process.hrtime(start)}`); }); -// Graceful shutdown -process.on('SIGTERM', () => { - console.log('SIGTERM signal received: closing HTTP server'); - server.close(() => { - console.log('HTTP server closed'); - }); -}); - module.exports = app;