@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.
- package/README.md +195 -76
- package/dist/index.js +9 -0
- package/dist/loggerSDK.d.ts +36 -0
- package/dist/{esm/dbQueue.js → loggerSDK.js} +195 -161
- package/dist/transportAdapter.d.ts +51 -0
- package/dist/{esm/transportAdapter.js → transportAdapter.js} +260 -111
- package/dist/types.d.ts +46 -0
- package/dist/utils.d.ts +30 -0
- package/dist/utils.js +229 -0
- package/lib/dbQueue.js +133 -0
- package/{dist/esm → lib}/index.js +1 -1
- package/lib/loggerSDK.js +571 -0
- package/lib/storeAdapter.js +99 -0
- package/lib/transportAdapter.d.ts +66 -0
- package/lib/transportAdapter.js +406 -0
- package/lib/types.js +1 -0
- package/lib/utils.js +50 -0
- package/package.json +8 -2
- package/dist/cjs/dbQueue.js +0 -88
- package/dist/cjs/index.js +0 -29
- package/dist/cjs/loggerSDK.js +0 -426
- package/dist/cjs/storeAdapter.js +0 -64
- package/dist/cjs/transportAdapter.d.ts +0 -5
- package/dist/cjs/transportAdapter.js +0 -109
- package/dist/cjs/types.js +0 -17
- package/dist/cjs/utils.js +0 -69
- package/dist/esm/dbQueue.d.ts +0 -10
- package/dist/esm/loggerSDK.d.ts +0 -29
- package/dist/esm/loggerSDK.js +0 -761
- package/dist/esm/storeAdapter.d.ts +0 -7
- package/dist/esm/storeAdapter.js +0 -139
- package/dist/esm/transportAdapter.d.ts +0 -5
- package/dist/esm/types.d.ts +0 -35
- package/dist/esm/utils.d.ts +0 -5
- package/dist/esm/utils.js +0 -53
- package/dist/umd/logger-sdk.min.js +0 -1
- /package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
- /package/dist/{esm/types.js → types.js} +0 -0
- /package/{dist/cjs → lib}/dbQueue.d.ts +0 -0
- /package/{dist/esm → lib}/index.d.ts +0 -0
- /package/{dist/cjs → lib}/loggerSDK.d.ts +0 -0
- /package/{dist/cjs → lib}/storeAdapter.d.ts +0 -0
- /package/{dist/cjs → lib}/types.d.ts +0 -0
- /package/{dist/cjs → lib}/utils.d.ts +0 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
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
|
+
/*
|
|
3
|
+
* @Author : 黄震 huangzhen@yfpharmacy.com
|
|
4
|
+
* @Date : 2025-11-21 14:31:33
|
|
5
|
+
* @LastEditors : 黄震 huangzhen@yfpharmacy.com
|
|
6
|
+
* @LastEditTime : 2025-12-04 14:13:48
|
|
7
|
+
* @Description : utils 工具函数
|
|
8
|
+
* Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// 当前时间戳(毫秒)
|
|
12
|
+
export var now = function now() {
|
|
13
|
+
return Date.now();
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// 判断是否在浏览器环境
|
|
17
|
+
export function isBrowser() {
|
|
18
|
+
try {
|
|
19
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
20
|
+
} catch (e) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 判断是否在微信小程序环境
|
|
26
|
+
export function isWeChatMiniProgram() {
|
|
27
|
+
try {
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
return typeof wx !== 'undefined' && typeof wx.getSystemInfo === 'function';
|
|
30
|
+
} catch (e) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 安全 JSON 序列化:处理循环引用
|
|
36
|
+
export function safeStringify(obj) {
|
|
37
|
+
var seen = new WeakSet();
|
|
38
|
+
return JSON.stringify(obj, function (_k, v) {
|
|
39
|
+
if (v && _typeof(v) === 'object') {
|
|
40
|
+
if (seen.has(v)) return '[Circular]';
|
|
41
|
+
seen.add(v);
|
|
42
|
+
}
|
|
43
|
+
return v;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 生成随机 sessionId
|
|
48
|
+
var cachedSessionId = null;
|
|
49
|
+
export function getSessionId() {
|
|
50
|
+
if (cachedSessionId) return cachedSessionId;
|
|
51
|
+
|
|
52
|
+
// 微信小程序环境
|
|
53
|
+
if (isWeChatMiniProgram()) {
|
|
54
|
+
try {
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
var stored = wx.getStorageSync('logger_session_id');
|
|
57
|
+
if (stored) {
|
|
58
|
+
cachedSessionId = stored;
|
|
59
|
+
return stored;
|
|
60
|
+
}
|
|
61
|
+
} catch (e) {
|
|
62
|
+
// 忽略错误
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 浏览器环境 - 尝试从 sessionStorage 读取
|
|
67
|
+
if (isBrowser() && typeof sessionStorage !== 'undefined') {
|
|
68
|
+
try {
|
|
69
|
+
var _stored = sessionStorage.getItem('logger_session_id');
|
|
70
|
+
if (_stored) {
|
|
71
|
+
cachedSessionId = _stored;
|
|
72
|
+
return _stored;
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {
|
|
75
|
+
// sessionStorage 不可用,忽略
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// 生成新的 sessionId
|
|
80
|
+
cachedSessionId = "".concat(Date.now(), "_").concat(Math.random().toString(36).substring(2, 15));
|
|
81
|
+
|
|
82
|
+
// 微信小程序 - 存储到 Storage
|
|
83
|
+
if (isWeChatMiniProgram()) {
|
|
84
|
+
try {
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
wx.setStorageSync('logger_session_id', cachedSessionId);
|
|
87
|
+
} catch (e) {
|
|
88
|
+
// 忽略错误
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 浏览器 - 尝试存储到 sessionStorage
|
|
93
|
+
if (isBrowser() && typeof sessionStorage !== 'undefined') {
|
|
94
|
+
try {
|
|
95
|
+
sessionStorage.setItem('logger_session_id', cachedSessionId);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
// 存储失败,忽略
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return cachedSessionId;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 获取当前页面 URL
|
|
104
|
+
export function getCurrentUrl() {
|
|
105
|
+
// 微信小程序环境
|
|
106
|
+
if (isWeChatMiniProgram()) {
|
|
107
|
+
try {
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
var pages = getCurrentPages();
|
|
110
|
+
if (pages && pages.length > 0) {
|
|
111
|
+
var currentPage = pages[pages.length - 1];
|
|
112
|
+
return currentPage.route || '';
|
|
113
|
+
}
|
|
114
|
+
} catch (e) {
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// 浏览器环境
|
|
120
|
+
if (isBrowser()) {
|
|
121
|
+
return window.location.href;
|
|
122
|
+
}
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** 平台类型 */
|
|
127
|
+
|
|
128
|
+
/** 环境信息 */
|
|
129
|
+
|
|
130
|
+
// 缓存环境信息
|
|
131
|
+
var cachedEnvInfo = null;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 获取环境信息
|
|
135
|
+
*/
|
|
136
|
+
export function getEnvironmentInfo() {
|
|
137
|
+
if (cachedEnvInfo) return cachedEnvInfo;
|
|
138
|
+
var envInfo = {
|
|
139
|
+
platform: 'unknown'
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// 微信小程序环境
|
|
143
|
+
if (isWeChatMiniProgram()) {
|
|
144
|
+
envInfo.platform = 'wechat';
|
|
145
|
+
try {
|
|
146
|
+
// @ts-ignore
|
|
147
|
+
var systemInfo = wx.getSystemInfoSync();
|
|
148
|
+
envInfo.systemInfo = {
|
|
149
|
+
brand: systemInfo.brand,
|
|
150
|
+
model: systemInfo.model,
|
|
151
|
+
system: systemInfo.system,
|
|
152
|
+
platform: systemInfo.platform,
|
|
153
|
+
version: systemInfo.version,
|
|
154
|
+
SDKVersion: systemInfo.SDKVersion
|
|
155
|
+
};
|
|
156
|
+
envInfo.screenWidth = systemInfo.screenWidth;
|
|
157
|
+
envInfo.screenHeight = systemInfo.screenHeight;
|
|
158
|
+
envInfo.language = systemInfo.language;
|
|
159
|
+
} catch (e) {
|
|
160
|
+
// 忽略错误
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 浏览器环境
|
|
164
|
+
else if (isBrowser()) {
|
|
165
|
+
envInfo.platform = 'browser';
|
|
166
|
+
envInfo.userAgent = navigator.userAgent;
|
|
167
|
+
envInfo.screenWidth = window.screen.width;
|
|
168
|
+
envInfo.screenHeight = window.screen.height;
|
|
169
|
+
envInfo.language = navigator.language;
|
|
170
|
+
}
|
|
171
|
+
cachedEnvInfo = envInfo;
|
|
172
|
+
return envInfo;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* 解析浏览器信息
|
|
177
|
+
*/
|
|
178
|
+
export function parseBrowserInfo(userAgent) {
|
|
179
|
+
var ua = userAgent.toLowerCase();
|
|
180
|
+
var browser = 'Unknown';
|
|
181
|
+
var browserVersion = '';
|
|
182
|
+
var os = 'Unknown';
|
|
183
|
+
var osVersion = '';
|
|
184
|
+
|
|
185
|
+
// 浏览器检测
|
|
186
|
+
if (ua.indexOf('chrome') > -1 && ua.indexOf('edge') === -1) {
|
|
187
|
+
browser = 'Chrome';
|
|
188
|
+
var match = ua.match(/chrome\/(\d+\.\d+)/);
|
|
189
|
+
browserVersion = match ? match[1] : '';
|
|
190
|
+
} else if (ua.indexOf('safari') > -1 && ua.indexOf('chrome') === -1) {
|
|
191
|
+
browser = 'Safari';
|
|
192
|
+
var _match = ua.match(/version\/(\d+\.\d+)/);
|
|
193
|
+
browserVersion = _match ? _match[1] : '';
|
|
194
|
+
} else if (ua.indexOf('firefox') > -1) {
|
|
195
|
+
browser = 'Firefox';
|
|
196
|
+
var _match2 = ua.match(/firefox\/(\d+\.\d+)/);
|
|
197
|
+
browserVersion = _match2 ? _match2[1] : '';
|
|
198
|
+
} else if (ua.indexOf('edge') > -1) {
|
|
199
|
+
browser = 'Edge';
|
|
200
|
+
var _match3 = ua.match(/edge\/(\d+\.\d+)/);
|
|
201
|
+
browserVersion = _match3 ? _match3[1] : '';
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// 操作系统检测
|
|
205
|
+
if (ua.indexOf('windows') > -1) {
|
|
206
|
+
os = 'Windows';
|
|
207
|
+
if (ua.indexOf('windows nt 10') > -1) osVersion = '10';else if (ua.indexOf('windows nt 6.3') > -1) osVersion = '8.1';else if (ua.indexOf('windows nt 6.2') > -1) osVersion = '8';else if (ua.indexOf('windows nt 6.1') > -1) osVersion = '7';
|
|
208
|
+
} else if (ua.indexOf('mac os') > -1) {
|
|
209
|
+
os = 'macOS';
|
|
210
|
+
var _match4 = ua.match(/mac os x (\d+[._]\d+)/);
|
|
211
|
+
osVersion = _match4 ? _match4[1].replace('_', '.') : '';
|
|
212
|
+
} else if (ua.indexOf('android') > -1) {
|
|
213
|
+
os = 'Android';
|
|
214
|
+
var _match5 = ua.match(/android (\d+\.\d+)/);
|
|
215
|
+
osVersion = _match5 ? _match5[1] : '';
|
|
216
|
+
} else if (ua.indexOf('iphone') > -1 || ua.indexOf('ipad') > -1) {
|
|
217
|
+
os = 'iOS';
|
|
218
|
+
var _match6 = ua.match(/os (\d+[._]\d+)/);
|
|
219
|
+
osVersion = _match6 ? _match6[1].replace('_', '.') : '';
|
|
220
|
+
} else if (ua.indexOf('linux') > -1) {
|
|
221
|
+
os = 'Linux';
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
browser: browser,
|
|
225
|
+
browserVersion: browserVersion,
|
|
226
|
+
os: os,
|
|
227
|
+
osVersion: osVersion
|
|
228
|
+
};
|
|
229
|
+
}
|
package/lib/dbQueue.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author : 黄震 huangzhen@yfpharmacy.com
|
|
3
|
+
* @Date : 2025-11-21 14:32:51
|
|
4
|
+
* @LastEditors : 黄震 huangzhen@yfpharmacy.com
|
|
5
|
+
* @LastEditTime : 2025-11-21 14:38:50
|
|
6
|
+
* @Description : 描述
|
|
7
|
+
* Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
19
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
20
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
21
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
22
|
+
function step(op) {
|
|
23
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
24
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
25
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
26
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
27
|
+
switch (op[0]) {
|
|
28
|
+
case 0: case 1: t = op; break;
|
|
29
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
30
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
31
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
32
|
+
default:
|
|
33
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
34
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
35
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
36
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
37
|
+
if (t[2]) _.ops.pop();
|
|
38
|
+
_.trys.pop(); continue;
|
|
39
|
+
}
|
|
40
|
+
op = body.call(thisArg, _);
|
|
41
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
42
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
import { isBrowser, isIndexedDBAvailable } from "./utils";
|
|
46
|
+
// IndexedDB 轻量队列:作为 localStorage 的冗余通道
|
|
47
|
+
var IDBQueue = /** @class */ (function () {
|
|
48
|
+
function IDBQueue(dbName, storeName) {
|
|
49
|
+
if (dbName === void 0) { dbName = 'logger_sdk_db'; }
|
|
50
|
+
if (storeName === void 0) { storeName = 'queue'; }
|
|
51
|
+
this.db = null;
|
|
52
|
+
this.dbName = dbName;
|
|
53
|
+
this.storeName = storeName;
|
|
54
|
+
}
|
|
55
|
+
// 打开数据库并初始化对象仓库
|
|
56
|
+
IDBQueue.prototype.open = function () {
|
|
57
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
58
|
+
var _this = this;
|
|
59
|
+
return __generator(this, function (_a) {
|
|
60
|
+
if (!isBrowser() || !isIndexedDBAvailable())
|
|
61
|
+
return [2 /*return*/];
|
|
62
|
+
if (this.db)
|
|
63
|
+
return [2 /*return*/];
|
|
64
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
65
|
+
var req = indexedDB.open(_this.dbName, 1);
|
|
66
|
+
req.onupgradeneeded = function () {
|
|
67
|
+
var db = req.result;
|
|
68
|
+
if (!db.objectStoreNames.contains(_this.storeName))
|
|
69
|
+
db.createObjectStore(_this.storeName, { autoIncrement: true });
|
|
70
|
+
};
|
|
71
|
+
req.onsuccess = function () {
|
|
72
|
+
_this.db = req.result;
|
|
73
|
+
resolve();
|
|
74
|
+
};
|
|
75
|
+
req.onerror = function () { return reject(req.error); };
|
|
76
|
+
})];
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
// 入队:追加一条记录
|
|
81
|
+
IDBQueue.prototype.add = function (item) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
83
|
+
var _this = this;
|
|
84
|
+
return __generator(this, function (_a) {
|
|
85
|
+
if (!this.db)
|
|
86
|
+
return [2 /*return*/];
|
|
87
|
+
return [2 /*return*/, new Promise(function (res, rej) {
|
|
88
|
+
var tx = _this.db.transaction(_this.storeName, 'readwrite');
|
|
89
|
+
var st = tx.objectStore(_this.storeName);
|
|
90
|
+
var r = st.add(item);
|
|
91
|
+
r.onsuccess = function () { return res(); };
|
|
92
|
+
r.onerror = function () { return rej(r.error); };
|
|
93
|
+
})];
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
// 读取全部记录(调试/回溯用)
|
|
98
|
+
IDBQueue.prototype.getAll = function () {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
100
|
+
var _this = this;
|
|
101
|
+
return __generator(this, function (_a) {
|
|
102
|
+
if (!this.db)
|
|
103
|
+
return [2 /*return*/, []];
|
|
104
|
+
return [2 /*return*/, new Promise(function (res, rej) {
|
|
105
|
+
var tx = _this.db.transaction(_this.storeName, 'readonly');
|
|
106
|
+
var st = tx.objectStore(_this.storeName);
|
|
107
|
+
var req = st.getAll();
|
|
108
|
+
req.onsuccess = function () { return res(req.result || []); };
|
|
109
|
+
req.onerror = function () { return rej(req.error); };
|
|
110
|
+
})];
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
// 清空队列:发送成功后用于兜底清理
|
|
115
|
+
IDBQueue.prototype.clear = function () {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
117
|
+
var _this = this;
|
|
118
|
+
return __generator(this, function (_a) {
|
|
119
|
+
if (!this.db)
|
|
120
|
+
return [2 /*return*/];
|
|
121
|
+
return [2 /*return*/, new Promise(function (res, rej) {
|
|
122
|
+
var tx = _this.db.transaction(_this.storeName, 'readwrite');
|
|
123
|
+
var st = tx.objectStore(_this.storeName);
|
|
124
|
+
var req = st.clear();
|
|
125
|
+
req.onsuccess = function () { return res(undefined); };
|
|
126
|
+
req.onerror = function () { return rej(req.error); };
|
|
127
|
+
})];
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
return IDBQueue;
|
|
132
|
+
}());
|
|
133
|
+
export default IDBQueue;
|