Query read timeouts happen when a remote server is not available. It breaks: - the remote server show page - the record table page of imported remote tables This PR will catch the exception so it does not go to Sentry in both cases. Also did 2 renaming.
168 lines
4.5 KiB
TypeScript
168 lines
4.5 KiB
TypeScript
import {
|
|
ASTNode,
|
|
GraphQLError,
|
|
GraphQLFormattedError,
|
|
Source,
|
|
SourceLocation,
|
|
} from 'graphql';
|
|
|
|
declare module 'graphql' {
|
|
export interface GraphQLErrorExtensions {
|
|
exception?: {
|
|
code?: string;
|
|
stacktrace?: ReadonlyArray<string>;
|
|
};
|
|
}
|
|
}
|
|
|
|
export class BaseGraphQLError extends Error implements GraphQLError {
|
|
public extensions: Record<string, any>;
|
|
override readonly name!: string;
|
|
readonly locations: ReadonlyArray<SourceLocation> | undefined;
|
|
readonly path: ReadonlyArray<string | number> | undefined;
|
|
readonly source: Source | undefined;
|
|
readonly positions: ReadonlyArray<number> | undefined;
|
|
readonly nodes: ReadonlyArray<ASTNode> | undefined;
|
|
public originalError: Error | undefined;
|
|
|
|
[key: string]: any;
|
|
|
|
constructor(
|
|
message: string,
|
|
code?: string,
|
|
extensions?: Record<string, any>,
|
|
) {
|
|
super(message);
|
|
|
|
// if no name provided, use the default. defineProperty ensures that it stays non-enumerable
|
|
if (!this.name) {
|
|
Object.defineProperty(this, 'name', { value: 'ApolloError' });
|
|
}
|
|
|
|
if (extensions?.extensions) {
|
|
throw Error(
|
|
'Pass extensions directly as the third argument of the ApolloError constructor: `new ' +
|
|
'ApolloError(message, code, {myExt: value})`, not `new ApolloError(message, code, ' +
|
|
'{extensions: {myExt: value}})`',
|
|
);
|
|
}
|
|
|
|
this.extensions = { ...extensions, code };
|
|
}
|
|
|
|
toJSON(): GraphQLFormattedError {
|
|
return toGraphQLError(this).toJSON();
|
|
}
|
|
|
|
override toString(): string {
|
|
return toGraphQLError(this).toString();
|
|
}
|
|
|
|
get [Symbol.toStringTag](): string {
|
|
return this.name;
|
|
}
|
|
}
|
|
|
|
function toGraphQLError(error: BaseGraphQLError): GraphQLError {
|
|
return new GraphQLError(error.message, {
|
|
nodes: error.nodes,
|
|
source: error.source,
|
|
positions: error.positions,
|
|
path: error.path,
|
|
originalError: error.originalError,
|
|
extensions: error.extensions,
|
|
});
|
|
}
|
|
|
|
export class SyntaxError extends BaseGraphQLError {
|
|
constructor(message: string) {
|
|
super(message, 'GRAPHQL_PARSE_FAILED');
|
|
|
|
Object.defineProperty(this, 'name', { value: 'SyntaxError' });
|
|
}
|
|
}
|
|
|
|
export class ValidationError extends BaseGraphQLError {
|
|
constructor(message: string) {
|
|
super(message, 'GRAPHQL_VALIDATION_FAILED');
|
|
|
|
Object.defineProperty(this, 'name', { value: 'ValidationError' });
|
|
}
|
|
}
|
|
|
|
export class AuthenticationError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'UNAUTHENTICATED', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'AuthenticationError' });
|
|
}
|
|
}
|
|
|
|
export class ForbiddenError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'FORBIDDEN', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'ForbiddenError' });
|
|
}
|
|
}
|
|
|
|
export class PersistedQueryNotFoundError extends BaseGraphQLError {
|
|
constructor() {
|
|
super('PersistedQueryNotFound', 'PERSISTED_QUERY_NOT_FOUND');
|
|
|
|
Object.defineProperty(this, 'name', {
|
|
value: 'PersistedQueryNotFoundError',
|
|
});
|
|
}
|
|
}
|
|
|
|
export class PersistedQueryNotSupportedError extends BaseGraphQLError {
|
|
constructor() {
|
|
super('PersistedQueryNotSupported', 'PERSISTED_QUERY_NOT_SUPPORTED');
|
|
|
|
Object.defineProperty(this, 'name', {
|
|
value: 'PersistedQueryNotSupportedError',
|
|
});
|
|
}
|
|
}
|
|
|
|
export class UserInputError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'BAD_USER_INPUT', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'UserInputError' });
|
|
}
|
|
}
|
|
|
|
export class NotFoundError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'NOT_FOUND', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'NotFoundError' });
|
|
}
|
|
}
|
|
|
|
export class MethodNotAllowedError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'METHOD_NOT_ALLOWED', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'MethodNotAllowedError' });
|
|
}
|
|
}
|
|
|
|
export class ConflictError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'CONFLICT', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'ConflictError' });
|
|
}
|
|
}
|
|
|
|
export class TimeoutError extends BaseGraphQLError {
|
|
constructor(message: string, extensions?: Record<string, any>) {
|
|
super(message, 'TIMEOUT', extensions);
|
|
|
|
Object.defineProperty(this, 'name', { value: 'TimeoutError' });
|
|
}
|
|
}
|