From c8c2610da4110f877e1645198f3f5fea91ed72ee Mon Sep 17 00:00:00 2001 From: Murderlon Date: Tue, 29 Jul 2025 17:04:45 +0200 Subject: [PATCH 1/6] Upgrade srvx --- .changeset/four-mammals-flash.md | 5 +++++ package-lock.json | 10 +++++----- packages/server/package.json | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/four-mammals-flash.md diff --git a/.changeset/four-mammals-flash.md b/.changeset/four-mammals-flash.md new file mode 100644 index 00000000..2f045b63 --- /dev/null +++ b/.changeset/four-mammals-flash.md @@ -0,0 +1,5 @@ +--- +"@tus/server": minor +--- + +Update srvx diff --git a/package-lock.json b/package-lock.json index 2bd36248..7c20dc79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5661,15 +5661,15 @@ "license": "BSD-3-Clause" }, "node_modules/srvx": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.2.8.tgz", - "integrity": "sha512-9HG8eqhHLsvzhW4nJTg/4Sob1Sw/fB6S8Yzvf+iUD6l5CT4D0CXfPcFfh1r2eJFNHC0JOezK+YrgoufA5goYMQ==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.8.2.tgz", + "integrity": "sha512-anC1+7B6tryHQd4lFVSDZIfZ1QwJwqm5h1iveKwC1E40PA8nOD50hEt7+AlUoGc9jW3OdmztWBqf4yHCdCPdRQ==", "license": "MIT", "dependencies": { "cookie-es": "^2.0.0" }, "engines": { - "node": ">=20.11.1" + "node": ">=20.16.0" } }, "node_modules/standard-as-callback": { @@ -6326,7 +6326,7 @@ "debug": "^4.3.4", "lodash.throttle": "^4.1.1", "set-cookie-parser": "^2.7.1", - "srvx": "^0.2.8" + "srvx": "^0.8.2" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/packages/server/package.json b/packages/server/package.json index b9100eed..9301c621 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -25,7 +25,7 @@ "debug": "^4.3.4", "lodash.throttle": "^4.1.1", "set-cookie-parser": "^2.7.1", - "srvx": "^0.2.8" + "srvx": "^0.8.2" }, "devDependencies": { "@types/debug": "^4.1.12", From 414ae23699749ea91c773409b5a4532f36710c79 Mon Sep 17 00:00:00 2001 From: Murderlon Date: Tue, 29 Jul 2025 17:09:22 +0200 Subject: [PATCH 2/6] Fix --- packages/server/src/server.ts | 2 +- packages/server/src/test/Server.test.ts | 1 - packages/server/src/types.ts | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index eaaf2ef4..e13ac388 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -1,7 +1,7 @@ import http from 'node:http' import {EventEmitter} from 'node:events' -import type {ServerRequest} from 'srvx/types' +import type {ServerRequest} from 'srvx' import {toNodeHandler} from 'srvx/node' import debug from 'debug' import {EVENTS, ERRORS, REQUEST_METHODS, TUS_RESUMABLE, HEADERS} from '@tus/utils' diff --git a/packages/server/src/test/Server.test.ts b/packages/server/src/test/Server.test.ts index 4aac0344..32118667 100644 --- a/packages/server/src/test/Server.test.ts +++ b/packages/server/src/test/Server.test.ts @@ -442,7 +442,6 @@ describe('Server', () => { path: '/test/output', datastore: new FileStore({directory}), async onIncomingRequest(req) { - // @ts-expect-error fine if (req?.node?.req?.user?.username === 'admin') { done() } else { diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index 5d6ace18..7a135b67 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -1,4 +1,4 @@ -import type {ServerRequest as Request} from 'srvx/types' +import type {ServerRequest as Request} from 'srvx' import type {Locker, Upload} from '@tus/utils' /** From 59ce000916e756f3348ba13164979e9906a2329b Mon Sep 17 00:00:00 2001 From: Murderlon Date: Tue, 29 Jul 2025 17:24:53 +0200 Subject: [PATCH 3/6] Fix --- packages/server/src/test/Server.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/test/Server.test.ts b/packages/server/src/test/Server.test.ts index 32118667..4aac0344 100644 --- a/packages/server/src/test/Server.test.ts +++ b/packages/server/src/test/Server.test.ts @@ -442,6 +442,7 @@ describe('Server', () => { path: '/test/output', datastore: new FileStore({directory}), async onIncomingRequest(req) { + // @ts-expect-error fine if (req?.node?.req?.user?.username === 'admin') { done() } else { From 011f3b5a0849eba3de7f3d4bb3d94e57d104dbe4 Mon Sep 17 00:00:00 2001 From: Murderlon Date: Wed, 30 Jul 2025 11:46:39 +0200 Subject: [PATCH 4/6] req.node -> req.runtime.node --- package-lock.json | 2 +- packages/server/README.md | 2 +- packages/server/package.json | 2 +- packages/server/src/server.ts | 6 +++--- packages/server/src/test/Server.test.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c20dc79..edd7d736 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6326,7 +6326,7 @@ "debug": "^4.3.4", "lodash.throttle": "^4.1.1", "set-cookie-parser": "^2.7.1", - "srvx": "^0.8.2" + "srvx": "~0.8.2" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/packages/server/README.md b/packages/server/README.md index 714075e6..30399d3f 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -207,7 +207,7 @@ The main server request handler invoked on every request. Use this to integrate into your existing Node.js server. This handler converts `http.IncomingMessage`/`http.ServerResponse` to `Request`/`Response`. -You can still access the Node.js versions via `req.node.req`/`req.node.res` in the hooks. +You can still access the Node.js versions via `req.runtime.node.req`/`req.runtime.node.res` in the hooks. #### `server.handleWeb(req: Request)` diff --git a/packages/server/package.json b/packages/server/package.json index 9301c621..31ae92b3 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -25,7 +25,7 @@ "debug": "^4.3.4", "lodash.throttle": "^4.1.1", "set-cookie-parser": "^2.7.1", - "srvx": "^0.8.2" + "srvx": "~0.8.2" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index e13ac388..ae6e1e49 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -130,7 +130,7 @@ export class Server extends EventEmitter { return this.handler(req) } - private async handler(req: Request) { + private async handler(req: Request | ServerRequest) { const context = this.createContext() const headers = new Headers() @@ -138,8 +138,8 @@ export class Server extends EventEmitter { // We handle gracefully request errors such as disconnects or timeouts. // This is important to avoid memory leaks and ensure that the server can // handle subsequent requests without issues. - if ('node' in req && req.node) { - const nodeReq = (req.node as {req: http.IncomingMessage}).req + if ((req as ServerRequest)?.runtime?.node) { + const nodeReq = (req as ServerRequest).runtime?.node?.req! nodeReq.once('error', () => { context.abort() }) diff --git a/packages/server/src/test/Server.test.ts b/packages/server/src/test/Server.test.ts index 4aac0344..5f9ffa5f 100644 --- a/packages/server/src/test/Server.test.ts +++ b/packages/server/src/test/Server.test.ts @@ -443,7 +443,7 @@ describe('Server', () => { datastore: new FileStore({directory}), async onIncomingRequest(req) { // @ts-expect-error fine - if (req?.node?.req?.user?.username === 'admin') { + if (req?.runtime?.node?.req?.user?.username === 'admin') { done() } else { done(new Error('user data should be preserved in onIncomingRequest')) From 2a4f74ced7e1d9d1ad8889667818804d5f0da645 Mon Sep 17 00:00:00 2001 From: Murderlon Date: Wed, 30 Jul 2025 11:49:00 +0200 Subject: [PATCH 5/6] Lint --- packages/server/src/server.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index ae6e1e49..f57897ec 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -139,6 +139,7 @@ export class Server extends EventEmitter { // This is important to avoid memory leaks and ensure that the server can // handle subsequent requests without issues. if ((req as ServerRequest)?.runtime?.node) { + // biome-ignore lint/style/noNonNullAssertion: it's fine const nodeReq = (req as ServerRequest).runtime?.node?.req! nodeReq.once('error', () => { context.abort() From 2727d1595669c5896a5b2cd78c5ed18c358b8221 Mon Sep 17 00:00:00 2001 From: Murderlon Date: Wed, 30 Jul 2025 12:03:28 +0200 Subject: [PATCH 6/6] backwards compat --- packages/server/src/server.ts | 6 ++++-- packages/server/src/test/Server.test.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index f57897ec..d66dbdbe 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -140,8 +140,10 @@ export class Server extends EventEmitter { // handle subsequent requests without issues. if ((req as ServerRequest)?.runtime?.node) { // biome-ignore lint/style/noNonNullAssertion: it's fine - const nodeReq = (req as ServerRequest).runtime?.node?.req! - nodeReq.once('error', () => { + const node = (req as ServerRequest).runtime?.node! + // @ts-expect-error backwards compatibility. srvx moved req.node to req.runtime.node. + req.node = node + node.req.once('error', () => { context.abort() }) } diff --git a/packages/server/src/test/Server.test.ts b/packages/server/src/test/Server.test.ts index 5f9ffa5f..4aac0344 100644 --- a/packages/server/src/test/Server.test.ts +++ b/packages/server/src/test/Server.test.ts @@ -443,7 +443,7 @@ describe('Server', () => { datastore: new FileStore({directory}), async onIncomingRequest(req) { // @ts-expect-error fine - if (req?.runtime?.node?.req?.user?.username === 'admin') { + if (req?.node?.req?.user?.username === 'admin') { done() } else { done(new Error('user data should be preserved in onIncomingRequest'))