@pluve/logger-sdk 0.0.1 → 0.0.3

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 (44) hide show
  1. package/README.md +195 -76
  2. package/dist/index.js +9 -0
  3. package/dist/loggerSDK.d.ts +36 -0
  4. package/dist/{esm/dbQueue.js → loggerSDK.js} +195 -161
  5. package/dist/transportAdapter.d.ts +51 -0
  6. package/dist/{esm/transportAdapter.js → transportAdapter.js} +260 -111
  7. package/dist/types.d.ts +46 -0
  8. package/dist/utils.d.ts +30 -0
  9. package/dist/utils.js +229 -0
  10. package/lib/dbQueue.js +133 -0
  11. package/{dist/esm → lib}/index.js +1 -1
  12. package/lib/loggerSDK.js +571 -0
  13. package/lib/storeAdapter.js +99 -0
  14. package/lib/transportAdapter.d.ts +66 -0
  15. package/lib/transportAdapter.js +406 -0
  16. package/lib/types.js +1 -0
  17. package/lib/utils.js +50 -0
  18. package/package.json +8 -2
  19. package/dist/cjs/dbQueue.js +0 -88
  20. package/dist/cjs/index.js +0 -29
  21. package/dist/cjs/loggerSDK.js +0 -426
  22. package/dist/cjs/storeAdapter.js +0 -64
  23. package/dist/cjs/transportAdapter.d.ts +0 -5
  24. package/dist/cjs/transportAdapter.js +0 -109
  25. package/dist/cjs/types.js +0 -17
  26. package/dist/cjs/utils.js +0 -69
  27. package/dist/esm/dbQueue.d.ts +0 -10
  28. package/dist/esm/loggerSDK.d.ts +0 -29
  29. package/dist/esm/loggerSDK.js +0 -761
  30. package/dist/esm/storeAdapter.d.ts +0 -7
  31. package/dist/esm/storeAdapter.js +0 -139
  32. package/dist/esm/transportAdapter.d.ts +0 -5
  33. package/dist/esm/types.d.ts +0 -35
  34. package/dist/esm/utils.d.ts +0 -5
  35. package/dist/esm/utils.js +0 -53
  36. package/dist/umd/logger-sdk.min.js +0 -1
  37. /package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
  38. /package/dist/{esm/types.js → types.js} +0 -0
  39. /package/{dist/cjs → lib}/dbQueue.d.ts +0 -0
  40. /package/{dist/esm → lib}/index.d.ts +0 -0
  41. /package/{dist/cjs → lib}/loggerSDK.d.ts +0 -0
  42. /package/{dist/cjs → lib}/storeAdapter.d.ts +0 -0
  43. /package/{dist/cjs → lib}/types.d.ts +0 -0
  44. /package/{dist/cjs → lib}/utils.d.ts +0 -0
