export function translateError()

in src/common-amqp/amqp_common_errors.ts [25:141]


export function translateError(message: string, amqpError: Error): AmqpTransportError {
  let error: AmqpTransportError;

  /*Codes_SRS_NODE_DEVICE_AMQP_COMMON_ERRORS_16_012: [`translateError` shall return a custom error type according to this table if the AMQP error condition is one of the following:
  | AMQP Error Condition                       | Custom Error Type                    |
  | ------------------------------------------ | ------------------------------------ |
  | "amqp:internal-error"                      | InternalServerError                  |
  | "amqp:link:message-size-exceeded"          | MessageTooLargeError                 |
  | "amqp:not-found"                           | DeviceNotFoundError                  |
  | "amqp:not-implemented"                     | NotImplementedError                  |
  | "amqp:not-allowed"                         | InvalidOperationError                |
  | "amqp:resource-limit-exceeded"             | IotHubQuotaExceededError             |
  | "amqp:unauthorized-access"                 | UnauthorizedError                    |
  | "com.microsoft:argument-error"             | ArgumentError                        |
  | "com.microsoft:argument-out-of-range"      | ArgumentOutOfRangeError              |
  | "com.microsoft:device-already-exists"      | DeviceAlreadyExistsError             |
  | "com.microsoft:device-container-throttled" | ThrottlingError                      |
  | "com.microsoft:iot-hub-suspended"          | IoTHubSuspendedError                 |
  | "com.microsoft:iot-hub-not-found-error"    | IotHubNotFoundError                  |
  | "com.microsoft:message-lock-lost"          | DeviceMessageLockLostError           |
  | "com.microsoft:precondition-failed"        | PreconditionFailedError              |
  | "com.microsoft:quota-exceeded"             | IotHubQuotaExceededError             |
  | "com.microsoft:timeout"                    | ServiceUnavailableError              |
  | "amqp:link:detach-forced"                  | ServiceUnavailableError              |
  ]*/

  if ((amqpError as AmqpError).condition) {
    switch ((amqpError as AmqpError).condition) {
      case 'amqp:internal-error':
        error = new errors.InternalServerError(message);
        break;
      case 'amqp:link:message-size-exceeded':
        error = new errors.MessageTooLargeError(message);
        break;
      case 'amqp:not-found':
        error = new errors.DeviceNotFoundError(message);
        break;
      case 'amqp:not-implemented':
        error = new errors.NotImplementedError(message);
        break;
      case 'amqp:not-allowed':
        error = new errors.InvalidOperationError(message);
        break;
      case 'amqp:resource-limit-exceeded':
        error = new errors.IotHubQuotaExceededError(message);
        break;
      case 'amqp:unauthorized-access':
        error = new errors.UnauthorizedError(message);
        break;
      case 'com.microsoft:argument-error':
        error = new errors.ArgumentError(message);
        break;
      case 'com.microsoft:argument-out-of-range':
        error = new errors.ArgumentOutOfRangeError(message);
        break;
      case 'com.microsoft:device-already-exists':
        error = new errors.DeviceAlreadyExistsError(message);
        break;
      case 'com.microsoft:device-container-throttled':
        error = new errors.ThrottlingError(message);
        break;
      case 'com.microsoft:iot-hub-suspended':
        error = new errors.IoTHubSuspendedError(message);
        break;
      case 'com.microsoft:iot-hub-not-found-error':
        error = new errors.IotHubNotFoundError(message);
        break;
      case 'com.microsoft:message-lock-lost':
        error = new errors.DeviceMessageLockLostError(message);
        break;
      case 'com.microsoft:precondition-failed':
        error = new errors.PreconditionFailedError(message);
        break;
      case 'com.microsoft:quota-exceeded':
        error = new errors.IotHubQuotaExceededError(message);
        break;
      case 'com.microsoft:timeout':
        error = new errors.ServiceUnavailableError(message);
        break;
      case 'amqp:link:detach-forced':
        error = new errors.ServiceUnavailableError(message);
        break;
      default:
        /*Codes_SRS_NODE_DEVICE_AMQP_COMMON_ERRORS_16_002: [If the AMQP error code is unknown, `translateError` should return a generic Javascript `Error` object.]*/
        error = new Error(message);
    }
  } else if ((<any>amqpError).code) {
    error = new errors.NotConnectedError(message);
  } else if ((<any>amqpError).message && (<any>amqpError.message).message ) {
    // In the case of a invalid Twin object, this will return the generic error message plus the specific error messaged provided from the server.
    const errorString = message + '. ' + (<any>amqpError.message).message.toString();
    error = new Error(errorString);
  } else if (amqpError.constructor?.name) {
    // Leave these specific erorrs unwrapped.  Other errors could be added here but we have never seen them arrive here.
    switch (amqpError.constructor.name) {
      case 'ServiceUnavailableError':
      case 'NotConnectedError':
        error = amqpError;
        amqpError = null;
        break;
      default:
        error = new Error(message);
        break;
    }
  } else {
    /*Codes_SRS_NODE_DEVICE_AMQP_COMMON_ERRORS_16_002: [If the AMQP error code is unknown, `translateError` should return a generic Javascript `Error` object.]*/
    error = new Error(message);
  }

  /*Codes_SRS_NODE_DEVICE_AMQP_COMMON_ERRORS_16_001: [Any error object returned by `translateError` shall inherit from the generic `Error` Javascript object and have 2 properties:
  *- `amqpError` shall contain the error object returned by the AMQP layer.
  *- `message` shall contain a human-readable error message]
  */
  error.amqpError = amqpError;

  return error;
}