110 lines
2.8 KiB
JavaScript
110 lines
2.8 KiB
JavaScript
// Uplink Gemini Server
|
|
// Router Class
|
|
|
|
function selectRoute(path, routes) {
|
|
result = -1;
|
|
console.log(path);
|
|
var mPathComponents = path.split('/');
|
|
routes.forEach((item, index) => {
|
|
console.log(item);
|
|
var mitem = item.split('/');
|
|
if((mitem.length == mPathComponents.length)) {
|
|
if((item.indexOf(':') > 0) && (path.endsWith('/') == false)) {
|
|
console.log('we need parameters');
|
|
var mmitem = item.substring(item.indexOf(':'));
|
|
var mmpath = path.substring(item.indexOf(':'));
|
|
var mmitemList = mmitem.split('/');
|
|
var mmpathList = mmpath.split('/');
|
|
if(mmitemList.length == mmpathList.length) {
|
|
console.log('winner is here');
|
|
if(result == -1) result = index;
|
|
}
|
|
} else {
|
|
console.log('we do not need parameters');
|
|
if(item == path) {
|
|
console.log('winnere here');
|
|
if(result == -1) result = index;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
|
|
module.exports = class Router {
|
|
constructor() {
|
|
this.routes = [];
|
|
this.handlers = [];
|
|
}
|
|
|
|
use(route, handler) {
|
|
this.routes[this.routes.length] = route;
|
|
this.handlers[this.handlers.length] = handler;
|
|
this.request = undefined;
|
|
this.response = undefined;
|
|
}
|
|
|
|
set(path, request, response) {
|
|
this.request = request;
|
|
this.response = response;
|
|
|
|
/////////////////////////////////////
|
|
console.log(selectRoute(path, this.routes));
|
|
|
|
|
|
|
|
/////////////////////////////////////
|
|
|
|
var pathComponents = path.split('/');
|
|
for (var i = 0; i < pathComponents.length; i++) {
|
|
pathComponents[i] = '/' + pathComponents[i];
|
|
}
|
|
|
|
var routes = this.routes;
|
|
|
|
var paths = [];
|
|
var params = [];
|
|
|
|
var mindex = selectRoute(path, this.routes);
|
|
|
|
if(mindex == -1) {
|
|
this.response.error(51);
|
|
return;
|
|
}
|
|
|
|
var routeComponents = routes[mindex].split('/');
|
|
paths = [];
|
|
params = [];
|
|
|
|
if (routeComponents.length == pathComponents.length) {
|
|
for (var k = 0; k < routeComponents.length; k++) {
|
|
routeComponents[k] = '/' + routeComponents[k];
|
|
if (routeComponents[k].startsWith('/:')) {
|
|
params.push(routeComponents[k]);
|
|
} else {
|
|
paths.push(routeComponents[k]);
|
|
}
|
|
}
|
|
}
|
|
|
|
var finalParams = pathComponents.slice(paths.length);
|
|
for (var l = 0; l < finalParams.length; l++) {
|
|
finalParams[l] = finalParams[l].substring(1);
|
|
}
|
|
var myParams = {};
|
|
for (var m = 0; m < params.length; m++) {
|
|
eval('myParams.' + params[m].substring(2) + ' = "' + JSON.stringify(finalParams[m]).slice(1, -1) + '"');
|
|
}
|
|
|
|
this.request.params = myParams;
|
|
var mm = typeof this.handlers[mindex];
|
|
if (mm !== 'undefined') {
|
|
this.handlers[mindex](this.request, this.response);
|
|
return;
|
|
} else {
|
|
this.response.error(51);
|
|
return;
|
|
}
|
|
}
|
|
};
|