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