sussudio
Version:
An unofficial VS Code Internal API
53 lines (52 loc) • 2.02 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ErrorNoTelemetry } from "../../../base/common/errors.mjs";
import { toDisposable } from "../../../base/common/lifecycle.mjs";
import { globals } from "../../../base/common/platform.mjs";
import BaseErrorTelemetry from "../common/errorTelemetry.mjs";
export default class ErrorTelemetry extends BaseErrorTelemetry {
installErrorListeners() {
let oldOnError;
const that = this;
if (typeof globals.onerror === 'function') {
oldOnError = globals.onerror;
}
globals.onerror = function (message, filename, line, column, e) {
that._onUncaughtError(message, filename, line, column, e);
oldOnError?.apply(this, arguments);
};
this._disposables.add(toDisposable(() => {
if (oldOnError) {
globals.onerror = oldOnError;
}
}));
}
_onUncaughtError(msg, file, line, column, err) {
const data = {
callstack: msg,
msg,
file,
line,
column
};
if (err) {
// If it's the no telemetry error it doesn't get logged
if (ErrorNoTelemetry.isErrorNoTelemetry(err)) {
return;
}
const { name, message, stack } = err;
data.uncaught_error_name = name;
if (message) {
data.uncaught_error_msg = message;
}
if (stack) {
data.callstack = Array.isArray(err.stack)
? err.stack = err.stack.join('\n')
: err.stack;
}
}
this._enqueue(data);
}
}