sentry-uniapp
Version:
用于Uniapp/小程序/快应用等平台的 Sentry SDK
166 lines • 5.87 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.TryCatch = void 0;
var utils_1 = require("@sentry/utils");
var helpers_1 = require("../helpers");
/** Wrap timer functions and event targets to catch errors and provide better meta data */
var TryCatch = /** @class */ (function () {
function TryCatch() {
/** JSDoc */
this._ignoreOnError = 0;
/**
* @inheritDoc
*/
this.name = TryCatch.id;
}
/** JSDoc */
TryCatch.prototype._wrapTimeFunction = function (original) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var originalCallback = args[0];
args[0] = helpers_1.wrap(originalCallback, {
mechanism: {
data: { function: getFunctionName(original) },
handled: true,
type: "instrument"
}
});
return original.apply(this, args);
};
};
/** JSDoc */
TryCatch.prototype._wrapRAF = function (original) {
return function (callback) {
return original(helpers_1.wrap(callback, {
mechanism: {
data: {
function: "requestAnimationFrame",
handler: getFunctionName(original)
},
handled: true,
type: "instrument"
}
}));
};
};
/** JSDoc */
TryCatch.prototype._wrapEventTarget = function (target) {
var global = utils_1.getGlobalObject();
var proto = global[target] && global[target].prototype;
if (!proto ||
!proto.hasOwnProperty ||
!proto.hasOwnProperty("addEventListener")) {
return;
}
utils_1.fill(proto, "addEventListener", function (original) {
return function (eventName, fn, options) {
try {
// tslint:disable-next-line:no-unbound-method strict-type-predicates
if (typeof fn.handleEvent === "function") {
fn.handleEvent = helpers_1.wrap(fn.handleEvent.bind(fn), {
mechanism: {
data: {
function: "handleEvent",
handler: getFunctionName(fn),
target: target
},
handled: true,
type: "instrument"
}
});
}
}
catch (err) {
// can sometimes get 'Permission denied to access property "handle Event'
}
return original.call(this, eventName, helpers_1.wrap(fn, {
mechanism: {
data: {
function: "addEventListener",
handler: getFunctionName(fn),
target: target
},
handled: true,
type: "instrument"
}
}), options);
};
});
utils_1.fill(proto, "removeEventListener", function (original) {
return function (eventName, fn, options) {
var callback = fn;
try {
callback = callback && (callback.__sentry_wrapped__ || callback);
}
catch (e) {
// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
}
return original.call(this, eventName, callback, options);
};
});
};
/**
* Wrap timer functions and event targets to catch errors
* and provide better metadata.
*/
TryCatch.prototype.setupOnce = function () {
this._ignoreOnError = this._ignoreOnError;
var global = utils_1.getGlobalObject();
utils_1.fill(global, "setTimeout", this._wrapTimeFunction.bind(this));
utils_1.fill(global, "setInterval", this._wrapTimeFunction.bind(this));
utils_1.fill(global, "requestAnimationFrame", this._wrapRAF.bind(this));
[
"EventTarget",
"Window",
"Node",
"ApplicationCache",
"AudioTrackList",
"ChannelMergerNode",
"CryptoOperation",
"EventSource",
"FileReader",
"HTMLUnknownElement",
"IDBDatabase",
"IDBRequest",
"IDBTransaction",
"KeyOperation",
"MediaController",
"MessagePort",
"ModalWindow",
"Notification",
"SVGElementInstance",
"Screen",
"TextTrack",
"TextTrackCue",
"TextTrackList",
"WebSocket",
"WebSocketWorker",
"Worker",
"XMLHttpRequest",
"XMLHttpRequestEventTarget",
"XMLHttpRequestUpload"
].forEach(this._wrapEventTarget.bind(this));
};
/**
* @inheritDoc
*/
TryCatch.id = "TryCatch";
return TryCatch;
}());
exports.TryCatch = TryCatch;
/**
* Safely extract function name from itself
*/
function getFunctionName(fn) {
try {
return (fn && fn.name) || "<anonymous>";
}
catch (e) {
// Just accessing custom props in some Selenium environments
// can cause a "Permission denied" exception (see raven-js#495).
return "<anonymous>";
}
}
//# sourceMappingURL=trycatch.js.map