92 lines · 2.7 KB · TypeScript
RawDownload
import { EnvironmentId, type ExecutionEnvironmentDescriptor } from "@t3tools/contracts";import { Effect, FileSystem, Layer, Path, Random } from "effect"; import { ServerConfig } from "../../config.ts";import { ServerEnvironment, type ServerEnvironmentShape } from "../Services/ServerEnvironment.ts";import packageJson from "../../../package.json" with { type: "json" };import { resolveServerEnvironmentLabel } from "./ServerEnvironmentLabel.ts"; function platformOs(): ExecutionEnvironmentDescriptor["platform"]["os"] {  switch (process.platform) {    case "darwin":      return "darwin";    case "linux":      return "linux";    case "win32":      return "windows";    default:      return "unknown";  }} function platformArch(): ExecutionEnvironmentDescriptor["platform"]["arch"] {  switch (process.arch) {    case "arm64":      return "arm64";    case "x64":      return "x64";    default:      return "other";  }} export const makeServerEnvironment = Effect.fn("makeServerEnvironment")(function* () {  const fileSystem = yield* FileSystem.FileSystem;  const path = yield* Path.Path;  const serverConfig = yield* ServerConfig;   const readPersistedEnvironmentId = Effect.gen(function* () {    const exists = yield* fileSystem      .exists(serverConfig.environmentIdPath)      .pipe(Effect.orElseSucceed(() => false));    if (!exists) {      return null;    }     const raw = yield* fileSystem      .readFileString(serverConfig.environmentIdPath)      .pipe(Effect.map((value) => value.trim()));     return raw.length > 0 ? raw : null;  });   const persistEnvironmentId = (value: string) =>    fileSystem.writeFileString(serverConfig.environmentIdPath, `${value}\n`);   const environmentIdRaw = yield* Effect.gen(function* () {    const persisted = yield* readPersistedEnvironmentId;    if (persisted) {      return persisted;    }     const generated = yield* Random.nextUUIDv4;    yield* persistEnvironmentId(generated);    return generated;  });   const environmentId = EnvironmentId.make(environmentIdRaw);  const cwdBaseName = path.basename(serverConfig.cwd).trim();  const label = yield* resolveServerEnvironmentLabel({    cwdBaseName,  });   const descriptor: ExecutionEnvironmentDescriptor = {    environmentId,    label,    platform: {      os: platformOs(),      arch: platformArch(),    },    serverVersion: packageJson.version,    capabilities: {      repositoryIdentity: true,    },  };   return {    getEnvironmentId: Effect.succeed(environmentId),    getDescriptor: Effect.succeed(descriptor),  } satisfies ServerEnvironmentShape;}); export const ServerEnvironmentLive = Layer.effect(ServerEnvironment, makeServerEnvironment());