@hsui/sdk
Version:
Hundsun frontend framework JSSDK
968 lines (943 loc) • 42.5 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
import _createClass from "@babel/runtime/helpers/esm/createClass";
import _inherits from "@babel/runtime/helpers/esm/inherits";
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
/**
* import { createLogger } from "@hsui/sdk";
* const loggerInstance = createLogger();
设置实例日志级别 'debug', 'info', 'warn', 'error'
loggerInstance.setLevel('warn');
loggerInstance.info("日志格式化 11111111111111");
日志只支持字符串格式,对象等需要处理好之后传进来
*/
import SuperClassLogLevel, { createLogger as huiCreateLogger } from '@hsui/logger';
import * as sm4 from './utils/crypto-sm4';
import { isUcf } from './utils/platform';
var KEY = '20220923huisdk344444';
var huiLogger = huiCreateLogger();
export var LogLevel = /*#__PURE__*/function (_SuperClassLogLevel) {
_inherits(LogLevel, _SuperClassLogLevel);
var _super = _createSuper(LogLevel);
function LogLevel() {
var _this;
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, LogLevel);
_this = _super.call(this);
// 默认埋点级别为 info
// 表名,在需要新建表时动态生成
_this.sheetname = null;
// 是否通过 console 打印
_this.enableConsole = true;
// 是否开启 indexdb 日志存储功能
_this.enableLogIndexDB = data.enableLogIndexDB === true ? true : false;
// 是否在 ucf 客户端
_this.isUcf = isUcf();
// 最大有效表数量
_this.maxSheetCount = data.maxSheetCount || 15;
// 单表最多插入数据条数
_this.maxSheetItemCount = data.maxSheetItemCount || 50000;
// 本地日志过期时间,以天为单位
_this.expiredDays = data.expiredDays || 7;
// 本地日志内容是否加密
_this.encryption = data.encryption === false ? false : true;
_this._indexdb = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if (!_this.isUcf && !_this._indexdb) {
huiLogger.debug('当前浏览器不支持 indexedDB,日志采集功能暂停使用。');
}
_this._init();
return _this;
}
_createClass(LogLevel, [{
key: "_init",
value: function () {
var _init2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var _this2 = this;
var levels;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (this.isUcf) {
levels = ['error', 'warn', 'info', 'debug']; // ucf 环境初始化
usdk.logger.createLogger('user');
levels[usdk.logger.getLogLevel()] && (this.level = levels[usdk.logger.getLogLevel()]);
}
// 定义埋点方法 debug, info, warn, error
this.levels.forEach(function (level, index) {
var logMethod = console[level];
Object.assign(_this2, _defineProperty({}, level, function () {
var _this3 = this;
var currentLevelIndex = this.levels.findIndex(function (item) {
return item === _this3.level;
});
if (currentLevelIndex > index) {
return;
}
for (var _len = arguments.length, content = new Array(_len), _key = 0; _key < _len; _key++) {
content[_key] = arguments[_key];
}
if (this.isUcf) {
// ucf 处理逻辑 usdk logDebug logError logInfo logWarn
var keysUcf = {
debug: 'logDebug',
info: 'logInfo',
warn: 'logWarn',
error: 'logError'
};
// 处理日志埋点参数转为字符串,格式化
var contentStr = this.handleContent(content, level);
usdk.logger[keysUcf[level]]('user', contentStr, dateFormat(new Date(), 'yyyy-MM-dd HH:mm:ss.S'));
return;
}
// 如果设置 console 的方法
var userAgent = window.navigator.userAgent.toLowerCase();
var isIE = userAgent.match(/msie/) != null || userAgent.match(/trident/) != null;
if (!isIE && this.enableConsole) {
logMethod.apply(this, this._handleContent(level, content));
}
// 如果开启日志存储并且支持 indexDB 并且在当前实例的日志级别记录范围
if (this.enableLogIndexDB && this._indexdb) {
// 处理日志埋点参数转为字符串,格式化
var _contentStr = this.handleContent(content, level);
this.track(_contentStr);
}
}));
});
// 如果关闭日志采集或者在客户端下不走下边操作表逻辑
if (!(!this._indexdb || this.isUcf)) {
_context.next = 4;
break;
}
return _context.abrupt("return");
case 4:
_context.prev = 4;
// 连接数据库,需要新建表时在更新数据库
this.deleteIDBDatabasePromise = this.deleteIndexdbStore();
_context.t0 = this.deleteIDBDatabasePromise;
if (!_context.t0) {
_context.next = 10;
break;
}
_context.next = 10;
return this.deleteIDBDatabasePromise;
case 10:
this.createDatabaseTablePromise = this.createDatabaseTable('HUI-ET-BASE-INFO');
_context.t1 = this.createDatabaseTablePromise;
if (!_context.t1) {
_context.next = 15;
break;
}
_context.next = 15;
return this.createDatabaseTablePromise;
case 15:
_context.next = 20;
break;
case 17:
_context.prev = 17;
_context.t2 = _context["catch"](4);
huiLogger.debug('@hsui/tracker 初始化失败', _context.t2);
case 20:
case "end":
return _context.stop();
}
}, _callee, this, [[4, 17]]);
}));
function _init() {
return _init2.apply(this, arguments);
}
return _init;
}() // 修改日志采集类配置项, 因为操作表架构是在初始化时执行,此时修改配置也不会再次更新表结构,所以不能在这里配置 maxSheetCount、expiredDays
}, {
key: "setConfig",
value: function () {
var _setConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
var _this4 = this;
var data,
configKeys,
dataKeys,
_args2 = arguments;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
data = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
configKeys = ['maxSheetItemCount', 'enableConsole', 'enableLogIndexDB'];
dataKeys = Object.keys(data);
dataKeys.map(function (key) {
configKeys.includes(key) && (_this4[key] = data[key]);
});
case 4:
case "end":
return _context2.stop();
}
}, _callee2);
}));
function setConfig() {
return _setConfig.apply(this, arguments);
}
return setConfig;
}() // 新建表
}, {
key: "createDatabaseTable",
value: function createDatabaseTable(sheetname) {
var _this5 = this;
return new Promise( /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(resolve, reject) {
var version, openIDBDatabase;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
_context3.t0 = _this5.deleteIDBDatabasePromise;
if (!_context3.t0) {
_context3.next = 5;
break;
}
_context3.next = 5;
return _this5.deleteIDBDatabasePromise;
case 5:
_context3.next = 7;
return _this5.getDatabaseVersion();
case 7:
_context3.t1 = _context3.sent;
version = _context3.t1 + 1;
// 更新数据库
openIDBDatabase = _this5._indexdb.open('HuiTracker', version); // 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件 upgradeneeded
openIDBDatabase.onupgradeneeded = function (event) {
huiLogger.debug('更新 indexdb 数据库');
var IDBDatabase = event.target.result;
// 判断表是否存在
if (!IDBDatabase.objectStoreNames.contains(sheetname)) {
var IDBObjectStore = IDBDatabase.createObjectStore(sheetname, {
keyPath: 'id'
});
// 创建表之后创建索引,索引必须先创建再使用
IDBObjectStore.createIndex(sheetname, 'timestamp', {
unique: false
});
}
};
openIDBDatabase.onsuccess = function (event) {
var IDBDatabase = event.target.result;
IDBDatabase.close();
huiLogger.debug('打开 indexdb 数据库成功');
resolve(true);
};
openIDBDatabase.onerror = function (error) {
huiLogger.debug('打开 indexdb 数据库时出错', error);
_this5.sheetname = '';
reject(false);
};
_context3.next = 19;
break;
case 15:
_context3.prev = 15;
_context3.t2 = _context3["catch"](0);
huiLogger.debug('新建 indexdb 表时出错');
reject(false);
case 19:
case "end":
return _context3.stop();
}
}, _callee3, null, [[0, 15]]);
}));
return function (_x, _x2) {
return _ref.apply(this, arguments);
};
}());
}
// userId 在外框登录后存在一个基础信息表, 每次去表里取值
}, {
key: "track",
value: function () {
var _track = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
var _this6 = this;
var content,
userInfo,
openIDBDatabase,
_args6 = arguments;
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
content = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : '';
_context6.prev = 1;
_context6.t0 = this.deleteIDBDatabasePromise;
if (!_context6.t0) {
_context6.next = 6;
break;
}
_context6.next = 6;
return this.deleteIDBDatabasePromise;
case 6:
_context6.t1 = this.createDatabaseTablePromise;
if (!_context6.t1) {
_context6.next = 10;
break;
}
_context6.next = 10;
return this.createDatabaseTablePromise;
case 10:
_context6.t2 = this.getItemByIdPromise;
if (!_context6.t2) {
_context6.next = 14;
break;
}
_context6.next = 14;
return this.getItemByIdPromise;
case 14:
// 获取用户信息表里用户数据
this.getItemByIdPromise = this.getItemById('HUI-ET-BASE-INFO', 'userinfo');
_context6.t3 = this.getItemByIdPromise;
if (!_context6.t3) {
_context6.next = 20;
break;
}
_context6.next = 19;
return this.getItemByIdPromise;
case 19:
_context6.t3 = _context6.sent;
case 20:
userInfo = _context6.t3;
this.userId = userInfo && userInfo.userId ? userInfo.userId : '';
openIDBDatabase = this._indexdb.open('HuiTracker');
openIDBDatabase.onsuccess = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(event) {
var IDBDatabase, sheetStoreNames, currentSheetname, nowSheetname, indexdbsheet, indexdbsheetCount;
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
huiLogger.debug('打开 indexdb 数据库成功');
IDBDatabase = event.target.result; // 如果没有设置 this.sheetname 判断 DBDatabase.objectStoreNames 是否含有当天表,如果没有创建当天 1 表,如果有找当天序号最大子表设置为 this.sheetname,
// 如果设置了 this.sheetname 按照 this.sheetname 创建新表
sheetStoreNames = filterLogTable(_toConsumableArray(IDBDatabase.objectStoreNames));
sheetStoreNames.forEach(function (item) {
var splitSheetName = item.split('-'),
todayDate = dateFormat(new Date(), 'yyyyMMdd');
// 如果存在当天的表,获取当天最新的表名存入 currentSheetname
if (splitSheetName[2] === todayDate) {
if (!currentSheetname || currentSheetname && parseInt(item.split('-')[3]) > parseInt(currentSheetname.split('-')[3])) {
currentSheetname = item;
}
}
});
// 如果 currentSheetname 没有值说明不存在当天的表,需要新建当天表,如果有设为 sheetname
if (!currentSheetname) {
_context5.next = 12;
break;
}
// 如果有当天表直接连表操作数据
// 判断当前表是否超过 50000 条,超出了需要新建当天子表,然后再次走 track 逻辑
nowSheetname = _this6.sheetname = currentSheetname; // 请求表
indexdbsheet = IDBDatabase.transaction([_this6.sheetname], 'readwrite').objectStore(_this6.sheetname); // 获取当前表存储条数
indexdbsheetCount = indexdbsheet.count();
indexdbsheetCount.onsuccess = /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(event) {
var indexdbsheetRequest;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
if (!(event.target.result < _this6.maxSheetItemCount)) {
_context4.next = 7;
break;
}
// 添加数据
indexdbsheetRequest = indexdbsheet.add({
id: uuid(),
// 需要传递设置的主 key :id
content: content,
timestamp: new Date().getTime(),
userId: _this6.userId ? _this6.userId : ''
});
indexdbsheetRequest.onsuccess = function (event) {
huiLogger.debug('indexdb 插入数据成功');
// // 处理结束需要关闭数据库链接,否则后续操作会不正常执行
IDBDatabase.close();
};
indexdbsheetRequest.onerror = function (error) {
huiLogger.debug('indexdb 插入数据时出错', error);
IDBDatabase.close();
};
_this6.sheetname = '';
_context4.next = 24;
break;
case 7:
// 新建表这里用 nowSheetname 保留埋点时的 this.sheetname, 否则多个埋点同时触发该条件时子表名序号不是连贯的
_this6.sheetname = "HUI-ET-".concat(dateFormat(new Date(), 'yyyyMMdd')) + '-' + (parseInt(nowSheetname.split('-')[3]) + 1);
// 调用新建表方法,在新建表之后再次调用 track
_context4.prev = 8;
IDBDatabase.close();
// 如果当前有创建表的操作,等创建好之后在执行以下逻辑
_context4.t0 = _this6.createDatabaseTablePromise;
if (!_context4.t0) {
_context4.next = 14;
break;
}
_context4.next = 14;
return _this6.createDatabaseTablePromise;
case 14:
_this6.createDatabaseTablePromise = _this6.createDatabaseTable(_this6.sheetname);
_context4.next = 17;
return _this6.createDatabaseTablePromise;
case 17:
_this6.track(content);
_context4.next = 24;
break;
case 20:
_context4.prev = 20;
_context4.t1 = _context4["catch"](8);
huiLogger.debug('新建 indexdb 表报错');
IDBDatabase.close();
case 24:
case "end":
return _context4.stop();
}
}, _callee4, null, [[8, 20]]);
}));
return function (_x4) {
return _ref3.apply(this, arguments);
};
}();
indexdbsheetCount.onerror = function (error) {
huiLogger.debug('indexdb 获取表存储数量时出错', error);
_this6.sheetname = '';
IDBDatabase.close();
};
_context5.next = 28;
break;
case 12:
IDBDatabase.close();
// 如果没有当天表需要新建当天表,然后再次走 track 逻辑
_this6.sheetname = "HUI-ET-".concat(dateFormat(new Date(), 'yyyyMMdd'), "-1");
// 调用新建表方法,在新建表之后再次调用 track
_context5.prev = 14;
_context5.t0 = _this6.createDatabaseTablePromise;
if (!_context5.t0) {
_context5.next = 19;
break;
}
_context5.next = 19;
return _this6.createDatabaseTablePromise;
case 19:
_this6.createDatabaseTablePromise = _this6.createDatabaseTable(_this6.sheetname);
_context5.next = 22;
return _this6.createDatabaseTablePromise;
case 22:
_this6.track(content);
_context5.next = 28;
break;
case 25:
_context5.prev = 25;
_context5.t1 = _context5["catch"](14);
huiLogger.debug('新建 indexdb 表报错');
case 28:
case "end":
return _context5.stop();
}
}, _callee5, null, [[14, 25]]);
}));
return function (_x3) {
return _ref2.apply(this, arguments);
};
}();
openIDBDatabase.onerror = function (error) {
huiLogger.debug('打开 indexdb 数据库时出错', error);
_this6.sheetname = null;
};
_context6.next = 32;
break;
case 27:
_context6.prev = 27;
_context6.t4 = _context6["catch"](1);
huiLogger.debug('indexdb 埋点时出错,日志未记录', _context6.t4);
this.sheetname = null;
return _context6.abrupt("return");
case 32:
case "end":
return _context6.stop();
}
}, _callee6, this, [[1, 27]]);
}));
function track() {
return _track.apply(this, arguments);
}
return track;
}() // 格式化日志内容
}, {
key: "handleContent",
value: function handleContent() {
var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'info';
var logTime = dateFormat(new Date(), 'yyyy-MM-dd HH:mm:ss.S');
var logLevel = level.toUpperCase();
// content 参数数组拼接为字符串
var contentStr = content.reduce(function (total, value) {
try {
// 处理函数类型
if (Object.prototype.toString.call(value) === '[object Function]') {
return "".concat(total, " ").concat(value.toString());
}
// 处理对象、数组
if (Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === '[object Array]') {
return "".concat(total, " ").concat(JSON.stringify(value));
}
return "".concat(total, " ").concat(value);
} catch (err) {
return total;
}
}, '');
// ucf 客户端下不加密
if (this.isUcf) {
return contentStr;
} else {
return this.encryption ? sm4.encrypt("[".concat(logTime, "] [").concat(logLevel, "]").concat(contentStr), KEY) : "[".concat(logTime, "] [").concat(logLevel, "]").concat(contentStr);
}
}
// 打开数据库读取数据
}, {
key: "openDatabase",
value: function openDatabase(_ref4) {
var onsuccess = _ref4.onsuccess,
onerror = _ref4.onerror;
var openIDBDatabase = this._indexdb.open('HuiTracker');
openIDBDatabase.onsuccess = onsuccess;
openIDBDatabase.onerror = onerror;
}
// 获取本地日志
}, {
key: "getLocalLogs",
value: function getLocalLogs(startTime, endTime, userId) {
var _this7 = this;
return new Promise( /*#__PURE__*/function () {
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(resolve, reject) {
var validLogs, getTablePromiseList, keyRangeValue;
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
_context8.prev = 0;
_context8.t0 = _this7.deleteIDBDatabasePromise;
if (!_context8.t0) {
_context8.next = 5;
break;
}
_context8.next = 5;
return _this7.deleteIDBDatabasePromise;
case 5:
validLogs = [], getTablePromiseList = [];
keyRangeValue = IDBKeyRange.bound(startTime, endTime);
_this7.openDatabase({
onsuccess: function onsuccess(event) {
var IDBDatabase = event.target.result;
getTablePromiseList = filterLogTable(_toConsumableArray(IDBDatabase.objectStoreNames)).map( /*#__PURE__*/function () {
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(item) {
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
return _context7.abrupt("return", _this7.getTableBydatetime(item, keyRangeValue, IDBDatabase));
case 1:
case "end":
return _context7.stop();
}
}, _callee7);
}));
return function (_x7) {
return _ref6.apply(this, arguments);
};
}());
Promise.all(getTablePromiseList).then(function (values) {
validLogs = values.reduce(function (target, item) {
return item ? target.concat(item) : target;
}, []);
validLogs.forEach(function (item) {
item.content = _this7.encryption ? sm4.decrypt(item.content, KEY) : item.content;
});
var filterLogsStr = _this7.filterLogs(validLogs, userId);
IDBDatabase.close();
resolve(filterLogsStr);
}).catch(function (err) {
huiLogger.error(err);
IDBDatabase.close();
reject(false);
});
},
onerror: function onerror(error) {
huiLogger.error('打开 indexdb 数据库时出错', error);
reject(false);
}
});
_context8.next = 14;
break;
case 10:
_context8.prev = 10;
_context8.t1 = _context8["catch"](0);
huiLogger.error('获取本地 indexdb 日志失败');
reject(false);
case 14:
case "end":
return _context8.stop();
}
}, _callee8, null, [[0, 10]]);
}));
return function (_x5, _x6) {
return _ref5.apply(this, arguments);
};
}());
}
// 处理收集的日志,过滤用户,拼接成字符串
}, {
key: "filterLogs",
value: function filterLogs(logs, userId) {
return logs.reduce(function (total, current) {
if (current.userId === userId) {
return total.concat(current.content, '\n');
}
return total;
}, []);
}
// 插入单条记录 存储用户信息使用
}, {
key: "putItemById",
value: function putItemById(sheetname, data) {
var _this8 = this;
return new Promise( /*#__PURE__*/function () {
var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(resolve, reject) {
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
_context9.prev = 0;
_context9.t0 = _this8.deleteIDBDatabasePromise;
if (!_context9.t0) {
_context9.next = 5;
break;
}
_context9.next = 5;
return _this8.deleteIDBDatabasePromise;
case 5:
_context9.t1 = _this8.createDatabaseTablePromise;
if (!_context9.t1) {
_context9.next = 9;
break;
}
_context9.next = 9;
return _this8.createDatabaseTablePromise;
case 9:
_this8.openDatabase({
onsuccess: function onsuccess(event) {
var IDBDatabase = event.target.result;
if (IDBDatabase.objectStoreNames.contains(sheetname)) {
var indexdbsheet = IDBDatabase.transaction([sheetname], 'readwrite').objectStore(sheetname);
var indexdbsheetRequest = indexdbsheet.put(data);
indexdbsheetRequest.onsuccess = function (event) {
// // 处理结束需要关闭数据库链接,否则后续操作会不正常执行
IDBDatabase.close();
resolve(true);
};
indexdbsheetRequest.onerror = function (error) {
IDBDatabase.close();
huiLogger.error('indexdb 插入单条记录时出错', error);
reject(false);
};
} else {
IDBDatabase.close();
reject(false);
}
},
onerror: function onerror(error) {
huiLogger.error('打开 indexdb 数据库时出错', error);
reject(false);
}
});
_context9.next = 15;
break;
case 12:
_context9.prev = 12;
_context9.t2 = _context9["catch"](0);
reject(false);
case 15:
case "end":
return _context9.stop();
}
}, _callee9, null, [[0, 12]]);
}));
return function (_x8, _x9) {
return _ref7.apply(this, arguments);
};
}());
}
// 根据 id 获取单条数据
}, {
key: "getItemById",
value: function getItemById(sheetname, id) {
var _this9 = this;
return new Promise( /*#__PURE__*/function () {
var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(resolve, reject) {
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
_context10.prev = 0;
_context10.t0 = _this9.deleteIDBDatabasePromise;
if (!_context10.t0) {
_context10.next = 5;
break;
}
_context10.next = 5;
return _this9.deleteIDBDatabasePromise;
case 5:
_this9.openDatabase({
onsuccess: function onsuccess(event) {
huiLogger.debug('打开 indexdb 数据库成功');
var IDBDatabase = event.target.result;
if (IDBDatabase.objectStoreNames.contains(sheetname)) {
var indexdbsheet = IDBDatabase.transaction(sheetname, 'readwrite').objectStore(sheetname);
var request = indexdbsheet.get(id);
request.onsuccess = function (event) {
huiLogger.debug(event.target.result);
IDBDatabase.close();
resolve(event.target.result);
};
request.onerror = function (error) {
huiLogger.error(error);
IDBDatabase.close();
reject(false);
};
} else {
IDBDatabase.close();
resolve(false);
}
},
onerror: function onerror(error) {
huiLogger.error('打开 indexdb 数据库时出错', error);
reject(false);
}
});
_context10.next = 11;
break;
case 8:
_context10.prev = 8;
_context10.t1 = _context10["catch"](0);
reject(false);
case 11:
case "end":
return _context10.stop();
}
}, _callee10, null, [[0, 8]]);
}));
return function (_x10, _x11) {
return _ref8.apply(this, arguments);
};
}());
}
// 根据时间周期获取单个表里复核范围的日志 游标
}, {
key: "getTableBydatetime",
value: function getTableBydatetime(tableName, keyRangeValue, IDBDatabase) {
return new Promise(function (resolve, reject) {
try {
var sheetQueryList = [];
var indexdbsheet = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName);
var indexdbIndex = indexdbsheet.index(tableName);
var indexdbCursor = indexdbIndex.openCursor(keyRangeValue);
indexdbCursor.onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
sheetQueryList.push(cursor.value);
cursor.continue();
} else {
resolve(sheetQueryList);
}
};
indexdbCursor.onerror = function (error) {
huiLogger.error(error);
reject(false);
};
} catch (error) {
huiLogger.error('获取本地日志时报错');
reject(false);
}
});
}
// 删除过期时间的表
}, {
key: "deleteIndexdbStore",
value: function deleteIndexdbStore() {
var _this10 = this;
return new Promise( /*#__PURE__*/function () {
var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(resolve, reject) {
var version, openIDBDatabase;
return _regeneratorRuntime().wrap(function _callee11$(_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
_context11.next = 2;
return _this10.getDatabaseVersion();
case 2:
_context11.t0 = _context11.sent;
version = _context11.t0 + 1;
openIDBDatabase = _this10._indexdb.open('HuiTracker', version);
openIDBDatabase.onupgradeneeded = function (event) {
var IDBDatabase = event.target.result;
var currentSheetNames = filterLogTable(_toConsumableArray(IDBDatabase.objectStoreNames));
var expiredDate = dateFormat(new Date(new Date().getTime() - _this10.expiredDays * 1000 * 60 * 60 * 24), 'yyyyMMdd');
// 筛选出过期的表和在有效期内的表
var classifySheetNames = currentSheetNames.reduce(function (target, item) {
if (parseInt(item.split('-')[2]) <= parseInt(expiredDate)) {
// 筛选超出过期时间的表
target.expiredSheetNames.push(item);
} else {
// 筛选超出有效期时间的表
target.validSheetNames.push(item);
}
return target;
}, {
expiredSheetNames: [],
validSheetNames: []
});
// 如果有效日期的表超出设置的最大表数量,筛选出有效表内最早的表
var validCountDifferent = classifySheetNames.validSheetNames.length - _this10.maxSheetCount,
deleteSheetNames = [];
if (validCountDifferent > 0) {
// 对有效日期内的表进行排序,筛选出超出最大表数量的表
classifySheetNames.validSheetNames = sortSheetName(classifySheetNames.validSheetNames);
deleteSheetNames = classifySheetNames.validSheetNames.splice(0, validCountDifferent);
}
classifySheetNames.expiredSheetNames = classifySheetNames.expiredSheetNames.concat(deleteSheetNames);
// 判断当前数据库是否有该表名有才做删除逻辑
classifySheetNames.expiredSheetNames.forEach(function (item) {
IDBDatabase.objectStoreNames.contains(item) && IDBDatabase.deleteObjectStore(item);
});
};
openIDBDatabase.onsuccess = function (event) {
var IDBDatabase = event.target.result;
IDBDatabase.close();
resolve(true);
};
openIDBDatabase.onerror = function (error) {
huiLogger.error('打开 indexdb 数据库 HuiTracker 时出错', error);
reject(false);
};
case 8:
case "end":
return _context11.stop();
}
}, _callee11);
}));
return function (_x12, _x13) {
return _ref9.apply(this, arguments);
};
}());
}
// 获取数据库版本号
}, {
key: "getDatabaseVersion",
value: function getDatabaseVersion() {
var _this11 = this;
return new Promise(function (resolve, reject) {
var openIDBDatabase = _this11._indexdb.open('HuiTracker');
openIDBDatabase.onsuccess = function (event) {
var IDBDatabase = event.target.result;
var version = IDBDatabase.version;
IDBDatabase.close();
resolve(version);
};
openIDBDatabase.onerror = function (error) {
huiLogger.error('打开 indexdb 数据库 HuiTracker 时出错', error);
reject(error);
};
});
}
}]);
return LogLevel;
}(SuperClassLogLevel);
/**
* 日期格式化
* date: 日期对象
* format:时间格式
* 引用 dateFormat(new Date("2016-05-05 12:23:26"),"yyyy-MM-dd HH:mm:ss")
*/
function dateFormat(date, format) {
var o = {
'M+': date.getMonth() + 1,
//月份
'd+': date.getDate(),
//日
'H+': date.getHours(),
//小时
'm+': date.getMinutes(),
//分
's+': date.getSeconds(),
//秒
'q+': Math.floor((date.getMonth() + 3) / 3),
//季度
S: date.getMilliseconds() //毫秒
};
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
for (var k in o) if (new RegExp('(' + k + ')').test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
return format;
}
/**
* 表名排序
* 表名集合
*/
function sortSheetName(arr) {
// 创建一个数组对象,列出每天对应的表集合
var dateArrayObj = arr.reduce(function (tar, item) {
var key = parseInt(item.split('-')[2]);
if (tar[key]) {
tar[key].push(item);
return tar;
} else {
tar[key] = [item];
return tar;
}
}, {});
// 获取对象数组的 key 集合,并根据大小排序
var keysArr = Object.keys(dateArrayObj).sort(function (objA, objB) {
if (objA < objB) {
return -1;
} else if (objA > objB) {
return 1;
}
});
// 针对每天的表进行排序,在按照日期前后拼接在一起
var finallySheetNames = keysArr.reduce(function (tar, item) {
dateArrayObj[item].sort(function (objA, objB) {
if (parseInt(objA.split('-')[3]) < parseInt(objB.split('-')[3])) {
return -1;
} else if (parseInt(objA.split('-')[3]) > parseInt(objB.split('-')[3])) {
return 1;
}
});
return tar.concat(dateArrayObj[item]);
}, []);
return finallySheetNames;
}
// 过滤出存储日志埋点的表
function filterLogTable(names) {
// 匹配以 HUI-ET- 开头接八位数字接任意字符的字符串
var reg = /^HUI-ET-\d{8}.*/;
return names.filter(function (item) {
return reg.test(item);
});
}
/**
* simple generate uuid
* 支持 ie10 及以上
* 基于 uuid v4 添加 performance.now 避免重复
*/
function uuid() {
var d = Date.now();
if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
});
}
export function createLogger() {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new LogLevel(data);
}