@@ -1,5 +1,7 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
2
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
5
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
6
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
7
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -8,187 +10,219 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
8
10
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
11
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
10
12
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
11
- /*
12
- * @Author : 黄震 huangzhen@yfpharmacy.com
13
- * @Date : 2025-11-21 14:32:51
14
- * @LastEditors : 黄震 huangzhen@yfpharmacy.com
15
- * @LastEditTime : 2025-11-21 14:38:50
16
- * @Description : 描述
17
- * Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
18
- */
13
+ import { defaultTransport } from "./transportAdapter";
14
+ import { isBrowser, isWeChatMiniProgram, now, getSessionId, getCurrentUrl, getEnvironmentInfo, parseBrowserInfo } from "./utils";
15
+ export var LoggerSDK = /*#__PURE__*/function () {
16
+ function LoggerSDK(options) {
17
+ _classCallCheck(this, LoggerSDK);
18
+ _defineProperty(this, "opts", void 0);
19
+ _defineProperty(this, "seq", 0);
20
+ _defineProperty(this, "closed", false);
21
+ /** 预收集的环境信息 tags */
22
+ _defineProperty(this, "envTags", void 0);
23
+ this.opts = {
24
+ endpoint: options.endpoint,
25
+ appId: options.appId || 'unknown',
26
+ env: options.env || 'dev',
27
+ debug: !!options.debug,
28
+ pixelParam: options.pixelParam || 'data',
29
+ maxPixelUrlLen: options.maxPixelUrlLen || 1900
30
+ };
19
31
 
20
- import { isBrowser, isIndexedDBAvailable } from "./utils";
32
+ // 初始化时收集环境信息
33
+ this.envTags = this.collectEnvironmentTags();
21
34
 
22
- // IndexedDB 轻量队列:作为 localStorage 的冗余通道
23
- var IDBQueue = /*#__PURE__*/function () {
24
- function IDBQueue() {
25
- var dbName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'logger_sdk_db';
26
- var storeName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'queue';
27
- _classCallCheck(this, IDBQueue);
28
- _defineProperty(this, "dbName", void 0);
29
- _defineProperty(this, "storeName", void 0);
30
- _defineProperty(this, "db", null);
31
- this.dbName = dbName;
32
- this.storeName = storeName;
35
+ // 监听页面卸载事件
36
+ this.attachUnloadHandlers();
33
37
  }
38
+ _createClass(LoggerSDK, [{
39
+ key: "logDebug",
40
+ value: function logDebug() {
41
+ var _console;
42
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
43
+ args[_key] = arguments[_key];
44
+ }
45
+ if (this.opts.debug) (_console = console).debug.apply(_console, ['[LoggerSDK]'].concat(args));
46
+ }
47
+
48
+ /**
49
+ * 收集环境信息并生成 tags(仅在初始化时执行一次)
50
+ */
51
+ }, {
52
+ key: "collectEnvironmentTags",
53
+ value: function collectEnvironmentTags() {
54
+ var envInfo = getEnvironmentInfo();
55
+ var tags = {
56
+ platform: envInfo.platform
57
+ };
58
+
59
+ // 浏览器环境
60
+ if (envInfo.platform === 'browser' && envInfo.userAgent) {
61
+ var browserInfo = parseBrowserInfo(envInfo.userAgent);
62
+ tags.browser = browserInfo.browser;
63
+ tags.browserVersion = browserInfo.browserVersion;
64
+ tags.os = browserInfo.os;
65
+ tags.osVersion = browserInfo.osVersion;
66
+ tags.screenWidth = envInfo.screenWidth;
67
+ tags.screenHeight = envInfo.screenHeight;
68
+ tags.language = envInfo.language;
69
+ }
70
+ // 微信小程序环境
71
+ else if (envInfo.platform === 'wechat' && envInfo.systemInfo) {
72
+ tags.brand = envInfo.systemInfo.brand;
73
+ tags.model = envInfo.systemInfo.model;
74
+ tags.system = envInfo.systemInfo.system;
75
+ tags.wechatVersion = envInfo.systemInfo.version;
76
+ tags.SDKVersion = envInfo.systemInfo.SDKVersion;
77
+ tags.screenWidth = envInfo.screenWidth;
78
+ tags.screenHeight = envInfo.screenHeight;
79
+ tags.language = envInfo.language;
80
+ }
81
+ this.logDebug('Environment tags collected:', tags);
82
+ return tags;
83
+ }
34
84
 
35
- // 打开数据库并初始化对象仓库
36
- _createClass(IDBQueue, [{
37
- key: "open",
38
- value: function () {
39
- var _open = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
40
- var _this = this;
85
+ /**
86
+ * 记录事件
87
+ */
88
+ }, {
89
+ key: "track",
90
+ value: (function () {
91
+ var _track = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(eventType, message, options) {
92
+ var logEvent;
41
93
  return _regeneratorRuntime().wrap(function _callee$(_context) {
42
94
  while (1) switch (_context.prev = _context.next) {
43
95
  case 0:
44
- if (!(!isBrowser() || !isIndexedDBAvailable())) {
96
+ if (!this.closed) {
45
97
  _context.next = 2;
46
98
  break;
47
99
  }
48
100
  return _context.abrupt("return");
49
101
  case 2:
50
- if (!this.db) {
51
- _context.next = 4;
52
- break;
53
- }
54
- return _context.abrupt("return");
55
- case 4:
56
- return _context.abrupt("return", new Promise(function (resolve, reject) {
57
- var req = indexedDB.open(_this.dbName, 1);
58
- req.onupgradeneeded = function () {
59
- var db = req.result;
60
- if (!db.objectStoreNames.contains(_this.storeName)) db.createObjectStore(_this.storeName, {
61
- autoIncrement: true
62
- });
63
- };
64
- req.onsuccess = function () {
65
- _this.db = req.result;
66
- resolve();
67
- };
68
- req.onerror = function () {
69
- return reject(req.error);
70
- };
71
- }));
72
- case 5:
102
+ this.seq += 1;
103
+
104
+ // 构建标准化日志格式
105
+ logEvent = {
106
+ eventType: eventType,
107
+ ts: now(),
108
+ appId: this.opts.appId || 'unknown',
109
+ env: this.opts.env || 'dev',
110
+ level: (options === null || options === void 0 ? void 0 : options.level) || 'info',
111
+ message: message,
112
+ stack: options === null || options === void 0 ? void 0 : options.stack,
113
+ url: getCurrentUrl(),
114
+ userId: options === null || options === void 0 ? void 0 : options.userId,
115
+ sessionId: getSessionId(),
116
+ // 合并预收集的环境 tags 和用户自定义 tags
117
+ tags: _objectSpread(_objectSpread({}, this.envTags), (options === null || options === void 0 ? void 0 : options.tags) || {})
118
+ };
119
+ this.logDebug('track', logEvent);
120
+ _context.prev = 5;
121
+ _context.next = 8;
122
+ return defaultTransport(logEvent, this.opts);
123
+ case 8:
124
+ _context.next = 13;
125
+ break;
126
+ case 10:
127
+ _context.prev = 10;
128
+ _context.t0 = _context["catch"](5);
129
+ this.logDebug('track failed', _context.t0);
130
+ // 静默失败,不影响主流程
131
+ case 13:
73
132
  case "end":
74
133
  return _context.stop();
75
134
  }
76
- }, _callee, this);
135
+ }, _callee, this, [[5, 10]]);
77
136
  }));
78
- function open() {
79
- return _open.apply(this, arguments);
137
+ function track(_x, _x2, _x3) {
138
+ return _track.apply(this, arguments);
80
139
  }
81
- return open;
82
- }() // 入队:追加一条记录
140
+ return track;
141
+ }()
142
+ /**
143
+ * 设置用户信息
144
+ */
145
+ )
83
146
  }, {
84
- key: "add",
85
- value: function () {
86
- var _add = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(item) {
87
- var _this2 = this;
88
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
89
- while (1) switch (_context2.prev = _context2.next) {
90
- case 0:
91
- if (this.db) {
92
- _context2.next = 2;
93
- break;
94
- }
95
- return _context2.abrupt("return");
96
- case 2:
97
- return _context2.abrupt("return", new Promise(function (res, rej) {
98
- var tx = _this2.db.transaction(_this2.storeName, 'readwrite');
99
- var st = tx.objectStore(_this2.storeName);
100
- var r = st.add(item);
101
- r.onsuccess = function () {
102
- return res();
103
- };
104
- r.onerror = function () {
105
- return rej(r.error);
106
- };
107
- }));
108
- case 3:
109
- case "end":
110
- return _context2.stop();
111
- }
112
- }, _callee2, this);
113
- }));
114
- function add(_x) {
115
- return _add.apply(this, arguments);
116
- }
117
- return add;
118
- }() // 读取全部记录(调试/回溯用)
147
+ key: "identify",
148
+ value: function identify(userId) {
149
+ this.logDebug('identify', userId);
150
+ // userId 将在 track 时传入
151
+ }
152
+
153
+ /**
154
+ * 销毁实例
155
+ */
119
156
  }, {
120
- key: "getAll",
121
- value: function () {
122
- var _getAll = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
123
- var _this3 = this;
124
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
125
- while (1) switch (_context3.prev = _context3.next) {
126
- case 0:
127
- if (this.db) {
128
- _context3.next = 2;
129
- break;
130
- }
131
- return _context3.abrupt("return", []);
132
- case 2:
133
- return _context3.abrupt("return", new Promise(function (res, rej) {
134
- var tx = _this3.db.transaction(_this3.storeName, 'readonly');
135
- var st = tx.objectStore(_this3.storeName);
136
- var req = st.getAll();
137
- req.onsuccess = function () {
138
- return res(req.result || []);
139
- };
140
- req.onerror = function () {
141
- return rej(req.error);
142
- };
143
- }));
144
- case 3:
145
- case "end":
146
- return _context3.stop();
147
- }
148
- }, _callee3, this);
149
- }));
150
- function getAll() {
151
- return _getAll.apply(this, arguments);
152
- }
153
- return getAll;
154
- }() // 清空队列:发送成功后用于兜底清理
157
+ key: "destroy",
158
+ value: function destroy() {
159
+ this.closed = true;
160
+ }
161
+
162
+ // ========== 自动采集 ===========
163
+
164
+ /**
165
+ * 监听页面卸载事件
166
+ */
155
167
  }, {
156
- key: "clear",
157
- value: function () {
158
- var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
159
- var _this4 = this;
160
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
161
- while (1) switch (_context4.prev = _context4.next) {
162
- case 0:
163
- if (this.db) {
164
- _context4.next = 2;
165
- break;
166
- }
167
- return _context4.abrupt("return");
168
- case 2:
169
- return _context4.abrupt("return", new Promise(function (res, rej) {
170
- var tx = _this4.db.transaction(_this4.storeName, 'readwrite');
171
- var st = tx.objectStore(_this4.storeName);
172
- var req = st.clear();
173
- req.onsuccess = function () {
174
- return res(undefined);
175
- };
176
- req.onerror = function () {
177
- return rej(req.error);
178
- };
179
- }));
180
- case 3:
181
- case "end":
182
- return _context4.stop();
183
- }
184
- }, _callee4, this);
185
- }));
186
- function clear() {
187
- return _clear.apply(this, arguments);
168
+ key: "attachUnloadHandlers",
169
+ value: function attachUnloadHandlers() {
170
+ // 微信小程序环境
171
+ if (isWeChatMiniProgram()) {
172
+ // 微信小程序使用 App 生命周期
173
+ // 注意:这里需要在 App() 中配置,此处仅做示意
174
+ this.logDebug('WeChat MiniProgram environment detected');
175
+ return;
188
176
  }
189
- return clear;
190
- }()
177
+
178
+ // 浏览器环境
179
+ if (!isBrowser()) return;
180
+ var win = window;
181
+
182
+ // 页面可见性变化
183
+ document.addEventListener && document.addEventListener('visibilitychange', function () {
184
+ try {
185
+ if (document.visibilityState === 'hidden') {
186
+ // this.track('pageview', 'Page hidden', {
187
+ // level: 'info',
188
+ // tags: { action: 'page_hidden' },
189
+ // });
190
+ console.log('Page hidden');
191
+ }
192
+ } catch (_unused) {
193
+ //
194
+ }
195
+ });
196
+
197
+ // 页面隐藏
198
+ win.addEventListener && win.addEventListener('pagehide', function () {
199
+ try {
200
+ // this.track('pageview', 'Page hide', {
201
+ // level: 'info',
202
+ // tags: { action: 'page_hide' },
203
+ // });
204
+ console.log('Page hide');
205
+ } catch (_unused2) {
206
+ //
207
+ }
208
+ });
209
+
210
+ // 页面卸载前
211
+ win.addEventListener && win.addEventListener('beforeunload', function () {
212
+ try {
213
+ // this.track('pageview', 'Page unload', {
214
+ // level: 'info',
215
+ // tags: { action: 'page_unload' },
216
+ // });
217
+ console.log('Page unload');
218
+ } catch (_unused3) {
219
+ //
220
+ }
221
+ });
222
+ }
191
223
  }]);
