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