UNPKG

oracle-nosqldb

Version:

Node.js driver for Oracle NoSQL Database

258 lines (243 loc) 11.7 kB
/*- * Copyright (c) 2018, 2025 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Universal Permissive License v 1.0 as shown at * https://oss.oracle.com/licenses/upl/ */ import type { ErrorCode } from "./error_code"; import type { Operation } from "./param"; import type { Config } from "./config"; /** * This is the base class for all errors returned by the driver. * {@link NoSQLError} extends JavaScript Error class and all other errors used * by the driver extend {@link NoSQLError}. Note that you don't create these * error objects explicitly, but the driver returns errors in the following * ways: * <ul> * <li>For synchronous APIs the error is thrown as an exception</li> * <li>For asynchronous APIs, which is most of the APIs in {@link NoSQLClient} * class, the error is the result of the rejection of Promise returned by * the API. In async function, you can use <em>try...catch</em> to handle * these errors as if they were exceptions. * </ul> * <p> * Each error contains {@link ErrorCode} which can be used in the application * logic to take different actions upon different kinds of errors. In * addition, an error may have an optional {@link cause}, which is another * error that caused this error. The {@link cause} is typically also * instance of {@link NoSQLError} or its subclass, but sometimes may not be. * E.g. if an authorization error is caused by invalid JSON response, the * {@link cause} would be instance of {@link !SyntaxError | SyntaxError}. * <p> * In addition, each error has an optional operation object which describes * the operation that caused the error, including the API and its arguments, * see {@link Operation}. Not all errors have operation available. * <p> * Most errors returned from the server result in {@link NoSQLError}, but for * other cases specialized subclasses are used such as * {@link NoSQLArgumentError}, {@link NoSQLServiceError}, * {@link NoSQLNetworkError}, {@link NoSQLAuthorizationError} and others. * * @see {@page tables.md} */ export class NoSQLError extends Error { /** * @hidden */ protected constructor(); /** * {@link ErrorCode} of this error. * @readonly */ readonly errorCode: ErrorCode; /** * An error that caused this error. In many cases it is also instance of * {@link NoSQLError} and may itself have a cause. You could iterate * through the chain of causes like this: * <p> * <em>for(let cause = err.cause; cause; cause = cause.cause) \{...</em> * <p> * If this error does not have a cause, the value of this property is * <em>undefined</em>. * @readonly */ readonly cause?: Error; /** * Indicates whether this error is retryable. * <p> * APIs that result in retryable errors are automatically retried by the * driver's default {@link RetryHandler}. Default retry handler can be * customized by properties in {@link RetryConfig}. Alternatively, a * custom {@link RetryHandler} can be set as {@link RetryConfig#handler}. * <p> * If necessary, APIs that result in retryable errors may also be * explicitly retried by the application. * @see {@link RetryConfig} * @readonly */ readonly retryable?: boolean; /** * Operation that resulted in this error. * {@link Operation} object contains the API and its arguments including * the options used. Operation object may not always be available, in * which case the value of this property is <em>undefined</em>. * <p> * If this error happened during creation of new {@link NoSQLClient} then * instead of {@link Operation} this property contains {@link Config} * used to create {@link NoSQLClient} instance. * @see {@link Operation} * @see {@link Config} * @readonly */ readonly operation?: Operation|Config; } /** * This error indicates that invalid argument(s) were passed to the API which * may include options in the <em>opt</em> argument passed to * {@link NoSQLClient} methods. You may examine the arguments and options * passed using {@link operation} property. * <p> * This error may also result from invalid configuration provided to * {@link NoSQLClient} constructor when {@link NoSQLClient} is created in * which case the {@link operation} property will contain the configuration\ * object. * <p> * Errors of this class have error code {@link ErrorCode.ILLEGAL_ARGUMENT}. * @see {@link ErrorCode.ILLEGAL_ARGUMENT} * @see {@link NoSQLError#operation} */ export class NoSQLArgumentError extends NoSQLError {} /** * This error indicates communication problem between the client and the * server that resulted from invalid protocol message from either client or * server. It can be caused version mismatch between client and server or * other reasons and is not retryable. * Errors of this class have error code * {@link ErrorCode.BAD_PROTOCOL_MESSAGE}. * @see {@link ErrorCode.BAD_PROTOCOL_MESSAGE} */ export class NoSQLProtocolError extends NoSQLError {} /** * This error indicates that the server is running at a lower protocol * version than the client (i.e. the client is using a newer protocol * version than the server supports). The client should attempt to * decrement its internal protocol version and try again. * Errors of this class have error code * {@link ErrorCode.UNSUPPORTED_PROTOCOL}. * @see {@link ErrorCode.UNSUPPORTED_PROTOCOL} * @extends NoSQLError */ export class NoSQLUnsupportedProtocolError extends NoSQLError {} /** * Indicates network error when trying to communicate with the service. * Can be due to inability to connect (e.g. if the network or * the service is down). Note that this is different from unsuccessful * response from the service, which is indicated by {@link NoSQLServiceError}. * Errors of this class have error code {@link ErrorCode.NETWORK_ERROR}. * @see {@link ErrorCode.NETWORK_ERROR} */ export class NoSQLNetworkError extends NoSQLError {} /** * Indicates unsuccessful response from the service. Even though the client * was able to communicate with the service, the service was not able to * process client request and thus returned unsuccessful response. * Additional information is provided in the error message. Note that * this is different from inability to communicate with the service which is * indicated by {@link NoSQLNetworkError}. * Errors of this class have error code {@link ErrorCode.SERVICE_ERROR} * @see {@link ErrorCode.SERVICE_ERROR} */ export class NoSQLServiceError extends NoSQLError {} /** * This error occurs if operation has exceeded the provided timeout interval. * It is possible that the operation has been retried a number of times before * this timeout occurred. Whether the operation was retried depends on the * operation type, the errors caused by the operation and configured retry * handler(see {@link retryable} for explanation). For retryable * operations, the timeout is considered cumulative over all retries (not as * timeout of a single retry). If this error occurs when the service is * operating properly, you may want to adjust timeout values configured for * {@link NoSQLClient} or passed to the {@link NoSQLClient} methods in * <em>opt</em> argument. * <p> * Errors of this class have error code {@link ErrorCode.REQUEST_TIMEOUT}. * @see {@link Config#timeout} * @see {@link Config#ddlTimeout} * @see {@link ErrorCode.REQUEST_TIMEOUT} */ export class NoSQLTimeoutError extends NoSQLError {} /** * This class covers all errors that occur while acquiring authorization to * perform an operation on NoSQL DB. Because there could be several problems * acquiring authorization, the errors of this class may have one of several * error codes: * <ul> * <li>{@link ErrorCode.BAD_PROTOCOL_MESSAGE} indicates problem in * authorization protocol.</li> * <li>{@link ErrorCode.ILLEGAL_STATE} indicates that authorization operation * encountered unexpected state, such as missing or invalid information * received from authorization server. See the error message for details. * </li> * <li>{@link ErrorCode.ILLEGAL_ARGUMENT} indicates problem with * authorization configuration provided as {@link AuthConfig} when * {@link NoSQLClient} instance is created.</li> * <li>{@link ErrorCode.REQUEST_TIMEOUT} indicates that timeout was exceeded * trying to obtain authorization information.</li> * <li>{@link ErrorCode.SERVICE_ERROR} indicates unsuccessful response * from authorization server. This may be due to many factors, including * invalid user credentials (user name and password). See error message for * more information</li> * <li>{@link ErrorCode.UNAUTHORIZED} may indicate insufficient permissions * while trying to obtain authorization information. * <li>{@link ErrorCode.CREDENTIALS_ERROR} indicates error accessing user or * application credentials. The reason for this error depends on what * credential provider is used for the authorization.</li> * <li>{@link ErrorCode.NETWORK_ERROR} indicates error communicating with the * authorization server. This error code is used for errors not due to any * cases above. * </ul> * <p> * Because the error could have different causes even for the same error code, * it is important to check the message of the error as well as its * {@link cause}. The message should contain HTTP status code and * authorization server response if they are present. * <p> * Note that this class is used only for errors that occur while * trying to obtain authorization string from authorization provider and not * errors that occur when making request to NoSQL DB with invalid * authorization string. In the latter case, {@link NoSQLError} is returned * with error code {@link ErrorCode.INVALID_AUTHORIZATION}. */ export class NoSQLAuthorizationError extends NoSQLError {} /** * This class covers errors that occur during client-side portion of query * execution, that is parts of the query plan executed by the driver. * Because different such problems may arise, the errors of this class may * have one of several error codes: * <ul> * <li>{@link ErrorCode.BAD_PROTOCOL_MESSAGE} indicates invalid protocol * message received by the client such as invalid part of a query plan or * invalid or inconsistent data for partition sorting.</li> * <li>{@link ErrorCode.ILLEGAL_ARGUMENT} indicates invalid or missing query * parameters or operands, such as missing value for bound variable, * non-numeric operand for arithmetic expression, non-numeric parameter for * OFFSET or LIMIT clause, etc.</li> * <li>{@link ErrorCode.ILLEGAL_STATE} indicates illegal state in the query * engine, which may be caused by a problem in the engine. See the error * message for details.</li> * <li>{@link ErrorCode.MEMORY_LIMIT_EXCEEDED} indicates that local memory * consumed by the query execution exceeded the limit set by * <em>maxMemoryMB</em>. See {@link ErrorCode.MEMORY_LIMIT_EXCEEDED}</li> * </ul> * <p> * Note that this class does not cover all errors that may occur during query * execution. Besides error cases described above thrown by * {@link NoSQLQueryError}, other errors that are common to execution of all * APIs may also occur during execution of queries, such as network, service * or authorization-related errors and also errors due to invalid arguments * provided to the {@link NoSQLClient#query} API. These may be thrown as * {@link NoSQLError}, {@link NoSQLServiceError}, {@link NoSQLArgumentError}, * etc. * @see {@link NoSQLClient#query} */ export class NoSQLQueryError extends NoSQLError {}