import type { Snapshot } from "../dto/snapshot.js"; import { LightStorage } from "./storage.js"; import { type DatabaseConfig, type DatabaseData, type ListenerHandler, type ListenerKey, type TableKey } from "../types/database.js"; import type { WebRtcDispatchPayload } from "../types/web-rtc.js"; /** * 사용자의 데이터를 관리하는 클래스입니다. * @remark 방장이 아닌 사용자는 변경사항을 방장과 통신하여 결과를 받아 업데이트 처리됩니다. */ export declare class LiveDatabase { private storage; /** * DB 상태 변경에 대해 구독을 관리하기 위한 맵 객체 */ private listener; /** * 동시 DB 업데이트 처리를 위한 Map 기반의 큐 */ private updateResolveQueue; /** * timeout 처리된 update id를 잠시 보관하는 Map 객체 * @remarks timeout 이후 늦게 도착한 동일 update 응답이 저장소에 반영되지 않도록 사용합니다. */ private expiredUpdateIds; /** * 방장 구분을 위한 변수 */ roomChief: boolean; /** * DB 업데이트시 시간 초과에 대한 최소 시간(ms) */ private updateTimeout; /** * 동시 DB 업데이트 처리시 중복을 피하기 위한 변수 */ private lastResolveQueueId; /** * {@link flushQueue}가 실행되기 전까지 이벤트를 쌓아두는 버퍼 */ private pendingEvents; /** * flush 실행 여부를 확인하는 변수 */ private isFlushing; /** * microtask에 예약된 상태를 확인하는 변수 */ private isFlushScheduled; /** * 예약된 리스너 flush가 끝날 때까지 대기하기 위한 Promise */ private flushPromise; /** * 예약된 리스너 flush의 완료를 알리는 resolve 함수 */ private resolveFlushPromise; /** * WebRtc에 방장에게 변경사항을 요청하는 메서드 * @remark 명시적 콜백을 위한 메서드 */ onSend: (data: WebRtcDispatchPayload) => void; /** * 데이터 변경이 완료 이후에 사용되는 메서드 * @remark 명시적 콜백을 위한 메서드 */ onUpdateComplete: () => void; /** * on 메서드에서 에러 발생시 호출되는 메서드 * @remarks 외부에서 설정을 통해 할당됩니다. */ onError: (table: string, error: unknown) => void; /** * 새로운 데이터베이스 인스턴스를 생성 * @param storage - 데이터를 저장할 {@link LightStorage} 구현체 * @param [config] - 외부 커스텀 {@link DatabaseConfig} 객체 (선택 사항) */ constructor(storage: LightStorage, config?: DatabaseConfig); /** * 외부에서 커스텀 키를 받아 저장소에 전파하기 위한 메서드 * @see {@link LightStorage.onSetStorageKey} */ onSetStorageKey: (key: string) => void; /** * 엔진을 통한 데이터 동기화를 위한 메서드 * @param snapshot - 동기화 할 {@link Snapshot} 객체 */ syncDatabase(snapshot: Snapshot): void; /** * 데이터베이스 변경사항을 구독하기 위한 메서드 * @param tableKey - 구독할 테이블 키 * @param dbHandler - 데이터 변경 시 실행될 콜백 함수 */ addDBListener(tableKey: TableKey, dbHandler: ListenerHandler): void; /** * 외부에서 데이터베이스 변경사항 구독을 취소하기 위한 메서드 * @param listenerKey - 변경사항 구독을 취소할 Key */ removeDBListener(listenerKey: ListenerKey): void; /** * 데이터베이스를 업데이트하고 변경 사항이 동기화 될 때까지 대기하는 메서드 * @param table - 업데이트할 테이블 키 (기본값: {@link DB_PATH.ROOT}) * @param data - 저장할 {@link DatabaseData} 객체 * @param [clear] - true일 경우 초기화, 기본값일 경우 전체 초기화 (선택 사항) * @returns 업데이트 완료 후 resolve되는 Promise * @throws 업데이트 타임아웃 또는 처리 실패 시 발생 */ updateDB(table: TableKey | undefined, data: DatabaseData, clear?: boolean): Promise; /** * 비동기적인 DB 업데이트를 감지를 위해 큐에 추가하는 메서드 */ private checkUpdate; /** * 실질적인 데이터베이스를 업데이트하는 메서드 * @remarks 최종 데이터베이스의 `null` 값은 해당 키를 물리적으로 제거하는 '삭제' 신호로 처리됩니다. * @param payload - 데이터 업데이트에 필요한 {@link WebRtcDispatchPayload} 객체 * @param [send] - 업데이트 완료 후 방장에게 데이터를 보낼 것인지에 대한 변수 (기본값: true) * @returns 리스너 실행과 업데이트 완료 콜백 처리가 끝나면 resolve되는 Promise */ onValue({ id, table, data, clear }: WebRtcDispatchPayload, send?: boolean): Promise; /** * 구독한 리스너에 전달하는 메서드 * @remarks queueMicrotask를 이용해 처리합니다. * @param table 업데이트한 Table Key * @param data 최신 {@link DatabaseData} 객체 */ private emitCallback; /** * 누적된 {@link pendingEvents}를 일괄 처리하는 메서드 */ private flushQueue; /** * 구독한 모든 리스너에게 초기화된 값을 전달하는 메서드 */ private emitAllCallbackClear; /** * 메모리 할당 해제를 위한 메서드입니다. * @remark 진행 중인 비동기 업데이트 요청은 모두 reject 처리됩니다. */ destroy(): void; /** * timeout 처리된 update id를 만료 목록에 등록하는 메서드 * @param id - timeout이 발생한 update 요청 id * @remarks 만료 id는 {@link updateTimeout}의 두 배 시간 동안 보관한 뒤 자동으로 제거합니다. */ private markUpdateExpired; /** * 만료 update id와 정리 타이머를 모두 제거하는 메서드 * @remarks 인스턴스 제거 시 예약된 타이머가 남지 않도록 사용합니다. */ private clearExpiredUpdates; getSnapshot(): Snapshot; /** * 특정 테이블 데이터를 삭제합니다. * @remarks 테이블 구독은 유지됩니다. 구독 해제가 필요하면 {@link removeDBListener}를 호출하세요. */ removeTable(table: TableKey): Promise; get database(): import("../types/database.js").DatabaseRecord; } //# sourceMappingURL=database.d.ts.map