192
- return IDBQueue;
224
+ return LoggerSDK;
193
225
  }();
194
- export { IDBQueue as default };
226
+
227
+ // 兼容导出(UMD/ESM)
228
+ export default LoggerSDK;
@@ -0,0 +1,51 @@
1
+ import { SDKOptions } from './types';
2
+ /** 传输选项接口 */
3
+ export interface TransportOptions extends Omit<SDKOptions, 'endpoint'> {
4
+ endpoint: string;
5
+ }
6
+ /** 传输适配器接口 */
7
+ export interface TransportAdapter {
8
+ /** 适配器名称 */
9
+ name: string;
10
+ /** 是否支持当前环境 */
11
+ isSupported(opts?: TransportOptions): boolean;
12
+ /** 发送数据 */
13
+ send(payload: any, opts?: TransportOptions): Promise<void>;
14
+ }
15
+ /**
16
+ * Beacon 传输适配器
17
+ * - 兼容性:现代浏览器(Chrome 39+, Firefox 31+, Edge 14+)
18
+ * - 健壮性:页面卸载时可靠传输、不阻塞页面卸载
19
+ * - 适用场景:页面关闭、visibilitychange、pagehide、beforeunload 事件
20
+ * - 限制:无法获取响应、队列有大小限制(通常 64KB)
21
+ */
22
+ export declare const beaconTransport: TransportAdapter;
23
+ /**
24
+ * 微信小程序传输适配器
25
+ * - 兼容性:微信小程序环境
26
+ * - 健壮性:支持超时控制、完善的错误处理
27
+ * - 适用场景:微信小程序环境下的日志上报
28
+ */
29
+ export declare const wechatTransport: TransportAdapter;
30
+ /**
31
+ * Image 像素上报适配器
32
+ * - 兼容性:所有浏览器
33
+ * - 健壮性:轻量级、无跨域限制、支持超时控制
34
+ * - 适用场景:数据量小的快速上报、跨域场景、降级方案
35
+ * - 限制:URL 长度限制(默认 1900 字符)
36
+ */
37
+ export declare const imageTransport: TransportAdapter;
38
+ /**
39
+ * 默认传输函数 - 按环境选择最佳传输方式
40
+ * 浏览器策略:Beacon(可靠) > Image(兼容)
41
+ * 微信小程序策略:WeChat Request
42
+ */
43
+ export declare function defaultTransport(payload: any, opts?: TransportOptions): Promise<void>;
44
+ /**
45
+ * 导出所有适配器,方便自定义使用
46
+ */
47
+ export declare const TransportAdapters: {
48
+ beacon: TransportAdapter;
49
+ wechat: TransportAdapter;
50
+ image: TransportAdapter;
51
+ };