From ddeca756012c3d4821747ca05ae8b927715c7ac3 Mon Sep 17 00:00:00 2001 From: Kenton Varda Date: Tue, 23 Dec 2025 09:55:11 -0600 Subject: [PATCH] Test proxying an RPC stub all the way to Durable Objects. In particular, the DO keeps a dup() of the stub and uses it later, after the original subscription call has returned. This requires the `rpc_params_dup_stubs` compat flag, which is new in yesterday's workerd release. Since wrangler is not updated yet, this requires a package version override for now. Once wrangler has been updated, I'll remove the override and then merge this. DO NOT MERGE until the override can be removed. Fixes #110. --- __tests__/test-server-workerd.js | 9 +++++ __tests__/workerd.test.ts | 15 +++++++ package-lock.json | 67 ++++++++++++-------------------- package.json | 6 ++- vitest.config.ts | 3 +- 5 files changed, 56 insertions(+), 44 deletions(-) diff --git a/__tests__/test-server-workerd.js b/__tests__/test-server-workerd.js index 13b197a..45ea0a8 100644 --- a/__tests__/test-server-workerd.js +++ b/__tests__/test-server-workerd.js @@ -35,6 +35,15 @@ export class TestDo extends DurableObject { getValue() { return this.value; } + + subscribe(callback) { + this.subscriber = callback.dup(); + } + + async notify(value) { + await this.subscriber(value); + this.subscriber[Symbol.dispose](); + } } export class TestTarget extends RpcTarget { diff --git a/__tests__/workerd.test.ts b/__tests__/workerd.test.ts index c7ed406..79f63e8 100644 --- a/__tests__/workerd.test.ts +++ b/__tests__/workerd.test.ts @@ -230,6 +230,9 @@ interface Env { interface TestDo extends DurableObject { setValue(val: any): void; getValue(): any; + + subscribe(callback: (s: string) => void): void; + notify(value: string): void; } interface WorkerdTestTarget extends TestTarget { @@ -268,6 +271,18 @@ describe("workerd RPC server", () => { expect(await foo.getValue()).toBe(123); expect(await bar.getValue()).toBe("abc"); } + + { + let baz = cap.getDurableObject("baz"); + + let receivedValue: any; + + await baz.subscribe((value: any) => {receivedValue = value}); + + await baz.notify("hello"); + + expect(receivedValue).toBe("hello"); + } }) it("can accept HTTP batch RPC connections", async () => { diff --git a/package-lock.json b/package-lock.json index 32bb757..8396b34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "tsx": "^4.21.0", "typescript": "^5.9.3", "vitest": "^3.2.4", + "workerd": "1.20251223.0", "ws": "^8.18.3" } }, @@ -428,9 +429,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251210.0.tgz", - "integrity": "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251223.0.tgz", + "integrity": "sha512-Mw2jNgqR7Jk5s/nVRQklFi+SjPA0peupOGASr4K3+ehc2WImbQtb+xhT+gVh/UppR1eDQtfd1euJFsiBXH0YpQ==", "cpu": [ "x64" ], @@ -445,9 +446,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251210.0.tgz", - "integrity": "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251223.0.tgz", + "integrity": "sha512-ogRZJacxIFCHObsYe5foxMNE+KhCtAjQPDdfH7qAw1MKYKH1CRzsva6y1wJVj0pFFXCJFsNeAF6z537piJRZkA==", "cpu": [ "arm64" ], @@ -462,9 +463,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251210.0.tgz", - "integrity": "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251223.0.tgz", + "integrity": "sha512-hfIhH/Of2gvPW+9dNLoycv25U8pxyL49GwOPtYrd7yewWihKZhiUmBL+wTfkwRHudJyNiQGwUaFTC9Sh6WN8xw==", "cpu": [ "x64" ], @@ -479,9 +480,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251210.0.tgz", - "integrity": "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251223.0.tgz", + "integrity": "sha512-XACBfsD8ua4CUYrW/kA4kwHQdCz/5RGSYQiXNmNj9YWJ6vBxEjDXqrX7I2B1I2AVljPFAOHP15MxbqhwymKoTQ==", "cpu": [ "arm64" ], @@ -496,9 +497,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251210.0.tgz", - "integrity": "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251223.0.tgz", + "integrity": "sha512-k3vBFOvBlQoXZPpoYxHuww/6vvgGOD/7OVTTHT1WvZ6FC/JdDRagr6k+IP+2OxMRdwW6LTvSPcH3N4PO0k9gQA==", "cpu": [ "x64" ], @@ -517,8 +518,7 @@ "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251216.0.tgz", "integrity": "sha512-qRicJsFEPDUjfL83gQi9aMeBRLsoox4O/VQlY2DrXGUOjI2KS/BZKsv0oqJWdT3EX2SKEGZN8Ml/MHrurGBAUA==", "dev": true, - "license": "MIT OR Apache-2.0", - "peer": true + "license": "MIT OR Apache-2.0" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -1649,7 +1649,6 @@ "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -2227,7 +2226,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -2294,7 +2292,6 @@ "integrity": "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2315,7 +2312,6 @@ "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.6.1", @@ -2409,7 +2405,6 @@ "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", @@ -2425,7 +2420,6 @@ "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", @@ -2977,7 +2971,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -3916,7 +3909,6 @@ "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "playwright-core": "1.56.1" }, @@ -3963,7 +3955,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4686,7 +4677,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -4838,7 +4828,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -4894,7 +4883,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4933,7 +4921,6 @@ "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pathe": "^2.0.3" } @@ -4981,7 +4968,6 @@ "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -5113,7 +5099,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5127,7 +5112,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -5260,13 +5244,12 @@ } }, "node_modules/workerd": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251210.0.tgz", - "integrity": "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw==", + "version": "1.20251223.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251223.0.tgz", + "integrity": "sha512-fgKQPhWsfo84x/Bl87a3DqHPLTgGVmZ4D2YsHqqxgLJaNH83G4uPF7xL4UICtD7f9cG03rmGBvcMg5liyXs23w==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "bin": { "workerd": "bin/workerd" }, @@ -5274,11 +5257,11 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20251210.0", - "@cloudflare/workerd-darwin-arm64": "1.20251210.0", - "@cloudflare/workerd-linux-64": "1.20251210.0", - "@cloudflare/workerd-linux-arm64": "1.20251210.0", - "@cloudflare/workerd-windows-64": "1.20251210.0" + "@cloudflare/workerd-darwin-64": "1.20251223.0", + "@cloudflare/workerd-darwin-arm64": "1.20251223.0", + "@cloudflare/workerd-linux-64": "1.20251223.0", + "@cloudflare/workerd-linux-arm64": "1.20251223.0", + "@cloudflare/workerd-windows-64": "1.20251223.0" } }, "node_modules/wrangler": { diff --git a/package.json b/package.json index 59b0491..8050ab2 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "tsx": "^4.21.0", "typescript": "^5.9.3", "vitest": "^3.2.4", + "workerd": "1.20251223.0", "ws": "^8.18.3" }, "repository": { @@ -55,5 +56,8 @@ "bugs": { "url": "https://github.com/cloudflare/capnweb/issues" }, - "homepage": "https://github.com/cloudflare/capnweb#readme" + "homepage": "https://github.com/cloudflare/capnweb#readme", + "overrides": { + "workerd": "1.20251223.0" + } } diff --git a/vitest.config.ts b/vitest.config.ts index 9a65677..d497d49 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -30,7 +30,7 @@ export default defineConfig({ workers: { miniflare: { compatibilityDate: '2025-07-01', - compatibilityFlags: ["expose_global_message_channel"], + compatibilityFlags: ["expose_global_message_channel", "rpc_params_dup_stubs"], // Define a backend worker to test server-side functionality. The tests will // talk to it over a service binding. (Only the workerd client tests will talk @@ -42,6 +42,7 @@ export default defineConfig({ { name: "test-server-workerd", compatibilityDate: '2025-07-01', + compatibilityFlags: ["rpc_params_dup_stubs"], modules: [ { type: "ESModule",