This repository has been archived by the owner on Nov 5, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 157
/
error.js
122 lines (120 loc) · 4.79 KB
/
error.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
var EventEmitter = require('events').EventEmitter;
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;
}
function request_err(error, code, request, callback) {
if(typeof request === 'function') {
callback = request;
request = {};
}
error = gen_err('request', error, code, request);
if(callback) {
callback(error);
return request;
} else {
var em = new EventEmitter();
process.nextTick(function() { em.emit('error', error); });
return em;
}
}
exports.uncaught = function (e,c,r,s) { return gen_err('uncaught',e,c,r,s); };
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); };
exports.init = function (e,c,r,s) { return gen_err('init',e,c,r,s); };
exports.request_err = request_err;