import type { GConstructor, EntityServerClientBase } from "../../client/base.js"; export interface AuthLoginSuccessData { access_token: string; refresh_token: string; expires_in: number; force_password_change?: boolean; password_expired?: boolean; password_expires_in_days?: number; } export interface AuthLoginSuccessResponse { ok: true; data: AuthLoginSuccessData; requires_2fa?: false; } export interface AuthLoginRequiresTwoFactorResponse { ok: true; requires_2fa: true; data: { two_factor_token: string; expires_in: number; }; } export interface AuthLoginSetupRequiredResponse { ok: false; error: "2fa_setup_required"; message: string; data: { setup_token: string; expires_in: number; }; } export type AuthLoginResponse = AuthLoginSuccessResponse | AuthLoginRequiresTwoFactorResponse | AuthLoginSetupRequiredResponse; export declare function isAuthLoginSuccessResponse(response: AuthLoginResponse): response is AuthLoginSuccessResponse; export declare function AuthMixin>(Base: TBase): { new (...args: any[]): { authBootstrapPromise: Promise | null; authBootstrapToken: string; authBootstrapAnonymousCompleted: boolean; /** 응답 헤더 access token 갱신 시 bootstrap 기준 토큰도 함께 맞춘다. */ setAccessTokenFromResponse(token: string): void; csrfRefresher: () => Promise; /** * 서버 헬스 체크를 수행하고 패킷 암호화 활성 여부를 자동으로 감지합니다. * * 서버가 `packet_encryption: true`를 응답하면 이후 모든 요청에 암호화가 자동 적용됩니다. * * ```ts * await client.checkHealth(); * await client.login(email, password); * ``` */ checkHealth(bootstrapAuth?: boolean): Promise<{ status: string; authenticated?: boolean; packet_encryption?: boolean; }>; /** document.cookie 또는 Node 환경에서 쿠키 값 읽기 (SSR 대응) */ readCookie(name: string): string | null; ensurePublicAuthBootstrap(): Promise; ensureAuthenticatedRequestBootstrap(): Promise; prepareRequest(withAuth: boolean): Promise; /** 로그인 응답을 반환합니다. 성공 시에만 `access_token`을 내부 상태에 저장합니다. */ login(email: string, password: string): Promise; /** HttpOnly refresh cookie로 Access Token을 재발급받아 내부 토큰을 교체합니다. */ tokenRefresh(): Promise<{ access_token: string; refresh_token: string; expires_in: number; }>; /** * 갱신으로 받은 access token 을 세션 정체성 검증 후 채택한다. * 공유 refresh 쿠키가 다른 계정 소유로 바뀐 경우(같은 도메인 다중 로그인) * 다른 계정 토큰이 조용히 채택되는 것을 차단한다. */ adoptRefreshedAccessToken(accessToken: string): void; /** Refresh Token으로 Access Token을 재발급받아 내부 토큰을 교체합니다. */ refreshToken(refreshToken?: string): Promise<{ access_token: string; refresh_token?: string; expires_in: number; }>; /** * 서버에 로그아웃을 요청하고 내부 토큰을 초기화합니다. * refresh_token을 서버에 전달해 무효화합니다. */ logout(refreshToken?: string): Promise<{ ok: boolean; }>; /** 현재 로그인된 사용자 정보를 반환합니다. */ me>(): Promise<{ ok: boolean; data: T; }>; /** 회원 탈퇴를 요청합니다. */ withdraw(passwd?: string): Promise<{ ok: boolean; }>; baseUrl: string; token: string; anonymousPacketToken: string; apiKey: string; hmacSecret: string; encryptRequests: boolean; debugPlainSecret: string; csrfEnabled: boolean; csrfHeaderName: string; csrfCookieName: string; requestAbortControllers: Map; activeTxId: string | null; initialHealthFired: boolean; keepSession: boolean; refreshBuffer: number; onTokenRefreshed?: (accessToken: string, expiresIn: number) => void; onSessionExpired?: (error: Error) => void; onHealthChange?: (online: boolean) => void; sessionRefreshToken: string | null; refreshTimer: ReturnType | null; healthTickTimer: ReturnType | null; healthTickPromise: Promise | null; realtimeEnabled: boolean; realtimePath: string; realtimeAutoReconnect: boolean; realtimeReconnectDelayMs: number; realtimeStatus: import("../../types.js").RealtimeConnectionStatus; realtimeSocket: WebSocket | null; realtimeConnectPromise: Promise | null; realtimeReconnectTimer: ReturnType | null; realtimeShouldReconnect: boolean; realtimeMessageListeners: Set; realtimeStatusListeners: Set; realtimeEventListeners: Map>; configure(options: Partial): void; fireInitialHealth(): void; setToken(token: string): void; syncRealtimeWithToken(): void; setAnonymousPacketToken(token: string): void; setApiKey(apiKey: string): void; setHmacSecret(secret: string): void; setEncryptRequests(value: boolean): void; setCsrfEnabled(enabled: boolean): void; addRealtimeListener(listener: import("../../types.js").RealtimeMessageListener): void; removeRealtimeListener(listener: import("../../types.js").RealtimeMessageListener): void; addRealtimeStatusListener(listener: import("../../types.js").RealtimeStatusListener): void; removeRealtimeStatusListener(listener: import("../../types.js").RealtimeStatusListener): void; addRealtimeEventListener(eventName: string, listener: import("../../types.js").RealtimeMessageListener): void; removeRealtimeEventListener(eventName: string, listener: import("../../types.js").RealtimeMessageListener): void; connectRealtime(): Promise; disconnectRealtime(reason?: string): void; sendRealtime(message: import("../../types.js").RealtimeEnvelope | Record): boolean; subscribeRealtime(subscriptions: string[]): boolean; unsubscribeRealtime(subscriptions: string[]): boolean; startHealthTick(intervalMs?: number, runImmediately?: boolean): void; stopHealthTick(): void; scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{ access_token: string; expires_in: number; }>): void; clearRefreshTimer(): void; stopKeepSession(): void; applyRealtimeOptions(options?: boolean | import("../../types.js").RealtimeClientOptions): void; buildRealtimeUrl(): string; handleRealtimeMessage(payload: unknown): void; scheduleRealtimeReconnect(reason: string): void; clearRealtimeReconnectTimer(): void; setRealtimeStatus(status: import("../../types.js").RealtimeConnectionStatus, reason?: string, error?: Error): void; applyCsrfHealth(): void; readRequestBody>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T; get reqOpts(): import("../../client/request.js").RequestOptions; get http(): { get(path: string, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; post(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; put(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; patch(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; delete(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; }; request(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: import("../../client/request.js").EntityRequestConfig): Promise; requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise; requestForm(method: string, path: string, form: FormData, withAuth?: boolean, onUploadProgress?: (loaded: number, total: number) => void): Promise; requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise; }; } & TBase;