Skip to content

Commit 6293f4a

Browse files
committed
feat(node-utils): add option to deactivate route handlers
1 parent fda24b1 commit 6293f4a

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

packages/node-utils/src/http.ts

+24
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ type Route = {
7272
pathname: string;
7373
params: string[];
7474
handler: AnyRequestHandler[];
75+
isActive: boolean;
7576
};
7677
/**
7778
* Events that may be emitted or listened to by HttpServer
@@ -218,6 +219,7 @@ export class HttpServer<T extends EventMap> extends TypedEmitter<T & BaseEvents>
218219
pathname: `/${basePathname}`,
219220
params: paramsSegments,
220221
handler,
222+
isActive: true,
221223
});
222224
}
223225

@@ -243,9 +245,24 @@ export class HttpServer<T extends EventMap> extends TypedEmitter<T & BaseEvents>
243245
pathname: '*',
244246
handler,
245247
params: [],
248+
isActive: true,
246249
});
247250
}
248251

252+
public activateRoute(pathname: string) {
253+
const route = this.routes.find(r => r.pathname === pathname);
254+
if (route) {
255+
route.isActive = true;
256+
}
257+
}
258+
259+
public deactivateRoute(pathname: string) {
260+
const route = this.routes.find(r => r.pathname === pathname);
261+
if (route) {
262+
route.isActive = false;
263+
}
264+
}
265+
249266
/**
250267
* pathname could be /a/b/c/d
251268
* return route with highest number of matching segments
@@ -330,6 +347,13 @@ export class HttpServer<T extends EventMap> extends TypedEmitter<T & BaseEvents>
330347
return;
331348
}
332349

350+
if (!route.isActive) {
351+
response.statusCode = 404;
352+
response.end();
353+
354+
return;
355+
}
356+
333357
const paramsSegments = pathname
334358
.replace(route.pathname, '')
335359
.split('/')

packages/node-utils/src/tests/http.test.ts

+21
Original file line numberDiff line numberDiff line change
@@ -392,4 +392,25 @@ describe('HttpServer', () => {
392392
);
393393
expect(res.status).toEqual(403);
394394
});
395+
396+
test('any registered route is active by default and can be deactivated', async () => {
397+
const handler = jest.fn((_request, response) => {
398+
response.end('ok');
399+
});
400+
server.get('/foo', [handler]);
401+
server.get('/bar', [handler]);
402+
await server.start();
403+
const address = server.getServerAddress();
404+
expect(address).toBeDefined();
405+
let res = await fetch(`http://${address.address}:${address.port}/foo`);
406+
expect(res.status).toEqual(200);
407+
res = await fetch(`http://${address.address}:${address.port}/bar`);
408+
expect(res.status).toEqual(200);
409+
410+
server.deactivateRoute('/foo');
411+
res = await fetch(`http://${address.address}:${address.port}/foo`);
412+
expect(res.status).toEqual(404);
413+
res = await fetch(`http://${address.address}:${address.port}/bar`);
414+
expect(res.status).toEqual(200);
415+
});
395416
});

0 commit comments

Comments
 (0)