UNPKG

@re-auth/http-adapters

Version:

HTTP protocol adapters for ReAuth - framework-agnostic integration with Express, Fastify, and Hono

1 lines 9.98 kB
{"version":3,"sources":["../src/types.ts"],"names":[],"mappings":";;;AAoSO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YACE,OAAA,EACO,UAAA,GAAqB,GAAA,EACrB,IAAA,GAAe,kBACf,OAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,gBAAA,CAAiB;AAAA,EACpD,WAAA,CAAY,SAAiB,OAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,kBAAA,EAAoB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAAiB;AAAA,EACxD,WAAA,CAAY,SAAiB,OAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,sBAAA,EAAwB,OAAO,CAAA;AACnD,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,gBAAA,CAAiB;AAAA,EACvD,WAAA,CAAY,SAAiB,OAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAuB,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,gBAAA,CAAiB;AAAA,EAClD,WAAA,CAAY,SAAiB,OAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,WAAA,EAAa,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,gBAAA,CAAiB;AAAA,EACnD,WAAA,CAAY,SAAiB,OAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,qBAAA,EAAuB,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF","file":"types.cjs","sourcesContent":["import { AuthOutput, ReAuthEngine, Token } from '@re-auth/reauth';\nimport { ReAuthJWTPayload } from '@re-auth/reauth/services';\nimport { CookiePrefixOptions } from 'hono/utils/cookie';\n\n// Base HTTP adapter configuration\nexport interface HttpAdapterConfig {\n engine: ReAuthEngine;\n basePath?: string;\n cors?: CorsConfig;\n rateLimit?: RateLimitConfig;\n security?: SecurityConfig;\n validation?: ValidationConfig;\n cookie?: {\n name: string;\n refreshTokenName?: string;\n options: {\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'lax' | 'strict' | 'none';\n path?: string;\n domain?: string;\n maxAge?: number; // in seconds\n expires?: Date;\n partitioned?: boolean;\n prefix?: CookiePrefixOptions;\n priority?: 'low' | 'medium' | 'high';\n };\n refreshOptions?: {\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'lax' | 'strict' | 'none';\n path?: string;\n domain?: string;\n maxAge?: number; // in seconds\n expires?: Date;\n partitioned?: boolean;\n prefix?: CookiePrefixOptions;\n priority?: 'low' | 'medium' | 'high';\n };\n };\n headerToken?: {\n accesssTokenHeader: string;\n refreshTokenHeader?: string;\n };\n}\n\n// CORS configuration\nexport interface CorsConfig {\n origin?:\n | string\n | string[]\n | boolean\n | ((\n origin: string | undefined,\n callback: (err: Error | null, allow?: boolean) => void,\n ) => void);\n credentials?: boolean;\n allowedHeaders?: string[];\n exposedHeaders?: string[];\n methods?: string[];\n preflightContinue?: boolean;\n optionsSuccessStatus?: number;\n}\n\n// Rate limiting configuration\nexport interface RateLimitConfig {\n windowMs?: number;\n max?: number;\n message?: string;\n standardHeaders?: boolean;\n legacyHeaders?: boolean;\n skipSuccessfulRequests?: boolean;\n skipFailedRequests?: boolean;\n keyGenerator?: (request: any) => string;\n}\n\n// Security configuration\nexport interface SecurityConfig {\n helmet?: boolean | HelmetConfig;\n csrf?: boolean | CsrfConfig;\n sanitizeInput?: boolean;\n sanitizeOutput?: boolean;\n}\n\nexport interface HelmetConfig {\n contentSecurityPolicy?: boolean | object;\n crossOriginEmbedderPolicy?: boolean;\n crossOriginOpenerPolicy?: boolean;\n crossOriginResourcePolicy?: boolean;\n dnsPrefetchControl?: boolean;\n frameguard?: boolean | object;\n hidePoweredBy?: boolean;\n hsts?: boolean | object;\n ieNoOpen?: boolean;\n noSniff?: boolean;\n originAgentCluster?: boolean;\n permittedCrossDomainPolicies?: boolean;\n referrerPolicy?: boolean | object;\n xssFilter?: boolean;\n}\n\nexport interface CsrfConfig {\n secret?: string;\n cookie?: boolean | object;\n sessionKey?: string;\n value?: (req: any) => string;\n}\n\n// Input validation configuration\nexport interface ValidationConfig {\n validateInput?: boolean;\n validateOutput?: boolean;\n maxPayloadSize?: number;\n allowedFields?: string[];\n sanitizeFields?: string[];\n}\n\n// HTTP request/response types for framework abstraction\nexport interface HttpRequest {\n method: string;\n url: string;\n path: string;\n query: Record<string, any>;\n params: Record<string, string>;\n body: any;\n headers: Record<string, string>;\n cookies?: Record<string, string>;\n ip?: string;\n userAgent?: string;\n // Current authenticated user information\n user?: AuthenticatedUser | null;\n}\n\n// Authenticated user information from session\nexport interface AuthenticatedUser {\n /** The authenticated subject from the session */\n subject: any;\n /** The session token */\n token: Token;\n /** Whether the session is valid */\n valid: boolean;\n /** Session metadata */\n metadata?: {\n payload?: ReAuthJWTPayload;\n type?: 'jwt' | 'legacy' | undefined;\n // Add any other metadata fields as needed\n [key: string]: any;\n };\n}\n\nexport interface HttpResponse {\n status(code: number): this;\n json(data: any): this;\n send(data: any): this;\n header(name: string, value: string): this;\n cookie(name: string, value: string, options?: any): this;\n clearCookie(name: string, options?: any): this;\n}\n\n// Framework adapter interface\nexport interface FrameworkAdapter<\n TRequest = any,\n TResponse = any,\n TNext = any,\n> {\n name: string;\n createMiddleware(): (\n req: TRequest,\n res: TResponse,\n next: TNext,\n ) => Promise<void> | void;\n createUserMiddleware(): (\n req: TRequest,\n res: TResponse,\n next: TNext,\n ) => Promise<void> | void;\n extractRequest(req: TRequest): HttpRequest;\n sendResponse(res: TResponse, data: any, statusCode?: number): void;\n handleError(res: TResponse, error: Error, statusCode?: number): void;\n getCurrentUser(req: TRequest): Promise<AuthenticatedUser | null>;\n}\n\n// Route handler types\nexport interface RouteHandler {\n (req: HttpRequest, res: HttpResponse): Promise<any> | any;\n}\n\nexport interface AuthStepRequest extends HttpRequest {\n params: Record<string, string>;\n plugin: {\n name: string;\n step: string;\n };\n}\n\nexport interface SessionRequest extends HttpRequest {\n headers: Record<string, string> & {\n authorization?: string;\n };\n}\n\n// Plugin endpoint metadata\nexport interface PluginEndpoint {\n pluginName: string;\n stepName: string;\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n requiresAuth: boolean;\n description?: string;\n inputSchema?: any;\n outputSchema?: any;\n}\n\n// HTTP adapter response types\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: {\n code: string;\n message: string;\n details?: any;\n };\n meta?: {\n timestamp: string;\n requestId?: string;\n pagination?: {\n page: number;\n limit: number;\n total: number;\n };\n };\n}\n\nexport interface AuthStepResponse extends ApiResponse<AuthOutput> {\n data?: AuthOutput & {\n nextStep?: string;\n requiresRedirect?: boolean;\n sessionToken?: Token;\n };\n status: number;\n /** Redirect URL for OAuth flows */\n redirect?: string;\n /** Secret data (cookies) to set for OAuth flows */\n secret?: Record<string, string>;\n}\n\nexport interface SessionResponse extends ApiResponse {\n data?: {\n valid: boolean;\n subject?: any;\n token?: Token;\n expiresAt?: string;\n metadata?: {\n payload?: ReAuthJWTPayload;\n type?: 'jwt' | 'legacy' | undefined;\n // Add any other metadata fields as needed\n [key: string]: any;\n };\n };\n}\n\nexport interface PluginListResponse extends ApiResponse {\n data?: Array<{\n name: string;\n description: string;\n steps: Array<{\n name: string;\n description?: string;\n method: string;\n path: string;\n requiresAuth: boolean;\n }>;\n }>;\n}\n\n// Middleware types\nexport interface MiddlewareFunction<\n TRequest = any,\n TResponse = any,\n TNext = any,\n> {\n (req: TRequest, res: TResponse, next: TNext): Promise<void> | void;\n}\n\nexport interface SecurityMiddleware {\n cors(): MiddlewareFunction;\n rateLimit(): MiddlewareFunction;\n helmet(): MiddlewareFunction;\n validation(): MiddlewareFunction;\n}\n\n// Error types\nexport class HttpAdapterError extends Error {\n constructor(\n message: string,\n public statusCode: number = 500,\n public code: string = 'INTERNAL_ERROR',\n public details?: any,\n ) {\n super(message);\n this.name = 'HttpAdapterError';\n }\n}\n\nexport class ValidationError extends HttpAdapterError {\n constructor(message: string, details?: any) {\n super(message, 400, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\nexport class AuthenticationError extends HttpAdapterError {\n constructor(message: string, details?: any) {\n super(message, 401, 'AUTHENTICATION_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class AuthorizationError extends HttpAdapterError {\n constructor(message: string, details?: any) {\n super(message, 403, 'AUTHORIZATION_ERROR', details);\n this.name = 'AuthorizationError';\n }\n}\n\nexport class NotFoundError extends HttpAdapterError {\n constructor(message: string, details?: any) {\n super(message, 404, 'NOT_FOUND', details);\n this.name = 'NotFoundError';\n }\n}\n\nexport class RateLimitError extends HttpAdapterError {\n constructor(message: string, details?: any) {\n super(message, 429, 'RATE_LIMIT_EXCEEDED', details);\n this.name = 'RateLimitError';\n }\n}\n"]}