|
|
- /*
- * node-rdkafka - Node.js wrapper for RdKafka C/C++ library
- *
- * Copyright (c) 2016 Blizzard Entertainment
- *
- * This software may be modified and distributed under the terms
- * of the MIT license. See the LICENSE.txt file for details.
- */
-
- module.exports = LibrdKafkaError;
-
- var util = require('util');
- var librdkafka = require('../librdkafka');
-
- util.inherits(LibrdKafkaError, Error);
-
- LibrdKafkaError.create = createLibrdkafkaError;
- LibrdKafkaError.wrap = errorWrap;
-
- /**
- * Enum for identifying errors reported by the library
- *
- * You can find this list in the C++ code at
- * https://github.com/edenhill/librdkafka/blob/master/src-cpp/rdkafkacpp.h#L148
- *
- * @readonly
- * @enum {number}
- * @constant
- */
- // ====== Generated from librdkafka 1.6.1 file src-cpp/rdkafkacpp.h ======
- LibrdKafkaError.codes = {
-
- /* Internal errors to rdkafka: */
- /** Begin internal error codes */
- ERR__BEGIN: -200,
- /** Received message is incorrect */
- ERR__BAD_MSG: -199,
- /** Bad/unknown compression */
- ERR__BAD_COMPRESSION: -198,
- /** Broker is going away */
- ERR__DESTROY: -197,
- /** Generic failure */
- ERR__FAIL: -196,
- /** Broker transport failure */
- ERR__TRANSPORT: -195,
- /** Critical system resource */
- ERR__CRIT_SYS_RESOURCE: -194,
- /** Failed to resolve broker */
- ERR__RESOLVE: -193,
- /** Produced message timed out*/
- ERR__MSG_TIMED_OUT: -192,
- /** Reached the end of the topic+partition queue on
- * the broker. Not really an error.
- * This event is disabled by default,
- * see the `enable.partition.eof` configuration property. */
- ERR__PARTITION_EOF: -191,
- /** Permanent: Partition does not exist in cluster. */
- ERR__UNKNOWN_PARTITION: -190,
- /** File or filesystem error */
- ERR__FS: -189,
- /** Permanent: Topic does not exist in cluster. */
- ERR__UNKNOWN_TOPIC: -188,
- /** All broker connections are down. */
- ERR__ALL_BROKERS_DOWN: -187,
- /** Invalid argument, or invalid configuration */
- ERR__INVALID_ARG: -186,
- /** Operation timed out */
- ERR__TIMED_OUT: -185,
- /** Queue is full */
- ERR__QUEUE_FULL: -184,
- /** ISR count < required.acks */
- ERR__ISR_INSUFF: -183,
- /** Broker node update */
- ERR__NODE_UPDATE: -182,
- /** SSL error */
- ERR__SSL: -181,
- /** Waiting for coordinator to become available. */
- ERR__WAIT_COORD: -180,
- /** Unknown client group */
- ERR__UNKNOWN_GROUP: -179,
- /** Operation in progress */
- ERR__IN_PROGRESS: -178,
- /** Previous operation in progress, wait for it to finish. */
- ERR__PREV_IN_PROGRESS: -177,
- /** This operation would interfere with an existing subscription */
- ERR__EXISTING_SUBSCRIPTION: -176,
- /** Assigned partitions (rebalance_cb) */
- ERR__ASSIGN_PARTITIONS: -175,
- /** Revoked partitions (rebalance_cb) */
- ERR__REVOKE_PARTITIONS: -174,
- /** Conflicting use */
- ERR__CONFLICT: -173,
- /** Wrong state */
- ERR__STATE: -172,
- /** Unknown protocol */
- ERR__UNKNOWN_PROTOCOL: -171,
- /** Not implemented */
- ERR__NOT_IMPLEMENTED: -170,
- /** Authentication failure*/
- ERR__AUTHENTICATION: -169,
- /** No stored offset */
- ERR__NO_OFFSET: -168,
- /** Outdated */
- ERR__OUTDATED: -167,
- /** Timed out in queue */
- ERR__TIMED_OUT_QUEUE: -166,
- /** Feature not supported by broker */
- ERR__UNSUPPORTED_FEATURE: -165,
- /** Awaiting cache update */
- ERR__WAIT_CACHE: -164,
- /** Operation interrupted */
- ERR__INTR: -163,
- /** Key serialization error */
- ERR__KEY_SERIALIZATION: -162,
- /** Value serialization error */
- ERR__VALUE_SERIALIZATION: -161,
- /** Key deserialization error */
- ERR__KEY_DESERIALIZATION: -160,
- /** Value deserialization error */
- ERR__VALUE_DESERIALIZATION: -159,
- /** Partial response */
- ERR__PARTIAL: -158,
- /** Modification attempted on read-only object */
- ERR__READ_ONLY: -157,
- /** No such entry / item not found */
- ERR__NOENT: -156,
- /** Read underflow */
- ERR__UNDERFLOW: -155,
- /** Invalid type */
- ERR__INVALID_TYPE: -154,
- /** Retry operation */
- ERR__RETRY: -153,
- /** Purged in queue */
- ERR__PURGE_QUEUE: -152,
- /** Purged in flight */
- ERR__PURGE_INFLIGHT: -151,
- /** Fatal error: see RdKafka::Handle::fatal_error() */
- ERR__FATAL: -150,
- /** Inconsistent state */
- ERR__INCONSISTENT: -149,
- /** Gap-less ordering would not be guaranteed if proceeding */
- ERR__GAPLESS_GUARANTEE: -148,
- /** Maximum poll interval exceeded */
- ERR__MAX_POLL_EXCEEDED: -147,
- /** Unknown broker */
- ERR__UNKNOWN_BROKER: -146,
- /** Functionality not configured */
- ERR__NOT_CONFIGURED: -145,
- /** Instance has been fenced */
- ERR__FENCED: -144,
- /** Application generated error */
- ERR__APPLICATION: -143,
- /** Assignment lost */
- ERR__ASSIGNMENT_LOST: -142,
- /** No operation performed */
- ERR__NOOP: -141,
- /** No offset to automatically reset to */
- ERR__AUTO_OFFSET_RESET: -140,
- /** End internal error codes */
- ERR__END: -100,
- /* Kafka broker errors: */
- /** Unknown broker error */
- ERR_UNKNOWN: -1,
- /** Success */
- ERR_NO_ERROR: 0,
- /** Offset out of range */
- ERR_OFFSET_OUT_OF_RANGE: 1,
- /** Invalid message */
- ERR_INVALID_MSG: 2,
- /** Unknown topic or partition */
- ERR_UNKNOWN_TOPIC_OR_PART: 3,
- /** Invalid message size */
- ERR_INVALID_MSG_SIZE: 4,
- /** Leader not available */
- ERR_LEADER_NOT_AVAILABLE: 5,
- /** Not leader for partition */
- ERR_NOT_LEADER_FOR_PARTITION: 6,
- /** Request timed out */
- ERR_REQUEST_TIMED_OUT: 7,
- /** Broker not available */
- ERR_BROKER_NOT_AVAILABLE: 8,
- /** Replica not available */
- ERR_REPLICA_NOT_AVAILABLE: 9,
- /** Message size too large */
- ERR_MSG_SIZE_TOO_LARGE: 10,
- /** StaleControllerEpochCode */
- ERR_STALE_CTRL_EPOCH: 11,
- /** Offset metadata string too large */
- ERR_OFFSET_METADATA_TOO_LARGE: 12,
- /** Broker disconnected before response received */
- ERR_NETWORK_EXCEPTION: 13,
- /** Coordinator load in progress */
- ERR_COORDINATOR_LOAD_IN_PROGRESS: 14,
- /** Group coordinator load in progress */
- ERR_GROUP_LOAD_IN_PROGRESS: 14,
- /** Coordinator not available */
- ERR_COORDINATOR_NOT_AVAILABLE: 15,
- /** Group coordinator not available */
- ERR_GROUP_COORDINATOR_NOT_AVAILABLE: 15,
- /** Not coordinator */
- ERR_NOT_COORDINATOR: 16,
- /** Not coordinator for group */
- ERR_NOT_COORDINATOR_FOR_GROUP: 16,
- /** Invalid topic */
- ERR_TOPIC_EXCEPTION: 17,
- /** Message batch larger than configured server segment size */
- ERR_RECORD_LIST_TOO_LARGE: 18,
- /** Not enough in-sync replicas */
- ERR_NOT_ENOUGH_REPLICAS: 19,
- /** Message(s) written to insufficient number of in-sync replicas */
- ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND: 20,
- /** Invalid required acks value */
- ERR_INVALID_REQUIRED_ACKS: 21,
- /** Specified group generation id is not valid */
- ERR_ILLEGAL_GENERATION: 22,
- /** Inconsistent group protocol */
- ERR_INCONSISTENT_GROUP_PROTOCOL: 23,
- /** Invalid group.id */
- ERR_INVALID_GROUP_ID: 24,
- /** Unknown member */
- ERR_UNKNOWN_MEMBER_ID: 25,
- /** Invalid session timeout */
- ERR_INVALID_SESSION_TIMEOUT: 26,
- /** Group rebalance in progress */
- ERR_REBALANCE_IN_PROGRESS: 27,
- /** Commit offset data size is not valid */
- ERR_INVALID_COMMIT_OFFSET_SIZE: 28,
- /** Topic authorization failed */
- ERR_TOPIC_AUTHORIZATION_FAILED: 29,
- /** Group authorization failed */
- ERR_GROUP_AUTHORIZATION_FAILED: 30,
- /** Cluster authorization failed */
- ERR_CLUSTER_AUTHORIZATION_FAILED: 31,
- /** Invalid timestamp */
- ERR_INVALID_TIMESTAMP: 32,
- /** Unsupported SASL mechanism */
- ERR_UNSUPPORTED_SASL_MECHANISM: 33,
- /** Illegal SASL state */
- ERR_ILLEGAL_SASL_STATE: 34,
- /** Unuspported version */
- ERR_UNSUPPORTED_VERSION: 35,
- /** Topic already exists */
- ERR_TOPIC_ALREADY_EXISTS: 36,
- /** Invalid number of partitions */
- ERR_INVALID_PARTITIONS: 37,
- /** Invalid replication factor */
- ERR_INVALID_REPLICATION_FACTOR: 38,
- /** Invalid replica assignment */
- ERR_INVALID_REPLICA_ASSIGNMENT: 39,
- /** Invalid config */
- ERR_INVALID_CONFIG: 40,
- /** Not controller for cluster */
- ERR_NOT_CONTROLLER: 41,
- /** Invalid request */
- ERR_INVALID_REQUEST: 42,
- /** Message format on broker does not support request */
- ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT: 43,
- /** Policy violation */
- ERR_POLICY_VIOLATION: 44,
- /** Broker received an out of order sequence number */
- ERR_OUT_OF_ORDER_SEQUENCE_NUMBER: 45,
- /** Broker received a duplicate sequence number */
- ERR_DUPLICATE_SEQUENCE_NUMBER: 46,
- /** Producer attempted an operation with an old epoch */
- ERR_INVALID_PRODUCER_EPOCH: 47,
- /** Producer attempted a transactional operation in an invalid state */
- ERR_INVALID_TXN_STATE: 48,
- /** Producer attempted to use a producer id which is not
- * currently assigned to its transactional id */
- ERR_INVALID_PRODUCER_ID_MAPPING: 49,
- /** Transaction timeout is larger than the maximum
- * value allowed by the broker's max.transaction.timeout.ms */
- ERR_INVALID_TRANSACTION_TIMEOUT: 50,
- /** Producer attempted to update a transaction while another
- * concurrent operation on the same transaction was ongoing */
- ERR_CONCURRENT_TRANSACTIONS: 51,
- /** Indicates that the transaction coordinator sending a
- * WriteTxnMarker is no longer the current coordinator for a
- * given producer */
- ERR_TRANSACTION_COORDINATOR_FENCED: 52,
- /** Transactional Id authorization failed */
- ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED: 53,
- /** Security features are disabled */
- ERR_SECURITY_DISABLED: 54,
- /** Operation not attempted */
- ERR_OPERATION_NOT_ATTEMPTED: 55,
- /** Disk error when trying to access log file on the disk */
- ERR_KAFKA_STORAGE_ERROR: 56,
- /** The user-specified log directory is not found in the broker config */
- ERR_LOG_DIR_NOT_FOUND: 57,
- /** SASL Authentication failed */
- ERR_SASL_AUTHENTICATION_FAILED: 58,
- /** Unknown Producer Id */
- ERR_UNKNOWN_PRODUCER_ID: 59,
- /** Partition reassignment is in progress */
- ERR_REASSIGNMENT_IN_PROGRESS: 60,
- /** Delegation Token feature is not enabled */
- ERR_DELEGATION_TOKEN_AUTH_DISABLED: 61,
- /** Delegation Token is not found on server */
- ERR_DELEGATION_TOKEN_NOT_FOUND: 62,
- /** Specified Principal is not valid Owner/Renewer */
- ERR_DELEGATION_TOKEN_OWNER_MISMATCH: 63,
- /** Delegation Token requests are not allowed on this connection */
- ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED: 64,
- /** Delegation Token authorization failed */
- ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED: 65,
- /** Delegation Token is expired */
- ERR_DELEGATION_TOKEN_EXPIRED: 66,
- /** Supplied principalType is not supported */
- ERR_INVALID_PRINCIPAL_TYPE: 67,
- /** The group is not empty */
- ERR_NON_EMPTY_GROUP: 68,
- /** The group id does not exist */
- ERR_GROUP_ID_NOT_FOUND: 69,
- /** The fetch session ID was not found */
- ERR_FETCH_SESSION_ID_NOT_FOUND: 70,
- /** The fetch session epoch is invalid */
- ERR_INVALID_FETCH_SESSION_EPOCH: 71,
- /** No matching listener */
- ERR_LISTENER_NOT_FOUND: 72,
- /** Topic deletion is disabled */
- ERR_TOPIC_DELETION_DISABLED: 73,
- /** Leader epoch is older than broker epoch */
- ERR_FENCED_LEADER_EPOCH: 74,
- /** Leader epoch is newer than broker epoch */
- ERR_UNKNOWN_LEADER_EPOCH: 75,
- /** Unsupported compression type */
- ERR_UNSUPPORTED_COMPRESSION_TYPE: 76,
- /** Broker epoch has changed */
- ERR_STALE_BROKER_EPOCH: 77,
- /** Leader high watermark is not caught up */
- ERR_OFFSET_NOT_AVAILABLE: 78,
- /** Group member needs a valid member ID */
- ERR_MEMBER_ID_REQUIRED: 79,
- /** Preferred leader was not available */
- ERR_PREFERRED_LEADER_NOT_AVAILABLE: 80,
- /** Consumer group has reached maximum size */
- ERR_GROUP_MAX_SIZE_REACHED: 81,
- /** Static consumer fenced by other consumer with same
- * group.instance.id. */
- ERR_FENCED_INSTANCE_ID: 82,
- /** Eligible partition leaders are not available */
- ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE: 83,
- /** Leader election not needed for topic partition */
- ERR_ELECTION_NOT_NEEDED: 84,
- /** No partition reassignment is in progress */
- ERR_NO_REASSIGNMENT_IN_PROGRESS: 85,
- /** Deleting offsets of a topic while the consumer group is
- * subscribed to it */
- ERR_GROUP_SUBSCRIBED_TO_TOPIC: 86,
- /** Broker failed to validate record */
- ERR_INVALID_RECORD: 87,
- /** There are unstable offsets that need to be cleared */
- ERR_UNSTABLE_OFFSET_COMMIT: 88,
- /** Throttling quota has been exceeded */
- ERR_THROTTLING_QUOTA_EXCEEDED: 89,
- /** There is a newer producer with the same transactionalId
- * which fences the current one */
- ERR_PRODUCER_FENCED: 90,
- /** Request illegally referred to resource that does not exist */
- ERR_RESOURCE_NOT_FOUND: 91,
- /** Request illegally referred to the same resource twice */
- ERR_DUPLICATE_RESOURCE: 92,
- /** Requested credential would not meet criteria for acceptability */
- ERR_UNACCEPTABLE_CREDENTIAL: 93,
- /** Indicates that the either the sender or recipient of a
- * voter-only request is not one of the expected voters */
- ERR_INCONSISTENT_VOTER_SET: 94,
- /** Invalid update version */
- ERR_INVALID_UPDATE_VERSION: 95,
- /** Unable to update finalized features due to server error */
- ERR_FEATURE_UPDATE_FAILED: 96,
- /** Request principal deserialization failed during forwarding */
- ERR_PRINCIPAL_DESERIALIZATION_FAILURE: 97
- };
-
- /**
- * Representation of a librdkafka error
- *
- * This can be created by giving either another error
- * to piggy-back on. In this situation it tries to parse
- * the error string to figure out the intent. However, more usually,
- * it is constructed by an error object created by a C++ Baton.
- *
- * @param {object|error} e - An object or error to wrap
- * @property {string} message - The error message
- * @property {number} code - The error code.
- * @property {string} origin - The origin, whether it is local or remote
- * @constructor
- */
- function LibrdKafkaError(e) {
- if (!(this instanceof LibrdKafkaError)) {
- return new LibrdKafkaError(e);
- }
-
- if (typeof e === 'number') {
- this.message = librdkafka.err2str(e);
- this.code = e;
- this.errno = e;
- if (e >= LibrdKafkaError.codes.ERR__END) {
- this.origin = 'local';
- } else {
- this.origin = 'kafka';
- }
- Error.captureStackTrace(this, this.constructor);
- } else if (!util.isError(e)) {
- // This is the better way
- this.message = e.message;
- this.code = e.code;
- this.errno = e.code;
- if (e.code >= LibrdKafkaError.codes.ERR__END) {
- this.origin = 'local';
- } else {
- this.origin = 'kafka';
- }
- Error.captureStackTrace(this, this.constructor);
- } else {
- var message = e.message;
- var parsedMessage = message.split(': ');
-
- var origin, msg;
-
- if (parsedMessage.length > 1) {
- origin = parsedMessage[0].toLowerCase();
- msg = parsedMessage[1].toLowerCase();
- } else {
- origin = 'unknown';
- msg = message.toLowerCase();
- }
-
- // special cases
- if (msg === 'consumer is disconnected' || msg === 'producer is disconnected') {
- this.origin = 'local';
- this.code = LibrdKafkaError.codes.ERR__STATE;
- this.errno = this.code;
- this.message = msg;
- } else {
- this.origin = origin;
- this.message = msg;
- this.code = typeof e.code === 'number' ? e.code : -1;
- this.errno = this.code;
- this.stack = e.stack;
- }
-
- }
-
- if (e.hasOwnProperty('isFatal')) this.isFatal = e.isFatal;
- if (e.hasOwnProperty('isRetriable')) this.isRetriable = e.isRetriable;
- if (e.hasOwnProperty('isTxnRequiresAbort')) this.isTxnRequiresAbort = e.isTxnRequiresAbort;
-
- }
-
- function createLibrdkafkaError(e) {
- return new LibrdKafkaError(e);
- }
-
- function errorWrap(errorCode, intIsError) {
- var returnValue = true;
- if (intIsError) {
- returnValue = errorCode;
- errorCode = typeof errorCode === 'number' ? errorCode : 0;
- }
-
- if (errorCode !== LibrdKafkaError.codes.ERR_NO_ERROR) {
- var e = LibrdKafkaError.create(errorCode);
- throw e;
- }
-
- return returnValue;
- }
|