2022-01-07 22:23:47 +01:00

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;
}
}
};