Skip to content

Commit 5a8763c

Browse files
authored
Dependencies update + performance improvements (#37)
* updating dependencies * improving performance * adding benchmarking tool
1 parent 5ddb2f2 commit 5a8763c

File tree

5 files changed

+134
-16
lines changed

5 files changed

+134
-16
lines changed

bench.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
const httpNext = require('./index')
2+
const httpPrevious = require('0http')
3+
4+
function getReqObject (url) {
5+
const req = {}
6+
req.method = 'GET'
7+
req.url = url
8+
9+
return req
10+
}
11+
12+
function getResObject () {
13+
const res = {}
14+
res.statusCode = null
15+
res.setHeader = () => {}
16+
res.writeHead = () => {}
17+
res.end = () => {}
18+
return res
19+
}
20+
21+
function setupRouter (router) {
22+
router.use((req, res, next) => {
23+
return next()
24+
})
25+
26+
router.get('/', (req, res) => {
27+
return res.end('OK')
28+
})
29+
router.get('/:id', (req, res) => {
30+
return res.end(req.params.id)
31+
})
32+
router.get('/:id/error', () => {
33+
throw new Error('Error')
34+
})
35+
}
36+
37+
const { router } = httpNext({
38+
cacheSize: 0,
39+
id: '/'
40+
})
41+
setupRouter(router)
42+
43+
const { router: routerPrevious } = httpPrevious({
44+
cacheSize: 0
45+
})
46+
setupRouter(routerPrevious)
47+
48+
import('mitata/src/cli.mjs').then(({ run, bench, group, baseline }) => {
49+
group('Next Router', () => {
50+
baseline('Base URL', () => {
51+
const req = getReqObject('/')
52+
const res = getResObject()
53+
54+
router.lookup(req, res)
55+
})
56+
bench('Parameter URL', () => {
57+
const req = getReqObject('/0')
58+
const res = getResObject()
59+
60+
router.lookup(req, res)
61+
})
62+
bench('Not Found URL', () => {
63+
const req = getReqObject('/0/404')
64+
const res = getResObject()
65+
66+
router.lookup(req, res)
67+
})
68+
bench('Error URL', () => {
69+
const req = getReqObject('/0/error')
70+
const res = getResObject()
71+
72+
router.lookup(req, res)
73+
})
74+
})
75+
76+
group('Previous Router', () => {
77+
baseline('Base URL', () => {
78+
const req = getReqObject('/')
79+
const res = getResObject()
80+
81+
routerPrevious.lookup(req, res)
82+
})
83+
bench('Parameter URL', () => {
84+
const req = getReqObject('/0')
85+
const res = getResObject()
86+
87+
routerPrevious.lookup(req, res)
88+
})
89+
bench('Not Found URL', () => {
90+
const req = getReqObject('/0/404')
91+
const res = getResObject()
92+
93+
routerPrevious.lookup(req, res)
94+
})
95+
bench('Error URL', () => {
96+
const req = getReqObject('/0/error')
97+
const res = getResObject()
98+
99+
routerPrevious.lookup(req, res)
100+
})
101+
})
102+
103+
run({
104+
silent: false,
105+
avg: true,
106+
json: false,
107+
colors: true,
108+
min_max: false,
109+
percentiles: false
110+
})
111+
})

lib/next.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
function next (middlewares, req, res, index, routers, defaultRoute, errorHandler) {
22
routers = routers || {}
33

4-
const middleware = middlewares[index]
5-
if (!middleware) {
4+
if (index >= middlewares.length) {
65
if (!res.finished) {
76
return defaultRoute(req, res)
87
}
98

109
return
1110
}
1211

12+
const middleware = middlewares[index++]
13+
1314
function step (err) {
1415
if (err) {
1516
return errorHandler(err, req, res)
1617
} else {
17-
return next(middlewares, req, res, index + 1, routers, defaultRoute, errorHandler)
18+
return next(middlewares, req, res, index, routers, defaultRoute, errorHandler)
1819
}
1920
}
2021

lib/router/sequential.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const Trouter = require('trouter')
22
const next = require('./../next')
3-
const LRU = require('lru-cache')
3+
const { LRUCache: LRU } = require('lru-cache')
44
const { parse } = require('regexparam')
55
const queryparams = require('../utils/queryparams')
66

@@ -70,7 +70,7 @@ module.exports = (config = {}) => {
7070
match = router.find(req.method, req.path)
7171
}
7272

73-
if (match.handlers.length !== 0) {
73+
if (match.handlers.length > 0) {
7474
const middlewares = [...match.handlers]
7575
if (step !== undefined) {
7676
// router is being used as a nested router

lib/utils/queryparams.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
module.exports = (req, url) => {
2-
const [path, search = ''] = url.split('?')
3-
const searchParams = new URLSearchParams(search.replace(/\[\]=/g, '='))
4-
52
const query = {}
6-
for (const [name, value] of searchParams.entries()) {
7-
if (query[name]) {
8-
Array.isArray(query[name]) ? query[name].push(value) : (query[name] = [query[name], value])
9-
} else {
10-
query[name] = value
3+
const indexOfQuestionMark = url.indexOf('?')
4+
const path = indexOfQuestionMark !== -1 ? url.slice(0, indexOfQuestionMark) : url
5+
const search = indexOfQuestionMark !== -1 ? url.slice(indexOfQuestionMark + 1) : ''
6+
7+
if (search.length > 0) {
8+
const searchParams = new URLSearchParams(search.replace(/\[\]=/g, '='))
9+
for (const [name, value] of searchParams.entries()) {
10+
if (query[name]) {
11+
Array.isArray(query[name]) ? query[name].push(value) : (query[name] = [query[name], value])
12+
} else {
13+
query[name] = value
14+
}
1115
}
1216
}
1317

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@
2727
},
2828
"homepage": "https://github.com/BackendStack21/0http#readme",
2929
"devDependencies": {
30+
"0http": "^3.5.2",
3031
"@types/node": "^18.14.4",
3132
"body-parser": "^1.20.1",
3233
"chai": "^4.3.7",
3334
"cross-env": "^7.0.3",
3435
"find-my-way": "^5.2.0",
35-
"mocha": "^10.2.0",
36+
"mitata": "^0.1.11",
37+
"mocha": "^10.4.0",
3638
"nyc": "^15.1.0",
3739
"supertest": "^6.3.3"
3840
},
@@ -45,8 +47,8 @@
4547
"lib/"
4648
],
4749
"dependencies": {
48-
"lru-cache": "^7.18.1",
49-
"regexparam": "^2.0.1",
50+
"lru-cache": "^10.2.0",
51+
"regexparam": "^3.0.0",
5052
"trouter": "^3.2.1"
5153
},
5254
"types": "./index.d.ts"

0 commit comments

Comments
 (0)