aboutsummaryrefslogtreecommitdiff
path: root/src/server/RouteManager.ts
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2019-12-03 11:44:25 -0500
committerSam Wilkins <samwilkins333@gmail.com>2019-12-03 11:44:25 -0500
commit7866dd1700d6a3457e0f0255428ee42e5c7d8ff9 (patch)
tree051f88b265bb4d2dc2052dce873c1b2ad812ccc9 /src/server/RouteManager.ts
parentef94ad7df2a087141ddb8d347d3e3c484ff7609b (diff)
error check route creation and observable button bar instance
Diffstat (limited to 'src/server/RouteManager.ts')
-rw-r--r--src/server/RouteManager.ts88
1 files changed, 64 insertions, 24 deletions
diff --git a/src/server/RouteManager.ts b/src/server/RouteManager.ts
index 3af36d879..347be1952 100644
--- a/src/server/RouteManager.ts
+++ b/src/server/RouteManager.ts
@@ -1,7 +1,7 @@
import RouteSubscriber from "./RouteSubscriber";
import { DashUserModel } from "./authentication/models/user_model";
import * as express from 'express';
-import { yellow, cyan, red } from 'colors';
+import { cyan, red, green } from 'colors';
export enum Method {
GET,
@@ -28,9 +28,15 @@ export interface RouteInitializer {
const registered = new Map<string, Set<Method>>();
+enum RegistrationError {
+ Malformed,
+ Duplicate
+}
+
export default class RouteManager {
private server: express.Express;
private _isRelease: boolean;
+ private failedRegistrations: { route: string, reason: RegistrationError }[] = [];
public get isRelease() {
return this._isRelease;
@@ -41,10 +47,35 @@ export default class RouteManager {
this._isRelease = isRelease;
}
- log = () => {
- console.log(yellow("\nthe following server routes have been registered:"));
- Array.from(registered.keys()).sort().forEach(route => console.log(cyan(route)));
- console.log();
+ logRegistrationOutcome = () => {
+ if (this.failedRegistrations.length) {
+ let duplicateCount = 0;
+ let malformedCount = 0;
+ this.failedRegistrations.forEach(({ reason, route }) => {
+ let error: string;
+ if (reason === RegistrationError.Duplicate) {
+ error = `duplicate registration error: ${route} is already registered `;
+ duplicateCount++;
+ } else {
+ error = `malformed route error: ${route} is invalid`;
+ malformedCount++;
+ }
+ console.log(red(error));
+ });
+ console.log();
+ if (duplicateCount) {
+ console.log('please remove all duplicate routes before continuing');
+ }
+ if (malformedCount) {
+ console.log(`please ensure all routes adhere to ^\/[A-Za-z]+(\/\:[A-Za-z]+)*$`);
+ }
+ console.log();
+ process.exit(0);
+ } else {
+ console.log(green("all server routes have been successfully registered:"));
+ Array.from(registered.keys()).sort().forEach(route => console.log(cyan(route)));
+ console.log();
+ }
}
/**
@@ -84,7 +115,7 @@ export default class RouteManager {
}
setTimeout(() => {
if (!res.headersSent) {
- console.log(`Initiating fallback for ${target}`);
+ console.log(red(`Initiating fallback for ${target}. Please remove dangling promise from route handler`));
const warning = `request to ${target} fell through - this is a fallback response`;
res.send({ warning });
}
@@ -97,25 +128,34 @@ export default class RouteManager {
} else {
route = subscriber.build;
}
- const existing = registered.get(route);
- if (existing) {
- if (existing.has(method)) {
- console.log(red(`\nDuplicate registration error: already registered ${route} with Method[${method}]`));
- console.log('Please remove duplicate registrations before continuing...\n');
- process.exit(0);
- }
+ if (!/^\/[A-Za-z]+(\/\:[A-Za-z]+)*$/g.test(route)) {
+ this.failedRegistrations.push({
+ reason: RegistrationError.Malformed,
+ route
+ });
} else {
- const specific = new Set<Method>();
- specific.add(method);
- registered.set(route, specific);
- }
- switch (method) {
- case Method.GET:
- this.server.get(route, supervised);
- break;
- case Method.POST:
- this.server.post(route, supervised);
- break;
+ const existing = registered.get(route);
+ if (existing) {
+ if (existing.has(method)) {
+ this.failedRegistrations.push({
+ reason: RegistrationError.Duplicate,
+ route
+ });
+ return;
+ }
+ } else {
+ const specific = new Set<Method>();
+ specific.add(method);
+ registered.set(route, specific);
+ }
+ switch (method) {
+ case Method.GET:
+ this.server.get(route, supervised);
+ break;
+ case Method.POST:
+ this.server.post(route, supervised);
+ break;
+ }
}
};
if (Array.isArray(subscription)) {