@be-link/cls-logger 1.0.1-beta.5 → 1.0.1-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,110 +1,11 @@
1
- import type { ClsLoggerInitOptions, FlatFields, PutOptions, QueueItem, ReportLog } from './types';
2
- export declare class ClsLogger {
3
- private sdk;
4
- private sdkPromise;
5
- private client;
6
- private clientPromise;
7
- private topicId;
8
- private endpoint;
9
- private retryTimes;
10
- private source;
11
- private projectId;
12
- private projectName;
13
- private appId;
14
- private appVersion;
15
- private envType;
16
- private userGenerateBaseFields;
17
- private autoGenerateBaseFields;
18
- private storageKey;
19
- private batchSize;
20
- private memoryQueue;
21
- private batchMaxSize;
22
- private batchIntervalMs;
23
- private batchTimer;
24
- private batchTimerDueAt;
25
- private initTs;
26
- private startupDelayMs;
27
- private failedCacheKey;
28
- private failedCacheMax;
29
- private requestMonitorStarted;
30
- private errorMonitorStarted;
31
- private performanceMonitorStarted;
32
- private behaviorMonitorStarted;
33
- private behaviorMonitorCleanup;
34
- userId: unknown;
35
- userName: unknown;
36
- init(options: ClsLoggerInitOptions): void;
37
- private getBaseFields;
38
- private startRequestMonitor;
39
- private startErrorMonitor;
40
- private startPerformanceMonitor;
41
- private startBehaviorMonitor;
42
- /**
43
- * 停止行为埋点监听(PV/UV/点击)
44
- * - 如需重启:可再次调用 init(或自行调用 init 后的默认启动逻辑)
45
- */
46
- stopBehaviorMonitor(): void;
47
- /**
48
- * 获取 CLS client(按环境懒加载 SDK)
49
- * - browser: 优先走 UMD 全局变量 `tencentcloudClsSdkJsWeb`
50
- * - miniprogram: 优先走 require(webpack/taro 可解析),否则 fallback import()
51
- */
52
- getInstance(): Promise<{
53
- PutLogs: (request: unknown) => Promise<unknown> | unknown;
54
- }>;
55
- private loadSdk;
56
- private detectEnvType;
57
- /**
58
- * 直接上报:埋点入参必须是一维(扁平)Object
59
- * - 非原始值(对象/数组等)会被自动 stringify 成 string
60
- * - 最终会把 fields 展开成 CLS 的 content(key/value 都会转成 string)
61
- */
62
- put(fields: FlatFields, options?: PutOptions): void;
63
- private putAsync;
64
- /**
65
- * 直接上报:把 data 序列化后放入指定 key(默认 “日志内容”)
66
- */
67
- putJson(data: unknown, clsLoggerKey?: string, options?: PutOptions): void;
68
- /**
69
- * 入队:写入 localStorage 队列;达到 batchSize 自动 flush
70
- * - 埋点入参必须是一维(扁平)Object,非原始值会被 stringify
71
- */
72
- enqueue(fields: FlatFields, options?: PutOptions): void;
73
- /**
74
- * 从 localStorage 读取队列并批量上报
75
- */
76
- flush(): void;
77
- /**
78
- * 批量上报(每条 item.data 展开为 log content)
79
- */
80
- putBatch(queue: QueueItem[]): void;
81
- private putBatchAsync;
82
- /**
83
- * 参考《一、概述》:统一上报入口(内存队列 + 批量发送)
84
- */
85
- report(log: ReportLog): void;
86
- private getDesiredBatchFlushDueAt;
87
- info(message: string, data?: FlatFields): void;
88
- warn(message: string, data?: FlatFields): void;
89
- error(message: string, data?: FlatFields): void;
90
- track(trackType: string, data?: FlatFields): void;
91
- /**
92
- * 立即发送内存队列
93
- */
94
- flushBatch(): Promise<void>;
95
- private buildReportFields;
96
- private sendReportLogs;
97
- private retrySendReportLogs;
98
- private cacheFailedReportLogs;
99
- flushFailed(): void;
100
- /**
101
- * 统计/计数类日志:按字段展开上报(若 data 为空默认 1)
102
- */
103
- stat(param: {
104
- pageName: string;
105
- scene: string;
106
- subScene: string;
107
- data?: number | string;
108
- }): void;
1
+ import { ClsLoggerCore } from './ClsLoggerCore';
2
+ import type { ClsSdkModule } from './clsSdkTypes';
3
+ /**
4
+ * 兼容版 ClsLogger(默认入口)
5
+ * - 保留了自动识别环境 + 动态 import 的逻辑
6
+ * - 如果业务想瘦身,建议改用 @be-link/cls-logger/web 或 /mini
7
+ */
8
+ export declare class ClsLogger extends ClsLoggerCore {
9
+ protected loadSdk(): Promise<ClsSdkModule>;
109
10
  }
110
11
  //# sourceMappingURL=ClsLogger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClsLogger.d.ts","sourceRoot":"","sources":["../src/ClsLogger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClsLogger.d.ts","sourceRoot":"","sources":["../src/ClsLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,aAAa;cAC1B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;CA8EjD"}
@@ -0,0 +1,127 @@
1
+ import type { ClsLoggerInitOptions, EnvType, FlatFields, PutOptions, QueueItem, ReportLog } from './types';
2
+ import type { ClsSdkModule } from './clsSdkTypes';
3
+ /**
4
+ * CLS Logger 核心基类
5
+ * - 负责所有上报、队列、监控逻辑
6
+ * - 不包含具体的 SDK 加载实现(由子类负责)
7
+ * - 这样可以把 web/mini 的 SDK 依赖彻底解耦到子入口
8
+ */
9
+ export declare abstract class ClsLoggerCore {
10
+ protected sdk: ClsSdkModule | null;
11
+ protected sdkPromise: Promise<ClsSdkModule> | null;
12
+ protected sdkOverride: unknown | null;
13
+ protected sdkLoaderOverride: (() => unknown | Promise<unknown>) | null;
14
+ protected client: {
15
+ PutLogs: (request: unknown) => Promise<unknown> | unknown;
16
+ } | null;
17
+ protected clientPromise: Promise<{
18
+ PutLogs: (request: unknown) => Promise<unknown> | unknown;
19
+ }> | null;
20
+ protected topicId: string | null;
21
+ protected endpoint: string;
22
+ protected retryTimes: number;
23
+ protected source: string;
24
+ protected projectId: string;
25
+ protected projectName: string;
26
+ protected appId: string;
27
+ protected appVersion: string;
28
+ protected envType: EnvType;
29
+ protected userGenerateBaseFields: (() => FlatFields) | null;
30
+ protected autoGenerateBaseFields: (() => FlatFields) | null;
31
+ protected storageKey: string;
32
+ protected batchSize: number;
33
+ protected memoryQueue: ReportLog[];
34
+ protected batchMaxSize: number;
35
+ protected batchIntervalMs: number;
36
+ protected batchTimer: ReturnType<typeof setTimeout> | null;
37
+ protected batchTimerDueAt: number | null;
38
+ protected initTs: number;
39
+ protected startupDelayMs: number;
40
+ protected failedCacheKey: string;
41
+ protected failedCacheMax: number;
42
+ protected requestMonitorStarted: boolean;
43
+ protected errorMonitorStarted: boolean;
44
+ protected performanceMonitorStarted: boolean;
45
+ protected behaviorMonitorStarted: boolean;
46
+ protected behaviorMonitorCleanup: (() => void) | null;
47
+ userId: unknown;
48
+ userName: unknown;
49
+ /**
50
+ * 子类必须实现此方法来加载 SDK
51
+ */
52
+ protected abstract loadSdk(): Promise<ClsSdkModule>;
53
+ /**
54
+ * 子类可按需重写(默认检测 wx)
55
+ */
56
+ protected detectEnvType(): EnvType;
57
+ init(options: ClsLoggerInitOptions): void;
58
+ private getBaseFields;
59
+ private startRequestMonitor;
60
+ private startErrorMonitor;
61
+ private startPerformanceMonitor;
62
+ private startBehaviorMonitor;
63
+ /**
64
+ * 停止行为埋点监听(PV/UV/点击)
65
+ * - 如需重启:可再次调用 init(或自行调用 init 后的默认启动逻辑)
66
+ */
67
+ stopBehaviorMonitor(): void;
68
+ /**
69
+ * 获取 CLS client(按环境懒加载 SDK)
70
+ */
71
+ getInstance(): Promise<{
72
+ PutLogs: (request: unknown) => Promise<unknown> | unknown;
73
+ }>;
74
+ /**
75
+ * 直接上报:埋点入参必须是一维(扁平)Object
76
+ * - 非原始值(对象/数组等)会被自动 stringify 成 string
77
+ * - 最终会把 fields 展开成 CLS 的 content(key/value 都会转成 string)
78
+ */
79
+ put(fields: FlatFields, options?: PutOptions): void;
80
+ private putAsync;
81
+ /**
82
+ * 直接上报:把 data 序列化后放入指定 key(默认 “日志内容”)
83
+ */
84
+ putJson(data: unknown, clsLoggerKey?: string, options?: PutOptions): void;
85
+ /**
86
+ * 入队:写入 localStorage 队列;达到 batchSize 自动 flush
87
+ * - 埋点入参必须是一维(扁平)Object,非原始值会被 stringify
88
+ */
89
+ enqueue(fields: FlatFields, options?: PutOptions): void;
90
+ /**
91
+ * 从 localStorage 读取队列并批量上报
92
+ */
93
+ flush(): void;
94
+ /**
95
+ * 批量上报(每条 item.data 展开为 log content)
96
+ */
97
+ putBatch(queue: QueueItem[]): void;
98
+ private putBatchAsync;
99
+ /**
100
+ * 参考《一、概述》:统一上报入口(内存队列 + 批量发送)
101
+ */
102
+ report(log: ReportLog): void;
103
+ private getDesiredBatchFlushDueAt;
104
+ info(message: string, data?: FlatFields): void;
105
+ warn(message: string, data?: FlatFields): void;
106
+ error(message: string, data?: FlatFields): void;
107
+ track(trackType: string, data?: FlatFields): void;
108
+ /**
109
+ * 立即发送内存队列
110
+ */
111
+ flushBatch(): Promise<void>;
112
+ private buildReportFields;
113
+ private sendReportLogs;
114
+ private retrySendReportLogs;
115
+ private cacheFailedReportLogs;
116
+ flushFailed(): void;
117
+ /**
118
+ * 统计/计数类日志:按字段展开上报(若 data 为空默认 1)
119
+ */
120
+ stat(param: {
121
+ pageName: string;
122
+ scene: string;
123
+ subScene: string;
124
+ data?: number | string;
125
+ }): void;
126
+ }
127
+ //# sourceMappingURL=ClsLoggerCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClsLoggerCore.d.ts","sourceRoot":"","sources":["../src/ClsLoggerCore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ClsLoggerCore } from './ClsLoggerCore';
2
+ import type { ClsSdkModule } from './clsSdkTypes';
3
+ export declare class ClsLoggerMini extends ClsLoggerCore {
4
+ protected envType: import('./types').EnvType;
5
+ protected loadSdk(): Promise<ClsSdkModule>;
6
+ private normalize;
7
+ }
8
+ //# sourceMappingURL=ClsLoggerMini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClsLoggerMini.d.ts","sourceRoot":"","sources":["../src/ClsLoggerMini.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,qBAAa,aAAc,SAAQ,aAAa;IAC9C,SAAS,CAAC,OAAO,EAAE,OAAO,SAAS,EAAE,OAAO,CAAiB;cAE7C,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAkBhD,OAAO,CAAC,SAAS;CAYlB"}
@@ -0,0 +1,8 @@
1
+ import { ClsLoggerCore } from './ClsLoggerCore';
2
+ import type { ClsSdkModule } from './clsSdkTypes';
3
+ export declare class ClsLoggerWeb extends ClsLoggerCore {
4
+ protected envType: import('./types').EnvType;
5
+ protected loadSdk(): Promise<ClsSdkModule>;
6
+ private normalize;
7
+ }
8
+ //# sourceMappingURL=ClsLoggerWeb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClsLoggerWeb.d.ts","sourceRoot":"","sources":["../src/ClsLoggerWeb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,qBAAa,YAAa,SAAQ,aAAa;IAC7C,SAAS,CAAC,OAAO,EAAE,OAAO,SAAS,EAAE,OAAO,CAAa;cAEzC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAahD,OAAO,CAAC,SAAS;CASlB"}
@@ -0,0 +1,18 @@
1
+ export type ClsSdkModule = {
2
+ AsyncClient: new (options: {
3
+ endpoint: string;
4
+ retry_times?: number;
5
+ }) => {
6
+ PutLogs: (request: unknown) => Promise<unknown> | unknown;
7
+ };
8
+ Log: new (time: number) => {
9
+ addContent: (k: string, v: string) => void;
10
+ };
11
+ LogGroup: new (source: string) => {
12
+ setSource: (source: string) => void;
13
+ addLog: (log: unknown) => void;
14
+ getLogs: () => unknown[];
15
+ };
16
+ PutLogsRequest: new (topicId: string, logGroup: unknown) => unknown;
17
+ };
18
+ //# sourceMappingURL=clsSdkTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clsSdkTypes.d.ts","sourceRoot":"","sources":["../src/clsSdkTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,KAAK,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK;QACxE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;KAC3D,CAAC;IACF,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK;QAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IAC1E,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK;QAChC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QACpC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/B,OAAO,EAAE,MAAM,OAAO,EAAE,CAAC;KAC1B,CAAC;IACF,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC;CACrE,CAAC"}
package/dist/index.esm.js CHANGED
@@ -1894,27 +1894,6 @@ function createAutoDeviceInfoBaseFields(envType, opts) {
1894
1894
  };
1895
1895
  }
