1import * as Hetzner from "alchemy/Hetzner";
2import { ServerHost } from "alchemy/Server";
3import * as Effect from "effect/Effect";
4import * as FileSystem from "effect/FileSystem";
5import { Box, Data, MARKER, MARKER_FILE, VOLUME_PATH } from "./shared.ts";
6
7/**
8 * Background Service: mounts the shared Volume and writes a marker file
9 * that {@link Api} reads over HTTP.
10 */
11export default class Worker extends Hetzner.Service<Worker>()(
12 "Worker",
13 {
14 server: Box,
15 main: import.meta.url,
16 },
17 Effect.gen(function* () {
18 const volume = yield* Data;
19 const mount = yield* Hetzner.MountVolume(volume, { path: VOLUME_PATH });
20 const host = yield* ServerHost;
21
22 yield* host.run(
23 Effect.gen(function* () {
24 const fs = yield* FileSystem.FileSystem;
25 yield* fs.makeDirectory(mount.path, { recursive: true });
26 yield* fs.writeFileString(MARKER_FILE, MARKER);
27 return yield* Effect.never;
28 }).pipe(Effect.orDie),
29 );
30 }).pipe(Effect.provide(Hetzner.MountVolumeLive)),
31) {}