db-vendo-client/lib/errors.js
Kristjan ESPERANTO 66d9fb5194
apply linting rules
follow-up of 228c7253
2024-02-10 16:50:12 +01:00

302 lines
6 KiB
JavaScript

const ACCESS_DENIED = 'ACCESS_DENIED';
const INVALID_REQUEST = 'INVALID_REQUEST';
const NOT_FOUND = 'NOT_FOUND';
const SERVER_ERROR = 'SERVER_ERROR';
class HafasError extends Error {
constructor (cleanMessage, hafasCode, props) {
const msg = hafasCode
? hafasCode + ': ' + cleanMessage
: cleanMessage;
super(msg);
// generic props
this.isHafasError = true;
// error-specific props
this.code = null;
// By default, we take the blame, unless we know for sure.
this.isCausedByServer = false;
this.hafasCode = hafasCode;
Object.assign(this, props);
return this;
}
}
class HafasAccessDeniedError extends HafasError {
constructor (cleanMessage, hafasCode, props) {
super(cleanMessage, hafasCode, props);
this.code = ACCESS_DENIED;
return this;
}
}
class HafasInvalidRequestError extends HafasError {
constructor (cleanMessage, hafasCode, props) {
super(cleanMessage, hafasCode, props);
this.code = INVALID_REQUEST;
return this;
}
}
class HafasNotFoundError extends HafasError {
constructor (cleanMessage, hafasCode, props) {
super(cleanMessage, hafasCode, props);
this.code = NOT_FOUND;
return this;
}
}
class HafasServerError extends HafasError {
constructor (cleanMessage, hafasCode, props) {
super(cleanMessage, hafasCode, props);
this.code = SERVER_ERROR;
this.isCausedByServer = true;
return this;
}
}
const byErrorCode = Object.assign(Object.create(null), {
H_UNKNOWN: {
Error: HafasError,
message: 'unknown internal error',
props: {
shouldRetry: true,
},
},
AUTH: {
Error: HafasAccessDeniedError,
message: 'invalid or missing authentication data',
props: {
},
},
METHOD_NA: {
Error: HafasServerError,
message: 'method is not enabled',
props: {
},
},
R0001: {
Error: HafasInvalidRequestError,
message: 'unknown method',
props: {
},
},
R0002: {
Error: HafasInvalidRequestError,
message: 'invalid or missing request parameters',
props: {
},
},
R0007: {
Error: HafasServerError,
message: 'internal communication error',
props: {
shouldRetry: true,
},
},
R5000: {
Error: HafasAccessDeniedError,
message: 'access denied',
props: {
},
},
S1: {
Error: HafasServerError,
message: 'journeys search: a connection to the backend server couldn\'t be established',
props: {
shouldRetry: true,
},
},
PROBLEMS: {
Error: HafasServerError,
message: 'an unknown problem occured during search',
props: {
shouldRetry: true,
},
},
LOCATION: {
Error: HafasNotFoundError,
message: 'location/stop not found',
props: {
},
},
NO_MATCH: {
Error: HafasNotFoundError,
message: 'no results found',
props: {
},
},
PARAMETER: {
Error: HafasInvalidRequestError,
message: 'invalid parameter',
props: {
},
},
H390: {
Error: HafasInvalidRequestError,
message: 'journeys search: departure/arrival station replaced',
props: {
},
},
H410: {
// todo: or is it a client error?
Error: HafasServerError,
message: 'journeys search: incomplete response due to timetable change',
props: {
},
},
H455: {
Error: HafasInvalidRequestError,
message: 'journeys search: prolonged stop',
props: {
},
},
H460: {
Error: HafasInvalidRequestError,
message: 'journeys search: stop(s) passed multiple times',
props: {
},
},
H500: {
Error: HafasInvalidRequestError,
message: 'journeys search: too many trains, connection is not complete',
props: {
},
},
H890: {
Error: HafasNotFoundError,
message: 'journeys search unsuccessful',
props: {
shouldRetry: true,
},
},
H891: {
Error: HafasNotFoundError,
message: 'journeys search: no route found, try with an intermediate stations',
props: {
},
},
H892: {
Error: HafasInvalidRequestError,
message: 'journeys search: query too complex, try less intermediate stations',
props: {
},
},
H895: {
Error: HafasInvalidRequestError,
message: 'journeys search: departure & arrival are too near',
props: {
},
},
H899: {
// todo: or is it a client error?
Error: HafasServerError,
message: 'journeys search unsuccessful or incomplete due to timetable change',
props: {
},
},
H900: {
// todo: or is it a client error?
Error: HafasServerError,
message: 'journeys search unsuccessful or incomplete due to timetable change',
props: {
},
},
H9220: {
Error: HafasNotFoundError,
message: 'journeys search: no stations found close to the address',
props: {
},
},
H9230: {
Error: HafasServerError,
message: 'journeys search: an internal error occured',
props: {
shouldRetry: true,
},
},
H9240: {
Error: HafasNotFoundError,
message: 'journeys search unsuccessful',
props: {
shouldRetry: true,
},
},
H9250: {
Error: HafasServerError,
message: 'journeys search: leg query interrupted',
props: {
shouldRetry: true,
},
},
H9260: {
Error: HafasInvalidRequestError,
message: 'journeys search: unknown departure station',
props: {
},
},
H9280: {
Error: HafasInvalidRequestError,
message: 'journeys search: unknown intermediate station',
props: {
},
},
H9300: {
Error: HafasInvalidRequestError,
message: 'journeys search: unknown arrival station',
props: {
},
},
H9320: {
Error: HafasInvalidRequestError,
message: 'journeys search: the input is incorrect or incomplete',
props: {
},
},
H9360: {
Error: HafasInvalidRequestError,
message: 'journeys search: invalid date/time',
props: {
},
},
H9380: {
Error: HafasInvalidRequestError,
message: 'journeys search: departure/arrival/intermediate station defined more than once',
props: {
},
},
SQ001: {
Error: HafasServerError,
message: 'no departures/arrivals data available',
props: {
},
},
SQ005: {
Error: HafasNotFoundError,
message: 'no trips found',
props: {
},
},
TI001: {
Error: HafasServerError,
message: 'no trip info available',
props: {
shouldRetry: true,
},
},
});
export {
ACCESS_DENIED,
INVALID_REQUEST,
NOT_FOUND,
SERVER_ERROR,
HafasError,
HafasAccessDeniedError,
HafasInvalidRequestError,
HafasNotFoundError,
HafasServerError,
byErrorCode,
};