1import * as Schema from "effect/Schema";
2import { Rpc, RpcGroup } from "effect/rpc";
3
4export class Greeting extends Schema.Class<Greeting>("Greeting")({
5 message: Schema.String,
6}) {}
7
8export class Rejected extends Schema.TaggedError<Rejected>()("Rejected", {
9 message: Schema.String,
10}) {}
11
12export const SocketStats = Schema.Struct({
13 boots: Schema.Number,
14 count: Schema.Number,
15 opened: Schema.Array(Schema.String),
16 closed: Schema.Array(Schema.String),
17 invocations: Schema.Record(Schema.String, Schema.Number),
18 cleanupStarted: Schema.Array(Schema.String),
19 cleanupCompleted: Schema.Record(Schema.String, Schema.Number),
20});
21
22export class SocketRpcs extends RpcGroup.make(
23 Rpc.make("greet", { payload: { name: Schema.String }, success: Greeting }),
24 Rpc.make("increment", { success: Schema.Number }),
25 Rpc.make("reject", { success: Schema.Never, error: Rejected }),
26 Rpc.make("numbers", {
27 payload: { count: Schema.Number },
28 success: Schema.Number,
29 stream: true,
30 }),
31 Rpc.make("watch", {
32 payload: { key: Schema.String },
33 success: Schema.Number,
34 stream: true,
35 }),
36 Rpc.make("cleanup", {
37 payload: { key: Schema.String, waitForDisconnect: Schema.Boolean },
38 success: Schema.Number,
39 }),
40 Rpc.make("releaseCleanup", {
41 payload: { key: Schema.String },
42 success: Schema.Boolean,
43 }),
44 Rpc.make("invalidateSocketSerialization", { success: Schema.Number }),
45 Rpc.make("abort", { success: Schema.Void }),
46 Rpc.make("stats", { success: SocketStats }),
47) {}