Skip to content

Commit b4a4311

Browse files
authored
Use Cap'n Web in workers-sdk (#10724)
* Use Capnpweb in workers-sdk * fix build * Correct spelling of 'Capnpweb' to 'Cap'n Web'
1 parent 55a10a3 commit b4a4311

File tree

14 files changed

+35
-244
lines changed

14 files changed

+35
-244
lines changed

.changeset/odd-trains-hear.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"miniflare": patch
3+
"wrangler": patch
4+
---
5+
6+
Use Cap'n Web in `workers-sdk`

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,3 @@ dist/**
230230
.env*
231231
!.env.example
232232
.node-cache/
233-
!vendor/jsrpc/dist

.prettierignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,3 @@ fixtures/redirected-config-worker/build/*
4949
fixtures/redirected-config-worker-with-environments/build/*
5050

5151
packages/vite-plugin-cloudflare/playground/**/*.d.ts
52-
53-
vendor/jsrpc

packages/miniflare/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
"@ava/typescript": "^4.1.0",
6161
"@cloudflare/cli": "workspace:*",
6262
"@cloudflare/containers-shared": "workspace:*",
63-
"@cloudflare/jsrpc": "link:../../vendor/jsrpc",
6463
"@cloudflare/kv-asset-handler": "workspace:*",
6564
"@cloudflare/workers-shared": "workspace:*",
6665
"@cloudflare/workers-types": "catalog:default",
@@ -80,6 +79,7 @@
8079
"@typescript-eslint/parser": "catalog:default",
8180
"ava": "^6.0.1",
8281
"capnp-es": "^0.0.11",
82+
"capnweb": "^0.1.0",
8383
"chokidar": "^4.0.1",
8484
"concurrently": "^8.2.2",
8585
"devalue": "^5.3.2",

packages/miniflare/src/workers/dispatch-namespace/dispatch-namespace.worker.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { newWebSocketRpcSession } from "@cloudflare/jsrpc";
1+
import { newWebSocketRpcSession } from "capnweb";
22
import { makeFetch } from "../shared/remote-bindings-utils";
33

44
interface Env {
@@ -20,9 +20,14 @@ export default function (env: Env) {
2020
"MF-Dispatch-Namespace-Options",
2121
JSON.stringify({ name, args, options })
2222
);
23-
const stub = newWebSocketRpcSession(url.href);
2423

25-
return new Proxy(stub, {
24+
type ProxiedService = Omit<Service, "connect" | "fetch"> & {
25+
fetch: typeof fetch;
26+
connect: never;
27+
};
28+
const stub = newWebSocketRpcSession<ProxiedService>(url.href);
29+
30+
return new Proxy<ProxiedService>(stub, {
2631
get(_, p) {
2732
// We don't want to wrap direct .fetch() calls on a customer worker in a JSRPC layer
2833
// Instead, intercept accesses to the specific `fetch` key, and send them directly
@@ -42,7 +47,7 @@ export default function (env: Env) {
4247

4348
return Reflect.get(stub, p);
4449
},
45-
}) as Service;
50+
});
4651
},
4752
} satisfies DispatchNamespace;
4853
}

packages/miniflare/src/workers/shared/remote-proxy-client.worker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { newWebSocketRpcSession } from "@cloudflare/jsrpc";
1+
import { newWebSocketRpcSession } from "capnweb";
22
import { WorkerEntrypoint } from "cloudflare:workers";
33
import { makeFetch } from "./remote-bindings-utils";
44

packages/miniflare/src/workers/shared/timers.worker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class Timers {
2727
...args: Args
2828
): TimerHandle {
2929
if (this.#fakeTimestamp === undefined) {
30-
return setTimeout(closure, delay, ...args);
30+
return setTimeout(closure, delay, ...args) as unknown as TimerHandle;
3131
}
3232

3333
const handle = this.#fakeNextTimerHandle++;

packages/miniflare/src/workers/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
"moduleResolution": "bundler",
88
"isolatedModules": true,
99
"noEmit": true,
10-
"types": ["@cloudflare/workers-types/experimental"],
10+
"types": ["@cloudflare/workers-types/experimental", "@types/node"],
1111
"experimentalDecorators": true,
12+
"skipLibCheck": true,
1213
"paths": {
1314
"miniflare:shared": ["./shared/index.worker.ts"],
1415
"miniflare:zod": ["./shared/zod.worker.ts"]

packages/wrangler/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@
8080
"@cloudflare/cli": "workspace:*",
8181
"@cloudflare/containers-shared": "workspace:*",
8282
"@cloudflare/eslint-config-shared": "workspace:*",
83-
"@cloudflare/jsrpc": "link:../../vendor/jsrpc",
8483
"@cloudflare/pages-shared": "workspace:^",
8584
"@cloudflare/types": "6.18.4",
8685
"@cloudflare/workers-shared": "workspace:*",
@@ -108,6 +107,7 @@
108107
"@types/yargs": "^17.0.22",
109108
"@vitest/ui": "catalog:default",
110109
"@webcontainer/env": "^1.1.0",
110+
"capnweb": "^0.1.0",
111111
"chalk": "^5.2.0",
112112
"chokidar": "^4.0.1",
113113
"cli-table3": "^0.6.3",

packages/wrangler/templates/remoteBindings/ProxyServerWorker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { newWorkersRpcResponse } from "@cloudflare/jsrpc";
1+
import { newWorkersRpcResponse } from "capnweb";
22
import { EmailMessage } from "cloudflare:email";
33

44
interface Env extends Record<string, unknown> {}
@@ -11,7 +11,7 @@ class BindingNotFoundError extends Error {
1111

1212
/**
1313
* For most bindings, we expose them as
14-
* - RPC stubs directly to @cloudflare/jsrpc, or
14+
* - RPC stubs directly to capnweb, or
1515
* - HTTP based fetchers
1616
* However, there are some special cases:
1717
* - SendEmail bindings need to take EmailMessage as their first parameter,
@@ -86,7 +86,7 @@ function getExposedFetcher(request: Request, env: Env) {
8686
* This Worker can proxy two types of remote binding:
8787
* 1. "raw" bindings, where this Worker has been configured to pass through the raw
8888
* fetch from a local workerd instance to the relevant binding
89-
* 2. JSRPC bindings, where this Worker uses @cloudflare/jsrpc to proxy RPC
89+
* 2. JSRPC bindings, where this Worker uses capnweb to proxy RPC
9090
* communication in userland. This is always over a WebSocket connection
9191
*/
9292
function isJSRPCBinding(request: Request): boolean {

0 commit comments

Comments
 (0)