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