335 lines
13 KiB
Dart
335 lines
13 KiB
Dart
/// SDK 配置管理类:统一管理所有 SDK 相关的配置常量
|
||
class SdkConfig {
|
||
SdkConfig._();
|
||
|
||
// ==================== 默认值常量(单一来源)====================
|
||
// 字段声明和 reset() 均引用这些常量,避免三处重复。
|
||
|
||
static const int _defaultMaxQueueSize = 5000;
|
||
static const int _defaultAutoUploadThreshold = 10;
|
||
static const int _defaultMaxBatchSize = 500;
|
||
static const int _defaultIsolateEncodingThreshold = 100;
|
||
static const Duration _defaultUploadInterval = Duration(seconds: 5);
|
||
static const Duration _defaultPageLoadTimeout = Duration(seconds: 5);
|
||
static const Duration _defaultClickThrottleDuration =
|
||
Duration(milliseconds: 300);
|
||
static const Duration _defaultConnectionTimeout = Duration(seconds: 10);
|
||
static const Duration _defaultReadTimeout = Duration(seconds: 30);
|
||
static const Duration _defaultSpeedTestTimeout = Duration(seconds: 5);
|
||
static const Duration _defaultConfigRequestTimeout = Duration(seconds: 10);
|
||
static const int _defaultMaxBackoffLevel = 5;
|
||
static const Duration _defaultBaseRetryDelay = Duration(seconds: 2);
|
||
static const Duration _defaultMaxRetryDelay = Duration(seconds: 60);
|
||
static const String _defaultCacheFileName = 'data_plus_events_cache.jsonl';
|
||
static const String _defaultDebugReportEventLogFileName =
|
||
'data_plus_report_events_debug.jsonl';
|
||
static const bool _defaultEnableDebugReportLog = false;
|
||
static const String _defaultEventTypeConfigCacheFileName =
|
||
'analytics_event_types_config.json';
|
||
static const String _defaultDomainCacheFileName =
|
||
'data_plus_domains_cache.json';
|
||
static const int _defaultMaxCacheLines = 2000;
|
||
static const int _defaultMaxCacheBytes = 2 * 1024 * 1024;
|
||
static const int _defaultTombstoneCompactionThreshold = 200;
|
||
static const String _defaultTombstoneFileName =
|
||
'data_plus_events_tombstone.txt';
|
||
static const int _defaultMaxJsonSize = 5 * 1024 * 1024;
|
||
static const int _defaultMaxSingleEventSize = 300 * 1024;
|
||
static const int _defaultMaxConfigResponseSize = 1 * 1024 * 1024;
|
||
static const int _defaultMaxPageStackSize = 100;
|
||
static const int _defaultMaxAdImpressionCapacity = 10000;
|
||
static const int _defaultCacheBufferThreshold = 10;
|
||
static const Duration _defaultCacheFlushInterval = Duration(seconds: 5);
|
||
|
||
// ==================== 事件队列配置 ====================
|
||
|
||
/// 事件队列最大容量限制,防止内存无限增长
|
||
static int maxQueueSize = _defaultMaxQueueSize;
|
||
|
||
/// 自动上报阈值:队列达到此数量时立即触发上报
|
||
static int autoUploadThreshold = _defaultAutoUploadThreshold;
|
||
|
||
/// 单次上报的最大事件数量限制,避免请求过大导致超时
|
||
static int maxBatchSize = _defaultMaxBatchSize;
|
||
|
||
/// JSON 编码的批次大小阈值,超过此大小使用 isolate 编码
|
||
static int isolateEncodingThreshold = _defaultIsolateEncodingThreshold;
|
||
|
||
// ==================== 定时器配置 ====================
|
||
|
||
/// 定时上报间隔(秒)
|
||
static Duration uploadInterval = _defaultUploadInterval;
|
||
|
||
/// 页面加载超时时间(秒)
|
||
static Duration pageLoadTimeout = _defaultPageLoadTimeout;
|
||
|
||
/// 点击事件节流时间(毫秒)
|
||
static Duration clickThrottleDuration = _defaultClickThrottleDuration;
|
||
|
||
// ==================== 网络超时配置 ====================
|
||
|
||
/// HTTP 连接超时时间
|
||
static Duration connectionTimeout = _defaultConnectionTimeout;
|
||
|
||
/// HTTP 读取超时时间
|
||
static Duration readTimeout = _defaultReadTimeout;
|
||
|
||
/// HTTP 写入超时时间(与连接超时相同)
|
||
static Duration get writeTimeout => connectionTimeout;
|
||
|
||
/// HTTP 总超时时间(连接 + 写入 + 读取)
|
||
static Duration get totalRequestTimeout =>
|
||
connectionTimeout + writeTimeout + readTimeout;
|
||
|
||
/// 域名测速超时时间
|
||
static Duration speedTestTimeout = _defaultSpeedTestTimeout;
|
||
|
||
/// 配置请求超时时间
|
||
static Duration configRequestTimeout = _defaultConfigRequestTimeout;
|
||
|
||
// ==================== 加密配置 ====================
|
||
|
||
/// AES-GCM 解密密钥(固定密钥,用于 decryptResponseAuto 等)
|
||
static const String decryptKey =
|
||
'en1BNo0VBrN/zi+mI2LO7E9W40ehCBYwC+frBn8s3rQ';
|
||
|
||
// ==================== 重试配置 ====================
|
||
|
||
/// 最大退避级别
|
||
static int maxBackoffLevel = _defaultMaxBackoffLevel;
|
||
|
||
/// 基础延迟时间
|
||
static Duration baseRetryDelay = _defaultBaseRetryDelay;
|
||
|
||
/// 最大延迟时间
|
||
static Duration maxRetryDelay = _defaultMaxRetryDelay;
|
||
|
||
// ==================== 缓存配置 ====================
|
||
|
||
/// 事件缓存文件名
|
||
static String cacheFileName = _defaultCacheFileName;
|
||
|
||
/// Debug 包完整事件 JSONL 文件名(Native 平台 applicationDocumentsDirectory 下)
|
||
static String debugReportEventLogFileName =
|
||
_defaultDebugReportEventLogFileName;
|
||
|
||
/// 是否启用调试事件日志。
|
||
///
|
||
/// 默认关闭;开启后才会本地记录上传事件完整 JSONL,并打印 accepted event 完整 JSON。
|
||
static bool enableDebugReportLog = _defaultEnableDebugReportLog;
|
||
|
||
/// 事件类型配置缓存文件名
|
||
static String eventTypeConfigCacheFileName =
|
||
_defaultEventTypeConfigCacheFileName;
|
||
|
||
/// 域名列表缓存文件名
|
||
static String domainCacheFileName = _defaultDomainCacheFileName;
|
||
|
||
/// 最大缓存行数限制,防止文件过大导致内存问题
|
||
/// 默认 2000 行,避免在网络不稳定时生成过大的缓存文件
|
||
static int maxCacheLines = _defaultMaxCacheLines;
|
||
|
||
/// 缓存文件最大字节数限制,超过后从文件开头裁剪旧事件
|
||
/// 默认 2MB
|
||
static int maxCacheBytes = _defaultMaxCacheBytes;
|
||
|
||
/// tombstone 触发压缩的 event_id 数量阈值
|
||
/// 默认 200:每积累 200 条已上报 ID 就压缩一次主缓存文件
|
||
static int tombstoneCompactionThreshold =
|
||
_defaultTombstoneCompactionThreshold;
|
||
|
||
/// tombstone 缓存文件名
|
||
static String tombstoneFileName = _defaultTombstoneFileName;
|
||
|
||
/// 持久化 buffer 攒批阈值(达到此数量立即写盘)
|
||
static int cacheBufferThreshold = _defaultCacheBufferThreshold;
|
||
|
||
/// 持久化 buffer 定时刷写间隔
|
||
static Duration cacheFlushInterval = _defaultCacheFlushInterval;
|
||
|
||
// ==================== 请求大小限制 ====================
|
||
|
||
/// JSON 最大大小限制(5MB)
|
||
static int maxJsonSize = _defaultMaxJsonSize;
|
||
|
||
/// 单条事件最大字节数限制,超过则丢弃(300KB)
|
||
static int maxSingleEventSize = _defaultMaxSingleEventSize;
|
||
|
||
/// 配置接口响应体最大字节数限制(1MB),防止恶意/异常服务器返回超大数据导致 OOM
|
||
static int maxConfigResponseSize = _defaultMaxConfigResponseSize;
|
||
|
||
// ==================== 容量配置 ====================
|
||
|
||
/// 页面栈最大容量
|
||
static int maxPageStackSize = _defaultMaxPageStackSize;
|
||
|
||
/// 广告去重最大容量
|
||
static int maxAdImpressionCapacity = _defaultMaxAdImpressionCapacity;
|
||
|
||
// ==================== 配置方法 ====================
|
||
|
||
/// 配置所有 SDK 参数
|
||
///
|
||
/// 示例:
|
||
/// ```dart
|
||
/// SdkConfig.configure(
|
||
/// maxQueueSize: 20000,
|
||
/// uploadInterval: Duration(seconds: 30),
|
||
/// connectionTimeout: Duration(seconds: 15),
|
||
/// );
|
||
/// ```
|
||
static void configure({
|
||
int? maxQueueSize,
|
||
int? autoUploadThreshold,
|
||
int? maxBatchSize,
|
||
int? isolateEncodingThreshold,
|
||
Duration? uploadInterval,
|
||
Duration? pageLoadTimeout,
|
||
Duration? clickThrottleDuration,
|
||
Duration? connectionTimeout,
|
||
Duration? readTimeout,
|
||
Duration? speedTestTimeout,
|
||
Duration? configRequestTimeout,
|
||
int? maxBackoffLevel,
|
||
Duration? baseRetryDelay,
|
||
Duration? maxRetryDelay,
|
||
String? cacheFileName,
|
||
String? debugReportEventLogFileName,
|
||
bool? enableDebugReportLog,
|
||
String? eventTypeConfigCacheFileName,
|
||
String? domainCacheFileName,
|
||
int? maxCacheLines,
|
||
int? maxCacheBytes,
|
||
int? maxJsonSize,
|
||
int? maxSingleEventSize,
|
||
int? maxPageStackSize,
|
||
int? maxAdImpressionCapacity,
|
||
}) {
|
||
if (maxQueueSize != null && maxQueueSize > 0) {
|
||
SdkConfig.maxQueueSize = maxQueueSize;
|
||
}
|
||
if (autoUploadThreshold != null && autoUploadThreshold > 0) {
|
||
SdkConfig.autoUploadThreshold = autoUploadThreshold;
|
||
}
|
||
if (maxBatchSize != null && maxBatchSize > 0) {
|
||
SdkConfig.maxBatchSize = maxBatchSize;
|
||
}
|
||
if (isolateEncodingThreshold != null && isolateEncodingThreshold > 0) {
|
||
SdkConfig.isolateEncodingThreshold = isolateEncodingThreshold;
|
||
}
|
||
if (uploadInterval != null) {
|
||
SdkConfig.uploadInterval = uploadInterval;
|
||
}
|
||
if (pageLoadTimeout != null) {
|
||
SdkConfig.pageLoadTimeout = pageLoadTimeout;
|
||
}
|
||
if (clickThrottleDuration != null) {
|
||
SdkConfig.clickThrottleDuration = clickThrottleDuration;
|
||
}
|
||
if (connectionTimeout != null) {
|
||
SdkConfig.connectionTimeout = connectionTimeout;
|
||
}
|
||
if (readTimeout != null) {
|
||
SdkConfig.readTimeout = readTimeout;
|
||
}
|
||
if (speedTestTimeout != null) {
|
||
SdkConfig.speedTestTimeout = speedTestTimeout;
|
||
}
|
||
if (configRequestTimeout != null) {
|
||
SdkConfig.configRequestTimeout = configRequestTimeout;
|
||
}
|
||
if (maxBackoffLevel != null && maxBackoffLevel >= 0) {
|
||
SdkConfig.maxBackoffLevel = maxBackoffLevel;
|
||
}
|
||
if (baseRetryDelay != null) {
|
||
SdkConfig.baseRetryDelay = baseRetryDelay;
|
||
}
|
||
if (maxRetryDelay != null) {
|
||
SdkConfig.maxRetryDelay = maxRetryDelay;
|
||
}
|
||
if (cacheFileName != null &&
|
||
cacheFileName.isNotEmpty &&
|
||
!cacheFileName.contains('/') &&
|
||
!cacheFileName.contains('\\') &&
|
||
!cacheFileName.contains('..')) {
|
||
SdkConfig.cacheFileName = cacheFileName;
|
||
}
|
||
if (debugReportEventLogFileName != null &&
|
||
debugReportEventLogFileName.isNotEmpty &&
|
||
!debugReportEventLogFileName.contains('/') &&
|
||
!debugReportEventLogFileName.contains('\\') &&
|
||
!debugReportEventLogFileName.contains('..')) {
|
||
SdkConfig.debugReportEventLogFileName = debugReportEventLogFileName;
|
||
}
|
||
if (enableDebugReportLog != null) {
|
||
SdkConfig.enableDebugReportLog = enableDebugReportLog;
|
||
}
|
||
if (eventTypeConfigCacheFileName != null &&
|
||
eventTypeConfigCacheFileName.isNotEmpty &&
|
||
!eventTypeConfigCacheFileName.contains('/') &&
|
||
!eventTypeConfigCacheFileName.contains('\\') &&
|
||
!eventTypeConfigCacheFileName.contains('..')) {
|
||
SdkConfig.eventTypeConfigCacheFileName = eventTypeConfigCacheFileName;
|
||
}
|
||
if (domainCacheFileName != null &&
|
||
domainCacheFileName.isNotEmpty &&
|
||
!domainCacheFileName.contains('/') &&
|
||
!domainCacheFileName.contains('\\') &&
|
||
!domainCacheFileName.contains('..')) {
|
||
SdkConfig.domainCacheFileName = domainCacheFileName;
|
||
}
|
||
if (maxCacheLines != null && maxCacheLines > 0) {
|
||
SdkConfig.maxCacheLines = maxCacheLines;
|
||
}
|
||
if (maxCacheBytes != null && maxCacheBytes > 0) {
|
||
SdkConfig.maxCacheBytes = maxCacheBytes;
|
||
}
|
||
if (maxJsonSize != null && maxJsonSize > 0) {
|
||
SdkConfig.maxJsonSize = maxJsonSize;
|
||
}
|
||
if (maxSingleEventSize != null && maxSingleEventSize > 0) {
|
||
SdkConfig.maxSingleEventSize = maxSingleEventSize;
|
||
}
|
||
if (maxPageStackSize != null && maxPageStackSize > 0) {
|
||
SdkConfig.maxPageStackSize = maxPageStackSize;
|
||
}
|
||
if (maxAdImpressionCapacity != null && maxAdImpressionCapacity > 0) {
|
||
SdkConfig.maxAdImpressionCapacity = maxAdImpressionCapacity;
|
||
}
|
||
}
|
||
|
||
/// 重置所有配置为默认值
|
||
static void reset() {
|
||
maxQueueSize = _defaultMaxQueueSize;
|
||
autoUploadThreshold = _defaultAutoUploadThreshold;
|
||
maxBatchSize = _defaultMaxBatchSize;
|
||
isolateEncodingThreshold = _defaultIsolateEncodingThreshold;
|
||
uploadInterval = _defaultUploadInterval;
|
||
pageLoadTimeout = _defaultPageLoadTimeout;
|
||
clickThrottleDuration = _defaultClickThrottleDuration;
|
||
connectionTimeout = _defaultConnectionTimeout;
|
||
readTimeout = _defaultReadTimeout;
|
||
speedTestTimeout = _defaultSpeedTestTimeout;
|
||
configRequestTimeout = _defaultConfigRequestTimeout;
|
||
maxBackoffLevel = _defaultMaxBackoffLevel;
|
||
baseRetryDelay = _defaultBaseRetryDelay;
|
||
maxRetryDelay = _defaultMaxRetryDelay;
|
||
cacheFileName = _defaultCacheFileName;
|
||
debugReportEventLogFileName = _defaultDebugReportEventLogFileName;
|
||
enableDebugReportLog = _defaultEnableDebugReportLog;
|
||
eventTypeConfigCacheFileName = _defaultEventTypeConfigCacheFileName;
|
||
domainCacheFileName = _defaultDomainCacheFileName;
|
||
maxCacheLines = _defaultMaxCacheLines;
|
||
maxCacheBytes = _defaultMaxCacheBytes;
|
||
tombstoneCompactionThreshold = _defaultTombstoneCompactionThreshold;
|
||
tombstoneFileName = _defaultTombstoneFileName;
|
||
cacheBufferThreshold = _defaultCacheBufferThreshold;
|
||
cacheFlushInterval = _defaultCacheFlushInterval;
|
||
maxJsonSize = _defaultMaxJsonSize;
|
||
maxSingleEventSize = _defaultMaxSingleEventSize;
|
||
maxConfigResponseSize = _defaultMaxConfigResponseSize;
|
||
maxPageStackSize = _defaultMaxPageStackSize;
|
||
maxAdImpressionCapacity = _defaultMaxAdImpressionCapacity;
|
||
}
|
||
}
|