bugsplat
Version:
error reporting for js
101 lines • 3.71 kB
JavaScript
import { validateResponseBody, } from './bugsplat-response';
import { isFormDataParamString } from './form-data-param';
export function createStandardizedCallStack(error) {
if (!error.stack?.includes('Error:')) {
return `Error: ${error.message}\n${error.stack}`;
}
return error.stack;
}
export async function tryParseResponseJson(response) {
let parsed;
try {
parsed = await response.json();
}
catch (_) {
parsed = {};
}
return parsed;
}
const isError = (val) => Boolean(val?.stack);
export class BugSplat {
database;
application;
version;
_formData = () => new FormData();
_appKey = '';
_description = '';
_email = '';
_user = '';
constructor(database, application, version) {
this.database = database;
this.application = application;
this.version = version;
}
async post(errorToPost, options) {
options = options || {};
const appKey = options.appKey || this._appKey;
const user = options.user || this._user;
const email = options.email || this._email;
const description = options.description || this._description;
const additionalFormDataParams = options.additionalFormDataParams || [];
const callstack = createStandardizedCallStack(isError(errorToPost) ? errorToPost : new Error(errorToPost));
const url = 'https://' + this.database + '.bugsplat.com/post/js/';
const method = 'POST';
const body = this._formData();
body.append('database', this.database);
body.append('appName', this.application);
body.append('appVersion', this.version);
body.append('appKey', appKey);
body.append('user', user);
body.append('email', email);
body.append('description', description);
body.append('callstack', callstack);
additionalFormDataParams.forEach((param) => {
if (isFormDataParamString(param)) {
body.append(param.key, param.value);
}
else {
body.append(param.key, param.value, param.filename);
}
});
console.log('BugSplat Error:', errorToPost);
console.log('BugSplat Url:', url);
const response = await globalThis.fetch(url, { method, body });
const json = await tryParseResponseJson(response);
console.log('BugSplat POST status code:', response.status);
console.log('BugSplat POST response body:', json);
if (response.status === 400) {
return this._createReturnValue(new Error('BugSplat Error: Bad request'), json, errorToPost);
}
if (response.status === 429) {
return this._createReturnValue(new Error('BugSplat Error: Rate limit of one crash per second exceeded'), json, errorToPost);
}
if (!response.ok) {
return this._createReturnValue(new Error('BugSplat Error: Unknown error'), json, errorToPost);
}
if (!validateResponseBody(json)) {
return this._createReturnValue(new Error('BugSplat Error: Invalid response received'), json, errorToPost);
}
return this._createReturnValue(null, json, errorToPost);
}
setDefaultAppKey(appKey) {
this._appKey = appKey;
}
setDefaultDescription(description) {
this._description = description;
}
setDefaultEmail(email) {
this._email = email;
}
setDefaultUser(user) {
this._user = user;
}
_createReturnValue(error, response, original) {
return {
error,
response,
original,
};
}
}
//# sourceMappingURL=bugsplat.js.map