27 lines · 996 B · TypeScript
RawDownload
import { WsRpcGroup } from "@t3tools/contracts";import { Effect, Layer } from "effect";import { RpcClient, RpcSerialization } from "effect/unstable/rpc";import * as Socket from "effect/unstable/socket/Socket"; import { resolveServerUrl } from "../lib/utils"; export const makeWsRpcProtocolClient = RpcClient.make(WsRpcGroup); type RpcClientFactory = typeof makeWsRpcProtocolClient;export type WsRpcProtocolClient =  RpcClientFactory extends Effect.Effect<infer Client, any, any> ? Client : never; export function createWsRpcProtocolLayer(url?: string) {  const resolvedUrl = resolveServerUrl({    url,    protocol: window.location.protocol === "https:" ? "wss" : "ws",    pathname: "/ws",  });  const socketLayer = Socket.layerWebSocket(resolvedUrl).pipe(    Layer.provide(Socket.layerWebSocketConstructorGlobal),  );   return RpcClient.layerProtocolSocket({ retryTransientErrors: true }).pipe(    Layer.provide(Layer.mergeAll(socketLayer, RpcSerialization.layerJson)),  );}