导出 connect() handler,让 Worker 接受入站 TCP 连接,并在其上读写原始字节。该 handler 接收 Socket 对象,类型与出站连接中 cloudflare:sockets 的 connect() 返回的类型相同。
当另一个 Worker 通过 service binding 将 TCP 连接转发过来、并在该绑定上调用 connect() 时,Worker 会在其 connect() handler 中收到该连接:
// Worker A forwards a TCP connection to Worker B over a service binding
export default {
async fetch(request, env) {
const socket = env.BACKEND.connect("example.com:1234");
// Read from and write to socket.readable / socket.writable
return new Response(socket.readable);
},
};export default {
async connect(socket, env, ctx) {
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("hello"));
await writer.close();
},
};interface Env {}
export default {
async connect(socket: Socket, env: Env, ctx: ExecutionContext) {
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("hello"));
await writer.close();
},
} satisfies ExportedHandler<Env>;你也可以将 connect() 实现为 WorkerEntrypoint 类上的方法,这样单个 Worker 可以在暴露其他 RPC 方法的同时暴露 connect() handler:
import { WorkerEntrypoint } from "cloudflare:workers";
export class Backend extends WorkerEntrypoint {
async connect(socket) {
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("hello"));
await writer.close();
}
}socketSocket- 用于在连接上读写原始字节的入站
Socket。 socket.opened会解析为SocketInfo对象。在connect()handler 中,localAddress会被设置为调用方在 service binding 上调用connect()时传入的地址。
- 用于在连接上读写原始字节的入站
envobject- Worker 可用的绑定(binding)。
ctxobject- 与 Worker 关联的上下文,包含
waitUntil()和passThroughOnException()。
- 与 Worker 关联的上下文,包含
未导出 connect() handler 的 Worker 会拒绝任何转发到它的连接。
- TCP sockets — 创建出站 TCP 连接并使用
SocketAPI。 - Service bindings — 从一个 Worker 调用另一个 Worker,包括使用
connect()转发 TCP 连接。