1import * as Schema from "effect/Schema";
2import * as Rpc from "effect/rpc/Rpc";
3import * as RpcGroup from "effect/rpc/RpcGroup";
4import * as RpcSchema from "effect/rpc/RpcSchema";
5
6/**
7 * RPCs implemented locally in both the Worker and the Durable Object.
8 *
9 * - `Ping` — unary
10 * - `Count` — streaming response
11 * - `Echo` — array payload (a "stream" of inputs in one HTTP body) that
12 * replays each item back as a streaming response
13 */
14export const InnerRpcs = RpcGroup.make(
15 Rpc.make("Ping", {
16 payload: { message: Schema.String },
17 success: Schema.Struct({ echo: Schema.String, n: Schema.Number }),
18 }),
19 Rpc.make("Count", {
20 payload: { upto: Schema.Number },
21 success: RpcSchema.Stream(Schema.Number, Schema.Never),
22 }),
23 Rpc.make("Echo", {
24 payload: { messages: Schema.Array(Schema.String) },
25 success: RpcSchema.Stream(
26 Schema.Struct({ index: Schema.Number, message: Schema.String }),
27 Schema.Never,
28 ),
29 }),
30);
31
32/**
33 * RPCs exposed only by the Worker. Each handler proxies the corresponding
34 * `InnerRpcs` method through an `RpcClient` whose transport is backed by
35 * `Cloudflare.toHttpClient(rpcDO.getByName(...))`. This exercises the DO
36 * fetch pathway (`DurableObjectBridge.fetch` -> `makeRequestEffect`) via
37 * the typed RPC client, mirroring the `*DO` variants in the HttpApi
38 * fixture.
39 */
40export const DoRpcs = RpcGroup.make(
41 Rpc.make("PingDO", {
42 payload: { message: Schema.String },
43 success: Schema.Struct({ echo: Schema.String, n: Schema.Number }),
44 }),
45 Rpc.make("CountDO", {
46 payload: { upto: Schema.Number },
47 success: RpcSchema.Stream(Schema.Number, Schema.Never),
48 }),
49 Rpc.make("EchoDO", {
50 payload: { messages: Schema.Array(Schema.String) },
51 success: RpcSchema.Stream(
52 Schema.Struct({ index: Schema.Number, message: Schema.String }),
53 Schema.Never,
54 ),
55 }),
56);
57
58export const WorkerRpcs = InnerRpcs.merge(DoRpcs);