import type { AuthBearerBootstrapResult, AuthBootstrapResult, AuthClientMetadata, AuthClientSession, AuthCreatePairingCredentialInput, AuthPairingLink, AuthPairingCredentialResult, AuthSessionId, AuthSessionState, ServerAuthDescriptor, ServerAuthSessionMethod, AuthWebSocketTokenResult, } from "@t3tools/contracts"; import { Data, DateTime, Context } from "effect"; import type { Effect } from "effect"; import type * as HttpServerRequest from "effect/unstable/http/HttpServerRequest"; import type { SessionRole } from "./SessionCredentialService.ts"; export interface AuthenticatedSession { readonly sessionId: AuthSessionId; readonly subject: string; readonly method: ServerAuthSessionMethod; readonly role: SessionRole; readonly expiresAt?: DateTime.DateTime; } export class AuthError extends Data.TaggedError("AuthError")<{ readonly message: string; readonly status?: 400 | 401 | 403 | 500; readonly cause?: unknown; }> {} export interface ServerAuthShape { readonly getDescriptor: () => Effect.Effect; readonly getSessionState: ( request: HttpServerRequest.HttpServerRequest, ) => Effect.Effect; readonly exchangeBootstrapCredential: ( credential: string, requestMetadata: AuthClientMetadata, ) => Effect.Effect< { readonly response: AuthBootstrapResult; readonly sessionToken: string; }, AuthError >; readonly exchangeBootstrapCredentialForBearerSession: ( credential: string, requestMetadata: AuthClientMetadata, ) => Effect.Effect; readonly issuePairingCredential: ( input?: AuthCreatePairingCredentialInput & { readonly role?: SessionRole; }, ) => Effect.Effect; readonly listPairingLinks: () => Effect.Effect, AuthError>; readonly revokePairingLink: (id: string) => Effect.Effect; readonly listClientSessions: ( currentSessionId: AuthSessionId, ) => Effect.Effect, AuthError>; readonly revokeClientSession: ( currentSessionId: AuthSessionId, targetSessionId: AuthSessionId, ) => Effect.Effect; readonly revokeOtherClientSessions: ( currentSessionId: AuthSessionId, ) => Effect.Effect; readonly authenticateHttpRequest: ( request: HttpServerRequest.HttpServerRequest, ) => Effect.Effect; readonly authenticateWebSocketUpgrade: ( request: HttpServerRequest.HttpServerRequest, ) => Effect.Effect; readonly issueWebSocketToken: ( session: AuthenticatedSession, ) => Effect.Effect; readonly issueStartupPairingUrl: (baseUrl: string) => Effect.Effect; } export class ServerAuth extends Context.Service()( "t3/auth/Services/ServerAuth", ) {}