Skip to content

Commit

Permalink
Fixing 'req.exit()'
Browse files Browse the repository at this point in the history
  • Loading branch information
avoidwork committed Aug 28, 2024
1 parent ede95ac commit e8e961a
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 40 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ Executes after the response has been sent.
## Helpers
`req` & `res` are decorated with helper functions to simplify responding.

### req.exit(req, res, next)
Exit middleware of the route for the HTTP method as a way to "skip" authentication middleware for unprotected routes.
### req.exit()
Exit the middleware chain if the route is un-protected.

### res.error(status[, body, headers])
Sends an error response.
Expand Down
2 changes: 1 addition & 1 deletion dist/cli.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*
* @copyright 2024 Jason Mulligan <jason.mulligan@avoidwork.com>
* @license BSD-3-Clause
* @version 20.0.0
* @version 20.0.1
*/
'use strict';

Expand Down
22 changes: 10 additions & 12 deletions dist/woodland.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* @copyright 2024 Jason Mulligan <jason.mulligan@avoidwork.com>
* @license BSD-3-Clause
* @version 20.0.0
* @version 20.0.1
*/
'use strict';

Expand Down Expand Up @@ -192,8 +192,8 @@ function ms (arg = INT_0, digits = INT_3) {
return TIME_MS.replace(TOKEN_N, Number(arg / INT_1e6).toFixed(digits));
}

