bun-crumb 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -29
- package/dist/bench/src/k6/bunCrumb.d.ts +1 -0
- package/dist/bench/src/k6/fastify.d.ts +1 -0
- package/dist/bench/src/k6/pureBun.d.ts +1 -0
- package/dist/bench/src/k6/script.d.ts +10 -2
- package/dist/index.d.ts +4 -3
- package/dist/server.d.ts +6 -1
- package/dist/types/route.d.ts +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
|
|
10
10
|
### Features
|
|
11
11
|
|
|
12
|
-
-
|
|
12
|
+
- Only Bun is supported
|
|
13
13
|
|
|
14
|
-
-
|
|
14
|
+
- No classes
|
|
15
15
|
|
|
16
|
-
-
|
|
16
|
+
- Uses `Bun.serve` routes
|
|
17
17
|
|
|
18
18
|
### Installation
|
|
19
19
|
|
|
@@ -34,59 +34,158 @@ const products: Product[] = [];
|
|
|
34
34
|
|
|
35
35
|
createRoute({
|
|
36
36
|
url: '/products',
|
|
37
|
+
|
|
37
38
|
method: 'GET',
|
|
39
|
+
|
|
38
40
|
handler: (request, response: RouteResponse<{ body: Product[] }>) => {
|
|
39
41
|
return response.send(
|
|
40
42
|
[
|
|
41
|
-
{ title: '
|
|
42
|
-
|
|
43
|
+
{ title: 'bananas', price: 0.57, id: 1 },
|
|
44
|
+
|
|
45
|
+
{ title: 'bread', price: 0.89, id: 2 },
|
|
46
|
+
|
|
47
|
+
{ title: 'milk', price: 0.83, id: 3 },
|
|
43
48
|
],
|
|
44
|
-
|
|
49
|
+
|
|
50
|
+
{ status: 200 },
|
|
45
51
|
);
|
|
46
52
|
},
|
|
47
53
|
});
|
|
48
54
|
```
|
|
49
55
|
|
|
50
|
-
|
|
56
|
+
### Benchmarks
|
|
57
|
+
|
|
58
|
+
- Machine:
|
|
59
|
+
- windows 11
|
|
60
|
+
- intel core i5 10300H
|
|
61
|
+
- 16gb ram
|
|
62
|
+
|
|
63
|
+
- Load testing tool: grafana/k6
|
|
64
|
+
|
|
65
|
+
- Bun version: 1.3.6
|
|
66
|
+
|
|
67
|
+
<details>
|
|
68
|
+
<summary>k6 script</summary>
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
sleep 1 | k6 run script.js
|
|
72
|
+
```
|
|
51
73
|
|
|
52
|
-
|
|
74
|
+
```javascript
|
|
75
|
+
import { PORT } from './constants.js';
|
|
76
|
+
|
|
77
|
+
import http from 'k6/http';
|
|
78
|
+
|
|
79
|
+
export const options = {
|
|
80
|
+
scenarios: {
|
|
81
|
+
load: {
|
|
82
|
+
executor: 'constant-arrival-rate',
|
|
83
|
+
|
|
84
|
+
rate: 16000,
|
|
85
|
+
timeUnit: '1s',
|
|
86
|
+
|
|
87
|
+
duration: '30s',
|
|
88
|
+
preAllocatedVUs: 1000,
|
|
89
|
+
|
|
90
|
+
maxVUs: 3000,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export default () => {
|
|
96
|
+
http.post(
|
|
97
|
+
'http://localhost:' + PORT + '/',
|
|
98
|
+
JSON.stringify({ key: 'value' }),
|
|
99
|
+
{ headers: { 'Content-Type': 'application/json' } },
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
</details>
|
|
105
|
+
|
|
106
|
+
<details>
|
|
107
|
+
<summary>Pure Bun server code</summary>
|
|
53
108
|
|
|
54
109
|
```typescript
|
|
55
|
-
import {
|
|
110
|
+
import { serve, stdout } from 'bun';
|
|
111
|
+
|
|
112
|
+
import { PORT } from './constants';
|
|
113
|
+
|
|
114
|
+
serve({
|
|
115
|
+
routes: {
|
|
116
|
+
'/': {
|
|
117
|
+
POST: (request) => {
|
|
118
|
+
return request.json().then(
|
|
119
|
+
(body) =>
|
|
120
|
+
new Response(JSON.stringify(body), {
|
|
121
|
+
headers: { 'Content-Type': 'application/json' },
|
|
122
|
+
}),
|
|
123
|
+
);
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
port: PORT,
|
|
128
|
+
});
|
|
129
|
+
stdout.write('Bun is running\n');
|
|
130
|
+
```
|
|
56
131
|
|
|
57
|
-
|
|
132
|
+
</details>
|
|
58
133
|
|
|
59
|
-
|
|
134
|
+
<details>
|
|
135
|
+
<summary>Fastify server code</summary>
|
|
60
136
|
|
|
61
|
-
|
|
62
|
-
|
|
137
|
+
```typescript
|
|
138
|
+
import Fastify from 'fastify';
|
|
139
|
+
|
|
140
|
+
import { PORT } from './constants';
|
|
141
|
+
|
|
142
|
+
const fastify = Fastify({ logger: false });
|
|
143
|
+
|
|
144
|
+
fastify.route({
|
|
145
|
+
url: '/',
|
|
63
146
|
method: 'POST',
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return response.send(
|
|
67
|
-
{ message: 'Product with this id already exists' },
|
|
68
|
-
{ status: 409 }
|
|
69
|
-
);
|
|
70
|
-
}
|
|
147
|
+
handler: (request, response) => {
|
|
148
|
+
return response.send(request.body);
|
|
71
149
|
},
|
|
72
|
-
|
|
73
|
-
products.push(body);
|
|
150
|
+
});
|
|
74
151
|
|
|
75
|
-
|
|
76
|
-
|
|
152
|
+
fastify.listen({ port: PORT }, () => {
|
|
153
|
+
Bun.stdout.write('Fastify is running\n');
|
|
77
154
|
});
|
|
78
155
|
```
|
|
79
156
|
|
|
80
|
-
|
|
157
|
+
</details>
|
|
158
|
+
|
|
159
|
+
<details>
|
|
160
|
+
<summary>Bun Crumb server code</summary>
|
|
81
161
|
|
|
82
|
-
|
|
162
|
+
```bash
|
|
163
|
+
sleep 1 | k6 run script.js
|
|
164
|
+
```
|
|
83
165
|
|
|
84
166
|
```typescript
|
|
85
|
-
import {
|
|
167
|
+
import { PORT } from './constants';
|
|
168
|
+
|
|
169
|
+
import { listen, createRoute } from 'bun-crumb';
|
|
86
170
|
|
|
171
|
+
//
|
|
87
172
|
createRoute({
|
|
88
|
-
url: '/
|
|
173
|
+
url: '/',
|
|
174
|
+
|
|
89
175
|
method: 'POST',
|
|
90
|
-
|
|
176
|
+
|
|
177
|
+
handler: (request, response) => {
|
|
178
|
+
return request.handleBody().then(response.send);
|
|
179
|
+
},
|
|
91
180
|
});
|
|
181
|
+
|
|
182
|
+
listen({ port: PORT });
|
|
92
183
|
```
|
|
184
|
+
|
|
185
|
+
</details>
|
|
186
|
+
|
|
187
|
+
| Library | Total requests | RPS | Requests failed | Avg. request duration |
|
|
188
|
+
| --------- | -------------- | -------------- | --------------- | --------------------- |
|
|
189
|
+
| Pure Bun | 482681 | 15958.069946/s | 0.00% (0) | 12.48ms |
|
|
190
|
+
| Bun Crumb | 474870 | 15789.504029/s | 0.02% (101) | 23.08ms |
|
|
191
|
+
| Fastify | 364525 | 12060.63486/s | 0.27% (1002) | 237.68ms |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
export namespace options {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
namespace scenarios {
|
|
3
|
+
namespace load {
|
|
4
|
+
let executor: string;
|
|
5
|
+
let rate: number;
|
|
6
|
+
let timeUnit: string;
|
|
7
|
+
let duration: string;
|
|
8
|
+
let preAllocatedVUs: number;
|
|
9
|
+
let maxVUs: number;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
4
12
|
}
|
|
5
13
|
declare function _default(): void;
|
|
6
14
|
export default _default;
|
package/dist/index.d.ts
CHANGED
|
@@ -121,7 +121,7 @@ interface RouteResponse<T extends {
|
|
|
121
121
|
} = {
|
|
122
122
|
body: unknown;
|
|
123
123
|
}> {
|
|
124
|
-
send: (data
|
|
124
|
+
send: (data?: T['body'], options?: ResponseOptions) => void;
|
|
125
125
|
/**
|
|
126
126
|
* Sets `Location` header to provided `url` and `response.status` to provided `status`
|
|
127
127
|
*
|
|
@@ -169,7 +169,7 @@ interface RouteResponse<T extends {
|
|
|
169
169
|
setHeader: (name: Header['name'], value: Header['value']) => void;
|
|
170
170
|
/**
|
|
171
171
|
*
|
|
172
|
-
* @param options `Bun.Cookie` options
|
|
172
|
+
* @param options `Bun.Cookie` options parameter
|
|
173
173
|
*
|
|
174
174
|
*
|
|
175
175
|
*
|
|
@@ -215,7 +215,8 @@ interface ListenOptions {
|
|
|
215
215
|
}
|
|
216
216
|
|
|
217
217
|
/**
|
|
218
|
-
*
|
|
218
|
+
*
|
|
219
|
+
* Starts to serve http server.
|
|
219
220
|
*
|
|
220
221
|
*
|
|
221
222
|
* @param {ListenOption} options - options
|
package/dist/server.d.ts
CHANGED
|
@@ -25,6 +25,10 @@ export declare const _routes: Routes;
|
|
|
25
25
|
* @param {Validate} schemaValidator schema validator function that receives `data` and `schema` arguments.
|
|
26
26
|
*
|
|
27
27
|
* @returns {Promise<unknown>} Promise with body
|
|
28
|
+
*
|
|
29
|
+
*
|
|
30
|
+
*
|
|
31
|
+
*
|
|
28
32
|
*/
|
|
29
33
|
export declare const handleBody: (request: BunRequest, contentType: string, schema?: SchemaData, schemaValidator?: Validate) => Promise<unknown>;
|
|
30
34
|
/**
|
|
@@ -90,7 +94,8 @@ export declare const prepareRoute: (route: Route, schemaValidator?: Validate) =>
|
|
|
90
94
|
*/
|
|
91
95
|
export declare const prepareRoutes: (routes: Routes, schemaValidator?: Validate) => PreparedRoutes;
|
|
92
96
|
/**
|
|
93
|
-
*
|
|
97
|
+
*
|
|
98
|
+
* Starts to serve http server.
|
|
94
99
|
*
|
|
95
100
|
*
|
|
96
101
|
* @param {ListenOption} options - options
|
package/dist/types/route.d.ts
CHANGED
|
@@ -60,7 +60,7 @@ export interface RouteResponse<T extends {
|
|
|
60
60
|
} = {
|
|
61
61
|
body: unknown;
|
|
62
62
|
}> {
|
|
63
|
-
send: (data
|
|
63
|
+
send: (data?: T['body'], options?: ResponseOptions) => void;
|
|
64
64
|
/**
|
|
65
65
|
* Sets `Location` header to provided `url` and `response.status` to provided `status`
|
|
66
66
|
*
|
|
@@ -108,7 +108,7 @@ export interface RouteResponse<T extends {
|
|
|
108
108
|
setHeader: (name: Header['name'], value: Header['value']) => void;
|
|
109
109
|
/**
|
|
110
110
|
*
|
|
111
|
-
* @param options `Bun.Cookie` options
|
|
111
|
+
* @param options `Bun.Cookie` options parameter
|
|
112
112
|
*
|
|
113
113
|
*
|
|
114
114
|
*
|