59 lines · 2.1 KB · TypeScript
RawDownload
import type { ServerAuthDescriptor } from "@t3tools/contracts";import * as Context from "effect/Context";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer"; import * as ServerConfig from "../config.ts";import * as ServerEnvironment from "../environment/ServerEnvironment.ts";import { isRemoteReachableHost, resolveSessionCookieName } from "./utils.ts"; export class EnvironmentAuthPolicy extends Context.Service<  EnvironmentAuthPolicy,  {    readonly getDescriptor: () => Effect.Effect<ServerAuthDescriptor>;  }>()("t3/auth/EnvironmentAuthPolicy") {} /** @public Service construction is part of the canonical Effect module API. */export const make = Effect.gen(function* () {  const config = yield* ServerConfig.ServerConfig;  const serverEnvironment = yield* ServerEnvironment.ServerEnvironmentIdentity;  const isRemoteReachable = isRemoteReachableHost(config.host);   const policy =    config.mode === "desktop"      ? isRemoteReachable        ? "remote-reachable"        : "desktop-managed-local"      : isRemoteReachable        ? "remote-reachable"        : "loopback-browser";   const bootstrapMethods: ServerAuthDescriptor["bootstrapMethods"] =    policy === "desktop-managed-local"      ? ["desktop-bootstrap"]      : config.mode === "desktop" && policy === "remote-reachable"        ? ["desktop-bootstrap", "one-time-token"]        : ["one-time-token"];   const descriptor: ServerAuthDescriptor = {    policy,    bootstrapMethods,    sessionMethods: ["browser-session-cookie", "bearer-access-token", "dpop-access-token"],    sessionCookieName: resolveSessionCookieName({      mode: config.mode,      port: config.port,      host: config.host,      instanceKey: config.stateDir,      environmentId: yield* serverEnvironment.getEnvironmentId,      development: config.devUrl !== undefined,    }),  };   return EnvironmentAuthPolicy.of({    getDescriptor: () =>      Effect.succeed(descriptor).pipe(Effect.withSpan("EnvironmentAuthPolicy.getDescriptor")),  });}); export const layer = Layer.effect(EnvironmentAuthPolicy, make);