92 lines · 2.9 KB · TypeScript
RawDownload
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<NodeJS.Platform>(  "@t3tools/shared/hostProcess/HostProcessPlatform",  {    defaultValue: () => process.platform,  },); export const HostProcessArchitecture = Context.Reference<NodeJS.Architecture>(  "@t3tools/shared/hostProcess/HostProcessArchitecture",  {    defaultValue: () => process.arch,  },); export const HostProcessHostname = Context.Reference<string>(  "@t3tools/shared/hostProcess/HostProcessHostname",  {    defaultValue: () => NodeOS.hostname(),  },); export const HostProcessEnvironment = Context.Reference<NodeJS.ProcessEnv>(  "@t3tools/shared/hostProcess/HostProcessEnvironment",  {    defaultValue: () => process.env,  },); export const HostProcessWorkingDirectory = Context.Reference<string>(  "@t3tools/shared/hostProcess/HostProcessWorkingDirectory",  {    defaultValue: () => process.cwd(),  },); export const HostProcessExecutablePath = Context.Reference<string>(  "@t3tools/shared/hostProcess/HostProcessExecutablePath",  {    defaultValue: () => process.execPath,  },); export const HostProcessArguments = Context.Reference<ReadonlyArray<string>>(  "@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<Effect.Effect<ReadonlySet<string>>>(  "@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<string>),        );        return new Set([...interfaces, ...resolved]);      }),  },); /** Undefined on platforms without POSIX uids (Windows). */export const HostProcessUserId = Context.Reference<number | undefined>(  "@t3tools/shared/hostProcess/HostProcessUserId",  {    defaultValue: () => process.getuid?.(),  },); export const isHostWindows = Effect.map(HostProcessPlatform, (platform) => platform === "win32");