Using @effect/platform HTTP Module with Next.js
Hi. anyone tried to use @effect/platform the http module with nextjs
for the nextjs part
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);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);
}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);
}