Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
121 lines (79 loc) · 3.28 KB
/
Copy pathindex.js
File metadata and controls
121 lines (79 loc) · 3.28 KB
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
var MediaType = require("./MediaType");
var HTTPMethods = require("./HTTPMethods");
var CRUDBinder = require("./CRUDBinder");
var ExpressAdapter = require("./ExpressAdapter");
module.exports.HTTPServer = HTTPServer;
module.exports.HTTPMethods = HTTPMethods;
module.exports.CRUDBinder = CRUDBinder;
module.exports.MediaType = MediaType;
module.exports.ExpressAdapter = ExpressAdapter;
function HTTPServer(server, port, host){
var defaultListeners = server.getListenerBinder();
var defaultBinder = new CRUDBinder();
function bindCallbacks(promise, options, request, response){
promise = promise.then(function(data){
response.send(data);
})
.then(null, function(error){
var httpCode = 401;
var body = typeof error === "string" ? error : error.message;
// var errorLs = Object.keys(errorListeners).filter(function(errorListener){
// return errorListener[options.type] && errorListener[options.type][options.media] || errorListener['*'] && (errorListener['*']['*'] || errorListener['*'][options.media]);
// });
// errorLs.forEach(function(errorL){
// var responseModifier = errorL(error);
// for(var headerKey in responseModifier.headers){
// var header = responseModifier.headers[headerKey];
// response.setHeader(header.name, header.value);
// }
// httpCode = responseModifier.code || httpCode;
// body = responseModifier.body || body;
// });
response.send(httpCode, body);
});
promise.done ? promise.done() : promise.end();
}
function getValidOptions(listener, options){
if(typeof listener !== 'function' && typeof options === 'function'){
var aux = listener;
listener = options;
options = aux;
}
if(typeof options === 'string'){
options = { type : options };
}
if(options && options.type && !HTTPMethods[options.type.toUpperCase()]){
throw new Error("Tipo invalido " + options.type);
}
options = options === undefined ? {} : options;
options.type = options.type === undefined ? HTTPMethods.GET : options.type.toUpperCase();
options.media = options.media === undefined ? MediaType.JSON : options.media;
return [listener, options];
}
this.addHTTPListerner = function(url, listener, options){
var params = getValidOptions(listener, options);
defaultListeners[HTTPMethods[params[1].type]][params[1].media](url, params[0], params[1], bindCallbacks);
};
this.addInterceptor = function(listener){
defaultListeners.addInterceptor(listener);
}
this.addErrorListerner = function(url, listener, options){
if(options && options.type && !HTTPMethods[options.type]){
throw new Error("Tipo invalido");
}
options = options === undefined ? {} : options;
options.type = options.type === undefined ? '*' : options.type;
options.media = options.media === undefined ? '*' : options.media;
errorListeners[HTTPMethods[options.type]][options.media].push(listener);
};
this.start = function(){
server.listen(port, host, function() {
console.log('%s: Node server started on %s:%d ...', Date(Date.now()),
host, port);
});
};
this.addCRUD = function(object, binder, mediaType){
binder = binder ? binder : defaultBinder;
binder.bind(object, this.addHTTPListerner.bind(this));
};
}