UNPKG

better-auth-cloudflare

Version:

Seamlessly integrate better-auth with Cloudflare Workers, D1, Hyperdrive, KV, R2, and geolocation services.

395 lines (394 loc) 15.4 kB
import type { KVNamespace } from "@cloudflare/workers-types"; import { type BetterAuthOptions, type SecondaryStorage, type Session } from "better-auth"; import type { CloudflareGeolocation, CloudflarePluginOptions, WithCloudflareOptions } from "./types"; export * from "./client"; export * from "./schema"; export * from "./types"; export * from "./r2"; /** * Cloudflare integration for Better Auth * * @param options - Plugin configuration options * @returns Better Auth plugin for Cloudflare */ export declare const cloudflare: (options?: CloudflarePluginOptions) => { id: "cloudflare"; schema: import("better-auth").AuthPluginSchema; endpoints: { upload?: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0?: ({ body?: undefined; } & { method?: "POST" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { success: boolean; data: import("./types").FileMetadata; }; } : { success: boolean; data: import("./types").FileMetadata; }>; options: { method: "POST"; } & { use: any[]; }; path: "/files/upload-raw"; } | undefined; download?: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: { body: { fileId: string; }; } & { method?: "POST" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: Response; } : Response>; options: { method: "POST"; use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{ session: { session: Record<string, any> & { id: string; token: string; userId: string; expiresAt: Date; createdAt: Date; updatedAt: Date; ipAddress?: string | null | undefined; userAgent?: string | null | undefined; }; user: Record<string, any> & { id: string; name: string; emailVerified: boolean; email: string; createdAt: Date; updatedAt: Date; image?: string | null | undefined; }; }; }>)[]; body: import("zod").ZodObject<{ fileId: import("zod").ZodString; }, "strip", import("zod").ZodTypeAny, { fileId: string; }, { fileId: string; }>; } & { use: any[]; }; path: "/files/download"; } | undefined; delete?: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: { body: { fileId: string; }; } & { method?: "POST" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { message: string; fileId: string; }; } : { message: string; fileId: string; }>; options: { method: "POST"; use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{ session: { session: Record<string, any> & { id: string; token: string; userId: string; expiresAt: Date; createdAt: Date; updatedAt: Date; ipAddress?: string | null | undefined; userAgent?: string | null | undefined; }; user: Record<string, any> & { id: string; name: string; emailVerified: boolean; email: string; createdAt: Date; updatedAt: Date; image?: string | null | undefined; }; }; }>)[]; body: import("zod").ZodObject<{ fileId: import("zod").ZodString; }, "strip", import("zod").ZodTypeAny, { fileId: string; }, { fileId: string; }>; } & { use: any[]; }; path: "/files/delete"; } | undefined; list?: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0?: ({ body?: undefined; } & { method?: "GET" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { files: import("./types").FileMetadata[]; nextCursor: string | null; hasMore: boolean; }; } : { files: import("./types").FileMetadata[]; nextCursor: string | null; hasMore: boolean; }>; options: { method: "GET"; use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{ session: { session: Record<string, any> & { id: string; token: string; userId: string; expiresAt: Date; createdAt: Date; updatedAt: Date; ipAddress?: string | null | undefined; userAgent?: string | null | undefined; }; user: Record<string, any> & { id: string; name: string; emailVerified: boolean; email: string; createdAt: Date; updatedAt: Date; image?: string | null | undefined; }; }; }>)[]; } & { use: any[]; }; path: "/files/list"; } | undefined; get?: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: { body: { fileId: string; }; } & { method?: "POST" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { data: {}; }; } : { data: {}; }>; options: { method: "POST"; use: ((inputContext: import("better-call").MiddlewareInputContext<import("better-call").MiddlewareOptions>) => Promise<{ session: { session: Record<string, any> & { id: string; token: string; userId: string; expiresAt: Date; createdAt: Date; updatedAt: Date; ipAddress?: string | null | undefined; userAgent?: string | null | undefined; }; user: Record<string, any> & { id: string; name: string; emailVerified: boolean; email: string; createdAt: Date; updatedAt: Date; image?: string | null | undefined; }; }; }>)[]; body: import("zod").ZodObject<{ fileId: import("zod").ZodString; }, "strip", import("zod").ZodTypeAny, { fileId: string; }, { fileId: string; }>; } & { use: any[]; }; path: "/files/get"; } | undefined; getGeolocation: { <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0?: ({ body?: undefined; } & { method?: "GET" | undefined; } & { query?: Record<string, any> | undefined; } & { params?: Record<string, any>; } & { request?: Request; } & { headers?: HeadersInit; } & { asResponse?: boolean; returnHeaders?: boolean; use?: import("better-call").Middleware[]; path?: string; } & { asResponse?: AsResponse | undefined; returnHeaders?: ReturnHeaders | undefined; }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: CloudflareGeolocation | { error: string; }; } : CloudflareGeolocation | { error: string; }>; options: { method: "GET"; } & { use: any[]; }; path: "/cloudflare/geolocation"; }; }; init(init_ctx: import("better-auth").AuthContext): { options: { databaseHooks: { session: { create: { before: (s: any) => Promise<any>; }; }; }; }; }; }; /** * Creates secondary storage using Cloudflare KV * * @param kv - Cloudflare KV namespace * @returns SecondaryStorage implementation */ export declare const createKVStorage: (kv: KVNamespace<string>) => SecondaryStorage; /** * Type helper to infer the enhanced auth type with Cloudflare plugin */ type WithCloudflareAuth<T extends BetterAuthOptions> = T & { plugins: [ReturnType<typeof cloudflare>, ...(T["plugins"] extends readonly any[] ? T["plugins"] : [])]; }; /** * Enhances BetterAuthOptions with Cloudflare-specific configurations. * * This function integrates Cloudflare services like D1 for database and KV for secondary storage, * and sets up IP address detection and geolocation tracking based on the provided Cloudflare options. * * @param cloudFlareOptions - Options for configuring Cloudflare integration. * @param options - The base BetterAuthOptions to be enhanced. * @returns BetterAuthOptions configured for use with Cloudflare. */ export declare const withCloudflare: <T extends BetterAuthOptions>(cloudFlareOptions: WithCloudflareOptions, options: T) => WithCloudflareAuth<T>; export type SessionWithGeolocation = Session & CloudflareGeolocation;