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());
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());