1896
1896
 
1897
- function readGlobal(key) {
1898
- try {
1899
- const g = globalThis;
1900
- return g[key] ?? null;
1901
- }
1902
- catch {
1903
- return null;
1904
- }
1905
- }
1906
- function tryRequire(moduleName) {
1907
- try {
1908
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
1909
- const req = (typeof require === 'function' ? require : null);
1910
- if (!req)
1911
- return null;
1912
- return req(moduleName);
1913
- }
1914
- catch {
1915
- return null;
1916
- }
1917
- }
1918
1897
  function enterClsSendingGuard() {
1919
1898
  const g = globalThis;
1920
1899
  const next = (g.__beLinkClsLoggerSendingCount__ ?? 0) + 1;
@@ -1924,10 +1903,18 @@ function enterClsSendingGuard() {
1924
1903
  g.__beLinkClsLoggerSendingCount__ = cur > 0 ? cur - 1 : 0;
1925
1904
  };
1926
1905
  }
1927
- class ClsLogger {
1906
+ /**
1907
+ * CLS Logger 核心基类
1908
+ * - 负责所有上报、队列、监控逻辑
1909
+ * - 不包含具体的 SDK 加载实现(由子类负责)
1910
+ * - 这样可以把 web/mini 的 SDK 依赖彻底解耦到子入口
1911
+ */
1912
+ class ClsLoggerCore {
1928
1913
  constructor() {
1929
1914
  this.sdk = null;
1930
1915
  this.sdkPromise = null;
1916
+ this.sdkOverride = null;
1917
+ this.sdkLoaderOverride = null;
1931
1918
  this.client = null;
1932
1919
  this.clientPromise = null;
1933
1920
  this.topicId = null;
@@ -1960,6 +1947,15 @@ class ClsLogger {
1960
1947
  this.behaviorMonitorStarted = false;
1961
1948
  this.behaviorMonitorCleanup = null;
1962
1949
  }
1950
+ /**
1951
+ * 子类可按需重写(默认检测 wx)
1952
+ */
1953
+ detectEnvType() {
1954
+ const wxAny = globalThis.wx;
1955
+ if (wxAny && typeof wxAny.getSystemInfoSync === 'function')
1956
+ return 'miniprogram';
1957
+ return 'browser';
1958
+ }
1963
1959
  init(options) {
1964
1960
  this.initTs = Date.now();
1965
1961
  const topicId = options?.tencentCloud?.topicID ?? options?.topic_id ?? options?.topicID ?? this.topicId ?? null;
@@ -1995,6 +1991,9 @@ class ClsLogger {
1995
1991
  this.appId = options.appId ?? this.appId;
1996
1992
  this.appVersion = options.appVersion ?? this.appVersion;
1997
1993
  this.envType = nextEnvType;
1994
+ // 可选:外部注入 SDK(优先级:sdkLoader > sdk)
1995
+ this.sdkLoaderOverride = options.sdkLoader ?? this.sdkLoaderOverride;
1996
+ this.sdkOverride = options.sdk ?? this.sdkOverride;
1998
1997
  this.userGenerateBaseFields = options.generateBaseFields ?? this.userGenerateBaseFields;
1999
1998
  this.autoGenerateBaseFields = createAutoDeviceInfoBaseFields(this.envType, options.deviceInfo);
2000
1999
  this.storageKey = options.storageKey ?? this.storageKey;
@@ -2113,8 +2112,6 @@ class ClsLogger {
2113
2112
  }
2114
2113
  /**
2115
2114
  * 获取 CLS client(按环境懒加载 SDK)
2116
- * - browser: 优先走 UMD 全局变量 `tencentcloudClsSdkJsWeb`
2117
- * - miniprogram: 优先走 require(webpack/taro 可解析),否则 fallback import()
2118
2115
  */
2119
2116
  async getInstance() {
2120
2117
  if (this.client)
@@ -2137,51 +2134,6 @@ class ClsLogger {
2137
2134
  });
2138
2135
  return this.clientPromise;
2139
2136
  }
2140
- async loadSdk() {
2141
- if (this.sdk)
2142
- return this.sdk;
2143
- if (this.sdkPromise)
2144
- return this.sdkPromise;
2145
- const isMini = this.envType === 'miniprogram';
2146
- const moduleName = isMini ? 'tencentcloud-cls-sdk-js-mini' : 'tencentcloud-cls-sdk-js-web';
2147
- // UMD(浏览器脚本)优先读全局变量
2148
- if (!isMini) {
2149
- const g = readGlobal('tencentcloudClsSdkJsWeb');
2150
- if (g?.AsyncClient && g?.Log && g?.LogGroup && g?.PutLogsRequest) {
2151
- this.sdk = g;
2152
- return this.sdk;
2153
- }
2154
- }
2155
- // 尽量同步 require(小程序/webpack 里最稳),失败再走 import()
2156
- const reqMod = tryRequire(moduleName);
2157
- if (reqMod?.AsyncClient && reqMod?.Log && reqMod?.LogGroup && reqMod?.PutLogsRequest) {
2158
- this.sdk = reqMod;
2159
- return this.sdk;
2160
- }
2161
- this.sdkPromise = import(moduleName)
2162
- .then((m) => {
2163
- const mod = (m?.default && m.default.AsyncClient ? m.default : m);
2164
- const sdk = {
2165
- AsyncClient: mod.AsyncClient,
2166
- Log: mod.Log,
2167
- LogGroup: mod.LogGroup,
2168
- PutLogsRequest: mod.PutLogsRequest,
2169
- };
2170
- this.sdk = sdk;
2171
- return sdk;
2172
- })
2173
- .catch((err) => {
2174
- this.sdkPromise = null;
2175
- throw err;
2176
- });
2177
- return this.sdkPromise;
2178
- }
2179
- detectEnvType() {
2180
- const wxAny = globalThis.wx;
2181
- if (wxAny && typeof wxAny.getSystemInfoSync === 'function')
2182
- return 'miniprogram';
2183
- return 'browser';
2184
- }
2185
2137
  /**
2186
2138
  * 直接上报:埋点入参必须是一维(扁平)Object
2187
2139
  * - 非原始值(对象/数组等)会被自动 stringify 成 string
@@ -2524,6 +2476,122 @@ class ClsLogger {
2524
2476
  }
2525
2477
  }
2526
2478
 
2479
+ function readGlobal(key) {
2480
+ try {
2481
+ const g = globalThis;
2482
+ return g[key] ?? null;
2483
+ }
2484
+ catch {
2485
+ return null;
2486
+ }
2487
+ }
2488
+ function tryRequire(moduleName) {
2489
+ try {
2490
+ // 说明:
2491
+ // - ESM 构建(exports.import/module)里通常不存在模块作用域的 require
2492
+ // - 一些小程序运行时/构建链路会把 require 挂到 globalThis 上
2493
+ // 因此这里同时探测“模块作用域 require”与 “globalThis.require”
2494
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
2495
+ const localReq = (typeof require === 'function' ? require : null);
2496
+ const globalReq = readGlobal('require');
2497
+ const candidates = [localReq, globalReq].filter((fn) => typeof fn === 'function');
2498
+ for (const fn of candidates) {
2499
+ try {
2500
+ return fn(moduleName);
2501
+ }
2502
+ catch {
2503
+ // continue
2504
+ }
2505
+ }
2506
+ return null;
2507
+ }
2508
+ catch {
2509
+ return null;
2510
+ }
2511
+ }
2512
+
2513
+ /**
2514
+ * 兼容版 ClsLogger(默认入口)
2515
+ * - 保留了自动识别环境 + 动态 import 的逻辑
2516
+ * - 如果业务想瘦身,建议改用 @be-link/cls-logger/web 或 /mini
2517
+ */
2518
+ class ClsLogger extends ClsLoggerCore {
2519
+ async loadSdk() {
2520
+ if (this.sdk)
2521
+ return this.sdk;
2522
+ if (this.sdkPromise)
2523
+ return this.sdkPromise;
2524
+ const normalizeSdk = (m) => {
2525
+ const mod = (m?.default && m.default.AsyncClient ? m.default : m);
2526
+ if (mod?.AsyncClient && mod?.Log && mod?.LogGroup && mod?.PutLogsRequest) {
2527
+ return {
2528
+ AsyncClient: mod.AsyncClient,
2529
+ Log: mod.Log,
2530
+ LogGroup: mod.LogGroup,
2531
+ PutLogsRequest: mod.PutLogsRequest,
2532
+ };
2533
+ }
2534
+ return null;
2535
+ };
2536
+ // 1) 外部注入的 loader(最高优先级)
2537
+ if (this.sdkLoaderOverride) {
2538
+ try {
2539
+ const loaded = await this.sdkLoaderOverride();
2540
+ const sdk = normalizeSdk(loaded);
2541
+ if (sdk) {
2542
+ this.sdk = sdk;
2543
+ return sdk;
2544
+ }
2545
+ }
2546
+ catch {
2547
+ // ignore and fallback
2548
+ }
2549
+ }
2550
+ // 2) 外部直接注入的 sdk
2551
+ if (this.sdkOverride) {
2552
+ const sdk = normalizeSdk(this.sdkOverride);
2553
+ if (sdk) {
2554
+ this.sdk = sdk;
2555
+ return sdk;
2556
+ }
2557
+ }
2558
+ const isMini = this.envType === 'miniprogram';
2559
+ // 静态字面量,方便打包器识别(但在此兼容入口里,仍然可能被一起分析)
2560
+ const WEB_SDK = 'tencentcloud-cls-sdk-js-web';
2561
+ const MINI_SDK = 'tencentcloud-cls-sdk-js-mini';
2562
+ // UMD(浏览器脚本)优先读全局变量
2563
+ if (!isMini) {
2564
+ const g = readGlobal('tencentcloudClsSdkJsWeb');
2565
+ const sdk = normalizeSdk(g);
2566
+ if (sdk) {
2567
+ this.sdk = sdk;
2568
+ return sdk;
2569
+ }
2570
+ }
2571
+ // 尽量同步 require
2572
+ const reqMod = tryRequire(isMini ? MINI_SDK : WEB_SDK);
2573
+ const reqSdk = normalizeSdk(reqMod);
2574
+ if (reqSdk) {
2575
+ this.sdk = reqSdk;
2576
+ return reqSdk;
2577
+ }
2578
+ // 动态 import
2579
+ this.sdkPromise = (isMini ? import(MINI_SDK) : import(WEB_SDK))
2580
+ .then((m) => {
2581
+ const sdk = normalizeSdk(m);
2582
+ if (!sdk)
2583
+ throw new Error(`ClsLogger.loadSdk: invalid sdk module for ${isMini ? MINI_SDK : WEB_SDK}`);
2584
+ this.sdk = sdk;
2585
+ return sdk;
2586
+ })
2587
+ .catch((err) => {
2588
+ this.sdkPromise = null;
2589
+ throw err;
2590
+ });
2591
+ return this.sdkPromise;
2592
+ }
2593
+ }
2594
+
2527
2595
  const clsLogger = new ClsLogger();
2528
2596
 
2529
2597
  export { ClsLogger, clsLogger, clsLogger as default };