import type { ITrackConfig, ITrackOptions, SlsOptions } from './type';
/**
 * 日志上报抽象类
 * 业务端需要重新实现 format 方法，将日志格式化成 Sls 需要的格式
 */
export declare abstract class Track<ILog extends Record<string, any>, LogData extends ILog & {
    id: string;
} = any> {
    private logQueue;
    private prepareLogQueue;
    private processingIds;
    private isUploading;
    slsOptions: SlsOptions;
    config: Required<ITrackOptions>;
    private debounceTimer;
    private flushIntervalTimer;
    private nextId;
    protected constructor(trackConfig: ITrackConfig);
    /**
     * 不同系统对上报日志有差异，暴露 format 方法，让子类实现兼容各业务系统
     */
    abstract format(log: LogData): LogData;
    /**
     * 由子类实现具体的日志上报逻辑
     * 如果失败，则抛出异常
     * Note: 小程序中不支持 Headers 类型，需要使用 Record<string, string> 类型
     */
    abstract _upload(payload: string | any | Uint8Array<ArrayBufferLike>, headers: Record<string, string>): Promise<unknown>;
    /**
     * 获取存储对象
     */
    abstract _getStorage(key: string): any[];
    /**
     * 设置存储对象
     */
    abstract _setStorage(key: string, value: any[]): void;
    /**
     * 生成唯一ID，通过时间戳+自增ID。很高效的唯一ID方式。
     */
    private generateId;
    /**
     * 当前不同平台处理 request 不同，暴露给子类处理
     * 生成 sls 请求 url
     * eq: https://biz-frontend-upload.cn-shanghai.log.aliyuncs.com/logstores/ucma-frontend/track?APIVersion=0.6.0
     * project + host + '/logstores' + logstore + '/track?APIVersion=0.6.0'
     */
    generateSlsUrl(): string;
    /**
     * 注意 sls 的 value 只能是字符串。单单 JSON.stringify 遇到 number 这些会报错 PostBodyInvalid
     * 将对象转换为字符串
     */
    transString(obj: Record<string, any>): Record<string, any>;
    /**
     * 获取 sls 上报所需格式，注意 sls 的 value 只能是字符串
     * 数据需要二次 JSON.stringify
     * @link https://help.aliyun.com/zh/sls/developer-reference/api-sls-2020-12-30-putwebtracking?spm=a2c4g.11186623.0.0.39c93b79Z9iOcy
     * @param logData 日志数组
     */
    getRequestInfo(logData: LogData[]): {
        payload: string;
        headers: {
            'x-log-apiversion': string;
            'x-log-bodyrawsize': string;
        };
    };
    /**
     * 设置是否开启日志上报
     */
    setUploadEnabled(enabled: boolean): void;
    /**
     * 添加日志到队列
     */
    add(log: any): void;
    /**
     * 使用防抖上报日志
     */
    private debounceUpload;
    /**
     * 由于日志都是异步参数，可能会出现乱序，所以需要排序
     * 按照 eventId 升序排序
     * @param arr
     * @private
     */
    private sortByEventId;
    /**
     * 获取可上传的日志（未在处理中的日志）
     */
    private getUploadLogs;
    /**
     * 从队列中移除指定ID的日志
     */
    private removeLogsById;
    /**
     * 上报日志
     */
    upload(): Promise<boolean>;
    /**
     * 强制上报日志
     */
    flush(): Promise<boolean>;
    /**
     * 定时上报日志
     */
    private initializeFlushInterval;
    /**
     * 持久化日志到 localStorage
     */
    private persistLogs;
    /**
     * 获取本地存储的日志
     * @returns
     */
    private getPersistedLogs;
    /**
     * 恢复持久化的日志
     */
    private restorePersistedLogs;
    destroy(): void;
}
