decode error which should be caught at compile time
schema.ts
server.ts
client.ts
output
no type errors anywhere
I feel like I would expect the rpc function not returning void to type error if it fails schema parsing at runtime
import * as S from "@effect/schema/Schema";
export class Test extends S.TaggedRequest<Test>()(
"Test",
S.Never,
S.Void,
{}
) {}import * as S from "@effect/schema/Schema";
export class Test extends S.TaggedRequest<Test>()(
"Test",
S.Never,
S.Void,
{}
) {}server.ts
import { Rpc, Router } from "@effect/rpc";
import { HttpRouter as RpcHttpRouter } from "@effect/rpc-http";
import { Effect, Layer } from "effect";
import { HttpMiddleware, HttpRouter, HttpServer } from "@effect/platform";
import { BunHttpServer, BunRuntime } from "@effect/platform-bun";
import { Test } from "./schema";
const router = Router.make(
Rpc.effect(Test, () =>
Effect.gen(function* () {
return 42;
})
)
);
export type Router = typeof router;
const HttpLive = HttpRouter.empty.pipe(
HttpRouter.post("/rpc", RpcHttpRouter.toHttpApp(router)),
HttpServer.serve(HttpMiddleware.logger),
HttpServer.withLogAddress,
Layer.provide(BunHttpServer.layer({ port: 3002 }))
);
Layer.launch(HttpLive).pipe(BunRuntime.runMain);import { Rpc, Router } from "@effect/rpc";
import { HttpRouter as RpcHttpRouter } from "@effect/rpc-http";
import { Effect, Layer } from "effect";
import { HttpMiddleware, HttpRouter, HttpServer } from "@effect/platform";
import { BunHttpServer, BunRuntime } from "@effect/platform-bun";
import { Test } from "./schema";
const router = Router.make(
Rpc.effect(Test, () =>
Effect.gen(function* () {
return 42;
})
)
);
export type Router = typeof router;
const HttpLive = HttpRouter.empty.pipe(
HttpRouter.post("/rpc", RpcHttpRouter.toHttpApp(router)),
HttpServer.serve(HttpMiddleware.logger),
HttpServer.withLogAddress,
Layer.provide(BunHttpServer.layer({ port: 3002 }))
);
Layer.launch(HttpLive).pipe(BunRuntime.runMain);client.ts
import { HttpClient, HttpClientRequest } from "@effect/platform";
import { Resolver } from "@effect/rpc";
import { HttpResolver } from "@effect/rpc-http";
import type { Router } from "./server";
import { Test } from "./schema";
import { Effect } from "effect";
export const rpc = HttpResolver.make<Router>(
HttpClient.fetchOk.pipe(
HttpClient.mapRequest(
HttpClientRequest.prependUrl("http://localhost:3002/rpc")
)
)
).pipe(Resolver.toClient);
const main = Effect.gen(function* () {
yield* rpc(new Test({}));
});
await Effect.runPromise(main);import { HttpClient, HttpClientRequest } from "@effect/platform";
import { Resolver } from "@effect/rpc";
import { HttpResolver } from "@effect/rpc-http";
import type { Router } from "./server";
import { Test } from "./schema";
import { Effect } from "effect";
export const rpc = HttpResolver.make<Router>(
HttpClient.fetchOk.pipe(
HttpClient.mapRequest(
HttpClientRequest.prependUrl("http://localhost:3002/rpc")
)
)
).pipe(Resolver.toClient);
const main = Effect.gen(function* () {
yield* rpc(new Test({}));
});
await Effect.runPromise(main);output
(FiberFailure) ParseError: (ExitEncoded<void, never> <-> Exit<void, never>)
└─ Type side transformation failure
└─ Exit<void, never>
└─ Expected void, actual 42(FiberFailure) ParseError: (ExitEncoded<void, never> <-> Exit<void, never>)
└─ Type side transformation failure
└─ Exit<void, never>
└─ Expected void, actual 42no type errors anywhere
I feel like I would expect the rpc function not returning void to type error if it fails schema parsing at runtime
