We start by focusing on the server implementation and ignore the client for now.
We can treat the server as a normal Node.js backend application. We can define services that read from the file system, query databases, make HTTP requests, and more.
For each route we then create a server component that composes the services, executes the final effect, and renders the page.
API service definition
In this example we define a server-only API that makes requests to jsonplaceholder.
We create a new Api.ts
file inside services
. Inside it, we implement the service using Context.Tag
:
import { Context } from "effect";
export class Api extends Context.Tag("Api")<Api, {}>() {}
Api
will contain all the methods that we need to make requests to the jsonplaceholder API:
getPosts
: fetches an array of postsgetPostById
: fetches a single post by id
Before we can implement these methods, we first define a HttpClient
that will be used to make requests to the API.
Let's do this next.