diff --git a/windows/src/desktop/kmshell/xml/sentry.bundle.js b/windows/src/desktop/kmshell/xml/sentry.bundle.js
deleted file mode 100644
index de0dffe71f..0000000000
--- a/windows/src/desktop/kmshell/xml/sentry.bundle.js
+++ /dev/null
@@ -1,5689 +0,0 @@
-/*! @sentry/browser 5.15.0 (3ce26d5c) | https://github.com/getsentry/sentry-javascript */
-var Sentry = (function (exports) {
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
- this file except in compliance with the License. You may obtain a copy of the
- License at http://www.apache.org/licenses/LICENSE-2.0
-
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
- MERCHANTABLITY OR NON-INFRINGEMENT.
-
- See the Apache Version 2.0 License for specific language governing permissions
- and limitations under the License.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- function __rest(s, e) {
- var t = {};
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
- t[p] = s[p];
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
- t[p[i]] = s[p[i]];
- return t;
- }
-
- function __decorate(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- }
-
- function __param(paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- }
-
- function __metadata(metadataKey, metadataValue) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
- }
-
- function __awaiter(thisArg, _arguments, P, generator) {
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- }
-
- function __generator(thisArg, body) {
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
- function verb(n) { return function (v) { return step([n, v]); }; }
- function step(op) {
- if (f) throw new TypeError("Generator is already executing.");
- while (_) try {
- 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;
- if (y = 0, t) op = [op[0] & 2, t.value];
- switch (op[0]) {
- case 0: case 1: t = op; break;
- case 4: _.label++; return { value: op[1], done: false };
- case 5: _.label++; y = op[1]; op = [0]; continue;
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
- default:
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
- if (t[2]) _.ops.pop();
- _.trys.pop(); continue;
- }
- op = body.call(thisArg, _);
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
- }
- }
-
- function __exportStar(m, exports) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
- }
-
- function __values(o) {
- var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
- if (m) return m.call(o);
- return {
- next: function () {
- if (o && i >= o.length) o = void 0;
- return { value: o && o[i++], done: !o };
- }
- };
- }
-
- function __read(o, n) {
- var m = typeof Symbol === "function" && o[Symbol.iterator];
- if (!m) return o;
- var i = m.call(o), r, ar = [], e;
- try {
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
- }
- catch (error) { e = { error: error }; }
- finally {
- try {
- if (r && !r.done && (m = i["return"])) m.call(i);
- }
- finally { if (e) throw e.error; }
- }
- return ar;
- }
-
- function __spread() {
- for (var ar = [], i = 0; i < arguments.length; i++)
- ar = ar.concat(__read(arguments[i]));
- return ar;
- }
-
- function __await(v) {
- return this instanceof __await ? (this.v = v, this) : new __await(v);
- }
-
- function __asyncGenerator(thisArg, _arguments, generator) {
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
- function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
- function fulfill(value) { resume("next", value); }
- function reject(value) { resume("throw", value); }
- function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
- }
-
- function __asyncDelegator(o) {
- var i, p;
- return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
- }
-
- function __asyncValues(o) {
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
- var m = o[Symbol.asyncIterator], i;
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
- }
-
- function __makeTemplateObject(cooked, raw) {
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
- return cooked;
- }
- function __importStar(mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
- result.default = mod;
- return result;
- }
-
- function __importDefault(mod) {
- return (mod && mod.__esModule) ? mod : { default: mod };
- }
-
- var tslib_1 = /*#__PURE__*/Object.freeze({
- __extends: __extends,
- get __assign () { return __assign; },
- __rest: __rest,
- __decorate: __decorate,
- __param: __param,
- __metadata: __metadata,
- __awaiter: __awaiter,
- __generator: __generator,
- __exportStar: __exportStar,
- __values: __values,
- __read: __read,
- __spread: __spread,
- __await: __await,
- __asyncGenerator: __asyncGenerator,
- __asyncDelegator: __asyncDelegator,
- __asyncValues: __asyncValues,
- __makeTemplateObject: __makeTemplateObject,
- __importStar: __importStar,
- __importDefault: __importDefault
- });
-
- /** Console logging verbosity for the SDK. */
- var LogLevel;
- (function (LogLevel) {
- /** No logs will be generated. */
- LogLevel[LogLevel["None"] = 0] = "None";
- /** Only SDK internal errors will be logged. */
- LogLevel[LogLevel["Error"] = 1] = "Error";
- /** Information useful for debugging the SDK will be logged. */
- LogLevel[LogLevel["Debug"] = 2] = "Debug";
- /** All SDK actions will be logged. */
- LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
- })(LogLevel || (LogLevel = {}));
-
- /** JSDoc */
- (function (Severity) {
- /** JSDoc */
- Severity["Fatal"] = "fatal";
- /** JSDoc */
- Severity["Error"] = "error";
- /** JSDoc */
- Severity["Warning"] = "warning";
- /** JSDoc */
- Severity["Log"] = "log";
- /** JSDoc */
- Severity["Info"] = "info";
- /** JSDoc */
- Severity["Debug"] = "debug";
- /** JSDoc */
- Severity["Critical"] = "critical";
- })(exports.Severity || (exports.Severity = {}));
- // tslint:disable:completed-docs
- // tslint:disable:no-unnecessary-qualifier no-namespace
- (function (Severity) {
- /**
- * Converts a string-based level into a {@link Severity}.
- *
- * @param level string representation of Severity
- * @returns Severity
- */
- function fromString(level) {
- switch (level) {
- case 'debug':
- return Severity.Debug;
- case 'info':
- return Severity.Info;
- case 'warn':
- case 'warning':
- return Severity.Warning;
- case 'error':
- return Severity.Error;
- case 'fatal':
- return Severity.Fatal;
- case 'critical':
- return Severity.Critical;
- case 'log':
- default:
- return Severity.Log;
- }
- }
- Severity.fromString = fromString;
- })(exports.Severity || (exports.Severity = {}));
-
- /** The status of an Span. */
- var SpanStatus;
- (function (SpanStatus) {
- /** The operation completed successfully. */
- SpanStatus["Ok"] = "ok";
- /** Deadline expired before operation could complete. */
- SpanStatus["DeadlineExceeded"] = "deadline_exceeded";
- /** 401 Unauthorized (actually does mean unauthenticated according to RFC 7235) */
- SpanStatus["Unauthenticated"] = "unauthenticated";
- /** 403 Forbidden */
- SpanStatus["PermissionDenied"] = "permission_denied";
- /** 404 Not Found. Some requested entity (file or directory) was not found. */
- SpanStatus["NotFound"] = "not_found";
- /** 429 Too Many Requests */
- SpanStatus["ResourceExhausted"] = "resource_exhausted";
- /** Client specified an invalid argument. 4xx. */
- SpanStatus["InvalidArgument"] = "invalid_argument";
- /** 501 Not Implemented */
- SpanStatus["Unimplemented"] = "unimplemented";
- /** 503 Service Unavailable */
- SpanStatus["Unavailable"] = "unavailable";
- /** Other/generic 5xx. */
- SpanStatus["InternalError"] = "internal_error";
- /** Unknown. Any non-standard HTTP status code. */
- SpanStatus["UnknownError"] = "unknown_error";
- /** The operation was cancelled (typically by the user). */
- SpanStatus["Cancelled"] = "cancelled";
- /** Already exists (409) */
- SpanStatus["AlreadyExists"] = "already_exists";
- /** Operation was rejected because the system is not in a state required for the operation's */
- SpanStatus["FailedPrecondition"] = "failed_precondition";
- /** The operation was aborted, typically due to a concurrency issue. */
- SpanStatus["Aborted"] = "aborted";
- /** Operation was attempted past the valid range. */
- SpanStatus["OutOfRange"] = "out_of_range";
- /** Unrecoverable data loss or corruption */
- SpanStatus["DataLoss"] = "data_loss";
- })(SpanStatus || (SpanStatus = {}));
- // tslint:disable:no-unnecessary-qualifier no-namespace
- (function (SpanStatus) {
- /**
- * Converts a HTTP status code into a {@link SpanStatus}.
- *
- * @param httpStatus The HTTP response status code.
- * @returns The span status or {@link SpanStatus.UnknownError}.
- */
- // tslint:disable-next-line:completed-docs
- function fromHttpCode(httpStatus) {
- if (httpStatus < 400) {
- return SpanStatus.Ok;
- }
- if (httpStatus >= 400 && httpStatus < 500) {
- switch (httpStatus) {
- case 401:
- return SpanStatus.Unauthenticated;
- case 403:
- return SpanStatus.PermissionDenied;
- case 404:
- return SpanStatus.NotFound;
- case 409:
- return SpanStatus.AlreadyExists;
- case 413:
- return SpanStatus.FailedPrecondition;
- case 429:
- return SpanStatus.ResourceExhausted;
- default:
- return SpanStatus.InvalidArgument;
- }
- }
- if (httpStatus >= 500 && httpStatus < 600) {
- switch (httpStatus) {
- case 501:
- return SpanStatus.Unimplemented;
- case 503:
- return SpanStatus.Unavailable;
- case 504:
- return SpanStatus.DeadlineExceeded;
- default:
- return SpanStatus.InternalError;
- }
- }
- return SpanStatus.UnknownError;
- }
- SpanStatus.fromHttpCode = fromHttpCode;
- })(SpanStatus || (SpanStatus = {}));
-
- /** The status of an event. */
- (function (Status) {
- /** The status could not be determined. */
- Status["Unknown"] = "unknown";
- /** The event was skipped due to configuration or callbacks. */
- Status["Skipped"] = "skipped";
- /** The event was sent to Sentry successfully. */
- Status["Success"] = "success";
- /** The client is currently rate limited and will try again later. */
- Status["RateLimit"] = "rate_limit";
- /** The event could not be processed. */
- Status["Invalid"] = "invalid";
- /** A server-side error ocurred during submission. */
- Status["Failed"] = "failed";
- })(exports.Status || (exports.Status = {}));
- // tslint:disable:completed-docs
- // tslint:disable:no-unnecessary-qualifier no-namespace
- (function (Status) {
- /**
- * Converts a HTTP status code into a {@link Status}.
- *
- * @param code The HTTP response status code.
- * @returns The send status or {@link Status.Unknown}.
- */
- function fromHttpCode(code) {
- if (code >= 200 && code < 300) {
- return Status.Success;
- }
- if (code === 429) {
- return Status.RateLimit;
- }
- if (code >= 400 && code < 500) {
- return Status.Invalid;
- }
- if (code >= 500) {
- return Status.Failed;
- }
- return Status.Unknown;
- }
- Status.fromHttpCode = fromHttpCode;
- })(exports.Status || (exports.Status = {}));
-
- /**
- * Consumes the promise and logs the error when it rejects.
- * @param promise A promise to forget.
- */
-
- var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method
- /**
- * setPrototypeOf polyfill using __proto__
- */
- function setProtoOf(obj, proto) {
- // @ts-ignore
- obj.__proto__ = proto;
- return obj;
- }
- /**
- * setPrototypeOf polyfill using mixin
- */
- function mixinProperties(obj, proto) {
- for (var prop in proto) {
- if (!obj.hasOwnProperty(prop)) {
- // @ts-ignore
- obj[prop] = proto[prop];
- }
- }
- return obj;
- }
-
- /** An error emitted by Sentry SDKs and related utilities. */
- var SentryError = /** @class */ (function (_super) {
- __extends(SentryError, _super);
- function SentryError(message) {
- var _newTarget = this.constructor;
- var _this = _super.call(this, message) || this;
- _this.message = message;
- // tslint:disable:no-unsafe-any
- _this.name = _newTarget.prototype.constructor.name;
- setPrototypeOf(_this, _newTarget.prototype);
- return _this;
- }
- return SentryError;
- }(Error));
-
- /**
- * Checks whether given value's type is one of a few Error or Error-like
- * {@link isError}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isError(wat) {
- switch (Object.prototype.toString.call(wat)) {
- case '[object Error]':
- return true;
- case '[object Exception]':
- return true;
- case '[object DOMException]':
- return true;
- default:
- return isInstanceOf(wat, Error);
- }
- }
- /**
- * Checks whether given value's type is ErrorEvent
- * {@link isErrorEvent}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isErrorEvent(wat) {
- return Object.prototype.toString.call(wat) === '[object ErrorEvent]';
- }
- /**
- * Checks whether given value's type is DOMError
- * {@link isDOMError}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isDOMError(wat) {
- return Object.prototype.toString.call(wat) === '[object DOMError]';
- }
- /**
- * Checks whether given value's type is DOMException
- * {@link isDOMException}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isDOMException(wat) {
- return Object.prototype.toString.call(wat) === '[object DOMException]';
- }
- /**
- * Checks whether given value's type is a string
- * {@link isString}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isString(wat) {
- return Object.prototype.toString.call(wat) === '[object String]';
- }
- /**
- * Checks whether given value's is a primitive (undefined, null, number, boolean, string)
- * {@link isPrimitive}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isPrimitive(wat) {
- return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');
- }
- /**
- * Checks whether given value's type is an object literal
- * {@link isPlainObject}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isPlainObject(wat) {
- return Object.prototype.toString.call(wat) === '[object Object]';
- }
- /**
- * Checks whether given value's type is an Event instance
- * {@link isEvent}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isEvent(wat) {
- // tslint:disable-next-line:strict-type-predicates
- return typeof Event !== 'undefined' && isInstanceOf(wat, Event);
- }
- /**
- * Checks whether given value's type is an Element instance
- * {@link isElement}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isElement(wat) {
- // tslint:disable-next-line:strict-type-predicates
- return typeof Element !== 'undefined' && isInstanceOf(wat, Element);
- }
- /**
- * Checks whether given value's type is an regexp
- * {@link isRegExp}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isRegExp(wat) {
- return Object.prototype.toString.call(wat) === '[object RegExp]';
- }
- /**
- * Checks whether given value has a then function.
- * @param wat A value to be checked.
- */
- function isThenable(wat) {
- // tslint:disable:no-unsafe-any
- return Boolean(wat && wat.then && typeof wat.then === 'function');
- // tslint:enable:no-unsafe-any
- }
- /**
- * Checks whether given value's type is a SyntheticEvent
- * {@link isSyntheticEvent}.
- *
- * @param wat A value to be checked.
- * @returns A boolean representing the result.
- */
- function isSyntheticEvent(wat) {
- // tslint:disable-next-line:no-unsafe-any
- return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;
- }
- /**
- * Checks whether given value's type is an instance of provided constructor.
- * {@link isInstanceOf}.
- *
- * @param wat A value to be checked.
- * @param base A constructor to be used in a check.
- * @returns A boolean representing the result.
- */
- function isInstanceOf(wat, base) {
- try {
- // tslint:disable-next-line:no-unsafe-any
- return wat instanceof base;
- }
- catch (_e) {
- return false;
- }
- }
-
- /**
- * Truncates given string to the maximum characters count
- *
- * @param str An object that contains serializable values
- * @param max Maximum number of characters in truncated string
- * @returns string Encoded
- */
- function truncate(str, max) {
- if (max === void 0) { max = 0; }
- // tslint:disable-next-line:strict-type-predicates
- if (typeof str !== 'string' || max === 0) {
- return str;
- }
- return str.length <= max ? str : str.substr(0, max) + "...";
- }
- /**
- * Join values in array
- * @param input array of values to be joined together
- * @param delimiter string to be placed in-between values
- * @returns Joined values
- */
- function safeJoin(input, delimiter) {
- if (!Array.isArray(input)) {
- return '';
- }
- var output = [];
- // tslint:disable-next-line:prefer-for-of
- for (var i = 0; i < input.length; i++) {
- var value = input[i];
- try {
- output.push(String(value));
- }
- catch (e) {
- output.push('[value cannot be serialized]');
- }
- }
- return output.join(delimiter);
- }
- /**
- * Checks if the value matches a regex or includes the string
- * @param value The string value to be checked against
- * @param pattern Either a regex or a string that must be contained in value
- */
- function isMatchingPattern(value, pattern) {
- if (isRegExp(pattern)) {
- return pattern.test(value);
- }
- if (typeof pattern === 'string') {
- return value.indexOf(pattern) !== -1;
- }
- return false;
- }
-
- /**
- * Requires a module which is protected _against bundler minification.
- *
- * @param request The module path to resolve
- */
- function dynamicRequire(mod, request) {
- // tslint:disable-next-line: no-unsafe-any
- return mod.require(request);
- }
- /**
- * Checks whether we're in the Node.js or Browser environment
- *
- * @returns Answer to given question
- */
- function isNodeEnv() {
- // tslint:disable:strict-type-predicates
- return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';
- }
- var fallbackGlobalObject = {};
- /**
- * Safely get global scope object
- *
- * @returns Global scope object
- */
- function getGlobalObject() {
- return (isNodeEnv()
- ? global
- : typeof window !== 'undefined'
- ? window
- : typeof self !== 'undefined'
- ? self
- : fallbackGlobalObject);
- }
- /**
- * UUID4 generator
- *
- * @returns string Generated UUID4.
- */
- function uuid4() {
- var global = getGlobalObject();
- var crypto = global.crypto || global.msCrypto;
- if (!(crypto === void 0) && crypto.getRandomValues) {
- // Use window.crypto API if available
- var arr = new Uint16Array(8);
- crypto.getRandomValues(arr);
- // set 4 in byte 7
- // tslint:disable-next-line:no-bitwise
- arr[3] = (arr[3] & 0xfff) | 0x4000;
- // set 2 most significant bits of byte 9 to '10'
- // tslint:disable-next-line:no-bitwise
- arr[4] = (arr[4] & 0x3fff) | 0x8000;
- var pad = function (num) {
- var v = num.toString(16);
- while (v.length < 4) {
- v = "0" + v;
- }
- return v;
- };
- return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));
- }
- // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
- return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
- // tslint:disable-next-line:no-bitwise
- var r = (Math.random() * 16) | 0;
- // tslint:disable-next-line:no-bitwise
- var v = c === 'x' ? r : (r & 0x3) | 0x8;
- return v.toString(16);
- });
- }
- /**
- * Parses string form of URL into an object
- * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
- * // intentionally using regex and not href parsing trick because React Native and other
- * // environments where DOM might not be available
- * @returns parsed URL object
- */
- function parseUrl(url) {
- if (!url) {
- return {};
- }
- var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
- if (!match) {
- return {};
- }
- // coerce to undefined values to empty string so we don't get 'undefined'
- var query = match[6] || '';
- var fragment = match[8] || '';
- return {
- host: match[4],
- path: match[5],
- protocol: match[2],
- relative: match[5] + query + fragment,
- };
- }
- /**
- * Extracts either message or type+value from an event that can be used for user-facing logs
- * @returns event's description
- */
- function getEventDescription(event) {
- if (event.message) {
- return event.message;
- }
- if (event.exception && event.exception.values && event.exception.values[0]) {
- var exception = event.exception.values[0];
- if (exception.type && exception.value) {
- return exception.type + ": " + exception.value;
- }
- return exception.type || exception.value || event.event_id || '';
- }
- return event.event_id || '';
- }
- /** JSDoc */
- function consoleSandbox(callback) {
- var global = getGlobalObject();
- var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];
- if (!('console' in global)) {
- return callback();
- }
- var originalConsole = global.console;
- var wrappedLevels = {};
- // Restore all wrapped console methods
- levels.forEach(function (level) {
- if (level in global.console && originalConsole[level].__sentry_original__) {
- wrappedLevels[level] = originalConsole[level];
- originalConsole[level] = originalConsole[level].__sentry_original__;
- }
- });
- // Perform callback manipulations
- var result = callback();
- // Revert restoration to wrapped state
- Object.keys(wrappedLevels).forEach(function (level) {
- originalConsole[level] = wrappedLevels[level];
- });
- return result;
- }
- /**
- * Adds exception values, type and value to an synthetic Exception.
- * @param event The event to modify.
- * @param value Value of the exception.
- * @param type Type of the exception.
- * @hidden
- */
- function addExceptionTypeValue(event, value, type) {
- event.exception = event.exception || {};
- event.exception.values = event.exception.values || [];
- event.exception.values[0] = event.exception.values[0] || {};
- event.exception.values[0].value = event.exception.values[0].value || value || '';
- event.exception.values[0].type = event.exception.values[0].type || type || 'Error';
- }
- /**
- * Adds exception mechanism to a given event.
- * @param event The event to modify.
- * @param mechanism Mechanism of the mechanism.
- * @hidden
- */
- function addExceptionMechanism(event, mechanism) {
- if (mechanism === void 0) { mechanism = {}; }
- // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?
- try {
- // @ts-ignore
- // tslint:disable:no-non-null-assertion
- event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};
- Object.keys(mechanism).forEach(function (key) {
- // @ts-ignore
- event.exception.values[0].mechanism[key] = mechanism[key];
- });
- }
- catch (_oO) {
- // no-empty
- }
- }
- /**
- * A safe form of location.href
- */
- function getLocationHref() {
- try {
- return document.location.href;
- }
- catch (oO) {
- return '';
- }
- }
- /**
- * Given a child DOM element, returns a query-selector statement describing that
- * and its ancestors
- * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
- * @returns generated DOM path
- */
- function htmlTreeAsString(elem) {
- // try/catch both:
- // - accessing event.target (see getsentry/raven-js#838, #768)
- // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
- // - can throw an exception in some circumstances.
- try {
- var currentElem = elem;
- var MAX_TRAVERSE_HEIGHT = 5;
- var MAX_OUTPUT_LEN = 80;
- var out = [];
- var height = 0;
- var len = 0;
- var separator = ' > ';
- var sepLength = separator.length;
- var nextStr = void 0;
- while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {
- nextStr = _htmlElementAsString(currentElem);
- // bail out if
- // - nextStr is the 'html' element
- // - the length of the string that would be created exceeds MAX_OUTPUT_LEN
- // (ignore this limit if we are on the first iteration)
- if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {
- break;
- }
- out.push(nextStr);
- len += nextStr.length;
- currentElem = currentElem.parentNode;
- }
- return out.reverse().join(separator);
- }
- catch (_oO) {
- return '';
- }
- }
- /**
- * Returns a simple, query-selector representation of a DOM element
- * e.g. [HTMLElement] => input#foo.btn[name=baz]
- * @returns generated DOM path
- */
- function _htmlElementAsString(el) {
- var elem = el;
- var out = [];
- var className;
- var classes;
- var key;
- var attr;
- var i;
- if (!elem || !elem.tagName) {
- return '';
- }
- out.push(elem.tagName.toLowerCase());
- if (elem.id) {
- out.push("#" + elem.id);
- }
- className = elem.className;
- if (className && isString(className)) {
- classes = className.split(/\s+/);
- for (i = 0; i < classes.length; i++) {
- out.push("." + classes[i]);
- }
- }
- var attrWhitelist = ['type', 'name', 'title', 'alt'];
- for (i = 0; i < attrWhitelist.length; i++) {
- key = attrWhitelist[i];
- attr = elem.getAttribute(key);
- if (attr) {
- out.push("[" + key + "=\"" + attr + "\"]");
- }
- }
- return out.join('');
- }
- var INITIAL_TIME = Date.now();
- var prevNow = 0;
- var performanceFallback = {
- now: function () {
- var now = Date.now() - INITIAL_TIME;
- if (now < prevNow) {
- now = prevNow;
- }
- prevNow = now;
- return now;
- },
- timeOrigin: INITIAL_TIME,
- };
- var crossPlatformPerformance = (function () {
- if (isNodeEnv()) {
- try {
- var perfHooks = dynamicRequire(module, 'perf_hooks');
- return perfHooks.performance;
- }
- catch (_) {
- return performanceFallback;
- }
- }
- if (getGlobalObject().performance) {
- // Polyfill for performance.timeOrigin.
- //
- // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin
- // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.
- // tslint:disable-next-line:strict-type-predicates
- if (performance.timeOrigin === undefined) {
- // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a
- // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.
- // @ts-ignore
- // tslint:disable-next-line:deprecation
- performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;
- }
- }
- return getGlobalObject().performance || performanceFallback;
- })();
- /**
- * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.
- */
- function timestampWithMs() {
- return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;
- }
- var defaultRetryAfter = 60 * 1000; // 60 seconds
- /**
- * Extracts Retry-After value from the request header or returns default value
- * @param now current unix timestamp
- * @param header string representation of 'Retry-After' header
- */
- function parseRetryAfterHeader(now, header) {
- if (!header) {
- return defaultRetryAfter;
- }
- var headerDelay = parseInt("" + header, 10);
- if (!isNaN(headerDelay)) {
- return headerDelay * 1000;
- }
- var headerDate = Date.parse("" + header);
- if (!isNaN(headerDate)) {
- return headerDate - now;
- }
- return defaultRetryAfter;
- }
- var defaultFunctionName = '';
- /**
- * Safely extract function name from itself
- */
- function getFunctionName(fn) {
- try {
- if (!fn || typeof fn !== 'function') {
- return defaultFunctionName;
- }
- return fn.name || defaultFunctionName;
- }
- catch (e) {
- // Just accessing custom props in some Selenium environments
- // can cause a "Permission denied" exception (see raven-js#495).
- return defaultFunctionName;
- }
- }
-
- // TODO: Implement different loggers for different environments
- var global$1 = getGlobalObject();
- /** Prefix for logging strings */
- var PREFIX = 'Sentry Logger ';
- /** JSDoc */
- var Logger = /** @class */ (function () {
- /** JSDoc */
- function Logger() {
- this._enabled = false;
- }
- /** JSDoc */
- Logger.prototype.disable = function () {
- this._enabled = false;
- };
- /** JSDoc */
- Logger.prototype.enable = function () {
- this._enabled = true;
- };
- /** JSDoc */
- Logger.prototype.log = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this._enabled) {
- return;
- }
- consoleSandbox(function () {
- global$1.console.log(PREFIX + "[Log]: " + args.join(' ')); // tslint:disable-line:no-console
- });
- };
- /** JSDoc */
- Logger.prototype.warn = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this._enabled) {
- return;
- }
- consoleSandbox(function () {
- global$1.console.warn(PREFIX + "[Warn]: " + args.join(' ')); // tslint:disable-line:no-console
- });
- };
- /** JSDoc */
- Logger.prototype.error = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this._enabled) {
- return;
- }
- consoleSandbox(function () {
- global$1.console.error(PREFIX + "[Error]: " + args.join(' ')); // tslint:disable-line:no-console
- });
- };
- return Logger;
- }());
- // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used
- global$1.__SENTRY__ = global$1.__SENTRY__ || {};
- var logger = global$1.__SENTRY__.logger || (global$1.__SENTRY__.logger = new Logger());
-
- // tslint:disable:no-unsafe-any
- /**
- * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.
- */
- var Memo = /** @class */ (function () {
- function Memo() {
- // tslint:disable-next-line
- this._hasWeakSet = typeof WeakSet === 'function';
- this._inner = this._hasWeakSet ? new WeakSet() : [];
- }
- /**
- * Sets obj to remember.
- * @param obj Object to remember
- */
- Memo.prototype.memoize = function (obj) {
- if (this._hasWeakSet) {
- if (this._inner.has(obj)) {
- return true;
- }
- this._inner.add(obj);
- return false;
- }
- // tslint:disable-next-line:prefer-for-of
- for (var i = 0; i < this._inner.length; i++) {
- var value = this._inner[i];
- if (value === obj) {
- return true;
- }
- }
- this._inner.push(obj);
- return false;
- };
- /**
- * Removes object from internal storage.
- * @param obj Object to forget
- */
- Memo.prototype.unmemoize = function (obj) {
- if (this._hasWeakSet) {
- this._inner.delete(obj);
- }
- else {
- for (var i = 0; i < this._inner.length; i++) {
- if (this._inner[i] === obj) {
- this._inner.splice(i, 1);
- break;
- }
- }
- }
- };
- return Memo;
- }());
-
- /**
- * Wrap a given object method with a higher-order function
- *
- * @param source An object that contains a method to be wrapped.
- * @param name A name of method to be wrapped.
- * @param replacement A function that should be used to wrap a given method.
- * @returns void
- */
- function fill(source, name, replacement) {
- if (!(name in source)) {
- return;
- }
- var original = source[name];
- var wrapped = replacement(original);
- // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
- // otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
- // tslint:disable-next-line:strict-type-predicates
- if (typeof wrapped === 'function') {
- try {
- wrapped.prototype = wrapped.prototype || {};
- Object.defineProperties(wrapped, {
- __sentry_original__: {
- enumerable: false,
- value: original,
- },
- });
- }
- catch (_Oo) {
- // This can throw if multiple fill happens on a global object like XMLHttpRequest
- // Fixes https://github.com/getsentry/sentry-javascript/issues/2043
- }
- }
- source[name] = wrapped;
- }
- /**
- * Encodes given object into url-friendly format
- *
- * @param object An object that contains serializable values
- * @returns string Encoded
- */
- function urlEncode(object) {
- return Object.keys(object)
- .map(
- // tslint:disable-next-line:no-unsafe-any
- function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); })
- .join('&');
- }
- /**
- * Transforms any object into an object literal with all it's attributes
- * attached to it.
- *
- * @param value Initial source that we have to transform in order to be usable by the serializer
- */
- function getWalkSource(value) {
- if (isError(value)) {
- var error = value;
- var err = {
- message: error.message,
- name: error.name,
- stack: error.stack,
- };
- for (var i in error) {
- if (Object.prototype.hasOwnProperty.call(error, i)) {
- err[i] = error[i];
- }
- }
- return err;
- }
- if (isEvent(value)) {
- var event_1 = value;
- var source = {};
- source.type = event_1.type;
- // Accessing event.target can throw (see getsentry/raven-js#838, #768)
- try {
- source.target = isElement(event_1.target)
- ? htmlTreeAsString(event_1.target)
- : Object.prototype.toString.call(event_1.target);
- }
- catch (_oO) {
- source.target = '';
- }
- try {
- source.currentTarget = isElement(event_1.currentTarget)
- ? htmlTreeAsString(event_1.currentTarget)
- : Object.prototype.toString.call(event_1.currentTarget);
- }
- catch (_oO) {
- source.currentTarget = '';
- }
- // tslint:disable-next-line:strict-type-predicates
- if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {
- source.detail = event_1.detail;
- }
- for (var i in event_1) {
- if (Object.prototype.hasOwnProperty.call(event_1, i)) {
- source[i] = event_1;
- }
- }
- return source;
- }
- return value;
- }
- /** Calculates bytes size of input string */
- function utf8Length(value) {
- // tslint:disable-next-line:no-bitwise
- return ~-encodeURI(value).split(/%..|./).length;
- }
- /** Calculates bytes size of input object */
- function jsonSize(value) {
- return utf8Length(JSON.stringify(value));
- }
- /** JSDoc */
- function normalizeToSize(object,
- // Default Node.js REPL depth
- depth,
- // 100kB, as 200kB is max payload size, so half sounds reasonable
- maxSize) {
- if (depth === void 0) { depth = 3; }
- if (maxSize === void 0) { maxSize = 100 * 1024; }
- var serialized = normalize(object, depth);
- if (jsonSize(serialized) > maxSize) {
- return normalizeToSize(object, depth - 1, maxSize);
- }
- return serialized;
- }
- /** Transforms any input value into a string form, either primitive value or a type of the input */
- function serializeValue(value) {
- var type = Object.prototype.toString.call(value);
- // Node.js REPL notation
- if (typeof value === 'string') {
- return value;
- }
- if (type === '[object Object]') {
- return '[Object]';
- }
- if (type === '[object Array]') {
- return '[Array]';
- }
- var normalized = normalizeValue(value);
- return isPrimitive(normalized) ? normalized : type;
- }
- /**
- * normalizeValue()
- *
- * Takes unserializable input and make it serializable friendly
- *
- * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively,
- * - serializes Error objects
- * - filter global objects
- */
- // tslint:disable-next-line:cyclomatic-complexity
- function normalizeValue(value, key) {
- if (key === 'domain' && value && typeof value === 'object' && value._events) {
- return '[Domain]';
- }
- if (key === 'domainEmitter') {
- return '[DomainEmitter]';
- }
- if (typeof global !== 'undefined' && value === global) {
- return '[Global]';
- }
- if (typeof window !== 'undefined' && value === window) {
- return '[Window]';
- }
- if (typeof document !== 'undefined' && value === document) {
- return '[Document]';
- }
- // React's SyntheticEvent thingy
- if (isSyntheticEvent(value)) {
- return '[SyntheticEvent]';
- }
- // tslint:disable-next-line:no-tautology-expression
- if (typeof value === 'number' && value !== value) {
- return '[NaN]';
- }
- if (value === void 0) {
- return '[undefined]';
- }
- if (typeof value === 'function') {
- return "[Function: " + getFunctionName(value) + "]";
- }
- return value;
- }
- /**
- * Walks an object to perform a normalization on it
- *
- * @param key of object that's walked in current iteration
- * @param value object to be walked
- * @param depth Optional number indicating how deep should walking be performed
- * @param memo Optional Memo class handling decycling
- */
- function walk(key, value, depth, memo) {
- if (depth === void 0) { depth = +Infinity; }
- if (memo === void 0) { memo = new Memo(); }
- // If we reach the maximum depth, serialize whatever has left
- if (depth === 0) {
- return serializeValue(value);
- }
- // If value implements `toJSON` method, call it and return early
- // tslint:disable:no-unsafe-any
- if (value !== null && value !== undefined && typeof value.toJSON === 'function') {
- return value.toJSON();
- }
- // tslint:enable:no-unsafe-any
- // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further
- var normalized = normalizeValue(value, key);
- if (isPrimitive(normalized)) {
- return normalized;
- }
- // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself
- var source = getWalkSource(value);
- // Create an accumulator that will act as a parent for all future itterations of that branch
- var acc = Array.isArray(value) ? [] : {};
- // If we already walked that branch, bail out, as it's circular reference
- if (memo.memoize(value)) {
- return '[Circular ~]';
- }
- // Walk all keys of the source
- for (var innerKey in source) {
- // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.
- if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {
- continue;
- }
- // Recursively walk through all the child nodes
- acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);
- }
- // Once walked through all the branches, remove the parent from memo storage
- memo.unmemoize(value);
- // Return accumulated values
- return acc;
- }
- /**
- * normalize()
- *
- * - Creates a copy to prevent original input mutation
- * - Skip non-enumerablers
- * - Calls `toJSON` if implemented
- * - Removes circular references
- * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format
- * - Translates known global objects/Classes to a string representations
- * - Takes care of Error objects serialization
- * - Optionally limit depth of final output
- */
- function normalize(input, depth) {
- try {
- // tslint:disable-next-line:no-unsafe-any
- return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));
- }
- catch (_oO) {
- return '**non-serializable**';
- }
- }
- /**
- * Given any captured exception, extract its keys and create a sorted
- * and truncated list that will be used inside the event message.
- * eg. `Non-error exception captured with keys: foo, bar, baz`
- */
- function extractExceptionKeysForMessage(exception, maxLength) {
- if (maxLength === void 0) { maxLength = 40; }
- // tslint:disable:strict-type-predicates
- var keys = Object.keys(getWalkSource(exception));
- keys.sort();
- if (!keys.length) {
- return '[object has no keys]';
- }
- if (keys[0].length >= maxLength) {
- return truncate(keys[0], maxLength);
- }
- for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {
- var serialized = keys.slice(0, includedKeys).join(', ');
- if (serialized.length > maxLength) {
- continue;
- }
- if (includedKeys === keys.length) {
- return serialized;
- }
- return truncate(serialized, maxLength);
- }
- return '';
- }
-
- // Slightly modified (no IE8 support, ES6) and transcribed to TypeScript
-
- /** SyncPromise internal states */
- var States;
- (function (States) {
- /** Pending */
- States["PENDING"] = "PENDING";
- /** Resolved / OK */
- States["RESOLVED"] = "RESOLVED";
- /** Rejected / Error */
- States["REJECTED"] = "REJECTED";
- })(States || (States = {}));
- /**
- * Thenable class that behaves like a Promise and follows it's interface
- * but is not async internally
- */
- var SyncPromise = /** @class */ (function () {
- function SyncPromise(executor) {
- var _this = this;
- this._state = States.PENDING;
- this._handlers = [];
- /** JSDoc */
- this._resolve = function (value) {
- _this._setResult(States.RESOLVED, value);
- };
- /** JSDoc */
- this._reject = function (reason) {
- _this._setResult(States.REJECTED, reason);
- };
- /** JSDoc */
- this._setResult = function (state, value) {
- if (_this._state !== States.PENDING) {
- return;
- }
- if (isThenable(value)) {
- value.then(_this._resolve, _this._reject);
- return;
- }
- _this._state = state;
- _this._value = value;
- _this._executeHandlers();
- };
- // TODO: FIXME
- /** JSDoc */
- this._attachHandler = function (handler) {
- _this._handlers = _this._handlers.concat(handler);
- _this._executeHandlers();
- };
- /** JSDoc */
- this._executeHandlers = function () {
- if (_this._state === States.PENDING) {
- return;
- }
- if (_this._state === States.REJECTED) {
- _this._handlers.forEach(function (handler) {
- if (handler.onrejected) {
- handler.onrejected(_this._value);
- }
- });
- }
- else {
- _this._handlers.forEach(function (handler) {
- if (handler.onfulfilled) {
- // tslint:disable-next-line:no-unsafe-any
- handler.onfulfilled(_this._value);
- }
- });
- }
- _this._handlers = [];
- };
- try {
- executor(this._resolve, this._reject);
- }
- catch (e) {
- this._reject(e);
- }
- }
- /** JSDoc */
- SyncPromise.prototype.toString = function () {
- return '[object SyncPromise]';
- };
- /** JSDoc */
- SyncPromise.resolve = function (value) {
- return new SyncPromise(function (resolve) {
- resolve(value);
- });
- };
- /** JSDoc */
- SyncPromise.reject = function (reason) {
- return new SyncPromise(function (_, reject) {
- reject(reason);
- });
- };
- /** JSDoc */
- SyncPromise.all = function (collection) {
- return new SyncPromise(function (resolve, reject) {
- if (!Array.isArray(collection)) {
- reject(new TypeError("Promise.all requires an array as input."));
- return;
- }
- if (collection.length === 0) {
- resolve([]);
- return;
- }
- var counter = collection.length;
- var resolvedCollection = [];
- collection.forEach(function (item, index) {
- SyncPromise.resolve(item)
- .then(function (value) {
- resolvedCollection[index] = value;
- counter -= 1;
- if (counter !== 0) {
- return;
- }
- resolve(resolvedCollection);
- })
- .then(null, reject);
- });
- });
- };
- /** JSDoc */
- SyncPromise.prototype.then = function (onfulfilled, onrejected) {
- var _this = this;
- return new SyncPromise(function (resolve, reject) {
- _this._attachHandler({
- onfulfilled: function (result) {
- if (!onfulfilled) {
- // TODO: ¯\_(ツ)_/¯
- // TODO: FIXME
- resolve(result);
- return;
- }
- try {
- resolve(onfulfilled(result));
- return;
- }
- catch (e) {
- reject(e);
- return;
- }
- },
- onrejected: function (reason) {
- if (!onrejected) {
- reject(reason);
- return;
- }
- try {
- resolve(onrejected(reason));
- return;
- }
- catch (e) {
- reject(e);
- return;
- }
- },
- });
- });
- };
- /** JSDoc */
- SyncPromise.prototype.catch = function (onrejected) {
- return this.then(function (val) { return val; }, onrejected);
- };
- /** JSDoc */
- SyncPromise.prototype.finally = function (onfinally) {
- var _this = this;
- return new SyncPromise(function (resolve, reject) {
- var val;
- var isRejected;
- return _this.then(function (value) {
- isRejected = false;
- val = value;
- if (onfinally) {
- onfinally();
- }
- }, function (reason) {
- isRejected = true;
- val = reason;
- if (onfinally) {
- onfinally();
- }
- }).then(function () {
- if (isRejected) {
- reject(val);
- return;
- }
- // tslint:disable-next-line:no-unsafe-any
- resolve(val);
- });
- });
- };
- return SyncPromise;
- }());
-
- /** A simple queue that holds promises. */
- var PromiseBuffer = /** @class */ (function () {
- function PromiseBuffer(_limit) {
- this._limit = _limit;
- /** Internal set of queued Promises */
- this._buffer = [];
- }
- /**
- * Says if the buffer is ready to take more requests
- */
- PromiseBuffer.prototype.isReady = function () {
- return this._limit === undefined || this.length() < this._limit;
- };
- /**
- * Add a promise to the queue.
- *
- * @param task Can be any PromiseLike
- * @returns The original promise.
- */
- PromiseBuffer.prototype.add = function (task) {
- var _this = this;
- if (!this.isReady()) {
- return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));
- }
- if (this._buffer.indexOf(task) === -1) {
- this._buffer.push(task);
- }
- task
- .then(function () { return _this.remove(task); })
- .then(null, function () {
- return _this.remove(task).then(null, function () {
- // We have to add this catch here otherwise we have an unhandledPromiseRejection
- // because it's a new Promise chain.
- });
- });
- return task;
- };
- /**
- * Remove a promise to the queue.
- *
- * @param task Can be any PromiseLike
- * @returns Removed promise.
- */
- PromiseBuffer.prototype.remove = function (task) {
- var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];
- return removedTask;
- };
- /**
- * This function returns the number of unresolved promises in the queue.
- */
- PromiseBuffer.prototype.length = function () {
- return this._buffer.length;
- };
- /**
- * This will drain the whole queue, returns true if queue is empty or drained.
- * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.
- *
- * @param timeout Number in ms to wait until it resolves with false.
- */
- PromiseBuffer.prototype.drain = function (timeout) {
- var _this = this;
- return new SyncPromise(function (resolve) {
- var capturedSetTimeout = setTimeout(function () {
- if (timeout && timeout > 0) {
- resolve(false);
- }
- }, timeout);
- SyncPromise.all(_this._buffer)
- .then(function () {
- clearTimeout(capturedSetTimeout);
- resolve(true);
- })
- .then(null, function () {
- resolve(true);
- });
- });
- };
- return PromiseBuffer;
- }());
-
- /**
- * Tells whether current environment supports Fetch API
- * {@link supportsFetch}.
- *
- * @returns Answer to the given question.
- */
- function supportsFetch() {
- if (!('fetch' in getGlobalObject())) {
- return false;
- }
- try {
- // tslint:disable-next-line:no-unused-expression
- new Headers();
- // tslint:disable-next-line:no-unused-expression
- new Request('');
- // tslint:disable-next-line:no-unused-expression
- new Response();
- return true;
- }
- catch (e) {
- return false;
- }
- }
- /**
- * isNativeFetch checks if the given function is a native implementation of fetch()
- */
- function isNativeFetch(func) {
- return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
- }
- /**
- * Tells whether current environment supports Fetch API natively
- * {@link supportsNativeFetch}.
- *
- * @returns true if `window.fetch` is natively implemented, false otherwise
- */
- function supportsNativeFetch() {
- if (!supportsFetch()) {
- return false;
- }
- var global = getGlobalObject();
- // Fast path to avoid DOM I/O
- // tslint:disable-next-line:no-unbound-method
- if (isNativeFetch(global.fetch)) {
- return true;
- }
- // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
- // so create a "pure" iframe to see if that has native fetch
- var result = false;
- var doc = global.document;
- if (doc) {
- try {
- var sandbox = doc.createElement('iframe');
- sandbox.hidden = true;
- doc.head.appendChild(sandbox);
- if (sandbox.contentWindow && sandbox.contentWindow.fetch) {
- // tslint:disable-next-line:no-unbound-method
- result = isNativeFetch(sandbox.contentWindow.fetch);
- }
- doc.head.removeChild(sandbox);
- }
- catch (err) {
- logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);
- }
- }
- return result;
- }
- /**
- * Tells whether current environment supports Referrer Policy API
- * {@link supportsReferrerPolicy}.
- *
- * @returns Answer to the given question.
- */
- function supportsReferrerPolicy() {
- // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
- // https://caniuse.com/#feat=referrer-policy
- // It doesn't. And it throw exception instead of ignoring this parameter...
- // REF: https://github.com/getsentry/raven-js/issues/1233
- if (!supportsFetch()) {
- return false;
- }
- try {
- // tslint:disable:no-unused-expression
- new Request('_', {
- referrerPolicy: 'origin',
- });
- return true;
- }
- catch (e) {
- return false;
- }
- }
- /**
- * Tells whether current environment supports History API
- * {@link supportsHistory}.
- *
- * @returns Answer to the given question.
- */
- function supportsHistory() {
- // NOTE: in Chrome App environment, touching history.pushState, *even inside
- // a try/catch block*, will cause Chrome to output an error to console.error
- // borrowed from: https://github.com/angular/angular.js/pull/13945/files
- var global = getGlobalObject();
- var chrome = global.chrome;
- // tslint:disable-next-line:no-unsafe-any
- var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
- var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;
- return !isChromePackagedApp && hasHistoryApi;
- }
-
- /* tslint:disable:only-arrow-functions no-unsafe-any */
- var global$2 = getGlobalObject();
- /**
- * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.
- * - Console API
- * - Fetch API
- * - XHR API
- * - History API
- * - DOM API (click/typing)
- * - Error API
- * - UnhandledRejection API
- */
- var handlers = {};
- var instrumented = {};
- /** Instruments given API */
- function instrument(type) {
- if (instrumented[type]) {
- return;
- }
- instrumented[type] = true;
- switch (type) {
- case 'console':
- instrumentConsole();
- break;
- case 'dom':
- instrumentDOM();
- break;
- case 'xhr':
- instrumentXHR();
- break;
- case 'fetch':
- instrumentFetch();
- break;
- case 'history':
- instrumentHistory();
- break;
- case 'error':
- instrumentError();
- break;
- case 'unhandledrejection':
- instrumentUnhandledRejection();
- break;
- default:
- logger.warn('unknown instrumentation type:', type);
- }
- }
- /**
- * Add handler that will be called when given type of instrumentation triggers.
- * Use at your own risk, this might break without changelog notice, only used internally.
- * @hidden
- */
- function addInstrumentationHandler(handler) {
- // tslint:disable-next-line:strict-type-predicates
- if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {
- return;
- }
- handlers[handler.type] = handlers[handler.type] || [];
- handlers[handler.type].push(handler.callback);
- instrument(handler.type);
- }
- /** JSDoc */
- function triggerHandlers(type, data) {
- var e_1, _a;
- if (!type || !handlers[type]) {
- return;
- }
- try {
- for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {
- var handler = _c.value;
- try {
- handler(data);
- }
- catch (e) {
- logger.error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + getFunctionName(handler) + "\nError: " + e);
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- /** JSDoc */
- function instrumentConsole() {
- if (!('console' in global$2)) {
- return;
- }
- ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {
- if (!(level in global$2.console)) {
- return;
- }
- fill(global$2.console, level, function (originalConsoleLevel) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- triggerHandlers('console', { args: args, level: level });
- // this fails for some browsers. :(
- if (originalConsoleLevel) {
- Function.prototype.apply.call(originalConsoleLevel, global$2.console, args);
- }
- };
- });
- });
- }
- /** JSDoc */
- function instrumentFetch() {
- if (!supportsNativeFetch()) {
- return;
- }
- fill(global$2, 'fetch', function (originalFetch) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var commonHandlerData = {
- args: args,
- fetchData: {
- method: getFetchMethod(args),
- url: getFetchUrl(args),
- },
- startTimestamp: Date.now(),
- };
- triggerHandlers('fetch', __assign({}, commonHandlerData));
- return originalFetch.apply(global$2, args).then(function (response) {
- triggerHandlers('fetch', __assign({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));
- return response;
- }, function (error) {
- triggerHandlers('fetch', __assign({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));
- throw error;
- });
- };
- });
- }
- /** Extract `method` from fetch call arguments */
- function getFetchMethod(fetchArgs) {
- if (fetchArgs === void 0) { fetchArgs = []; }
- if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {
- return String(fetchArgs[0].method).toUpperCase();
- }
- if (fetchArgs[1] && fetchArgs[1].method) {
- return String(fetchArgs[1].method).toUpperCase();
- }
- return 'GET';
- }
- /** Extract `url` from fetch call arguments */
- function getFetchUrl(fetchArgs) {
- if (fetchArgs === void 0) { fetchArgs = []; }
- if (typeof fetchArgs[0] === 'string') {
- return fetchArgs[0];
- }
- if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request)) {
- return fetchArgs[0].url;
- }
- return String(fetchArgs[0]);
- }
- /** JSDoc */
- function instrumentXHR() {
- if (!('XMLHttpRequest' in global$2)) {
- return;
- }
- var xhrproto = XMLHttpRequest.prototype;
- fill(xhrproto, 'open', function (originalOpen) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var url = args[1];
- this.__sentry_xhr__ = {
- method: isString(args[0]) ? args[0].toUpperCase() : args[0],
- url: args[1],
- };
- // if Sentry key appears in URL, don't capture it as a request
- if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {
- this.__sentry_own_request__ = true;
- }
- return originalOpen.apply(this, args);
- };
- });
- fill(xhrproto, 'send', function (originalSend) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var xhr = this; // tslint:disable-line:no-this-assignment
- var commonHandlerData = {
- args: args,
- startTimestamp: Date.now(),
- xhr: xhr,
- };
- triggerHandlers('xhr', __assign({}, commonHandlerData));
- xhr.addEventListener('readystatechange', function () {
- if (xhr.readyState === 4) {
- try {
- // touching statusCode in some platforms throws
- // an exception
- if (xhr.__sentry_xhr__) {
- xhr.__sentry_xhr__.status_code = xhr.status;
- }
- }
- catch (e) {
- /* do nothing */
- }
- triggerHandlers('xhr', __assign({}, commonHandlerData, { endTimestamp: Date.now() }));
- }
- });
- return originalSend.apply(this, args);
- };
- });
- }
- var lastHref;
- /** JSDoc */
- function instrumentHistory() {
- if (!supportsHistory()) {
- return;
- }
- var oldOnPopState = global$2.onpopstate;
- global$2.onpopstate = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var to = global$2.location.href;
- // keep track of the current URL state, as we always receive only the updated state
- var from = lastHref;
- lastHref = to;
- triggerHandlers('history', {
- from: from,
- to: to,
- });
- if (oldOnPopState) {
- return oldOnPopState.apply(this, args);
- }
- };
- /** @hidden */
- function historyReplacementFunction(originalHistoryFunction) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var url = args.length > 2 ? args[2] : undefined;
- if (url) {
- // coerce to string (this is what pushState does)
- var from = lastHref;
- var to = String(url);
- // keep track of the current URL state, as we always receive only the updated state
- lastHref = to;
- triggerHandlers('history', {
- from: from,
- to: to,
- });
- }
- return originalHistoryFunction.apply(this, args);
- };
- }
- fill(global$2.history, 'pushState', historyReplacementFunction);
- fill(global$2.history, 'replaceState', historyReplacementFunction);
- }
- /** JSDoc */
- function instrumentDOM() {
- if (!('document' in global$2)) {
- return;
- }
- // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
- // to the document. Do this before we instrument addEventListener.
- global$2.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);
- global$2.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);
- // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.
- ['EventTarget', 'Node'].forEach(function (target) {
- var proto = global$2[target] && global$2[target].prototype;
- if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
- return;
- }
- fill(proto, 'addEventListener', function (original) {
- return function (eventName, fn, options) {
- if (fn && fn.handleEvent) {
- if (eventName === 'click') {
- fill(fn, 'handleEvent', function (innerOriginal) {
- return function (event) {
- domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);
- return innerOriginal.call(this, event);
- };
- });
- }
- if (eventName === 'keypress') {
- fill(fn, 'handleEvent', function (innerOriginal) {
- return function (event) {
- keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);
- return innerOriginal.call(this, event);
- };
- });
- }
- }
- else {
- if (eventName === 'click') {
- domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);
- }
- if (eventName === 'keypress') {
- keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);
- }
- }
- return original.call(this, eventName, fn, options);
- };
- });
- 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);
- };
- });
- });
- }
- var debounceDuration = 1000;
- var debounceTimer = 0;
- var keypressTimeout;
- var lastCapturedEvent;
- /**
- * Wraps addEventListener to capture UI breadcrumbs
- * @param name the event name (e.g. "click")
- * @param handler function that will be triggered
- * @param debounce decides whether it should wait till another event loop
- * @returns wrapped breadcrumb events handler
- * @hidden
- */
- function domEventHandler(name, handler, debounce) {
- if (debounce === void 0) { debounce = false; }
- return function (event) {
- // reset keypress timeout; e.g. triggering a 'click' after
- // a 'keypress' will reset the keypress debounce so that a new
- // set of keypresses can be recorded
- keypressTimeout = undefined;
- // It's possible this handler might trigger multiple times for the same
- // event (e.g. event propagation through node ancestors). Ignore if we've
- // already captured the event.
- if (!event || lastCapturedEvent === event) {
- return;
- }
- lastCapturedEvent = event;
- if (debounceTimer) {
- clearTimeout(debounceTimer);
- }
- if (debounce) {
- debounceTimer = setTimeout(function () {
- handler({ event: event, name: name });
- });
- }
- else {
- handler({ event: event, name: name });
- }
- };
- }
- /**
- * Wraps addEventListener to capture keypress UI events
- * @param handler function that will be triggered
- * @returns wrapped keypress events handler
- * @hidden
- */
- function keypressEventHandler(handler) {
- // TODO: if somehow user switches keypress target before
- // debounce timeout is triggered, we will only capture
- // a single breadcrumb from the FIRST target (acceptable?)
- return function (event) {
- var target;
- try {
- target = event.target;
- }
- catch (e) {
- // just accessing event properties can throw an exception in some rare circumstances
- // see: https://github.com/getsentry/raven-js/issues/838
- return;
- }
- var tagName = target && target.tagName;
- // only consider keypress events on actual input elements
- // this will disregard keypresses targeting body (e.g. tabbing
- // through elements, hotkeys, etc)
- if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {
- return;
- }
- // record first keypress in a series, but ignore subsequent
- // keypresses until debounce clears
- if (!keypressTimeout) {
- domEventHandler('input', handler)(event);
- }
- clearTimeout(keypressTimeout);
- keypressTimeout = setTimeout(function () {
- keypressTimeout = undefined;
- }, debounceDuration);
- };
- }
- var _oldOnErrorHandler = null;
- /** JSDoc */
- function instrumentError() {
- _oldOnErrorHandler = global$2.onerror;
- global$2.onerror = function (msg, url, line, column, error) {
- triggerHandlers('error', {
- column: column,
- error: error,
- line: line,
- msg: msg,
- url: url,
- });
- if (_oldOnErrorHandler) {
- return _oldOnErrorHandler.apply(this, arguments);
- }
- return false;
- };
- }
- var _oldOnUnhandledRejectionHandler = null;
- /** JSDoc */
- function instrumentUnhandledRejection() {
- _oldOnUnhandledRejectionHandler = global$2.onunhandledrejection;
- global$2.onunhandledrejection = function (e) {
- triggerHandlers('unhandledrejection', e);
- if (_oldOnUnhandledRejectionHandler) {
- return _oldOnUnhandledRejectionHandler.apply(this, arguments);
- }
- return true;
- };
- }
-
- /** Regular expression used to parse a Dsn. */
- var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/;
- /** Error message */
- var ERROR_MESSAGE = 'Invalid Dsn';
- /** The Sentry Dsn, identifying a Sentry instance and project. */
- var Dsn = /** @class */ (function () {
- /** Creates a new Dsn component */
- function Dsn(from) {
- if (typeof from === 'string') {
- this._fromString(from);
- }
- else {
- this._fromComponents(from);
- }
- this._validate();
- }
- /**
- * Renders the string representation of this Dsn.
- *
- * By default, this will render the public representation without the password
- * component. To get the deprecated private _representation, set `withPassword`
- * to true.
- *
- * @param withPassword When set to true, the password will be included.
- */
- Dsn.prototype.toString = function (withPassword) {
- if (withPassword === void 0) { withPassword = false; }
- // tslint:disable-next-line:no-this-assignment
- var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;
- return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') +
- ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId));
- };
- /** Parses a string into this Dsn. */
- Dsn.prototype._fromString = function (str) {
- var match = DSN_REGEX.exec(str);
- if (!match) {
- throw new SentryError(ERROR_MESSAGE);
- }
- var _a = __read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];
- var path = '';
- var projectId = lastPath;
- var split = projectId.split('/');
- if (split.length > 1) {
- path = split.slice(0, -1).join('/');
- projectId = split.pop();
- }
- this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });
- };
- /** Maps Dsn components into this instance. */
- Dsn.prototype._fromComponents = function (components) {
- this.protocol = components.protocol;
- this.user = components.user;
- this.pass = components.pass || '';
- this.host = components.host;
- this.port = components.port || '';
- this.path = components.path || '';
- this.projectId = components.projectId;
- };
- /** Validates this Dsn and throws on error. */
- Dsn.prototype._validate = function () {
- var _this = this;
- ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {
- if (!_this[component]) {
- throw new SentryError(ERROR_MESSAGE);
- }
- });
- if (this.protocol !== 'http' && this.protocol !== 'https') {
- throw new SentryError(ERROR_MESSAGE);
- }
- if (this.port && isNaN(parseInt(this.port, 10))) {
- throw new SentryError(ERROR_MESSAGE);
- }
- };
- return Dsn;
- }());
-
- /**
- * Holds additional event information. {@link Scope.applyToEvent} will be
- * called by the client before an event will be sent.
- */
- var Scope = /** @class */ (function () {
- function Scope() {
- /** Flag if notifiying is happening. */
- this._notifyingListeners = false;
- /** Callback for client to receive scope changes. */
- this._scopeListeners = [];
- /** Callback list that will be called after {@link applyToEvent}. */
- this._eventProcessors = [];
- /** Array of breadcrumbs. */
- this._breadcrumbs = [];
- /** User */
- this._user = {};
- /** Tags */
- this._tags = {};
- /** Extra */
- this._extra = {};
- /** Contexts */
- this._context = {};
- }
- /**
- * Add internal on change listener. Used for sub SDKs that need to store the scope.
- * @hidden
- */
- Scope.prototype.addScopeListener = function (callback) {
- this._scopeListeners.push(callback);
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.addEventProcessor = function (callback) {
- this._eventProcessors.push(callback);
- return this;
- };
- /**
- * This will be called on every set call.
- */
- Scope.prototype._notifyScopeListeners = function () {
- var _this = this;
- if (!this._notifyingListeners) {
- this._notifyingListeners = true;
- setTimeout(function () {
- _this._scopeListeners.forEach(function (callback) {
- callback(_this);
- });
- _this._notifyingListeners = false;
- });
- }
- };
- /**
- * This will be called after {@link applyToEvent} is finished.
- */
- Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {
- var _this = this;
- if (index === void 0) { index = 0; }
- return new SyncPromise(function (resolve, reject) {
- var processor = processors[index];
- // tslint:disable-next-line:strict-type-predicates
- if (event === null || typeof processor !== 'function') {
- resolve(event);
- }
- else {
- var result = processor(__assign({}, event), hint);
- if (isThenable(result)) {
- result
- .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })
- .then(null, reject);
- }
- else {
- _this._notifyEventProcessors(processors, result, hint, index + 1)
- .then(resolve)
- .then(null, reject);
- }
- }
- });
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setUser = function (user) {
- this._user = user || {};
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setTags = function (tags) {
- this._tags = __assign({}, this._tags, tags);
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setTag = function (key, value) {
- var _a;
- this._tags = __assign({}, this._tags, (_a = {}, _a[key] = value, _a));
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setExtras = function (extras) {
- this._extra = __assign({}, this._extra, extras);
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setExtra = function (key, extra) {
- var _a;
- this._extra = __assign({}, this._extra, (_a = {}, _a[key] = extra, _a));
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setFingerprint = function (fingerprint) {
- this._fingerprint = fingerprint;
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setLevel = function (level) {
- this._level = level;
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setTransaction = function (transaction) {
- this._transaction = transaction;
- if (this._span) {
- this._span.transaction = transaction;
- }
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setContext = function (key, context) {
- var _a;
- this._context = __assign({}, this._context, (_a = {}, _a[key] = context, _a));
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.setSpan = function (span) {
- this._span = span;
- this._notifyScopeListeners();
- return this;
- };
- /**
- * Internal getter for Span, used in Hub.
- * @hidden
- */
- Scope.prototype.getSpan = function () {
- return this._span;
- };
- /**
- * Inherit values from the parent scope.
- * @param scope to clone.
- */
- Scope.clone = function (scope) {
- var newScope = new Scope();
- if (scope) {
- newScope._breadcrumbs = __spread(scope._breadcrumbs);
- newScope._tags = __assign({}, scope._tags);
- newScope._extra = __assign({}, scope._extra);
- newScope._context = __assign({}, scope._context);
- newScope._user = scope._user;
- newScope._level = scope._level;
- newScope._span = scope._span;
- newScope._transaction = scope._transaction;
- newScope._fingerprint = scope._fingerprint;
- newScope._eventProcessors = __spread(scope._eventProcessors);
- }
- return newScope;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.clear = function () {
- this._breadcrumbs = [];
- this._tags = {};
- this._extra = {};
- this._user = {};
- this._context = {};
- this._level = undefined;
- this._transaction = undefined;
- this._fingerprint = undefined;
- this._span = undefined;
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {
- var mergedBreadcrumb = __assign({ timestamp: timestampWithMs() }, breadcrumb);
- this._breadcrumbs =
- maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
- ? __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)
- : __spread(this._breadcrumbs, [mergedBreadcrumb]);
- this._notifyScopeListeners();
- return this;
- };
- /**
- * @inheritDoc
- */
- Scope.prototype.clearBreadcrumbs = function () {
- this._breadcrumbs = [];
- this._notifyScopeListeners();
- return this;
- };
- /**
- * Applies fingerprint from the scope to the event if there's one,
- * uses message if there's one instead or get rid of empty fingerprint
- */
- Scope.prototype._applyFingerprint = function (event) {
- // Make sure it's an array first and we actually have something in place
- event.fingerprint = event.fingerprint
- ? Array.isArray(event.fingerprint)
- ? event.fingerprint
- : [event.fingerprint]
- : [];
- // If we have something on the scope, then merge it with event
- if (this._fingerprint) {
- event.fingerprint = event.fingerprint.concat(this._fingerprint);
- }
- // If we have no data at all, remove empty array default
- if (event.fingerprint && !event.fingerprint.length) {
- delete event.fingerprint;
- }
- };
- /**
- * Applies the current context and fingerprint to the event.
- * Note that breadcrumbs will be added by the client.
- * Also if the event has already breadcrumbs on it, we do not merge them.
- * @param event Event
- * @param hint May contain additional informartion about the original exception.
- * @hidden
- */
- Scope.prototype.applyToEvent = function (event, hint) {
- if (this._extra && Object.keys(this._extra).length) {
- event.extra = __assign({}, this._extra, event.extra);
- }
- if (this._tags && Object.keys(this._tags).length) {
- event.tags = __assign({}, this._tags, event.tags);
- }
- if (this._user && Object.keys(this._user).length) {
- event.user = __assign({}, this._user, event.user);
- }
- if (this._context && Object.keys(this._context).length) {
- event.contexts = __assign({}, this._context, event.contexts);
- }
- if (this._level) {
- event.level = this._level;
- }
- if (this._transaction) {
- event.transaction = this._transaction;
- }
- if (this._span) {
- event.contexts = __assign({ trace: this._span.getTraceContext() }, event.contexts);
- }
- this._applyFingerprint(event);
- event.breadcrumbs = __spread((event.breadcrumbs || []), this._breadcrumbs);
- event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;
- return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);
- };
- return Scope;
- }());
- /**
- * Retruns the global event processors.
- */
- function getGlobalEventProcessors() {
- var global = getGlobalObject();
- global.__SENTRY__ = global.__SENTRY__ || {};
- global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];
- return global.__SENTRY__.globalEventProcessors;
- }
- /**
- * Add a EventProcessor to be kept globally.
- * @param callback EventProcessor to add
- */
- function addGlobalEventProcessor(callback) {
- getGlobalEventProcessors().push(callback);
- }
-
- /**
- * API compatibility version of this hub.
- *
- * WARNING: This number should only be incresed when the global interface
- * changes a and new methods are introduced.
- *
- * @hidden
- */
- var API_VERSION = 3;
- /**
- * Default maximum number of breadcrumbs added to an event. Can be overwritten
- * with {@link Options.maxBreadcrumbs}.
- */
- var DEFAULT_BREADCRUMBS = 100;
- /**
- * Absolute maximum number of breadcrumbs added to an event. The
- * `maxBreadcrumbs` option cannot be higher than this value.
- */
- var MAX_BREADCRUMBS = 100;
- /**
- * @inheritDoc
- */
- var Hub = /** @class */ (function () {
- /**
- * Creates a new instance of the hub, will push one {@link Layer} into the
- * internal stack on creation.
- *
- * @param client bound to the hub.
- * @param scope bound to the hub.
- * @param version number, higher number means higher priority.
- */
- function Hub(client, scope, _version) {
- if (scope === void 0) { scope = new Scope(); }
- if (_version === void 0) { _version = API_VERSION; }
- this._version = _version;
- /** Is a {@link Layer}[] containing the client and scope */
- this._stack = [];
- this._stack.push({ client: client, scope: scope });
- }
- /**
- * Internal helper function to call a method on the top client if it exists.
- *
- * @param method The method to call on the client.
- * @param args Arguments to pass to the client function.
- */
- Hub.prototype._invokeClient = function (method) {
- var _a;
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- var top = this.getStackTop();
- if (top && top.client && top.client[method]) {
- (_a = top.client)[method].apply(_a, __spread(args, [top.scope]));
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.isOlderThan = function (version) {
- return this._version < version;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.bindClient = function (client) {
- var top = this.getStackTop();
- top.client = client;
- if (client && client.setupIntegrations) {
- client.setupIntegrations();
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.pushScope = function () {
- // We want to clone the content of prev scope
- var stack = this.getStack();
- var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;
- var scope = Scope.clone(parentScope);
- this.getStack().push({
- client: this.getClient(),
- scope: scope,
- });
- return scope;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.popScope = function () {
- return this.getStack().pop() !== undefined;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.withScope = function (callback) {
- var scope = this.pushScope();
- try {
- callback(scope);
- }
- finally {
- this.popScope();
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.getClient = function () {
- return this.getStackTop().client;
- };
- /** Returns the scope of the top stack. */
- Hub.prototype.getScope = function () {
- return this.getStackTop().scope;
- };
- /** Returns the scope stack for domains or the process. */
- Hub.prototype.getStack = function () {
- return this._stack;
- };
- /** Returns the topmost scope layer in the order domain > local > process. */
- Hub.prototype.getStackTop = function () {
- return this._stack[this._stack.length - 1];
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.captureException = function (exception, hint) {
- var eventId = (this._lastEventId = uuid4());
- var finalHint = hint;
- // If there's no explicit hint provided, mimick the same thing that would happen
- // in the minimal itself to create a consistent behavior.
- // We don't do this in the client, as it's the lowest level API, and doing this,
- // would prevent user from having full control over direct calls.
- if (!hint) {
- var syntheticException = void 0;
- try {
- throw new Error('Sentry syntheticException');
- }
- catch (exception) {
- syntheticException = exception;
- }
- finalHint = {
- originalException: exception,
- syntheticException: syntheticException,
- };
- }
- this._invokeClient('captureException', exception, __assign({}, finalHint, { event_id: eventId }));
- return eventId;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.captureMessage = function (message, level, hint) {
- var eventId = (this._lastEventId = uuid4());
- var finalHint = hint;
- // If there's no explicit hint provided, mimick the same thing that would happen
- // in the minimal itself to create a consistent behavior.
- // We don't do this in the client, as it's the lowest level API, and doing this,
- // would prevent user from having full control over direct calls.
- if (!hint) {
- var syntheticException = void 0;
- try {
- throw new Error(message);
- }
- catch (exception) {
- syntheticException = exception;
- }
- finalHint = {
- originalException: message,
- syntheticException: syntheticException,
- };
- }
- this._invokeClient('captureMessage', message, level, __assign({}, finalHint, { event_id: eventId }));
- return eventId;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.captureEvent = function (event, hint) {
- var eventId = (this._lastEventId = uuid4());
- this._invokeClient('captureEvent', event, __assign({}, hint, { event_id: eventId }));
- return eventId;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.lastEventId = function () {
- return this._lastEventId;
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {
- var top = this.getStackTop();
- if (!top.scope || !top.client) {
- return;
- }
- var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;
- if (maxBreadcrumbs <= 0) {
- return;
- }
- var timestamp = timestampWithMs();
- var mergedBreadcrumb = __assign({ timestamp: timestamp }, breadcrumb);
- var finalBreadcrumb = beforeBreadcrumb
- ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })
- : mergedBreadcrumb;
- if (finalBreadcrumb === null) {
- return;
- }
- top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setUser = function (user) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setUser(user);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setTags = function (tags) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setTags(tags);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setExtras = function (extras) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setExtras(extras);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setTag = function (key, value) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setTag(key, value);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setExtra = function (key, extra) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setExtra(key, extra);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.setContext = function (name, context) {
- var top = this.getStackTop();
- if (!top.scope) {
- return;
- }
- top.scope.setContext(name, context);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.configureScope = function (callback) {
- var top = this.getStackTop();
- if (top.scope && top.client) {
- callback(top.scope);
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.run = function (callback) {
- var oldHub = makeMain(this);
- try {
- callback(this);
- }
- finally {
- makeMain(oldHub);
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.getIntegration = function (integration) {
- var client = this.getClient();
- if (!client) {
- return null;
- }
- try {
- return client.getIntegration(integration);
- }
- catch (_oO) {
- logger.warn("Cannot retrieve integration " + integration.id + " from the current Hub");
- return null;
- }
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) {
- if (forceNoChild === void 0) { forceNoChild = false; }
- return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild);
- };
- /**
- * @inheritDoc
- */
- Hub.prototype.traceHeaders = function () {
- return this._callExtensionMethod('traceHeaders');
- };
- /**
- * Calls global extension method and binding current instance to the function call
- */
- // @ts-ignore
- Hub.prototype._callExtensionMethod = function (method) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- var carrier = getMainCarrier();
- var sentry = carrier.__SENTRY__;
- // tslint:disable-next-line: strict-type-predicates
- if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {
- return sentry.extensions[method].apply(this, args);
- }
- logger.warn("Extension method " + method + " couldn't be found, doing nothing.");
- };
- return Hub;
- }());
- /** Returns the global shim registry. */
- function getMainCarrier() {
- var carrier = getGlobalObject();
- carrier.__SENTRY__ = carrier.__SENTRY__ || {
- extensions: {},
- hub: undefined,
- };
- return carrier;
- }
- /**
- * Replaces the current main hub with the passed one on the global object
- *
- * @returns The old replaced hub
- */
- function makeMain(hub) {
- var registry = getMainCarrier();
- var oldHub = getHubFromCarrier(registry);
- setHubOnCarrier(registry, hub);
- return oldHub;
- }
- /**
- * Returns the default hub instance.
- *
- * If a hub is already registered in the global carrier but this module
- * contains a more recent version, it replaces the registered version.
- * Otherwise, the currently registered hub will be returned.
- */
- function getCurrentHub() {
- // Get main carrier (global for every environment)
- var registry = getMainCarrier();
- // If there's no hub, or its an old API, assign a new one
- if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {
- setHubOnCarrier(registry, new Hub());
- }
- // Prefer domains over global if they are there (applicable only to Node environment)
- if (isNodeEnv()) {
- return getHubFromActiveDomain(registry);
- }
- // Return hub that lives on a global object
- return getHubFromCarrier(registry);
- }
- /**
- * Try to read the hub from an active domain, fallback to the registry if one doesnt exist
- * @returns discovered hub
- */
- function getHubFromActiveDomain(registry) {
- try {
- // We need to use `dynamicRequire` because `require` on it's own will be optimized by webpack.
- // We do not want this to happen, we need to try to `require` the domain node module and fail if we are in browser
- // for example so we do not have to shim it and use `getCurrentHub` universally.
- var domain = dynamicRequire(module, 'domain');
- var activeDomain = domain.active;
- // If there no active domain, just return global hub
- if (!activeDomain) {
- return getHubFromCarrier(registry);
- }
- // If there's no hub on current domain, or its an old API, assign a new one
- if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {
- var registryHubTopStack = getHubFromCarrier(registry).getStackTop();
- setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));
- }
- // Return hub that lives on a domain
- return getHubFromCarrier(activeDomain);
- }
- catch (_Oo) {
- // Return hub that lives on a global object
- return getHubFromCarrier(registry);
- }
- }
- /**
- * This will tell whether a carrier has a hub on it or not
- * @param carrier object
- */
- function hasHubOnCarrier(carrier) {
- if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
- return true;
- }
- return false;
- }
- /**
- * This will create a new {@link Hub} and add to the passed object on
- * __SENTRY__.hub.
- * @param carrier object
- * @hidden
- */
- function getHubFromCarrier(carrier) {
- if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
- return carrier.__SENTRY__.hub;
- }
- carrier.__SENTRY__ = carrier.__SENTRY__ || {};
- carrier.__SENTRY__.hub = new Hub();
- return carrier.__SENTRY__.hub;
- }
- /**
- * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute
- * @param carrier object
- * @param hub Hub
- */
- function setHubOnCarrier(carrier, hub) {
- if (!carrier) {
- return false;
- }
- carrier.__SENTRY__ = carrier.__SENTRY__ || {};
- carrier.__SENTRY__.hub = hub;
- return true;
- }
-
- /**
- * This calls a function on the current hub.
- * @param method function to call on hub.
- * @param args to pass to function.
- */
- function callOnHub(method) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- var hub = getCurrentHub();
- if (hub && hub[method]) {
- // tslint:disable-next-line:no-unsafe-any
- return hub[method].apply(hub, __spread(args));
- }
- throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report.");
- }
- /**
- * Captures an exception event and sends it to Sentry.
- *
- * @param exception An exception-like object.
- * @returns The generated eventId.
- */
- function captureException(exception) {
- var syntheticException;
- try {
- throw new Error('Sentry syntheticException');
- }
- catch (exception) {
- syntheticException = exception;
- }
- return callOnHub('captureException', exception, {
- originalException: exception,
- syntheticException: syntheticException,
- });
- }
- /**
- * Captures a message event and sends it to Sentry.
- *
- * @param message The message to send to Sentry.
- * @param level Define the level of the message.
- * @returns The generated eventId.
- */
- function captureMessage(message, level) {
- var syntheticException;
- try {
- throw new Error(message);
- }
- catch (exception) {
- syntheticException = exception;
- }
- return callOnHub('captureMessage', message, level, {
- originalException: message,
- syntheticException: syntheticException,
- });
- }
- /**
- * Captures a manually created event and sends it to Sentry.
- *
- * @param event The event to send to Sentry.
- * @returns The generated eventId.
- */
- function captureEvent(event) {
- return callOnHub('captureEvent', event);
- }
- /**
- * Callback to set context information onto the scope.
- * @param callback Callback function that receives Scope.
- */
- function configureScope(callback) {
- callOnHub('configureScope', callback);
- }
- /**
- * Records a new breadcrumb which will be attached to future events.
- *
- * Breadcrumbs will be added to subsequent events to provide more context on
- * user's actions prior to an error or crash.
- *
- * @param breadcrumb The breadcrumb to record.
- */
- function addBreadcrumb(breadcrumb) {
- callOnHub('addBreadcrumb', breadcrumb);
- }
- /**
- * Sets context data with the given name.
- * @param name of the context
- * @param context Any kind of data. This data will be normailzed.
- */
- function setContext(name, context) {
- callOnHub('setContext', name, context);
- }
- /**
- * Set an object that will be merged sent as extra data with the event.
- * @param extras Extras object to merge into current context.
- */
- function setExtras(extras) {
- callOnHub('setExtras', extras);
- }
- /**
- * Set an object that will be merged sent as tags data with the event.
- * @param tags Tags context object to merge into current context.
- */
- function setTags(tags) {
- callOnHub('setTags', tags);
- }
- /**
- * Set key:value that will be sent as extra data with the event.
- * @param key String of extra
- * @param extra Any kind of data. This data will be normailzed.
- */
- function setExtra(key, extra) {
- callOnHub('setExtra', key, extra);
- }
- /**
- * Set key:value that will be sent as tags data with the event.
- * @param key String key of tag
- * @param value String value of tag
- */
- function setTag(key, value) {
- callOnHub('setTag', key, value);
- }
- /**
- * Updates user context information for future events.
- *
- * @param user User context object to be set in the current context. Pass `null` to unset the user.
- */
- function setUser(user) {
- callOnHub('setUser', user);
- }
- /**
- * Creates a new scope with and executes the given operation within.
- * The scope is automatically removed once the operation
- * finishes or throws.
- *
- * This is essentially a convenience function for:
- *
- * pushScope();
- * callback();
- * popScope();
- *
- * @param callback that will be enclosed into push/popScope.
- */
- function withScope(callback) {
- callOnHub('withScope', callback);
- }
-
- var SENTRY_API_VERSION = '7';
- /** Helper class to provide urls to different Sentry endpoints. */
- var API = /** @class */ (function () {
- /** Create a new instance of API */
- function API(dsn) {
- this.dsn = dsn;
- this._dsnObject = new Dsn(dsn);
- }
- /** Returns the Dsn object. */
- API.prototype.getDsn = function () {
- return this._dsnObject;
- };
- /** Returns a string with auth headers in the url to the store endpoint. */
- API.prototype.getStoreEndpoint = function () {
- return "" + this._getBaseUrl() + this.getStoreEndpointPath();
- };
- /** Returns the store endpoint with auth added in url encoded. */
- API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {
- var dsn = this._dsnObject;
- var auth = {
- sentry_key: dsn.user,
- sentry_version: SENTRY_API_VERSION,
- };
- // Auth is intentionally sent as part of query string (NOT as custom HTTP header)
- // to avoid preflight CORS requests
- return this.getStoreEndpoint() + "?" + urlEncode(auth);
- };
- /** Returns the base path of the url including the port. */
- API.prototype._getBaseUrl = function () {
- var dsn = this._dsnObject;
- var protocol = dsn.protocol ? dsn.protocol + ":" : '';
- var port = dsn.port ? ":" + dsn.port : '';
- return protocol + "//" + dsn.host + port;
- };
- /** Returns only the path component for the store endpoint. */
- API.prototype.getStoreEndpointPath = function () {
- var dsn = this._dsnObject;
- return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/";
- };
- /** Returns an object that can be used in request headers. */
- API.prototype.getRequestHeaders = function (clientName, clientVersion) {
- var dsn = this._dsnObject;
- var header = ["Sentry sentry_version=" + SENTRY_API_VERSION];
- header.push("sentry_client=" + clientName + "/" + clientVersion);
- header.push("sentry_key=" + dsn.user);
- if (dsn.pass) {
- header.push("sentry_secret=" + dsn.pass);
- }
- return {
- 'Content-Type': 'application/json',
- 'X-Sentry-Auth': header.join(', '),
- };
- };
- /** Returns the url to the report dialog endpoint. */
- API.prototype.getReportDialogEndpoint = function (dialogOptions) {
- if (dialogOptions === void 0) { dialogOptions = {}; }
- var dsn = this._dsnObject;
- var endpoint = "" + this._getBaseUrl() + (dsn.path ? "/" + dsn.path : '') + "/api/embed/error-page/";
- var encodedOptions = [];
- encodedOptions.push("dsn=" + dsn.toString());
- for (var key in dialogOptions) {
- if (key === 'user') {
- if (!dialogOptions.user) {
- continue;
- }
- if (dialogOptions.user.name) {
- encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name));
- }
- if (dialogOptions.user.email) {
- encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email));
- }
- }
- else {
- encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key]));
- }
- }
- if (encodedOptions.length) {
- return endpoint + "?" + encodedOptions.join('&');
- }
- return endpoint;
- };
- return API;
- }());
-
- var installedIntegrations = [];
- /** Gets integration to install */
- function getIntegrationsToSetup(options) {
- var defaultIntegrations = (options.defaultIntegrations && __spread(options.defaultIntegrations)) || [];
- var userIntegrations = options.integrations;
- var integrations = [];
- if (Array.isArray(userIntegrations)) {
- var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });
- var pickedIntegrationsNames_1 = [];
- // Leave only unique default integrations, that were not overridden with provided user integrations
- defaultIntegrations.forEach(function (defaultIntegration) {
- if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&
- pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {
- integrations.push(defaultIntegration);
- pickedIntegrationsNames_1.push(defaultIntegration.name);
- }
- });
- // Don't add same user integration twice
- userIntegrations.forEach(function (userIntegration) {
- if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {
- integrations.push(userIntegration);
- pickedIntegrationsNames_1.push(userIntegration.name);
- }
- });
- }
- else if (typeof userIntegrations === 'function') {
- integrations = userIntegrations(defaultIntegrations);
- integrations = Array.isArray(integrations) ? integrations : [integrations];
- }
- else {
- integrations = __spread(defaultIntegrations);
- }
- // Make sure that if present, `Debug` integration will always run last
- var integrationsNames = integrations.map(function (i) { return i.name; });
- var alwaysLastToRun = 'Debug';
- if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {
- integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));
- }
- return integrations;
- }
- /** Setup given integration */
- function setupIntegration(integration) {
- if (installedIntegrations.indexOf(integration.name) !== -1) {
- return;
- }
- integration.setupOnce(addGlobalEventProcessor, getCurrentHub);
- installedIntegrations.push(integration.name);
- logger.log("Integration installed: " + integration.name);
- }
- /**
- * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default
- * integrations are added unless they were already provided before.
- * @param integrations array of integration instances
- * @param withDefault should enable default integrations
- */
- function setupIntegrations(options) {
- var integrations = {};
- getIntegrationsToSetup(options).forEach(function (integration) {
- integrations[integration.name] = integration;
- setupIntegration(integration);
- });
- return integrations;
- }
-
- /**
- * Base implementation for all JavaScript SDK clients.
- *
- * Call the constructor with the corresponding backend constructor and options
- * specific to the client subclass. To access these options later, use
- * {@link Client.getOptions}. Also, the Backend instance is available via
- * {@link Client.getBackend}.
- *
- * If a Dsn is specified in the options, it will be parsed and stored. Use
- * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is
- * invalid, the constructor will throw a {@link SentryException}. Note that
- * without a valid Dsn, the SDK will not send any events to Sentry.
- *
- * Before sending an event via the backend, it is passed through
- * {@link BaseClient.prepareEvent} to add SDK information and scope data
- * (breadcrumbs and context). To add more custom information, override this
- * method and extend the resulting prepared event.
- *
- * To issue automatically created events (e.g. via instrumentation), use
- * {@link Client.captureEvent}. It will prepare the event and pass it through
- * the callback lifecycle. To issue auto-breadcrumbs, use
- * {@link Client.addBreadcrumb}.
- *
- * @example
- * class NodeClient extends BaseClient {
- * public constructor(options: NodeOptions) {
- * super(NodeBackend, options);
- * }
- *
- * // ...
- * }
- */
- var BaseClient = /** @class */ (function () {
- /**
- * Initializes this client instance.
- *
- * @param backendClass A constructor function to create the backend.
- * @param options Options for the client.
- */
- function BaseClient(backendClass, options) {
- /** Array of used integrations. */
- this._integrations = {};
- /** Is the client still processing a call? */
- this._processing = false;
- this._backend = new backendClass(options);
- this._options = options;
- if (options.dsn) {
- this._dsn = new Dsn(options.dsn);
- }
- }
- /**
- * @inheritDoc
- */
- BaseClient.prototype.captureException = function (exception, hint, scope) {
- var _this = this;
- var eventId = hint && hint.event_id;
- this._processing = true;
- this._getBackend()
- .eventFromException(exception, hint)
- .then(function (event) { return _this._processEvent(event, hint, scope); })
- .then(function (finalEvent) {
- // We need to check for finalEvent in case beforeSend returned null
- eventId = finalEvent && finalEvent.event_id;
- _this._processing = false;
- })
- .then(null, function (reason) {
- logger.error(reason);
- _this._processing = false;
- });
- return eventId;
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.captureMessage = function (message, level, hint, scope) {
- var _this = this;
- var eventId = hint && hint.event_id;
- this._processing = true;
- var promisedEvent = isPrimitive(message)
- ? this._getBackend().eventFromMessage("" + message, level, hint)
- : this._getBackend().eventFromException(message, hint);
- promisedEvent
- .then(function (event) { return _this._processEvent(event, hint, scope); })
- .then(function (finalEvent) {
- // We need to check for finalEvent in case beforeSend returned null
- eventId = finalEvent && finalEvent.event_id;
- _this._processing = false;
- })
- .then(null, function (reason) {
- logger.error(reason);
- _this._processing = false;
- });
- return eventId;
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.captureEvent = function (event, hint, scope) {
- var _this = this;
- var eventId = hint && hint.event_id;
- this._processing = true;
- this._processEvent(event, hint, scope)
- .then(function (finalEvent) {
- // We need to check for finalEvent in case beforeSend returned null
- eventId = finalEvent && finalEvent.event_id;
- _this._processing = false;
- })
- .then(null, function (reason) {
- logger.error(reason);
- _this._processing = false;
- });
- return eventId;
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.getDsn = function () {
- return this._dsn;
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.getOptions = function () {
- return this._options;
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.flush = function (timeout) {
- var _this = this;
- return this._isClientProcessing(timeout).then(function (status) {
- clearInterval(status.interval);
- return _this._getBackend()
- .getTransport()
- .close(timeout)
- .then(function (transportFlushed) { return status.ready && transportFlushed; });
- });
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.close = function (timeout) {
- var _this = this;
- return this.flush(timeout).then(function (result) {
- _this.getOptions().enabled = false;
- return result;
- });
- };
- /**
- * Sets up the integrations
- */
- BaseClient.prototype.setupIntegrations = function () {
- if (this._isEnabled()) {
- this._integrations = setupIntegrations(this._options);
- }
- };
- /**
- * @inheritDoc
- */
- BaseClient.prototype.getIntegration = function (integration) {
- try {
- return this._integrations[integration.id] || null;
- }
- catch (_oO) {
- logger.warn("Cannot retrieve integration " + integration.id + " from the current Client");
- return null;
- }
- };
- /** Waits for the client to be done with processing. */
- BaseClient.prototype._isClientProcessing = function (timeout) {
- var _this = this;
- return new SyncPromise(function (resolve) {
- var ticked = 0;
- var tick = 1;
- var interval = 0;
- clearInterval(interval);
- interval = setInterval(function () {
- if (!_this._processing) {
- resolve({
- interval: interval,
- ready: true,
- });
- }
- else {
- ticked += tick;
- if (timeout && ticked >= timeout) {
- resolve({
- interval: interval,
- ready: false,
- });
- }
- }
- }, tick);
- });
- };
- /** Returns the current backend. */
- BaseClient.prototype._getBackend = function () {
- return this._backend;
- };
- /** Determines whether this SDK is enabled and a valid Dsn is present. */
- BaseClient.prototype._isEnabled = function () {
- return this.getOptions().enabled !== false && this._dsn !== undefined;
- };
- /**
- * Adds common information to events.
- *
- * The information includes release and environment from `options`,
- * breadcrumbs and context (extra, tags and user) from the scope.
- *
- * Information that is already present in the event is never overwritten. For
- * nested objects, such as the context, keys are merged.
- *
- * @param event The original event.
- * @param hint May contain additional informartion about the original exception.
- * @param scope A scope containing event metadata.
- * @returns A new event with more information.
- */
- BaseClient.prototype._prepareEvent = function (event, scope, hint) {
- var _this = this;
- var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b, _c = _a.normalizeDepth, normalizeDepth = _c === void 0 ? 3 : _c;
- var prepared = __assign({}, event);
- if (prepared.environment === undefined && environment !== undefined) {
- prepared.environment = environment;
- }
- if (prepared.release === undefined && release !== undefined) {
- prepared.release = release;
- }
- if (prepared.dist === undefined && dist !== undefined) {
- prepared.dist = dist;
- }
- if (prepared.message) {
- prepared.message = truncate(prepared.message, maxValueLength);
- }
- var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];
- if (exception && exception.value) {
- exception.value = truncate(exception.value, maxValueLength);
- }
- var request = prepared.request;
- if (request && request.url) {
- request.url = truncate(request.url, maxValueLength);
- }
- if (prepared.event_id === undefined) {
- prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4();
- }
- this._addIntegrations(prepared.sdk);
- // We prepare the result here with a resolved Event.
- var result = SyncPromise.resolve(prepared);
- // This should be the last thing called, since we want that
- // {@link Hub.addEventProcessor} gets the finished prepared event.
- if (scope) {
- // In case we have a hub we reassign it.
- result = scope.applyToEvent(prepared, hint);
- }
- return result.then(function (evt) {
- // tslint:disable-next-line:strict-type-predicates
- if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {
- return _this._normalizeEvent(evt, normalizeDepth);
- }
- return evt;
- });
- };
- /**
- * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.
- * Normalized keys:
- * - `breadcrumbs.data`
- * - `user`
- * - `contexts`
- * - `extra`
- * @param event Event
- * @returns Normalized event
- */
- BaseClient.prototype._normalizeEvent = function (event, depth) {
- if (!event) {
- return null;
- }
- // tslint:disable:no-unsafe-any
- return __assign({}, event, (event.breadcrumbs && {
- breadcrumbs: event.breadcrumbs.map(function (b) { return (__assign({}, b, (b.data && {
- data: normalize(b.data, depth),
- }))); }),
- }), (event.user && {
- user: normalize(event.user, depth),
- }), (event.contexts && {
- contexts: normalize(event.contexts, depth),
- }), (event.extra && {
- extra: normalize(event.extra, depth),
- }));
- };
- /**
- * This function adds all used integrations to the SDK info in the event.
- * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.
- */
- BaseClient.prototype._addIntegrations = function (sdkInfo) {
- var integrationsArray = Object.keys(this._integrations);
- if (sdkInfo && integrationsArray.length > 0) {
- sdkInfo.integrations = integrationsArray;
- }
- };
- /**
- * Processes an event (either error or message) and sends it to Sentry.
- *
- * This also adds breadcrumbs and context information to the event. However,
- * platform specific meta data (such as the User's IP address) must be added
- * by the SDK implementor.
- *
- *
- * @param event The event to send to Sentry.
- * @param hint May contain additional informartion about the original exception.
- * @param scope A scope containing event metadata.
- * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.
- */
- BaseClient.prototype._processEvent = function (event, hint, scope) {
- var _this = this;
- var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;
- if (!this._isEnabled()) {
- return SyncPromise.reject('SDK not enabled, will not send event.');
- }
- // 1.0 === 100% events are sent
- // 0.0 === 0% events are sent
- if (typeof sampleRate === 'number' && Math.random() > sampleRate) {
- return SyncPromise.reject('This event has been sampled, will not send event.');
- }
- return new SyncPromise(function (resolve, reject) {
- _this._prepareEvent(event, scope, hint)
- .then(function (prepared) {
- if (prepared === null) {
- reject('An event processor returned null, will not send event.');
- return;
- }
- var finalEvent = prepared;
- var isInternalException = hint && hint.data && hint.data.__sentry__ === true;
- if (isInternalException || !beforeSend) {
- _this._getBackend().sendEvent(finalEvent);
- resolve(finalEvent);
- return;
- }
- var beforeSendResult = beforeSend(prepared, hint);
- // tslint:disable-next-line:strict-type-predicates
- if (typeof beforeSendResult === 'undefined') {
- logger.error('`beforeSend` method has to return `null` or a valid event.');
- }
- else if (isThenable(beforeSendResult)) {
- _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);
- }
- else {
- finalEvent = beforeSendResult;
- if (finalEvent === null) {
- logger.log('`beforeSend` returned `null`, will not send event.');
- resolve(null);
- return;
- }
- // From here on we are really async
- _this._getBackend().sendEvent(finalEvent);
- resolve(finalEvent);
- }
- })
- .then(null, function (reason) {
- _this.captureException(reason, {
- data: {
- __sentry__: true,
- },
- originalException: reason,
- });
- reject("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason);
- });
- });
- };
- /**
- * Resolves before send Promise and calls resolve/reject on parent SyncPromise.
- */
- BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {
- var _this = this;
- beforeSend
- .then(function (processedEvent) {
- if (processedEvent === null) {
- reject('`beforeSend` returned `null`, will not send event.');
- return;
- }
- // From here on we are really async
- _this._getBackend().sendEvent(processedEvent);
- resolve(processedEvent);
- })
- .then(null, function (e) {
- reject("beforeSend rejected with " + e);
- });
- };
- return BaseClient;
- }());
-
- /** Noop transport */
- var NoopTransport = /** @class */ (function () {
- function NoopTransport() {
- }
- /**
- * @inheritDoc
- */
- NoopTransport.prototype.sendEvent = function (_) {
- return SyncPromise.resolve({
- reason: "NoopTransport: Event has been skipped because no Dsn is configured.",
- status: exports.Status.Skipped,
- });
- };
- /**
- * @inheritDoc
- */
- NoopTransport.prototype.close = function (_) {
- return SyncPromise.resolve(true);
- };
- return NoopTransport;
- }());
-
- /**
- * This is the base implemention of a Backend.
- * @hidden
- */
- var BaseBackend = /** @class */ (function () {
- /** Creates a new backend instance. */
- function BaseBackend(options) {
- this._options = options;
- if (!this._options.dsn) {
- logger.warn('No DSN provided, backend will not do anything.');
- }
- this._transport = this._setupTransport();
- }
- /**
- * Sets up the transport so it can be used later to send requests.
- */
- BaseBackend.prototype._setupTransport = function () {
- return new NoopTransport();
- };
- /**
- * @inheritDoc
- */
- BaseBackend.prototype.eventFromException = function (_exception, _hint) {
- throw new SentryError('Backend has to implement `eventFromException` method');
- };
- /**
- * @inheritDoc
- */
- BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {
- throw new SentryError('Backend has to implement `eventFromMessage` method');
- };
- /**
- * @inheritDoc
- */
- BaseBackend.prototype.sendEvent = function (event) {
- this._transport.sendEvent(event).then(null, function (reason) {
- logger.error("Error while sending event: " + reason);
- });
- };
- /**
- * @inheritDoc
- */
- BaseBackend.prototype.getTransport = function () {
- return this._transport;
- };
- return BaseBackend;
- }());
-
- /**
- * Internal function to create a new SDK client instance. The client is
- * installed and then bound to the current scope.
- *
- * @param clientClass The client class to instanciate.
- * @param options Options to pass to the client.
- */
- function initAndBind(clientClass, options) {
- if (options.debug === true) {
- logger.enable();
- }
- var hub = getCurrentHub();
- var client = new clientClass(options);
- hub.bindClient(client);
- }
-
- var originalFunctionToString;
- /** Patch toString calls to return proper name for wrapped functions */
- var FunctionToString = /** @class */ (function () {
- function FunctionToString() {
- /**
- * @inheritDoc
- */
- this.name = FunctionToString.id;
- }
- /**
- * @inheritDoc
- */
- FunctionToString.prototype.setupOnce = function () {
- originalFunctionToString = Function.prototype.toString;
- Function.prototype.toString = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var context = this.__sentry_original__ || this;
- // tslint:disable-next-line:no-unsafe-any
- return originalFunctionToString.apply(context, args);
- };
- };
- /**
- * @inheritDoc
- */
- FunctionToString.id = 'FunctionToString';
- return FunctionToString;
- }());
-
- // "Script error." is hard coded into browsers for errors that it can't read.
- // this is the result of a script being pulled in from an external domain and CORS.
- var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/];
- /** Inbound filters configurable by the user */
- var InboundFilters = /** @class */ (function () {
- function InboundFilters(_options) {
- if (_options === void 0) { _options = {}; }
- this._options = _options;
- /**
- * @inheritDoc
- */
- this.name = InboundFilters.id;
- }
- /**
- * @inheritDoc
- */
- InboundFilters.prototype.setupOnce = function () {
- addGlobalEventProcessor(function (event) {
- var hub = getCurrentHub();
- if (!hub) {
- return event;
- }
- var self = hub.getIntegration(InboundFilters);
- if (self) {
- var client = hub.getClient();
- var clientOptions = client ? client.getOptions() : {};
- var options = self._mergeOptions(clientOptions);
- if (self._shouldDropEvent(event, options)) {
- return null;
- }
- }
- return event;
- });
- };
- /** JSDoc */
- InboundFilters.prototype._shouldDropEvent = function (event, options) {
- if (this._isSentryError(event, options)) {
- logger.warn("Event dropped due to being internal Sentry Error.\nEvent: " + getEventDescription(event));
- return true;
- }
- if (this._isIgnoredError(event, options)) {
- logger.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + getEventDescription(event));
- return true;
- }
- if (this._isBlacklistedUrl(event, options)) {
- logger.warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: " + getEventDescription(event) + ".\nUrl: " + this._getEventFilterUrl(event));
- return true;
- }
- if (!this._isWhitelistedUrl(event, options)) {
- logger.warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: " + getEventDescription(event) + ".\nUrl: " + this._getEventFilterUrl(event));
- return true;
- }
- return false;
- };
- /** JSDoc */
- InboundFilters.prototype._isSentryError = function (event, options) {
- if (options === void 0) { options = {}; }
- if (!options.ignoreInternal) {
- return false;
- }
- try {
- return ((event &&
- event.exception &&
- event.exception.values &&
- event.exception.values[0] &&
- event.exception.values[0].type === 'SentryError') ||
- false);
- }
- catch (_oO) {
- return false;
- }
- };
- /** JSDoc */
- InboundFilters.prototype._isIgnoredError = function (event, options) {
- if (options === void 0) { options = {}; }
- if (!options.ignoreErrors || !options.ignoreErrors.length) {
- return false;
- }
- return this._getPossibleEventMessages(event).some(function (message) {
- // Not sure why TypeScript complains here...
- return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });
- });
- };
- /** JSDoc */
- InboundFilters.prototype._isBlacklistedUrl = function (event, options) {
- if (options === void 0) { options = {}; }
- // TODO: Use Glob instead?
- if (!options.blacklistUrls || !options.blacklistUrls.length) {
- return false;
- }
- var url = this._getEventFilterUrl(event);
- return !url ? false : options.blacklistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });
- };
- /** JSDoc */
- InboundFilters.prototype._isWhitelistedUrl = function (event, options) {
- if (options === void 0) { options = {}; }
- // TODO: Use Glob instead?
- if (!options.whitelistUrls || !options.whitelistUrls.length) {
- return true;
- }
- var url = this._getEventFilterUrl(event);
- return !url ? true : options.whitelistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });
- };
- /** JSDoc */
- InboundFilters.prototype._mergeOptions = function (clientOptions) {
- if (clientOptions === void 0) { clientOptions = {}; }
- return {
- blacklistUrls: __spread((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),
- ignoreErrors: __spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),
- ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,
- whitelistUrls: __spread((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),
- };
- };
- /** JSDoc */
- InboundFilters.prototype._getPossibleEventMessages = function (event) {
- if (event.message) {
- return [event.message];
- }
- if (event.exception) {
- try {
- var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;
- return ["" + value, type + ": " + value];
- }
- catch (oO) {
- logger.error("Cannot extract message for event " + getEventDescription(event));
- return [];
- }
- }
- return [];
- };
- /** JSDoc */
- InboundFilters.prototype._getEventFilterUrl = function (event) {
- try {
- if (event.stacktrace) {
- var frames_1 = event.stacktrace.frames;
- return (frames_1 && frames_1[frames_1.length - 1].filename) || null;
- }
- if (event.exception) {
- var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;
- return (frames_2 && frames_2[frames_2.length - 1].filename) || null;
- }
- return null;
- }
- catch (oO) {
- logger.error("Cannot extract url for event " + getEventDescription(event));
- return null;
- }
- };
- /**
- * @inheritDoc
- */
- InboundFilters.id = 'InboundFilters';
- return InboundFilters;
- }());
-
-
-
- var CoreIntegrations = /*#__PURE__*/Object.freeze({
- FunctionToString: FunctionToString,
- InboundFilters: InboundFilters
- });
-
- // tslint:disable:object-literal-sort-keys
- // global reference to slice
- var UNKNOWN_FUNCTION = '?';
- // Chromium based browsers: Chrome, Brave, new Opera, new Edge
- var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
- // gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
- // generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
- // We need this specific case for now because we want no other regex to match.
- var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i;
- var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
- var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
- var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
- /** JSDoc */
- function computeStackTrace(ex) {
- // tslint:disable:no-unsafe-any
- var stack = null;
- var popSize = ex && ex.framesToPop;
- try {
- // This must be tried first because Opera 10 *destroys*
- // its stacktrace property if you try to access the stack
- // property first!!
- stack = computeStackTraceFromStacktraceProp(ex);
- if (stack) {
- return popFrames(stack, popSize);
- }
- }
- catch (e) {
- // no-empty
- }
- try {
- stack = computeStackTraceFromStackProp(ex);
- if (stack) {
- return popFrames(stack, popSize);
- }
- }
- catch (e) {
- // no-empty
- }
- return {
- message: extractMessage(ex),
- name: ex && ex.name,
- stack: [],
- failed: true,
- };
- }
- /** JSDoc */
- // tslint:disable-next-line:cyclomatic-complexity
- function computeStackTraceFromStackProp(ex) {
- // tslint:disable:no-conditional-assignment
- if (!ex || !ex.stack) {
- return null;
- }
- var stack = [];
- var lines = ex.stack.split('\n');
- var isEval;
- var submatch;
- var parts;
- var element;
- for (var i = 0; i < lines.length; ++i) {
- if ((parts = chrome.exec(lines[i]))) {
- var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
- isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
- if (isEval && (submatch = chromeEval.exec(parts[2]))) {
- // throw out eval line/column and use top-most line/column number
- parts[2] = submatch[1]; // url
- parts[3] = submatch[2]; // line
- parts[4] = submatch[3]; // column
- }
- element = {
- // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `
- // prefix here seems like the quickest solution for now.
- url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],
- func: parts[1] || UNKNOWN_FUNCTION,
- args: isNative ? [parts[2]] : [],
- line: parts[3] ? +parts[3] : null,
- column: parts[4] ? +parts[4] : null,
- };
- }
- else if ((parts = winjs.exec(lines[i]))) {
- element = {
- url: parts[2],
- func: parts[1] || UNKNOWN_FUNCTION,
- args: [],
- line: +parts[3],
- column: parts[4] ? +parts[4] : null,
- };
- }
- else if ((parts = gecko.exec(lines[i]))) {
- isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
- if (isEval && (submatch = geckoEval.exec(parts[3]))) {
- // throw out eval line/column and use top-most line number
- parts[1] = parts[1] || "eval";
- parts[3] = submatch[1];
- parts[4] = submatch[2];
- parts[5] = ''; // no column when eval
- }
- else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {
- // FireFox uses this awesome columnNumber property for its top frame
- // Also note, Firefox's column number is 0-based and everything else expects 1-based,
- // so adding 1
- // NOTE: this hack doesn't work if top-most frame is eval
- stack[0].column = ex.columnNumber + 1;
- }
- element = {
- url: parts[3],
- func: parts[1] || UNKNOWN_FUNCTION,
- args: parts[2] ? parts[2].split(',') : [],
- line: parts[4] ? +parts[4] : null,
- column: parts[5] ? +parts[5] : null,
- };
- }
- else {
- continue;
- }
- if (!element.func && element.line) {
- element.func = UNKNOWN_FUNCTION;
- }
- stack.push(element);
- }
- if (!stack.length) {
- return null;
- }
- return {
- message: extractMessage(ex),
- name: ex.name,
- stack: stack,
- };
- }
- /** JSDoc */
- function computeStackTraceFromStacktraceProp(ex) {
- if (!ex || !ex.stacktrace) {
- return null;
- }
- // Access and store the stacktrace property before doing ANYTHING
- // else to it because Opera is not very good at providing it
- // reliably in other circumstances.
- var stacktrace = ex.stacktrace;
- var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
- var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
- var lines = stacktrace.split('\n');
- var stack = [];
- var parts;
- for (var line = 0; line < lines.length; line += 2) {
- // tslint:disable:no-conditional-assignment
- var element = null;
- if ((parts = opera10Regex.exec(lines[line]))) {
- element = {
- url: parts[2],
- func: parts[3],
- args: [],
- line: +parts[1],
- column: null,
- };
- }
- else if ((parts = opera11Regex.exec(lines[line]))) {
- element = {
- url: parts[6],
- func: parts[3] || parts[4],
- args: parts[5] ? parts[5].split(',') : [],
- line: +parts[1],
- column: +parts[2],
- };
- }
- if (element) {
- if (!element.func && element.line) {
- element.func = UNKNOWN_FUNCTION;
- }
- stack.push(element);
- }
- }
- if (!stack.length) {
- return null;
- }
- return {
- message: extractMessage(ex),
- name: ex.name,
- stack: stack,
- };
- }
- /** Remove N number of frames from the stack */
- function popFrames(stacktrace, popSize) {
- try {
- return __assign({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });
- }
- catch (e) {
- return stacktrace;
- }
- }
- /**
- * There are cases where stacktrace.message is an Event object
- * https://github.com/getsentry/sentry-javascript/issues/1949
- * In this specific case we try to extract stacktrace.message.error.message
- */
- function extractMessage(ex) {
- var message = ex && ex.message;
- if (!message) {
- return 'No error message';
- }
- if (message.error && typeof message.error.message === 'string') {
- return message.error.message;
- }
- return message;
- }
-
- var STACKTRACE_LIMIT = 50;
- /**
- * This function creates an exception from an TraceKitStackTrace
- * @param stacktrace TraceKitStackTrace that will be converted to an exception
- * @hidden
- */
- function exceptionFromStacktrace(stacktrace) {
- var frames = prepareFramesForEvent(stacktrace.stack);
- var exception = {
- type: stacktrace.name,
- value: stacktrace.message,
- };
- if (frames && frames.length) {
- exception.stacktrace = { frames: frames };
- }
- // tslint:disable-next-line:strict-type-predicates
- if (exception.type === undefined && exception.value === '') {
- exception.value = 'Unrecoverable error caught';
- }
- return exception;
- }
- /**
- * @hidden
- */
- function eventFromPlainObject(exception, syntheticException, rejection) {
- var event = {
- exception: {
- values: [
- {
- type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',
- value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + extractExceptionKeysForMessage(exception),
- },
- ],
- },
- extra: {
- __serialized__: normalizeToSize(exception),
- },
- };
- if (syntheticException) {
- var stacktrace = computeStackTrace(syntheticException);
- var frames_1 = prepareFramesForEvent(stacktrace.stack);
- event.stacktrace = {
- frames: frames_1,
- };
- }
- return event;
- }
- /**
- * @hidden
- */
- function eventFromStacktrace(stacktrace) {
- var exception = exceptionFromStacktrace(stacktrace);
- return {
- exception: {
- values: [exception],
- },
- };
- }
- /**
- * @hidden
- */
- function prepareFramesForEvent(stack) {
- if (!stack || !stack.length) {
- return [];
- }
- var localStack = stack;
- var firstFrameFunction = localStack[0].func || '';
- var lastFrameFunction = localStack[localStack.length - 1].func || '';
- // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
- if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {
- localStack = localStack.slice(1);
- }
- // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)
- if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {
- localStack = localStack.slice(0, -1);
- }
- // The frame where the crash happened, should be the last entry in the array
- return localStack
- .map(function (frame) { return ({
- colno: frame.column === null ? undefined : frame.column,
- filename: frame.url || localStack[0].url,
- function: frame.func || '?',
- in_app: true,
- lineno: frame.line === null ? undefined : frame.line,
- }); })
- .slice(0, STACKTRACE_LIMIT)
- .reverse();
- }
-
- /** JSDoc */
- function eventFromUnknownInput(exception, syntheticException, options) {
- if (options === void 0) { options = {}; }
- var event;
- if (isErrorEvent(exception) && exception.error) {
- // If it is an ErrorEvent with `error` property, extract it to get actual Error
- var errorEvent = exception;
- exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment
- event = eventFromStacktrace(computeStackTrace(exception));
- return event;
- }
- if (isDOMError(exception) || isDOMException(exception)) {
- // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
- // then we just extract the name and message, as they don't provide anything else
- // https://developer.mozilla.org/en-US/docs/Web/API/DOMError
- // https://developer.mozilla.org/en-US/docs/Web/API/DOMException
- var domException = exception;
- var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');
- var message = domException.message ? name_1 + ": " + domException.message : name_1;
- event = eventFromString(message, syntheticException, options);
- addExceptionTypeValue(event, message);
- return event;
- }
- if (isError(exception)) {
- // we have a real Error object, do nothing
- event = eventFromStacktrace(computeStackTrace(exception));
- return event;
- }
- if (isPlainObject(exception) || isEvent(exception)) {
- // If it is plain Object or Event, serialize it manually and extract options
- // This will allow us to group events based on top-level keys
- // which is much better than creating new group when any key/value change
- var objectException = exception;
- event = eventFromPlainObject(objectException, syntheticException, options.rejection);
- addExceptionMechanism(event, {
- synthetic: true,
- });
- return event;
- }
- // If none of previous checks were valid, then it means that it's not:
- // - an instance of DOMError
- // - an instance of DOMException
- // - an instance of Event
- // - an instance of Error
- // - a valid ErrorEvent (one with an error property)
- // - a plain Object
- //
- // So bail out and capture it as a simple message:
- event = eventFromString(exception, syntheticException, options);
- addExceptionTypeValue(event, "" + exception, undefined);
- addExceptionMechanism(event, {
- synthetic: true,
- });
- return event;
- }
- // this._options.attachStacktrace
- /** JSDoc */
- function eventFromString(input, syntheticException, options) {
- if (options === void 0) { options = {}; }
- var event = {
- message: input,
- };
- if (options.attachStacktrace && syntheticException) {
- var stacktrace = computeStackTrace(syntheticException);
- var frames_1 = prepareFramesForEvent(stacktrace.stack);
- event.stacktrace = {
- frames: frames_1,
- };
- }
- return event;
- }
-
- /** Base Transport class implementation */
- var BaseTransport = /** @class */ (function () {
- function BaseTransport(options) {
- this.options = options;
- /** A simple buffer holding all requests. */
- this._buffer = new PromiseBuffer(30);
- this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();
- }
- /**
- * @inheritDoc
- */
- BaseTransport.prototype.sendEvent = function (_) {
- throw new SentryError('Transport Class has to implement `sendEvent` method');
- };
- /**
- * @inheritDoc
- */
- BaseTransport.prototype.close = function (timeout) {
- return this._buffer.drain(timeout);
- };
- return BaseTransport;
- }());
-
- var global$3 = getGlobalObject();
- /** `fetch` based transport */
- var FetchTransport = /** @class */ (function (_super) {
- __extends(FetchTransport, _super);
- function FetchTransport() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- /** Locks transport after receiving 429 response */
- _this._disabledUntil = new Date(Date.now());
- return _this;
- }
- /**
- * @inheritDoc
- */
- FetchTransport.prototype.sendEvent = function (event) {
- var _this = this;
- if (new Date(Date.now()) < this._disabledUntil) {
- return Promise.reject({
- event: event,
- reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
- status: 429,
- });
- }
- var defaultOptions = {
- body: JSON.stringify(event),
- method: 'POST',
- // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
- // https://caniuse.com/#feat=referrer-policy
- // It doesn't. And it throw exception instead of ignoring this parameter...
- // REF: https://github.com/getsentry/raven-js/issues/1233
- referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''),
- };
- if (this.options.headers !== undefined) {
- defaultOptions.headers = this.options.headers;
- }
- return this._buffer.add(new SyncPromise(function (resolve, reject) {
- global$3
- .fetch(_this.url, defaultOptions)
- .then(function (response) {
- var status = exports.Status.fromHttpCode(response.status);
- if (status === exports.Status.Success) {
- resolve({ status: status });
- return;
- }
- if (status === exports.Status.RateLimit) {
- var now = Date.now();
- _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After')));
- logger.warn("Too many requests, backing off till: " + _this._disabledUntil);
- }
- reject(response);
- })
- .catch(reject);
- }));
- };
- return FetchTransport;
- }(BaseTransport));
-
- /** `XHR` based transport */
- var XHRTransport = /** @class */ (function (_super) {
- __extends(XHRTransport, _super);
- function XHRTransport() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- /** Locks transport after receiving 429 response */
- _this._disabledUntil = new Date(Date.now());
- return _this;
- }
- /**
- * @inheritDoc
- */
- XHRTransport.prototype.sendEvent = function (event) {
- var _this = this;
- if (new Date(Date.now()) < this._disabledUntil) {
- return Promise.reject({
- event: event,
- reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
- status: 429,
- });
- }
- return this._buffer.add(new SyncPromise(function (resolve, reject) {
- var request = new XMLHttpRequest();
- request.onreadystatechange = function () {
- if (request.readyState !== 4) {
- return;
- }
- var status = exports.Status.fromHttpCode(request.status);
- if (status === exports.Status.Success) {
- resolve({ status: status });
- return;
- }
- if (status === exports.Status.RateLimit) {
- var now = Date.now();
- _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After')));
- logger.warn("Too many requests, backing off till: " + _this._disabledUntil);
- }
- reject(request);
- };
- request.open('POST', _this.url);
- for (var header in _this.options.headers) {
- if (_this.options.headers.hasOwnProperty(header)) {
- request.setRequestHeader(header, _this.options.headers[header]);
- }
- }
- request.send(JSON.stringify(event));
- }));
- };
- return XHRTransport;
- }(BaseTransport));
-
-
-
- var index = /*#__PURE__*/Object.freeze({
- BaseTransport: BaseTransport,
- FetchTransport: FetchTransport,
- XHRTransport: XHRTransport
- });
-
- /**
- * The Sentry Browser SDK Backend.
- * @hidden
- */
- var BrowserBackend = /** @class */ (function (_super) {
- __extends(BrowserBackend, _super);
- function BrowserBackend() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- /**
- * @inheritDoc
- */
- BrowserBackend.prototype._setupTransport = function () {
- if (!this._options.dsn) {
- // We return the noop transport here in case there is no Dsn.
- return _super.prototype._setupTransport.call(this);
- }
- var transportOptions = __assign({}, this._options.transportOptions, { dsn: this._options.dsn });
- if (this._options.transport) {
- return new this._options.transport(transportOptions);
- }
- if (supportsFetch()) {
- return new FetchTransport(transportOptions);
- }
- return new XHRTransport(transportOptions);
- };
- /**
- * @inheritDoc
- */
- BrowserBackend.prototype.eventFromException = function (exception, hint) {
- var syntheticException = (hint && hint.syntheticException) || undefined;
- var event = eventFromUnknownInput(exception, syntheticException, {
- attachStacktrace: this._options.attachStacktrace,
- });
- addExceptionMechanism(event, {
- handled: true,
- type: 'generic',
- });
- event.level = exports.Severity.Error;
- if (hint && hint.event_id) {
- event.event_id = hint.event_id;
- }
- return SyncPromise.resolve(event);
- };
- /**
- * @inheritDoc
- */
- BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {
- if (level === void 0) { level = exports.Severity.Info; }
- var syntheticException = (hint && hint.syntheticException) || undefined;
- var event = eventFromString(message, syntheticException, {
- attachStacktrace: this._options.attachStacktrace,
- });
- event.level = level;
- if (hint && hint.event_id) {
- event.event_id = hint.event_id;
- }
- return SyncPromise.resolve(event);
- };
- return BrowserBackend;
- }(BaseBackend));
-
- var SDK_NAME = 'sentry.javascript.browser';
- var SDK_VERSION = '5.15.0';
-
- /**
- * The Sentry Browser SDK Client.
- *
- * @see BrowserOptions for documentation on configuration options.
- * @see SentryClient for usage documentation.
- */
- var BrowserClient = /** @class */ (function (_super) {
- __extends(BrowserClient, _super);
- /**
- * Creates a new Browser SDK instance.
- *
- * @param options Configuration options for this SDK.
- */
- function BrowserClient(options) {
- if (options === void 0) { options = {}; }
- return _super.call(this, BrowserBackend, options) || this;
- }
- /**
- * @inheritDoc
- */
- BrowserClient.prototype._prepareEvent = function (event, scope, hint) {
- event.platform = event.platform || 'javascript';
- event.sdk = __assign({}, event.sdk, { name: SDK_NAME, packages: __spread(((event.sdk && event.sdk.packages) || []), [
- {
- name: 'npm:@sentry/browser',
- version: SDK_VERSION,
- },
- ]), version: SDK_VERSION });
- return _super.prototype._prepareEvent.call(this, event, scope, hint);
- };
- /**
- * Show a report dialog to the user to send feedback to a specific event.
- *
- * @param options Set individual options for the dialog
- */
- BrowserClient.prototype.showReportDialog = function (options) {
- if (options === void 0) { options = {}; }
- // doesn't work without a document (React Native)
- var document = getGlobalObject().document;
- if (!document) {
- return;
- }
- if (!this._isEnabled()) {
- logger.error('Trying to call showReportDialog with Sentry Client is disabled');
- return;
- }
- var dsn = options.dsn || this.getDsn();
- if (!options.eventId) {
- logger.error('Missing `eventId` option in showReportDialog call');
- return;
- }
- if (!dsn) {
- logger.error('Missing `Dsn` option in showReportDialog call');
- return;
- }
- var script = document.createElement('script');
- script.async = true;
- script.src = new API(dsn).getReportDialogEndpoint(options);
- if (options.onLoad) {
- script.onload = options.onLoad;
- }
- (document.head || document.body).appendChild(script);
- };
- return BrowserClient;
- }(BaseClient));
-
- var ignoreOnError = 0;
- /**
- * @hidden
- */
- function shouldIgnoreOnError() {
- return ignoreOnError > 0;
- }
- /**
- * @hidden
- */
- function ignoreNextOnError() {
- // onerror should trigger before setTimeout
- ignoreOnError += 1;
- setTimeout(function () {
- ignoreOnError -= 1;
- });
- }
- /**
- * Instruments the given function and sends an event to Sentry every time the
- * function throws an exception.
- *
- * @param fn A function to wrap.
- * @returns The wrapped function.
- * @hidden
- */
- function wrap(fn, options, before) {
- if (options === void 0) { options = {}; }
- // tslint:disable-next-line:strict-type-predicates
- if (typeof fn !== 'function') {
- return fn;
- }
- try {
- // We don't wanna wrap it twice
- if (fn.__sentry__) {
- return fn;
- }
- // If this has already been wrapped in the past, return that wrapped function
- if (fn.__sentry_wrapped__) {
- return fn.__sentry_wrapped__;
- }
- }
- catch (e) {
- // Just accessing custom props in some Selenium environments
- // can cause a "Permission denied" exception (see raven-js#495).
- // Bail on wrapping and return the function as-is (defers to window.onerror).
- return fn;
- }
- var sentryWrapped = function () {
- var args = Array.prototype.slice.call(arguments);
- // tslint:disable:no-unsafe-any
- try {
- // tslint:disable-next-line:strict-type-predicates
- if (before && typeof before === 'function') {
- before.apply(this, arguments);
- }
- var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });
- if (fn.handleEvent) {
- // Attempt to invoke user-land function
- // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
- // means the sentry.javascript SDK caught an error invoking your application code. This
- // is expected behavior and NOT indicative of a bug with sentry.javascript.
- return fn.handleEvent.apply(this, wrappedArguments);
- }
- // Attempt to invoke user-land function
- // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
- // means the sentry.javascript SDK caught an error invoking your application code. This
- // is expected behavior and NOT indicative of a bug with sentry.javascript.
- return fn.apply(this, wrappedArguments);
- // tslint:enable:no-unsafe-any
- }
- catch (ex) {
- ignoreNextOnError();
- withScope(function (scope) {
- scope.addEventProcessor(function (event) {
- var processedEvent = __assign({}, event);
- if (options.mechanism) {
- addExceptionTypeValue(processedEvent, undefined, undefined);
- addExceptionMechanism(processedEvent, options.mechanism);
- }
- processedEvent.extra = __assign({}, processedEvent.extra, { arguments: args });
- return processedEvent;
- });
- captureException(ex);
- });
- throw ex;
- }
- };
- // Accessing some objects may throw
- // ref: https://github.com/getsentry/sentry-javascript/issues/1168
- try {
- for (var property in fn) {
- if (Object.prototype.hasOwnProperty.call(fn, property)) {
- sentryWrapped[property] = fn[property];
- }
- }
- }
- catch (_oO) { } // tslint:disable-line:no-empty
- fn.prototype = fn.prototype || {};
- sentryWrapped.prototype = fn.prototype;
- Object.defineProperty(fn, '__sentry_wrapped__', {
- enumerable: false,
- value: sentryWrapped,
- });
- // Signal that this function has been wrapped/filled already
- // for both debugging and to prevent it to being wrapped/filled twice
- Object.defineProperties(sentryWrapped, {
- __sentry__: {
- enumerable: false,
- value: true,
- },
- __sentry_original__: {
- enumerable: false,
- value: fn,
- },
- });
- // Restore original function name (not all browsers allow that)
- try {
- var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');
- if (descriptor.configurable) {
- Object.defineProperty(sentryWrapped, 'name', {
- get: function () {
- return fn.name;
- },
- });
- }
- }
- catch (_oO) {
- /*no-empty*/
- }
- return sentryWrapped;
- }
-
- /** Global handlers */
- var GlobalHandlers = /** @class */ (function () {
- /** JSDoc */
- function GlobalHandlers(options) {
- /**
- * @inheritDoc
- */
- this.name = GlobalHandlers.id;
- /** JSDoc */
- this._onErrorHandlerInstalled = false;
- /** JSDoc */
- this._onUnhandledRejectionHandlerInstalled = false;
- this._options = __assign({ onerror: true, onunhandledrejection: true }, options);
- }
- /**
- * @inheritDoc
- */
- GlobalHandlers.prototype.setupOnce = function () {
- Error.stackTraceLimit = 50;
- if (this._options.onerror) {
- logger.log('Global Handler attached: onerror');
- this._installGlobalOnErrorHandler();
- }
- if (this._options.onunhandledrejection) {
- logger.log('Global Handler attached: onunhandledrejection');
- this._installGlobalOnUnhandledRejectionHandler();
- }
- };
- /** JSDoc */
- GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
- var _this = this;
- if (this._onErrorHandlerInstalled) {
- return;
- }
- addInstrumentationHandler({
- callback: function (data) {
- var error = data.error;
- var currentHub = getCurrentHub();
- var hasIntegration = currentHub.getIntegration(GlobalHandlers);
- var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
- if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {
- return;
- }
- var client = currentHub.getClient();
- var event = isPrimitive(error)
- ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
- : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {
- attachStacktrace: client && client.getOptions().attachStacktrace,
- rejection: false,
- }), data.url, data.line, data.column);
- addExceptionMechanism(event, {
- handled: false,
- type: 'onerror',
- });
- currentHub.captureEvent(event, {
- originalException: error,
- });
- },
- type: 'error',
- });
- this._onErrorHandlerInstalled = true;
- };
- /** JSDoc */
- GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
- var _this = this;
- if (this._onUnhandledRejectionHandlerInstalled) {
- return;
- }
- addInstrumentationHandler({
- callback: function (e) {
- var error = e;
- // dig the object of the rejection out of known event types
- try {
- // PromiseRejectionEvents store the object of the rejection under 'reason'
- // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
- if ('reason' in e) {
- error = e.reason;
- }
- // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
- // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
- // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
- // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
- // https://github.com/getsentry/sentry-javascript/issues/2380
- else if ('detail' in e && 'reason' in e.detail) {
- error = e.detail.reason;
- }
- }
- catch (_oO) {
- // no-empty
- }
- var currentHub = getCurrentHub();
- var hasIntegration = currentHub.getIntegration(GlobalHandlers);
- var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
- if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {
- return true;
- }
- var client = currentHub.getClient();
- var event = isPrimitive(error)
- ? _this._eventFromIncompleteRejection(error)
- : eventFromUnknownInput(error, undefined, {
- attachStacktrace: client && client.getOptions().attachStacktrace,
- rejection: true,
- });
- event.level = exports.Severity.Error;
- addExceptionMechanism(event, {
- handled: false,
- type: 'onunhandledrejection',
- });
- currentHub.captureEvent(event, {
- originalException: error,
- });
- return;
- },
- type: 'unhandledrejection',
- });
- this._onUnhandledRejectionHandlerInstalled = true;
- };
- /**
- * This function creates a stack from an old, error-less onerror handler.
- */
- GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {
- var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
- // If 'message' is ErrorEvent, get real message from inside
- var message = isErrorEvent(msg) ? msg.message : msg;
- var name;
- if (isString(message)) {
- var groups = message.match(ERROR_TYPES_RE);
- if (groups) {
- name = groups[1];
- message = groups[2];
- }
- }
- var event = {
- exception: {
- values: [
- {
- type: name || 'Error',
- value: message,
- },
- ],
- },
- };
- return this._enhanceEventWithInitialFrame(event, url, line, column);
- };
- /**
- * This function creates an Event from an TraceKitStackTrace that has part of it missing.
- */
- GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {
- return {
- exception: {
- values: [
- {
- type: 'UnhandledRejection',
- value: "Non-Error promise rejection captured with value: " + error,
- },
- ],
- },
- };
- };
- /** JSDoc */
- GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {
- event.exception = event.exception || {};
- event.exception.values = event.exception.values || [];
- event.exception.values[0] = event.exception.values[0] || {};
- event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};
- event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];
- var colno = isNaN(parseInt(column, 10)) ? undefined : column;
- var lineno = isNaN(parseInt(line, 10)) ? undefined : line;
- var filename = isString(url) && url.length > 0 ? url : getLocationHref();
- if (event.exception.values[0].stacktrace.frames.length === 0) {
- event.exception.values[0].stacktrace.frames.push({
- colno: colno,
- filename: filename,
- function: '?',
- in_app: true,
- lineno: lineno,
- });
- }
- return event;
- };
- /**
- * @inheritDoc
- */
- GlobalHandlers.id = 'GlobalHandlers';
- return GlobalHandlers;
- }());
-
- /** 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] = 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(wrap(callback, {
- mechanism: {
- data: {
- function: 'requestAnimationFrame',
- handler: getFunctionName(original),
- },
- handled: true,
- type: 'instrument',
- },
- }));
- };
- };
- /** JSDoc */
- TryCatch.prototype._wrapEventTarget = function (target) {
- var global = getGlobalObject();
- var proto = global[target] && global[target].prototype;
- if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
- return;
- }
- 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 = 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, wrap(fn, {
- mechanism: {
- data: {
- function: 'addEventListener',
- handler: getFunctionName(fn),
- target: target,
- },
- handled: true,
- type: 'instrument',
- },
- }), options);
- };
- });
- 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);
- };
- });
- };
- /** JSDoc */
- TryCatch.prototype._wrapXHR = function (originalSend) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var xhr = this; // tslint:disable-line:no-this-assignment
- var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];
- xmlHttpRequestProps.forEach(function (prop) {
- if (prop in xhr && typeof xhr[prop] === 'function') {
- fill(xhr, prop, function (original) {
- var wrapOptions = {
- mechanism: {
- data: {
- function: prop,
- handler: getFunctionName(original),
- },
- handled: true,
- type: 'instrument',
- },
- };
- // If Instrument integration has been called before TryCatch, get the name of original function
- if (original.__sentry_original__) {
- wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);
- }
- // Otherwise wrap directly
- return wrap(original, wrapOptions);
- });
- }
- });
- return originalSend.apply(this, args);
- };
- };
- /**
- * Wrap timer functions and event targets to catch errors
- * and provide better metadata.
- */
- TryCatch.prototype.setupOnce = function () {
- this._ignoreOnError = this._ignoreOnError;
- var global = getGlobalObject();
- fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));
- fill(global, 'setInterval', this._wrapTimeFunction.bind(this));
- fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));
- if ('XMLHttpRequest' in global) {
- fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.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;
- }());
-
- /**
- * Default Breadcrumbs instrumentations
- * TODO: Deprecated - with v6, this will be renamed to `Instrument`
- */
- var Breadcrumbs = /** @class */ (function () {
- /**
- * @inheritDoc
- */
- function Breadcrumbs(options) {
- /**
- * @inheritDoc
- */
- this.name = Breadcrumbs.id;
- this._options = __assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);
- }
- /**
- * Creates breadcrumbs from console API calls
- */
- Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {
- var breadcrumb = {
- category: 'console',
- data: {
- arguments: handlerData.args,
- logger: 'console',
- },
- level: exports.Severity.fromString(handlerData.level),
- message: safeJoin(handlerData.args, ' '),
- };
- if (handlerData.level === 'assert') {
- if (handlerData.args[0] === false) {
- breadcrumb.message = "Assertion failed: " + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');
- breadcrumb.data.arguments = handlerData.args.slice(1);
- }
- else {
- // Don't capture a breadcrumb for passed assertions
- return;
- }
- }
- getCurrentHub().addBreadcrumb(breadcrumb, {
- input: handlerData.args,
- level: handlerData.level,
- });
- };
- /**
- * Creates breadcrumbs from DOM API calls
- */
- Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {
- var target;
- // Accessing event.target can throw (see getsentry/raven-js#838, #768)
- try {
- target = handlerData.event.target
- ? htmlTreeAsString(handlerData.event.target)
- : htmlTreeAsString(handlerData.event);
- }
- catch (e) {
- target = '';
- }
- if (target.length === 0) {
- return;
- }
- getCurrentHub().addBreadcrumb({
- category: "ui." + handlerData.name,
- message: target,
- }, {
- event: handlerData.event,
- name: handlerData.name,
- });
- };
- /**
- * Creates breadcrumbs from XHR API calls
- */
- Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {
- if (handlerData.endTimestamp) {
- // We only capture complete, non-sentry requests
- if (handlerData.xhr.__sentry_own_request__) {
- return;
- }
- getCurrentHub().addBreadcrumb({
- category: 'xhr',
- data: handlerData.xhr.__sentry_xhr__,
- type: 'http',
- }, {
- xhr: handlerData.xhr,
- });
- return;
- }
- // We only capture issued sentry requests
- if (this._options.sentry && handlerData.xhr.__sentry_own_request__) {
- addSentryBreadcrumb(handlerData.args[0]);
- }
- };
- /**
- * Creates breadcrumbs from fetch API calls
- */
- Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {
- // We only capture complete fetch requests
- if (!handlerData.endTimestamp) {
- return;
- }
- var client = getCurrentHub().getClient();
- var dsn = client && client.getDsn();
- if (this._options.sentry && dsn) {
- var filterUrl = new API(dsn).getStoreEndpoint();
- // if Sentry key appears in URL, don't capture it as a request
- // but rather as our own 'sentry' type breadcrumb
- if (filterUrl &&
- handlerData.fetchData.url.indexOf(filterUrl) !== -1 &&
- handlerData.fetchData.method === 'POST' &&
- handlerData.args[1] &&
- handlerData.args[1].body) {
- addSentryBreadcrumb(handlerData.args[1].body);
- return;
- }
- }
- if (handlerData.error) {
- getCurrentHub().addBreadcrumb({
- category: 'fetch',
- data: __assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),
- level: exports.Severity.Error,
- type: 'http',
- }, {
- data: handlerData.error,
- input: handlerData.args,
- });
- }
- else {
- getCurrentHub().addBreadcrumb({
- category: 'fetch',
- data: __assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),
- type: 'http',
- }, {
- input: handlerData.args,
- response: handlerData.response,
- });
- }
- };
- /**
- * Creates breadcrumbs from history API calls
- */
- Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {
- var global = getGlobalObject();
- var from = handlerData.from;
- var to = handlerData.to;
- var parsedLoc = parseUrl(global.location.href);
- var parsedFrom = parseUrl(from);
- var parsedTo = parseUrl(to);
- // Initial pushState doesn't provide `from` information
- if (!parsedFrom.path) {
- parsedFrom = parsedLoc;
- }
- // Use only the path component of the URL if the URL matches the current
- // document (almost all the time when using pushState)
- if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {
- // tslint:disable-next-line:no-parameter-reassignment
- to = parsedTo.relative;
- }
- if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {
- // tslint:disable-next-line:no-parameter-reassignment
- from = parsedFrom.relative;
- }
- getCurrentHub().addBreadcrumb({
- category: 'navigation',
- data: {
- from: from,
- to: to,
- },
- });
- };
- /**
- * Instrument browser built-ins w/ breadcrumb capturing
- * - Console API
- * - DOM API (click/typing)
- * - XMLHttpRequest API
- * - Fetch API
- * - History API
- */
- Breadcrumbs.prototype.setupOnce = function () {
- var _this = this;
- if (this._options.console) {
- addInstrumentationHandler({
- callback: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- _this._consoleBreadcrumb.apply(_this, __spread(args));
- },
- type: 'console',
- });
- }
- if (this._options.dom) {
- addInstrumentationHandler({
- callback: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- _this._domBreadcrumb.apply(_this, __spread(args));
- },
- type: 'dom',
- });
- }
- if (this._options.xhr) {
- addInstrumentationHandler({
- callback: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- _this._xhrBreadcrumb.apply(_this, __spread(args));
- },
- type: 'xhr',
- });
- }
- if (this._options.fetch) {
- addInstrumentationHandler({
- callback: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- _this._fetchBreadcrumb.apply(_this, __spread(args));
- },
- type: 'fetch',
- });
- }
- if (this._options.history) {
- addInstrumentationHandler({
- callback: function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- _this._historyBreadcrumb.apply(_this, __spread(args));
- },
- type: 'history',
- });
- }
- };
- /**
- * @inheritDoc
- */
- Breadcrumbs.id = 'Breadcrumbs';
- return Breadcrumbs;
- }());
- /**
- * Create a breadcrumb of `sentry` from the events themselves
- */
- function addSentryBreadcrumb(serializedData) {
- // There's always something that can go wrong with deserialization...
- try {
- var event_1 = JSON.parse(serializedData);
- getCurrentHub().addBreadcrumb({
- category: "sentry." + (event_1.type === 'transaction' ? 'transaction' : 'event'),
- event_id: event_1.event_id,
- level: event_1.level || exports.Severity.fromString('error'),
- message: getEventDescription(event_1),
- }, {
- event: event_1,
- });
- }
- catch (_oO) {
- logger.error('Error while adding sentry type breadcrumb');
- }
- }
-
- var DEFAULT_KEY = 'cause';
- var DEFAULT_LIMIT = 5;
- /** Adds SDK info to an event. */
- var LinkedErrors = /** @class */ (function () {
- /**
- * @inheritDoc
- */
- function LinkedErrors(options) {
- if (options === void 0) { options = {}; }
- /**
- * @inheritDoc
- */
- this.name = LinkedErrors.id;
- this._key = options.key || DEFAULT_KEY;
- this._limit = options.limit || DEFAULT_LIMIT;
- }
- /**
- * @inheritDoc
- */
- LinkedErrors.prototype.setupOnce = function () {
- addGlobalEventProcessor(function (event, hint) {
- var self = getCurrentHub().getIntegration(LinkedErrors);
- if (self) {
- return self._handler(event, hint);
- }
- return event;
- });
- };
- /**
- * @inheritDoc
- */
- LinkedErrors.prototype._handler = function (event, hint) {
- if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {
- return event;
- }
- var linkedErrors = this._walkErrorTree(hint.originalException, this._key);
- event.exception.values = __spread(linkedErrors, event.exception.values);
- return event;
- };
- /**
- * @inheritDoc
- */
- LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {
- if (stack === void 0) { stack = []; }
- if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {
- return stack;
- }
- var stacktrace = computeStackTrace(error[key]);
- var exception = exceptionFromStacktrace(stacktrace);
- return this._walkErrorTree(error[key], key, __spread([exception], stack));
- };
- /**
- * @inheritDoc
- */
- LinkedErrors.id = 'LinkedErrors';
- return LinkedErrors;
- }());
-
- var global$4 = getGlobalObject();
- /** UserAgent */
- var UserAgent = /** @class */ (function () {
- function UserAgent() {
- /**
- * @inheritDoc
- */
- this.name = UserAgent.id;
- }
- /**
- * @inheritDoc
- */
- UserAgent.prototype.setupOnce = function () {
- addGlobalEventProcessor(function (event) {
- if (getCurrentHub().getIntegration(UserAgent)) {
- if (!global$4.navigator || !global$4.location) {
- return event;
- }
- // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/
- var request = event.request || {};
- request.url = request.url || global$4.location.href;
- request.headers = request.headers || {};
- request.headers['User-Agent'] = global$4.navigator.userAgent;
- return __assign({}, event, { request: request });
- }
- return event;
- });
- };
- /**
- * @inheritDoc
- */
- UserAgent.id = 'UserAgent';
- return UserAgent;
- }());
-
-
-
- var BrowserIntegrations = /*#__PURE__*/Object.freeze({
- GlobalHandlers: GlobalHandlers,
- TryCatch: TryCatch,
- Breadcrumbs: Breadcrumbs,
- LinkedErrors: LinkedErrors,
- UserAgent: UserAgent
- });
-
- var defaultIntegrations = [
- new InboundFilters(),
- new FunctionToString(),
- new TryCatch(),
- new Breadcrumbs(),
- new GlobalHandlers(),
- new LinkedErrors(),
- new UserAgent(),
- ];
- /**
- * The Sentry Browser SDK Client.
- *
- * To use this SDK, call the {@link init} function as early as possible when
- * loading the web page. To set context information or send manual events, use
- * the provided methods.
- *
- * @example
- *
- * ```
- *
- * import { init } from '@sentry/browser';
- *
- * init({
- * dsn: '__DSN__',
- * // ...
- * });
- * ```
- *
- * @example
- * ```
- *
- * import { configureScope } from '@sentry/browser';
- * configureScope((scope: Scope) => {
- * scope.setExtra({ battery: 0.7 });
- * scope.setTag({ user_mode: 'admin' });
- * scope.setUser({ id: '4711' });
- * });
- * ```
- *
- * @example
- * ```
- *
- * import { addBreadcrumb } from '@sentry/browser';
- * addBreadcrumb({
- * message: 'My Breadcrumb',
- * // ...
- * });
- * ```
- *
- * @example
- *
- * ```
- *
- * import * as Sentry from '@sentry/browser';
- * Sentry.captureMessage('Hello, world!');
- * Sentry.captureException(new Error('Good bye'));
- * Sentry.captureEvent({
- * message: 'Manual',
- * stacktrace: [
- * // ...
- * ],
- * });
- * ```
- *
- * @see {@link BrowserOptions} for documentation on configuration options.
- */
- function init(options) {
- if (options === void 0) { options = {}; }
- if (options.defaultIntegrations === undefined) {
- options.defaultIntegrations = defaultIntegrations;
- }
- if (options.release === undefined) {
- var window_1 = getGlobalObject();
- // This supports the variable that sentry-webpack-plugin injects
- if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {
- options.release = window_1.SENTRY_RELEASE.id;
- }
- }
- initAndBind(BrowserClient, options);
- }
- /**
- * Present the user with a report dialog.
- *
- * @param options Everything is optional, we try to fetch all info need from the global scope.
- */
- function showReportDialog(options) {
- if (options === void 0) { options = {}; }
- if (!options.eventId) {
- options.eventId = getCurrentHub().lastEventId();
- }
- var client = getCurrentHub().getClient();
- if (client) {
- client.showReportDialog(options);
- }
- }
- /**
- * This is the getter for lastEventId.
- *
- * @returns The last event id of a captured event.
- */
- function lastEventId() {
- return getCurrentHub().lastEventId();
- }
- /**
- * This function is here to be API compatible with the loader.
- * @hidden
- */
- function forceLoad() {
- // Noop
- }
- /**
- * This function is here to be API compatible with the loader.
- * @hidden
- */
- function onLoad(callback) {
- callback();
- }
- /**
- * A promise that resolves when all current events have been sent.
- * If you provide a timeout and the queue takes longer to drain the promise returns false.
- *
- * @param timeout Maximum time in ms the client should wait.
- */
- function flush(timeout) {
- var client = getCurrentHub().getClient();
- if (client) {
- return client.flush(timeout);
- }
- return SyncPromise.reject(false);
- }
- /**
- * A promise that resolves when all current events have been sent.
- * If you provide a timeout and the queue takes longer to drain the promise returns false.
- *
- * @param timeout Maximum time in ms the client should wait.
- */
- function close(timeout) {
- var client = getCurrentHub().getClient();
- if (client) {
- return client.close(timeout);
- }
- return SyncPromise.reject(false);
- }
- /**
- * Wrap code within a try/catch block so the SDK is able to capture errors.
- *
- * @param fn A function to wrap.
- *
- * @returns The result of wrapped function call.
- */
- function wrap$1(fn) {
- return wrap(fn)(); // tslint:disable-line:no-unsafe-any
- }
-
- var windowIntegrations = {};
- // This block is needed to add compatibility with the integrations packages when used with a CDN
- // tslint:disable: no-unsafe-any
- var _window = getGlobalObject();
- if (_window.Sentry && _window.Sentry.Integrations) {
- windowIntegrations = _window.Sentry.Integrations;
- }
- // tslint:enable: no-unsafe-any
- var INTEGRATIONS = __assign({}, windowIntegrations, CoreIntegrations, BrowserIntegrations);
-
- exports.BrowserClient = BrowserClient;
- exports.Hub = Hub;
- exports.Integrations = INTEGRATIONS;
- exports.SDK_NAME = SDK_NAME;
- exports.SDK_VERSION = SDK_VERSION;
- exports.Scope = Scope;
- exports.Transports = index;
- exports.addBreadcrumb = addBreadcrumb;
- exports.addGlobalEventProcessor = addGlobalEventProcessor;
- exports.captureEvent = captureEvent;
- exports.captureException = captureException;
- exports.captureMessage = captureMessage;
- exports.close = close;
- exports.configureScope = configureScope;
- exports.defaultIntegrations = defaultIntegrations;
- exports.flush = flush;
- exports.forceLoad = forceLoad;
- exports.getCurrentHub = getCurrentHub;
- exports.getHubFromCarrier = getHubFromCarrier;
- exports.init = init;
- exports.lastEventId = lastEventId;
- exports.onLoad = onLoad;
- exports.setContext = setContext;
- exports.setExtra = setExtra;
- exports.setExtras = setExtras;
- exports.setTag = setTag;
- exports.setTags = setTags;
- exports.setUser = setUser;
- exports.showReportDialog = showReportDialog;
- exports.withScope = withScope;
- exports.wrap = wrap$1;
-
- return exports;
-
-}({}));
-//# sourceMappingURL=bundle.js.map