1import * as RpcWebSocketClient from "alchemy/Cloudflare/RpcWebSocketClient";
2import * as Context from "effect/Context";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5import * as RpcClient from "effect/rpc/RpcClient";
6import * as Socket from "effect/socket/Socket";
7import { BrowserRpcs } from "./rpcs.ts";
8
9export class BrowserClient extends Context.Service<BrowserClient>()(
10 "RpcWebSocketBrowserClient",
11 { make: RpcClient.make(BrowserRpcs) },
12) {}
13
14export const clientLayer = RpcWebSocketClient.layer(
15 BrowserClient,
16 BrowserRpcs,
17 "wss://example.com/rpc",
18).pipe(Layer.provide(Socket.layerWebSocketConstructorGlobal));
19
20export const echo = (value: string) =>
21 Effect.gen(function* () {
22 const client = yield* BrowserClient;
23 return yield* client.echo({ value });
24 }).pipe(Effect.provide(clientLayer));