import type { App } from "h3";
import { createServer } from "node:http";
import { Context, Effect, Layer } from "effect";
import { createApp, createRouter, defineEventHandler, toNodeListener } from "h3";
import { AppConfig } from "./lib/configs/app.config.js";
// H3
export class AppService extends Context.Tag("AppService")<AppService, App>() {
static readonly Live = Layer.sync(AppService, () => createApp());
}
const makeRouterService = ... app.use(router), return router see https://h3.unjs.io/guide/router
export class RouterService extends ... {
static readonly Live = ...
Layer.provide(AppService.Live)
);
}
// Server
export const ServerStart = Effect.gen(function* () {
const app = yield* AppService;
const appConfig = yield* AppConfig;
yield* Effect.acquireRelease(
Effect.sync(() => {
const server = createServer(toNodeListener(app));
server.listen(appConfig.port, () => {
console.log(`Server listening on port ${appConfig.port}...`);
});
return server;
}),
(server) => // server.close
);
});
export const ServerLive = Layer.scopedDiscard(ServerStart).pipe(Layer.provide(AppService.Live));
// Routes
export const IndexRoute = Layer.scopedDiscard(
Effect.gen(function* () {
const router = yield* RouterService;
router.get(
"/",
defineEventHandler(() => "h3 + EffectTS!")
);
})
).pipe(Layer.provide(RouterService.Live));
const PostRoute = ...
const AppRoutes = Layer.mergeAll(IndexRoute, PostRoute);
// Used to validate envs at startup
const make = Effect.all([AppConfig]);
export class ConfigService ...
export const AppLive = Layer.provide(ServerLive, Layer.mergeAll(AppRoutes, ConfigService.Live));
Effect.runFork(Layer.launch(AppLive));
import type { App } from "h3";
import { createServer } from "node:http";
import { Context, Effect, Layer } from "effect";
import { createApp, createRouter, defineEventHandler, toNodeListener } from "h3";
import { AppConfig } from "./lib/configs/app.config.js";
// H3
export class AppService extends Context.Tag("AppService")<AppService, App>() {
static readonly Live = Layer.sync(AppService, () => createApp());
}
const makeRouterService = ... app.use(router), return router see https://h3.unjs.io/guide/router
export class RouterService extends ... {
static readonly Live = ...
Layer.provide(AppService.Live)
);
}
// Server
export const ServerStart = Effect.gen(function* () {
const app = yield* AppService;
const appConfig = yield* AppConfig;
yield* Effect.acquireRelease(
Effect.sync(() => {
const server = createServer(toNodeListener(app));
server.listen(appConfig.port, () => {
console.log(`Server listening on port ${appConfig.port}...`);
});
return server;
}),
(server) => // server.close
);
});
export const ServerLive = Layer.scopedDiscard(ServerStart).pipe(Layer.provide(AppService.Live));
// Routes
export const IndexRoute = Layer.scopedDiscard(
Effect.gen(function* () {
const router = yield* RouterService;
router.get(
"/",
defineEventHandler(() => "h3 + EffectTS!")
);
})
).pipe(Layer.provide(RouterService.Live));
const PostRoute = ...
const AppRoutes = Layer.mergeAll(IndexRoute, PostRoute);
// Used to validate envs at startup
const make = Effect.all([AppConfig]);
export class ConfigService ...
export const AppLive = Layer.provide(ServerLive, Layer.mergeAll(AppRoutes, ConfigService.Live));
Effect.runFork(Layer.launch(AppLive));