import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as NodeDns from "node:dns"; import * as NodeOS from "node:os"; export const HostProcessPlatform = Context.Reference( "@t3tools/shared/hostProcess/HostProcessPlatform", { defaultValue: () => process.platform, }, ); export const HostProcessArchitecture = Context.Reference( "@t3tools/shared/hostProcess/HostProcessArchitecture", { defaultValue: () => process.arch, }, ); export const HostProcessHostname = Context.Reference( "@t3tools/shared/hostProcess/HostProcessHostname", { defaultValue: () => NodeOS.hostname(), }, ); export const HostProcessEnvironment = Context.Reference( "@t3tools/shared/hostProcess/HostProcessEnvironment", { defaultValue: () => process.env, }, ); export const HostProcessWorkingDirectory = Context.Reference( "@t3tools/shared/hostProcess/HostProcessWorkingDirectory", { defaultValue: () => process.cwd(), }, ); export const HostProcessExecutablePath = Context.Reference( "@t3tools/shared/hostProcess/HostProcessExecutablePath", { defaultValue: () => process.execPath, }, ); export const HostProcessArguments = Context.Reference>( "@t3tools/shared/hostProcess/HostProcessArguments", { defaultValue: () => process.argv, }, ); /** * Every IP address this machine answers to: the interface addresses, plus * whatever the resolver returns for the machine's own hostname. The latter * matters because a hostname can map to an address no interface carries — * Debian-style hosts put `127.0.1.1` in `/etc/hosts` — and a program that * records "its" address by resolving its hostname (Firefox's profile lock * does) will write that one. "Is this address ours" has to accept both. * * Best effort: a failed lookup just leaves the interface set. */ export const HostProcessAddresses = Context.Reference>>( "@t3tools/shared/hostProcess/HostProcessAddresses", { defaultValue: () => Effect.gen(function* () { const interfaces = Object.values(NodeOS.networkInterfaces()) .flat() .flatMap((entry) => (entry ? [entry.address] : [])); const resolved = yield* Effect.tryPromise(() => NodeDns.promises.lookup(NodeOS.hostname(), { all: true }), ).pipe( Effect.map((entries) => entries.map((entry) => entry.address)), Effect.orElseSucceed(() => [] as ReadonlyArray), ); return new Set([...interfaces, ...resolved]); }), }, ); /** Undefined on platforms without POSIX uids (Windows). */ export const HostProcessUserId = Context.Reference( "@t3tools/shared/hostProcess/HostProcessUserId", { defaultValue: () => process.getuid?.(), }, ); export const isHostWindows = Effect.map(HostProcessPlatform, (platform) => platform === "win32");