Using @effect/platform HTTP Module with Next.js

Hi. anyone tried to use @effect/platform the http module with nextjs
import {
  HttpApi,
  HttpApiBuilder,
  HttpApiEndpoint,
  HttpApiGroup,
  HttpApp,
} from "@effect/platform";
import { Console, Effect, Layer, Logger, Schema } from "effect";

const Api = HttpApi.make("Api")
  .add(
    HttpApiGroup.make("Greetings").add(
      HttpApiEndpoint.get("/")`/`.addSuccess(Schema.String)
    )
  )
  .pipe((api) => {
    Console.log("Hello, World!", api);
    return api;
  });

const GreetingsLive = HttpApiBuilder.group(Api, "Greetings", (handlers) =>
  handlers.handle("/", () =>
    Effect.gen(function* () {
      yield* Effect.log("Processing GET / request");
      const startTime = Date.now();

      const result = "Hello, World!";

      const duration = Date.now() - startTime;
      yield* Effect.log(`Request completed in ${duration}ms`);

      return result;
    })
  )
);

const ApiLive = HttpApiBuilder.api(Api).pipe(Layer.provideMerge(GreetingsLive));

const ServerLive = HttpApiBuilder.api(Api).pipe(
  Layer.provide(ApiLive),
  Layer.provide(Logger.pretty)
  // Uncomment to add Swagger docs:
  // Layer.provide(
  //   HttpApiSwagger.layer({
  //     path: "/docs",
  //   })
  // )
);

const serverEffect = Layer.launch(ServerLive).pipe(
  Effect.tap(() => Effect.log("🚀 Effect HTTP Server started successfully"))
);

export const server = serverEffect;
export const handler = HttpApp.toWebHandler(serverEffect);


for the nextjs part
import type { NextRequest } from "next/server";
import { handler } from "@packages/backend";
export async function GET(req: NextRequest) {
  console.log("GET /api/[[...path]]");
  return await handler(req);
}
Was this page helpful?