Move metrics / tracking / error analysis to flipper-common package
Summary: what else can I say move_complexity Reviewed By: passy Differential Revision: D31483414 fbshipit-source-id: 1692c792121a3aae0843eb238040cae0445cdf54
This commit is contained in:
committed by
Facebook GitHub Bot
parent
51bfc8f05d
commit
3e7a6b1b4b
105
desktop/flipper-common/src/utils/errors.tsx
Normal file
105
desktop/flipper-common/src/utils/errors.tsx
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
export function isAuthError(
|
||||
err: any,
|
||||
): err is UserNotSignedInError | UserUnauthorizedError {
|
||||
return (
|
||||
err instanceof UserNotSignedInError || err instanceof UserUnauthorizedError
|
||||
);
|
||||
}
|
||||
|
||||
export function isConnectivityOrAuthError(
|
||||
err: any,
|
||||
): err is ConnectivityError | UserNotSignedInError | UserUnauthorizedError {
|
||||
return (
|
||||
err instanceof ConnectivityError ||
|
||||
isAuthError(err) ||
|
||||
String(err).startsWith('Failed to fetch')
|
||||
);
|
||||
}
|
||||
|
||||
export class CancelledPromiseError extends Error {
|
||||
constructor(msg: string) {
|
||||
super(msg);
|
||||
this.name = 'CancelledPromiseError';
|
||||
}
|
||||
name: 'CancelledPromiseError';
|
||||
}
|
||||
|
||||
export class ConnectivityError extends Error {
|
||||
constructor(msg: string) {
|
||||
super(msg);
|
||||
this.name = 'ConnectivityError';
|
||||
}
|
||||
name: 'ConnectivityError';
|
||||
}
|
||||
|
||||
export class UserUnauthorizedError extends Error {
|
||||
constructor(msg: string = 'User unauthorized.') {
|
||||
super(msg);
|
||||
this.name = 'UserUnauthorizedError';
|
||||
}
|
||||
name: 'UserUnauthorizedError';
|
||||
}
|
||||
|
||||
export class UserNotSignedInError extends Error {
|
||||
constructor(msg: string = 'User not signed in.') {
|
||||
super(msg);
|
||||
this.name = 'UserNotSignedInError';
|
||||
}
|
||||
name: 'UserNotSignedInError';
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Error {
|
||||
interaction?: unknown;
|
||||
}
|
||||
}
|
||||
|
||||
export function isError(obj: any): obj is Error {
|
||||
return (
|
||||
obj instanceof Error ||
|
||||
(obj &&
|
||||
obj.name &&
|
||||
typeof obj.name === 'string' &&
|
||||
obj.message &&
|
||||
typeof obj.message === 'string' &&
|
||||
obj.stack &&
|
||||
typeof obj.stack === 'string')
|
||||
);
|
||||
}
|
||||
|
||||
export function getErrorFromErrorLike(e: any): Error | undefined {
|
||||
if (Array.isArray(e)) {
|
||||
return e.map(getErrorFromErrorLike).find((x) => x);
|
||||
} else if (isError(e)) {
|
||||
return e;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export function getStringFromErrorLike(e: any): string {
|
||||
if (Array.isArray(e)) {
|
||||
return e.map(getStringFromErrorLike).join(' ');
|
||||
} else if (typeof e == 'string') {
|
||||
return e;
|
||||
} else if (isError(e)) {
|
||||
return e.message || e.toString();
|
||||
} else {
|
||||
try {
|
||||
return JSON.stringify(e);
|
||||
} catch (e) {
|
||||
// Stringify might fail on arbitrary structures
|
||||
// Last resort: toString it.
|
||||
return '' + e;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user