function next (req, res, middleware) {
const fn = err => process.nextTick(() => {
function next (req, res, middleware, immediate = false) {
const internalFn = (err, fn) => {
let obj = middleware.next();

if (obj.done === false) {
Expand All @@ -213,7 +213,8 @@ function next (req, res, middleware) {
} else {
res.error(getStatus(req, res));
}
});
};
const fn = immediate ? () => internalFn(undefined, fn) : err => process.nextTick(() => internalFn(err, fn));

return fn;
}
Expand Down Expand Up @@ -276,18 +277,14 @@ function pipeable (method, arg) {
return method !== HEAD && arg !== null && typeof arg.on === FUNCTION;
}

function reduce (uri, map = new Map(), arg = {}, end = false) {
function reduce (uri, map = new Map(), arg = {}) {
Array.from(map.values()).filter(i => {
i.regex.lastIndex = INT_0;

return i.regex.test(uri);
}).forEach(i => {
for (const fn of i.handlers) {
arg.middleware.push(fn);

if (end && arg.exit === null) {
arg.exit = fn;
}
}

if (i.params && arg.params === false) {
Expand Down Expand Up @@ -704,7 +701,7 @@ class Woodland extends node_events.EventEmitter {
params(req, result.getParams);
}

req.exit = result.exit;
req.exit = next(req, res, result.middleware.slice(result.exit, result.middleware.length)[Symbol.iterator](), true);
next(req, res, result.middleware[Symbol.iterator]())();
} else {
res.error(getStatus(req, res));
Expand All @@ -719,11 +716,12 @@ class Woodland extends node_events.EventEmitter {
if (cached !== void 0) {
result = cached;
} else {
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: null};
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: -1};
reduce(uri, this.middleware.get(WILDCARD), result);

if (method !== WILDCARD) {
reduce(uri, this.middleware.get(method), result, true);
result.exit = result.middleware.length;
reduce(uri, this.middleware.get(method), result);
}

result.visible = result.middleware.filter(i => this.ignored.has(i) === false).length;
Expand Down
22 changes: 10 additions & 12 deletions dist/woodland.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* @copyright 2024 Jason Mulligan <jason.mulligan@avoidwork.com>
* @license BSD-3-Clause
* @version 20.0.0
* @version 20.0.1
*/
import {STATUS_CODES,METHODS}from'node:http';import {join,extname}from'node:path';import {EventEmitter}from'node:events';import {stat,readdir}from'node:fs/promises';import {etag}from'tiny-etag';import {precise}from'precise';import {lru}from'tiny-lru';import {createRequire}from'node:module';import {fileURLToPath,URL}from'node:url';import {readFileSync,createReadStream}from'node:fs';import {coerce}from'tiny-coerce';import mimeDb from'mime-db';const __dirname$1 = fileURLToPath(new URL(".", import.meta.url));
const require = createRequire(import.meta.url);
Expand Down Expand Up @@ -174,8 +174,8 @@ function ms (arg = INT_0, digits = INT_3) {
return TIME_MS.replace(TOKEN_N, Number(arg / INT_1e6).toFixed(digits));
}

function next (req, res, middleware) {
const fn = err => process.nextTick(() => {
function next (req, res, middleware, immediate = false) {
const internalFn = (err, fn) => {
let obj = middleware.next();

if (obj.done === false) {
Expand All @@ -195,7 +195,8 @@ function next (req, res, middleware) {
} else {
res.error(getStatus(req, res));
}
});
};
const fn = immediate ? () => internalFn(undefined, fn) : err => process.nextTick(() => internalFn(err, fn));

return fn;
}
Expand Down Expand Up @@ -258,18 +259,14 @@ function pipeable (method, arg) {
return method !== HEAD && arg !== null && typeof arg.on === FUNCTION;
}

function reduce (uri, map = new Map(), arg = {}, end = false) {
function reduce (uri, map = new Map(), arg = {}) {
Array.from(map.values()).filter(i => {
i.regex.lastIndex = INT_0;

return i.regex.test(uri);
}).forEach(i => {
for (const fn of i.handlers) {
arg.middleware.push(fn);

if (end && arg.exit === null) {
arg.exit = fn;
}
}

if (i.params && arg.params === false) {
Expand Down Expand Up @@ -684,7 +681,7 @@ function writeHead (res, headers = {}) {
params(req, result.getParams);
}

req.exit = result.exit;
req.exit = next(req, res, result.middleware.slice(result.exit, result.middleware.length)[Symbol.iterator](), true);
next(req, res, result.middleware[Symbol.iterator]())();
} else {
res.error(getStatus(req, res));
Expand All @@ -699,11 +696,12 @@ function writeHead (res, headers = {}) {
if (cached !== void 0) {
result = cached;
} else {
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: null};
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: -1};
reduce(uri, this.middleware.get(WILDCARD), result);

if (method !== WILDCARD) {
reduce(uri, this.middleware.get(method), result, true);
result.exit = result.middleware.length;
reduce(uri, this.middleware.get(method), result);
}

result.visible = result.middleware.filter(i => this.ignored.has(i) === false).length;
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "woodland",
"version": "20.0.0",
"version": "20.0.1",
"description": "Lightweight HTTP framework with automatic headers",
"type": "module",
"types": "types/woodland.d.ts",
Expand Down
13 changes: 5 additions & 8 deletions src/utility.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ export function ms (arg = INT_0, digits = INT_3) {
return TIME_MS.replace(TOKEN_N, Number(arg / INT_1e6).toFixed(digits));
}

export function next (req, res, middleware) {
const fn = err => process.nextTick(() => {
export function next (req, res, middleware, immediate = false) {
const internalFn = (err, fn) => {
let obj = middleware.next();

if (obj.done === false) {
Expand All @@ -100,7 +100,8 @@ export function next (req, res, middleware) {
} else {
res.error(getStatus(req, res));
}
});
};
const fn = immediate ? () => internalFn(undefined, fn) : err => process.nextTick(() => internalFn(err, fn));

return fn;
}
Expand Down Expand Up @@ -163,18 +164,14 @@ export function pipeable (method, arg) {
return method !== HEAD && arg !== null && typeof arg.on === FUNCTION;
}

export function reduce (uri, map = new Map(), arg = {}, end = false) {
export function reduce (uri, map = new Map(), arg = {}) {
Array.from(map.values()).filter(i => {
i.regex.lastIndex = INT_0;

return i.regex.test(uri);
}).forEach(i => {
for (const fn of i.handlers) {
arg.middleware.push(fn);

if (end && arg.exit === null) {
arg.exit = fn;
}
}

if (i.params && arg.params === false) {
Expand Down
5 changes: 3 additions & 2 deletions src/woodland.js
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ export class Woodland extends EventEmitter {
params(req, result.getParams);
}

req.exit = result.exit;
req.exit = next(req, res, result.middleware.slice(result.exit, result.middleware.length)[Symbol.iterator](), true);
next(req, res, result.middleware[Symbol.iterator]())();
} else {
res.error(getStatus(req, res));
Expand All @@ -480,10 +480,11 @@ export class Woodland extends EventEmitter {
if (cached !== void 0) {
result = cached;
} else {
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: null};
result = {getParams: null, middleware: [], params: false, visible: INT_0, exit: -1};
reduce(uri, this.middleware.get(WILDCARD), result);

if (method !== WILDCARD) {
result.exit = result.middleware.length;
reduce(uri, this.middleware.get(method), result, true);
}

Expand Down

0 comments on commit e8e961a

Please sign in to comment.