@pluve/logger-sdk 0.0.1 → 0.0.2

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.
Files changed (41) hide show
  1. package/README.md +195 -76
  2. package/dist/cjs/index.d.ts +5 -0
  3. package/dist/cjs/index.js +14 -2
  4. package/dist/cjs/loggerSDK.d.ts +27 -20
  5. package/dist/cjs/loggerSDK.js +86 -354
  6. package/dist/cjs/transportAdapter.d.ts +51 -5
  7. package/dist/cjs/transportAdapter.js +133 -60
  8. package/dist/cjs/types.d.ts +37 -26
  9. package/dist/cjs/utils.d.ts +27 -2
  10. package/dist/cjs/utils.js +151 -12
  11. package/dist/esm/index.d.ts +5 -0
  12. package/dist/esm/index.js +4 -2
  13. package/dist/esm/loggerSDK.d.ts +27 -20
  14. package/dist/esm/loggerSDK.js +141 -674
  15. package/dist/esm/transportAdapter.d.ts +51 -5
  16. package/dist/esm/transportAdapter.js +260 -111
  17. package/dist/esm/types.d.ts +37 -26
  18. package/dist/esm/utils.d.ts +27 -2
  19. package/dist/esm/utils.js +190 -14
  20. package/dist/umd/logger-sdk.min.js +1 -1
  21. package/lib/dbQueue.js +133 -0
  22. package/lib/index.d.ts +1 -0
  23. package/lib/index.js +9 -0
  24. package/lib/loggerSDK.d.ts +29 -0
  25. package/lib/loggerSDK.js +571 -0
  26. package/lib/storeAdapter.js +99 -0
  27. package/lib/transportAdapter.d.ts +66 -0
  28. package/lib/transportAdapter.js +406 -0
  29. package/lib/types.d.ts +35 -0
  30. package/lib/types.js +1 -0
  31. package/lib/utils.d.ts +5 -0
  32. package/lib/utils.js +50 -0
  33. package/package.json +8 -2
  34. package/dist/cjs/dbQueue.js +0 -88
  35. package/dist/cjs/storeAdapter.js +0 -64
  36. package/dist/esm/dbQueue.d.ts +0 -10
  37. package/dist/esm/dbQueue.js +0 -194
  38. package/dist/esm/storeAdapter.d.ts +0 -7
  39. package/dist/esm/storeAdapter.js +0 -139
  40. /package/{dist/cjs → lib}/dbQueue.d.ts +0 -0
  41. /package/{dist/cjs → lib}/storeAdapter.d.ts +0 -0
@@ -19,91 +19,164 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // src/transportAdapter.ts
20
20
  var transportAdapter_exports = {};
21
21
  __export(transportAdapter_exports, {
22
- defaultTransport: () => defaultTransport
22
+ TransportAdapters: () => TransportAdapters,
23
+ beaconTransport: () => beaconTransport,
24
+ defaultTransport: () => defaultTransport,
25
+ imageTransport: () => imageTransport,
26
+ wechatTransport: () => wechatTransport
23
27
  });
24
28
  module.exports = __toCommonJS(transportAdapter_exports);
25
29
  var import_utils = require("./utils");
