diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d98f4c8ba..0e22bf5c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,6 +182,9 @@ importers: http-errors: specifier: ^2.0.0 version: 2.0.0 + hyper-express: + specifier: ^6.16.4 + version: 6.16.4 jose: specifier: ^5.6.3 version: 5.6.3 @@ -218,9 +221,6 @@ importers: mime-types: specifier: ^2.1.35 version: 2.1.35 - nanoexpress: - specifier: ^6.4.4 - version: 6.4.4 oidc-provider: specifier: ^8.5.1 version: 8.5.1 @@ -552,12 +552,6 @@ packages: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} - '@dalisoft/args@0.1.1': - resolution: {integrity: sha512-PwmLEhnTyK6+AUwD0oqS57nLs1vpB17vEDlMc1i27zH8mrtFJmBmYfQv4FszoUHDHv3PtFk8M0X9yWxry2TSwA==} - - '@dalisoft/events@0.2.0': - resolution: {integrity: sha512-2NS/0vS9eL8ZxhgCVZQgPS4uoqbcSk9FN3G8Eqakcej7wOpH72z1kmDEDGI5T+MOp9IueKT2qI0XUdXhKeK9GA==} - '@docsearch/css@3.6.0': resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} @@ -2045,6 +2039,10 @@ packages: builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2164,6 +2162,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + cookie@0.4.1: resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} engines: {node: '>= 0.6'} @@ -2655,9 +2657,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2671,9 +2670,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-query-parse@3.0.0: - resolution: {integrity: sha512-u4vMOOKVZalfh0JygVJQLE1POZrgdKtptmNHt6CVRCVSClNIP7T1yjI/EyT+YlVJTb1PsnVWKMjDzbsTRtPm6Q==} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -3000,6 +2996,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + hyper-express@6.16.4: + resolution: {integrity: sha512-mf42sJw+DW354iaoSre4WO5Z/IBaM6WSkJzanGt+Pag1nh1sb9MI9I/4LQK0K1avhqxjpegKujAHIhlAxuVauA==} + i18next-browser-languagedetector@8.0.0: resolution: {integrity: sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==} @@ -3520,10 +3519,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoexpress@6.4.4: - resolution: {integrity: sha512-yyGHOl9koJf7C/a6Ojs6boKaZyrTneCG76vL+/SqDC1uRn9f/h6LL84PbVT22rX1SVQ5NB8v7mfoRrjbUPWpyQ==} - engines: {node: '>=18.20.4'} - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3970,6 +3965,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -4129,6 +4127,10 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4320,14 +4322,17 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typed-emitter@2.1.0: + resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} + typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/6f4b450fc642abba540535f0755c990b42a16026: - resolution: {tarball: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/6f4b450fc642abba540535f0755c990b42a16026} - version: 20.47.0 + uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/8fa05571bf6ea95be8966ad313d9d39453e381ae: + resolution: {tarball: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/8fa05571bf6ea95be8966ad313d9d39453e381ae} + version: 20.44.0 ueberdb2@4.2.93: resolution: {integrity: sha512-inWXazVuEJc33aRBm6kCT8/ymgSvHcXbakKf4nxVf8Wp86Le0cQd3URn3cCUhxRV05qP14kDdvAQho9LUiXWwg==} @@ -4950,12 +4955,6 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@dalisoft/args@0.1.1': {} - - '@dalisoft/events@0.2.0': - dependencies: - '@dalisoft/args': 0.1.1 - '@docsearch/css@3.6.0': {} '@docsearch/js@3.6.0(@algolia/client-search@4.23.3)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -6381,6 +6380,10 @@ snapshots: dependencies: semver: 7.6.3 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytes@3.1.2: {} cac@6.7.14: {} @@ -6502,6 +6505,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie-signature@1.2.1: {} + cookie@0.4.1: {} cookie@0.4.2: {} @@ -7166,8 +7171,6 @@ snapshots: extend@3.0.2: {} - fast-decode-uri-component@1.0.1: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -7182,10 +7185,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-query-parse@3.0.0: - dependencies: - fast-decode-uri-component: 1.0.1 - fast-safe-stringify@2.1.1: {} fast-uri@3.0.1: {} @@ -7590,6 +7589,18 @@ snapshots: human-signals@5.0.0: {} + hyper-express@6.16.4: + dependencies: + accepts: 1.3.8 + busboy: 1.6.0 + cookie: 0.4.2 + cookie-signature: 1.2.1 + mime-types: 2.1.35 + range-parser: 1.2.1 + type-is: 1.6.18 + typed-emitter: 2.1.0 + uWebSockets.js: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/8fa05571bf6ea95be8966ad313d9d39453e381ae + i18next-browser-languagedetector@8.0.0: dependencies: '@babel/runtime': 7.24.7 @@ -8137,14 +8148,6 @@ snapshots: ms@2.1.3: {} - nanoexpress@6.4.4: - dependencies: - '@dalisoft/events': 0.2.0 - ajv: 8.17.1 - cookie: 0.6.0 - fast-query-parse: 3.0.0 - uWebSockets.js: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/6f4b450fc642abba540535f0755c990b42a16026 - nanoid@3.3.7: {} nanoid@5.0.7: {} @@ -8614,6 +8617,11 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + optional: true + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -8821,6 +8829,8 @@ snapshots: transitivePeerDependencies: - supports-color + streamsearch@1.1.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -9050,9 +9060,13 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typed-emitter@2.1.0: + optionalDependencies: + rxjs: 7.8.1 + typescript@5.5.4: {} - uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/6f4b450fc642abba540535f0755c990b42a16026: {} + uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/8fa05571bf6ea95be8966ad313d9d39453e381ae: {} ueberdb2@4.2.93: {} diff --git a/src/node/hooks/express.ts b/src/node/hooks/express.ts index 9a714e17f..8715fc151 100644 --- a/src/node/hooks/express.ts +++ b/src/node/hooks/express.ts @@ -18,7 +18,7 @@ const settings = require('../utils/Settings'); const stats = require('../stats') import util from 'util'; const webaccess = require('./express/webaccess'); -import nanoexpress from 'nanoexpress'; +import HyperExpress from 'hyper-express'; import SecretRotator from '../security/SecretRotator'; @@ -101,7 +101,7 @@ exports.createServer = async () => { exports.restartServer = async () => { await closeServer(); - const app = nanoexpress(); // New syntax for express v3 + const app = new HyperExpress.Server(); // New syntax for express v3 if (settings.ssl) { console.log('SSL -- enabled'); @@ -252,7 +252,10 @@ exports.restartServer = async () => { socketsEvents.emit('updated'); }); }); - await util.promisify(exports.server.listen).bind(exports.server)(settings.port, settings.ip); + app.listen(settings.port, settings.ip, ()=>{ + console.log("running") + }) + //await util.promisify(exports.server.listen).bind(exports.server)(settings.port, settings.ip); startTime.setValue(Date.now()); logger.info('HTTP server listening for connections'); }; diff --git a/src/node/hooks/express/errorhandling.ts b/src/node/hooks/express/errorhandling.ts index 2de819b0e..cb2059492 100644 --- a/src/node/hooks/express/errorhandling.ts +++ b/src/node/hooks/express/errorhandling.ts @@ -9,14 +9,14 @@ exports.expressCreateServer = (hook_name:string, args: ArgsExpressType, cb:Funct exports.app = args.app; // Handle errors - args.app.use((err:ErrorCaused, req:any, res:any, next:Function) => { + /*args.app.use((req:any, res:any, next:Function) => { // if an error occurs Connect will pass it down // through these "error-handling" middleware // allowing you to respond however you like res.status(500).send({error: 'Sorry, something bad happened!'}); console.error(err.stack ? err.stack : err.toString()); stats.meter('http500').mark(); - }); + });*/ return cb(); }; diff --git a/src/node/hooks/express/importexport.ts b/src/node/hooks/express/importexport.ts index 898606e49..e8f4f6b0b 100644 --- a/src/node/hooks/express/importexport.ts +++ b/src/node/hooks/express/importexport.ts @@ -25,7 +25,7 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio }); // handle export requests - args.app.use('/p/:pad/:rev?/export/:type', limiter); + args.app.use('/p/pad/rev/export/type', limiter); args.app.get('/p/:pad/:rev?/export/:type', (req:any, res:any, next:Function) => { (async () => { const types = ['pdf', 'doc', 'txt', 'html', 'odt', 'etherpad']; @@ -71,7 +71,7 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio }); // handle import requests - args.app.use('/p/:pad/import', limiter); + args.app.use('/p/pad/import', limiter); args.app.post('/p/:pad/import', (req:any, res:any, next:Function) => { (async () => { // @ts-ignore diff --git a/src/node/hooks/express/specialpages.ts b/src/node/hooks/express/specialpages.ts index 9e4642ca8..275d7695a 100644 --- a/src/node/hooks/express/specialpages.ts +++ b/src/node/hooks/express/specialpages.ts @@ -121,14 +121,10 @@ const handleLiveReload = async (args: any, padString: string, timeSliderString: }; args.app.use((req: any, res: any, next: Function) => { if (req.path.startsWith('/p/') && req.path.split('/').length == 3) { - req.params = { - pad: req.path.split('/')[2] - } + req.padId = req.path.split('/')[2] routeHandlers['/p/:pad'](req, res); } else if (req.path.startsWith('/p/') && req.path.split('/').length == 4) { - req.params = { - pad: req.path.split('/')[2] - } + req.padId = req.path.split('/')[2] routeHandlers['/p/:pad/timeslider'](req, res); } else if (req.path == "/"){ routeHandlers['/'](req, res); @@ -163,7 +159,7 @@ const handleLiveReload = async (args: any, padString: string, timeSliderString: setRouteHandler("/p/:pad", (req: any, res: any, next: Function) => { // The below might break for pads being rewritten - const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + const isReadOnly = !webaccess.userCanModify(req.padId, req); hooks.callAll('padInitToolbar', { toolbar, @@ -192,7 +188,7 @@ const handleLiveReload = async (args: any, padString: string, timeSliderString: setRouteHandler("/p/:pad/timeslider", (req: any, res: any, next: Function) => { console.log("Reloading pad") // The below might break for pads being rewritten - const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + const isReadOnly = !webaccess.userCanModify(req.padId, req); hooks.callAll('padInitToolbar', { toolbar, @@ -331,7 +327,7 @@ exports.expressCreateServer = async (hookName: string, args: any, cb: Function) // serve pad.html under /p args.app.get('/p/:pad', (req: any, res: any, next: Function) => { // The below might break for pads being rewritten - const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + const isReadOnly = !webaccess.userCanModify(req.padId, req); hooks.callAll('padInitToolbar', { toolbar, diff --git a/src/node/hooks/express/static.ts b/src/node/hooks/express/static.ts index 3cb8caa8d..03c421ea9 100644 --- a/src/node/hooks/express/static.ts +++ b/src/node/hooks/express/static.ts @@ -34,7 +34,7 @@ exports.expressPreSession = async (hookName:string, {app}:any) => { // Minify will serve static files compressed (minify enabled). It also has // file-specific hacks for ace/require-kernel/etc. - app.get('/static/:filename(*)', minify); + app.use('/static', minify); // serve plugin definitions // not very static, but served here so that client can do diff --git a/src/node/utils/Minify.ts b/src/node/utils/Minify.ts index 9660c9098..37c7e226f 100644 --- a/src/node/utils/Minify.ts +++ b/src/node/utils/Minify.ts @@ -146,7 +146,8 @@ const compatPaths = { * @param res the Express response */ const _minify = async (req:any, res:any) => { - let filename = req.params.filename; + + let filename = req.path.split('/static/')[1] try { filename = sanitizePathname(filename); } catch (err) { @@ -211,23 +212,26 @@ const _minify = async (req:any, res:any) => { } if (!exists) { - res.writeHead(404, {}); + res.status(404) + //res.writeHead(404, {}); res.end(); } else if (new Date(req.headers['if-modified-since']) >= date) { - res.writeHead(304, {}); + res.status(304) res.end(); } else if (req.method === 'HEAD') { res.header('Content-Type', contentType); - res.writeHead(200, {}); + res.status(200) res.end(); } else if (req.method === 'GET') { const content = await getFileCompressed(filename, contentType as string); res.header('Content-Type', contentType); - res.writeHead(200, {}); + res.status(200) + //res.writeHead(200, {}); res.write(content); res.end(); } else { - res.writeHead(405, {allow: 'HEAD, GET'}); + //res.writeHead(405, {allow: 'HEAD, GET'}); + res.status(405) res.end(); } }; diff --git a/src/package.json b/src/package.json index 8d8717246..726c17b09 100644 --- a/src/package.json +++ b/src/package.json @@ -56,7 +56,7 @@ "lru-cache": "^11.0.0", "measured-core": "^2.0.0", "mime-types": "^2.1.35", - "nanoexpress": "^6.4.4", + "hyper-express": "^6.16.4", "oidc-provider": "^8.5.1", "openapi-backend": "^5.10.6", "proxy-addr": "^2.0.7",