import type { EntityServerClientOptions, RealtimeClientOptions, RealtimeConnectionStatus, RealtimeEnvelope, RealtimeMessageListener, RealtimeStatusListener } from "../types.js"; import { type EntityRequestConfig, type RequestOptions } from "./request.js"; export type GConstructor = new (...args: any[]) => T; export declare class EntityServerClientBase { baseUrl: string; token: string; anonymousPacketToken: string; apiKey: string; hmacSecret: string; encryptRequests: boolean; /** dev 디버그 평문 시크릿. 설정 시 요청을 평문 전송하고 `X-Debug-Plain` 헤더를 보낸다. */ debugPlainSecret: string; csrfEnabled: boolean; csrfHeaderName: string; csrfCookieName: string; /** @internal health 재호출로 CSRF 쿠키 갱신 (AuthMixin에서 설정) */ csrfRefresher: (() => Promise) | null; requestAbortControllers: Map; activeTxId: string | null; /** @internal 브라우저에서 첫 구성 시 health 1회 자동 호출했는지 여부 */ 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: RealtimeConnectionStatus; realtimeSocket: WebSocket | null; realtimeConnectPromise: Promise | null; realtimeReconnectTimer: ReturnType | null; realtimeShouldReconnect: boolean; realtimeMessageListeners: Set; realtimeStatusListeners: Set; realtimeEventListeners: Map>; /** * EntityServerClient 인스턴스를 생성합니다. * * 기본값: * - `baseUrl`: `VITE_ENTITY_SERVER_URL` 또는 상대 경로(`""`) */ constructor(options?: EntityServerClientOptions); /** baseUrl, token, encryptRequests 값을 런타임에 갱신합니다. */ configure(options: Partial): void; /** * 브라우저에서 클라이언트가 처음 구성될 때 `/v1/health` 를 1회 자동 호출한다. * * CSRF·anon 쿠키 발급과 패킷 암호화 협상(`X-Packet-Encryption`)을 앱 진입 즉시 선반영해, * 프런트 라우트(`/login` 등)와 무관하게 항상 health 가 최소 1회 돌도록 보장한다. * * @internal */ fireInitialHealth(): void; /** 인증 요청에 사용할 JWT Access Token을 설정합니다. */ setToken(token: string): void; /** 응답 헤더로 받은 access token 갱신을 반영한다. */ setAccessTokenFromResponse(token: string): void; /** 토큰 변경 후 realtime 연결 상태를 동기화한다. */ syncRealtimeWithToken(): void; /** 익명 패킷 암호화용 토큰을 설정합니다. */ setAnonymousPacketToken(token: string): void; /** HMAC 인증용 API Key를 설정합니다. */ setApiKey(apiKey: string): void; /** HMAC 인증용 시크릿을 설정합니다. */ setHmacSecret(secret: string): void; /** 암호화 요청 활성화 여부를 설정합니다. */ setEncryptRequests(value: boolean): void; setCsrfEnabled(enabled: boolean): void; addRealtimeListener(listener: RealtimeMessageListener): void; removeRealtimeListener(listener: RealtimeMessageListener): void; addRealtimeStatusListener(listener: RealtimeStatusListener): void; removeRealtimeStatusListener(listener: RealtimeStatusListener): void; addRealtimeEventListener(eventName: string, listener: RealtimeMessageListener): void; removeRealtimeEventListener(eventName: string, listener: RealtimeMessageListener): void; connectRealtime(): Promise; disconnectRealtime(reason?: string): void; sendRealtime(message: RealtimeEnvelope | Record): boolean; subscribeRealtime(subscriptions: string[]): boolean; unsubscribeRealtime(subscriptions: string[]): boolean; /** * 주기적으로 health 체크를 실행합니다. * CSRF 쿠키 갱신과 서버 상태 확인을 자동화합니다. * keepSession=true 이면 각 tick에서 세션 부트스트랩도 함께 시도합니다. * * @param intervalMs 호출 주기(ms). 기본값: 5분 * @param runImmediately true면 시작 직후 첫 tick을 즉시 실행합니다. */ startHealthTick(intervalMs?: number, runImmediately?: boolean): void; /** health tick 타이머를 중지합니다. */ stopHealthTick(): void; /** @deprecated 세션 연장은 health tick 기반 부트스트랩으로 대체되었습니다. */ scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{ access_token: string; expires_in: number; }>): void; /** @deprecated 세션 연장은 health tick 기반 부트스트랩으로 대체되었습니다. */ clearRefreshTimer(): void; /** * 세션 자동 연장을 중지합니다. * `logout()` 호출 시 자동으로 중지되며, 직접 호출이 필요한 경우는 드뭅니다. */ stopKeepSession(): void; applyRealtimeOptions(options?: boolean | RealtimeClientOptions): void; buildRealtimeUrl(): string; handleRealtimeMessage(payload: unknown): void; scheduleRealtimeReconnect(reason: string): void; clearRealtimeReconnectTimer(): void; setRealtimeStatus(status: RealtimeConnectionStatus, reason?: string, error?: Error): void; applyCsrfHealth(): void; /** * 요청 바디를 파싱합니다. * `application/octet-stream`이면 XChaCha20-Poly1305 복호화, 그 외는 JSON 파싱합니다. * * @param requireEncrypted `true`이면 암호화된 요청만 허용합니다. */ readRequestBody>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T; get reqOpts(): RequestOptions; prepareRequest(_withAuth: boolean): Promise; /** * 커스텀 라우트 직접 호출용 HTTP 네임스페이스. * 인증·암호화·HMAC 등 SDK 옵션이 그대로 적용됩니다. * * @example * const res = await client.http.get<{ version: string }>("/api/v1/status", false); * const res = await client.http.post("/api/v1/custom", { key: "value" }); */ get http(): { get(path: string, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; post(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; put(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; patch(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; delete(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; }; request(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record, requestConfig?: EntityRequestConfig): Promise; /** PNG/바이너리 응답을 ArrayBuffer로 반환합니다. (QR, 바코드 등) */ requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise; /** multipart/form-data 요청을 보냅니다. (파일 업로드 등 — onUploadProgress 지정 시 XHR 로 업로드 진행률 콜백) */ requestForm(method: string, path: string, form: FormData, withAuth?: boolean, onUploadProgress?: (loaded: number, total: number) => void): Promise; /** multipart/form-data 요청을 보내고 바이너리(ArrayBuffer)를 반환합니다. */ requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise; }