core-native
Version:
A lightweight framework based on React Native + Redux + Redux Saga, in strict TypeScript.
63 lines • 1.97 kB
JavaScript
import { Exception, JavaScriptException } from "../Exception";
import { app } from "../app";
import { spawn } from "../typed-saga";
import { sendEventLogs } from "../platform/bootstrap";
let errorHandlerRunning = false;
export function errorToException(error) {
if (error instanceof Exception) {
return error;
}
else {
let message;
if (!error) {
message = "[No Message]";
}
else if (typeof error === "string") {
message = error;
}
else if (error instanceof Error) {
message = error.message;
}
else {
try {
message = JSON.stringify(error);
}
catch (e) {
message = "[Unknown]";
}
}
return new JavaScriptException(message, error);
}
}
export function captureError(error, action, extra = {}) {
if (process.env.NODE_ENV === "development") {
console.error(`[framework] Error captured from [${action}]`, error);
}
const exception = errorToException(error);
const errorStacktrace = error instanceof Error ? error.stack : undefined;
const info = {
payload: extra.actionPayload,
extra_stacktrace: extra.extraStacktrace,
stacktrace: errorStacktrace,
};
app.logger.exception(exception, info, action);
app.sagaMiddleware.run(runUserErrorHandler, app.errorHandler, exception);
return exception;
}
export function* runUserErrorHandler(handler, exception) {
// For app, report errors to event server ASAP, in case of sudden termination
yield spawn(sendEventLogs);
if (errorHandlerRunning)
return;
try {
errorHandlerRunning = true;
yield* handler(exception);
}
catch (e) {
console.warn("[framework] Fail to execute error handler", e);
}
finally {
errorHandlerRunning = false;
}
}
//# sourceMappingURL=error-util.js.map