import { DpState } from '../../../../types'; /** * 忽略 DP 数据变化拦截器的配置选项 * * 用于配置智能设备面板中 DP 上报事件的防抖机制,避免面板操作后的 * 即时响应干扰用户体验或业务逻辑 */ export type IgnoreDpChangeInterceptorOptions = { /** * 白名单 dp,不会忽略上报 * @typeOverride whiteDpCodes string[] */ whiteDpCodes?: (keyof T)[]; /** * 启用调试日志,默认 false * @internal * @defaultValue false */ debug?: boolean; /** * 防抖超时检查,毫秒,默认为 5000 * - 从面板下发 dp 到收到 dp 回复之间的最大时间,超过此时间才会触发 dpDataChange。 * - 用于 dp 上报事件的防抖 * @defaultValue 5000 */ timeout?: number; /** * 自定义忽略规则 * > 优先级最高,配置了自定义规则后,whiteDpCodes 和 timeout 项将无效 * @param {Record} dpState - 上报的dp功能点状态 * @param {number} lastSendTimestamp - 上次面板下发的时间戳 * * @returns {boolean} 返回 true 则响应上报,返回 false 则忽略 */ customRule?: (dpState: DpState, lastSendTimestamp: number) => boolean; }; type IgnoreDpChangeConfig = { lastSendTimestamp: number | null; options: IgnoreDpChangeInterceptorOptions | boolean; /** timeout 内被忽略的上报会合并缓存在此,用于 timeout 后与当前 dpState 对比并决定是否补充更新 */ cachedDpState: DpState | null; /** 用于 timeout 后执行 flush 检查的定时器 */ flushTimerId: ReturnType | null; }; export declare const createIgnoreDpChangeInterceptorConfig: (options?: IgnoreDpChangeInterceptorOptions | boolean) => IgnoreDpChangeConfig; export declare function clearPendingFlush(config: IgnoreDpChangeConfig): void; /** * 面板下发dp时,会记录下发时间戳,并预约 timeout 后的 flush 检查 * @param config 拦截器配置对象 * @param options 选项参数,可以是布尔值或详细配置对象 * @param onFlush timeout 后若存在缓存的上报状态则调用,用于与当前 dpState 对比并决定是否补充一次更新 */ export declare const recordIgnoreDpChangeTimestamp: (config: IgnoreDpChangeConfig, options: IgnoreDpChangeInterceptorOptions | boolean, onFlush?: ((cachedDpState: Record) => void) | undefined) => void; /** * 面板收到 dp 上报时,检查是否应该忽略该上报 * * 判断逻辑: * 1. 如果拦截器未启用(options === false),则放行所有上报 * 2. 如果上报的dp在白名单中,则放行 * 3. 如果距离上次面板下发时间超过设定阈值(默认10s),则放行(认为是设备主动上报),并清除缓存与 flush 定时器 * 4. 如果距离上次面板下发时间未超过阈值,则忽略(认为是面板操作的即时响应),并将本次上报合并到缓存,等 timeout 后与当前 dpState 对比再决定是否补充更新 * * @param dpState 当前dp状态 * @param config 拦截器配置 * @returns true表示应该触发dpDataChange,false表示应该忽略(并已写入缓存) */ export declare const checkIgnoreDpChangeTimestampIsTimeout: (dpState: Record, config: IgnoreDpChangeConfig) => boolean; export {};