PageRenderTime 54ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/error.js

https://bitbucket.org/sempasha/node-jsonrpc
JavaScript | 139 lines | 45 code | 11 blank | 83 comment | 16 complexity | 0959bdbc59caae496ac20ee87c944d66 MD5 | raw file
  1. /**
  2. * @fileOverview [JSON-RPC 2.0 Ошибка]{@link http://www.jsonrpc.org/specification#error_object}
  3. * @ignore
  4. */
  5. /**
  6. * @ignore
  7. */
  8. var inherits = require('util').inherits;
  9. /**
  10. * @ignore
  11. */
  12. var main = require('../');
  13. /**
  14. * [Ошибка]{@link http://www.jsonrpc.org/specification#error_object} отвечающая требованиям
  15. * [спецификации JSON-RPC 2.0]{@link http://www.jsonrpc.org/specification}, унаследована от стандартной ошибки
  16. *
  17. * @alias module:main.Error
  18. * @augments Error
  19. * @constructor
  20. * @param {Number} code числовой код ошибки, протоколом
  21. * [JSON-RPC 2.0]{@link http://www.jsonrpc.org/specification#error_object} зарезервированы некоторые коды
  22. * @param {String} message текствовое сообщение, протоколом
  23. * [JSON-RPC 2.0]{@link http://www.jsonrpc.org/specification#error_object} уже определены некоторые ошибки
  24. * @param {?(Boolean|Number|String|Object|Error)} [data=null] данные примитивного типа или структара данных,
  25. * содержащие дополнительную информацию об ошибке
  26. * @throws {TypeError} в случае, если переданы неверные значения для параметров
  27. * <code>code</code>, <code>message</code> или <code>data</code>
  28. *
  29. * @example <caption>Ошибка при декодировании сообщения JSON-RPC</caption>
  30. * var jsonrpc = require('node-jsonrpc');
  31. * var rpc_json = '{"id": "100", "method": "doSomething", "params": "Invalid params"}';
  32. * try {
  33. * var rpc = JSON.parse(rpc_json);
  34. * } catch (error) {
  35. * throw new jsonrpc.Error(-32700, 'Parse error');
  36. * }
  37. *
  38. * @example <caption>Ошибка в формате сообщения JSON-RPC</caption>
  39. * var jsonrpc = require('node-jsonrpc');
  40. * var rpc_json = {"id": "100", "method": "doSomething", "params": "Invalid params"};
  41. * if (typeof rpc.params !== 'undefined' && !(rpc.params instanceof Array) && !(rpc.params instanceof Object)) {
  42. * throw new jsonrpc.Error(-32600, 'Invalid Request');
  43. * }
  44. */
  45. module.exports = exports = function (code, message, data) {
  46. if (!(this instanceof exports)) {
  47. return new exports(code, message, data);
  48. }
  49. var type_code = typeof code,
  50. type_message = typeof message,
  51. type_data = typeof data;
  52. if (type_code !== 'number' || (code % 1 !== 0)) {
  53. throw new TypeError('Invalid code, must be an integer, but ' + type_code + ' (' + code + ') given');
  54. }
  55. if (type_message !== 'string') {
  56. throw new TypeError('Invalid message, must be a string, but ' + type_message + ' given');
  57. }
  58. if (type_data === 'undefined') {
  59. data = null;
  60. } else if (data !== null) {
  61. if (type_data === 'object') {
  62. if (!(data instanceof Array) && !(data instanceof Error) && data.constructor !== Object) {
  63. throw new TypeError('Invalid data, must be a structured data (Object, Array, Error) or primitive, ' +
  64. 'but ' + type_data + ' given');
  65. }
  66. } else if (type_data !== 'boolean' && type_data !== 'string' && type_data !== 'number') {
  67. throw new TypeError('Invalid data, must be a structured or primitive data, but ' + type_data + ' given');
  68. }
  69. }
  70. this.code = code;
  71. this.message = message;
  72. this.data = data;
  73. };
  74. inherits(exports, Error);
  75. /**
  76. * Код ошибки, в спецификации JSON-RPC 2.0 описано использование кодов ошибок:<ol>
  77. * <li>Коды пользовательский ошибок не должны попадать в диапазоны от <code>-32768</code> до <code>-32000</code>,
  78. * этот диапазон зарезервирован за протоколом JSON-RPC, его текущими и будущими версиями;</li>
  79. * <li>Уже описаны в спецификации ошибки с кодами: <code>-32700</code>, <code>-32600</code>, <code>-32601</code>,
  80. * <code>-32602</code> и <code>-32603</code>;</li>
  81. * <li>Коды в диапазоне от <code>-32000</code> до <code>-32099</code> зарезервированы под различные реализации
  82. * JSON-RPC, соответственно могут быть использованы в данном модуле и в его расширениях;</li>
  83. * </ol>
  84. *
  85. * @alias module:main.Error#code
  86. * @type {Number}
  87. */
  88. exports.prototype.code = null;
  89. /**
  90. * Тесктовое сообщение об ошибке, в [спецификации]{@link http://www.jsonrpc.org/specification#error_object}
  91. * указаны сообщения для всех определённых в ней ошибок.
  92. *
  93. * @alias module:main.Error#message
  94. * @type {String}
  95. */
  96. exports.prototype.message = null;
  97. /**
  98. * Дополнительные данные для описания ошибки, в [спецификации]{@link http://www.jsonrpc.org/specification#error_object}
  99. * определено, что это может быть любое простое значение, либо структура данных (тип Object)
  100. *
  101. * @alias module:main.Error#data
  102. * @type {?(Boolean|Number|String|Object)}
  103. */
  104. exports.prototype.data = null;
  105. /**
  106. * Возвращает представление ошибки в виде
  107. * [простого объекта]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object}
  108. * в соответствии со [спецификацией]{@link http://www.jsonrpc.org/specification#error_object}
  109. *
  110. * @alias module:main.Error#toJSON
  111. * @returns {Object}
  112. */
  113. exports.prototype.toJSON = function () {
  114. var plain = {code: this.code, message: this.message};
  115. if (this.data !== null) {
  116. plain.data = this.data;
  117. }
  118. return plain;
  119. };
  120. /**
  121. * Преобразует объект в строку, а именно в JSON представление
  122. *
  123. * @alias module:main.Error#toString
  124. * @returns {String}
  125. */
  126. exports.prototype.toString = function () {
  127. return main.JSON.stringify(this);
  128. };