| var STATUS_CODES = { '100': 'Continue' |
| , '101': 'Switching Protocols' |
| , '102': 'Processing' |
| , '200': 'OK' |
| , '201': 'Created' |
| , '202': 'Accepted' |
| , '203': 'Non-Authoritative Information' |
| , '204': 'No Content' |
| , '205': 'Reset Content' |
| , '206': 'Partial Content' |
| , '207': 'Multi-Status' |
| , '300': 'Multiple Choices' |
| , '301': 'Moved Permanently' |
| , '302': 'Moved Temporarily' |
| , '303': 'See Other' |
| , '304': 'Not Modified' |
| , '305': 'Use Proxy' |
| , '307': 'Temporary Redirect' |
| , '400': 'Bad Request' |
| , '401': 'Unauthorized' |
| , '402': 'Payment Required' |
| , '403': 'Forbidden' |
| , '404': 'Not Found' |
| , '405': 'Method Not Allowed' |
| , '406': 'Not Acceptable' |
| , '407': 'Proxy Authentication Required' |
| , '408': 'Request Time-out' |
| , '409': 'Conflict' |
| , '410': 'Gone' |
| , '411': 'Length Required' |
| , '412': 'Precondition Failed' |
| , '413': 'Request Entity Too Large' |
| , '414': 'Request-URI Too Large' |
| , '415': 'Unsupported Media Type' |
| , '416': 'Requested Range Not Satisfiable' |
| , '417': 'Expectation Failed' |
| , '418': 'I\'m a teapot' |
| , '422': 'Unprocessable Entity' |
| , '423': 'Locked' |
| , '424': 'Failed Dependency' |
| , '425': 'Unordered Collection' |
| , '426': 'Upgrade Required' |
| , '500': 'Internal Server Error' |
| , '501': 'Not Implemented' |
| , '502': 'Bad Gateway' |
| , '503': 'Service Unavailable' |
| , '504': 'Gateway Time-out' |
| , '505': 'HTTP Version not supported' |
| , '506': 'Variant Also Negotiates' |
| , '507': 'Insufficient Storage' |
| , '509': 'Bandwidth Limit Exceeded' |
| , '510': 'Not Extended' |
| }; |
| /* |
| * generic error |
| * |
| * e.g. missing rev information: |
| * |
| * { "stack": "Error: Document update conflict. at gen_err(error.js:14:43)", |
| * "message": "Document update conflict.", |
| * "error": "conflict", |
| * "http_code": 409, |
| * "namespace": "couch", |
| * "request": { |
| * "method": "PUT", |
| * "headers": { |
| * "content-type": "application/json", |
| * "accept": "application/json", |
| * "authorization": "BasicYWRtaW46YWRtaW4=", |
| * "content-length": 13 |
| * }, |
| * "body": {"foo": "baz"}, |
| * "uri": "http://admin:admin@localhost: 5984/doc_up1/foo", |
| * "callback": [Function] |
| * } |
| * } |
| * |
| * extension on error to support more complex logic. |
| * |
| * @param {error:error|string} the error or a reason for the error |
| * @param {code:string} the recognizable error code |
| * @param {http_code:integer:optional} the http code from couchdb |
| * @param {request:object} the request that was made to couch |
| * @param {type:string} a namespace for the error, e.g. couch |
| * |
| * @return an augmented error that helps you know more than the stack trace |
| */ |
| function gen_err(scope,error,code,request,status_code) { |
| error = error || STATUS_CODES[status_code] || 'Unknown Error'; |
| code = code || 'unknown'; |
| status_code = typeof status_code === 'number' && status_code || 500; |
| request = request || {}; |
| if(typeof error === 'string') { error = new Error(error); } |
| error.error = code; |
| error['status-code'] = status_code; |
| error.scope = scope; |
| error.request = request; |
| return error; |
| } |
| |
| exports.request = function (e,c,r,s) { return gen_err('request',e,c,r,s);}; |
| exports.couch = function (e,c,r,s) { return gen_err('couch',e,c,r,s); }; |