26
- async function defaultTransport(payload, opts) {
27
- var _a;
28
- const body = typeof payload === "string" ? payload : (0, import_utils.safeStringify)(payload);
29
- const timeout = (opts == null ? void 0 : opts.timeout) || 1e4;
30
- const endpoint = opts && opts.endpoint ? opts.endpoint : ((_a = opts.endpoints) == null ? void 0 : _a.default) || "";
31
- if ((0, import_utils.isBrowser)() && typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function" && (opts == null ? void 0 : opts.useBeacon)) {
30
+ function getEndpoint(opts) {
31
+ return (opts == null ? void 0 : opts.endpoint) || "";
32
+ }
33
+ var beaconTransport = {
34
+ name: "beacon",
35
+ isSupported() {
36
+ return (0, import_utils.isBrowser)() && typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function";
37
+ },
38
+ async send(payload, opts) {
39
+ const body = typeof payload === "string" ? payload : (0, import_utils.safeStringify)(payload);
40
+ const endpoint = getEndpoint(opts);
32
41
  const blob = new Blob([body], { type: "application/json" });
33
- const ok = navigator.sendBeacon(endpoint || "", blob);
34
- if (ok)
35
- return Promise.resolve();
36
- return Promise.reject(new Error("sendBeacon failed"));
42
+ const success = navigator.sendBeacon(endpoint, blob);
43
+ if (!success) {
44
+ throw new Error("sendBeacon failed (queue full or other error)");
45
+ }
37
46
  }
38
- if ((0, import_utils.isWeChatMiniProgram)()) {
47
+ };
48
+ var wechatTransport = {
49
+ name: "wechat",
50
+ isSupported() {
51
+ return (0, import_utils.isWeChatMiniProgram)();
52
+ },
53
+ async send(payload, opts) {
54
+ const body = typeof payload === "string" ? payload : (0, import_utils.safeStringify)(payload);
55
+ const endpoint = getEndpoint(opts);
56
+ const timeout = 1e4;
39
57
  return new Promise((resolve, reject) => {
40
- let timer = null;
58
+ let timeoutId = null;
59
+ let settled = false;
60
+ timeoutId = setTimeout(() => {
61
+ if (!settled) {
62
+ settled = true;
63
+ reject(new Error(`WeChat request timeout after ${timeout}ms`));
64
+ }
65
+ }, timeout);
41
66
  wx.request({
42
- url: endpoint || "",
67
+ url: endpoint,
43
68
  method: "POST",
44
69
  data: body,
45
- header: { "Content-Type": "application/json", ...opts && opts.globalHeaders ? opts.globalHeaders : {} },
46
- success() {
47
- if (timer)
48
- clearTimeout(timer);
49
- resolve();
70
+ header: {
71
+ "Content-Type": "application/json"
72
+ },
73
+ success(res) {
74
+ if (timeoutId)
75
+ clearTimeout(timeoutId);
76
+ if (!settled) {
77
+ settled = true;
78
+ if (res.statusCode >= 200 && res.statusCode < 300) {
79
+ resolve();
80
+ } else {
81
+ reject(new Error(`HTTP ${res.statusCode}`));
82
+ }
83
+ }
50
84
  },
51
85
  fail(err) {
52
- if (timer)
53
- clearTimeout(timer);
54
- reject(err);
86
+ if (timeoutId)
87
+ clearTimeout(timeoutId);
88
+ if (!settled) {
89
+ settled = true;
90
+ reject(new Error(`WeChat request failed: ${err.errMsg || "unknown error"}`));
91
+ }
55
92
  }
56
93
  });
57
- timer = setTimeout(() => reject(new Error("timeout")), timeout);
58
94
  });
59
95
  }
60
- if ((0, import_utils.isBrowser)() && (opts == null ? void 0 : opts.usePixel)) {
96
+ };
97
+ var imageTransport = {
98
+ name: "image",
99
+ isSupported() {
100
+ return (0, import_utils.isBrowser)() && typeof Image !== "undefined";
101
+ },
102
+ async send(payload, opts) {
103
+ const body = typeof payload === "string" ? payload : (0, import_utils.safeStringify)(payload);
104
+ const endpoint = getEndpoint(opts);
61
105
  const param = (opts == null ? void 0 : opts.pixelParam) || "data";
106
+ const maxLen = (opts == null ? void 0 : opts.maxPixelUrlLen) || 1900;
62
107
  const cacheBuster = `_=${(0, import_utils.now)()}`;
63
- const urlBase = endpoint || "";
64
108
  const qs = `${param}=${encodeURIComponent(body)}&${cacheBuster}`;
65
- const url = urlBase.includes("?") ? `${urlBase}&${qs}` : `${urlBase}?${qs}`;
66
- const maxLen = (opts == null ? void 0 : opts.maxPixelUrlLen) || 1900;
109
+ const url = endpoint.includes("?") ? `${endpoint}&${qs}` : `${endpoint}?${qs}`;
67
110
  if (url.length > maxLen) {
68
- } else {
111
+ throw new Error(`URL too long (${url.length} > ${maxLen})`);
112
+ }
113
+ return new Promise((resolve, reject) => {
69
114
  const img = new Image();
70
- return new Promise((resolve, reject) => {
71
- let timer = null;
72
- img.onload = () => {
73
- if (timer)
74
- clearTimeout(timer);
115
+ let timeoutId = null;
116
+ let settled = false;
117
+ timeoutId = setTimeout(() => {
118
+ if (!settled) {
119
+ settled = true;
120
+ img.src = "";
121
+ reject(new Error("Image request timeout after 5000ms"));
122
+ }
123
+ }, 5e3);
124
+ img.onload = () => {
125
+ if (timeoutId)
126
+ clearTimeout(timeoutId);
127
+ if (!settled) {
128
+ settled = true;
75
129
  resolve();
76
- };
77
- img.onerror = () => {
78
- if (timer)
79
- clearTimeout(timer);
80
- reject(new Error("pixel error"));
81
- };
82
- timer = setTimeout(() => reject(new Error("timeout")), timeout);
83
- img.src = url;
84
- });
130
+ }
131
+ };
132
+ img.onerror = () => {
133
+ if (timeoutId)
134
+ clearTimeout(timeoutId);
135
+ if (!settled) {
136
+ settled = true;
137
+ reject(new Error("Image request failed"));
138
+ }
139
+ };
140
+ img.src = url;
141
+ });
142
+ }
143
+ };
144
+ async function defaultTransport(payload, opts) {
145
+ if ((0, import_utils.isWeChatMiniProgram)()) {
146
+ if (wechatTransport.isSupported(opts)) {
147
+ await wechatTransport.send(payload, opts);
148
+ return;
85
149
  }
86
150
  }
87
- if (typeof fetch === "function") {
88
- const controller = typeof AbortController !== "undefined" ? new AbortController() : null;
89
- if (controller)
90
- setTimeout(() => controller.abort(), timeout);
91
- return fetch(endpoint || "", {
92
- method: "POST",
93
- headers: { "Content-Type": "application/json", ...opts && opts.globalHeaders ? opts.globalHeaders : {}, ...opts && opts.headers ? opts.headers : {} },
94
- body,
95
- // 在页面关闭场景提供尽力传输能力(非标准环境忽略)
96
- // @ts-ignore
97
- keepalive: (opts == null ? void 0 : opts.useBeacon) ? true : void 0,
98
- signal: controller ? controller.signal : void 0
99
- }).then((res) => {
100
- if (!res.ok)
101
- throw new Error("network response not ok");
102
- });
151
+ const transports = [beaconTransport, imageTransport];
152
+ const adapter = transports.find((t) => t.isSupported(opts));
153
+ if (!adapter) {
154
+ throw new Error("No supported transport adapter available");
155
+ }
156
+ try {
157
+ await adapter.send(payload, opts);
158
+ } catch (error) {
159
+ if (adapter.name === "beacon" && imageTransport.isSupported(opts)) {
160
+ try {
161
+ await imageTransport.send(payload, opts);
162
+ return;
163
+ } catch (imgError) {
164
+ throw error;
165
+ }
166
+ }
167
+ throw error;
103
168
  }
104
- return Promise.reject(new Error("no transport available"));
105
169
  }
170
+ var TransportAdapters = {
171
+ beacon: beaconTransport,
172
+ wechat: wechatTransport,
173
+ image: imageTransport
174
+ };
106
175
  // Annotate the CommonJS export names for ESM import in node:
107
176
  0 && (module.exports = {
108
- defaultTransport
177
+ TransportAdapters,
178
+ beaconTransport,
179
+ defaultTransport,
180
+ imageTransport,
181
+ wechatTransport
109
182
  });
@@ -1,35 +1,46 @@
1
- export type Env = 'h5' | 'wechat' | 'unknown';
2
- export type LogEventType = 'event' | 'error' | 'pageview' | 'perf' | 'custom';
3
- export type LogEventLevel = 'info' | 'warn' | 'error' | 'debug';
1
+ /** 环境类型 */
2
+ export type Env = 'prod' | 'stage' | 'dev';
3
+ /** 事件类型 */
4
+ export type LogEventType = 'error' | 'crash' | 'pageview' | 'custom';
5
+ /** 日志级别 */
6
+ export type LogEventLevel = 'info' | 'warn' | 'error' | 'fatal';
7
+ /** SDK 配置选项 */
4
8
  export interface SDKOptions {
5
- endpoints: Partial<Record<'info' | 'warn' | 'error' | 'default', string>>;
9
+ /** 上报端点 URL */
10
+ endpoint: string;
11
+ /** 应用 ID */
6
12
  appId?: string;
13
+ /** 环境标识 */
7
14
  env?: Env;
8
- batchSize?: number;
9
- flushInterval?: number;
10
- retryCount?: number;
11
- retryBase?: number;
12
- storageKey?: string;
13
- maxCacheSize?: number;
14
- timeout?: number;
15
+ /** 是否开启调试模式 */
15
16
  debug?: boolean;
16
- transport?: (payload: any, opts?: SDKOptions & {
17
- endpoint?: string;
18
- headers?: Record<string, string>;
19
- }) => Promise<void>;
20
- globalHeaders?: Record<string, string>;
21
- enableAutoPV?: boolean;
22
- enablePerf?: boolean;
23
- useBeacon?: boolean;
24
- usePixel?: boolean;
17
+ /** 像素上报参数名,默认 'data' */
25
18
  pixelParam?: string;
19
+ /** 像素上报 URL 最大长度,默认 1900 */
26
20
  maxPixelUrlLen?: number;
27
21
  }
22
+ /** 标准化日志上报格式 */
28
23
  export interface LogEvent {
29
- type: LogEventType;
30
- time: number;
31
- user?: Record<string, any>;
32
- ctx?: Record<string, any>;
33
- level?: LogEventLevel;
34
- seq?: number;
24
+ /** 事件类型:error/crash/pageview/custom */
25
+ eventType: LogEventType;
26
+ /** 毫秒时间戳 */
27
+ ts: number;
28
+ /** 应用标识 */
29
+ appId: string;
30
+ /** 环境标识:prod/stage/dev */
31
+ env: Env;
32
+ /** 日志级别:info/warn/error/fatal */
33
+ level: LogEventLevel;
34
+ /** 摘要信息 */
35
+ message: string;
36
+ /** 可选:堆栈信息(长字符串) */
37
+ stack?: string;
38
+ /** 发生页面 URL */
39
+ url: string;
40
+ /** 可选:用户 ID(脱敏) */
41
+ userId?: string;
42
+ /** 会话标识 */
43
+ sessionId: string;
44
+ /** 可选的结构化额外信息 */
45
+ tags?: Record<string, any>;
35
46
  }
@@ -1,5 +1,30 @@
1
1
  export declare const now: () => number;
2
- export declare function isWeChatMiniProgram(): boolean;
3
2
  export declare function isBrowser(): boolean;
3
+ export declare function isWeChatMiniProgram(): boolean;
4
4
  export declare function safeStringify(obj: any): string;
5
- export declare function isIndexedDBAvailable(): boolean;
5
+ export declare function getSessionId(): string;
6
+ export declare function getCurrentUrl(): string;
7
+ /** 平台类型 */
8
+ export type PlatformType = 'browser' | 'wechat' | 'unknown';
9
+ /** 环境信息 */
10
+ export interface EnvironmentInfo {
11
+ platform: PlatformType;
12
+ userAgent?: string;
13
+ screenWidth?: number;
14
+ screenHeight?: number;
15
+ language?: string;
16
+ systemInfo?: any;
17
+ }
18
+ /**
19
+ * 获取环境信息
20
+ */
21
+ export declare function getEnvironmentInfo(): EnvironmentInfo;
22
+ /**
23
+ * 解析浏览器信息
24
+ */
25
+ export declare function parseBrowserInfo(userAgent: string): {
26
+ browser: string;
27
+ browserVersion: string;
28
+ os: string;
29
+ osVersion: string;
30
+ };
package/dist/cjs/utils.js CHANGED
@@ -19,31 +19,34 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // src/utils.ts
20
20
  var utils_exports = {};
21
21
  __export(utils_exports, {
22
+ getCurrentUrl: () => getCurrentUrl,
23
+ getEnvironmentInfo: () => getEnvironmentInfo,
24
+ getSessionId: () => getSessionId,
22
25
  isBrowser: () => isBrowser,
23
- isIndexedDBAvailable: () => isIndexedDBAvailable,
24
26
  isWeChatMiniProgram: () => isWeChatMiniProgram,
25
27
  now: () => now,
28
+ parseBrowserInfo: () => parseBrowserInfo,
26
29
  safeStringify: () => safeStringify
27
30
  });
28
31
  module.exports = __toCommonJS(utils_exports);
29
32
  var now = () => Date.now();
30
- function isWeChatMiniProgram() {
33
+ function isBrowser() {
31
34
  try {
32
- return typeof wx !== "undefined" && typeof wx.request === "function";
35
+ return typeof window !== "undefined" && typeof window.document !== "undefined";
33
36
  } catch (e) {
34
37
  return false;
35
38
  }
36
39
  }
37
- function isBrowser() {
40
+ function isWeChatMiniProgram() {
38
41
  try {
39
- return typeof window !== "undefined" && typeof window.document !== "undefined";
42
+ return typeof wx !== "undefined" && typeof wx.getSystemInfo === "function";
40
43
  } catch (e) {
41
44
  return false;
42
45
  }
43
46
  }
44
47
  function safeStringify(obj) {
45
48
  const seen = /* @__PURE__ */ new WeakSet();
46
- return JSON.stringify(obj, function(_k, v) {
49
+ return JSON.stringify(obj, (_k, v) => {
47
50
  if (v && typeof v === "object") {
48
51
  if (seen.has(v))
49
52
  return "[Circular]";
@@ -52,18 +55,154 @@ function safeStringify(obj) {
52
55
  return v;
53
56
  });
54
57
  }
55
- function isIndexedDBAvailable() {
56
- try {
57
- return typeof indexedDB !== "undefined";
58
- } catch (e) {
59
- return false;
58
+ var cachedSessionId = null;
59
+ function getSessionId() {
60
+ if (cachedSessionId)
61
+ return cachedSessionId;
62
+ if (isWeChatMiniProgram()) {
63
+ try {
64
+ const stored = wx.getStorageSync("logger_session_id");
65
+ if (stored) {
66
+ cachedSessionId = stored;
67
+ return stored;
68
+ }
69
+ } catch (e) {
70
+ }
71
+ }
72
+ if (isBrowser() && typeof sessionStorage !== "undefined") {
73
+ try {
74
+ const stored = sessionStorage.getItem("logger_session_id");
75
+ if (stored) {
76
+ cachedSessionId = stored;
77
+ return stored;
78
+ }
79
+ } catch (e) {
80
+ }
81
+ }
82
+ cachedSessionId = `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
83
+ if (isWeChatMiniProgram()) {
84
+ try {
85
+ wx.setStorageSync("logger_session_id", cachedSessionId);
86
+ } catch (e) {
87
+ }
88
+ }
89
+ if (isBrowser() && typeof sessionStorage !== "undefined") {
90
+ try {
91
+ sessionStorage.setItem("logger_session_id", cachedSessionId);
92
+ } catch (e) {
93
+ }
94
+ }
95
+ return cachedSessionId;
96
+ }
97
+ function getCurrentUrl() {
98
+ if (isWeChatMiniProgram()) {
99
+ try {
100
+ const pages = getCurrentPages();
101
+ if (pages && pages.length > 0) {
102
+ const currentPage = pages[pages.length - 1];
103
+ return currentPage.route || "";
104
+ }
105
+ } catch (e) {
106
+ return "";
107
+ }
108
+ }
109
+ if (isBrowser()) {
110
+ return window.location.href;
111
+ }
112
+ return "";
113
+ }
114
+ var cachedEnvInfo = null;
115
+ function getEnvironmentInfo() {
116
+ if (cachedEnvInfo)
117
+ return cachedEnvInfo;
118
+ const envInfo = {
119
+ platform: "unknown"
120
+ };
121
+ if (isWeChatMiniProgram()) {
122
+ envInfo.platform = "wechat";
123
+ try {
124
+ const systemInfo = wx.getSystemInfoSync();
125
+ envInfo.systemInfo = {
126
+ brand: systemInfo.brand,
127
+ model: systemInfo.model,
128
+ system: systemInfo.system,
129
+ platform: systemInfo.platform,
130
+ version: systemInfo.version,
131
+ SDKVersion: systemInfo.SDKVersion
132
+ };
133
+ envInfo.screenWidth = systemInfo.screenWidth;
134
+ envInfo.screenHeight = systemInfo.screenHeight;
135
+ envInfo.language = systemInfo.language;
136
+ } catch (e) {
137
+ }
138
+ } else if (isBrowser()) {
139
+ envInfo.platform = "browser";
140
+ envInfo.userAgent = navigator.userAgent;
141
+ envInfo.screenWidth = window.screen.width;
142
+ envInfo.screenHeight = window.screen.height;
143
+ envInfo.language = navigator.language;
144
+ }
145
+ cachedEnvInfo = envInfo;
146
+ return envInfo;
147
+ }
148
+ function parseBrowserInfo(userAgent) {
149
+ const ua = userAgent.toLowerCase();
150
+ let browser = "Unknown";
151
+ let browserVersion = "";
152
+ let os = "Unknown";
153
+ let osVersion = "";
154
+ if (ua.indexOf("chrome") > -1 && ua.indexOf("edge") === -1) {
155
+ browser = "Chrome";
156
+ const match = ua.match(/chrome\/(\d+\.\d+)/);
157
+ browserVersion = match ? match[1] : "";
158
+ } else if (ua.indexOf("safari") > -1 && ua.indexOf("chrome") === -1) {
159
+ browser = "Safari";
160
+ const match = ua.match(/version\/(\d+\.\d+)/);
161
+ browserVersion = match ? match[1] : "";
162
+ } else if (ua.indexOf("firefox") > -1) {
163
+ browser = "Firefox";
164
+ const match = ua.match(/firefox\/(\d+\.\d+)/);
165
+ browserVersion = match ? match[1] : "";
166
+ } else if (ua.indexOf("edge") > -1) {
167
+ browser = "Edge";
168
+ const match = ua.match(/edge\/(\d+\.\d+)/);
169
+ browserVersion = match ? match[1] : "";
170
+ }
171
+ if (ua.indexOf("windows") > -1) {
172
+ os = "Windows";
173
+ if (ua.indexOf("windows nt 10") > -1)
174
+ osVersion = "10";
175
+ else if (ua.indexOf("windows nt 6.3") > -1)
176
+ osVersion = "8.1";
177
+ else if (ua.indexOf("windows nt 6.2") > -1)
178
+ osVersion = "8";
179
+ else if (ua.indexOf("windows nt 6.1") > -1)
180
+ osVersion = "7";
181
+ } else if (ua.indexOf("mac os") > -1) {
182
+ os = "macOS";
183
+ const match = ua.match(/mac os x (\d+[._]\d+)/);
184
+ osVersion = match ? match[1].replace("_", ".") : "";
185
+ } else if (ua.indexOf("android") > -1) {
186
+ os = "Android";
187
+ const match = ua.match(/android (\d+\.\d+)/);
188
+ osVersion = match ? match[1] : "";
189
+ } else if (ua.indexOf("iphone") > -1 || ua.indexOf("ipad") > -1) {
190
+ os = "iOS";
191
+ const match = ua.match(/os (\d+[._]\d+)/);
192
+ osVersion = match ? match[1].replace("_", ".") : "";
193
+ } else if (ua.indexOf("linux") > -1) {
194
+ os = "Linux";
60
195
  }
196
+ return { browser, browserVersion, os, osVersion };
61
197
  }
62
198
  // Annotate the CommonJS export names for ESM import in node:
63
199
  0 && (module.exports = {
200
+ getCurrentUrl,
201
+ getEnvironmentInfo,
202
+ getSessionId,
64
203
  isBrowser,
65
- isIndexedDBAvailable,
66
204
  isWeChatMiniProgram,
67
205
  now,
206
+ parseBrowserInfo,
68
207
  safeStringify
69
208
  });
@@ -1 +1,6 @@
1
1
  export { LoggerSDK } from './loggerSDK';
2
+ export { defaultTransport, TransportAdapters } from './transportAdapter';
3
+ export type { TransportAdapter, TransportOptions } from './transportAdapter';
4
+ export type { SDKOptions, LogEvent, LogEventType, LogEventLevel, Env } from './types';
5
+ export type { PlatformType, EnvironmentInfo } from './utils';
6
+ export { getEnvironmentInfo, parseBrowserInfo, isWeChatMiniProgram } from './utils';
package/dist/esm/index.js CHANGED
@@ -2,8 +2,10 @@
2
2
  * @Author : 黄震 huangzhen@yfpharmacy.com
3
3
  * @Date : 2025-11-21 14:25:26
4
4
  * @LastEditors : 黄震 huangzhen@yfpharmacy.com
5
- * @LastEditTime : 2025-12-02 15:09:28
5
+ * @LastEditTime : 2025-12-04 14:35:00
6
6
  * @Description : 描述
7
7
  * Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
8
8
  */
9
- export { LoggerSDK } from "./loggerSDK";
9
+ export { LoggerSDK } from "./loggerSDK";
10
+ export { defaultTransport, TransportAdapters } from "./transportAdapter";
11
+ export { getEnvironmentInfo, parseBrowserInfo, isWeChatMiniProgram } from "./utils";
@@ -1,29 +1,36 @@
1
- import { LogEvent, SDKOptions } from './types';
1
+ import { SDKOptions, LogEventType, LogEventLevel } from './types';
2
2
  export declare class LoggerSDK {
3
3
  private opts;
4
- private env;
5
- private inMemoryQueue;
6
4
  private seq;
7
- private timerId;
8
- private storage;
9
5
  private closed;
10
- private idbQueue;
11
- private flushing;
6
+ /** 预收集的环境信息 tags */
7
+ private envTags;
12
8
  constructor(options: SDKOptions);
13
9
  private logDebug;
14
- private loadFromStorage;
15
- private persistToStorage;
16
- private startTimer;
17
- private stopTimer;
18
- track(event: Partial<LogEvent>, headers?: Record<string, string>): Promise<void>;
19
- flush(extraHeaders?: Record<string, string>): Promise<void>;
20
- flushAll(): Promise<void>;
21
- identify(user: Record<string, any>): Promise<void>;
22
- setCommon(params: Record<string, any>): Promise<void>;
10
+ /**
11
+ * 收集环境信息并生成 tags(仅在初始化时执行一次)
12
+ */
13
+ private collectEnvironmentTags;
14
+ /**
15
+ * 记录事件
16
+ */
17
+ track(eventType: LogEventType, message: string, options?: {
18
+ level?: LogEventLevel;
19
+ stack?: string;
20
+ userId?: string;
21
+ tags?: Record<string, any>;
22
+ }): Promise<void>;
23
+ /**
24
+ * 设置用户信息
25
+ */
26
+ identify(userId: string): void;
27
+ /**
28
+ * 销毁实例
29
+ */
23
30
  destroy(): void;
24
- private attachGlobalHandlers;
25
- private installAutoPV;
26
- private collectPerf;
27
- private flushBeacon;
31
+ /**
32
+ * 监听页面卸载事件
33
+ */
34
+ private attachUnloadHandlers;
28
35
  }
29
36
  export default LoggerSDK;