@zuzuche/sentry-miniapp
Version:
用于小程序/小游戏平台的 Sentry SDK
179 lines • 7.72 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.GlobalHandlers = void 0;
var tslib_1 = require("tslib");
var core_1 = require("@sentry/core");
var utils_1 = require("@sentry/utils");
var crossPlatform_1 = require("../crossPlatform");
/** Global handlers */
var GlobalHandlers = /** @class */ (function () {
/** JSDoc */
function GlobalHandlers(options) {
/**
* @inheritDoc
*/
this.name = GlobalHandlers.id;
/** JSDoc */
this._onErrorHandlerInstalled = false;
/** JSDoc */
this._onUnhandledRejectionHandlerInstalled = false;
/** JSDoc */
this._onPageNotFoundHandlerInstalled = false;
/** JSDoc */
this._onMemoryWarningHandlerInstalled = false;
this._options = tslib_1.__assign({ onerror: true, onunhandledrejection: true, onpagenotfound: true, onmemorywarning: true }, options);
}
/**
* @inheritDoc
*/
GlobalHandlers.prototype.setupOnce = function () {
Error.stackTraceLimit = 50;
if (this._options.onerror) {
utils_1.logger.log("Global Handler attached: onError");
this._installGlobalOnErrorHandler();
}
if (this._options.onunhandledrejection) {
utils_1.logger.log("Global Handler attached: onunhandledrejection");
this._installGlobalOnUnhandledRejectionHandler();
}
if (this._options.onpagenotfound) {
utils_1.logger.log("Global Handler attached: onPageNotFound");
this._installGlobalOnPageNotFoundHandler();
}
if (this._options.onmemorywarning) {
utils_1.logger.log("Global Handler attached: onMemoryWarning");
this._installGlobalOnMemoryWarningHandler();
}
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
if (this._onErrorHandlerInstalled) {
return;
}
if (!!crossPlatform_1.sdk.onError) {
var currentHub_1 = core_1.getCurrentHub();
// https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onError.html
crossPlatform_1.sdk.onError(function (err, stack) {
// console.info("sentry-miniapp", error);
var error = err;
if (typeof err === 'string') {
error = new Error(err);
/**
* 微信的err是一个包含错误信息和堆栈的字符串
*/
if (crossPlatform_1.appName == 'wechat') {
var result = err.match(/(.*)\n(.*);/);
if (result) {
var _a = tslib_1.__read(result, 3), errName = _a[1], errMessage = _a[2];
error = new Error(errMessage);
error.name = errName;
error.stack = err;
}
}
/**
* 支付宝小程序 2.7.4+基础库支持stack
* @see https://opendocs.alipay.com/mini/00nnsx
*/
if (crossPlatform_1.appName === 'alipay' && typeof stack == 'string') {
error.stack = stack;
}
}
else if (typeof err == 'object') {
if (err instanceof Error) {
error = err;
}
// 微信小程序 部分api抛出的err是一个key为errMsg的对象
else if (crossPlatform_1.appName == 'wechat' && err.errMsg && typeof err.errMsg == 'string') {
error = new Error(err.errMsg);
}
}
currentHub_1.captureException(error);
});
}
this._onErrorHandlerInstalled = true;
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
if (this._onUnhandledRejectionHandlerInstalled) {
return;
}
if (!!crossPlatform_1.sdk.onUnhandledRejection) {
var currentHub_2 = core_1.getCurrentHub();
// https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html
crossPlatform_1.sdk.onUnhandledRejection(function (_a) {
// console.log(reason, typeof reason, promise)
// 为什么官方文档上说 reason 是 string 类型,但是实际返回的确实 object 类型
var reason = _a.reason, promise = _a.promise;
var error = reason;
if (typeof reason === 'string') {
error = new Error(reason);
}
else if (typeof reason == 'object') {
if (reason instanceof Error) {
error = reason;
// 微信小程序的reason 是一个key为errMsg的对象
}
else if (crossPlatform_1.appName == 'wechat' && reason.errMsg && typeof reason.errMsg == 'string') {
error = new Error(reason.errMsg);
}
}
currentHub_2.captureException(error, {
data: promise,
});
});
}
this._onUnhandledRejectionHandlerInstalled = true;
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnPageNotFoundHandler = function () {
if (this._onPageNotFoundHandlerInstalled) {
return;
}
if (!!crossPlatform_1.sdk.onPageNotFound) {
var currentHub_3 = core_1.getCurrentHub();
crossPlatform_1.sdk.onPageNotFound(function (res) {
var url = res.path.split("?")[0];
currentHub_3.setTag("pagenotfound", url);
currentHub_3.setExtra("message", JSON.stringify(res));
currentHub_3.captureMessage("\u9875\u9762\u65E0\u6CD5\u627E\u5230: " + url);
});
}
this._onPageNotFoundHandlerInstalled = true;
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnMemoryWarningHandler = function () {
if (this._onMemoryWarningHandlerInstalled) {
return;
}
if (!!crossPlatform_1.sdk.onMemoryWarning) {
var currentHub_4 = core_1.getCurrentHub();
crossPlatform_1.sdk.onMemoryWarning(function (_a) {
var _b = _a.level, level = _b === void 0 ? -1 : _b;
var levelMessage = "没有获取到告警级别信息";
switch (level) {
case 5:
levelMessage = "TRIM_MEMORY_RUNNING_MODERATE";
break;
case 10:
levelMessage = "TRIM_MEMORY_RUNNING_LOW";
break;
case 15:
levelMessage = "TRIM_MEMORY_RUNNING_CRITICAL";
break;
default:
return;
}
currentHub_4.setTag("memory-warning", String(level));
currentHub_4.setExtra("message", levelMessage);
currentHub_4.captureMessage("\u5185\u5B58\u4E0D\u8DB3\u544A\u8B66");
});
}
this._onMemoryWarningHandlerInstalled = true;
};
/**
* @inheritDoc
*/
GlobalHandlers.id = "GlobalHandlers";
return GlobalHandlers;
}());
exports.GlobalHandlers = GlobalHandlers;
//# sourceMappingURL=globalhandlers.js.map